Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/alisunstar_opensunstar.json
T
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
7.3 MiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "alisunstar/opensunstar", "files": {"src/config/opencodeProviderPresets.ts": {"6f0e83459eeaa036a44cb4538e43a042113521f5": {"t": 1785595986.6342974, "n": 48037, "h": "1f153dcae551261e", "c": "import type { ProviderCategory, OpenCodeProviderConfig } from \"../types\";\nimport type { PresetTheme, TemplateValueConfig } from \"./claudeProviderPresets\";\n\nexport interface OpenCodeProviderPreset {\n name: string;\n nameKey?: string; // i18n key for localized display name\n websiteUrl: string;\n apiKeyUrl?: string;\n settingsConfig: OpenCodeProviderConfig;\n isOfficial?: boolean;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n category?: ProviderCategory;\n templateValues?: Record<string, TemplateValueConfig>;\n theme?: PresetTheme;\n icon?: string;\n iconColor?: string;\n isCustomTemplate?: boolean;\n}\n\nexport const opencodeNpmPackages = [\n { value: \"@ai-sdk/openai\", label: \"OpenAI Responses\" },\n { value: \"@ai-sdk/openai-compatible\", label: \"OpenAI Compatible\" },\n { value: \"@ai-sdk/anthropic\", label: \"Anthropic\" },\n { value: \"@ai-sdk/amazon-bedrock\", label: \"Amazon Bedrock\" },\n { value: \"@ai-sdk/google\", label: \"Google (Gemini)\" },\n] as const;\n\nexport interface PresetModelVariant {\n id: string;\n name?: string;\n contextLimit?: number;\n outputLimit?: number;\n modalities?: { input: string[]; output: string[] };\n options?: Record<string, unknown>;\n variants?: Record<string, Record<string, unknown>>;\n}\n\nexport const OPENCODE_PRESET_MODEL_VARIANTS: Record<\n string,\n PresetModelVariant[]\n> = {\n \"@ai-sdk/openai-compatible\": [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"glm-5.1\",\n name: \"GLM 5.1\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"kimi-k2.6\",\n name: \"Kimi K2.6\",\n contextLimit: 262144,\n outputLimit: 262144,\n modalities: { input: [\"text\", \"image\", \"video\"], output: [\"text\"] },\n },\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextLimit: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextLimit: 262144,\n },\n ],\n \"@ai-sdk/google\": [\n {\n id: \"gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n auto: {\n thinkingConfig: { includeThoughts: true, thinkingBudget: -1 },\n },\n \"no-thinking\": { thinkingConfig: { thinkingBudget: 0 } },\n },\n },\n {\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n minimal: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"minimal\" },\n },\n low: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"low\" },\n },\n medium: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"medium\" },\n },\n high: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"high\" },\n },\n },\n },\n ],\n \"@ai-sdk/openai\": [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextLimit: 400000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n variants: {\n low: {\n reasoningEffort: \"low\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n medium: {\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n high: {\n reasoningEffort: \"high\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n xhigh: {\n reasoningEffort: \"xhigh\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n },\n },\n ],\n \"@ai-sdk/amazon-bedrock\": [\n {\n id: \"global.anthropic.claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextLimit: 1000000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-haiku-4-5-20251001-v1:0\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"us.amazon.nova-pro-v1:0\",\n name: \"Amazon Nova Pro\",\n contextLimit: 300000,\n outputLimit: 5000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n {\n id: \"us.meta.llama4-maverick-17b-instruct-v1:0\",\n name: \"Meta Llama 4 Maverick\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"us.deepseek.r1-v1:0\",\n name: \"DeepSeek R1\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n ],\n \"@ai-sdk/anthropic\": [\n {\n id: \"claude-sonnet-4-5-20250929\",\n name: \"Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"claude-opus-4-5-20251101\",\n name: \"Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n max: { effort: \"max\" },\n },\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"gemini-claude-opus-4-5-thinking\",\n name: \"Antigravity - Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"gemini-claude-sonnet-4-5-thinking\",\n name: \"Antigravity - Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n ],\n};\n\n/**\n * Look up preset metadata for a model by npm package and model ID.\n * Returns enrichment fields (options, limit, modalities) that can be\n * merged into a model definition when the user's config doesn't already\n * provide them.\n */\nexport function getPresetModelDefaults(\n npm: string,\n modelId: string,\n): PresetModelVariant | undefined {\n const models = OPENCODE_PRESET_MODEL_VARIANTS[npm];\n if (!models) return undefined;\n return models.find((m) => m.id === modelId);\n}\n\nexport const opencodeProviderPresets: OpenCodeProviderPreset[] = [\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Shengsuanyun\",\n options: {\n baseURL: \"https://router.shengsuanyun.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"火山Agentplan\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BytePlus\",\n options: {\n baseURL: \"https://ark.ap-southeast.bytepluses.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"DouBaoSeed\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"doubao-seed-2-0-code-preview-latest\": {\n name: \"Doubao Seed Code Preview\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"CCSub\",\n options: {\n baseURL: \"https://www.ccsub.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Unity2.ai\",\n options: {\n baseURL: \"https://api.unity2.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"https://api.deepseek.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"deepseek-v4-pro\": { name: \"DeepSeek V4 Pro\" },\n \"deepseek-v4-flash\": { name: \"DeepSeek V4 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM\",\n options: {\n baseURL: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n defaultValue: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM en\",\n options: {\n baseURL: \"https://api.z.ai/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.z.ai/api/coding/paas/v4\",\n defaultValue: \"https://api.z.ai/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Bailian\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/#/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Bailian\",\n options: {\n baseURL: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"cn_official\",\n icon: \"bailian\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n defaultValue: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi k2.6\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Kimi k2.6\",\n options: {\n baseURL: \"https://api.moonshot.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-k2.6\": { name: \"Kimi K2.6\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.moonshot.cn/v1\",\n defaultValue: \"https://api.moonshot.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Kimi For Coding\",\n options: {\n baseURL: \"https://api.kimi.com/coding/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-for-coding\": { name: \"Kimi For Coding\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.kimi.com/coding/v1\",\n defaultValue: \"https://api.kimi.com/coding/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.com/step_plan/v1\",\n defaultValue: \"https://api.stepfun.com/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun en\",\n options: {\n baseURL: \"https://api.stepfun.ai/step_plan/v1\",\n apiKey: \"\",\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.ai/step_plan/v1\",\n defaultValue: \"https://api.stepfun.ai/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun Step Plan\",\n websiteUrl: \"https://platform.stepfun.com/docs/zh/step-plan/overview\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun Step Plan\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#005AFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n apiKeyUrl: \"https://modelscope.cn/my/myaccesstoken\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"ModelScope\",\n options: {\n baseURL: \"https://api-inference.modelscope.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ZhipuAI/GLM-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api-inference.modelscope.cn/v1\",\n defaultValue: \"https://api-inference.modelscope.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"KAT-Coder\",\n websiteUrl: \"https://console.streamlake.ai\",\n apiKeyUrl: \"https://console.streamlake.ai/console/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"KAT-Coder\",\n options: {\n baseURL:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"KAT-Coder-Pro\": { name: \"KAT-Coder Pro\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n defaultValue:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n editorValue: \"\",\n },\n ENDPOINT_ID: {\n label: \"Vanchin Endpoint ID\",\n placeholder: \"ep-xxx-xxx\",\n defaultValue: \"\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n icon: \"catcoder\",\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Longcat\",\n options: {\n baseURL: \"https://api.longcat.chat/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"LongCat-Flash-Chat\": { name: \"LongCat Flash Chat\" },\n },\n },\n category: \"cn_official\",\n icon: \"longcat\",\n iconColor: \"#29E154\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.longcat.chat/v1\",\n defaultValue: \"https://api.longcat.chat/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax\",\n options: {\n baseURL: \"https://api.minimaxi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax en\",\n options: {\n baseURL: \"https://api.minimax.io/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BaiLing\",\n options: {\n baseURL: \"https://api.tbox.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"Ling-2.5-1T\": { name: \"Ling 2.5-1T\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo\",\n options: {\n baseURL: \"https://api.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo Token Plan (China)\",\n options: {\n baseURL: \"https://token-plan-cn.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"Token Plan API Key\",\n placeholder: \"tp-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AiHubMix\",\n options: {\n baseURL: \"https://aihubmix.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CherryIN\",\n options: {\n baseURL: \"https://open.cherryin.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"cherryin\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"DMXAPI\",\n options: {\n baseURL: \"https://www.dmxapi.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"OpenRouter\",\n options: {\n baseURL: \"https://openrouter.ai/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-or-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"TheRouter\",\n options: {\n baseURL: \"https://api.therouter.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"openai/gpt-5.3-codex\": { name: \"GPT-5.3 Codex\" },\n \"openai/gpt-5.2\": { name: \"GPT-5.2\" },\n \"google/gemini-3.5-flash\": {\n name: \"Gemini 3.5 Flash\",\n },\n \"qwen/qwen3-coder-480b\": { name: \"Qwen3 Coder 480B\" },\n },\n },\n category: \"aggregator\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Novita AI\",\n options: {\n baseURL: \"https://api.novita.ai/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"novita\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Nvidia\",\n options: {\n baseURL: \"https://integrate.api.nvidia.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"moonshotai/kimi-k2.5\": { name: \"Kimi K2.5\" },\n },\n },\n category: \"aggregator\",\n icon: \"nvidia\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PIPELLM\",\n options: {\n baseURL: \"https://cc-api.pipellm.ai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"claude-opus-4-8\" },\n \"claude-sonnet-4-6\": { name: \"claude-sonnet-4-6\" },\n \"claude-haiku-4-5-20251001\": { name: \"claude-haiku-4-5-20251001\" },\n },\n },\n category: \"aggregator\",\n icon: \"pipellm\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"pipe-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PackyCode\",\n options: {\n baseURL: \"https://www.packyapi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"APIKEY.FUN\",\n options: {\n baseURL: \"https://api.apikey.fun/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"APINebula\",\n options: {\n baseURL: \"https://apinebula.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"AtlasCloud\",\n options: {\n baseURL: \"https://api.atlascloud.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM 5.1\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"SudoCode\",\n options: {\n baseURL: \"https://sudocode.us/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Cubence\",\n options: {\n baseURL: \"https://api.cubence.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AIGoCode\",\n options: {\n baseURL: \"https://api.aigocode.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"RightCode\",\n options: {\n baseURL: \"https://right.codes/codex/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AICodeMirror\",\n options: {\n baseURL: \"https://api.aicodemirror.com/api/claudecode\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"ClaudeCN\",\n options: {\n baseURL: \"https://claudecn.top\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"RunAPI\",\n options: {\n baseURL: \"https://runapi.co\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CrazyRouter\",\n options: {\n baseURL: \"https://cn.crazyrouter.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"SSSAiCode\",\n options: {\n baseURL: \"https://node-hk.sssaicodeapi.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Micu\",\n options: {\n baseURL: \"https://www.micuapi.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CTok\",\n options: {\n baseURL: \"https://api.ctok.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n options: {\n apiKey: \"\",\n baseURL: \"https://e-flowcode.cc/v1\",\n },\n models: {\n \"gpt-5.2-codex\": {\n name: \"gpt-5.2-codex\",\n },\n \"gpt-5.3-codex\": {\n name: \"gpt-5.3-codex\",\n },\n },\n },\n category: \"third_party\",\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"LemonData\",\n options: {\n baseURL: \"https://api.lemondata.cc/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AWS Bedrock\",\n websiteUrl: \"https://aws.amazon.com/bedrock/\",\n settingsConfig: {\n npm: \"@ai-sdk/amazon-bedrock\",\n name: \"AWS Bedrock\",\n options: {\n region: \"${region}\",\n accessKeyId: \"${accessKeyId}\",\n secretAccessKey: \"${secretAccessKey}\",\n setCacheKey: true,\n },\n models: {\n \"global.anthropic.claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"global.anthropic.claude-sonnet-4-6\": {\n name: \"Claude Sonnet 4.6\",\n },\n \"global.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n name: \"Claude Haiku 4.5\",\n },\n \"us.amazon.nova-pro-v1:0\": { name: \"Amazon Nova Pro\" },\n \"us.meta.llama4-maverick-17b-instruct-v1:0\": {\n name: \"Meta Llama 4 Maverick\",\n },\n \"us.deepseek.r1-v1:0\": { name: \"DeepSeek R1\" },\n },\n },\n category: \"cloud_provider\",\n icon: \"aws\",\n iconColor: \"#FF9900\",\n templateValues: {\n region: {\n label: \"AWS Region\",\n placeholder: \"us-west-2\",\n defaultValue: \"us-west-2\",\n editorValue: \"us-west-2\",\n },\n accessKeyId: {\n label: \"Access Key ID\",\n placeholder: \"AKIA...\",\n editorValue: \"\",\n },\n secretAccessKey: {\n label: \"Secret Access Key\",\n placeholder: \"your-secret-key\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenAI Compatible\",\n websiteUrl: \"\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"custom\",\n isCustomTemplate: true,\n icon: \"generic\",\n iconColor: \"#6B7280\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.example.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"Oh My OpenCode\",\n websiteUrl: \"https://github.com/code-yeongyu/oh-my-openagent\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#8B5CF6\",\n isCustomTemplate: true,\n },\n {\n name: \"Oh My OpenCode Slim\",\n websiteUrl: \"https://github.com/alvinunreal/oh-my-opencode-slim\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo-slim\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#6366F1\",\n isCustomTemplate: true,\n },\n];\n"}, "636da7d3bc74f3edff5eca22e9f0e90370cc83ed": {"t": 1785809871.9684641, "n": 48037, "h": "1f153dcae551261e", "c": "import type { ProviderCategory, OpenCodeProviderConfig } from \"../types\";\nimport type { PresetTheme, TemplateValueConfig } from \"./claudeProviderPresets\";\n\nexport interface OpenCodeProviderPreset {\n name: string;\n nameKey?: string; // i18n key for localized display name\n websiteUrl: string;\n apiKeyUrl?: string;\n settingsConfig: OpenCodeProviderConfig;\n isOfficial?: boolean;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n category?: ProviderCategory;\n templateValues?: Record<string, TemplateValueConfig>;\n theme?: PresetTheme;\n icon?: string;\n iconColor?: string;\n isCustomTemplate?: boolean;\n}\n\nexport const opencodeNpmPackages = [\n { value: \"@ai-sdk/openai\", label: \"OpenAI Responses\" },\n { value: \"@ai-sdk/openai-compatible\", label: \"OpenAI Compatible\" },\n { value: \"@ai-sdk/anthropic\", label: \"Anthropic\" },\n { value: \"@ai-sdk/amazon-bedrock\", label: \"Amazon Bedrock\" },\n { value: \"@ai-sdk/google\", label: \"Google (Gemini)\" },\n] as const;\n\nexport interface PresetModelVariant {\n id: string;\n name?: string;\n contextLimit?: number;\n outputLimit?: number;\n modalities?: { input: string[]; output: string[] };\n options?: Record<string, unknown>;\n variants?: Record<string, Record<string, unknown>>;\n}\n\nexport const OPENCODE_PRESET_MODEL_VARIANTS: Record<\n string,\n PresetModelVariant[]\n> = {\n \"@ai-sdk/openai-compatible\": [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"glm-5.1\",\n name: \"GLM 5.1\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"kimi-k2.6\",\n name: \"Kimi K2.6\",\n contextLimit: 262144,\n outputLimit: 262144,\n modalities: { input: [\"text\", \"image\", \"video\"], output: [\"text\"] },\n },\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextLimit: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextLimit: 262144,\n },\n ],\n \"@ai-sdk/google\": [\n {\n id: \"gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n auto: {\n thinkingConfig: { includeThoughts: true, thinkingBudget: -1 },\n },\n \"no-thinking\": { thinkingConfig: { thinkingBudget: 0 } },\n },\n },\n {\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n minimal: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"minimal\" },\n },\n low: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"low\" },\n },\n medium: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"medium\" },\n },\n high: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"high\" },\n },\n },\n },\n ],\n \"@ai-sdk/openai\": [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextLimit: 400000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n variants: {\n low: {\n reasoningEffort: \"low\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n medium: {\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n high: {\n reasoningEffort: \"high\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n xhigh: {\n reasoningEffort: \"xhigh\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n },\n },\n ],\n \"@ai-sdk/amazon-bedrock\": [\n {\n id: \"global.anthropic.claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextLimit: 1000000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-haiku-4-5-20251001-v1:0\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"us.amazon.nova-pro-v1:0\",\n name: \"Amazon Nova Pro\",\n contextLimit: 300000,\n outputLimit: 5000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n {\n id: \"us.meta.llama4-maverick-17b-instruct-v1:0\",\n name: \"Meta Llama 4 Maverick\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"us.deepseek.r1-v1:0\",\n name: \"DeepSeek R1\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n ],\n \"@ai-sdk/anthropic\": [\n {\n id: \"claude-sonnet-4-5-20250929\",\n name: \"Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"claude-opus-4-5-20251101\",\n name: \"Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n max: { effort: \"max\" },\n },\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"gemini-claude-opus-4-5-thinking\",\n name: \"Antigravity - Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"gemini-claude-sonnet-4-5-thinking\",\n name: \"Antigravity - Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n ],\n};\n\n/**\n * Look up preset metadata for a model by npm package and model ID.\n * Returns enrichment fields (options, limit, modalities) that can be\n * merged into a model definition when the user's config doesn't already\n * provide them.\n */\nexport function getPresetModelDefaults(\n npm: string,\n modelId: string,\n): PresetModelVariant | undefined {\n const models = OPENCODE_PRESET_MODEL_VARIANTS[npm];\n if (!models) return undefined;\n return models.find((m) => m.id === modelId);\n}\n\nexport const opencodeProviderPresets: OpenCodeProviderPreset[] = [\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Shengsuanyun\",\n options: {\n baseURL: \"https://router.shengsuanyun.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"火山Agentplan\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BytePlus\",\n options: {\n baseURL: \"https://ark.ap-southeast.bytepluses.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"DouBaoSeed\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"doubao-seed-2-0-code-preview-latest\": {\n name: \"Doubao Seed Code Preview\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"CCSub\",\n options: {\n baseURL: \"https://www.ccsub.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Unity2.ai\",\n options: {\n baseURL: \"https://api.unity2.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"https://api.deepseek.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"deepseek-v4-pro\": { name: \"DeepSeek V4 Pro\" },\n \"deepseek-v4-flash\": { name: \"DeepSeek V4 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM\",\n options: {\n baseURL: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n defaultValue: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM en\",\n options: {\n baseURL: \"https://api.z.ai/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.z.ai/api/coding/paas/v4\",\n defaultValue: \"https://api.z.ai/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Bailian\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/#/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Bailian\",\n options: {\n baseURL: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"cn_official\",\n icon: \"bailian\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n defaultValue: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi k2.6\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Kimi k2.6\",\n options: {\n baseURL: \"https://api.moonshot.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-k2.6\": { name: \"Kimi K2.6\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.moonshot.cn/v1\",\n defaultValue: \"https://api.moonshot.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Kimi For Coding\",\n options: {\n baseURL: \"https://api.kimi.com/coding/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-for-coding\": { name: \"Kimi For Coding\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.kimi.com/coding/v1\",\n defaultValue: \"https://api.kimi.com/coding/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.com/step_plan/v1\",\n defaultValue: \"https://api.stepfun.com/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun en\",\n options: {\n baseURL: \"https://api.stepfun.ai/step_plan/v1\",\n apiKey: \"\",\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.ai/step_plan/v1\",\n defaultValue: \"https://api.stepfun.ai/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun Step Plan\",\n websiteUrl: \"https://platform.stepfun.com/docs/zh/step-plan/overview\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun Step Plan\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#005AFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n apiKeyUrl: \"https://modelscope.cn/my/myaccesstoken\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"ModelScope\",\n options: {\n baseURL: \"https://api-inference.modelscope.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ZhipuAI/GLM-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api-inference.modelscope.cn/v1\",\n defaultValue: \"https://api-inference.modelscope.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"KAT-Coder\",\n websiteUrl: \"https://console.streamlake.ai\",\n apiKeyUrl: \"https://console.streamlake.ai/console/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"KAT-Coder\",\n options: {\n baseURL:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"KAT-Coder-Pro\": { name: \"KAT-Coder Pro\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n defaultValue:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n editorValue: \"\",\n },\n ENDPOINT_ID: {\n label: \"Vanchin Endpoint ID\",\n placeholder: \"ep-xxx-xxx\",\n defaultValue: \"\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n icon: \"catcoder\",\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Longcat\",\n options: {\n baseURL: \"https://api.longcat.chat/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"LongCat-Flash-Chat\": { name: \"LongCat Flash Chat\" },\n },\n },\n category: \"cn_official\",\n icon: \"longcat\",\n iconColor: \"#29E154\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.longcat.chat/v1\",\n defaultValue: \"https://api.longcat.chat/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax\",\n options: {\n baseURL: \"https://api.minimaxi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax en\",\n options: {\n baseURL: \"https://api.minimax.io/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BaiLing\",\n options: {\n baseURL: \"https://api.tbox.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"Ling-2.5-1T\": { name: \"Ling 2.5-1T\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo\",\n options: {\n baseURL: \"https://api.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo Token Plan (China)\",\n options: {\n baseURL: \"https://token-plan-cn.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"Token Plan API Key\",\n placeholder: \"tp-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AiHubMix\",\n options: {\n baseURL: \"https://aihubmix.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CherryIN\",\n options: {\n baseURL: \"https://open.cherryin.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"cherryin\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"DMXAPI\",\n options: {\n baseURL: \"https://www.dmxapi.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"OpenRouter\",\n options: {\n baseURL: \"https://openrouter.ai/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-or-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"TheRouter\",\n options: {\n baseURL: \"https://api.therouter.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"openai/gpt-5.3-codex\": { name: \"GPT-5.3 Codex\" },\n \"openai/gpt-5.2\": { name: \"GPT-5.2\" },\n \"google/gemini-3.5-flash\": {\n name: \"Gemini 3.5 Flash\",\n },\n \"qwen/qwen3-coder-480b\": { name: \"Qwen3 Coder 480B\" },\n },\n },\n category: \"aggregator\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Novita AI\",\n options: {\n baseURL: \"https://api.novita.ai/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"novita\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Nvidia\",\n options: {\n baseURL: \"https://integrate.api.nvidia.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"moonshotai/kimi-k2.5\": { name: \"Kimi K2.5\" },\n },\n },\n category: \"aggregator\",\n icon: \"nvidia\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PIPELLM\",\n options: {\n baseURL: \"https://cc-api.pipellm.ai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"claude-opus-4-8\" },\n \"claude-sonnet-4-6\": { name: \"claude-sonnet-4-6\" },\n \"claude-haiku-4-5-20251001\": { name: \"claude-haiku-4-5-20251001\" },\n },\n },\n category: \"aggregator\",\n icon: \"pipellm\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"pipe-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PackyCode\",\n options: {\n baseURL: \"https://www.packyapi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"APIKEY.FUN\",\n options: {\n baseURL: \"https://api.apikey.fun/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"APINebula\",\n options: {\n baseURL: \"https://apinebula.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"AtlasCloud\",\n options: {\n baseURL: \"https://api.atlascloud.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM 5.1\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"SudoCode\",\n options: {\n baseURL: \"https://sudocode.us/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Cubence\",\n options: {\n baseURL: \"https://api.cubence.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AIGoCode\",\n options: {\n baseURL: \"https://api.aigocode.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"RightCode\",\n options: {\n baseURL: \"https://right.codes/codex/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AICodeMirror\",\n options: {\n baseURL: \"https://api.aicodemirror.com/api/claudecode\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"ClaudeCN\",\n options: {\n baseURL: \"https://claudecn.top\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"RunAPI\",\n options: {\n baseURL: \"https://runapi.co\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CrazyRouter\",\n options: {\n baseURL: \"https://cn.crazyrouter.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"SSSAiCode\",\n options: {\n baseURL: \"https://node-hk.sssaicodeapi.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Micu\",\n options: {\n baseURL: \"https://www.micuapi.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CTok\",\n options: {\n baseURL: \"https://api.ctok.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n options: {\n apiKey: \"\",\n baseURL: \"https://e-flowcode.cc/v1\",\n },\n models: {\n \"gpt-5.2-codex\": {\n name: \"gpt-5.2-codex\",\n },\n \"gpt-5.3-codex\": {\n name: \"gpt-5.3-codex\",\n },\n },\n },\n category: \"third_party\",\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"LemonData\",\n options: {\n baseURL: \"https://api.lemondata.cc/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AWS Bedrock\",\n websiteUrl: \"https://aws.amazon.com/bedrock/\",\n settingsConfig: {\n npm: \"@ai-sdk/amazon-bedrock\",\n name: \"AWS Bedrock\",\n options: {\n region: \"${region}\",\n accessKeyId: \"${accessKeyId}\",\n secretAccessKey: \"${secretAccessKey}\",\n setCacheKey: true,\n },\n models: {\n \"global.anthropic.claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"global.anthropic.claude-sonnet-4-6\": {\n name: \"Claude Sonnet 4.6\",\n },\n \"global.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n name: \"Claude Haiku 4.5\",\n },\n \"us.amazon.nova-pro-v1:0\": { name: \"Amazon Nova Pro\" },\n \"us.meta.llama4-maverick-17b-instruct-v1:0\": {\n name: \"Meta Llama 4 Maverick\",\n },\n \"us.deepseek.r1-v1:0\": { name: \"DeepSeek R1\" },\n },\n },\n category: \"cloud_provider\",\n icon: \"aws\",\n iconColor: \"#FF9900\",\n templateValues: {\n region: {\n label: \"AWS Region\",\n placeholder: \"us-west-2\",\n defaultValue: \"us-west-2\",\n editorValue: \"us-west-2\",\n },\n accessKeyId: {\n label: \"Access Key ID\",\n placeholder: \"AKIA...\",\n editorValue: \"\",\n },\n secretAccessKey: {\n label: \"Secret Access Key\",\n placeholder: \"your-secret-key\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenAI Compatible\",\n websiteUrl: \"\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"custom\",\n isCustomTemplate: true,\n icon: \"generic\",\n iconColor: \"#6B7280\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.example.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"Oh My OpenCode\",\n websiteUrl: \"https://github.com/code-yeongyu/oh-my-openagent\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#8B5CF6\",\n isCustomTemplate: true,\n },\n {\n name: \"Oh My OpenCode Slim\",\n websiteUrl: \"https://github.com/alvinunreal/oh-my-opencode-slim\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo-slim\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#6366F1\",\n isCustomTemplate: true,\n },\n];\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785809908.0212748, "n": 48037, "h": "1f153dcae551261e", "c": "import type { ProviderCategory, OpenCodeProviderConfig } from \"../types\";\nimport type { PresetTheme, TemplateValueConfig } from \"./claudeProviderPresets\";\n\nexport interface OpenCodeProviderPreset {\n name: string;\n nameKey?: string; // i18n key for localized display name\n websiteUrl: string;\n apiKeyUrl?: string;\n settingsConfig: OpenCodeProviderConfig;\n isOfficial?: boolean;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n category?: ProviderCategory;\n templateValues?: Record<string, TemplateValueConfig>;\n theme?: PresetTheme;\n icon?: string;\n iconColor?: string;\n isCustomTemplate?: boolean;\n}\n\nexport const opencodeNpmPackages = [\n { value: \"@ai-sdk/openai\", label: \"OpenAI Responses\" },\n { value: \"@ai-sdk/openai-compatible\", label: \"OpenAI Compatible\" },\n { value: \"@ai-sdk/anthropic\", label: \"Anthropic\" },\n { value: \"@ai-sdk/amazon-bedrock\", label: \"Amazon Bedrock\" },\n { value: \"@ai-sdk/google\", label: \"Google (Gemini)\" },\n] as const;\n\nexport interface PresetModelVariant {\n id: string;\n name?: string;\n contextLimit?: number;\n outputLimit?: number;\n modalities?: { input: string[]; output: string[] };\n options?: Record<string, unknown>;\n variants?: Record<string, Record<string, unknown>>;\n}\n\nexport const OPENCODE_PRESET_MODEL_VARIANTS: Record<\n string,\n PresetModelVariant[]\n> = {\n \"@ai-sdk/openai-compatible\": [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"glm-5.1\",\n name: \"GLM 5.1\",\n contextLimit: 204800,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"kimi-k2.6\",\n name: \"Kimi K2.6\",\n contextLimit: 262144,\n outputLimit: 262144,\n modalities: { input: [\"text\", \"image\", \"video\"], output: [\"text\"] },\n },\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextLimit: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextLimit: 262144,\n },\n ],\n \"@ai-sdk/google\": [\n {\n id: \"gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n auto: {\n thinkingConfig: { includeThoughts: true, thinkingBudget: -1 },\n },\n \"no-thinking\": { thinkingConfig: { thinkingBudget: 0 } },\n },\n },\n {\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n contextLimit: 1048576,\n outputLimit: 65536,\n modalities: {\n input: [\"text\", \"image\", \"pdf\", \"video\", \"audio\"],\n output: [\"text\"],\n },\n variants: {\n minimal: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"minimal\" },\n },\n low: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"low\" },\n },\n medium: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"medium\" },\n },\n high: {\n thinkingConfig: { includeThoughts: true, thinkingLevel: \"high\" },\n },\n },\n },\n ],\n \"@ai-sdk/openai\": [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextLimit: 400000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n variants: {\n low: {\n reasoningEffort: \"low\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n medium: {\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n high: {\n reasoningEffort: \"high\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n xhigh: {\n reasoningEffort: \"xhigh\",\n reasoningSummary: \"auto\",\n textVerbosity: \"medium\",\n },\n },\n },\n ],\n \"@ai-sdk/amazon-bedrock\": [\n {\n id: \"global.anthropic.claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextLimit: 1000000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"global.anthropic.claude-haiku-4-5-20251001-v1:0\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"us.amazon.nova-pro-v1:0\",\n name: \"Amazon Nova Pro\",\n contextLimit: 300000,\n outputLimit: 5000,\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n {\n id: \"us.meta.llama4-maverick-17b-instruct-v1:0\",\n name: \"Meta Llama 4 Maverick\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n {\n id: \"us.deepseek.r1-v1:0\",\n name: \"DeepSeek R1\",\n contextLimit: 131072,\n outputLimit: 131072,\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n ],\n \"@ai-sdk/anthropic\": [\n {\n id: \"claude-sonnet-4-5-20250929\",\n name: \"Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"claude-opus-4-5-20251101\",\n name: \"Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextLimit: 1000000,\n outputLimit: 128000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n max: { effort: \"max\" },\n },\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"Claude Haiku 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n },\n {\n id: \"gemini-claude-opus-4-5-thinking\",\n name: \"Antigravity - Claude Opus 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { effort: \"low\" },\n medium: { effort: \"medium\" },\n high: { effort: \"high\" },\n },\n },\n {\n id: \"gemini-claude-sonnet-4-5-thinking\",\n name: \"Antigravity - Claude Sonnet 4.5\",\n contextLimit: 200000,\n outputLimit: 64000,\n modalities: { input: [\"text\", \"image\", \"pdf\"], output: [\"text\"] },\n variants: {\n low: { thinking: { budgetTokens: 5000, type: \"enabled\" } },\n medium: { thinking: { budgetTokens: 13000, type: \"enabled\" } },\n high: { thinking: { budgetTokens: 18000, type: \"enabled\" } },\n },\n },\n ],\n};\n\n/**\n * Look up preset metadata for a model by npm package and model ID.\n * Returns enrichment fields (options, limit, modalities) that can be\n * merged into a model definition when the user's config doesn't already\n * provide them.\n */\nexport function getPresetModelDefaults(\n npm: string,\n modelId: string,\n): PresetModelVariant | undefined {\n const models = OPENCODE_PRESET_MODEL_VARIANTS[npm];\n if (!models) return undefined;\n return models.find((m) => m.id === modelId);\n}\n\nexport const opencodeProviderPresets: OpenCodeProviderPreset[] = [\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Shengsuanyun\",\n options: {\n baseURL: \"https://router.shengsuanyun.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"火山Agentplan\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BytePlus\",\n options: {\n baseURL: \"https://ark.ap-southeast.bytepluses.com/api/coding/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ark-code-latest\": {\n name: \"Ark Code Latest\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"DouBaoSeed\",\n options: {\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"doubao-seed-2-0-code-preview-latest\": {\n name: \"Doubao Seed Code Preview\",\n },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"CCSub\",\n options: {\n baseURL: \"https://www.ccsub.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Unity2.ai\",\n options: {\n baseURL: \"https://api.unity2.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"https://api.deepseek.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"deepseek-v4-pro\": { name: \"DeepSeek V4 Pro\" },\n \"deepseek-v4-flash\": { name: \"DeepSeek V4 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM\",\n options: {\n baseURL: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n defaultValue: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Zhipu GLM en\",\n options: {\n baseURL: \"https://api.z.ai/api/coding/paas/v4\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.z.ai/api/coding/paas/v4\",\n defaultValue: \"https://api.z.ai/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Bailian\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/#/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Bailian\",\n options: {\n baseURL: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"cn_official\",\n icon: \"bailian\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n defaultValue: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi k2.6\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Kimi k2.6\",\n options: {\n baseURL: \"https://api.moonshot.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-k2.6\": { name: \"Kimi K2.6\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.moonshot.cn/v1\",\n defaultValue: \"https://api.moonshot.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Kimi For Coding\",\n options: {\n baseURL: \"https://api.kimi.com/coding/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"kimi-for-coding\": { name: \"Kimi For Coding\" },\n },\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.kimi.com/coding/v1\",\n defaultValue: \"https://api.kimi.com/coding/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.com/step_plan/v1\",\n defaultValue: \"https://api.stepfun.com/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun en\",\n options: {\n baseURL: \"https://api.stepfun.ai/step_plan/v1\",\n apiKey: \"\",\n },\n models: {\n \"step-3.5-flash-2603\": { name: \"Step 3.5 Flash 2603\" },\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.ai/step_plan/v1\",\n defaultValue: \"https://api.stepfun.ai/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"StepFun Step Plan\",\n websiteUrl: \"https://platform.stepfun.com/docs/zh/step-plan/overview\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"StepFun Step Plan\",\n options: {\n baseURL: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"step-3.5-flash\": { name: \"Step 3.5 Flash\" },\n },\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#005AFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n apiKeyUrl: \"https://modelscope.cn/my/myaccesstoken\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"ModelScope\",\n options: {\n baseURL: \"https://api-inference.modelscope.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"ZhipuAI/GLM-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api-inference.modelscope.cn/v1\",\n defaultValue: \"https://api-inference.modelscope.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"KAT-Coder\",\n websiteUrl: \"https://console.streamlake.ai\",\n apiKeyUrl: \"https://console.streamlake.ai/console/api-key\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"KAT-Coder\",\n options: {\n baseURL:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"KAT-Coder-Pro\": { name: \"KAT-Coder Pro\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n defaultValue:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n editorValue: \"\",\n },\n ENDPOINT_ID: {\n label: \"Vanchin Endpoint ID\",\n placeholder: \"ep-xxx-xxx\",\n defaultValue: \"\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n icon: \"catcoder\",\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Longcat\",\n options: {\n baseURL: \"https://api.longcat.chat/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"LongCat-Flash-Chat\": { name: \"LongCat Flash Chat\" },\n },\n },\n category: \"cn_official\",\n icon: \"longcat\",\n iconColor: \"#29E154\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.longcat.chat/v1\",\n defaultValue: \"https://api.longcat.chat/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax\",\n options: {\n baseURL: \"https://api.minimaxi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"MiniMax en\",\n options: {\n baseURL: \"https://api.minimax.io/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"MiniMax-M2.7\": { name: \"MiniMax M2.7\" },\n },\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"BaiLing\",\n options: {\n baseURL: \"https://api.tbox.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"Ling-2.5-1T\": { name: \"Ling 2.5-1T\" },\n },\n },\n category: \"cn_official\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo\",\n options: {\n baseURL: \"https://api.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Xiaomi MiMo Token Plan (China)\",\n options: {\n baseURL: \"https://token-plan-cn.xiaomimimo.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"mimo-v2.5-pro\": {\n name: \"MiMo V2.5 Pro\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\"], output: [\"text\"] },\n },\n \"mimo-v2.5\": {\n name: \"MiMo V2.5\",\n limit: { context: 1048576, output: 131072 },\n modalities: { input: [\"text\", \"image\"], output: [\"text\"] },\n },\n },\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"Token Plan API Key\",\n placeholder: \"tp-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AiHubMix\",\n options: {\n baseURL: \"https://aihubmix.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CherryIN\",\n options: {\n baseURL: \"https://open.cherryin.net/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"cherryin\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"DMXAPI\",\n options: {\n baseURL: \"https://www.dmxapi.cn/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"OpenRouter\",\n options: {\n baseURL: \"https://openrouter.ai/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"anthropic/claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"aggregator\",\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-or-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"TheRouter\",\n options: {\n baseURL: \"https://api.therouter.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"anthropic/claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"openai/gpt-5.3-codex\": { name: \"GPT-5.3 Codex\" },\n \"openai/gpt-5.2\": { name: \"GPT-5.2\" },\n \"google/gemini-3.5-flash\": {\n name: \"Gemini 3.5 Flash\",\n },\n \"qwen/qwen3-coder-480b\": { name: \"Qwen3 Coder 480B\" },\n },\n },\n category: \"aggregator\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Novita AI\",\n options: {\n baseURL: \"https://api.novita.ai/openai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM-5.1\" },\n },\n },\n category: \"aggregator\",\n icon: \"novita\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Nvidia\",\n options: {\n baseURL: \"https://integrate.api.nvidia.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"moonshotai/kimi-k2.5\": { name: \"Kimi K2.5\" },\n },\n },\n category: \"aggregator\",\n icon: \"nvidia\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PIPELLM\",\n options: {\n baseURL: \"https://cc-api.pipellm.ai\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"claude-opus-4-8\" },\n \"claude-sonnet-4-6\": { name: \"claude-sonnet-4-6\" },\n \"claude-haiku-4-5-20251001\": { name: \"claude-haiku-4-5-20251001\" },\n },\n },\n category: \"aggregator\",\n icon: \"pipellm\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"pipe-...\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"PackyCode\",\n options: {\n baseURL: \"https://www.packyapi.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"APIKEY.FUN\",\n options: {\n baseURL: \"https://api.apikey.fun/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"APINebula\",\n options: {\n baseURL: \"https://apinebula.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"AtlasCloud\",\n options: {\n baseURL: \"https://api.atlascloud.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"zai-org/glm-5.1\": { name: \"GLM 5.1\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"SudoCode\",\n options: {\n baseURL: \"https://sudocode.us/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Cubence\",\n options: {\n baseURL: \"https://api.cubence.com/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AIGoCode\",\n options: {\n baseURL: \"https://api.aigocode.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n name: \"RightCode\",\n options: {\n baseURL: \"https://right.codes/codex/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"AICodeMirror\",\n options: {\n baseURL: \"https://api.aicodemirror.com/api/claudecode\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4.6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4.8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"ClaudeCN\",\n options: {\n baseURL: \"https://claudecn.top\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"RunAPI\",\n options: {\n baseURL: \"https://runapi.co\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-haiku-4-5\": { name: \"Claude Haiku 4.5\" },\n },\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CrazyRouter\",\n options: {\n baseURL: \"https://cn.crazyrouter.com\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"SSSAiCode\",\n options: {\n baseURL: \"https://node-hk.sssaicodeapi.com/api/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"Micu\",\n options: {\n baseURL: \"https://www.micuapi.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n settingsConfig: {\n npm: \"@ai-sdk/anthropic\",\n name: \"CTok\",\n options: {\n baseURL: \"https://api.ctok.ai/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"claude-sonnet-4-6\": { name: \"Claude Sonnet 4.6\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n settingsConfig: {\n npm: \"@ai-sdk/openai\",\n options: {\n apiKey: \"\",\n baseURL: \"https://e-flowcode.cc/v1\",\n },\n models: {\n \"gpt-5.2-codex\": {\n name: \"gpt-5.2-codex\",\n },\n \"gpt-5.3-codex\": {\n name: \"gpt-5.3-codex\",\n },\n },\n },\n category: \"third_party\",\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"LemonData\",\n options: {\n baseURL: \"https://api.lemondata.cc/v1\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {\n \"gpt-5.5\": { name: \"GPT-5.5\" },\n },\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"AWS Bedrock\",\n websiteUrl: \"https://aws.amazon.com/bedrock/\",\n settingsConfig: {\n npm: \"@ai-sdk/amazon-bedrock\",\n name: \"AWS Bedrock\",\n options: {\n region: \"${region}\",\n accessKeyId: \"${accessKeyId}\",\n secretAccessKey: \"${secretAccessKey}\",\n setCacheKey: true,\n },\n models: {\n \"global.anthropic.claude-opus-4-8\": { name: \"Claude Opus 4.8\" },\n \"global.anthropic.claude-sonnet-4-6\": {\n name: \"Claude Sonnet 4.6\",\n },\n \"global.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n name: \"Claude Haiku 4.5\",\n },\n \"us.amazon.nova-pro-v1:0\": { name: \"Amazon Nova Pro\" },\n \"us.meta.llama4-maverick-17b-instruct-v1:0\": {\n name: \"Meta Llama 4 Maverick\",\n },\n \"us.deepseek.r1-v1:0\": { name: \"DeepSeek R1\" },\n },\n },\n category: \"cloud_provider\",\n icon: \"aws\",\n iconColor: \"#FF9900\",\n templateValues: {\n region: {\n label: \"AWS Region\",\n placeholder: \"us-west-2\",\n defaultValue: \"us-west-2\",\n editorValue: \"us-west-2\",\n },\n accessKeyId: {\n label: \"Access Key ID\",\n placeholder: \"AKIA...\",\n editorValue: \"\",\n },\n secretAccessKey: {\n label: \"Secret Access Key\",\n placeholder: \"your-secret-key\",\n editorValue: \"\",\n },\n },\n },\n {\n name: \"OpenAI Compatible\",\n websiteUrl: \"\",\n settingsConfig: {\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: \"\",\n apiKey: \"\",\n setCacheKey: true,\n },\n models: {},\n },\n category: \"custom\",\n isCustomTemplate: true,\n icon: \"generic\",\n iconColor: \"#6B7280\",\n templateValues: {\n baseURL: {\n label: \"Base URL\",\n placeholder: \"https://api.example.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n\n {\n name: \"Oh My OpenCode\",\n websiteUrl: \"https://github.com/code-yeongyu/oh-my-openagent\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#8B5CF6\",\n isCustomTemplate: true,\n },\n {\n name: \"Oh My OpenCode Slim\",\n websiteUrl: \"https://github.com/alvinunreal/oh-my-opencode-slim\",\n settingsConfig: {\n npm: \"\",\n options: {},\n models: {},\n },\n category: \"omo-slim\" as ProviderCategory,\n icon: \"opencode\",\n iconColor: \"#6366F1\",\n isCustomTemplate: true,\n },\n];\n"}}, "src/config/claudeDesktopProviderPresets.ts": {"6f0e83459eeaa036a44cb4538e43a042113521f5": {"t": 1785596168.7529063, "n": 30490, "h": "6fc51fe293e1405b", "c": "/**\n * Claude Desktop 预设供应商配置模板\n *\n * 形态与 Claude Code 预设不同:\n * - baseUrl 是顶级字段,而不是 settingsConfig.env.ANTHROPIC_BASE_URL\n * - 模型信息以\"Desktop 可见模型 ID → 上游模型\"表达,\n * 对应后端 ClaudeDesktopModelRoute 的 routeId / model\n *\n * 翻译来源:src/config/claudeProviderPresets.ts(排除 OAuth 与不兼容预设)\n */\nimport { ProviderCategory } from \"../types\";\nimport type { PresetTheme } from \"./claudeProviderPresets\";\n\nexport type ClaudeDesktopApiFormat =\n | \"anthropic\"\n | \"openai_chat\"\n | \"openai_responses\"\n | \"gemini_native\";\n\nexport interface ClaudeDesktopRoutePreset {\n routeId: string;\n upstreamModel: string;\n labelOverride?: string;\n supports1m: boolean;\n}\n\n/**\n * Claude Desktop 3P fail-all 校验只接受 `claude-(sonnet|opus|haiku)-*` 形式的\n * routeId(1.6259.1+,实测 2026-05-13)。所有预设工厂、表单角色下拉、\n * 后端 `next_catalog_safe_route_id` 都从此映射派生 routeId,避免散落硬编码。\n */\nexport const CLAUDE_DESKTOP_ROLE_ROUTE_IDS = {\n sonnet: \"claude-sonnet-4-6\",\n opus: \"claude-opus-4-8\",\n haiku: \"claude-haiku-4-5\",\n} as const;\n\nexport type ClaudeDesktopRoleId = keyof typeof CLAUDE_DESKTOP_ROLE_ROUTE_IDS;\n\nexport interface ClaudeDesktopProviderPreset {\n name: string;\n nameKey?: string;\n websiteUrl: string;\n apiKeyUrl?: string;\n category?: ProviderCategory;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n\n baseUrl: string;\n apiKeyField?: \"ANTHROPIC_AUTH_TOKEN\" | \"ANTHROPIC_API_KEY\";\n\n mode: \"direct\" | \"proxy\";\n apiFormat?: ClaudeDesktopApiFormat;\n modelRoutes?: ClaudeDesktopRoutePreset[];\n providerType?: \"github_copilot\" | \"codex_oauth\";\n requiresOAuth?: boolean;\n\n endpointCandidates?: string[];\n theme?: PresetTheme;\n icon?: string;\n iconColor?: string;\n}\n\nconst passthroughRoutes = (supports1m = false): ClaudeDesktopRoutePreset[] => [\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.sonnet,\n upstreamModel: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.sonnet,\n supports1m,\n },\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.opus,\n upstreamModel: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.opus,\n supports1m,\n },\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.haiku,\n upstreamModel: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.haiku,\n supports1m,\n },\n];\n\nconst mappedRoutes = (\n sonnet: string,\n opus: string,\n haiku: string,\n supports1m = false,\n): ClaudeDesktopRoutePreset[] => [\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.sonnet,\n upstreamModel: sonnet,\n supports1m,\n },\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.opus,\n upstreamModel: opus,\n supports1m,\n },\n {\n routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.haiku,\n upstreamModel: haiku,\n supports1m,\n },\n];\n\n/**\n * 非 Claude 上游模型用此工厂:route ID 使用 Claude Desktop 能通过校验的\n * Sonnet/Opus/Haiku 路由,真实品牌名只写入 labelOverride 和 upstreamModel。\n */\nconst brandedRoutes = (\n sonnet: string,\n opus: string,\n haiku: string,\n supports1m = false,\n): ClaudeDesktopRoutePreset[] => {\n const seenUpstream = new Set<string>();\n return [\n { routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.sonnet, upstreamModel: sonnet },\n { routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.opus, upstreamModel: opus },\n { routeId: CLAUDE_DESKTOP_ROLE_ROUTE_IDS.haiku, upstreamModel: haiku },\n ]\n .map(({ routeId, upstreamModel }) => ({\n routeId,\n upstreamModel,\n labelOverride: upstreamModel,\n supports1m,\n }))\n .filter((route) => {\n if (seenUpstream.has(route.upstreamModel)) {\n return false;\n }\n seenUpstream.add(route.upstreamModel);\n return true;\n });\n};\n\nexport const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [\n {\n name: \"Claude Desktop Official\",\n websiteUrl: \"https://claude.ai/download\",\n category: \"official\",\n baseUrl: \"\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n theme: {\n icon: \"claude\",\n backgroundColor: \"#D97757\",\n textColor: \"#FFFFFF\",\n },\n icon: \"anthropic\",\n iconColor: \"#D4915D\",\n },\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n category: \"aggregator\",\n baseUrl: \"https://router.shengsuanyun.com/api\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: mappedRoutes(\n \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4.8\",\n \"anthropic/claude-haiku-4.5\",\n ),\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n },\n {\n name: \"PatewayAI\",\n websiteUrl: \"https://pateway.ai\",\n apiKeyUrl: \"https://pateway.ai/?ch=etzpm8&aff=WB6M6F67#/\",\n category: \"third_party\",\n baseUrl: \"https://api.pateway.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"patewayai\",\n icon: \"pateway\",\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n category: \"cn_official\",\n baseUrl: \"https://ark.cn-beijing.volces.com/api/coding\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"ark-code-latest\",\n \"ark-code-latest\",\n \"ark-code-latest\",\n ),\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n category: \"cn_official\",\n baseUrl: \"https://ark.ap-southeast.bytepluses.com/api/coding\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"ark-code-latest\",\n \"ark-code-latest\",\n \"ark-code-latest\",\n ),\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n category: \"cn_official\",\n baseUrl: \"https://ark.cn-beijing.volces.com/api/compatible\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"doubao-seed-2-0-code-preview-latest\",\n \"doubao-seed-2-0-code-preview-latest\",\n \"doubao-seed-2-0-code-preview-latest\",\n ),\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n category: \"aggregator\",\n baseUrl: \"https://www.ccsub.net\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(true),\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n category: \"aggregator\",\n baseUrl: \"https://api.unity2.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(true),\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n },\n {\n name: \"Gemini Native\",\n websiteUrl: \"https://ai.google.dev/gemini-api\",\n apiKeyUrl: \"https://aistudio.google.com/app/apikey\",\n category: \"third_party\",\n baseUrl: \"https://generativelanguage.googleapis.com\",\n apiKeyField: \"ANTHROPIC_API_KEY\",\n mode: \"proxy\",\n apiFormat: \"gemini_native\",\n modelRoutes: brandedRoutes(\n \"gemini-3.5-flash\",\n \"gemini-3.5-flash\",\n \"gemini-3.5-flash\",\n ),\n endpointCandidates: [\"https://generativelanguage.googleapis.com\"],\n icon: \"gemini\",\n iconColor: \"#4285F4\",\n },\n {\n name: \"GitHub Copilot\",\n websiteUrl: \"https://github.com/features/copilot\",\n category: \"third_party\",\n baseUrl: \"https://api.githubcopilot.com\",\n mode: \"proxy\",\n apiFormat: \"openai_chat\",\n providerType: \"github_copilot\",\n requiresOAuth: true,\n modelRoutes: brandedRoutes(\n \"claude-sonnet-4.6\",\n \"claude-sonnet-4.6\",\n \"claude-haiku-4.5\",\n ),\n icon: \"github\",\n iconColor: \"#000000\",\n },\n {\n name: \"Codex\",\n websiteUrl: \"https://openai.com/chatgpt/pricing\",\n category: \"third_party\",\n baseUrl: \"https://chatgpt.com/backend-api/codex\",\n mode: \"proxy\",\n apiFormat: \"openai_responses\",\n providerType: \"codex_oauth\",\n requiresOAuth: true,\n modelRoutes: brandedRoutes(\"gpt-5.6-terra\", \"gpt-5.6-sol\", \"gpt-5.6-luna\"),\n icon: \"openai\",\n iconColor: \"#000000\",\n },\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n category: \"cn_official\",\n baseUrl: \"https://api.deepseek.com/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"deepseek-v4-pro\",\n \"deepseek-v4-pro\",\n \"deepseek-v4-flash\",\n ),\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n },\n {\n name: \"OpenCode Go\",\n websiteUrl: \"https://opencode.ai\",\n category: \"third_party\",\n baseUrl: \"https://opencode.ai/zen/go\",\n mode: \"proxy\",\n apiFormat: \"openai_chat\",\n modelRoutes: brandedRoutes(\n \"deepseek-v4-flash\",\n \"deepseek-v4-flash\",\n \"deepseek-v4-flash\",\n ),\n endpointCandidates: [\"https://opencode.ai/zen/go\"],\n icon: \"opencode\",\n iconColor: \"#211E1E\",\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n category: \"cn_official\",\n baseUrl: \"https://open.bigmodel.cn/api/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"glm-5.1\", \"glm-5.1\", \"glm-5.1\"),\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n category: \"cn_official\",\n baseUrl: \"https://api.z.ai/api/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"glm-5.1\", \"glm-5.1\", \"glm-5.1\"),\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n },\n {\n name: \"Baidu Qianfan Coding Plan\",\n websiteUrl: \"https://cloud.baidu.com/product/qianfan_modelbuilder\",\n apiKeyUrl:\n \"https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application\",\n category: \"cn_official\",\n baseUrl: \"https://qianfan.baidubce.com/anthropic/coding\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"qianfan-code-latest\",\n \"qianfan-code-latest\",\n \"qianfan-code-latest\",\n ),\n endpointCandidates: [\"https://qianfan.baidubce.com/anthropic/coding\"],\n icon: \"baidu\",\n iconColor: \"#2932E1\",\n },\n {\n name: \"Bailian\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n category: \"cn_official\",\n baseUrl: \"https://dashscope.aliyuncs.com/apps/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n icon: \"bailian\",\n iconColor: \"#624AFF\",\n },\n {\n name: \"Bailian For Coding\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n category: \"cn_official\",\n baseUrl: \"https://coding.dashscope.aliyuncs.com/apps/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n icon: \"bailian\",\n iconColor: \"#624AFF\",\n },\n {\n name: \"Kimi\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n category: \"cn_official\",\n baseUrl: \"https://api.moonshot.cn/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"kimi-k2.6\", \"kimi-k2.6\", \"kimi-k2.6\"),\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n category: \"cn_official\",\n baseUrl: \"https://api.kimi.com/coding/\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n category: \"cn_official\",\n baseUrl: \"https://api.stepfun.com/step_plan\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"step-3.5-flash-2603\",\n \"step-3.5-flash-2603\",\n \"step-3.5-flash-2603\",\n ),\n endpointCandidates: [\"https://api.stepfun.com/step_plan\"],\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n category: \"cn_official\",\n baseUrl: \"https://api.stepfun.ai/step_plan\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"step-3.5-flash-2603\",\n \"step-3.5-flash-2603\",\n \"step-3.5-flash-2603\",\n ),\n endpointCandidates: [\"https://api.stepfun.ai/step_plan\"],\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n category: \"aggregator\",\n baseUrl: \"https://api-inference.modelscope.cn\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"ZhipuAI/GLM-5.1\",\n \"ZhipuAI/GLM-5.1\",\n \"ZhipuAI/GLM-5.1\",\n ),\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n category: \"cn_official\",\n baseUrl: \"https://api.longcat.chat/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"LongCat-Flash-Chat\",\n \"LongCat-Flash-Chat\",\n \"LongCat-Flash-Chat\",\n ),\n icon: \"longcat\",\n iconColor: \"#29E154\",\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n category: \"cn_official\",\n baseUrl: \"https://api.minimaxi.com/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"MiniMax-M2.7\", \"MiniMax-M2.7\", \"MiniMax-M2.7\"),\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n category: \"cn_official\",\n baseUrl: \"https://api.minimax.io/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"MiniMax-M2.7\", \"MiniMax-M2.7\", \"MiniMax-M2.7\"),\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n category: \"cn_official\",\n baseUrl: \"https://api.tbox.cn/api/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\"Ling-2.5-1T\", \"Ling-2.5-1T\", \"Ling-2.5-1T\"),\n },\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n category: \"aggregator\",\n baseUrl: \"https://aihubmix.com\",\n apiKeyField: \"ANTHROPIC_API_KEY\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://aihubmix.com\", \"https://api.aihubmix.com\"],\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n category: \"aggregator\",\n baseUrl: \"https://open.cherryin.net\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: mappedRoutes(\n \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4.8\",\n \"anthropic/claude-haiku-4.5\",\n ),\n endpointCandidates: [\"https://open.cherryin.net\"],\n icon: \"cherryin\",\n },\n {\n name: \"SiliconFlow\",\n websiteUrl: \"https://siliconflow.cn\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n category: \"aggregator\",\n baseUrl: \"https://api.siliconflow.cn\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"Pro/MiniMaxAI/MiniMax-M2.7\",\n \"Pro/MiniMaxAI/MiniMax-M2.7\",\n \"Pro/MiniMaxAI/MiniMax-M2.7\",\n ),\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#6E29F6\",\n },\n {\n name: \"SiliconFlow en\",\n websiteUrl: \"https://siliconflow.com\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n category: \"aggregator\",\n baseUrl: \"https://api.siliconflow.com\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"MiniMaxAI/MiniMax-M2.7\",\n \"MiniMaxAI/MiniMax-M2.7\",\n \"MiniMaxAI/MiniMax-M2.7\",\n ),\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#000000\",\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n category: \"aggregator\",\n baseUrl: \"https://www.dmxapi.cn\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://www.dmxapi.cn\", \"https://api.dmxapi.cn\"],\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n },\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://www.packyapi.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\n \"https://www.packyapi.com\",\n \"https://api-slb.packyapi.com\",\n ],\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://api.apikey.fun\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://api.apikey.fun\", \"https://slb.apikey.fun\"],\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n category: \"third_party\",\n baseUrl: \"https://apinebula.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://apinebula.com\"],\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n category: \"aggregator\",\n baseUrl: \"https://api.atlascloud.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://api.atlascloud.ai\"],\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n category: \"third_party\",\n baseUrl: \"https://sudocode.us\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://sudocode.us\", \"https://sudocode.run\"],\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n },\n {\n name: \"ClaudeAPI\",\n websiteUrl: \"https://claudeapi.com\",\n apiKeyUrl: \"https://console.claudeapi.com/register?aff=pCLD\",\n category: \"aggregator\",\n baseUrl: \"https://gw.claudeapi.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"claudeapi\",\n icon: \"claudeapi\",\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://claudecn.top\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n category: \"aggregator\",\n baseUrl: \"https://runapi.co\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n },\n {\n name: \"RelaxyCode\",\n websiteUrl: \"https://www.relaxycode.com\",\n apiKeyUrl: \"https://www.relaxycode.com/register\",\n category: \"third_party\",\n baseUrl: \"https://www.relaxycode.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n icon: \"relaxcode\",\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n category: \"third_party\",\n baseUrl: \"https://api.cubence.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\n \"https://api.cubence.com\",\n \"https://api-cf.cubence.com\",\n \"https://api-dmit.cubence.com\",\n \"https://api-bwg.cubence.com\",\n ],\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://api.aigocode.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://api.aigocode.com\"],\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://www.right.codes/claude\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n category: \"third_party\",\n baseUrl: \"https://api.aicodemirror.com/api/claudecode\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\n \"https://api.aicodemirror.com/api/claudecode\",\n \"https://api.claudecode.net.cn/api/claudecode\",\n ],\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n category: \"third_party\",\n baseUrl: \"https://cn.crazyrouter.com\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://cn.crazyrouter.com\"],\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n category: \"third_party\",\n baseUrl: \"https://node-hk.sssaicodeapi.com/api\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\n \"https://node-hk.sssaicodeapi.com/api\",\n \"https://node-hk.sssaiapi.com/api\",\n \"https://node-cf.sssaicodeapi.com/api\",\n ],\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n },\n {\n name: \"Compshare\",\n nameKey: \"providerForm.presets.ucloud\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n category: \"aggregator\",\n baseUrl: \"https://api.modelverse.cn\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://api.modelverse.cn\"],\n isPartner: true,\n partnerPromotionKey: \"ucloud\",\n icon: \"ucloud\",\n iconColor: \"#000000\",\n },\n {\n name: \"Compshare Coding Plan\",\n nameKey: \"providerForm.presets.ucloudCoding\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n category: \"aggregator\",\n baseUrl: \"https://cp.compshare.cn\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://cp.compshare.cn\"],\n isPartner: true,\n partnerPromotionKey: \"ucloud\",\n icon: \"ucloud\",\n iconColor: \"#000000\",\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n category: \"third_party\",\n baseUrl: \"https://www.micuapi.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://www.micuapi.ai\"],\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n category: \"third_party\",\n baseUrl: \"https://api.ctok.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n category: \"third_party\",\n baseUrl: \"https://e-flowcode.cc\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n endpointCandidates: [\"https://e-flowcode.cc\"],\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n category: \"aggregator\",\n baseUrl: \"https://openrouter.ai/api\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: mappedRoutes(\n \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4.8\",\n \"anthropic/claude-haiku-4.5\",\n true,\n ),\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n category: \"aggregator\",\n baseUrl: \"https://api.therouter.ai\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: mappedRoutes(\n \"anthropic/claude-sonnet-4.6\",\n \"anthropic/claude-opus-4.8\",\n \"anthropic/claude-haiku-4.5\",\n true,\n ),\n endpointCandidates: [\"https://api.therouter.ai\"],\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n category: \"aggregator\",\n baseUrl: \"https://api.novita.ai/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"zai-org/glm-5.1\",\n \"zai-org/glm-5.1\",\n \"zai-org/glm-5.1\",\n ),\n endpointCandidates: [\"https://api.novita.ai/anthropic\"],\n icon: \"novita\",\n iconColor: \"#000000\",\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n category: \"third_party\",\n baseUrl: \"https://api.lemondata.cc\",\n apiKeyField: \"ANTHROPIC_API_KEY\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n category: \"aggregator\",\n baseUrl: \"https://integrate.api.nvidia.com\",\n mode: \"proxy\",\n apiFormat: \"openai_chat\",\n modelRoutes: brandedRoutes(\n \"moonshotai/kimi-k2.5\",\n \"moonshotai/kimi-k2.5\",\n \"moonshotai/kimi-k2.5\",\n ),\n icon: \"nvidia\",\n iconColor: \"#000000\",\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n category: \"aggregator\",\n baseUrl: \"https://cc-api.pipellm.ai\",\n mode: \"direct\",\n apiFormat: \"anthropic\",\n modelRoutes: passthroughRoutes(),\n icon: \"pipellm\",\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n category: \"cn_official\",\n baseUrl: \"https://api.xiaomimimo.com/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"mimo-v2.5-pro\",\n \"mimo-v2.5-pro\",\n \"mimo-v2.5-pro\",\n ),\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n category: \"cn_official\",\n baseUrl: \"https://token-plan-cn.xiaomimimo.com/anthropic\",\n mode: \"proxy\",\n apiFormat: \"anthropic\",\n modelRoutes: brandedRoutes(\n \"mimo-v2.5-pro\",\n \"mimo-v2.5-pro\",\n \"mimo-v2.5-pro\",\n ),\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n },\n];\n"}}, "src/i18n/locales/zh.json": {"7f658de920ce256b279a9888f7d34df16218d8f9": {"t": 1785674685.802167, "n": 156278, "h": "0ec9abd24c7dc54b", "c": "{\n \"projectWiki\": {\n \"title\": \"项目 Wiki / 知识基线\",\n \"subtitle\": \"可被人类与 Agent 共同消费的工程知识基线\",\n \"loading\": \"正在扫描 Wiki…\",\n \"notInitialized\": \"未检测到 wiki/index.md\",\n \"pageCount\": \"{{count}} 个页面\",\n \"sourceRefs\": \"{{count}} 个源码引用\",\n \"questions\": \"{{count}} 个待查\",\n \"lastUpdated\": \"最近更新\",\n \"status\": {\n \"missing\": \"未初始化\",\n \"scaffolded\": \"已初始化\",\n \"effective\": \"新鲜\",\n \"drifted\": \"已变更\",\n \"invalid\": \"Lint 失败\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · 快速入门\",\n \"L2\": \"L2 · 接口对接\",\n \"L3\": \"L3 · 运维排障\"\n },\n \"coverage\": {\n \"corePages\": \"核心页面\",\n \"componentPages\": \"组件\",\n \"flowPages\": \"流程\",\n \"apiPages\": \"接口\",\n \"runbookPages\": \"运维手册\"\n },\n \"actions\": {\n \"init\": \"初始化 Wiki\",\n \"lint\": \"运行 Lint 校验\",\n \"refresh\": \"刷新\",\n \"openInEditor\": \"在编辑器中打开\",\n \"previewInit\": \"预览初始化\",\n \"toggleQuality\": \"切换 quality 模式\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 刚初始化,变更映射尚未生效\",\n \"coldStartProgress\": \"当前有效 source_files 页面:{{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"请点击“生成项目 Wiki”,使用设置中的 AI 提供方生成并验收\",\n \"affectedPages\": \"{{count}} 个源码变更,影响 {{pages}} 个 wiki 页面\",\n \"unmapped\": \"{{count}} 个未映射变更\",\n \"noChanges\": \"无源码变更,wiki 页面均为最新\"\n },\n \"lint\": {\n \"passed\": \"Lint 通过\",\n \"failed\": \"Lint 失败:{{errors}} 个错误\",\n \"warnings\": \"{{count}} 个警告\",\n \"qualityLevel\": \"质量等级:{{level}}\",\n \"errors\": \"错误\",\n \"more\": \"还有 {{count}} 条\",\n \"noFiles\": \"无 Wiki 文件可检查\",\n \"summary\": \"{{files}} 文件 / {{errors}} 错误 / {{warnings}} 警告 / 等级 {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初始化预检\",\n \"willCreate\": \"将创建 {{count}} 个文件\",\n \"alreadyExists\": \"{{count}} 个文件已存在(将跳过)\",\n \"confirm\": \"确认初始化\",\n \"success\": \"Wiki 初始化完成,已创建 {{count}} 个文件\",\n \"blocked\": \"安全审计阻断\"\n },\n \"changed\": {\n \"affectedPages\": \"影响页面\",\n \"changedFiles\": \"变更\",\n \"coldStart\": \"冷启动态\",\n \"title\": \"变更映射\",\n \"unmapped\": \"未映射\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code / Codex / Gemini CLI 全方位辅助工具\"\n },\n \"common\": {\n \"add\": \"添加\",\n \"edit\": \"编辑\",\n \"delete\": \"删除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"取消\",\n \"confirm\": \"确定\",\n \"close\": \"关闭\",\n \"done\": \"完成\",\n \"settings\": \"设置\",\n \"about\": \"关于\",\n \"version\": \"版本\",\n \"loading\": \"加载中...\",\n \"notInstalled\": \"未安装\",\n \"success\": \"成功\",\n \"error\": \"错误\",\n \"unknown\": \"未知\",\n \"enterValidValue\": \"请输入有效的内容\",\n \"clear\": \"清除\",\n \"toggleTheme\": \"切换主题\",\n \"format\": \"格式化\",\n \"formatSuccess\": \"格式化成功\",\n \"formatError\": \"格式化失败:{{error}}\",\n \"copy\": \"复制\",\n \"view\": \"查看\",\n \"back\": \"返回\",\n \"refresh\": \"刷新\",\n \"refreshing\": \"刷新中...\",\n \"import\": \"导入\",\n \"all\": \"全部\",\n \"search\": \"查询\",\n \"reset\": \"重置\",\n \"actions\": \"操作\",\n \"deleting\": \"删除中...\",\n \"auto\": \"自动\",\n \"enabled\": \"已开启\",\n \"notSet\": \"未设置\",\n \"darkMode\": \"切换深色模式\",\n \"lightMode\": \"切换浅色模式\",\n \"next\": \"下一步\",\n \"optional\": \"可选\",\n \"previous\": \"上一页\",\n \"retry\": \"重试\",\n \"unknownError\": \"未知错误\"\n },\n \"firstRunNotice\": {\n \"title\": \"欢迎使用 OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar 可以帮你在 Claude Code / Codex / Gemini CLI 的多个供应商之间一键切换。如果你之前已经配置过这些工具,OpenSunstar 会自动把现有设置保存为名为 “default” 的供应商,保证你的配置不会丢失。\",\n \"bodyOfficial\": \"列表里还预置了 “官方(Official)” 供应商,随时点一下即可切回官方默认配置。切换前 OpenSunstar 会自动把当前配置备份回 default,可以放心来回切。OpenSunstar 就是这样工作的 😊\",\n \"confirm\": \"我知道了\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"请输入API Key\",\n \"show\": \"显示API Key\",\n \"hide\": \"隐藏API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"配置必须是JSON对象,不能是数组或其他类型\",\n \"invalidJson\": \"JSON格式错误\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"什么是通用配置片段?\",\n \"guidePurpose\": \"用来在不同供应商之间共享插件、环境变量等非敏感配置。切换供应商时不会丢失这些设置。\",\n \"guideUsage\": \"用法:① 点击「从编辑内容提取」保存通用部分 ② 新建供应商时勾选「写入通用配置」\",\n \"guideReExtract\": \"如果您新安装了插件或 Hook,请重新提取一次通用配置,以便同步到其他供应商。\",\n \"guideReassurance\": \"放心:您的原始配置已保存在默认供应商中,不会丢失。\",\n \"emptyTitle\": \"还没有通用配置片段\",\n \"emptyHint\": \"点击下方「从编辑内容提取」按钮,从当前配置中提取可复用的部分\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code 配置 (JSON) *\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑通用配置片段\",\n \"commonConfigHint\": \"该片段会在勾选\\\"写入通用配置\\\"时合并到 settings.json 中\",\n \"fullSettingsHint\": \"完整的 Claude Code settings.json 配置内容\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"hideAttribution\": \"隐藏 AI 署名\",\n \"enableTeammates\": \"Teammates 模式\",\n \"enableToolSearch\": \"启用 Tool Search\",\n \"effortMax\": \"最大强度思考\",\n \"disableAutoUpgrade\": \"禁用自动升级\"\n },\n \"header\": {\n \"viewOnGithub\": \"在 GitHub 上查看\",\n \"toggleDarkMode\": \"切换到暗色模式\",\n \"toggleLightMode\": \"切换到亮色模式\",\n \"addProvider\": \"添加供应商\",\n \"switchToChinese\": \"切换到中文\",\n \"switchToEnglish\": \"切换到英文\",\n \"enterEditMode\": \"进入编辑模式\",\n \"exitEditMode\": \"退出编辑模式\",\n \"windowMinimize\": \"最小化窗口\",\n \"windowMaximize\": \"最大化窗口\",\n \"windowRestore\": \"还原窗口\",\n \"windowClose\": \"关闭窗口\"\n },\n \"provider\": {\n \"tabProvider\": \"供应商\",\n \"tabUniversal\": \"统一供应商\",\n \"noProviders\": \"还没有添加任何供应商\",\n \"noProvidersDescription\": \"如果你已有配置,请点击\\\"导入当前配置\\\",所有数据将安全保存在 default 供应商中\",\n \"noProvidersDescriptionSnippet\": \"除 Key 和请求地址外的数据(如插件配置)会被保存到通用配置片段,用于在不同供应商之间共享\",\n \"importCurrent\": \"导入当前配置\",\n \"importFromClaude\": \"将 Claude Code 中已有的供应商导入\",\n \"importCurrentDescription\": \"将当前正在使用的配置导入为默认供应商\",\n \"currentlyUsing\": \"当前使用\",\n \"enable\": \"启用\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"代理接管模式下不可切换到官方供应商\",\n \"editProvider\": \"编辑供应商\",\n \"editProviderHint\": \"更新配置后将立即应用到当前供应商。\",\n \"deleteProvider\": \"删除供应商\",\n \"addNewProvider\": \"添加新供应商\",\n \"addClaudeProvider\": \"添加 Claude Code 供应商\",\n \"addCodexProvider\": \"添加 Codex 供应商\",\n \"addGeminiProvider\": \"添加 Gemini 供应商\",\n \"addOpenCodeProvider\": \"添加 OpenCode 供应商\",\n \"addToConfig\": \"添加\",\n \"removeFromConfig\": \"移除\",\n \"setAsDefault\": \"设为默认\",\n \"isDefault\": \"当前默认\",\n \"inConfig\": \"已添加\",\n \"addProviderHint\": \"填写信息后即可在列表中快速切换供应商。\",\n \"editClaudeProvider\": \"编辑 Claude Code 供应商\",\n \"editCodexProvider\": \"编辑 Codex 供应商\",\n \"configError\": \"配置错误\",\n \"notConfigured\": \"未配置官网地址\",\n \"applyToClaudePlugin\": \"应用到 Claude 插件\",\n \"removeFromClaudePlugin\": \"从 Claude 插件移除\",\n \"dragToReorder\": \"拖拽以重新排序\",\n \"dragHandle\": \"拖拽排序\",\n \"searchPlaceholder\": \"按名称/备注/网址搜索供应商...\",\n \"searchAriaLabel\": \"搜索供应商\",\n \"searchScopeHint\": \"根据名称、备注和官网链接匹配结果。\",\n \"searchCloseHint\": \"按 Esc 关闭\",\n \"searchCloseAriaLabel\": \"关闭供应商搜索\",\n \"noSearchResults\": \"没有符合搜索条件的供应商。\",\n \"duplicate\": \"复制\",\n \"sortUpdateFailed\": \"排序更新失败\",\n \"configureUsage\": \"配置用量查询\",\n \"officialPartner\": \"官方合作伙伴\",\n \"managedByHermes\": \"Hermes 托管\",\n \"managedByHermesHint\": \"该条目定义在 Hermes 的 providers: dict,请在 Hermes Web UI 中编辑或删除。\",\n \"openTerminal\": \"打开终端\",\n \"terminalOpened\": \"终端已打开\",\n \"terminalOpenFailed\": \"打开终端失败\",\n \"name\": \"供应商名称\",\n \"namePlaceholder\": \"例如:Claude 官方\",\n \"websiteUrl\": \"官网链接\",\n \"notes\": \"备注\",\n \"notesPlaceholder\": \"例如:公司专用账号\",\n \"configJson\": \"配置 JSON\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfigButton\": \"编辑通用配置\",\n \"configJsonHint\": \"请填写完整的 Claude Code 配置\",\n \"editCommonConfigTitle\": \"编辑通用配置片段\",\n \"editCommonConfigHint\": \"通用配置片段将合并到所有启用它的供应商配置中\",\n \"addProvider\": \"添加供应商\",\n \"sortUpdated\": \"排序已更新\",\n \"usageSaved\": \"用量查询配置已保存\",\n \"usageSaveFailed\": \"用量查询配置保存失败\",\n \"geminiConfig\": \"Gemini 配置\",\n \"geminiConfigHint\": \"使用 .env 格式配置 Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"模型\",\n \"oauthTitle\": \"OAuth 认证模式\",\n \"oauthHint\": \"Google 官方使用 OAuth 个人认证,无需填写 API Key。首次使用时会自动打开浏览器进行登录。\",\n \"apiKeyPlaceholder\": \"请输入 Gemini API Key\"\n }\n },\n \"activeProviderHint\": \"当前请求将使用此供应商\",\n \"activeRouteHint\": \"当前请求正通过本地路由使用此供应商\",\n \"copyName\": \"{{name}} 副本\",\n \"refreshing\": \"正在刷新供应商列表…\",\n \"routed\": \"路由中\"\n },\n \"claudeCode\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支持路由\"\n },\n \"codex\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支持路由\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop 官方供应商使用应用内置的 1P 登录,无需配置 API Key 和接口地址。\",\n \"mode\": \"模型处理方式\",\n \"modeDirect\": \"直连\",\n \"modeProxy\": \"需要路由\",\n \"modelMappingToggle\": \"需要模型映射\",\n \"modelMappingOffHint\": \"仅当供应商直接接受 Claude Desktop 可识别的三档角色 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)时才适用直连;其他模型名(含 claude-3-5-sonnet-… 等旧式 ID)请打开此开关走映射。\",\n \"modelMappingOnHint\": \"Claude Desktop 只接受 claude-sonnet-* / claude-opus-* / claude-haiku-* 三档角色 ID。开启后 OpenSunstar 会把这三档映射到供应商的实际模型,并在使用期间保持本地路由开启。\",\n \"routeMapTitle\": \"模型映射\",\n \"routeMapHint\": \"为 Sonnet、Opus、Haiku 三档分别填写实际请求模型;菜单显示名可写 DeepSeek、Kimi 等品牌名。留空的档会自动沿用 Sonnet(或第一个已填档)的模型,确保子 agent 调用的 Haiku 始终可用。\",\n \"routeModelLabel\": \"模型角色\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"菜单显示名\",\n \"upstreamModelLabel\": \"实际请求模型\",\n \"supports1mLabel\": \"声明支持 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"手动指定 Claude Desktop 模型列表(高级,可选)\",\n \"directModelListCollapsedHint\": \"原生 Claude 模型供应商通常不用填写,Claude Desktop 会自动读取 /v1/models。\",\n \"directModelListHint\": \"仅当供应商的 /v1/models 不可用或没有返回 Claude Desktop 可识别的 Sonnet / Opus / Haiku 模型名时填写;勾选 1M 会向 Claude Desktop 声明支持 1M 上下文。\",\n \"directModelInvalid\": \"直连模型必须使用 Claude Desktop 可识别的 Sonnet / Opus / Haiku 模型名\",\n \"addModel\": \"添加模型\",\n \"addRoute\": \"添加模型\",\n \"routeInvalid\": \"请选择模型角色并填写实际请求模型\",\n \"routesRequired\": \"至少填写一个模型映射\",\n \"statusTitle\": \"Claude Desktop 配置需要检查\",\n \"statusUnsupported\": \"当前平台暂不支持 Claude Desktop 3P 配置写入。\",\n \"statusStaleRawModels\": \"Claude Desktop profile 中存在非 Sonnet / Opus / Haiku 角色模型名,新版 Claude Desktop 可能拒绝加载;重新切换当前供应商可修复。\",\n \"statusMissingRouteMappings\": \"当前供应商启用了模型映射,但没有有效路由;请编辑供应商并补全至少一个模型映射。\",\n \"statusGatewayTokenMissing\": \"当前本地路由 token 尚未生成;重新切换该供应商会写入新的本地 token。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile 指向的地址与当前供应商不一致;当前为 {{actual}},应为 {{expected}}。重新切换当前供应商可修复。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop 本地路由已开启 - {{address}}:{{port}}\",\n \"inactive\": \"开启 Claude Desktop 本地路由,用于需要模型映射或格式转换的供应商。当前配置地址:{{address}}:{{port}}\"\n },\n \"stopBlockedByTakeover\": \"其它应用正在使用代理接管。请先在设置中关闭对应应用接管,再停止本地路由。\"\n }\n },\n \"notifications\": {\n \"providerAdded\": \"供应商已添加\",\n \"providerSaved\": \"供应商配置已保存\",\n \"providerDeleted\": \"供应商删除成功\",\n \"switchSuccess\": \"切换成功!\",\n \"codexRestartRequired\": \"切换成功,请重启客户端以生效\",\n \"claudeDesktopRestartRequired\": \"切换成功,重启 Claude Desktop 后生效\",\n \"claudeDesktopProxyRestartRequired\": \"切换成功,请保持 OpenSunstar 运行,并重启 Claude Desktop 后生效\",\n \"addToConfigSuccess\": \"已添加到配置\",\n \"removeFromConfigSuccess\": \"已从配置移除\",\n \"switchFailedTitle\": \"切换失败\",\n \"switchFailed\": \"切换失败:{{error}}\",\n \"autoImported\": \"已从现有配置创建默认供应商\",\n \"addFailed\": \"添加供应商失败:{{error}}\",\n \"saveFailed\": \"保存失败:{{error}}\",\n \"saveFailedGeneric\": \"保存失败,请重试\",\n \"appliedToClaudePlugin\": \"已应用到 Claude 插件\",\n \"removedFromClaudePlugin\": \"已从 Claude 插件移除\",\n \"syncClaudePluginFailed\": \"同步 Claude 插件失败\",\n \"skipClaudeOnboardingFailed\": \"跳过 Claude Code 初次安装确认失败\",\n \"clearClaudeOnboardingSkipFailed\": \"恢复 Claude Code 初次安装确认失败\",\n \"updateSuccess\": \"供应商更新成功\",\n \"updateFailed\": \"更新供应商失败:{{error}}\",\n \"deleteSuccess\": \"供应商已删除\",\n \"deleteFailed\": \"删除供应商失败:{{error}}\",\n \"settingsSaved\": \"设置已保存\",\n \"settingsSaveFailed\": \"保存设置失败:{{error}}\",\n \"proxyRequiredForSwitch\": \"此供应商{{reason}},需要路由服务才能正常使用,请先启动路由\",\n \"proxyReasonCopilot\": \"使用 GitHub Copilot 作为 Claude 供应商\",\n \"proxyReasonOpenAIChat\": \"使用 OpenAI Chat 接口格式\",\n \"proxyReasonOpenAIResponses\": \"使用 OpenAI Responses 接口格式\",\n \"proxyReasonFullUrl\": \"开启了完整 URL 连接模式\",\n \"openAIFormatHint\": \"此供应商使用 OpenAI 兼容格式,需要开启路由服务才能正常使用\",\n \"copilotProxyHint\": \"GitHub Copilot 作为 Claude 供应商时始终需要本地路由;路由会根据当前模型自动选择 Chat Completions 或 Responses。\",\n \"openLinkFailed\": \"链接打开失败\",\n \"openclawModelsRegistered\": \"模型已注册到 /model 列表\",\n \"openclawDefaultModelSet\": \"已设为默认模型\",\n \"openclawDefaultModelSetFailed\": \"设置默认模型失败\",\n \"openclawNoModels\": \"该供应商没有配置模型\",\n \"backfillWarning\": \"切换成功,但旧供应商配置回填失败,您手动修改的配置可能未保存\",\n \"windowControlFailed\": \"窗口控制失败:{{error}}\",\n \"officialBlockedByProxy\": \"本地路由模式下不能切换到官方供应商,使用路由访问官方 API 可能导致账号被封禁\",\n \"proxyOfficialWarning\": \"当前供应商 {{name}} 是官方供应商,建议切换到第三方供应商后再使用本地路由\",\n \"proxyReasonClaudeDesktop\": \"使用 Claude Desktop 本地路由模式\"\n },\n \"confirm\": {\n \"deleteProvider\": \"删除供应商\",\n \"deleteProviderMessage\": \"确定要删除供应商 \\\"{{name}}\\\" 吗?此操作无法撤销。\",\n \"removeProvider\": \"移除供应商\",\n \"removeProviderMessage\": \"确定要从配置中移除供应商 \\\"{{name}}\\\" 吗?\\n\\n移除后该供应商将不再生效,但配置数据会保留在 OpenSunstar 中,您可以随时重新添加。\",\n \"proxy\": {\n \"title\": \"启用本地路由服务\",\n \"message\": \"本地路由是一项高级功能,启用前请确保您已了解其工作原理。\\n\\n建议先查阅相关文档或咨询您的供应商,以获取正确的配置方式。\",\n \"confirm\": \"我已了解,继续启用\"\n },\n \"failover\": {\n \"title\": \"启用故障转移功能\",\n \"message\": \"故障转移是一项高级功能,启用前请确保您已了解其工作原理。\\n\\n建议先在故障转移队列中配置好供应商优先级。\",\n \"confirm\": \"我已了解,继续启用\"\n },\n \"usage\": {\n \"title\": \"配置用量查询\",\n \"message\": \"用量查询需要配置专用的查询脚本或 API 参数,请确保您已从供应商处获取相关信息。\\n\\n如不确定如何配置,请先查阅供应商文档。\",\n \"confirm\": \"我已了解,继续配置\"\n },\n \"streamCheck\": {\n \"title\": \"模型健康检测\",\n \"message\": \"健康检测通过直接发送 API 请求来测试供应商连通性,以下情况可能导致检测失败:\\n\\n• 官方供应商(使用 OAuth 登录,无独立 API Key)\\n• 部分中转服务(会校验请求是否来自 Claude Code CLI)\\n• AWS Bedrock(使用 IAM 签名认证)\\n\\n检测失败不代表供应商不可用,仅表示无法通过独立请求验证。请以应用内的实际情况为准。\",\n \"confirm\": \"我已了解,继续检测\"\n },\n \"autoSync\": {\n \"title\": \"开启自动同步\",\n \"message\": \"开启自动同步后,每次数据库变更都会自动上传到 WebDAV 服务器。\\n\\n这可能会产生较高的网络流量消耗,请确保您的网络环境和 WebDAV 服务支持频繁的数据传输。\",\n \"confirm\": \"我已了解,继续开启\"\n },\n \"commonConfig\": {\n \"title\": \"关于通用配置\",\n \"message\": \"「通用配置片段」可以在不同供应商之间共享插件、环境变量等配置,避免切换供应商时丢失这些设置。\\n\\n使用方法:\\n① 编辑供应商时点击「编辑通用配置」→「从编辑内容提取」\\n② 新建供应商时勾选「写入通用配置」(默认已勾选)\\n\\n如果您新安装了插件或 Hook,请重新提取一次通用配置。\",\n \"confirm\": \"我知道了\"\n }\n },\n \"settings\": {\n \"title\": \"设置\",\n \"general\": \"通用\",\n \"tabGeneral\": \"通用\",\n \"tabAuth\": \"认证\",\n \"tabAdvanced\": \"高级\",\n \"tabProxy\": \"路由\",\n \"authCenter\": {\n \"title\": \"认证中心\",\n \"description\": \"把第三方 Key 与官方订阅登录拆成两条认证轨道,帮助你识别每个 CLI 当前依赖的凭据来源。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"本地 CLI 登录状态\",\n \"readonlyProbe\": \"只读探测\",\n \"localCliDescription\": \"区分第三方 Key 与官方订阅登录,只披露本地状态信号,不接管 Claude 或 Google 账号凭据。\",\n \"localCliLoading\": \"正在读取本地 CLI 授权状态…\",\n \"managedAccountsTitle\": \"托管账号\",\n \"managedAccountsDescription\": \"由 OpenSunstar 管理的账号登录,可绑定到对应 Provider 或本地代理链路。\",\n \"copilotDescription\": \"管理 GitHub Copilot 账号\",\n \"codexOauthDescription\": \"管理 ChatGPT 账号\",\n \"defaultAccount\": \"默认\",\n \"localCliProfile\": \"本机 CLI 当前会话\",\n \"managedOauth\": \"OpenSunstar 托管 OAuth\",\n \"noSubscriptionAccount\": \"尚未发现可用订阅账号\",\n \"sourceLocal\": \"本机 CLI 当前会话\",\n \"sourceManaged\": \"托管 OAuth\",\n \"subscriptionAccountsDescription\": \"查看官方订阅的额度、重置时间与健康状态。仅托管的多账号支持默认标记;这里不绑定项目或第三方 API Key。\",\n \"subscriptionAccountsFailed\": \"无法读取订阅账号状态,请刷新后重试。\",\n \"subscriptionAccountsLoading\": \"正在并发读取订阅账号状态…\",\n \"subscriptionAccountsTitle\": \"订阅账号\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"配置文件目录\",\n \"description\": \"管理 Claude、Codex 和 Gemini 的配置存储路径\"\n },\n \"proxy\": {\n \"title\": \"本地路由\",\n \"description\": \"控制路由服务开关、查看状态与端口信息\",\n \"enableFeature\": \"在主页面显示本地路由开关\",\n \"enableFeatureDescription\": \"开启后,主页面顶部将显示路由和故障转移开关\",\n \"enableFailoverToggle\": \"在主页面显示故障转移开关\",\n \"enableFailoverToggleDescription\": \"开启后,主页面顶部将独立显示故障转移开关\",\n \"running\": \"运行中\",\n \"stopped\": \"已停止\"\n },\n \"modelTest\": {\n \"title\": \"模型测试配置\",\n \"description\": \"配置模型测试使用的默认模型和提示词\"\n },\n \"failover\": {\n \"title\": \"自动故障转移\",\n \"description\": \"配置故障转移队列和熔断策略\"\n },\n \"pricing\": {\n \"title\": \"成本定价\",\n \"description\": \"管理各模型 Token 计费规则\"\n },\n \"globalProxy\": {\n \"title\": \"全局出站代理\",\n \"description\": \"配置 OpenSunstar 访问外部 API 时使用的代理\"\n },\n \"data\": {\n \"title\": \"数据管理\",\n \"description\": \"导入和导出本地配置数据\"\n },\n \"backup\": {\n \"title\": \"备份与恢复\",\n \"description\": \"管理自动备份,查看和恢复数据库快照\"\n },\n \"cloudSync\": {\n \"title\": \"云同步\",\n \"description\": \"通过 WebDAV、S3 或 GitHub Gist 在多设备间同步数据\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"自动修复 API 请求中的兼容性问题\",\n \"enabled\": \"启用整流器\",\n \"enabledDescription\": \"总开关,关闭后所有整流功能将被禁用\",\n \"requestGroup\": \"请求整流\",\n \"responseGroup\": \"响应整流\",\n \"thinkingSignature\": \"Thinking 签名整流\",\n \"thinkingSignatureDescription\": \"当 Anthropic 类型供应商返回 thinking 签名不兼容或非法请求等错误时,自动移除不兼容的 thinking 相关块并对同一供应商重试一次\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"当 Anthropic 类型供应商返回 budget_tokens 约束错误(如至少 1024)时,自动将 thinking 规范为 enabled 并将 budget 设为 32000,同时在需要时将 max_tokens 设为 64000,然后重试一次\",\n \"mediaFallback\": \"不支持图片降级\",\n \"mediaFallbackDescription\": \"当供应商不支持图片输入时(已声明纯文本能力,或上游返回不支持图片的错误),自动将图片块替换为 [Unsupported Image] 标记,使对话不中断\",\n \"mediaHeuristic\": \"启发式纯文本模型识别\",\n \"mediaHeuristicDescription\": \"发送前按内置模型名列表预测性剥离图片。关闭后仅保留「已声明纯文本」与「上游报错兜底」两条事实驱动路径,避免内置列表把多模态模型误判为纯文本而静默丢图\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock 请求优化器\",\n \"description\": \"在请求发送前自动优化 Thinking 和 Cache 配置(仅 Bedrock 供应商生效)\",\n \"enabled\": \"启用优化器\",\n \"thinkingOptimizer\": \"Thinking 优化\",\n \"thinkingOptimizerDescription\": \"自动为 Opus/Sonnet 启用 Adaptive Thinking,为旧模型注入 Extended Thinking\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"自动在请求关键位置注入 Cache 断点,减少重复 token 计费\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分钟\",\n \"cacheTtl1h\": \"1 小时\"\n },\n \"logConfig\": {\n \"title\": \"日志管理\",\n \"description\": \"控制日志输出级别\",\n \"enabled\": \"启用日志\",\n \"enabledDescription\": \"总开关,关闭后所有日志将被禁用\",\n \"level\": \"日志级别\",\n \"levelDescription\": \"设置输出的最低日志级别\",\n \"levels\": {\n \"error\": \"错误\",\n \"warn\": \"警告\",\n \"info\": \"信息\",\n \"debug\": \"调试\",\n \"trace\": \"跟踪\"\n },\n \"levelHint\": \"日志级别说明:\",\n \"levelDesc\": {\n \"error\": \"仅严重错误\",\n \"warn\": \"错误 + 警告信息\",\n \"info\": \"一般操作信息(默认)\",\n \"debug\": \"详细信息,包含 SSE 流和请求/响应详情\",\n \"trace\": \"全部日志,最详细\"\n }\n },\n \"aiProvider\": {\n \"description\": \"配置项目看板的 AI 推理提供方(DeepSeek / GLM / 自定义)\",\n \"title\": \"AI 模型路由\"\n }\n },\n \"language\": \"界面语言\",\n \"languageHint\": \"切换后立即预览界面语言,保存后永久生效。\",\n \"theme\": \"外观主题\",\n \"themeHint\": \"选择应用的外观主题,立即生效。\",\n \"themeLight\": \"浅色\",\n \"themeDark\": \"深色\",\n \"themeSystem\": \"跟随系统\",\n \"importExport\": \"SQL 导入导出\",\n \"importExportHint\": \"导入/导出数据库 SQL 备份(仅支持导入由 OpenSunstar 导出的备份),便于备份或迁移。\",\n \"exportConfig\": \"导出 SQL 备份\",\n \"selectConfigFile\": \"选择 SQL 文件\",\n \"noFileSelected\": \"尚未选择配置文件。\",\n \"import\": \"导入\",\n \"importing\": \"导入中...\",\n \"importSuccess\": \"导入成功!\",\n \"importFailed\": \"导入失败\",\n \"syncLiveFailed\": \"已导入,但同步到当前供应商失败,请手动重新选择一次供应商。\",\n \"importPartialSuccess\": \"配置已导入,但同步到当前供应商失败。\",\n \"importPartialHint\": \"请手动重新选择一次供应商以刷新对应配置。\",\n \"configExported\": \"配置已导出到:\",\n \"exportFailed\": \"导出失败\",\n \"selectFileFailed\": \"请选择有效的 SQL 备份文件\",\n \"configCorrupted\": \"SQL 文件可能已损坏或格式不正确\",\n \"backupId\": \"备份ID\",\n \"backupManager\": {\n \"title\": \"数据库备份\",\n \"description\": \"自动备份的数据库快照,可用于恢复到之前的状态\",\n \"empty\": \"暂无备份\",\n \"restore\": \"恢复\",\n \"restoring\": \"恢复中...\",\n \"confirmTitle\": \"确认恢复备份\",\n \"confirmMessage\": \"恢复到此备份将覆盖当前数据库。恢复前会自动创建安全备份。\",\n \"restoreSuccess\": \"恢复成功!安全备份已创建\",\n \"restoreFailed\": \"恢复失败\",\n \"safetyBackupId\": \"安全备份ID\",\n \"intervalLabel\": \"自动备份间隔\",\n \"retainLabel\": \"备份保留数量\",\n \"intervalDisabled\": \"禁用\",\n \"intervalHours\": \"{{hours}} 小时\",\n \"intervalDays\": \"{{days}} 天\",\n \"rename\": \"重命名\",\n \"renameSuccess\": \"备份重命名成功\",\n \"renameFailed\": \"重命名失败\",\n \"namePlaceholder\": \"输入新名称\",\n \"createBackup\": \"立即备份\",\n \"creating\": \"备份中...\",\n \"createSuccess\": \"备份创建成功\",\n \"createFailed\": \"备份创建失败\",\n \"delete\": \"删除\",\n \"deleting\": \"删除中...\",\n \"deleteSuccess\": \"备份已删除\",\n \"deleteFailed\": \"删除失败\",\n \"deleteConfirmTitle\": \"确认删除备份\",\n \"deleteConfirmMessage\": \"此备份将被永久删除,此操作无法撤消。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV 云同步\",\n \"description\": \"通过 WebDAV 在多设备间同步数据库和技能配置。\",\n \"baseUrl\": \"WebDAV 服务器地址\",\n \"baseUrlPlaceholder\": \"https://dav.jianguoyun.com/dav/\",\n \"username\": \"WebDAV 账户\",\n \"usernamePlaceholder\": \"邮箱账号\",\n \"password\": \"WebDAV 密码\",\n \"passwordPlaceholder\": \"应用密码(坚果云请使用「第三方应用密码」)\",\n \"remoteRoot\": \"远程根目录\",\n \"profile\": \"同步配置名\",\n \"autoSync\": \"自动同步\",\n \"autoSyncHint\": \"开启后每次数据库变更都会自动上传到 WebDAV。\",\n \"test\": \"测试连接\",\n \"testing\": \"测试中...\",\n \"testSuccess\": \"连接成功\",\n \"testFailed\": \"连接失败:{{error}}\",\n \"save\": \"保存配置\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"保存配置失败:{{error}}\",\n \"upload\": \"上传到云端\",\n \"uploading\": \"上传中...\",\n \"uploadSuccess\": \"已上传到 WebDAV\",\n \"uploadFailed\": \"上传失败:{{error}}\",\n \"autoSyncFailedToast\": \"自动同步失败:{{error}}\",\n \"download\": \"从云端下载\",\n \"downloading\": \"下载中...\",\n \"downloadSuccess\": \"已从 WebDAV 下载并恢复\",\n \"downloadFailed\": \"下载失败:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次自动同步失败\",\n \"autoSyncLastErrorHint\": \"请检查网络或 WebDAV 配置,系统会在后续变更时继续自动重试。\",\n \"missingUrl\": \"请填写 WebDAV 服务器地址\",\n \"presets\": {\n \"label\": \"服务商\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"请在坚果云「安全选项」中生成「第三方应用密码」,不要使用登录密码。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"请将 your-server 替换为你的 Nextcloud 服务器地址,USERNAME 替换为你的用户名。\",\n \"synology\": \"群晖 NAS\",\n \"synologyHint\": \"请先在群晖「套件中心」安装并启用 WebDAV Server 套件。\",\n \"custom\": \"自定义\"\n },\n \"remoteRootDefault\": \"默认: OpenSunstar-sync\",\n \"profileDefault\": \"默认: default\",\n \"saveAndTestSuccess\": \"配置已保存,连接正常\",\n \"saveAndTestFailed\": \"配置已保存,但连接测试失败:{{error}}\",\n \"noRemoteData\": \"云端没有找到同步数据\",\n \"incompatibleVersion\": \"远端数据版本不兼容(协议 v{{protocolVersion}},数据库 {{dbCompatVersion}}),当前支持协议 v2 / db-v6\",\n \"unsaved\": \"未保存\",\n \"saved\": \"已保存\",\n \"unsavedChanges\": \"请先保存配置\",\n \"saveBeforeSync\": \"请先保存配置,再使用上传/下载。\",\n \"fetchingRemote\": \"获取远端信息...\",\n \"fetchRemoteFailed\": \"获取远端信息失败,请检查配置和网络后重试。\",\n \"confirmDownload\": {\n \"title\": \"从云端恢复\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"path\": \"远端路径\",\n \"dbCompat\": \"数据库兼容层\",\n \"artifacts\": \"包含内容\",\n \"legacyNotice\": \"检测到旧版云端路径。恢复完成后,下次上传将写入新路径 v2/db-v6。\",\n \"warning\": \"恢复将覆盖本地所有数据和技能配置\",\n \"confirm\": \"确认恢复\"\n },\n \"confirmUpload\": {\n \"title\": \"上传到云端\",\n \"content\": \"将同步以下内容到 WebDAV 服务器:\",\n \"dbItem\": \"数据库(所有 Provider 配置和数据)\",\n \"skillsItem\": \"技能包(所有自定义技能)\",\n \"targetPath\": \"目标路径\",\n \"existingData\": \"云端已有数据\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"path\": \"远端路径\",\n \"dbCompat\": \"数据库兼容层\",\n \"warning\": \"将覆盖云端已有的同步数据\",\n \"legacyNotice\": \"检测到旧版云端路径数据。本次上传将写入新路径 v2/db-v6,不会覆盖旧路径。\",\n \"confirm\": \"确认上传\"\n }\n },\n \"syncType\": {\n \"label\": \"同步方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 兼容存储\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"服务商\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"使用 IAM Access Key,需要 s3:PutObject/GetObject/HeadObject 权限。Region 示例:us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"需要自定义 Endpoint,如 http://minio.local:9000。Region 可设为 us-east-1\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com,Region 设为 auto\",\n \"oss\": \"阿里云 OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com,Region 示例:cn-hangzhou, cn-shanghai\",\n \"cos\": \"腾讯云 COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com,Region 示例:ap-guangzhou, ap-beijing\",\n \"obs\": \"华为云 OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com,Region 示例:cn-north-4, cn-east-3\",\n \"custom\": \"S3 兼容服务(自定义)\",\n \"customHint\": \"任意 S3 兼容服务,需要自定义 Endpoint\"\n },\n \"region\": \"区域 (Region)\",\n \"regionPlaceholder\": \"例如 us-east-1\",\n \"bucket\": \"存储桶 (Bucket)\",\n \"bucketPlaceholder\": \"例如 my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例如 AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"留空则保持现有密钥\",\n \"endpoint\": \"Endpoint(AWS 可留空)\",\n \"endpointHint\": \"多数 S3 兼容服务需要填写\",\n \"endpointPlaceholder\": \"例如 https://s3-compatible.example.com\",\n \"remoteRoot\": \"远程根目录\",\n \"remoteRootDefault\": \"默认: OpenSunstar-sync\",\n \"profile\": \"同步配置名\",\n \"profileDefault\": \"默认: default\",\n \"autoSync\": \"自动同步\",\n \"autoSyncHint\": \"开启后每次数据库变更都会自动上传到 S3。\",\n \"enabled\": \"启用 S3 同步\",\n \"enabledHint\": \"开启后可使用 S3 上传/下载和自动同步。\",\n \"mutualExclusionTitle\": \"切换同步方式\",\n \"mutualExclusionMessage\": \"启用 S3 同步将禁用当前的 WebDAV 同步,是否继续?\",\n \"mutualExclusionMessageReverse\": \"启用 WebDAV 同步将禁用当前的 S3 同步,是否继续?\",\n \"mutualExclusionFailed\": \"切换同步方式失败:{{error}}\",\n \"testConnection\": \"测试连接\",\n \"connectionOk\": \"S3 连接成功\",\n \"test\": \"测试连接\",\n \"testing\": \"测试中...\",\n \"testSuccess\": \"S3 连接成功\",\n \"testFailed\": \"S3 连接失败:{{error}}\",\n \"save\": \"保存配置\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"保存配置失败:{{error}}\",\n \"saveAndTestSuccess\": \"配置已保存,S3 连接正常\",\n \"saveAndTestFailed\": \"配置已保存,但 S3 连接测试失败:{{error}}\",\n \"upload\": \"上传到云端\",\n \"uploading\": \"上传中...\",\n \"uploadSuccess\": \"已上传到 S3\",\n \"uploadFailed\": \"S3 上传失败:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自动同步失败:{{error}}\",\n \"download\": \"从云端下载\",\n \"downloading\": \"下载中...\",\n \"downloadSuccess\": \"已从 S3 下载并恢复\",\n \"downloadFailed\": \"S3 下载失败:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次 S3 自动同步失败\",\n \"autoSyncLastErrorHint\": \"请检查网络或 S3 配置,系统会在后续变更时继续自动重试。\",\n \"missingBucket\": \"请填写 S3 存储桶\",\n \"noRemoteData\": \"S3 存储桶中没有找到同步数据\",\n \"incompatibleVersion\": \"远端数据版本不兼容(版本 {{version}}),当前支持协议 v2 / db-v6\",\n \"unsaved\": \"未保存\",\n \"saved\": \"已保存\",\n \"unsavedChanges\": \"请先保存配置\",\n \"saveBeforeSync\": \"请先保存配置,再使用上传/下载。\",\n \"fetchingRemote\": \"获取远端信息...\",\n \"fetchRemoteFailed\": \"获取远端信息失败,请检查配置和网络后重试。\",\n \"notConfigured\": \"未配置 S3 同步\",\n \"disabled\": \"S3 同步未启用\",\n \"confirmDownload\": {\n \"title\": \"从 S3 恢复\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"artifacts\": \"包含内容\",\n \"warning\": \"恢复将覆盖本地所有数据和技能配置\",\n \"confirm\": \"确认恢复\"\n },\n \"confirmUpload\": {\n \"title\": \"上传到 S3\",\n \"content\": \"将同步以下内容到 S3 存储桶:\",\n \"dbItem\": \"数据库(所有 Provider 配置和数据)\",\n \"skillsItem\": \"技能包(所有自定义技能)\",\n \"targetPath\": \"目标对象路径\",\n \"existingData\": \"云端已有数据\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"warning\": \"将覆盖该 S3 路径下已有的同步数据\",\n \"confirm\": \"确认上传\"\n }\n },\n \"autoReload\": \"数据已刷新\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"窗口行为\",\n \"windowBehaviorHint\": \"配置窗口最小化与 Claude 插件联动策略。\",\n \"notificationPreferences\": \"通知偏好\",\n \"budgetAlertNotifications\": \"预算超限系统通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency 级别预算告警时发送系统级通知(warning 仍仅在应用内提示)\",\n \"failoverAlertNotifications\": \"故障转移系统通知\",\n \"failoverAlertNotificationsDescription\": \"供应商自动故障转移完成后发送系统级通知\",\n \"trayBadgeNotifications\": \"托盘红点提醒\",\n \"trayBadgeNotificationsDescription\": \"有未读告警时托盘图标切换为告警态并在菜单顶部显示告警条目\",\n \"workspaceAlertFirst\": \"工作区告警首屏\",\n \"workspaceAlertFirstDescription\": \"开启后「今日工作台」首屏展示告警卡片;关闭时告警仅通过托盘/系统通知触达,保持老用户习惯\",\n \"launchOnStartup\": \"开机自启\",\n \"launchOnStartupDescription\": \"随系统启动自动运行 OpenSunstar\",\n \"silentStartup\": \"静默启动\",\n \"silentStartupDescription\": \"程序启动时不显示主窗口,仅在系统托盘运行\",\n \"autoLaunchFailed\": \"设置开机自启失败\",\n \"minimizeToTray\": \"关闭时最小化到托盘\",\n \"minimizeToTrayDescription\": \"勾选后点击关闭按钮会隐藏到系统托盘,取消则直接退出应用。\",\n \"useAppWindowControls\": \"启用应用级窗口按钮\",\n \"useAppWindowControlsDescription\": \"开启后使用应用自建的最小化、最大化/还原、关闭按钮;关闭后沿用系统窗口模式。\",\n \"enableClaudePluginIntegration\": \"应用到 Claude Code 插件\",\n \"enableClaudePluginIntegrationDescription\": \"开启后 VS Code Claude Code 插件的供应商将随本软件切换\",\n \"skipClaudeOnboarding\": \"跳过 Claude Code 初次安装确认\",\n \"skipClaudeOnboardingDescription\": \"开启后跳过 Claude Code 初次安装确认\",\n \"codexAuth\": \"Codex 应用增强\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 官方登录保护\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"始终开启:供应商切换和本地代理不会覆盖或保存 Codex 官方登录凭据\",\n \"appVisibility\": {\n \"title\": \"主页面显示\",\n \"description\": \"选择在主页面显示的应用\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skills 存储位置\",\n \"description\": \"选择 OpenSunstar 存放 Skills 主副本的目录\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"技能存储在 ~/.OpenSunstar/skills/,由 OpenSunstar 统一管理并同步到各应用。\",\n \"unifiedHint\": \"技能存储在 ~/.agents/skills/,遵循 Agent Skills 开放标准。兼容的工具(Claude Code、Codex、Gemini CLI 等)可直接发现此目录中的技能。\",\n \"confirmTitle\": \"迁移技能存储\",\n \"confirmMessage\": \"将移动 {{count}} 个技能到新位置,是否继续?\",\n \"migrationSuccess\": \"已成功迁移 {{count}} 个技能\",\n \"migrationPartial\": \"迁移了 {{migrated}} 个技能,{{errors}} 个失败,请查看日志\"\n },\n \"skillSync\": {\n \"title\": \"Skills 同步方式\",\n \"description\": \"选择 Skills 的文件同步策略\",\n \"symlink\": \"软连接\",\n \"copy\": \"文件复制\",\n \"symlinkHint\": \"软连接节省磁盘空间并支持实时同步。注意:Windows 可能需要管理员权限或开启开发者模式\"\n },\n \"terminal\": {\n \"title\": \"首选终端\",\n \"description\": \"选择点击终端按钮时使用的终端应用\",\n \"fallbackHint\": \"如果选择的终端不可用,将自动使用系统默认终端\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"命令提示符\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"配置目录覆盖(高级)\",\n \"configDirectoryDescription\": \"在 WSL 等环境使用 Claude Code 或 Codex 的时候,可手动指定为 WSL 里的配置目录,供应商数据与主环境保持一致。\",\n \"appConfigDir\": \"OpenSunstar 配置目录\",\n \"appConfigDirDescription\": \"自定义 OpenSunstar 的配置存储位置(指定到云同步文件夹即可云同步配置)\",\n \"browsePlaceholderApp\": \"例如:C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 配置目录\",\n \"claudeConfigDirDescription\": \"覆盖 Claude 配置目录 (settings.json),同时会在同级存放 Claude MCP 的 claude.json。\",\n \"codexConfigDir\": \"Codex 配置目录\",\n \"codexConfigDirDescription\": \"覆盖 Codex 配置目录。\",\n \"geminiConfigDir\": \"Gemini 配置目录\",\n \"geminiConfigDirDescription\": \"覆盖 Gemini 配置目录 (.env)。\",\n \"opencodeConfigDir\": \"OpenCode 配置目录\",\n \"opencodeConfigDirDescription\": \"覆盖 OpenCode 配置目录 (opencode.json)。\",\n \"openclawConfigDir\": \"OpenClaw 配置目录\",\n \"openclawConfigDirDescription\": \"覆盖 OpenClaw 配置目录 (openclaw.json)。\",\n \"hermesConfigDir\": \"Hermes 配置目录\",\n \"hermesConfigDirDescription\": \"覆盖 Hermes 配置目录 (config.yaml)。\",\n \"browsePlaceholderClaude\": \"例如:/home/<你的用户名>/.claude\",\n \"browsePlaceholderCodex\": \"例如:/home/<你的用户名>/.codex\",\n \"browsePlaceholderGemini\": \"例如:/home/<你的用户名>/.gemini\",\n \"browsePlaceholderOpencode\": \"例如:/home/<你的用户名>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例如:/home/<你的用户名>/.openclaw\",\n \"browsePlaceholderHermes\": \"例如:/home/<你的用户名>/.hermes\",\n \"browseDirectory\": \"浏览目录\",\n \"resetDefault\": \"恢复默认目录(需保存后生效)\",\n \"checkForUpdates\": \"检查更新\",\n \"updateTo\": \"更新到 v{{version}}\",\n \"updating\": \"更新中...\",\n \"checking\": \"检查中...\",\n \"upToDate\": \"已是最新\",\n \"aboutHint\": \"查看版本信息与更新状态。\",\n \"portableMode\": \"当前为便携版,更新需手动下载。\",\n \"updateAvailable\": \"检测到新版本:{{version}}\",\n \"updateBadge\": \"有更新可用\",\n \"updateFailed\": \"更新安装失败,已尝试打开下载页面。\",\n \"checkUpdateFailed\": \"检查更新失败,请稍后重试。\",\n \"openReleaseNotesFailed\": \"打开更新日志失败\",\n \"releaseNotes\": \"更新日志\",\n \"viewReleaseNotes\": \"查看该版本更新日志\",\n \"viewCurrentReleaseNotes\": \"查看当前版本更新日志\",\n \"officialWebsite\": \"官方网站\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手动安装命令\",\n \"oneClickInstallHint\": \"安装或升级 Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes\",\n \"localEnvCheck\": \"本地环境检查\",\n \"updateAllTools\": \"全部升级({{count}})\",\n \"currentVersion\": \"当前版本\",\n \"latestVersion\": \"最新版本\",\n \"updateAvailableShort\": \"可升级\",\n \"toolInstall\": \"安装\",\n \"toolUpdate\": \"升级\",\n \"toolReady\": \"已就绪\",\n \"toolActionDone\": \"{{count}} 个工具{{action}}完成\",\n \"toolActionPartial\": \"{{succeeded}} 个{{action}}成功,{{failed}} 个失败\",\n \"toolActionFailed\": \"安装/升级命令执行失败\",\n \"toolNotRunnable\": \"已安装但无法运行(未探测到版本)\",\n \"toolActionVersionUnchangedTitle\": \"版本没有变化\",\n \"toolActionVersionUnchanged\": \"仍是 {{version}}(最新:{{latest}})。上游升级器可能报告成功但没有实际更新。\",\n \"toolActionInstalledNotRunnable\": \"已安装,但当前环境无法运行,请检查\",\n \"installedNotRunnable\": \"已安装·无法运行\",\n \"toolCheckEnv\": \"请检查运行环境\",\n \"toolDiagnose\": \"诊断安装冲突\",\n \"toolDiagnosing\": \"诊断中…\",\n \"toolConflictTitle\": \"检测到多处安装\",\n \"toolConflictHint\": \"命令行实际使用标「默认」的那处;升级可能写到了别处。\",\n \"toolConflictDefault\": \"默认\",\n \"toolConflictNotRunnable\": \"无法运行\",\n \"toolDiagnoseNoConflict\": \"未发现安装冲突\",\n \"toolDiagnoseFailed\": \"诊断失败\",\n \"toolUpgradeConfirmTitle\": \"确认升级位置\",\n \"toolUpgradeConfirmHint\": \"检测到多处安装。本次升级不会全部更新,具体作用的位置以下方各项为准。\",\n \"toolUpgradeWillRun\": \"将执行:\",\n \"toolUpgradeConfirmBtn\": \"确认升级\",\n \"toolUpgradeUnanchoredHint\": \"无法确定命令行实际使用哪处,将执行默认升级命令(可能装到 PATH 上第一个 npm)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"标志\",\n \"installCommandsCopied\": \"安装命令已复制\",\n \"installCommandsCopyFailed\": \"复制失败,请手动复制。\",\n \"importFailedError\": \"导入配置失败:{{message}}\",\n \"exportFailedError\": \"导出配置失败:\",\n \"restartRequired\": \"需要重启应用\",\n \"restartRequiredMessage\": \"修改 OpenSunstar 配置目录后需要重启应用才能生效,是否立即重启?\",\n \"restartNow\": \"立即重启\",\n \"restartLater\": \"稍后重启\",\n \"restartFailed\": \"应用重启失败,请手动关闭后重新打开。\",\n \"devModeRestartHint\": \"开发模式下不支持自动重启,请手动重新启动应用。\",\n \"saving\": \"正在保存...\",\n \"globalProxy\": {\n \"label\": \"全局代理\",\n \"hint\": \"代理所有请求(API、Skills 下载等)。开启本地路由时,应用的请求也会经过此代理。留空表示直连。\",\n \"username\": \"用户名(可选)\",\n \"password\": \"密码(可选)\",\n \"test\": \"测试连接\",\n \"scan\": \"扫描本地代理\",\n \"clear\": \"清除\",\n \"scanFailed\": \"扫描失败:{{error}}\",\n \"saved\": \"代理设置已保存\",\n \"saveFailed\": \"保存失败:{{error}}\",\n \"testSuccess\": \"连接成功!延迟 {{latency}}ms\",\n \"testFailed\": \"连接失败:{{error}}\",\n \"pricingDefaultsTitle\": \"计费默认配置\",\n \"pricingDefaultsDescription\": \"设置各应用的默认倍率与计费模式来源。\",\n \"pricingAppLabel\": \"应用\",\n \"defaultCostMultiplierLabel\": \"默认倍率\",\n \"defaultCostMultiplierHint\": \"用于成本计算的倍率,支持小数。\",\n \"pricingModelSourceLabel\": \"计费模式\",\n \"pricingModelSourceRequest\": \"请求模型\",\n \"pricingModelSourceResponse\": \"返回模型\",\n \"pricingSave\": \"保存计费配置\",\n \"pricingSaved\": \"计费配置已保存\",\n \"pricingSaveFailed\": \"保存计费配置失败:{{error}}\",\n \"pricingLoadFailed\": \"加载计费配置失败:{{error}}\",\n \"defaultCostMultiplierRequired\": \"默认倍率不能为空\",\n \"defaultCostMultiplierInvalid\": \"默认倍率格式不正确\"\n },\n \"saveFailedGeneric\": \"保存失败,请重试\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"Context\",\n \"subtitle\": \"管理 Claude Code、Codex、OpenCode、OpenClaw、Hermes 与 Gemini CLI 会话记录\",\n \"searchPlaceholder\": \"搜索会话内容、目录或 ID\",\n \"searchSessions\": \"搜索会话\",\n \"providerFilterAll\": \"全部\",\n \"sessionList\": \"会话列表\",\n \"manageBatchTooltip\": \"进入批量管理\",\n \"exitBatchModeTooltip\": \"退出批量管理\",\n \"batchModeHint\": \"勾选要导出或删除的会话\",\n \"exportSelected\": \"批量导出\",\n \"batchExporting\": \"导出中...\",\n \"batchExportSuccess\": \"已导出 {{count}} 个会话\",\n \"batchExportFailed\": \"批量导出失败,请稍后重试\",\n \"selectForBatch\": \"选择会话\",\n \"selectedCount\": \"已选 {{count}} 项\",\n \"selectAllFiltered\": \"全选当前\",\n \"clearFilteredSelection\": \"取消全选\",\n \"clearSelection\": \"清空已选\",\n \"deleteSelected\": \"批量删除\",\n \"batchDeleting\": \"删除中...\",\n \"loadingSessions\": \"加载会话中...\",\n \"noSessions\": \"未发现会话\",\n \"selectSession\": \"请选择会话查看详情\",\n \"noSummary\": \"暂无摘要\",\n \"lastActive\": \"最近活跃\",\n \"projectDir\": \"项目目录\",\n \"sourcePath\": \"原始文件\",\n \"copyResumeCommand\": \"复制恢复命令\",\n \"resumeCommandCopied\": \"恢复命令已复制\",\n \"openInTerminal\": \"在终端恢复\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"仅复制\",\n \"terminalLaunched\": \"终端已启动\",\n \"openFailed\": \"终端启动失败\",\n \"resumeFallbackCopied\": \"已复制恢复命令,可手动粘贴到终端\",\n \"copyProjectDir\": \"复制目录\",\n \"projectDirCopied\": \"目录已复制\",\n \"copySourcePath\": \"复制原始文件\",\n \"sourcePathCopied\": \"原始文件已复制\",\n \"delete\": \"删除会话\",\n \"deleting\": \"删除中...\",\n \"deleteTooltip\": \"永久删除此本地会话记录\",\n \"deleteConfirmTitle\": \"删除会话\",\n \"deleteConfirmMessage\": \"将永久删除本地会话“{{title}}”\\nSession ID: {{sessionId}}\\n\\n此操作不可恢复。\",\n \"deleteConfirmAction\": \"删除会话\",\n \"sessionDeleted\": \"会话已删除\",\n \"deleteFailed\": \"删除会话失败: {{error}}\",\n \"batchDeleteConfirmTitle\": \"批量删除会话\",\n \"batchDeleteConfirmMessage\": \"将永久删除已选中的 {{count}} 个本地会话记录。\\n\\n此操作不可恢复。\",\n \"batchDeleteConfirmAction\": \"删除所选会话\",\n \"batchDeleteSuccess\": \"已删除 {{count}} 个会话\",\n \"batchDeleteFailed\": \"{{failed}} 个会话删除失败\",\n \"batchDeleteRequestFailed\": \"批量删除失败,请稍后重试\",\n \"loadingMessages\": \"加载会话内容中...\",\n \"emptySession\": \"该会话暂无可展示内容\",\n \"clickToCopyPath\": \"点击复制路径\",\n \"tocTitle\": \"对话目录\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}} 分钟前\",\n \"hoursAgo\": \"{{count}} 小时前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"roleUser\": \"用户\",\n \"roleSystem\": \"系统\",\n \"roleTool\": \"工具\",\n \"resume\": \"恢复会话\",\n \"resumeTooltip\": \"在终端中恢复此会话\",\n \"noResumeCommand\": \"此会话无法恢复\",\n \"copyCommand\": \"复制命令\",\n \"copyMessage\": \"复制消息\",\n \"messageCopied\": \"已复制消息内容\",\n \"conversationHistory\": \"对话记录\",\n \"expandContent\": \"展开完整内容\",\n \"collapseContent\": \"收起\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"收到供应商切换事件:\",\n \"setupListenerFailed\": \"设置供应商切换监听器失败:\",\n \"updateProviderFailed\": \"更新供应商失败:\",\n \"autoImportFailed\": \"自动导入默认配置失败:\",\n \"openLinkFailed\": \"打开链接失败:\",\n \"getVersionFailed\": \"获取版本信息失败:\",\n \"loadSettingsFailed\": \"加载设置失败:\",\n \"getConfigPathFailed\": \"获取配置路径失败:\",\n \"getConfigDirFailed\": \"获取配置目录失败:\",\n \"detectPortableFailed\": \"检测便携模式失败:\",\n \"saveSettingsFailed\": \"保存设置失败:\",\n \"updateFailed\": \"更新失败:\",\n \"checkUpdateFailed\": \"检查更新失败:\",\n \"openConfigFolderFailed\": \"打开配置文件夹失败:\",\n \"selectConfigDirFailed\": \"选择配置目录失败:\",\n \"getDefaultConfigDirFailed\": \"获取默认配置目录失败:\",\n \"openReleaseNotesFailed\": \"打开更新日志失败:\"\n },\n \"providerForm\": {\n \"supplierName\": \"供应商名称\",\n \"supplierNameRequired\": \"供应商名称 *\",\n \"supplierNamePlaceholder\": \"例如:Anthropic 官方\",\n \"websiteUrl\": \"官网地址\",\n \"websiteUrlPlaceholder\": \"https://example.com(可选)\",\n \"apiEndpoint\": \"请求地址\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理与测速\",\n \"configContent\": \"配置内容\",\n \"officialNoApiKey\": \"官方登录无需填写 API Key,直接保存即可\",\n \"codexOfficialNoApiKey\": \"官方无需填写 API Key,直接保存即可\",\n \"codexApiKeyAutoFill\": \"只需要填这里,下方 auth.json 会自动填充\",\n \"apiKeyAutoFill\": \"只需要填这里,下方配置会自动填充\",\n \"cnOfficialApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"aggregatorApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"thirdPartyApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"customApiKeyHint\": \"💡 自定义配置需手动填写所有必要字段\",\n \"omoHint\": \"💡 OMO 配置管理 Agent 模型分配,兼容 oh-my-openagent.jsonc / oh-my-opencode.jsonc\",\n \"officialHint\": \"💡 官方供应商使用浏览器登录,无需配置 API Key\",\n \"getApiKey\": \"获取 API Key\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册并在充值时填写 \\\"OpenSunstar\\\" 优惠码,可以享受9折优惠\",\n \"apikeyfun\": \"APIKEY.FUN 为 OpenSunstar 的用户提供了特别优惠,通过专属链接注册,可享受最高充值永久 95 折优惠。\",\n \"apinebula\": \"APINEBULA 为 OpenSunstar 用户提供特别优惠:使用专属链接注册并在充值时填写 \\\"OpenSunstar\\\" 优惠码,可享九折优惠。\",\n \"atlascloud\": \"Atlas Cloud 是一个全模态 AI 推理平台,通过单一 API 为开发者提供视频生成、图像生成及 LLM 接入。立即查看全新“编程计划”优惠,获取更具性价比的 API 接入。\",\n \"sudocode\": \"SudoCode 是全球一流 AI 模型聚合服务,一个 API Key 可通用多模型,并支持 Claude Code、Codex、Gemini CLI、OpenClaw 等工具接入。\",\n \"patewayai\": \"PatewayAI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册可以获得3美元额度。\",\n \"claudeapi\": \"ClaudeAPI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册可以领取测试额度。\",\n \"claudecn\": \"ClaudeCN 是一家实体企业运营的企业级AI中转平台,支持企业采购流程,可对公打款、签约,服务合规有保障。\",\n \"runapi\": \"RunAPI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册并联系客服可领取 ¥14 免费额度。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特惠,Starter 套餐 9.9 元起\",\n \"minimax_en\": \"MiniMax Coding Plan 黑五特惠,Starter 套餐现仅 $2/月(2折优惠!)\",\n \"dmxapi\": \"Claude Code 专属模型 3.4 折优惠进行中!\",\n \"cubence\": \"Cubence 是 OpenSunstar 的官方合作伙伴,使用此链接注册并在充值时填写 \\\"OPENSUNSTAR\\\" 优惠码,每次充值均可享受9折优惠\",\n \"aigocode\": \"AIGoCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册首次充值时可以获得10%额度奖励!\",\n \"rightcode\": \"RightCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册每次充值均可赠送5%额外额度!\",\n \"aicodemirror\": \"AICodeMirror 是 OpenSunstar 的官方合作伙伴,使用此链接注册可享受8折优惠!\",\n \"crazyrouter\": \"CrazyRouter 为 OpenSunstar 的用户提供了特殊优惠,首次充值赠予 30% 额外额度!\",\n \"sssaicode\": \"SSAI Code 为 OpenSunstar 的用户提供了特殊优惠,每次充值赠予额外 $10 额度!\",\n \"siliconflow\": \"硅基流动是 OpenSunstar 的官方合作伙伴\",\n \"ucloud\": \"优云智算为OpenSunstar 的用户提供了特殊优惠,通过此链接注册,可以获得五元平台体验金!\",\n \"micu\": \"Micu 是 OpenSunstar 的官方合作伙伴\",\n \"ctok\": \"官网加入CTok社群,订阅套餐。\",\n \"shengsuanyun\": \"胜算云为 OpenSunstar 的用户提供了特别福利,使用此链接注册的新用户可获 10 元模力及首充 10% 赠送!\",\n \"lemondata\": \"Lemon Code 为 OpenSunstar 的用户提供了特别优惠。使用此链接注册可以获得1美元免费额度。\",\n \"doubaoseed\": \"豆包大模型为 OpenSunstar 的用户提供了专属福利:通过此链接注册即可获取豆包全系列文本模型 50万tokens推理额度以及Seedance2.0的500万tokens免费额度\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan 为 OpenSunstar 的用户提供了专属福利:通过此链接订阅方舟AgentPlan,新客户首月40元起。\",\n \"byteplus\": \"通过此链接注册即可获取每个模型50万tokens的免费推理额度。\",\n \"ccsub\": \"CCSub 是稳定、实惠的 AI API 中转平台,Claude Code 官方订阅的超强平替,一个 Key 覆盖全部模型,价格约为官方 1/3。\",\n \"unity2\": \"Unity2.ai 为 OpenSunstar 用户提供专属福利:通过此链接注册可领取 $2 余额,加入官方群再送 $10,最高可领 $12 免费额度!\"\n },\n \"presets\": {\n \"ucloud\": \"优云智算\",\n \"ucloudCoding\": \"优云智算Coding Plan\",\n \"shengsuanyun\": \"胜算云\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"参数配置 - {{name}} *\",\n \"mainModel\": \"主模型 (可选)\",\n \"mainModelPlaceholder\": \"例如: GLM-4.6\",\n \"fastModel\": \"快速模型 (可选)\",\n \"fastModelPlaceholder\": \"例如: GLM-4.5-Air\",\n \"modelHint\": \"💡 留空将使用供应商的默认模型\",\n \"apiHint\": \"💡 填写兼容 Claude API 的服务端点地址,不要以斜杠结尾\",\n \"apiHintOAI\": \"💡 填写兼容 OpenAI Chat Completions 的服务端点地址,不要以斜杠结尾\",\n \"apiHintGeminiNative\": \"💡 建议填写 Gemini Native 的 base URL,例如 https://generativelanguage.googleapis.com 或 https://generativelanguage.googleapis.com/v1beta;代理会自动补全 models/*:generateContent\",\n \"codexApiHint\": \"💡 填写兼容 OpenAI Response 格式的服务端点地址\",\n \"fillSupplierName\": \"请填写供应商名称\",\n \"fillConfigContent\": \"请填写配置内容\",\n \"fillParameter\": \"请填写 {{label}}\",\n \"fillTemplateValue\": \"请填写 {{label}}\",\n \"endpointRequired\": \"非官方供应商请填写 API 端点\",\n \"apiKeyRequired\": \"非官方供应商请填写 API Key\",\n \"softValidation\": {\n \"title\": \"配置存在以下问题\",\n \"hint\": \"仍要保存吗?保存后切换此供应商时可能失败,可以之后再补全。\",\n \"saveAnyway\": \"仍要保存\"\n },\n \"configJsonError\": \"配置JSON格式错误,请检查语法\",\n \"authJsonRequired\": \"auth.json 必须是 JSON 对象\",\n \"authJsonError\": \"auth.json 格式错误,请检查JSON语法\",\n \"fillAuthJson\": \"请填写 auth.json 配置\",\n \"fillApiKey\": \"请填写 OPENAI_API_KEY\",\n \"visitWebsite\": \"访问 {{url}}\",\n \"anthropicModel\": \"主模型\",\n \"anthropicSmallFastModel\": \"快速模型\",\n \"apiFormat\": \"API 格式\",\n \"apiFormatHint\": \"选择供应商 API 的输入格式\",\n \"customUserAgent\": \"自定义 User-Agent\",\n \"customUserAgentHint\": \"仅在开启本地路由/代理接管后生效,会替换转发到供应商 API 请求中的 User-Agent。\",\n \"customUserAgentInvalid\": \"User-Agent 不能包含控制字符(如换行符),否则将被忽略。\",\n \"customUserAgentPresets\": \"预设\",\n \"fullUrlLabel\": \"完整 URL\",\n \"fullUrlEnabled\": \"完整 URL 模式\",\n \"fullUrlDisabled\": \"标记为完整 URL\",\n \"fullUrlHint\": \"💡 请填写完整请求 URL,并且必须开启路由后使用;路由将直接使用此 URL,不拼接路径\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native 下,完整 URL 模式同时兼容两类地址:1. 官方/标准 Gemini URL,代理会按模型和流式参数自动归一化;2. 自定义 relay 的完整 URL,代理会尽量原样使用,只补查询参数,不再强行追加 models 路径\",\n \"apiFormatAnthropic\": \"Anthropic Messages (原生)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (需开启路由)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (需开启路由)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (需开启路由)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (原生)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (需开启路由)\",\n \"codexApiFormatHint\": \"选择供应商真实支持的 Codex API 格式;配置仍保持 Responses 以兼容新版 Codex,Chat Completions 会通过本地路由自动转换。\",\n \"authField\": \"认证字段\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(默认)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"选择写入配置的认证环境变量名\",\n \"apiHintResponses\": \"💡 填写兼容 OpenAI Responses API 的服务端点地址,不要以斜杠结尾\",\n \"anthropicDefaultHaikuModel\": \"Haiku 默认模型\",\n \"anthropicDefaultSonnetModel\": \"Sonnet 默认模型\",\n \"anthropicDefaultOpusModel\": \"Opus 默认模型\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"可选:指定默认使用的 Claude 模型,留空则使用系统默认。\",\n \"modelMappingLabel\": \"模型映射\",\n \"modelMappingHint\": \"显示名称只影响 /model 菜单;1M 只是给 Claude Code 的上下文能力声明。\",\n \"modelRoleLabel\": \"模型角色\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"显示名称\",\n \"modelDisplayNamePlaceholder\": \"例如 DeepSeek V4 Pro\",\n \"requestModelLabel\": \"实际请求模型\",\n \"modelOneMHeader\": \"声明支持 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"默认兜底模型\",\n \"fallbackModelHint\": \"仅在 Claude Code 请求没有明确落到 Sonnet、Opus 或 Haiku 角色时使用;通常可以留空。\",\n \"quickSetModels\": \"一键设置\",\n \"quickSetSuccess\": \"已将模型名称应用到所有角色\",\n \"advancedOptionsToggle\": \"高级选项\",\n \"advancedOptionsHint\": \"包含 API 格式、认证字段、模型映射等配置。大多数场景下保持默认即可。\",\n \"categoryOfficial\": \"官方\",\n \"categoryCnOfficial\": \"开源官方\",\n \"categoryAggregation\": \"聚合服务\",\n \"categoryThirdParty\": \"第三方\",\n \"fetchModels\": \"获取模型列表\",\n \"fetchingModels\": \"正在获取...\",\n \"fetchModelsSuccess\": \"获取到 {{count}} 个模型\",\n \"fetchModelsFailed\": \"获取模型列表失败\",\n \"fetchModelsEmpty\": \"未找到可用模型\",\n \"fetchModelsNeedApiKey\": \"请先填写 API Key\",\n \"fetchModelsNeedEndpoint\": \"请先填写 API 端点\",\n \"fetchModelsNeedConfig\": \"请先填写 API 端点和 API Key\",\n \"fetchModelsAuthFailed\": \"API Key 无效或无权限\",\n \"fetchModelsNotSupported\": \"该供应商不支持获取模型列表\",\n \"fetchModelsEndpointNotFound\": \"未找到可用的模型列表端点,请检查 Base URL 或确认供应商是否开放该接口\",\n \"fetchModelsTimeout\": \"请求超时,请检查网络连接\",\n \"providerKeyStatusLoading\": \"正在加载供应商标识状态,请稍后再试\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 认证\",\n \"authStatus\": \"认证状态\",\n \"authenticated\": \"已认证: {{username}}\",\n \"notAuthenticated\": \"未认证\",\n \"loginWithGitHub\": \"使用 GitHub 登录\",\n \"loginRequired\": \"请先登录 GitHub Copilot\",\n \"waitingForAuth\": \"等待授权中...\",\n \"enterCode\": \"请在浏览器中输入验证码:\",\n \"logout\": \"注销\",\n \"authSuccess\": \"GitHub Copilot 认证成功\",\n \"authFailed\": \"认证失败: {{error}}\",\n \"authTimeout\": \"认证超时,请重试\",\n \"tokenExpired\": \"令牌已过期,请重新认证\",\n \"accountCount\": \"{{count}} 个账号\",\n \"selectAccount\": \"选择账号\",\n \"selectAccountPlaceholder\": \"选择一个 GitHub 账号\",\n \"useDefaultAccount\": \"使用默认账号\",\n \"loggedInAccounts\": \"已登录账号\",\n \"defaultAccount\": \"默认\",\n \"selected\": \"已选中\",\n \"removeAccount\": \"移除账号\",\n \"setAsDefault\": \"设为默认\",\n \"addAnotherAccount\": \"添加其他账号\",\n \"logoutAll\": \"注销所有账号\",\n \"retry\": \"重试\",\n \"copyCode\": \"复制代码\",\n \"migrationFailed\": \"旧认证数据迁移失败:{{error}}\",\n \"loadModelsFailed\": \"加载 Copilot 模型列表失败\",\n \"deploymentType\": \"GitHub 部署类型\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例如:company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"认证状态\",\n \"notAuthenticated\": \"未认证\",\n \"loginWithChatGPT\": \"使用 ChatGPT 登录\",\n \"loginRequired\": \"请先登录 ChatGPT 账号\",\n \"waitingForAuth\": \"等待授权中...\",\n \"enterCode\": \"请在浏览器中输入以下验证码:\",\n \"accountCount\": \"{{count}} 个账号\",\n \"selectAccount\": \"选择账号\",\n \"selectAccountPlaceholder\": \"选择一个 ChatGPT 账号\",\n \"useDefaultAccount\": \"使用默认账号\",\n \"loggedInAccounts\": \"已登录账号\",\n \"defaultAccount\": \"默认\",\n \"selected\": \"已选中\",\n \"removeAccount\": \"移除账号\",\n \"setAsDefault\": \"设为默认\",\n \"addAnotherAccount\": \"添加其他账号\",\n \"logoutAll\": \"注销所有账号\",\n \"retry\": \"重试\",\n \"copyCode\": \"复制代码\",\n \"fastMode\": \"FAST 模式\",\n \"fastModeDescription\": \"发送 service_tier=\\\"priority\\\" 换取更低延迟。默认关闭——开启后会按更高速率消耗 ChatGPT 配额。\"\n },\n \"endpointTest\": {\n \"title\": \"请求地址管理\",\n \"endpoints\": \"个端点\",\n \"autoSelect\": \"自动选择\",\n \"testSpeed\": \"测速\",\n \"testing\": \"测速中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完成\",\n \"noEndpoints\": \"暂无端点\",\n \"failed\": \"失败\",\n \"enterValidUrl\": \"请输入有效的 URL\",\n \"invalidUrlFormat\": \"URL 格式不正确\",\n \"onlyHttps\": \"仅支持 HTTP/HTTPS\",\n \"urlExists\": \"该地址已存在\",\n \"saveFailed\": \"保存失败,请重试\",\n \"loadEndpointsFailed\": \"加载自定义端点失败:\",\n \"addEndpointFailed\": \"添加自定义端点失败:\",\n \"removeEndpointFailed\": \"删除自定义端点失败:\",\n \"removeFailed\": \"删除失败: {{error}}\",\n \"updateLastUsedFailed\": \"更新端点使用时间失败\",\n \"pleaseAddEndpoint\": \"请先添加端点\",\n \"testUnavailable\": \"测速功能不可用\",\n \"noResult\": \"未返回结果\",\n \"testFailed\": \"测速失败: {{error}}\",\n \"empty\": \"暂无端点\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"模型测试配置\",\n \"useCustomConfig\": \"使用单独配置\",\n \"testConfigDesc\": \"为此供应商配置单独的模型测试参数,不启用时使用全局配置。\",\n \"testModel\": \"测试模型\",\n \"testModelPlaceholder\": \"留空使用全局配置\",\n \"timeoutSecs\": \"超时时间(秒)\",\n \"testPrompt\": \"测试提示词\",\n \"degradedThreshold\": \"降级阈值(毫秒)\",\n \"maxRetries\": \"最大重试次数\",\n \"pricingConfig\": \"计费配置\",\n \"useCustomPricing\": \"使用单独配置\",\n \"pricingConfigDesc\": \"为此供应商配置单独的计费参数,不启用时使用全局默认配置。\",\n \"costMultiplier\": \"成本倍率\",\n \"costMultiplierPlaceholder\": \"留空使用全局默认(1)\",\n \"costMultiplierHint\": \"实际成本 = 基础成本 × 倍率,支持小数如 1.5\",\n \"pricingModelSourceLabel\": \"计费模式\",\n \"pricingModelSourceInherit\": \"继承全局默认\",\n \"pricingModelSourceRequest\": \"请求模型\",\n \"pricingModelSourceResponse\": \"返回模型\",\n \"pricingModelSourceHint\": \"选择按请求模型还是返回模型进行定价匹配\"\n },\n \"providerBudget\": {\n \"title\": \"用量预算\",\n \"description\": \"设置日/月美元预算上限,超出后将触发预警通知(留空表示不限制)\",\n \"dailyLimit\": \"日预算 (USD)\",\n \"dailyLimitPlaceholder\": \"例如 0.01\",\n \"dailyLimitInvalid\": \"日预算必须为非负数\",\n \"monthlyLimit\": \"月预算 (USD)\",\n \"monthlyLimitPlaceholder\": \"例如 10.00\",\n \"monthlyLimitInvalid\": \"月预算必须为非负数\"\n },\n \"onboarding\": {\n \"title\": \"快速上手\",\n \"dismiss\": \"关闭引导\",\n \"prev\": \"上一步\",\n \"next\": \"下一步\",\n \"done\": \"知道了\",\n \"step1\": {\n \"title\": \"添加项目\",\n \"desc\": \"所有功能围绕项目展开。点击侧边栏「我的项目 → 添加项目」,把你的代码仓库加进来,OpenSunstar 会自动扫描 AI 配置状态。\"\n },\n \"step2\": {\n \"title\": \"项目驾驶舱 — 今天有没有事\",\n \"desc\": \"「今日告警」只回答一个问题:今天有没有事。没事就显示「今天没事」—— 没事就是最好的消息。「项目看板」放聚合指标与资产矩阵,巡视内容不占开机第一眼。\"\n },\n \"step3\": {\n \"title\": \"AI资产配置 — 为项目落地资产\",\n \"desc\": \"在「项目配置 → AI资产配置」里为项目关联 MCP 服务器、Skills、Prompts 等资产。侧栏「Agent 配置」管全局库,这里管它们在项目上的关联。\"\n },\n \"step4\": {\n \"title\": \"工作流编排 — 建立可执行流程\",\n \"desc\": \"在「项目配置 → 工作流编排」里为项目配置阶段、预设与变更执行方案。方法论识别、预设编排、自定义编排、设计合约——四个独立维度,按需选用,无先后依赖。\"\n },\n \"addProvidersManually\": \"您可以在设置中手动添加供应商。\",\n \"apiKeyBadge\": \"API Key\",\n \"detectedMcpServers\": \"检测到的 MCP 服务器\",\n \"detectedProviders\": \"检测到的供应商\",\n \"getStarted\": \"开始使用\",\n \"mcpFromSource\": \"来自 {{source}}\",\n \"noConfigsFound\": \"未发现已有的 AI 工具配置。\",\n \"scanning\": \"扫描中...\",\n \"scanResultsSummary\": \"在您的系统中找到 {{count}} 项配置\",\n \"scanResultsTitle\": \"扫描结果\",\n \"scanSystem\": \"扫描我的系统\",\n \"skipForNow\": \"暂时跳过\",\n \"welcomeDescription\": \"您的 AI 编程助手统一控制面板。让我们扫描系统中已有的配置。\",\n \"welcomeTitle\": \"欢迎使用 OpenSunstar\"\n },\n \"bridge\": {\n \"title\": \"桥接 Prompt\",\n \"description\": \"将「{{name}}」桥接到其他 AI 工具,内容将自动转换格式。\",\n \"targetTool\": \"目标工具\",\n \"selectTarget\": \"选择目标工具...\",\n \"generatingPreview\": \"正在生成预览...\",\n \"previewLabel\": \"预览(前 500 字符)\",\n \"autoSyncOnEdit\": \"编辑时自动同步\",\n \"autoSyncDescription\": \"保存源 Prompt 时自动推送变更到已桥接的目标\",\n \"saveSettingFailed\": \"保存设置失败:{{error}}\",\n \"createBridge\": \"创建桥接\",\n \"bridging\": \"桥接中...\",\n \"createdWithWarnings\": \"桥接已创建,但有警告\",\n \"createdSuccess\": \"Prompt 已桥接到 {{label}}\",\n \"failed\": \"桥接失败:{{error}}\"\n },\n \"gistSync\": {\n \"title\": \"GitHub Gist 同步\",\n \"description\": \"通过私有 GitHub Gist 同步设置与 Skills\",\n \"sectionLabel\": \"GitHub Gist 同步\",\n \"patHint\": \"输入具有 gist 权限的 GitHub Personal Access Token 以启用 Gist 同步。\",\n \"save\": \"保存\",\n \"test\": \"测试连接\",\n \"upload\": \"上传\",\n \"download\": \"下载\",\n \"clear\": \"清除\",\n \"enterPat\": \"请输入 GitHub PAT\",\n \"patSaved\": \"GitHub PAT 已安全保存\",\n \"savePatFailed\": \"保存 PAT 失败:{{error}}\",\n \"connectedAs\": \"已连接为 {{username}}\",\n \"connectionFailed\": \"连接失败:{{error}}\",\n \"uploadSuccess\": \"已上传到 Gist {{gistId}}...\",\n \"uploadFailed\": \"上传失败:{{error}}\",\n \"downloadSuccess\": \"已从 {{device}} 下载\",\n \"downloadFailed\": \"下载失败:{{error}}\",\n \"remoteDevice\": \"远程设备\",\n \"configCleared\": \"Gist 同步配置已清除\",\n \"clearFailed\": \"清除失败:{{error}}\",\n \"gistIdLabel\": \"Gist ID\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json 配置内容\",\n \"authJsonStorageHint\": \"代理接管中显示的是存储的 auth 配置,不是实时 auth.json\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml 配置内容\",\n \"configTomlStorageHint\": \"代理接管中显示的是存储的 config 配置,不是实时 config.toml\",\n \"proxyTakeoverStorageNotice\": \"💡 当前应用处于代理接管状态。这里编辑的是存储的供应商配置,真实 live 配置已由代理临时接管\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑 Codex 通用配置片段\",\n \"commonConfigHint\": \"该片段会在勾选'写入通用配置'时追加到 config.toml 末尾\",\n \"enableGoalMode\": \"启用 Goal mode\",\n \"enableRemoteCompaction\": \"启用远程压缩\",\n \"remoteCompactionHint\": \"开启后会将当前 model_providers 条目的 name 写为 OpenAI,使 Codex 尝试使用远程压缩。\",\n \"apiUrlLabel\": \"API 请求地址\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"modelNameHint\": \"指定使用的模型,将自动更新到 config.toml 中\",\n \"modelName\": \"模型名称\",\n \"localRoutingToggle\": \"需要本地路由映射\",\n \"localRoutingOffHint\": \"如果您的供应商不是原生 OpenAI Responses API,或者模型名不是 Codex 默认的 GPT 系列,请打开此开关。\",\n \"localRoutingOnHint\": \"Codex 目前仅原生支持 OpenAI Responses API 与 GPT 系列模型;如果您的供应商使用 Chat Completions 协议或非 GPT 模型(如 DeepSeek、Kimi),则需要打开本开关,并在使用过程中保持本地路由开启。\",\n \"upstreamModelName\": \"上游模型名称\",\n \"upstreamModelNameHint\": \"Chat 格式下这里填写真实上游模型;路由会把 Codex 的 Responses 请求转换为 Chat Completions 并保持该模型。\",\n \"modelNamePlaceholder\": \"例如: gpt-5-codex\",\n \"contextWindow1M\": \"1M 上下文窗口\",\n \"contextWindow\": \"上下文窗口\",\n \"contextWindowPlaceholder\": \"例如: 128000\",\n \"autoCompactLimit\": \"压缩阈值\",\n \"autoCompactLimitPlaceholder\": \"例如: 90000\",\n \"autoCompactLimitHint\": \"上下文 token 数达到此阈值时自动压缩历史\",\n \"modelMetadataAdvanced\": \"模型元数据高级选项\",\n \"modelMetadataAdvancedHint\": \"用于未知模型的 Codex 元数据覆盖;清空字段会从 config.toml 删除对应配置。\",\n \"modelMappingTitle\": \"模型映射\",\n \"modelMappingHint\": \"生成 Codex model_catalog_json,让 /model 命令显示这些第三方模型名;表中条目按填写内容原样保存。修改后需要重启 Codex 才能刷新模型列表。\",\n \"addCatalogModel\": \"添加模型\",\n \"catalogDisplayName\": \"显示名称\",\n \"catalogDisplayNamePlaceholder\": \"例如: DeepSeek V4 Flash\",\n \"catalogModelId\": \"模型 ID\",\n \"catalogModelPlaceholder\": \"例如: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"菜单显示名\",\n \"catalogColumnModel\": \"实际请求模型\",\n \"catalogColumnContext\": \"上下文窗口\",\n \"reasoningModeToggle\": \"支持思考模式\",\n \"reasoningModeHint\": \"上游 Chat Completions 接口支持开启或关闭 thinking 时启用。Kimi、GLM、Qwen 等通常属于这一类。\",\n \"reasoningEffortToggle\": \"支持思考等级\",\n \"reasoningEffortHint\": \"上游支持 low/high/max 等思考深度控制时启用。启用后会自动启用思考模式,并把 Codex 的 reasoning.effort 转成上游 Chat 参数。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"预设供应商已自动配置;自定义供应商会按名称/地址自动推断。仅当自动识别不准时才需手动覆盖。\",\n \"advancedSectionHint\": \"包含本地路由映射、模型映射、思考能力与自定义 User-Agent。供应商使用 Chat Completions 协议或非 GPT 模型时,需在此开启本地路由映射。\",\n \"noCommonConfigToApply\": \"通用配置片段为空或没有可写入的内容\"\n },\n \"geminiConfig\": {\n \"envFile\": \"环境变量 (.env)\",\n \"envFileHint\": \"使用 .env 格式配置 Gemini 环境变量\",\n \"configJson\": \"配置文件 (config.json)\",\n \"configJsonHint\": \"使用 JSON 格式配置 Gemini 扩展参数(可选)\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑 Gemini 通用配置片段\",\n \"commonConfigHint\": \"该片段会写入 Gemini 的 .env(不允许包含 GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY)\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"extractedConfigInvalid\": \"提取的配置格式错误\",\n \"invalidJsonFormat\": \"通用配置片段格式错误(必须是有效的 JSON)\",\n \"commonConfigInvalidKeys\": \"通用配置片段不能包含 GOOGLE_GEMINI_BASE_URL 或 GEMINI_API_KEY(发现:{{keys}})\",\n \"commonConfigInvalidValues\": \"通用配置片段的值必须是字符串\",\n \"noCommonConfigToApply\": \"通用配置片段为空或没有可写入的内容\",\n \"configMergeFailed\": \"配置合并失败: {{error}}\",\n \"configReplaceFailed\": \"配置替换失败: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"接口格式\",\n \"selectPackage\": \"选择接口格式\",\n \"npmPackageHint\": \"选择 AI 服务的 API 接口格式\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"自定义 API 端点地址\",\n \"models\": \"模型配置\",\n \"modelsHint\": \"配置可用的模型及其显示名称\",\n \"addModel\": \"添加模型\",\n \"modelId\": \"模型 ID\",\n \"modelName\": \"显示名称\",\n \"noModels\": \"暂无模型配置\",\n \"modelsRequired\": \"请至少添加一个模型配置\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"配置文件中的唯一标识符,只能使用小写字母、数字和连字符\",\n \"providerKeyLockedHint\": \"该供应商已添加到应用配置中,供应商标识不可修改\",\n \"providerKeyRequired\": \"请填写供应商标识\",\n \"providerKeyDuplicate\": \"此标识已被使用,请更换\",\n \"providerKeyInvalid\": \"标识格式无效,只能使用小写字母、数字和连字符\",\n \"extraOptions\": \"额外选项\",\n \"extraOptionsHint\": \"配置额外的 SDK 选项,如 timeout、setCacheKey 等。值会自动解析类型(数字、布尔值等)。\",\n \"addExtraOption\": \"添加\",\n \"extraOptionKey\": \"键名\",\n \"extraOptionValue\": \"值\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"暂无额外选项\",\n \"noModelOptions\": \"模型选项,点击 + 添加\",\n \"modelExtraFields\": \"模型属性\",\n \"noModelExtraFields\": \"模型属性 (variants, cost 等),点击 + 添加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK 选项\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"预设供应商\",\n \"custom\": \"自定义配置\",\n \"other\": \"其他\",\n \"hint\": \"选择预设后可继续调整下方字段。\",\n \"searchTooltip\": \"搜索预设\",\n \"searchAriaLabel\": \"搜索预设供应商\",\n \"searchPlaceholder\": \"搜索名称、官网或分类...\",\n \"sortAriaLabel\": \"切换预设排序\",\n \"sortNameAscTooltip\": \"按名称 A-Z 排序\",\n \"sortOriginalTooltip\": \"恢复原始顺序\",\n \"noSearchResults\": \"没有匹配的预设供应商。\"\n },\n \"usage\": {\n \"title\": \"使用统计\",\n \"subtitle\": \"查看 AI 模型的使用情况和成本统计\",\n \"today\": \"24小时\",\n \"last7days\": \"7天\",\n \"last30days\": \"30天\",\n \"presetToday\": \"当天\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"总请求数\",\n \"totalCost\": \"总成本\",\n \"cost\": \"成本\",\n \"perMillion\": \"(每百万)\",\n \"trends\": \"使用趋势\",\n \"rangeToday\": \"过去 24 小时 (按小时)\",\n \"rangeLast7Days\": \"过去 7 天\",\n \"rangeLast30Days\": \"过去 30 天\",\n \"totalTokens\": \"新生成 Token (Input+Output)\",\n \"cacheTokens\": \"缓存 Token\",\n \"realTotal\": \"真实消耗 Tokens\",\n \"realTotalHint\": \"Input + Output + 缓存写入 + 缓存命中\",\n \"freshInput\": \"新增输入\",\n \"cacheHitRate\": \"缓存命中率\",\n \"requestLogs\": \"请求日志\",\n \"providerStats\": \"Provider 统计\",\n \"modelStats\": \"模型统计\",\n \"time\": \"时间\",\n \"provider\": \"供应商\",\n \"billingModel\": \"计费模型\",\n \"inputTokens\": \"输入\",\n \"outputTokens\": \"输出\",\n \"cacheReadTokens\": \"缓存命中\",\n \"cacheCreationTokens\": \"缓存创建\",\n \"timingInfo\": \"用时/首字\",\n \"status\": \"状态\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"请求模型\",\n \"responseModel\": \"返回模型\",\n \"noData\": \"暂无数据\",\n \"unknownProvider\": \"未知供应商\",\n \"stream\": \"流\",\n \"nonStream\": \"非流\",\n \"source\": \"来源\",\n \"requestsLabel\": \"次请求\",\n \"costLabel\": \"总成本\",\n \"appFilter\": {\n \"all\": \"全部\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"数据来源\",\n \"dataSource\": {\n \"proxy\": \"路由\",\n \"session_log\": \"会话日志\",\n \"codex_db\": \"Codex 数据库\",\n \"codex_session\": \"Codex 会话日志\",\n \"gemini_session\": \"Gemini 会话日志\",\n \"opencode_session\": \"OpenCode 会话日志\"\n },\n \"sessionSync\": {\n \"trigger\": \"同步会话日志\",\n \"import\": \"导入会话\",\n \"resync\": \"同步\",\n \"imported\": \"从会话日志导入了 {{count}} 条记录\",\n \"upToDate\": \"会话日志已是最新\",\n \"failed\": \"会话同步失败\"\n },\n \"totalRecords\": \"共 {{total}} 条记录\",\n \"goToPage\": \"跳转\",\n \"pageInputPlaceholder\": \"页码\",\n \"modelPricing\": \"模型定价\",\n \"loadPricingError\": \"加载定价数据失败\",\n \"modelPricingDesc\": \"配置各模型的 Token 成本\",\n \"noPricingData\": \"暂无定价数据。点击\\\"新增\\\"添加模型定价配置。\",\n \"model\": \"模型\",\n \"pricingModel\": \"计价模型\",\n \"displayName\": \"显示名称\",\n \"inputCost\": \"输入成本\",\n \"outputCost\": \"输出成本\",\n \"cacheReadCost\": \"缓存命中\",\n \"cacheWriteCost\": \"缓存创建\",\n \"pricingAudit\": \"审计\",\n \"pricingBuiltinPublic\": \"内置公开价格\",\n \"pricingUserOverride\": \"用户自定义\",\n \"pricingEffectiveAt\": \"生效\",\n \"longContextRate\": \"长上下文\",\n \"deleteConfirmTitle\": \"确认删除\",\n \"deleteConfirmDesc\": \"确定要删除此模型定价配置吗?此操作无法撤销。\",\n \"queryFailed\": \"查询失败\",\n \"refreshUsage\": \"刷新用量\",\n \"planUsage\": \"套餐用量\",\n \"hostConfirm\": {\n \"title\": \"确认外发域名\",\n \"message\": \"该供应商的自定义用量脚本要向以下域名发起请求(其中会包含你的 API 密钥):\\n\\n{{host}}\\n\\n仅在你信任该域名时才继续。确认后将记住此选择,直到目标域名发生变化。\",\n \"pending\": \"需先确认才能访问 {{host}}\",\n \"reviewButton\": \"查看\",\n \"confirm\": \"信任并继续\",\n \"cancel\": \"取消\"\n },\n \"invalid\": \"已失效\",\n \"total\": \"总:\",\n \"used\": \"已使用:\",\n \"remaining\": \"剩余:\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}} 分钟前\",\n \"hoursAgo\": \"{{count}} 小时前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"multiplePlans\": \"{{count}} 个套餐\",\n \"expand\": \"展开\",\n \"collapse\": \"收起\",\n \"modelIdPlaceholder\": \"例如: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例如: Claude 3.5 Sonnet\",\n \"appType\": \"应用类型\",\n \"allApps\": \"全部应用\",\n \"statusCode\": \"状态码\",\n \"searchProviderPlaceholder\": \"搜索供应商...\",\n \"searchModelPlaceholder\": \"搜索模型...\",\n \"timeRange\": \"时间范围\",\n \"customRange\": \"日历筛选\",\n \"customRangeHint\": \"支持日期与时间\",\n \"startTime\": \"开始时间\",\n \"endTime\": \"结束时间\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"创建\",\n \"cacheWriteNotReported\": \"OpenAI 协议不区分缓存写入,仅上报缓存命中\",\n \"cacheWritePartial\": \"部分协议(如 OpenAI)不上报缓存写入,数值可能偏低\",\n \"cacheRead\": \"命中\",\n \"baseCost\": \"基础\",\n \"costMultiplier\": \"成本倍率\",\n \"withMultiplier\": \"含倍率\",\n \"requestDetail\": \"请求详情\",\n \"requestNotFound\": \"请求未找到\",\n \"basicInfo\": \"基本信息\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"缓存写入成本\",\n \"costBreakdown\": \"成本明细\",\n \"performance\": \"性能信息\",\n \"latency\": \"延迟\",\n \"errorMessage\": \"错误信息\",\n \"requests\": \"请求数\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"平均成本\",\n \"avgLatency\": \"平均延迟\",\n \"successRate\": \"成功率\",\n \"requestId\": \"请求 ID\",\n \"never\": \"从不\",\n \"modelId\": \"模型 ID\",\n \"modelIdRequired\": \"模型 ID 不能为空\",\n \"inputCostPerMillion\": \"输入成本 (每百万 tokens, USD)\",\n \"outputCostPerMillion\": \"输出成本 (每百万 tokens, USD)\",\n \"invalidPrice\": \"价格必须为非负数\",\n \"invalidTimeRange\": \"请选择完整的开始/结束时间\",\n \"invalidTimeRangeOrder\": \"开始时间不能晚于结束时间\",\n \"timeRangeTooLarge\": \"时间范围过大,请缩小范围\",\n \"addPricing\": \"新增定价\",\n \"editPricing\": \"编辑定价\",\n \"pricingAdded\": \"定价已添加\",\n \"pricingUpdated\": \"定价已更新\",\n \"cacheReadCostPerMillion\": \"缓存读取成本 (每百万 tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"缓存写入成本 (每百万 tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"配置用量查询\",\n \"enableUsageQuery\": \"启用用量查询\",\n \"presetTemplate\": \"预设模板\",\n \"requestUrl\": \"请求地址\",\n \"requestUrlPlaceholder\": \"例如:https://api.example.com\",\n \"method\": \"HTTP 方法\",\n \"templateCustom\": \"自定义\",\n \"templateGeneral\": \"通用模板\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"官方\",\n \"templateOfficialSubscription\": \"官方订阅\",\n \"copilotAutoAuth\": \"自动使用 OAuth 认证,无需手动配置凭证\",\n \"tokenPlanHint\": \"自动使用供应商的 API Key 和 Base URL 查询 Token Plan 额度\",\n \"balanceHint\": \"自动使用供应商的 API Key 查询账户余额\",\n \"officialSubscriptionHint\": \"读取本机 CLI 的 OAuth 凭据,并调用官方接口查询订阅额度。默认关闭,只有启用后才会请求。\",\n \"resetDate\": \"重置日期\",\n \"premiumRequests\": \"Premium 请求\",\n \"credentialsConfig\": \"凭证配置\",\n \"credentialsHint\": \"留空则自动使用供应商配置\",\n \"optional\": \"可选\",\n \"apiKeyPlaceholder\": \"留空则使用供应商的 API Key\",\n \"baseUrlPlaceholder\": \"留空则使用供应商的请求地址\",\n \"baseUrl\": \"请求地址\",\n \"accessToken\": \"访问令牌(在个人安全设置里获取)\",\n \"accessTokenPlaceholder\": \"在'安全设置'里生成\",\n \"userId\": \"用户 ID\",\n \"userIdPlaceholder\": \"例如:114514\",\n \"defaultPlan\": \"默认套餐\",\n \"queryFailedMessage\": \"查询失败\",\n \"queryScript\": \"查询脚本(JavaScript)\",\n \"timeoutSeconds\": \"超时时间(秒)\",\n \"headers\": \"请求头\",\n \"body\": \"请求 Body\",\n \"timeoutHint\": \"范围: 2-30 秒\",\n \"timeoutMustBeInteger\": \"超时时间必须为整数,小数部分已忽略\",\n \"timeoutCannotBeNegative\": \"超时时间不能为负数\",\n \"autoIntervalMinutes\": \"自动查询间隔(分钟,0 表示不自动查询)\",\n \"autoQueryInterval\": \"自动查询间隔(分钟)\",\n \"autoQueryIntervalHint\": \"0 表示不自动查询,建议 5-60 分钟\",\n \"intervalMustBeInteger\": \"自动查询间隔必须为整数,小数部分已忽略\",\n \"intervalCannotBeNegative\": \"自动查询间隔不能为负数\",\n \"intervalAdjusted\": \"自动查询间隔已调整为 {{value}} 分钟\",\n \"scriptHelp\": \"脚本编写说明:\",\n \"configFormat\": \"配置格式:\",\n \"commentOptional\": \"可选\",\n \"commentResponseIsJson\": \"response 是 API 返回的 JSON 数据\",\n \"extractorFormat\": \"extractor 返回格式(所有字段均为可选):\",\n \"tips\": \"💡 提示:\",\n \"testing\": \"测试中...\",\n \"testScript\": \"测试脚本\",\n \"format\": \"格式化\",\n \"saveConfig\": \"保存配置\",\n \"scriptEmpty\": \"脚本配置不能为空\",\n \"mustHaveReturn\": \"脚本必须包含 return 语句\",\n \"testSuccess\": \"测试成功!\",\n \"testFailed\": \"测试失败\",\n \"formatSuccess\": \"格式化成功\",\n \"formatFailed\": \"格式化失败\",\n \"supportedVariables\": \"支持的变量\",\n \"variablesHint\": \"支持变量: {{apiKey}}, {{baseUrl}} | extractor 函数接收 API 响应的 JSON 对象\",\n \"scriptConfig\": \"请求配置\",\n \"extractorCode\": \"提取器代码\",\n \"extractorHint\": \"返回对象需包含剩余额度等字段\",\n \"fieldIsValid\": \"• isValid: 布尔值,套餐是否有效\",\n \"fieldInvalidMessage\": \"• invalidMessage: 字符串,失效原因说明(当 isValid 为 false 时显示)\",\n \"fieldRemaining\": \"• remaining: 数字,剩余额度\",\n \"fieldUnit\": \"• unit: 字符串,单位(如 \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: 字符串,套餐名称\",\n \"fieldTotal\": \"• total: 数字,总额度\",\n \"fieldUsed\": \"• used: 数字,已用额度\",\n \"fieldExtra\": \"• extra: 字符串,扩展字段,可自由补充需要展示的文本\",\n \"tip1\": \"• 变量 {{apiKey}} 和 {{baseUrl}} 会自动替换\",\n \"tip2\": \"• extractor 函数在沙箱环境中执行,支持 ES2020+ 语法\",\n \"tip3\": \"• 整个配置必须用 () 包裹,形成对象字面量表达式\"\n },\n \"errors\": {\n \"usage_query_failed\": \"用量查询失败\",\n \"configLoadFailedTitle\": \"配置加载失败\",\n \"configLoadFailedMessage\": \"无法读取配置文件:\\n{{path}}\\n\\n错误详情:\\n{{detail}}\\n\\n请手动检查 JSON 是否有效,或从同目录的备份文件(如 config.json.bak)恢复。\\n\\n应用将退出以便您进行修复。\",\n \"mcpPageLoadFailed\": \"发现 MCP 页面加载失败\",\n \"mcpPageLoadDescription\": \"MCP 注册表页面渲染出错,可能是数据异常或网络问题。\",\n \"pageLoadFailed\": \"页面加载失败\",\n \"pageLoadFailedDescription\": \"当前视图渲染过程中发生了未预期的错误,请尝试切换到其他页面或刷新。\"\n },\n \"presetSelector\": {\n \"title\": \"选择配置类型\",\n \"custom\": \"自定义\",\n \"customDescription\": \"手动配置供应商,需要填写完整的配置信息\",\n \"officialDescription\": \"官方登录,不需要填写 API Key\",\n \"presetDescription\": \"使用预设配置,只需填写 API Key\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"导入\",\n \"importExisting\": \"导入已有\",\n \"addMcp\": \"添加MCP\",\n \"discover\": \"发现MCP\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP 服务器管理\",\n \"addServer\": \"添加服务器\",\n \"editServer\": \"编辑服务器\",\n \"deleteServer\": \"删除服务器\",\n \"deleteConfirm\": \"确定要删除服务器 \\\"{{id}}\\\" 吗?此操作无法撤销。\",\n \"noServers\": \"暂无服务器\",\n \"enabledApps\": \"启用的应用\",\n \"noImportFound\": \"未发现需要导入的 MCP 服务器。所有服务器已在 OpenSunstar 统一管理中。\",\n \"importSuccess\": \"成功导入 {{count}} 个 MCP 服务器\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"用户级 MCP 配置路径\",\n \"serverList\": \"服务器列表\",\n \"loading\": \"加载中...\",\n \"empty\": \"暂无 MCP 服务器\",\n \"emptyDescription\": \"点击右上角按钮添加第一个 MCP 服务器\",\n \"add\": \"添加 MCP\",\n \"addServer\": \"新增 MCP\",\n \"editServer\": \"编辑 MCP\",\n \"addClaudeServer\": \"新增 Claude Code MCP\",\n \"editClaudeServer\": \"编辑 Claude Code MCP\",\n \"addCodexServer\": \"新增 Codex MCP\",\n \"editCodexServer\": \"编辑 Codex MCP\",\n \"configPath\": \"配置路径\",\n \"serverCount\": \"已配置 {{count}} 个 MCP 服务器\",\n \"enabledCount\": \"已启用 {{count}} 个\",\n \"template\": {\n \"fetch\": \"快速模板:mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP 标题(唯一)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"显示名称\",\n \"namePlaceholder\": \"例如 @modelcontextprotocol/server-time\",\n \"enabledApps\": \"启用到应用\",\n \"noAppsWarning\": \"至少选择一个应用\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"可选的描述信息\",\n \"tags\": \"标签(逗号分隔)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"主页链接\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"文档链接\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"附加信息\",\n \"jsonConfig\": \"完整的 JSON 配置\",\n \"jsonConfigOrPrefix\": \"完整的 JSON 配置或者使用\",\n \"tomlConfigOrPrefix\": \"完整的 TOML 配置或者使用\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"完整的 TOML 配置\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"配置向导\",\n \"syncOtherSide\": \"同步到 {{target}}\",\n \"syncOtherSideHint\": \"勾选后会把当前配置同时写入 {{target}},若存在同名配置将被覆盖\",\n \"willOverwriteWarning\": \"将覆盖 {{target}} 中的同名配置\"\n },\n \"wizard\": {\n \"title\": \"MCP 配置向导\",\n \"hint\": \"快速配置 MCP 服务器,自动生成 JSON 配置\",\n \"type\": \"类型\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"命令\",\n \"commandPlaceholder\": \"npx 或 uvx\",\n \"args\": \"参数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"环境变量\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"请输入 URL\",\n \"headers\": \"请求头(可选)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"配置预览\",\n \"apply\": \"应用配置\"\n },\n \"id\": \"标识 (唯一)\",\n \"type\": \"类型\",\n \"command\": \"命令\",\n \"validateCommand\": \"校验命令\",\n \"args\": \"参数\",\n \"argsPlaceholder\": \"例如:mcp-server-fetch --help\",\n \"env\": \"环境变量 (一行一个,KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"重置\",\n \"msg\": {\n \"saved\": \"已保存\",\n \"deleted\": \"已删除\",\n \"enabled\": \"已启用\",\n \"disabled\": \"已禁用\",\n \"templateAdded\": \"已添加模板\"\n },\n \"error\": {\n \"idRequired\": \"请填写标识\",\n \"idExists\": \"该标识已存在,请更换\",\n \"jsonInvalid\": \"JSON 格式错误,请检查\",\n \"tomlInvalid\": \"TOML 格式错误,请检查\",\n \"commandRequired\": \"请填写命令\",\n \"singleServerObjectRequired\": \"此处只需单个服务器对象,请不要粘贴包含 mcpServers 的整份配置\",\n \"saveFailed\": \"保存失败\",\n \"deleteFailed\": \"删除失败\"\n },\n \"discovery\": {\n \"title\": \"发现 MCP\",\n \"searchPlaceholder\": \"输入关键字搜索 MCP 服务器...\",\n \"totalFound\": \"找到 {{count}} 个服务器\",\n \"alreadyInstalled\": \"已安装 {{count}} 个\",\n \"noResults\": \"未找到与 \\\"{{query}}\\\" 相关的服务器\",\n \"noServers\": \"暂无可用服务器\",\n \"official\": \"官方\",\n \"installed\": \"已安装\",\n \"install\": \"安装\",\n \"remotes\": \"连接方式\",\n \"website\": \"网站\",\n \"repository\": \"仓库\",\n \"hotSubtitle\": \"按安装量排序的热门 MCP 服务器(Smithery)\",\n \"loadError\": \"加载 MCP 注册表失败\",\n \"picksSubtitle\": \"经 Smithery 认证的高质量 MCP 服务器\",\n \"tabHot\": \"安装热榜\",\n \"tabPicks\": \"编辑精选\",\n \"tabSearch\": \"搜索 MCP\",\n \"verified\": \"认证\"\n },\n \"test\": {\n \"testConnection\": \"测试链接\",\n \"batchTestConnection\": \"批量测试所有服务器链接\",\n \"batchProgress\": \"测试中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全部 {{count}} 个服务器连接成功\",\n \"batchSummary\": \"{{connected}} 个成功,{{failed}} 个失败(共 {{total}} 个)\",\n \"noServersToTest\": \"没有可测试的服务器\",\n \"connected\": \"已连接\",\n \"authRequired\": \"需验证\",\n \"unreachable\": \"无法连接\",\n \"timeout\": \"超时\",\n \"commandFailed\": \"启动失败\",\n \"unexpected\": \"异常\"\n },\n \"validation\": {\n \"ok\": \"命令可用\",\n \"fail\": \"命令不可用\"\n },\n \"confirm\": {\n \"deleteTitle\": \"删除 MCP 服务器\",\n \"deleteMessage\": \"确定要删除 MCP 服务器 \\\"{{id}}\\\" 吗?此操作无法撤销。\"\n },\n \"presets\": {\n \"title\": \"选择 MCP 类型\",\n \"enable\": \"启用\",\n \"enabled\": \"已启用\",\n \"installed\": \"已安装\",\n \"docs\": \"文档\",\n \"requiresEnv\": \"需要环境变量\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"通用 HTTP 请求工具,支持 GET/POST 等 HTTP 方法,适合快速请求接口/抓取网页数据\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"时间查询工具,提供当前时间、时区转换、日期计算等功能\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"知识图谱记忆系统,支持存储实体、关系和观察,让 AI 记住对话中的重要信息\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"顺序思考工具,帮助 AI 将复杂问题分解为多个步骤,逐步深入思考\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 文档搜索工具,提供最新的库文档和代码示例,配置 key 会有更高限额\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude 提示词管理\",\n \"codexTitle\": \"Codex 提示词管理\",\n \"add\": \"添加提示词\",\n \"edit\": \"编辑提示词\",\n \"addTitle\": \"添加 {{appName}} 提示词\",\n \"editTitle\": \"编辑 {{appName}} 提示词\",\n \"import\": \"导入现有\",\n \"count\": \"共 {{count}} 个提示词\",\n \"enabled\": \"已启用\",\n \"enable\": \"启用\",\n \"enabledName\": \"已启用: {{name}}\",\n \"noneEnabled\": \"未启用任何提示词\",\n \"currentFile\": \"当前 {{filename}} 内容\",\n \"empty\": \"暂无提示词\",\n \"emptyDescription\": \"点击右上角按钮添加或导入提示词\",\n \"loading\": \"加载中...\",\n \"name\": \"名称\",\n \"namePlaceholder\": \"例如:项目默认提示词\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"可选的描述信息\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\n在此输入提示词内容...\",\n \"loadFailed\": \"加载提示词失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"enableSuccess\": \"启用成功\",\n \"enableFailed\": \"启用失败\",\n \"disableSuccess\": \"禁用成功\",\n \"disableFailed\": \"禁用失败\",\n \"importSuccess\": \"导入成功\",\n \"importFailed\": \"导入失败\",\n \"confirm\": {\n \"deleteTitle\": \"确认删除\",\n \"deleteMessage\": \"确定要删除提示词 \\\"{{name}}\\\" 吗?\"\n },\n \"fragment\": {\n \"isFragment\": \"规则片段\",\n \"parent\": \"所属 Prompt\",\n \"selectParent\": \"选择父 Prompt\",\n \"priority\": \"优先级(高者优先合并)\",\n \"targets\": \"目标工具(逗号分隔,* 表示全部)\",\n \"globs\": \"文件 Glob(JSON 数组)\",\n \"badge\": \"片段\"\n }\n },\n \"dryRun\": {\n \"title\": \"预览模式(Dry Run)\",\n \"description\": \"开启后,Prompt 激活等写入操作将先显示 Diff 预览,确认后才实际写入\",\n \"settingsTitle\": \"预览模式(Dry Run)\",\n \"settingsDescription\": \"写入前预览 Diff,确认后再应用到磁盘\",\n \"confirmWrite\": \"确认写入\",\n \"promptActivationTitle\": \"Prompt 激活预览\",\n \"promptActivationDesc\": \"预览模式已开启,确认后将写入目标文件\",\n \"current\": \"当前文件\",\n \"after\": \"激活后\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"命令\",\n \"empty\": \"暂无自定义命令\",\n \"add\": \"添加命令\",\n \"edit\": \"编辑命令\",\n \"count\": \"共 {{count}} 个命令\",\n \"loadFailed\": \"加载命令失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"confirm\": {\n \"deleteTitle\": \"删除命令\",\n \"deleteMessage\": \"确定删除命令 \\\"{{name}}\\\"?已同步的文件将被清理。\"\n },\n \"form\": {\n \"name\": \"命令名称\",\n \"description\": \"描述\",\n \"content\": \"命令内容(Markdown)\",\n \"arguments\": \"参数定义(JSON)\",\n \"syncTargets\": \"同步到\"\n },\n \"variableHelp\": {\n \"title\": \"模板变量\",\n \"arguments\": \"Claude Code / Gemini 用户输入参数占位符\",\n \"codexNote\": \"Codex 不支持独立命令文件,勾选后不会写入磁盘。\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"暂无生命周期钩子\",\n \"add\": \"添加钩子\",\n \"edit\": \"编辑钩子\",\n \"count\": \"共 {{count}} 个钩子\",\n \"loadFailed\": \"加载钩子失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"syncSuccess\": \"已同步到 Claude Code\",\n \"syncFailed\": \"同步失败\",\n \"syncNow\": \"同步到 Claude\",\n \"claudeOnlyNote\": \"当前仅支持同步到 Claude Code(settings.json hooks 字段)\",\n \"timeoutLabel\": \"超时 {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"删除钩子\",\n \"deleteMessage\": \"确定删除此钩子?settings.json 将同步更新。\"\n },\n \"form\": {\n \"eventType\": \"事件类型\",\n \"toolPattern\": \"工具匹配(glob)\",\n \"hookCommand\": \"Shell 命令\",\n \"timeout\": \"超时(秒,1-300)\",\n \"description\": \"描述\"\n },\n \"eventType\": {\n \"PreToolUse\": \"工具调用前\",\n \"PostToolUse\": \"工具调用后\",\n \"Notification\": \"通知\",\n \"Stop\": \"停止\"\n },\n \"multiCliNote\": \"默认同步到 Claude Code;可通过列表项图标启用 Codex / Gemini CLI / Hermes。\",\n \"toggleFailed\": \"切换同步目标失败\"\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"在 Claude / Codex / Gemini 等工具间迁移 Prompt、MCP、Skill 与 Command 配置\",\n \"sourceApp\": \"源工具\",\n \"targetApp\": \"目标工具\",\n \"contentType\": \"配置类型\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"选择目标工具\",\n \"notFound\": \"文件不存在\",\n \"loadFailed\": \"检测源配置失败\",\n \"previewing\": \"生成预览…\",\n \"warnings\": \"转换提示\",\n \"unmapped\": \"未映射章节: {{section}}\",\n \"sourcePreview\": \"源内容\",\n \"convertedPreview\": \"转换后\",\n \"overwrite\": \"覆盖已存在的目标文件(写入前会自动备份 .bak.opensunstar)\",\n \"apply\": \"确认写入\",\n \"applySuccess\": \"配置已写入目标工具\",\n \"applyFailed\": \"写入失败\",\n \"steps\": {\n \"source\": \"选择源\",\n \"previewSource\": \"预览源\",\n \"previewTarget\": \"预览转换\",\n \"confirm\": \"确认写入\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore\",\n \"empty\": \"暂无忽略规则\",\n \"emptyHint\": \"添加 glob 规则后,将同步到 .claudeignore、.codexignore 等文件\",\n \"add\": \"添加规则\",\n \"edit\": \"编辑忽略规则\",\n \"count\": \"共 {{count}} 条规则\",\n \"loadFailed\": \"加载忽略规则失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"importGitignore\": \"从 .gitignore 导入\",\n \"importSuccess\": \"已导入 {{count}} 条规则\",\n \"importFailed\": \"导入失败\",\n \"syncNow\": \"同步到工具\",\n \"syncSuccess\": \"已同步到各工具 ignore 文件\",\n \"syncFailed\": \"同步失败\",\n \"confirm\": {\n \"deleteTitle\": \"删除规则\",\n \"deleteMessage\": \"确定删除此忽略规则?相关 ignore 文件将同步更新。\"\n },\n \"form\": {\n \"pattern\": \"Glob 模式\",\n \"description\": \"描述\",\n \"syncTargets\": \"同步到\"\n }\n },\n \"permissions\": {\n \"title\": \"Permissions\",\n \"empty\": \"暂无工具权限规则\",\n \"emptyHint\": \"管理 Claude Code 的 allow/deny 工具列表,可与 Hooks 共存于 settings.json\",\n \"add\": \"添加权限\",\n \"edit\": \"编辑权限\",\n \"count\": \"共 {{count}} 条权限\",\n \"loadFailed\": \"加载权限失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"syncNow\": \"同步到 Claude\",\n \"syncSuccess\": \"已同步到 Claude settings.json\",\n \"syncFailed\": \"同步失败\",\n \"presets\": \"预设模板:\",\n \"presetApplied\": \"预设已应用\",\n \"presetFailed\": \"应用预设失败\",\n \"claudeOnlyNote\": \"当前仅同步到 Claude Code settings.json permissions 字段\",\n \"confirm\": {\n \"deleteTitle\": \"删除权限\",\n \"deleteMessage\": \"确定删除此权限规则?settings.json 将同步更新。\"\n },\n \"form\": {\n \"type\": \"权限类型\",\n \"toolPattern\": \"工具匹配\",\n \"description\": \"描述\"\n },\n \"type\": {\n \"allowedTools\": \"允许\",\n \"deniedTools\": \"拒绝\",\n \"autoApprove\": \"自动批准\"\n },\n \"multiCliNote\": \"默认同步到 Claude Code;保存后可在列表中切换 Codex、Gemini、OpenCode、OpenClaw 等目标。\",\n \"toggleFailed\": \"切换同步目标失败\"\n },\n \"workspace\": {\n \"title\": \"项目驾驶舱\",\n \"subtitle\": \"汇总各项目 AI 配置状态与近期活跃度,帮你先看该看的\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 配置\"\n },\n \"tabs\": {\n \"label\": \"工作区视图\",\n \"dashboard\": \"今日告警\",\n \"board\": \"项目看板\"\n },\n \"dashboard\": {\n \"title\": \"今日告警\",\n \"subtitle\": \"共 {{count}} 个项目 · 优先关注进度与 AI 资产配置\",\n \"attentionCount\": \"待关注项目\",\n \"attentionHint\": \"就绪不足或资产缺失\",\n \"avgReadiness\": \"平均就绪分\",\n \"missingMcp\": \"缺 MCP 项目\",\n \"activeProjects\": \"近 {{days}} 天活跃\",\n \"activeHint\": \"有 Git 提交\",\n \"queueTitle\": \"建议优先处理\",\n \"allGood\": \"各项目配置状态良好,可直接进入迭代。\",\n \"configureAssets\": \"配置资产\",\n \"reasonReadiness\": \"就绪分 {{score}}/{{max}}\",\n \"reasonDrift\": \"配置不一致 {{count}} 项\",\n \"reasonUnmanaged\": \"尚未纳入 OpenSunstar 管理\",\n \"reasonMcp\": \"未关联 MCP\",\n \"reasonSkills\": \"未配置 Skills\",\n \"reasonPrompts\": \"未关联 Prompts\",\n \"reasonProgress\": \"MVP 进度 {{progress}}%\",\n \"lastUpdated\": \"上次更新\",\n \"updatedJustNow\": \"刚刚更新\",\n \"updatedMinutesAgo\": \"{{count}} 分钟前更新\",\n \"updatedHoursAgo\": \"{{count}} 小时前更新\",\n \"updatedAt\": \"更新于 {{time}}\",\n \"refreshing\": \"正在刷新…\",\n \"loading\": \"正在汇总项目就绪与资产数据…\",\n \"mvpBehindHint\": \"{{count}} 个 MVP 项目进度低于 50%,建议优先推进。\",\n \"activeSub\": \"共 {{commits}} 次提交 · 活跃度 {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 资产总览\",\n \"subtitle\": \"按项目查看 MCP / Skills / Prompts 关联与就绪状态\",\n \"loading\": \"正在汇总各项目 AI 资产…\",\n \"project\": \"项目\",\n \"stage\": \"阶段\",\n \"readiness\": \"就绪\",\n \"progress\": \"进度\",\n \"refreshing\": \"更新中\",\n \"subtitle8\": \"按项目查看 8 类 AI 资产关联数量与就绪状态(项目级启用子集)\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"已创建备份:{{path}}\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"配置文件中的唯一标识符,只能使用小写字母、数字和连字符\",\n \"providerKeyLockedHint\": \"该供应商已添加到应用配置中,供应商标识不可修改\",\n \"providerKeyRequired\": \"请填写供应商标识\",\n \"providerKeyDuplicate\": \"此标识已被使用,请更换\",\n \"providerKeyInvalid\": \"标识格式无效,只能使用小写字母、数字和连字符\",\n \"apiProtocol\": \"API 协议\",\n \"selectProtocol\": \"选择 API 协议\",\n \"apiProtocolHint\": \"选择与供应商 API 兼容的协议类型。大多数供应商使用 OpenAI Completions 格式。\",\n \"baseUrl\": \"API 端点\",\n \"baseUrlHint\": \"供应商的 API 端点地址。\",\n \"models\": \"模型列表\",\n \"addModel\": \"添加模型\",\n \"noModels\": \"暂无模型配置。点击添加模型来配置可用模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"显示名称\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"上下文窗口\",\n \"maxTokens\": \"最大输出 Tokens\",\n \"reasoning\": \"推理模式\",\n \"reasoningOn\": \"启用\",\n \"reasoningOff\": \"关闭\",\n \"inputTypes\": \"输入类型\",\n \"inputCost\": \"输入价格 ($/M tokens)\",\n \"outputCost\": \"输出价格 ($/M tokens)\",\n \"advancedOptions\": \"高级选项\",\n \"cacheReadCost\": \"缓存读取价格 ($/M tokens)\",\n \"cacheWriteCost\": \"缓存写入价格 ($/M tokens)\",\n \"cacheCostHint\": \"缓存价格用于计算 Prompt Caching 的成本。如不使用缓存可留空。\",\n \"modelsHint\": \"配置该供应商支持的模型。模型 ID 用于 API 调用,显示名称用于界面展示。\",\n \"userAgent\": \"发送 User-Agent\",\n \"userAgentHint\": \"部分供应商需要浏览器 User-Agent 才能正常访问。\",\n \"env\": {\n \"title\": \"环境变量\",\n \"description\": \"管理 openclaw.json 中的环境变量配置(API Key、自定义变量等)\",\n \"editorHint\": \"以 JSON 形式编辑整个 env 节点。支持 env.vars、env.shellEnv 等嵌套对象。\",\n \"objectRequired\": \"OpenClaw 的 env 必须是 JSON 对象。\",\n \"invalidJson\": \"OpenClaw 的 env 必须是合法 JSON。\",\n \"empty\": \"OpenClaw 的 env 不能为空。空对象请使用 {}。\",\n \"keyPlaceholder\": \"变量名\",\n \"valuePlaceholder\": \"值\",\n \"add\": \"添加变量\",\n \"saveSuccess\": \"环境变量已保存\",\n \"saveFailed\": \"保存环境变量失败\",\n \"loadFailed\": \"读取环境变量失败\",\n \"duplicateKey\": \"检测到重复的变量名: {{key}}\"\n },\n \"tools\": {\n \"title\": \"工具权限\",\n \"description\": \"管理 openclaw.json 中的工具权限配置(允许/拒绝列表)\",\n \"profile\": \"权限模式\",\n \"profileMinimal\": \"最小权限\",\n \"profileCoding\": \"编码\",\n \"profileMessaging\": \"对话\",\n \"profileFull\": \"完全访问\",\n \"profileUnset\": \"未设置\",\n \"unsupportedProfileTitle\": \"检测到不受支持的工具配置\",\n \"unsupportedProfileDescription\": \"当前 tools.profile 的值“{{value}}”不在 OpenClaw 支持列表内。在你手动选择新值之前,它会被保留。\",\n \"unsupportedProfileLabel\": \"不受支持\",\n \"allowList\": \"允许列表\",\n \"denyList\": \"拒绝列表\",\n \"patternPlaceholder\": \"工具名称或模式\",\n \"addAllow\": \"添加允许\",\n \"addDeny\": \"添加拒绝\",\n \"saveSuccess\": \"工具权限已保存\",\n \"saveFailed\": \"保存工具权限失败\",\n \"loadFailed\": \"读取工具权限失败\"\n },\n \"agents\": {\n \"title\": \"Agents 配置\",\n \"description\": \"管理 openclaw.json 中的 agents.defaults 配置(默认模型、运行参数等)\",\n \"modelSection\": \"模型配置\",\n \"primaryModel\": \"默认模型\",\n \"primaryModelHint\": \"从已配置供应商的模型中选择默认模型\",\n \"notSet\": \"未设置\",\n \"fallbackModels\": \"回退模型\",\n \"fallbackModelsHint\": \"当主模型不可用时,按优先级依次尝试以下回退模型\",\n \"addFallback\": \"添加回退模型\",\n \"noModels\": \"暂无已配置的供应商模型。请先添加 OpenClaw 供应商。\",\n \"notInList\": \"{{value}} (供应商未配置)\",\n \"runtimeSection\": \"运行参数\",\n \"workspace\": \"工作区路径\",\n \"timeout\": \"超时时间(秒)\",\n \"contextTokens\": \"上下文 Token 数\",\n \"maxConcurrent\": \"最大并发数\",\n \"legacyTimeoutTitle\": \"检测到旧版超时字段\",\n \"legacyTimeoutDescription\": \"当前配置仍在使用 agents.defaults.timeout。保存本页面时会迁移为 timeoutSeconds。\",\n \"saveSuccess\": \"Agents 配置已保存\",\n \"saveFailed\": \"保存 Agents 配置失败\",\n \"loadFailed\": \"读取 Agents 配置失败\"\n },\n \"health\": {\n \"title\": \"检测到 OpenClaw 配置警告\",\n \"invalidToolsProfile\": \"tools.profile 使用了不受支持的值。OpenClaw 当前只支持 minimal、coding、messaging、full。\",\n \"legacyTimeout\": \"agents.defaults.timeout 已废弃。打开并保存 Agents 面板即可迁移到 timeoutSeconds。\",\n \"stringifiedEnvVars\": \"env.vars 应为对象,但当前值看起来像被字符串化或已损坏。\",\n \"stringifiedShellEnv\": \"env.shellEnv 应为对象,但当前值看起来像被字符串化或已损坏。\",\n \"parseFailed\": \"openclaw.json 不是合法 JSON5。请先修复文件,再通过这里编辑。\"\n },\n \"primaryModel\": \"默认模型\",\n \"fallbackModel\": \"回退模型\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API 端点\",\n \"baseUrlHint\": \"供应商的 API 端点地址。\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"只能使用小写字母、数字和连字符。用作 config.yaml 中的供应商名称。\",\n \"providerKeyLockedHint\": \"该供应商已添加到 Hermes 配置中,标识不可修改。\",\n \"providerKeyRequired\": \"供应商标识不能为空\",\n \"providerKeyInvalid\": \"供应商标识只能包含小写字母、数字和连字符\",\n \"providerKeyDuplicate\": \"该供应商标识已存在\",\n \"apiMode\": \"API 模式\",\n \"apiModeHint\": \"供应商 API 协议。请根据端点选择正确的协议。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API 端点不能为空\",\n \"baseUrlScheme\": \"请使用 http:// 或 https:// 开头的地址\",\n \"baseUrlInvalid\": \"API 端点不是有效的 URL\",\n \"models\": \"模型列表\",\n \"addModel\": \"添加模型\",\n \"noModels\": \"暂无模型配置。切换到此供应商时将不会更新默认模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"显示名称\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"上下文长度\",\n \"advancedOptions\": \"高级选项\",\n \"modelsHint\": \"切换到此供应商时,第一个模型会写入顶层 model.default。\",\n \"primaryModel\": \"默认模型\",\n \"fallbackModel\": \"备选模型\",\n \"providerAdvanced\": \"供应商高级选项\",\n \"rateLimitDelay\": \"请求间隔(秒)\",\n \"rateLimitDelayHint\": \"连续请求间的最小间隔秒数(可选)。留空表示无限制。\"\n },\n \"webui\": {\n \"open\": \"打开 Hermes Web UI\",\n \"offline\": \"Hermes Web UI 未启动,请先运行 `hermes dashboard` 启动服务。\",\n \"openFailed\": \"打开 Hermes Web UI 失败\",\n \"launchConfirmTitle\": \"Hermes Dashboard 未启动\",\n \"launchConfirmMessage\": \"是否打开终端并运行 `hermes dashboard` 启动服务?\\n\\n启动完成后会自动打开浏览器。\\n\\n若终端提示找不到 hermes 或缺少 web 依赖,请先运行:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"打开终端并启动\",\n \"launching\": \"已在终端启动 hermes dashboard\",\n \"launchFailed\": \"打开终端失败\"\n },\n \"memory\": {\n \"title\": \"记忆管理\",\n \"agentTab\": \"Agent 记忆 (MEMORY.md)\",\n \"userTab\": \"用户画像 (USER.md)\",\n \"usage\": \"已用 {{current}} / {{limit}} 字符\",\n \"overLimit\": \"已超过上限,Hermes 下次加载时会截断\",\n \"enableOn\": \"已启用\",\n \"enableOff\": \"已禁用\",\n \"disabledHint\": \"在重新启用前 Hermes 会跳过此记忆\",\n \"toggleFailed\": \"切换记忆状态失败\",\n \"saveSuccess\": \"记忆已保存\",\n \"saveFailed\": \"保存记忆失败\",\n \"loadFailed\": \"读取记忆文件失败\",\n \"openConfig\": \"在 Hermes Web UI 调整上限\",\n \"runtimeNote\": \"更改将在 Hermes 下次启动或新建会话时生效。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"检测到系统环境变量冲突\",\n \"description\": \"发现 {{count}} 个环境变量可能会覆盖您的配置\"\n },\n \"actions\": {\n \"expand\": \"查看详情\",\n \"collapse\": \"收起\",\n \"selectAll\": \"全选\",\n \"clearSelection\": \"取消选择\",\n \"deleteSelected\": \"删除选中 ({{count}})\",\n \"deleting\": \"删除中...\"\n },\n \"field\": {\n \"value\": \"值\",\n \"source\": \"来源\"\n },\n \"source\": {\n \"userRegistry\": \"用户环境变量 (注册表)\",\n \"systemRegistry\": \"系统环境变量 (注册表)\",\n \"systemEnv\": \"系统环境变量\"\n },\n \"delete\": {\n \"success\": \"环境变量已成功删除\",\n \"error\": \"删除环境变量失败\"\n },\n \"backup\": {\n \"location\": \"备份位置: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"确认删除环境变量\",\n \"message\": \"确定要删除 {{count}} 个环境变量吗?\",\n \"backupNotice\": \"删除前将自动备份,您可以稍后恢复。删除后需要重启应用或终端才能生效。\",\n \"confirm\": \"确认删除\"\n },\n \"error\": {\n \"noSelection\": \"请选择要删除的环境变量\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"从流行的仓库发现并安装技能,扩展 Claude Code/Codex/Gemini 的能力\",\n \"refresh\": \"刷新\",\n \"refreshing\": \"刷新中...\",\n \"repoManager\": \"仓库管理\",\n \"count\": \"共 {{count}} 个技能\",\n \"empty\": \"暂无可用技能\",\n \"emptyDescription\": \"添加技能仓库以发现可用的技能\",\n \"addRepo\": \"添加技能仓库\",\n \"loading\": \"加载中...\",\n \"installed\": \"已安装\",\n \"install\": \"安装\",\n \"installing\": \"安装中...\",\n \"uninstall\": \"卸载\",\n \"uninstalling\": \"卸载中...\",\n \"view\": \"查看\",\n \"noDescription\": \"暂无描述\",\n \"loadFailed\": \"加载失败\",\n \"installSuccess\": \"技能 {{name}} 已安装\",\n \"installFailed\": \"安装失败\",\n \"uninstallSuccess\": \"技能 {{name}} 已卸载\",\n \"uninstallFailed\": \"卸载失败\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"可更新\",\n \"updateSuccess\": \"技能 {{name}} 已更新到最新版本\",\n \"updateFailed\": \"更新失败\",\n \"checkUpdates\": \"检查更新\",\n \"checkingUpdates\": \"检查中...\",\n \"noUpdates\": \"所有技能已是最新版本\",\n \"updatesFound\": \"发现 {{count}} 个技能有可用更新\",\n \"updateAll\": \"全部更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"已成功更新 {{count}} 个技能\",\n \"batchSelect\": \"批量操作\",\n \"exitBatch\": \"取消选择\",\n \"selectAll\": \"全选\",\n \"deselectAll\": \"取消全选\",\n \"selectedCount\": \"已选 {{count}} 项\",\n \"batchForApp\": \"对选中应用\",\n \"batchEnableSuccess\": \"已为 {{count}} 个技能启用 {{app}}\",\n \"batchDisableSuccess\": \"已为 {{count}} 个技能禁用 {{app}}\",\n \"batchUninstall\": \"卸载\",\n \"batchUninstallTitle\": \"批量卸载\",\n \"batchUninstallConfirm\": \"确定要卸载 {{count}} 个技能吗?\",\n \"batchUninstallSuccess\": \"成功卸载 {{count}} 个技能\",\n \"batchUninstallPartial\": \"卸载完成:{{success}} 成功,{{fail}} 失败\",\n \"error\": {\n \"skillNotFound\": \"技能不存在:{{directory}}\",\n \"missingRepoInfo\": \"缺少仓库信息(owner 或 name)\",\n \"downloadTimeout\": \"下载仓库 {{owner}}/{{name}} 超时({{timeout}}秒)\",\n \"downloadTimeoutHint\": \"请检查网络连接或稍后重试\",\n \"skillPathNotFound\": \"仓库 {{owner}}/{{name}} 中未找到技能路径 '{{path}}'\",\n \"skillDirNotFound\": \"技能目录不存在:{{path}}\",\n \"directoryConflict\": \"技能目录 '{{directory}}' 已被 {{existing_repo}} 占用,无法从 {{new_repo}} 安装\",\n \"emptyArchive\": \"下载的压缩包为空\",\n \"downloadFailed\": \"下载失败:HTTP {{status}}\",\n \"allBranchesFailed\": \"所有分支下载失败,尝试了:{{branches}}\",\n \"httpError\": \"HTTP 错误 {{status}}\",\n \"http403\": \"GitHub 访问受限,可能是请求频率过高\",\n \"http404\": \"仓库或分支不存在,请检查地址\",\n \"http429\": \"请求过于频繁,请等待后重试\",\n \"parseMetadataFailed\": \"解析技能元数据失败\",\n \"getHomeDirFailed\": \"无法获取用户主目录\",\n \"noSkillsInZip\": \"ZIP 文件中未找到技能(需包含 SKILL.md 文件)\",\n \"networkError\": \"网络错误\",\n \"fsError\": \"文件系统错误\",\n \"unknownError\": \"未知错误\",\n \"suggestion\": {\n \"checkNetwork\": \"请检查网络连接\",\n \"checkProxy\": \"建议配置 HTTP 代理\",\n \"retryLater\": \"请稍后重试\",\n \"checkRepoUrl\": \"请检查仓库地址和分支名称\",\n \"checkDiskSpace\": \"请检查磁盘空间\",\n \"checkPermission\": \"请检查目录权限\",\n \"uninstallFirst\": \"请先卸载已安装的同名技能\",\n \"checkZipContent\": \"请确认 ZIP 文件包含有效的技能目录(含 SKILL.md 文件)\"\n }\n },\n \"repo\": {\n \"title\": \"管理技能仓库\",\n \"description\": \"添加或删除 GitHub 技能仓库源\",\n \"url\": \"仓库 URL\",\n \"urlPlaceholder\": \"owner/name 或 https://github.com/owner/name\",\n \"branch\": \"分支\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"技能路径\",\n \"pathPlaceholder\": \"skills (可选,留空扫描根目录)\",\n \"add\": \"添加仓库\",\n \"list\": \"已添加的仓库\",\n \"empty\": \"暂无仓库\",\n \"invalidUrl\": \"无效的仓库 URL 格式\",\n \"addSuccess\": \"仓库 {{owner}}/{{name}} 已添加,识别到 {{count}} 个技能\",\n \"addFailed\": \"添加失败\",\n \"removeSuccess\": \"仓库 {{owner}}/{{name}} 已删除\",\n \"removeFailed\": \"删除失败\",\n \"skillCount\": \"识别到 {{count}} 个技能\",\n \"disable\": \"禁用\",\n \"disabled\": \"已禁用\",\n \"enable\": \"启用\"\n },\n \"search\": \"搜索技能\",\n \"searchPlaceholder\": \"搜索技能名称或仓库名称...\",\n \"searchSource\": {\n \"all\": \"全部\",\n \"repos\": \"仓库\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全站总榜\",\n \"leaderboardTrending\": \"24h 趋势\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全站总榜\",\n \"trendingTitle\": \"24h 趋势\",\n \"allTimeDesc\": \"与 skills.sh 官网 All Time 排行榜 TOP50 对齐(历史总安装量)\",\n \"trendingDesc\": \"与 skills.sh 官网 Trending (24h) 排行榜 TOP50 对齐\",\n \"syncedAt\": \"同步于 {{time}}\",\n \"fromCache\": \"本地缓存\",\n \"registryTotal\": \"全站累计 {{count}} 次安装\",\n \"loading\": \"正在同步 skills.sh 官方排行榜…\",\n \"error\": \"无法同步 skills.sh 官方排行榜\",\n \"empty\": \"暂无排行榜数据\",\n \"syncPolicy\": \"非实时数据 · 默认每 {{hours}} 小时从 skills.sh 同步 · 点击刷新可立即更新\",\n \"nextSyncAt\": \"下次自动同步约 {{time}}\",\n \"refreshNow\": \"立即从 skills.sh 同步\",\n \"pageRange\": \"{{range}} · 第 {{page}}/{{totalPages}} 页(共 {{total}} 条)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"输入关键词搜索所有来源(仓库 / skills.sh / ClawHub)...\",\n \"searching\": \"正在搜索多个来源...\",\n \"typeToSearch\": \"输入关键词搜索 skills.sh 和 ClawHub 技能\",\n \"typeToSearchMore\": \"输入关键词可搜索更多来源\",\n \"mergedCount\": \"共 {{total}} 个结果\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"搜索 skills.sh(至少 2 个字符)...\",\n \"installs\": \"{{count}} 次安装\",\n \"loadMore\": \"加载更多\",\n \"loading\": \"正在搜索 skills.sh...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相关技能\",\n \"error\": \"搜索 skills.sh 失败\",\n \"poweredBy\": \"由 skills.sh 提供\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"搜索 ClawHub(至少 2 个字符)...\",\n \"loading\": \"正在搜索 ClawHub...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相关技能\",\n \"resultCount\": \"共 {{count}} 个结果\",\n \"poweredBy\": \"由 ClawHub 提供\",\n \"installViaCli\": \"ClawHub 技能请通过 CLI 安装\",\n \"installSuccess\": \"{{slug}} 安装成功\",\n \"installFailed\": \"ClawHub 技能安装失败\",\n \"installing\": \"正在安装...\"\n },\n \"filter\": {\n \"placeholder\": \"状态筛选\",\n \"all\": \"全部\",\n \"installed\": \"已安装\",\n \"uninstalled\": \"未安装\",\n \"repo\": \"仓库筛选\",\n \"allRepos\": \"全部仓库\"\n },\n \"noResults\": \"未找到匹配的技能\",\n \"noInstalled\": \"暂无已安装的技能\",\n \"noInstalledDescription\": \"从仓库发现并安装技能,或导入已有的技能\",\n \"discover\": \"发现技能\",\n \"import\": \"导入已有\",\n \"importDescription\": \"选择要导入到 OpenSunstar 统一管理的技能\",\n \"importSuccess\": \"成功导入 {{count}} 个技能\",\n \"importSelected\": \"导入已选 ({{count}})\",\n \"noUnmanagedFound\": \"未发现需要导入的技能。所有技能已在 OpenSunstar 统一管理中。\",\n \"foundIn\": \"发现于\",\n \"local\": \"本地\",\n \"uninstallConfirm\": \"确定要卸载技能 \\\"{{name}}\\\" 吗?这将从所有应用中移除该技能,并在删除前自动创建本地备份。\",\n \"uninstallInMainPanel\": \"请在主面板中卸载技能\",\n \"notFound\": \"未找到技能\",\n \"backup\": {\n \"location\": \"备份位置: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"从备份中恢复\",\n \"title\": \"从备份中恢复\",\n \"description\": \"选择一个 Skills 备份,将文件恢复到本地并重新加入当前列表。\",\n \"empty\": \"暂无可恢复的 Skills 备份\",\n \"createdAt\": \"备份时间\",\n \"path\": \"备份路径\",\n \"restore\": \"恢复\",\n \"restoring\": \"恢复中...\",\n \"delete\": \"删除\",\n \"deleting\": \"删除中...\",\n \"deleteSuccess\": \"技能备份 {{name}} 已删除\",\n \"deleteFailed\": \"删除技能备份失败\",\n \"deleteConfirmTitle\": \"确认删除备份\",\n \"deleteConfirmMessage\": \"确定要删除技能备份 \\\"{{name}}\\\" 吗?此操作无法撤销。\",\n \"success\": \"技能 {{name}} 已从备份恢复\",\n \"failed\": \"从备份恢复失败\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"从 ZIP 安装\",\n \"installing\": \"安装中...\",\n \"successSingle\": \"技能 {{name}} 已安装\",\n \"successMultiple\": \"成功安装 {{count}} 个技能\",\n \"noSkillsFound\": \"ZIP 文件中未找到技能(需包含 SKILL.md 文件)\"\n },\n \"detail\": \"详情\",\n \"info\": {\n \"apps\": \"已启用应用\",\n \"branch\": \"分支\",\n \"directory\": \"目录\",\n \"hash\": \"内容哈希\",\n \"installedAt\": \"安装时间\",\n \"updatedAt\": \"更新时间\",\n \"viewReadme\": \"查看文档\"\n },\n \"modelscope\": {\n \"loading\": \"正在搜索 ModelScope 技能中心...\",\n \"openPage\": \"已打开 ModelScope 技能页面,请在页面中查看安装方式\",\n \"poweredBy\": \"数据来源:ModelScope 魔塔社区\",\n \"searchPlaceholder\": \"输入关键词搜索 ModelScope 技能中心...\"\n },\n \"resync\": \"修复同步\"\n },\n \"deeplink\": {\n \"confirmImport\": \"确认导入供应商配置\",\n \"confirmImportDescription\": \"以下配置将导入到 OpenSunstar\",\n \"importPrompt\": \"导入提示词\",\n \"importPromptDescription\": \"请确认是否导入此系统提示词\",\n \"importMcp\": \"导入 MCP Servers\",\n \"importMcpDescription\": \"请确认是否导入这些 MCP Servers\",\n \"importSkill\": \"添加 Skill 仓库\",\n \"importSkillDescription\": \"请确认是否添加此 Skill 仓库\",\n \"promptImportSuccess\": \"提示词导入成功\",\n \"promptImportSuccessDescription\": \"已导入提示词: {{name}}\",\n \"mcpImportSuccess\": \"MCP Servers 导入成功\",\n \"mcpImportSuccessDescription\": \"成功导入 {{count}} 个服务器\",\n \"mcpPartialSuccess\": \"部分导入成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}, 失败: {{failed}}\",\n \"skillImportSuccess\": \"Skill 仓库添加成功\",\n \"skillImportSuccessDescription\": \"已添加仓库: {{repo}}\",\n \"app\": \"应用类型\",\n \"providerName\": \"供应商名称\",\n \"homepage\": \"官网地址\",\n \"endpoint\": \"API 端点\",\n \"apiKey\": \"API 密钥\",\n \"icon\": \"图标\",\n \"model\": \"模型\",\n \"haikuModel\": \"Haiku 模型\",\n \"sonnetModel\": \"Sonnet 模型\",\n \"opusModel\": \"Opus 模型\",\n \"multiModel\": \"多模态模型\",\n \"notes\": \"备注\",\n \"import\": \"导入\",\n \"importing\": \"导入中...\",\n \"warning\": \"请确认以上信息准确无误后再导入。导入后可在供应商列表中编辑或删除。\",\n \"parseError\": \"深链接解析失败\",\n \"importSuccess\": \"导入成功\",\n \"importSuccessDescription\": \"供应商 \\\"{{name}}\\\" 已成功导入\",\n \"importError\": \"导入失败\",\n \"configSource\": \"配置来源\",\n \"configEmbedded\": \"内嵌配置\",\n \"configRemote\": \"远程配置\",\n \"configDetails\": \"配置详情\",\n \"configUrl\": \"配置文件 URL\",\n \"configMergeError\": \"合并配置文件失败\",\n \"primaryEndpoint\": \"主\",\n \"mcp\": {\n \"title\": \"批量导入 MCP Servers\",\n \"targetApps\": \"目标应用\",\n \"serverCount\": \"MCP Servers ({{count}} 个)\",\n \"enabledWarning\": \"导入后将立即写入所有指定应用的配置文件\"\n },\n \"prompt\": {\n \"title\": \"导入系统提示词\",\n \"app\": \"应用\",\n \"name\": \"名称\",\n \"description\": \"描述\",\n \"contentPreview\": \"内容预览\",\n \"enabledWarning\": \"导入后将立即启用此提示词,其他提示词将被禁用\"\n },\n \"skill\": {\n \"title\": \"添加 Claude Skill 仓库\",\n \"repo\": \"GitHub 仓库\",\n \"directory\": \"目标目录\",\n \"branch\": \"分支\",\n \"skillsPath\": \"Skills 路径\",\n \"hint\": \"此操作将添加 Skill 仓库到列表。\",\n \"hintDetail\": \"添加后,您可以在 Skills 管理界面中选择安装具体的 Skill。\"\n },\n \"usageScript\": \"用量查询\",\n \"usageScriptEnabled\": \"已启用\",\n \"usageScriptDisabled\": \"未启用\",\n \"usageApiKey\": \"用量 API Key\",\n \"usageBaseUrl\": \"用量查询地址\",\n \"usageAutoInterval\": \"自动查询\",\n \"usageAutoIntervalValue\": \"每 {{minutes}} 分钟\"\n },\n \"iconPicker\": {\n \"search\": \"搜索图标\",\n \"searchPlaceholder\": \"输入图标名称...\",\n \"noResults\": \"未找到匹配的图标\",\n \"category\": {\n \"aiProvider\": \"AI 服务商\",\n \"cloud\": \"云平台\",\n \"tool\": \"开发工具\",\n \"other\": \"其他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"图标\",\n \"colorLabel\": \"图标颜色\",\n \"selectIcon\": \"选择图标\",\n \"preview\": \"预览\",\n \"clickToChange\": \"点击更换图标\",\n \"clickToSelect\": \"点击选择图标\",\n \"color\": \"图标颜色\"\n },\n \"simpleConnect\": {\n \"nav\": \"快速接入\",\n \"pageTitle\": \"快速接入\",\n \"tabSimple\": \"快速接入\",\n \"tabExpert\": \"高级 Provider\",\n \"title\": \"快速接入\",\n \"subtitle\": \"粘贴 API Key,三步即可在 CLI 中用起来\",\n \"step1\": \"供应商\",\n \"step2\": \"密钥\",\n \"step3\": \"应用\",\n \"supplier\": \"供应商\",\n \"customSupplier\": \"自定义 OpenAI 兼容\",\n \"cliTool\": \"CLI 工具\",\n \"model\": \"模型\",\n \"modelPlaceholder\": \"先拉取模型列表\",\n \"fetchModels\": \"拉取模型列表\",\n \"apply\": \"应用配置\",\n \"applySuccess\": \"{{tool}} 配置已应用\",\n \"applySuccessMulti\": \"{{tools}} 配置已应用\",\n \"modelsLoaded\": \"已加载 {{count}} 个模型\",\n \"poolProxy\": \"本地代理 :{{port}} 已启用\",\n \"keyRequired\": \"请先在 Keychain 中保存 API Key\",\n \"keyRequiredHint\": \"保存主 Key 后才能进入应用步骤\",\n \"customBaseRequired\": \"请先填写自定义 API Base URL\",\n \"modelsFallback\": \"拉取失败,已使用预设模型 {{model}}\",\n \"toolStatusTitle\": \"CLI 配置状态\",\n \"toolStatusLoading\": \"读取 CLI 状态…\",\n \"toolCleared\": \"{{tool}} 已清除快速接入配置\",\n \"clearTool\": \"清除 {{tool}}\",\n \"wizardNav\": \"快速接入步骤\",\n \"summaryStep\": \"步骤 {{step}}/3\",\n \"step3Hint\": \"选择 CLI 与模型后应用;详情见下方折叠面板\",\n \"step3Sections\": {\n \"statusSection\": \"CLI 配置状态\",\n \"runtimeSection\": \"密钥池运行态\",\n \"usageSection\": \"用量概览(只读)\"\n },\n \"supplierChangeTitle\": \"切换供应商?\",\n \"supplierChangeBody\": \"切换后将使用新的 upstream;已保存的 Key 仍对应原供应商命名空间。应用配置时会自动备份并重写 CLI。\",\n \"supplierChangeConfirm\": \"继续切换\",\n \"supplierChangedApply\": \"已切换供应商并写入 CLI;原配置已备份\",\n \"pickSupplier\": \"选择供应商\",\n \"pickCli\": \"选择要配置的 CLI\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"任意 OpenAI-compatible Base URL\",\n \"openWebsite\": \"官网\",\n \"keySaved\": \"Key 已保存\",\n \"keyMissing\": \"未保存 Key\",\n \"poolBadge\": \"密钥池 ×{{count}}\",\n \"keySavedToast\": \"API Key 已安全存入 Keychain\",\n \"keyReadyHint\": \"主 Key 已就绪,可进入下一步\",\n \"poolKeyAdded\": \"备用 Key 已添加\",\n \"applyTo\": \"应用到 {{tool}}\",\n \"modelsLoading\": \"正在拉取模型…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} 已配置\",\n \"backToSimple\": \"返回快速接入\",\n \"openProxySettings\": \"代理与故障队列设置\",\n \"proxyRunning\": \"主代理运行中\",\n \"cliGeneric\": \"CLI 配置\",\n \"expertNoticeTitle\": \"Expert Provider(精简保留)\",\n \"expertNoticeBody\": \"故障队列、代理接管、Universal 等高级能力仍在此管理。默认推荐先用「快速接入」。\",\n \"pool\": {\n \"step2Hint\": \"输入 API Key 并保存,CLI 将通过本地代理安全访问\",\n \"enable\": \"开启密钥池\",\n \"enableHint\": \"多 Key 加权轮询 + 429 阶梯冷却;CLI 始终写 local token,真实 Key 仅存 Keychain\",\n \"securityNote\": \"密钥仅写入系统 Keychain,不会出现在配置文件或日志中。CLI 通过本地代理 token 访问。\",\n \"required\": \"必需\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"主 Key\",\n \"extra\": \"备用 Key\",\n \"extraKey\": \"添加备用 Key\",\n \"supplierHint\": \"Key 存储于 Keychain:simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"密钥池运行时\",\n \"running\": \"代理运行中\",\n \"stopped\": \"代理未启动\",\n \"idleHint\": \"应用配置后将启动本地代理,此处显示 Key 成功/失败与冷却状态\",\n \"available\": \"可用\",\n \"cooling\": \"冷却中\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"用量概览(只读)\",\n \"input\": \"输入\",\n \"output\": \"输出\",\n \"sessions\": \"会话条数\",\n \"proxyPort\": \"代理 :{{port}}\",\n \"proxySession\": \"本次会话\",\n \"byTool\": \"按 CLI 拆分\",\n \"empty\": \"暂无本地会话用量数据\"\n },\n \"import\": {\n \"title\": \"确认导入 API Key\",\n \"description\": \"密钥将写入 Keychain,不会出现在配置文件中。导入前会校验 Key 有效性。\",\n \"label\": \"标签\",\n \"supplier\": \"供应商\",\n \"warning\": \"请确认链接来源可信。可在快速接入中禁用 URL 导入。\",\n \"confirm\": \"确认导入\",\n \"importing\": \"导入中…\",\n \"success\": \"已导入 {{count}} 个 Key 到 Keychain\",\n \"duplicates\": \"跳过 {{count}} 个重复 Key\",\n \"parseError\": \"导入链接解析失败\"\n },\n \"advanced\": {\n \"title\": \"高级\",\n \"verifyKey\": \"保存前校验 Key\",\n \"verifyKeyHint\": \"调用 /v1/models 验证;关闭后仅高级用户手动导入\",\n \"deeplinkImport\": \"允许 URL 导入 Key\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"备份目录安全扫描\",\n \"files\": \"已扫描 {{count}} 个文件\",\n \"clean\": \"未发现明文 Key\",\n \"suspicious\": \"{{count}} 处可疑内容\",\n \"hint\": \"扫描 simple-connect/backups 下 CLI 配置备份,确保无 sk- 明文落盘。\"\n },\n \"privacy\": {\n \"bannerShort\": \"本地优先 · 密钥存系统 Keychain · 无遥测\",\n \"viewDetails\": \"查看安全与隐私说明\",\n \"title\": \"安全与隐私说明\",\n \"intro\": \"快速接入遵循「数据留在本机、密钥不进配置文件、网络由你指定」的原则。以下为快速接入范围内的处理方式。\",\n \"close\": \"知道了\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"本地优先\",\n \"body\": \"供应商选择、模型缓存、CLI 配置状态与用量统计等偏好均保存在本机应用数据目录。写入 CLI 前会自动备份原配置到本地 simple-connect/backups,可在 Step 2 高级区扫描备份是否含明文密钥。\"\n },\n \"keychain\": {\n \"title\": \"凭据存系统 Keychain\",\n \"body\": \"API Key 仅写入操作系统密钥链(Windows DPAPI / macOS Keychain / Linux libsecret),不会出现在 JSON、TOML、环境变量或应用日志中。CLI 侧仅注入 sc-local-* 本地代理令牌;真实 Key 仅在本地代理进程内从 Keychain 读取。\"\n },\n \"network\": {\n \"title\": \"网络直连你选的供应商\",\n \"body\": \"模型拉取、Key 校验(若开启)与 upstream 请求均从本机直接发往你选择的 API Base。本地代理(127.0.0.1:17172)仅在本机环回地址监听,用于密钥池与 CLI 统一入口,不对外网暴露。\"\n },\n \"noTelemetry\": {\n \"title\": \"无遥测、无账号绑定\",\n \"body\": \"快速接入不会向 OpenSunstar 官方或第三方上报 API Key、对话内容、模型调用明细或设备指纹。用量面板数据来自本机 CLI 会话日志与本地代理计数,仅供你在本机查看。\"\n },\n \"yourControl\": {\n \"title\": \"你可自行控制的风险项\",\n \"body\": \"URL 导入 Key 仅在确认链接来源可信时启用,可在 Step 2 高级区关闭。选择自定义供应商时,请自行评估第三方 Base URL 的可信度与隐私政策。\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"快速接入\",\n \"title\": \"快速接入\",\n \"subtitle\": \"三步完成接入:选供应商 → 填 Key → 一键启用\",\n \"tabs\": {\n \"wizard\": \"快速接入\",\n \"manage\": \"管理供应商\"\n },\n \"openManage\": \"管理全部供应商\",\n \"openProxySettings\": \"代理与故障队列设置\",\n \"searchPlaceholder\": \"搜索供应商名称或网址…\",\n \"noResults\": \"未找到匹配的供应商\",\n \"official\": \"官方\",\n \"officialDesc\": \"官方账号按客户端登录。\",\n \"partner\": \"合作伙伴\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"粘贴你的 API Key\",\n \"keychainHint\": \"API Key 保存在本机安全凭据库;接入时会更新本地配置。\",\n \"getKey\": \"获取 API Key\",\n \"apply\": \"一键启用\",\n \"success\": \"接入成功!已切换为当前供应商\",\n \"doneTitle\": \"接入成功!\",\n \"doneDesc\": \"供应商已配置完成并切换为当前生效。现在可以在 Claude Code 中直接使用了。\",\n \"doneDescApp\": \"{{app}} 已配置并切换为当前供应商。\",\n \"failedTitle\": \"接入未完成\",\n \"compensatedDesc\": \"操作失败,系统已恢复到接入前状态;可修正配置后重试。\",\n \"recoveryRequired\": \"自动恢复未完成,请点击“继续恢复”后再重试。\",\n \"operationId\": \"操作编号\",\n \"retry\": \"重试接入\",\n \"continueRecovery\": \"继续恢复\",\n \"changeSelection\": \"修改配置\",\n \"rollback\": \"撤销本次接入\",\n \"rollbackDone\": \"已恢复到接入前状态\",\n \"rollbackFailed\": \"恢复失败,请重试或前往代理设置检查状态\",\n \"proxyRunningHint\": \"Claude Code 的请求经本地代理(127.0.0.1:15721)转发。请保持 OpenSunstar 运行,关闭应用后 Claude Code 将无法连接。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop 经本地代理转发。请保持 OpenSunstar 运行,关闭应用后将无法连接。\",\n \"addAnother\": \"再接入一个\",\n \"openSettings\": \"前往供应商管理\",\n \"firstProviderHint\": \"检测到这是你的第一个供应商,如需启动代理请在设置中确认\",\n \"verify\": \"验证 Key\",\n \"verifyOk\": \"Key 有效!\",\n \"verifyOkAnthropic\": \"Key 有效(该供应商不提供模型列表 API,将使用预设默认模型)\",\n \"verifyOkGemini\": \"Key 有效,Gemini 原生接口验证通过\",\n \"verifyOkWithModels\": \"Key 有效,已获取 {{count}} 个模型\",\n \"verifyOkNoModelList\": \"Key 有效(模型列表拉取失败,将使用预设默认模型)\",\n \"verifyHint\": \"系统按当前协议验证;Anthropic 约消耗 1 token,OpenAI/Gemini 获取到模型列表后可用于高级映射\",\n \"modelsList\": \"可用模型({{count}})\",\n \"myProviders\": \"API Key 接入\",\n \"switch\": \"切换\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"自定义\",\n \"aiGlobal\": \"AI国际\",\n \"aiChina\": \"AI中国\",\n \"relay\": \"聚合/中转\",\n \"customModel\": \"自定义模型配置\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini 快速接入当前启用 Google 官方和 Gemini Native 兼容端点;OpenAI Chat 网关会显示协议不匹配提示。\"\n },\n \"custom\": {\n \"cardTitle\": \"自定义配置\",\n \"cardSubtitle\": \"自填 Base URL 与模型\",\n \"hint\": \"填写名称、Base URL 与默认模型;API 格式、认证字段和模型映射可在下方高级选项中调整。\",\n \"geminiHint\": \"填写名称、Gemini Native Base URL 与模型;Gemini CLI 原生协议在高级选项中展示。\",\n \"name\": \"供应商名称\",\n \"namePlaceholder\": \"例如:我的 DeepSeek 网关\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"默认模型\",\n \"geminiModel\": \"模型 ID\",\n \"defaultName\": \"自定义供应商\"\n },\n \"advanced\": {\n \"title\": \"高级选项\",\n \"subtitle\": \"大多数场景保持默认即可\",\n \"upstreamModel\": \"上游模型\",\n \"defaultModel\": \"默认模型\",\n \"apiFormat\": \"API 格式\",\n \"authField\": \"认证字段\",\n \"roleMapping\": \"模型角色映射\",\n \"roleMappingHint\": \"显示名称用于 /model 菜单;实际请求模型会写入 Claude Code 环境变量。\",\n \"role\": \"角色\",\n \"displayName\": \"显示名称\",\n \"requestModel\": \"实际请求模型\",\n \"roleRequestModel\": \"{{role}} 实际请求模型\",\n \"hiddenFromModelMenu\": \"不显示在 /model 菜单\",\n \"fallbackModel\": \"默认兜底模型\",\n \"desktopRoutes\": \"Claude Desktop 路由映射\",\n \"customProtocolHint\": \"自定义配置按上游真实接口选择协议。\",\n \"presetProtocolLocked\": \"供应商预设已按真实端点锁定协议,避免误选后连接失败。\",\n \"geminiNativeLocked\": \"Gemini CLI 当前透传原生 generateContent 协议;OpenAI Chat 端点需使用已实现协议转换的客户端入口。\"\n },\n \"badge\": {\n \"current\": \"当前\",\n \"proxy\": \"本地路由\"\n },\n \"warn\": {\n \"clearFailed\": \"清除旧快速接入标记失败,若切换仍报错请手动在设置中清除\",\n \"takeoverFailed\": \"供应商已添加,但代理接管开启失败。请在设置-本地路由中手动开启对应应用接管\"\n },\n \"error\": {\n \"emptyKey\": \"请填写 API Key\",\n \"failed\": \"接入失败,请检查 API Key 或网络后重试\",\n \"compensated\": \"接入失败,已自动恢复到操作前状态\",\n \"recoveryRequired\": \"接入失败且自动恢复未完成,请执行恢复后重试\",\n \"noBaseUrl\": \"请填写 Base URL\",\n \"noModel\": \"请填写默认模型\",\n \"customRequired\": \"请填写 Base URL 和默认模型\",\n \"verifyRequired\": \"请先验证 API Key 和上游连接后再启用\"\n },\n \"unavailableForApp\": \"当前客户端协议暂未适配\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex 快速接入当前使用 OpenAI Responses / Chat 上游协议\",\n \"claudeOauthOnly\": \"此 OAuth 预设面向 Claude 客户端\",\n \"geminiNativeOnly\": \"Gemini CLI 需要 Gemini Native 或 Gemini 兼容网关\",\n \"geminiOpenRouter\": \"OpenRouter 提供 OpenAI Chat 上游,Gemini CLI 当前透传 Gemini Native 协议\"\n },\n \"addProvider\": \"添加供应商\",\n \"addProviderHint\": \"从精选供应商开始,或添加自定义兼容接口。\",\n \"audit\": \"查看审计记录\",\n \"cannotDeleteCurrent\": \"当前使用中的供应商不能删除,请先切换到其他供应商。\",\n \"configureProvider\": \"配置供应商\",\n \"configureProviderHint\": \"只需填写必要信息;连接、写入与验证由系统自动处理。\",\n \"connectAndEnable\": \"连接并启用\",\n \"connectedProviders\": \"API Key 接入\",\n \"connectedProvidersHint\": \"\",\n \"deleteProviderMessage\": \"将删除 {{name}} 的已保存配置。此操作不会删除供应商平台上的账户或 API Key。\",\n \"enableUsage\": \"启用用量自动查询\",\n \"history\": {\n \"hint\": \"重启后仍可查看审计记录;成功操作可在安全守卫通过时撤销。\",\n \"title\": \"最近接入操作\"\n },\n \"manageSubscriptionAccounts\": \"管理订阅账号\",\n \"myProvidersHint\": \"API Key 保存在本机安全凭据库;接入时会更新本地配置。\",\n \"officialConnection\": \"订阅账号\",\n \"officialConnectionHint\": \"按客户端完成订阅登录。\",\n \"officialLoginNotice\": \"官方账号按客户端登录。\",\n \"openOfficialSite\": \"打开官网登录\",\n \"operationNeedsAttention\": \"本次接入需要处理\",\n \"proxySettings\": \"代理与故障设置\",\n \"recovery\": {\n \"action\": \"恢复未完成操作\",\n \"title\": \"恢复未完成操作\"\n },\n \"saveUsage\": \"保存用量配置\",\n \"usageConfigDescription\": \"为 {{name}} 保存查询脚本。默认复用该供应商已安全保存的连接凭据,不在此处重复录入密钥。\",\n \"usageInterval\": \"自动查询间隔(分钟,0 为关闭)\",\n \"usageScript\": \"查询脚本\",\n \"workbenchSubtitle\": \"选择客户端,再用订阅账号或 API Key 接入。\",\n \"workbenchTitle\": \"模型接入\",\n \"subscription\": {\n \"loginStatus\": \"登录状态\",\n \"accountManagement\": \"账号管理\",\n \"claude\": {\n \"title\": \"Claude 订阅登录\",\n \"description\": \"凭据由 Claude Code 管理;OpenSunstar 读取状态和额度。\",\n \"action\": \"Claude 订阅登录\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop 登录\",\n \"description\": \"登录由 Claude Desktop 管理。\",\n \"action\": \"获取 Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT 订阅登录\",\n \"description\": \"登录由 OpenSunstar 托管。\",\n \"action\": \"ChatGPT 订阅登录\",\n \"dialogHint\": \"按设备授权流程连接账号。\"\n },\n \"gemini\": {\n \"title\": \"Gemini 账号登录\",\n \"description\": \"凭据由 Gemini CLI 管理;OpenSunstar 读取状态和额度。\",\n \"action\": \"Gemini 登录指引\"\n }\n }\n },\n \"migration\": {\n \"success\": \"配置迁移成功\",\n \"skillsSuccess\": \"已自动导入 {{count}} 个技能到统一管理\",\n \"skillsFailed\": \"自动导入技能失败\",\n \"skillsFailedDescription\": \"请打开 Skills 页面点击“导入已有”手动导入(或重启后再试)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\",\n \"subtitle\": \"同步到 Claude / Gemini / OpenCode 的 agents 目录(Markdown)\",\n \"empty\": \"暂无 Subagent\",\n \"emptyHint\": \"创建自定义 Subagent 并同步到 ~/.claude/agents/ 等目录\",\n \"add\": \"添加 Subagent\",\n \"edit\": \"编辑 Subagent\",\n \"count\": \"共 {{count}} 个 Subagent\",\n \"loadFailed\": \"加载 Subagent 失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"geminiHint\": \"Gemini 需在 settings.json 中开启 experimental.enableSubagents 后生效\",\n \"codexHint\": \"已转换为 TOML 并写入 ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"暂不支持文件同步\"\n },\n \"confirm\": {\n \"deleteTitle\": \"删除 Subagent\",\n \"deleteMessage\": \"确定删除 Subagent \\\"{{name}}\\\"?已同步的文件将被清理。\"\n },\n \"form\": {\n \"name\": \"名称\",\n \"description\": \"描述\",\n \"content\": \"定义(Markdown + YAML frontmatter)\",\n \"syncTargets\": \"同步到\",\n \"geminiNote\": \"Gemini 需在 settings.json 开启 experimental.enableSubagents\",\n \"codexNote\": \"Codex 将自动把 Markdown 转为 TOML 写入 ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"测试模型\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"降级\",\n \"failed\": \"失败\",\n \"circuitOpen\": \"熔断\",\n \"consecutiveFailures\": \"连续失败 {{count}} 次\",\n \"title\": \"配置状态\",\n \"allClear\": \"所有项目 AI 配置状态正常。\",\n \"scan\": \"重复检测\",\n \"subtitle\": \"检测同名项目与重复路径,识别可能的冗余添加\",\n \"noDuplicates\": \"未发现重复项目\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"需关注\",\n \"alert\": \"异常\",\n \"unconfigured\": \"尚未配置\",\n \"unmanaged\": \"未纳管\",\n \"unscanned\": \"未扫描\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 处配置与预期不一致\",\n \"unscanned\": \"尚未完成 AI 配置状态扫描\",\n \"unmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"unconfigured\": \"尚未通过 OpenSunstar 关联任何 AI 资产\",\n \"gaps\": \"待补齐:{{items}}\",\n \"detectedOnly\": \"{{items}} — 发现配置文件但未纳入管理\",\n \"globalOnly\": \"{{items}} — 使用全局默认配置\",\n \"noMcp\": \"未关联 MCP 服务器\",\n \"noSkills\": \"未配置 Skills\",\n \"noPrompts\": \"未关联 Prompts\"\n },\n \"action\": {\n \"repair\": \"修复漂移\",\n \"inspectDetail\": \"查看详情\",\n \"configure\": \"配置资产\",\n \"setup\": \"去配置\",\n \"adopt\": \"纳入管理\",\n \"inspect\": \"查看项目\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} 故障转移已启用\",\n \"disabled\": \"{{app}} 故障转移已关闭\",\n \"toggleFailed\": \"操作失败: {{detail}}\",\n \"inQueue\": \"已加入\",\n \"addQueue\": \"加入\",\n \"priority\": {\n \"tooltip\": \"故障转移优先级 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} 故障转移已启用\\n按队列优先级(P1→P2→...)选择供应商\",\n \"disabled\": \"启用 {{app}} 故障转移\\n将立即切换到队列 P1,并在失败时自动切换到下一个\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"服务地址\",\n \"addressCopied\": \"地址已复制\",\n \"currentProvider\": \"当前 Provider:\",\n \"waitingFirstRequest\": \"当前 Provider:等待首次请求…\",\n \"stoppedTitle\": \"路由服务已停止\",\n \"stoppedDescription\": \"使用上方开关即可启动服务\",\n \"openSettings\": \"配置路由服务\",\n \"stats\": {\n \"activeConnections\": \"活跃连接\",\n \"totalRequests\": \"总请求数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"运行时间\"\n }\n },\n \"settings\": {\n \"title\": \"路由服务设置\",\n \"description\": \"配置本地路由服务器的监听地址、端口和运行参数,保存后立即生效。\",\n \"alert\": {\n \"autoApply\": \"保存后将自动同步到正在运行的路由服务,无需手动重启。\"\n },\n \"basic\": {\n \"title\": \"基础设置\",\n \"description\": \"配置路由服务监听的地址与端口。\"\n },\n \"advanced\": {\n \"title\": \"高级参数\",\n \"description\": \"控制请求的稳定性和日志记录。\"\n },\n \"timeout\": {\n \"title\": \"超时设置\",\n \"description\": \"配置流式和非流式请求的超时时间。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"监听地址\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"路由服务器监听的 IP 地址(推荐 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"监听端口\",\n \"placeholder\": \"15721\",\n \"description\": \"路由服务器监听的端口号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大重试次数\",\n \"placeholder\": \"3\",\n \"description\": \"请求失败时的重试次数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"请求超时(秒)\",\n \"placeholder\": \"0(不限)或 300\",\n \"description\": \"单个请求的最大等待时间(0 表示不限制,或设置 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"启用日志记录\",\n \"description\": \"记录所有路由请求,便于排查问题\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"流式首字超时(秒)\",\n \"description\": \"等待首个数据块的最大时间\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"流式静默超时(秒)\",\n \"description\": \"数据块之间的最大间隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非流式超时(秒)\",\n \"description\": \"非流式请求的总超时时间\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"请输入有效的IP地址\",\n \"portMin\": \"端口必须大于1024\",\n \"portMax\": \"端口必须小于65535\",\n \"retryMin\": \"重试次数不能为负\",\n \"retryMax\": \"重试次数不能超过10\",\n \"timeoutNonNegative\": \"超时时间不能为负数\",\n \"timeoutMax\": \"超时时间最多600秒\",\n \"timeoutRange\": \"请输入 0 或 10-600 之间的数值\",\n \"streamingTimeoutMin\": \"超时时间至少5秒\",\n \"streamingTimeoutMax\": \"超时时间最多300秒\"\n },\n \"actions\": {\n \"save\": \"保存配置\"\n },\n \"toast\": {\n \"saved\": \"路由配置已保存\",\n \"saveFailed\": \"保存失败: {{error}}\"\n },\n \"invalidPort\": \"端口无效,请输入 1024-65535 之间的数字\",\n \"invalidAddress\": \"地址无效,请输入 IPv4(如 127.0.0.1)、IPv6(如 ::1)或 localhost\",\n \"configSaved\": \"路由配置已保存\",\n \"configSaveFailed\": \"保存配置失败\",\n \"restartRequired\": \"修改地址或端口后需要重启路由服务才能生效\"\n },\n \"switchFailed\": \"切换失败: {{error}}\",\n \"takeover\": {\n \"hint\": \"选择要路由的应用,启用后该应用的请求将通过本地路由转发\",\n \"enabled\": \"{{app}} 路由已启用\",\n \"disabled\": \"{{app}} 路由已关闭\",\n \"failed\": \"切换路由状态失败: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} 路由中 - {{address}}:{{port}}\\n切换该应用供应商为热切换\",\n \"broken\": \"{{appLabel}} 路由中,但路由服务未运行\",\n \"inactive\": \"路由 {{appLabel}} 的请求,让该应用请求走本地路由\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"需要先启动路由服务才能配置故障转移\",\n \"autoSwitch\": \"自动故障转移\",\n \"autoSwitchDescription\": \"开启后将立即切换到队列 P1,并在请求失败时自动切换到队列中的下一个供应商\"\n },\n \"failoverQueue\": {\n \"title\": \"故障转移队列\",\n \"description\": \"管理各应用的供应商故障转移顺序\",\n \"info\": \"启用自动故障转移后,将按队列优先级选择供应商(P1 优先)。当请求失败时,系统会按队列顺序依次尝试下一个供应商。\",\n \"selectProvider\": \"选择供应商添加到队列\",\n \"noAvailableProviders\": \"没有可添加的供应商\",\n \"empty\": \"故障转移队列为空。添加供应商以启用自动故障转移。\",\n \"orderHint\": \"队列顺序与首页供应商列表顺序一致,可在首页拖拽调整顺序。\",\n \"dragHint\": \"拖拽供应商可调整故障转移顺序,序号越小优先级越高。\",\n \"toggleEnabled\": \"启用/禁用\",\n \"addSuccess\": \"已添加到故障转移队列\",\n \"addFailed\": \"添加失败\",\n \"removeSuccess\": \"已从故障转移队列移除\",\n \"removeFailed\": \"移除失败\",\n \"reorderSuccess\": \"队列顺序已更新\",\n \"reorderFailed\": \"更新顺序失败\",\n \"toggleFailed\": \"状态更新失败\"\n },\n \"autoFailover\": {\n \"info\": \"当故障转移队列中配置了多个供应商时,系统会在请求失败时按优先级顺序依次尝试。当某个供应商连续失败达到阈值时,熔断器会打开并在一段时间内跳过该供应商。\",\n \"configSaved\": \"自动故障转移配置已保存\",\n \"configSaveFailed\": \"保存失败\",\n \"validationFailed\": \"以下字段超出有效范围: {{fields}}\",\n \"retrySettings\": \"重试与超时设置\",\n \"failureThreshold\": \"失败阈值\",\n \"failureThresholdHint\": \"连续失败多少次后打开熔断器(建议: 3-10)\",\n \"timeout\": \"恢复等待时间(秒)\",\n \"timeoutHint\": \"熔断器打开后,等待多久后尝试恢复(建议: 30-120)\",\n \"circuitBreakerSettings\": \"熔断器设置\",\n \"successThreshold\": \"恢复成功阈值\",\n \"successThresholdHint\": \"半开状态下成功多少次后关闭熔断器\",\n \"errorRate\": \"错误率阈值 (%)\",\n \"errorRateHint\": \"错误率超过此值时打开熔断器\",\n \"minRequests\": \"最小请求数\",\n \"minRequestsHint\": \"计算错误率前的最小请求数\",\n \"explanationTitle\": \"工作原理\",\n \"failureThresholdLabel\": \"失败阈值\",\n \"failureThresholdExplain\": \"连续失败达到此次数时,熔断器打开,该供应商暂时不可用\",\n \"timeoutLabel\": \"恢复等待时间\",\n \"timeoutExplain\": \"熔断器打开后,等待此时间后尝试半开状态\",\n \"successThresholdLabel\": \"恢复成功阈值\",\n \"successThresholdExplain\": \"半开状态下,成功达到此次数时关闭熔断器,供应商恢复可用\",\n \"errorRateLabel\": \"错误率阈值\",\n \"errorRateExplain\": \"错误率超过此值时,即使未达到失败阈值也会打开熔断器\",\n \"maxRetries\": \"最大重试次数\",\n \"timeoutSettings\": \"超时配置\",\n \"streamingFirstByte\": \"流式首字节超时\",\n \"streamingIdle\": \"流式静默超时\",\n \"nonStreaming\": \"非流式超时\",\n \"maxRetriesHint\": \"请求失败时的重试次数(0-10)\",\n \"streamingFirstByteHint\": \"等待首个数据块的最大时间,范围 1-120 秒,默认 60 秒\",\n \"streamingIdleHint\": \"数据块之间的最大间隔,范围 60-600 秒,填 0 禁用(防止中途卡住)\",\n \"nonStreamingHint\": \"非流式请求的总超时时间,范围 60-1200 秒,默认 600 秒(10 分钟)\"\n },\n \"logging\": {\n \"enabled\": \"日志记录已启用\",\n \"disabled\": \"日志记录已关闭\",\n \"failed\": \"切换日志状态失败\"\n },\n \"server\": {\n \"started\": \"路由服务已启动 - {{address}}:{{port}}\",\n \"startFailed\": \"启动路由服务失败: {{detail}}\",\n \"stopped\": \"代理服务已停止\"\n },\n \"stoppedWithRestore\": \"路由服务已关闭,已恢复所有路由配置\",\n \"stopWithRestoreFailed\": \"停止失败: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"健康检查配置已保存\",\n \"configSaveFailed\": \"保存失败\",\n \"testModels\": \"测试模型\",\n \"claudeModel\": \"Claude 模型\",\n \"codexModel\": \"Codex 模型\",\n \"geminiModel\": \"Gemini 模型\",\n \"checkParams\": \"检查参数\",\n \"timeout\": \"超时时间(秒)\",\n \"maxRetries\": \"最大重试次数\",\n \"degradedThreshold\": \"降级阈值(毫秒)\",\n \"testPrompt\": \"检查提示词\",\n \"operational\": \"{{providerName}} 运行正常 ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} 响应较慢 ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} 检查失败: {{message}}\",\n \"rejected\": \"{{providerName}} 检查被拒: {{message}}\",\n \"error\": \"{{providerName}} 检查出错: {{error}}\",\n \"modelNotFound\": \"{{providerName}} 测试模型 {{model}} 不存在或已下架\",\n \"modelNotFoundHint\": \"该模型可能已被供应商弃用。请在\\\"模型测试配置\\\"中更新默认测试模型。\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan 额度已用尽\",\n \"quotaExceededHint\": \"百度千帆返回了 Coding Plan 超额错误。请等待 5 小时/每周/每月额度刷新,或在千帆控制台切换套餐。\",\n \"httpHint\": {\n \"400\": \"供应商拒绝了请求格式。健康检查的探测格式可能与实际使用不同。\",\n \"401\": \"API Key 可能无效,或供应商使用 OAuth 等认证方式。检查失败不代表实际不可用。\",\n \"402\": \"账户配额或计费问题。\",\n \"403\": \"供应商拒绝了此请求。部分供应商会校验客户端身份,检查失败但实际使用可能正常。\",\n \"404\": \"接口地址不存在,请检查 Base URL 和 API 路径。\",\n \"429\": \"请求频率过高,请稍后重试。\",\n \"5xx\": \"供应商内部错误,通常是临时问题。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"路由总开关\",\n \"appTakeover\": \"路由启用\",\n \"perAppConfig\": \"应用配置\",\n \"circuitBreaker\": \"熔断器配置\",\n \"circuitBreakerSettings\": \"熔断器设置\",\n \"failureThreshold\": \"失败阈值\",\n \"successThreshold\": \"恢复阈值\",\n \"recoveryTimeout\": \"恢复等待时间\",\n \"errorRateThreshold\": \"错误率阈值\",\n \"minRequests\": \"最小请求数\",\n \"timeoutConfig\": \"超时配置\",\n \"streamingFirstByte\": \"流式首字节超时\",\n \"streamingIdle\": \"流式静默超时\",\n \"nonStreaming\": \"非流式超时\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失败阈值\",\n \"successThreshold\": \"成功阈值\",\n \"timeoutSeconds\": \"超时时间(秒)\",\n \"errorRateThreshold\": \"错误率阈值 (%)\",\n \"minRequests\": \"最小请求数\",\n \"validationFailed\": \"以下字段超出有效范围: {{fields}}\",\n \"configSaved\": \"熔断器配置已保存\",\n \"saveFailed\": \"保存失败\",\n \"loading\": \"加载中...\",\n \"title\": \"熔断器配置\",\n \"description\": \"调整熔断器参数以控制故障检测和恢复行为\",\n \"failureThresholdHint\": \"连续失败多少次后打开熔断器\",\n \"timeoutSecondsHint\": \"熔断器打开后多久尝试恢复(半开状态)\",\n \"successThresholdHint\": \"半开状态下成功多少次后关闭熔断器\",\n \"errorRateThresholdHint\": \"错误率超过此值时打开熔断器\",\n \"minRequestsHint\": \"计算错误率前的最小请求数\",\n \"saveConfig\": \"保存配置\",\n \"instructionsTitle\": \"配置说明\",\n \"instructions\": {\n \"failureThreshold\": \"连续失败达到此次数时,熔断器打开\",\n \"timeout\": \"熔断器打开后,等待此时间后尝试半开\",\n \"successThreshold\": \"半开状态下,成功达到此次数时关闭熔断器\",\n \"errorRate\": \"错误率超过此值时,熔断器打开\",\n \"minRequests\": \"只有请求数达到此值后才计算错误率\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"复制\",\n \"duplicatedAndSynced\": \"统一供应商已复制并同步\",\n \"duplicateError\": \"复制统一供应商失败\",\n \"title\": \"统一供应商\",\n \"description\": \"统一供应商可以同时管理 Claude、Codex 和 Gemini 的配置。修改后会自动同步到所有启用的应用。\",\n \"add\": \"添加统一供应商\",\n \"edit\": \"编辑统一供应商\",\n \"empty\": \"还没有统一供应商\",\n \"emptyHint\": \"点击下方「添加统一供应商」按钮创建一个\",\n \"selectPreset\": \"选择预设类型\",\n \"name\": \"名称\",\n \"namePlaceholder\": \"例如:我的 NewAPI\",\n \"baseUrl\": \"API 地址\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"官网地址\",\n \"websiteUrlPlaceholder\": \"https://example.com(可选,用于在列表中显示)\",\n \"notes\": \"备注\",\n \"notesPlaceholder\": \"可选:添加备注信息\",\n \"enabledApps\": \"启用的应用\",\n \"modelConfig\": \"模型配置\",\n \"model\": \"模型\",\n \"sync\": \"同步到应用\",\n \"synced\": \"已同步到所有应用\",\n \"syncError\": \"同步失败\",\n \"noAppsEnabled\": \"未启用任何应用\",\n \"added\": \"统一供应商已添加\",\n \"addedAndSynced\": \"统一供应商已添加并同步\",\n \"updated\": \"统一供应商已更新\",\n \"deleted\": \"统一供应商已删除\",\n \"addSuccess\": \"统一供应商添加成功\",\n \"addFailed\": \"统一供应商添加失败\",\n \"hint\": \"跨应用统一配置,自动同步到 Claude/Codex/Gemini\",\n \"manage\": \"管理\",\n \"loadError\": \"加载统一供应商失败\",\n \"saveError\": \"保存统一供应商失败\",\n \"deleteError\": \"删除统一供应商失败\",\n \"deleteConfirmTitle\": \"删除统一供应商\",\n \"deleteConfirmDescription\": \"确定要删除 \\\"{{name}}\\\" 吗?这将同时删除它在各应用中生成的供应商配置。\",\n \"syncConfirmTitle\": \"同步统一供应商\",\n \"syncConfirmDescription\": \"同步 \\\"{{name}}\\\" 将会覆盖 Claude、Codex 和 Gemini 中关联的供应商配置。确定要继续吗?\",\n \"syncConfirm\": \"同步\",\n \"saveAndSync\": \"保存并同步\",\n \"savedAndSynced\": \"已保存并同步到所有应用\",\n \"saveAndSyncError\": \"保存并同步失败\",\n \"configJsonPreview\": \"配置 JSON 预览\",\n \"configJsonPreviewHint\": \"以下是将要同步到各应用的配置内容(仅覆盖显示的字段,保留其他自定义配置)\"\n },\n \"omo\": {\n \"editProfile\": \"编辑 OMO 配置\",\n \"newProfile\": \"新建 OMO 配置\",\n \"profileName\": \"名称\",\n \"mainAgents\": \"主 Agent\",\n \"subAgents\": \"子 Agent\",\n \"categories\": \"分类\",\n \"customAgents\": \"自定义 Agent\",\n \"noCustomAgents\": \"暂无自定义 Agent\",\n \"otherFields\": \"其他配置\",\n \"globalConfig\": \"OMO 全局配置\",\n \"globalConfigShort\": \"OMO 配置\",\n \"globalConfigSaved\": \"全局配置已保存\",\n \"addProfile\": \"添加 OMO 配置\",\n \"disabledItems\": \"禁用项设置\",\n \"advanced\": \"高级设置\",\n \"profileCreated\": \"OMO 配置已创建\",\n \"profileUpdated\": \"OMO 配置已更新\",\n \"invalidJson\": \"其他字段包含无效 JSON\",\n \"confirmDelete\": \"删除配置\",\n \"confirmDeleteMsg\": \"确定删除 \\\"{{name}}\\\" 吗?\",\n \"profileDeleted\": \"配置已删除\",\n \"imported\": \"已导入为 \\\"{{name}}\\\"\",\n \"import\": \"导入\",\n \"global\": \"全局\",\n \"empty\": \"暂无配置。点击 + 添加或从本地导入。\",\n \"applied\": \"已应用\",\n \"apply\": \"应用\",\n \"enable\": \"启用\",\n \"enabled\": \"启用中\",\n \"disabled\": \"OMO 已停用\",\n \"disableFailed\": \"停用 OMO 失败: {{error}}\",\n \"selectPlaceholder\": \"请选择...\",\n \"clear\": \"清空\",\n \"clearWrapped\": \"(清空)\",\n \"defaultWrapped\": \"(默认)\",\n \"variantPlaceholder\": \"思考等级\",\n \"selectEnabledModel\": \"选择已配置模型\",\n \"selectModel\": \"选择已配置模型\",\n \"recommendedHint\": \"推荐: {{model}}\",\n \"searchModel\": \"搜索模型...\",\n \"selectModelFirst\": \"先选择模型\",\n \"noEnabledModels\": \"暂无已配置模型\",\n \"noVariantsForModel\": \"该模型无思考等级\",\n \"currentValueNotEnabled\": \"{{value}}(当前值,未配置)\",\n \"currentValueUnavailable\": \"{{value}}(当前值,不可用)\",\n \"advancedLabel\": \"高级参数\",\n \"advancedJsonInvalid\": \"高级参数 JSON 无效\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用默认值\",\n \"noEnabledModelsWarning\": \"当前没有可用的已配置模型,请先配置 OpenCode 模型\",\n \"modelSourcePartialWarning\": \"部分供应商模型配置无效,已自动跳过。\",\n \"modelSourceFallbackWarning\": \"读取 live 供应商状态失败,已回退到已配置供应商列表。\",\n \"importLocalReplaceSuccess\": \"已从本地文件导入并覆盖 Agent/Category/Other Fields\",\n \"importLocalFailed\": \"读取本地文件失败: {{error}}\",\n \"agentKeyPlaceholder\": \"agent 键名\",\n \"categoryKeyPlaceholder\": \"分类键名\",\n \"modelNamePlaceholder\": \"模型名\",\n \"custom\": \"自定义\",\n \"customCategories\": \"自定义分类\",\n \"modelConfiguration\": \"模型配置\",\n \"fillRecommended\": \"填充推荐\",\n \"fillRecommendedSuccess\": \"已填充 {{count}} 个推荐模型\",\n \"fillRecommendedPartial\": \"已填充 {{filled}} 个推荐模型,{{unmatched}} 个未匹配\",\n \"fillRecommendedMostlyUnmatched\": \"仅填充了 {{filled}} 个,{{unmatched}} 个未匹配(如 {{examples}})。请配置提供这些模型的供应商,或手动选择替代项。\",\n \"fillRecommendedAllSet\": \"所有槽位已有模型配置\",\n \"fillRecommendedNoMatch\": \"推荐模型在已配置的供应商中未找到匹配(如 {{examples}})\",\n \"configSummary\": \"已配置 {{agents}} 个 Agent,{{categories}} 个 Category · 点击 ⚙ 展开高级参数\",\n \"enabledModelsCount\": \"可选已配置模型 {{count}} 个\",\n \"source\": \"来源:\",\n \"otherFieldsJson\": \"其他字段 (JSON)\",\n \"slimOtherFieldsHint\": \"OMO Slim 的 council、fallback、multiplexer、disabled_mcps、todoContinuation 等顶层配置请写在这里。\",\n \"searchOrType\": \"搜索或输入自定义值...\",\n \"noMatches\": \"无匹配项\",\n \"jsonMustBeObject\": \"{{field}} 必须是 JSON 对象\",\n \"jsonInvalid\": \"{{field}} 包含无效 JSON\",\n \"importGlobalSuccess\": \"已从本地文件导入全局配置(未保存)\",\n \"importGlobalFailed\": \"读取本地文件失败: {{error}}\",\n \"importLocal\": \"从本地导入\",\n \"saveGlobalConfig\": \"保存全局配置\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"重置默认\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 设置\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"禁用的 Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"禁用的 MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"禁用的 Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"禁用的 Skills\",\n \"advancedLsp\": \"LSP 配置\",\n \"advancedExperimental\": \"实验性功能\",\n \"advancedBackgroundTask\": \"后台任务\",\n \"advancedBrowserAutomation\": \"浏览器自动化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"主编排者\",\n \"hephaestus\": \"自主深度工作者\",\n \"prometheus\": \"战略规划者\",\n \"atlas\": \"任务管理者\",\n \"oracle\": \"战略顾问\",\n \"librarian\": \"多仓库研究员\",\n \"explore\": \"快速代码搜索\",\n \"multimodalLooker\": \"媒体分析器\",\n \"metis\": \"规划前分析顾问\",\n \"momus\": \"计划审查者\",\n \"sisyphusJunior\": \"委托任务执行器\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"主编排器,负责任务规划、委派与并行执行,使用扩展思考(32k 预算),通过 TODO 驱动工作流确保任务完成。\",\n \"atlas\": \"主编排器(持有 TODO 列表),负责执行阶段的任务分发与协调,不直接完成所有工作而是委派给专业代理。\",\n \"prometheus\": \"战略规划师,通过访谈模式收集需求并制定详细工作计划,仅能在 .sisyphus/ 目录读写 Markdown 文件,从不直接写代码。\",\n \"hephaestus\": \"自主深度工作者(「合法工匠」),受 AmpCode 深度模式启发,目标导向执行,行动前会并行启动 2-5 个探索/图书管理员代理进行研究。\",\n \"oracle\": \"架构决策与调试顾问,只读咨询代理,提供出色的逻辑推理和深度分析,不能写文件或委派任务。\",\n \"librarian\": \"多仓库分析与文档检索专家,深度理解代码库并提供基于证据的答案,擅长查找官方文档和开源实现示例。\",\n \"explore\": \"快速代码库探索与上下文 grep 专家,使用轻量级模型进行高速搜索,是理解代码结构的先锋。\",\n \"multimodalLooker\": \"视觉内容专家,分析 PDF、图片、图表等非文本媒体,提取其中的信息与洞察。\",\n \"metis\": \"计划顾问,在规划前进行预分析,识别隐藏意图、模糊点和 AI 失败点,防止过度工程化。\",\n \"momus\": \"计划评审员,高精度验证计划的清晰度、可验证性和完整性,拒绝并要求修订直到计划完美。\",\n \"sisyphusJunior\": \"类别生成的执行器,由 category 参数自动生成,专注于执行分配的任务且不能再委派,防止无限委派循环。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"视觉/前端工程\",\n \"ultrabrain\": \"超级思考\",\n \"deep\": \"深度工作\",\n \"artistry\": \"创意/文艺\",\n \"quick\": \"快速响应\",\n \"unspecifiedLow\": \"通用低配\",\n \"unspecifiedHigh\": \"通用高配\",\n \"writing\": \"写作\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"前端与视觉工程类别,专注于 UI/UX 设计、样式、动画和界面实现,默认使用 Gemini 3.5 Flash 模型。\",\n \"ultrabrain\": \"深度逻辑推理类别,用于需要广泛分析的复杂架构决策,默认使用 GPT-5.3 Codex 的超高推理变体。\",\n \"deep\": \"深度自主问题解决类别,目标导向执行,行动前进行彻底研究,适用于需要深度理解的棘手问题。\",\n \"artistry\": \"高度创意与艺术性任务类别,激发新颖想法和创造性解决方案,默认使用 Gemini 3.5 Flash 的高推理变体。\",\n \"quick\": \"轻量任务类别,用于单文件修改、错别字修复、简单调整等琐碎工作,默认使用 Claude Haiku 4.5 快速模型。\",\n \"unspecifiedLow\": \"未归类低工作量任务类别,适用于不适合其他类别且工作量较小的任务,默认使用 Claude Sonnet 4.5。\",\n \"unspecifiedHigh\": \"未归类高工作量任务类别,适用于不适合其他类别且工作量较大的任务,默认使用 Claude Opus 4.8 的最大变体。\",\n \"writing\": \"写作类别,专注于文档、散文和技术写作,默认使用 Kimi K2.5 模型。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"编排者\",\n \"oracle\": \"神谕者\",\n \"librarian\": \"图书管理员\",\n \"explorer\": \"探索者\",\n \"designer\": \"设计师\",\n \"fixer\": \"修复者\",\n \"council\": \"议会\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"编写执行代码,编排多代理工作流,召唤专家\",\n \"oracle\": \"根本原因分析、架构审查、调试指导(只读)\",\n \"librarian\": \"文档查询、GitHub 代码搜索(只读)\",\n \"explorer\": \"正则搜索、AST 模式匹配、文件发现(只读)\",\n \"designer\": \"现代响应式设计、CSS/Tailwind 精通\",\n \"fixer\": \"代码实现、重构、测试、验证\",\n \"council\": \"多模型共识代理,并行运行多个只读 councillor,再由 master 汇总最终答案。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"默认模型\",\n \"description\": \"配置 OpenClaw 的默认主模型和回退模型\",\n \"primary\": \"主模型\",\n \"primaryPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"fallbacks\": \"回退模型\",\n \"fallbacksPlaceholder\": \"例如: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"添加回退模型\",\n \"saved\": \"默认模型配置已保存\",\n \"saveFailed\": \"保存默认模型失败\"\n },\n \"modelCatalog\": {\n \"title\": \"模型目录\",\n \"description\": \"配置可用模型的别名和允许列表\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"alias\": \"别名\",\n \"aliasPlaceholder\": \"例如: DeepSeek\",\n \"addEntry\": \"添加模型\",\n \"removeEntry\": \"移除\",\n \"saved\": \"模型目录已保存\",\n \"saveFailed\": \"保存模型目录失败\",\n \"empty\": \"暂无模型目录配置\",\n \"emptyHint\": \"添加模型到目录以配置别名\"\n },\n \"suggestedDefaults\": \"应用建议默认配置\",\n \"suggestedDefaultsHint\": \"使用此预设推荐的默认模型配置\"\n },\n \"sidebar\": {\n \"kanban\": \"项目AI看板\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同步备份\",\n \"section\": {\n \"projects\": \"项目\",\n \"myProjects\": \"我的项目\",\n \"monitor\": \"运行监控\",\n \"aiModels\": \"AI模型\",\n \"cloudSync\": \"跨设备云同步\",\n \"teamCollab\": \"团队协作配置\",\n \"syncCollab\": \"同步与协作\"\n },\n \"agentConfig\": \"Agent 配置\",\n \"projectConfig\": \"项目配置\",\n \"planning\": \"规划中\",\n \"addProject\": \"添加项目\",\n \"collapse\": \"折叠侧边栏\",\n \"expand\": \"展开侧边栏\"\n },\n \"kanban\": {\n \"subtitle\": \"以 AI 驱动的全局多视角,多项目组合矩阵:全生命周期管理、项目健康评估、动态成本监控\",\n \"scanning\": \"正在扫描 {{done}}/{{total}} 个项目…\",\n \"refresh\": \"刷新指标\",\n \"addProject\": \"添加项目\",\n \"searchPlaceholder\": \"搜索项目…\",\n \"confirmRemoveTitle\": \"从项目AI看板中移除?\",\n \"confirmRemove\": \"将移除「{{name}}」;不会删除磁盘上的仓库文件,阶段与进度等本地看板数据也会清除。\",\n \"confirmRemoveBtn\": \"移除\",\n \"removed\": \"已移除「{{name}}」\",\n \"commits7dHint\": \"近 7 天共 {{count}} 次提交\",\n \"commitsWindowHint\": \"近 {{days}} 天共 {{count}} 次提交\",\n \"noRecentActivity\": \"近 7 天无提交\",\n \"noRecentActivityWindow\": \"近 {{days}} 天无提交\",\n \"stageDistribution\": \"阶段分布\",\n \"activity\": {\n \"veryHigh\": \"很高\",\n \"high\": \"高\",\n \"medium\": \"中等\",\n \"low\": \"低\"\n },\n \"detail\": {\n \"tabs\": \"项目详情\",\n \"overview\": \"概览\",\n \"aiAssets\": \"AI 资产配置\",\n \"projectAssets\": \"本项目启用的资产\",\n \"projectAssetsHint\": \"勾选后仅对当前项目生效;全局库在侧栏维护,项目关联仅存于本地数据库。\"\n },\n \"score\": {\n \"health\": \"健康评分\"\n },\n \"readiness\": {\n \"title\": \"Agent 配置就绪\",\n \"loading\": \"正在评估配置就绪度…\",\n \"hint\": \"点击下方条目可直达对应配置;项目级资产在「项目资产配置」中关联。\",\n \"configure\": \"去配置\",\n \"configureGlobal\": \"前往全局配置\",\n \"manage\": \"管理\",\n \"openAssetsTab\": \"打开项目资产配置\",\n \"compactTitle\": \"项目配置就绪度\",\n \"normalCount\": \"{{count}} 项正常\",\n \"driftCount\": \"{{count}} 项不一致\",\n \"missingCount\": \"{{count}} 项缺失\",\n \"priorityDrift\": \"优先处理:{{label}} 配置不一致\",\n \"priorityMissing\": \"优先处理:{{label}} 尚未配置\",\n \"completedSection\": \"已完成 {{count}} 项\",\n \"badgeHint\": \"点击查看详情\",\n \"scanEffective\": \"生效态扫描\",\n \"forApp\": \"按 {{app}} 计分\",\n \"status\": {\n \"global_only\": \"来源:全局基线\",\n \"detected_only\": \"来源:仓库探测\",\n \"partial\": \"部分 CLI 支持\",\n \"not_required\": \"当前目标 CLI 不支持此项,已从评分中排除\",\n \"unmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"unknown\": \"暂不能判定\",\n \"unhealthy\": \"配置与预期不一致\"\n },\n \"effective\": {\n \"configured\": \"已配置\",\n \"effective\": \"配置已验证\",\n \"drifted\": \"配置不一致\",\n \"unconfigured\": \"未配置\",\n \"unchecked\": \"暂未比对\",\n \"runtimePending\": \"已验证项目配置一致;目标 CLI 的运行时读取仍待验证。\"\n },\n \"driftBadge\": \"{{count}} 项配置不一致\",\n \"driftShort\": \"待处理 {{count}}\",\n \"repairDrift\": \"修复配置\",\n \"repairSuccess\": \"已写回并验证生效\",\n \"repairFailed\": \"修复后仍存在配置不一致\",\n \"repairError\": \"修复请求失败,请稍后重试\",\n \"repairNoop\": \"当前项无需修复\"\n },\n \"governance\": {\n \"title\": \"配置生效率\",\n \"forApp\": \"目标 CLI:{{app}}\",\n \"scannedProjects\": \"已扫描项目\",\n \"ofTotal\": \"共 {{total}} 个\",\n \"driftProjects\": \"配置不一致项目\",\n \"driftItems\": \"{{count}} 项待修复\",\n \"effectiveRate\": \"生效率\",\n \"comparableItems\": \"{{count}} 项可比对\",\n \"effectiveItems\": \"已生效项\",\n \"portfolioScope\": \"组合层汇总\",\n \"driftBreakdown\": \"配置不一致分布(按资产类型)\",\n \"allEffective\": \"可比对资产均已生效,组合层治理状态良好。\",\n \"awaitingScan\": \"就绪度扫描完成后将显示治理指标。\",\n \"repairConfirmTitle\": \"确认写回修复?\",\n \"repairConfirmProjectTitle\": \"确认修复全部不一致项?\",\n \"repairConfirmAssetIntro\": \"将把 OpenSunstar 库中的「{{label}}」写回目标 CLI({{app}})对应的项目级文件,可能覆盖你在 IDE/终端里手动改过的内容。\",\n \"repairConfirmProjectIntro\": \"将修复项目「{{name}}」的全部 {{count}} 项配置不一致:逐项写回 OpenSunstar 库内容到目标 CLI({{app}}),可能覆盖外部手动修改。\",\n \"repairConfirmDetail\": \"不一致说明:{{detail}}\",\n \"repairConfirmPath\": \"目标路径:{{path}}\",\n \"repairConfirmProceed\": \"确认后将立即写回并复扫验证;此操作不可自动撤销。\",\n \"repairConfirmAction\": \"确认写回\",\n \"repairConfirmProjectAction\": \"确认修复全部\",\n \"tooltip\": {\n \"scannedProjects\": \"已完成 AI 配置就绪度检查的项目数量\",\n \"driftProjects\": \"至少有 1 项 AI 配置与 OpenSunstar 中保存的预期状态不一致,通常来自本地文件被外部修改或删除。\",\n \"effectiveRate\": \"生效率 = 已生效项 ÷ 可比对项。\\n已生效 = 配置已正确写入项目;可比对项 = 排除「不支持」后的有效检查项总数。\",\n \"effectiveItems\": \"所有项目中,AI 配置已正确落地的检查项数量总和。\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"组合层生效状态巡检:未发现配置不一致。\",\n \"title\": \"{{projects}} 个项目存在配置不一致(共 {{items}} 项)\",\n \"forApp\": \"目标 CLI:{{app}}\",\n \"itemCount\": \"{{count}} 项待处理\",\n \"repairAll\": \"修复全部待处理项\",\n \"repairAllSuccess\": \"已修复 {{count}} 项配置不一致并验证生效\",\n \"repairPartial\": \"已修复 {{fixed}} 项,仍有 {{remaining}} 项配置不一致\",\n \"repairNone\": \"未发现可修复的配置不一致项\"\n },\n \"empty\": {\n \"description\": \"点击下方按钮或在侧边栏添加你的第一个项目\",\n \"title\": \"暂无项目\"\n },\n \"openFolder\": \"打开目录\",\n \"progress\": \"进度\",\n \"remove\": \"移除项目\",\n \"sortByDate\": \"日期\",\n \"sortByName\": \"名称\",\n \"stage\": {\n \"mvp\": {\n \"badge\": \"MVP\"\n },\n \"rapid\": {\n \"badge\": \"已上线\"\n },\n \"stable\": {\n \"badge\": \"稳定维护\"\n }\n },\n \"viewDetail\": \"查看详情\"\n },\n \"projectConfig\": {\n \"hint\": \"为当前项目勾选要启用的 MCP、Skills 与 Prompts。全局资产库在侧栏 Agent 配置中维护。\",\n \"mcpServers\": \"MCP 服务器\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"暂无 MCP 服务器\",\n \"noSkills\": \"暂无已安装的 Skills\",\n \"noPrompts\": \"暂无 Prompts\",\n \"goToMcp\": \"前往 MCP 管理\",\n \"goToSkills\": \"前往 Skills 管理\",\n \"goToPrompts\": \"前往 Prompts 管理\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore 规则\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"暂无 Commands\",\n \"noHooks\": \"暂无 Hooks\",\n \"noIgnore\": \"暂无 Ignore 规则\",\n \"noPermissions\": \"暂无 Permissions\",\n \"noSubagents\": \"暂无 Subagents\",\n \"goToCommands\": \"前往 Commands 管理\",\n \"goToHooks\": \"前往 Hooks 管理\",\n \"goToIgnore\": \"前往 Ignore 管理\",\n \"goToPermissions\": \"前往 Permissions 管理\",\n \"goToSubagents\": \"前往 Subagents 管理\"\n },\n \"projectAssets\": {\n \"projectLink\": \"本项目关联\",\n \"hint\": \"为当前项目勾选要启用的 AI 资产子集。关联仅写入 OpenSunstar 本地库,不会自动修改项目仓库文件;写入各 CLI 仍由侧栏全局资产管理。\",\n \"partialHint\": \"部分 CLI 支持有限制,悬停标签查看说明\",\n \"globalBaselineHint\": \"全局库已有 {{count}} 条规则作为安全基线;可为当前项目单独勾选启用子集。\",\n \"switchAllUnsupported\": \"当前资产类型在所有目标 CLI 上均不支持同步,无法为项目启用\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop 暂不参与此类资产同步\",\n \"openclawMcp\": \"OpenClaw 当前不支持 MCP 同步\",\n \"openclawSkills\": \"OpenClaw 当前不支持 Skills 同步\",\n \"openclawCommands\": \"OpenClaw 当前不支持 Commands 同步\",\n \"openclawIgnore\": \"OpenClaw 当前不支持 Ignore 同步\",\n \"openclawSubagents\": \"OpenClaw 当前不支持 Subagents 同步\",\n \"codexCommands\": \"Codex 不支持独立 slash command 文件\",\n \"codexSubagent\": \"Codex 通过 TOML 转换写入 ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks 当前仅 Claude Code 支持写回\",\n \"permissionsClaudeOnly\": \"Permissions 当前仅 Claude Code 支持写回\",\n \"hermesSubagents\": \"Hermes 不支持 Subagent 文件同步\"\n },\n \"scopeTitle\": \"当前作用域:\"\n },\n \"board\": {\n \"summary\": {\n \"title\": \"项目总览\",\n \"totalProjects\": \"总项目数\",\n \"totalCodeLines\": \"总代码行数\",\n \"linesUnit\": \"行\",\n \"avgActivity\": \"平均活跃度({{days}} 天)\",\n \"commitsInWindow\": \"近 {{days}} 天提交\",\n \"thisWeek\": \"近 7 天提交\",\n \"windowLabel\": \"Git 活跃统计周期\",\n \"daysUnit\": \"天\",\n \"updatesUnit\": \"次\"\n },\n \"duplicateCleanup\": \"重复资产检测\"\n },\n \"projectBlueprint\": {\n \"title\": \"项目基线 Blueprint\",\n \"hint\": \"选择模板一键关联全局库资产;合并模式仅新增关联,不删除已有配置。\",\n \"loading\": \"加载 Blueprint…\",\n \"exportSnapshot\": \"导出快照\",\n \"targetCli\": \"项目目标 CLI\",\n \"targetDefault\": \"沿用看板默认\",\n \"saveTarget\": \"保存\",\n \"previewing\": \"生成预览…\",\n \"previewTitle\": \"预览:将新增 {{count}} 项关联({{name}})\",\n \"apply\": \"应用 Blueprint\",\n \"applied\": \"已应用「{{name}}」,关联 {{count}} 项资产\",\n \"targetSaved\": \"项目目标 CLI 已保存\",\n \"snapshotExported\": \"基线快照已导出:{{path}}\"\n },\n \"subscription\": {\n \"title\": \"订阅额度\",\n \"fiveHour\": \"5小时\",\n \"sevenDay\": \"7天\",\n \"sevenDayOpus\": \"7天(Opus)\",\n \"sevenDaySonnet\": \"7天(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"每周\",\n \"copilotPremium\": \"高级请求\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}后重置\",\n \"extraUsage\": \"超额用量\",\n \"expired\": \"会话已过期\",\n \"expiredHint\": \"请运行 {{tool}} 命令刷新登录\",\n \"queryFailed\": \"查询失败\",\n \"refresh\": \"刷新\"\n },\n \"methodology\": {\n \"sidebar\": \"工作流编排\",\n \"title\": \"工作流编排\",\n \"subtitle\": \"为项目建立可执行流程与治理检查;方法论识别作为可选诊断。\",\n \"scanAll\": \"扫描所有项目\",\n \"scanAllNoProjects\": \"请先添加项目再扫描\",\n \"scanComplete\": \"框架探测完成\",\n \"scanCompleteWithCount\": \"已扫描 {{count}} 个项目\",\n \"tabMarket\": \"方法论识别\",\n \"tabOrchestration\": \"工作流配置\",\n \"notScanned\": \"未扫描\",\n \"verified\": \"已检测到\",\n \"inferred\": \"可能使用\",\n \"absent\": \"未检测到\",\n \"detectedInProjects\": \"{{detected}}/{{total}} 项目已检测到\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} 项目可能使用\",\n \"absentInAll\": \"{{total}} 项目均未检测到\",\n \"noneDetectedTitle\": \"未检测到任何方法论框架\",\n \"noneDetectedGuidance\": \"推荐从 flow-kit(纯 Markdown 模板体系)或 spec-kit(规格工具链)入手。review-only 预设适合已有代码审查流程的项目,无需安装框架。\",\n \"scanPromptTitle\": \"尚未扫描项目中的方法论框架\",\n \"scanPromptBody\": \"点击「扫描所有项目」进行只读探测,或直接进入工作流配置 / 变更执行方案——无需先安装或检测框架。\",\n \"goToOrchestration\": \"去工作流配置\",\n \"goToRecipe\": \"变更执行方案\",\n \"recommendedPreset\": \"推荐档位:{{preset}}\",\n \"recommendedFrameworks\": \"框架参考目录\",\n \"recommendedFrameworksHint\": \"受支持的开源方法论一览,供了解与选型参考(非安装向导)\",\n \"detectedFrameworks\": \"已检测到的框架\",\n \"directOrchestrationTitle\": \"不依赖框架也可开始编排\",\n \"directOrchestrationHint\": \"工作流配置与变更执行方案可独立使用,导出 workflow.profile.json 或变更执行方案文件。\",\n \"presetFull\": \"完整流程\",\n \"presetStandard\": \"标准流程\",\n \"presetMvp\": \"MVP 流程\",\n \"presetReviewOnly\": \"仅审查\",\n \"noDescriptors\": \"框架目录为空。请确认数据库已初始化。\",\n \"detectionMatrix\": \"检测矩阵\",\n \"detectionMatrixHint\": \"项目 × 框架检测结果(✓ 已检测到 / ? 可能使用 / ✗ 未检测到 / — 未扫描)\",\n \"matrixFramework\": \"框架 \\\\ 项目\",\n \"orchestrationEntry\": \"工作流配置\",\n \"orchestrationHint\": \"独立维度:选择一个项目,配置流程档位、模块和阶段,导出 workflow.profile.json 或 flow-config.yaml。无需先完成方法论框架扫描。\",\n \"orchestrationNoProjects\": \"暂无项目。请先在工作区添加项目,再进行流程编排配置。\",\n \"orchestrationSelectProject\": \"选择项目\",\n \"orchestrationChooseProject\": \"— 请选择项目 —\",\n \"orchestrationPickProjectHint\": \"请在上方下拉框选择一个项目,开始配置 SDD 流程编排。\",\n \"tabRecipe\": \"变更执行方案\",\n \"recipeEntry\": \"变更执行方案\",\n \"recipeHint\": \"用可视化阶段图组合阶段与模块,导出 YAML+Markdown 格式的变更执行方案;可独立使用。\",\n \"recipeNoProjects\": \"暂无项目。请先在工作区添加项目。\",\n \"recipeSelectProject\": \"选择项目\",\n \"recipePickPlaceholder\": \"— 选择项目 —\",\n \"recipePickProjectHint\": \"请在上方下拉框选择一个项目,开始制定变更执行方案。\",\n \"tabDesignContract\": \"设计合约\",\n \"designContractEntry\": \"设计合约配置器\",\n \"designContractHint\": \"独立维度:选择品牌模板或自定义配色,生成 DESIGN.md + DTCG tokens。与 SDD 方法论无关,任何有前端/UI 的项目均可独立使用。\",\n \"designContractNoProjects\": \"暂无项目。请先在工作区添加项目。\",\n \"designContractSelectProject\": \"选择项目\",\n \"designContractPickPlaceholder\": \"— 选择项目 —\",\n \"designContractPickProjectHint\": \"请在上方下拉框选择一个项目,开始配置设计合约。\",\n \"tabRulesContext\": \"规则与上下文\",\n \"rulesContextPickProjectHint\": \"请在上方下拉框选择一个项目,查看关联的规则片段与上下文文件。\"\n },\n \"rulesContext\": {\n \"title\": \"项目规则\",\n \"hint\": \"已关联到当前项目的规则片段。带 Glob 的规则仅在匹配文件存在时生效。\",\n \"empty\": \"暂无已关联的规则。在 Agent 配置 > Prompts 中创建规则片段,然后在项目详情中关联。\",\n \"fragment\": \"片段\",\n \"allTargets\": \"所有工具\",\n \"universal\": \"全局\",\n \"contextFiles\": \"上下文文件\",\n \"contextFilesHint\": \"项目同步时为各 AI 工具生成的上下文文件。仅关联了 Prompt 的工具会生成文件。\",\n \"willSync\": \"将同步\",\n \"managed\": \"已托管\",\n \"userCreated\": \"用户自建\",\n \"pendingSync\": \"待同步\",\n \"notLinked\": \"未关联\"\n },\n \"recipeComposer\": {\n \"title\": \"变更执行方案\",\n \"hybrid\": \"YAML+Markdown 混合格式\",\n \"loading\": \"加载变更执行方案中...\",\n \"preset\": \"流程档位\",\n \"projectType\": \"项目类型\",\n \"projectTypeBackend\": \"后端\",\n \"projectTypeFrontend\": \"前端\",\n \"projectTypeCli\": \"命令行\",\n \"recipeName\": \"方案名称\",\n \"recipeNamePlaceholder\": \"我的变更执行方案\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"基于标准流程的变更执行方案\",\n \"stageGraph\": \"阶段图\",\n \"nodesCount\": \"{{count}} 个节点\",\n \"modules\": \"模块\",\n \"stages\": \"阶段\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 已启用\",\n \"notes\": \"备注(可选)\",\n \"notesPlaceholder\": \"为该变更执行方案添加备注...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"如 feat-auth、fix-login-bug\",\n \"preview\": \"预览\",\n \"copy\": \"复制\",\n \"export\": \"导出执行方案\",\n \"install\": \"安装到项目\",\n \"installedSummary\": \"已安装:创建 {{created}} 个文件\",\n \"installedSkipped\": \",跳过 {{skipped}} 个已存在文件\",\n \"exists\": \"(已存在)\",\n \"previewTitle\": \"预览(YAML+Markdown 混合格式)\",\n \"collapse\": \"收起\",\n \"savedRecipes\": \"已保存的执行方案\",\n \"fitWidth\": \"适应宽度\",\n \"actualSize\": \"实际大小\",\n \"lateral\": \"横向(跨领域)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"半独立\",\n \"legendBranch\": \"分支\",\n \"legendNoArtifacts\": \"无产物\",\n \"toastExported\": \"变更执行方案「{{name}}」已导出到 .opensunstar/recipe/\",\n \"toastCopied\": \"变更执行方案内容已复制到剪贴板\",\n \"toastCopyFailed\": \"复制失败\",\n \"toastChangeIdRequired\": \"请填写 Change ID(如 feat-auth)\",\n \"toastInstalled\": \"变更执行方案已安装到项目:创建 {{created}} 个文件\",\n \"toastDeleted\": \"变更执行方案「{{name}}」已删除\"\n },\n \"designContract\": {\n \"title\": \"设计合约\",\n \"name\": \"合约名称\",\n \"description\": \"描述\",\n \"templates\": \"模板\",\n \"tokens\": \"令牌\",\n \"preview\": \"预览\",\n \"import\": \"导入\",\n \"colors\": \"颜色\",\n \"typography\": \"字体\",\n \"spacing\": \"间距基数 (px)\",\n \"copy\": \"复制\",\n \"copied\": \"已复制到剪贴板\",\n \"exported\": \"已导出\",\n \"installed\": \"已安装\",\n \"loadingTemplate\": \"加载模板中...\",\n \"noPreview\": \"点击预览生成 DESIGN.md\",\n \"importFile\": \"从文件导入\",\n \"pickFile\": \"选择 DESIGN.md 文件...\",\n \"importUrl\": \"从 URL 导入\",\n \"previewBtn\": \"预览\",\n \"copyBtn\": \"复制\",\n \"exportBtn\": \"导出\",\n \"installBtn\": \"安装到项目\",\n \"installResult\": \"已安装\",\n \"filesCreated\": \"个文件已创建\",\n \"filesSkipped\": \"已跳过\",\n \"exists\": \"已存在\",\n \"confirmExport\": \"确认覆盖导出\",\n \"confirmExportTitle\": \"确认覆盖导出设计规范\",\n \"exportOverwriteBtn\": \"覆盖导出 DESIGN.md\",\n \"verifyBtn\": \"验证项目产物\"\n },\n \"installConfirm\": {\n \"title\": \"确认安装到项目\",\n \"auditScan\": \"安全审计扫描\",\n \"filesScanned\": \"文件已扫描\",\n \"noFindings\": \"未发现安全问题。\",\n \"auditBlocked\": \"安全审计发现 CRITICAL 级别问题,安装已被阻断。请修复后重试。\",\n \"fileList\": \"文件清单\",\n \"toCreate\": \"将创建\",\n \"toSkip\": \"已存在跳过\",\n \"create\": \"创建\",\n \"skip\": \"跳过\",\n \"existing\": \"现有内容\",\n \"wouldOverwrite\": \"将覆盖为 (当前跳过)\",\n \"newContent\": \"新内容\",\n \"cancel\": \"取消\",\n \"confirmInstall\": \"确认安装\",\n \"overwrite\": \"覆盖\",\n \"toOverwrite\": \"将覆盖\",\n \"willOverwrite\": \"将覆盖为\"\n },\n \"sync\": {\n \"waiting\": \"等待变更\",\n \"syncing\": \"同步中...\",\n \"synced\": \"已同步\",\n \"failed\": \"同步失败\",\n \"disabled\": \"未启用\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}}分钟前\",\n \"hoursAgo\": \"{{count}}小时前\",\n \"daysAgo\": \"{{count}}天前\"\n },\n \"repairPreview\": {\n \"title\": \"配置修复预览\",\n \"description\": \"项目「{{name}}」共 {{count}} 项配置不一致,勾选需要修复的项:\",\n \"loading\": \"正在扫描待处理项…\",\n \"empty\": \"未发现配置不一致,无需修复\",\n \"selectAll\": \"全选\",\n \"deselectAll\": \"取消全选\",\n \"safetyHint\": \"{{count}} 项为安全关键项(Ignore/Permissions/Hooks),修复将覆盖访问控制或命令执行配置\",\n \"safetyCriticalTooltip\": \"安全关键项:修复将覆盖访问控制或命令执行相关配置\",\n \"safetyBadge\": \"安全关键\",\n \"confirmAction\": \"修复选中项({{count}})\",\n \"repairing\": \"修复中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 配置状态\",\n \"subtitle\": \"每个格子显示一类 AI 配置的短状态:已生效、不一致、缺失、全局、探测、未扫、不适用。点击查看详情。\",\n \"project\": \"项目\",\n \"stage\": \"阶段\",\n \"score\": \"分数\",\n \"loading\": \"正在扫描项目配置状态…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"需关注\",\n \"abnormal\": \"异常\",\n \"unscanned\": \"未扫描\",\n \"hasIssue\": \"需处理\",\n \"showProblemsOnly\": \"只看需处理\",\n \"filterLabel\": \"项目状态筛选\",\n \"filterAll\": \"全部\",\n \"filterNeedsAction\": \"需处理\",\n \"filterAbnormal\": \"异常\",\n \"filterUnscanned\": \"未扫\",\n \"allClear\": \"当前筛选下没有需要处理的项目\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"已生效\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"缺失\",\n \"cellGlobal\": \"全局\",\n \"cellDetected\": \"探测\",\n \"cellPartial\": \"部分\",\n \"cellWarn\": \"需关注\",\n \"cellCrit\": \"异常\",\n \"cellUnscanned\": \"未扫\",\n \"cellNA\": \"不适用\",\n \"cellRecent\": \"有更新\",\n \"cellStale\": \"无更新\",\n \"colUpkeep\": \"维护度\",\n \"colUpkeepTitle\": \"近 90 天项目资产关联更新\",\n \"linkedCount\": \"OpenSunstar 已关联\",\n \"linkedCountValue\": \"{{value}} 项\",\n \"detailRecentUpdates\": \"统计近 90 天内是否有项目级 AI 资产配置变更\",\n \"safetyBadge\": \"安全关键\",\n \"noData\": \"暂无扫描数据\",\n \"scanPending\": \"尚未完成扫描,当前状态不能判定为正常。\",\n \"detailEffective\": \"配置已生效,与 OpenSunstar 库一致\",\n \"detailDrifted\": \"配置与预期不一致,可能需要修复\",\n \"detailUnscanned\": \"已发现配置,但暂未完成目标 CLI 生效状态比对\",\n \"detailGlobal\": \"使用全局默认配置,项目级未自定义\",\n \"detailDetected\": \"检测到仓库中有配置,但未被 OpenSunstar 管理\",\n \"detailMissingSafety\": \"安全关键项未配置,建议尽快设置\",\n \"detailMissing\": \"未配置此项,如果不需要可忽略\",\n \"detailPartial\": \"部分配置,建议完善\",\n \"detailNA\": \"当前目标 CLI 不支持此项\",\n \"detailUnmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"statusOk\": \"配置正常\",\n \"statusWarn\": \"需要关注\",\n \"statusCrit\": \"存在异常\",\n \"statusUnscanned\": \"未完成扫描\",\n \"statusNA\": \"不适用\",\n \"stateDetail\": \"状态详情\",\n \"driftDetail\": \"状态详情\",\n \"checkDetail\": \"检查详情\",\n \"filePath\": \"配置文件路径\",\n \"viewProject\": \"查看项目资产\",\n \"goRepair\": \"去修复\"\n },\n \"portfolioNotice\": {\n \"title\": \"部分数据没读到,下面的「未扫 / 未配置 / 缺失」不代表磁盘上真的缺失。\",\n \"readinessFailed\": \"{{failed}}/{{total}} 个项目的就绪度读取失败\",\n \"assetFailed\": \"资产统计失败:{{reason}}\",\n \"retry\": \"重试\"\n },\n \"scope\": {\n \"globalEnabled\": \"全局已启用\",\n \"globalNotEnabled\": \"全局未启用\",\n \"activeProject\": \"项目:{{name}}\",\n \"backToProject\": \"返回项目:{{name}}\",\n \"globalScope\": \"全局\",\n \"projectScope\": \"项目级\",\n \"globalToast\": \"已为 {{app}} 全局启用\",\n \"globalDisableToast\": \"已为 {{app}} 全局停用\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"跨设备云同步\",\n \"subtitle\": \"配置数据在多台设备间实时同步,随时随地保持一致的开发环境\",\n \"status\": \"同步状态\",\n \"backend\": \"同步后端\",\n \"notConfigured\": \"未配置\",\n \"notConfiguredHint\": \"请先在设置中配置云同步后端(WebDAV / S3 / GitHub Gist)\",\n \"goSettings\": \"前往同步设置\",\n \"lastSync\": \"上次同步\",\n \"never\": \"从未同步\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 对象存储\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"已启用\",\n \"disabled\": \"未启用\",\n \"autoSync\": \"自动同步\",\n \"on\": \"开\",\n \"off\": \"关\",\n \"description\": \"云同步解决的是「空间轴」问题——配置在多台设备间保持一致。与项目环境快照(时间轴·版本回溯)互为补充,按需选用。\"\n },\n \"aiProvider\": {\n \"apiUrl\": \"API 地址\",\n \"configured\": \"已配置\",\n \"custom\": \"自定义\",\n \"customDescription\": \"兼容 OpenAI 格式的任意 API。填入端点地址、模型名和 API Key 即可。\",\n \"customTitle\": \"自定义\",\n \"description\": \"选择用于项目看板 AI 能力的模型提供方。DeepSeek 使用 deepseek-chat,GLM 使用智谱模型。密钥仅保存在本机。\",\n \"model\": \"模型\",\n \"saved\": \"DeepSeek 配置已保存\",\n \"testConnection\": \"测试连接\",\n \"title\": \"AI 提供方\"\n },\n \"flowOrchestrator\": {\n \"activity\": \"最近编排操作\",\n \"advancedDetails\": \"高级详情:CI 命令与生成文件\",\n \"checkGate\": \"检查\",\n \"ciSnippet\": \"GitHub Actions / 自动检查片段\",\n \"ciSnippetCopied\": \"已复制 CI 门禁片段\",\n \"confirmFlowConfig\": \"确认导出\",\n \"confirmFlowConfigTitle\": \"确认导出 CI 检查配置\",\n \"confirmProfile\": \"确认保存\",\n \"confirmProfileTitle\": \"确认保存项目流程\",\n \"exportCiConfig\": \"导出 CI 检查配置\",\n \"exportOk\": \"已导出 .opensunstar/workflow.profile.json\",\n \"flowConfigOk\": \"已导出 .opensunstar/flow-config.yaml (R9.6 安全阀已注入)\",\n \"gateBlock\": \"缺少工件\",\n \"gatePass\": \"可通过\",\n \"loading\": \"加载流程预设…\",\n \"loopHint\": \"先保存项目工作规则,再生成变更材料,最后接入自动检查;高级文件细节可在下方展开查看。\",\n \"loopTitle\": \"让项目规则真正生效\",\n \"missingArtifacts\": \"缺: {{list}}\",\n \"modules\": \"高级:选择规则模块\",\n \"noActivity\": \"暂无编排操作。保存流程、生成自动检查配置或运行检查后会显示在这里。\",\n \"noChanges\": \"暂无 change 目录。复制 flow-kit 并在 .specs/<id>/ 下创建工件。\",\n \"pathInvalid\": \"路径无效\",\n \"pickChange\": \"请先选择 change\",\n \"preset\": \"流程档位\",\n \"projectType\": \"项目类型\",\n \"r96Summary\": \"R9.6: max_retry={{retry}}, role_sep={{sep}}, diff_boundary={{diff}}\",\n \"rescan\": \"刷新索引\",\n \"rollbackLatest\": \"恢复上次编排\",\n \"rollbackOk\": \"已恢复最近一次编排变更({{count}} 个文件操作)\",\n \"saveProjectFlow\": \"保存项目流程\",\n \"specsIndex\": \".specs 变更索引\",\n \"stageGate\": \"阶段门禁试算 (R2.7)\",\n \"stages\": \"高级:调整执行步骤\",\n \"stepCi\": \"3. 接入门禁校验\",\n \"stepCiDone\": \"自动检查规则已生成\",\n \"stepCiTodo\": \"导出 CI 检查配置并复制命令\",\n \"stepProfile\": \"1. 保存项目流程\",\n \"stepProfileDone\": \"项目工作规则已保存\",\n \"stepProfileTodo\": \"选择档位、模块和阶段后保存\",\n \"stepSpecs\": \"2. 生成变更材料\",\n \"stepSpecsDone\": \"已检测到 .specs 变更工件\",\n \"stepSpecsTodo\": \"到“变更执行方案”生成 .specs\",\n \"strictMode\": \"发现明显冲突时先拦住\",\n \"strictModeHint\": \"默认开启。适合团队协作;探索期可关闭,先生成文件再人工确认。\",\n \"subtitle\": \"flow-kit 兼容 · 档位 + 模块 + .specs 索引 + 阶段门禁\",\n \"tasks\": \"任务 {{done}}/{{total}} 完成\",\n \"title\": \"项目工作规则\"\n },\n \"projectEnvironment\": {\n \"hint\": \"保存当前供应商、MCP、Skills 与 Prompt 激活状态;应用前预览差异,应用后写入验证回执并可回滚。\",\n \"title\": \"项目环境快照\"\n },\n \"projects\": {\n \"addDescription\": \"添加本地项目仓库到侧边栏,方便快速切换管理\",\n \"addTitle\": \"添加项目\",\n \"browseFolder\": \"浏览文件夹\",\n \"descLabel\": \"项目描述\",\n \"descPlaceholder\": \"简要描述项目用途、技术栈或当前目标\",\n \"manualPathHint\": \"请手动输入项目路径\",\n \"nameLabel\": \"项目名称\",\n \"namePlaceholder\": \"例如:我的项目\",\n \"pathLabel\": \"本地路径\",\n \"pathPlaceholder\": \"例如:D:\\\\projects\\\\my-repo\",\n \"validation\": {\n \"nameRequired\": \"请输入项目名称\",\n \"pathRequired\": \"请输入项目路径\"\n }\n },\n \"shortcuts\": {\n \"footer\": \"按 ? 或 Ctrl+/ 随时呼出此面板\",\n \"general\": \"通用\",\n \"goBack\": \"返回上一级 / 关闭弹窗\",\n \"kanban\": \"看板总览\",\n \"layout\": \"布局\",\n \"navigation\": \"导航\",\n \"sessions\": \"Context\",\n \"showHelp\": \"显示/隐藏此面板\",\n \"title\": \"键盘快捷键\",\n \"toggleSidebar\": \"折叠/展开侧边栏\",\n \"tokenStats\": \"AI Tokens\"\n },\n \"time\": {\n \"daysAgo\": \"{{n}} 天前\",\n \"hoursAgo\": \"{{n}} 小时前\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{n}} 分钟前\"\n },\n \"tokenStats\": {\n \"description\": \"Token 用量统计与费用分析\"\n },\n \"projectAiConfig\": {\n \"emptyProjects\": \"还没有添加项目,先添加一个再来配置 AI 资产。\",\n \"openWorkflow\": \"配置项目工作流\",\n \"orchestrationHint\": \"阶段、预设与变更执行方案在「流程与方法论」里配置,会带着当前项目跳过去。\",\n \"orchestrationLink\": \"工作流编排\",\n \"subtitle\": \"为单个项目落地 AI 资产:套用蓝图、检查就绪度、勾选生效的资产。侧栏「Agent 配置」管的是全局库,这里管它们在本项目上的关联。\",\n \"switcher\": \"当前配置项目\",\n \"targetCli\": \"目标 CLI\",\n \"tabs\": {\n \"assets\": \"资产关联\",\n \"readiness\": \"就绪与生效\",\n \"environment\": \"项目环境 & Wiki\"\n },\n \"title\": \"AI资产配置\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} 次分析\",\n \"cachedFree\": \"¥0(缓存)\",\n \"chartApiCalls\": \"API 调用\",\n \"chartCost\": \"费用\",\n \"chartNlQuery\": \"NL 问答\",\n \"colCost\": \"费用\",\n \"colCount\": \"次数\",\n \"colTokens\": \"Token\",\n \"colType\": \"类型\",\n \"disclaimer\": \"费用为基于公开定价的估算,以供应商账单为准。\",\n \"disclaimerCliSuffix\": \"CLI 代理用量见「设置 → 用量」。\",\n \"disclaimerShort\": \"估算 · 以供应商账单为准\",\n \"emptyRoi\": \"近 {{days}} 天尚无 AI 调用记录。触发摘要、风险分析或 NL 问答后将在此展示 ROI。\",\n \"estimatedSuffix\": \"估算\",\n \"lastCall\": \"本次\",\n \"loadingRoi\": \"加载 ROI 数据…\",\n \"monthTotal\": \"本月累计\",\n \"monthTotalFailed\": \"本月累计查询失败(未知,不是 ¥0)\",\n \"monthTotalLoading\": \"本月累计 统计中…\",\n \"nlQueryCount\": \"{{queries}} 次问答\",\n \"panelTitle\": \"AI 成本-价值追踪\",\n \"projectRisks\": \"{{risks}} 项风险\",\n \"projectScope\": \"{{projects}} 个项目\",\n \"projectUseful\": \"{{useful}} 次有用\",\n \"rangeDays\": \"{{days}} 天\",\n \"roiReport\": \"AI 投入报告\",\n \"sectionByProject\": \"按项目(消耗 ↔ 价值)\",\n \"sectionByType\": \"按分析类型\",\n \"statRisks\": \"发现风险\",\n \"statTokens\": \"Token\",\n \"statTotalSpend\": \"总投入\",\n \"statUseful\": \"标记有用\",\n \"stripTitle\": \"AI 成本透明\",\n \"trendTitle\": \"每日 AI 投入趋势\",\n \"unknownPricing\": \"单价未知\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI 反馈\",\n \"markNotUseful\": \"标记为无用\",\n \"markUseful\": \"标记为有用\",\n \"notUseful\": \"无用\",\n \"useful\": \"有用\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 就绪度\",\n \"health\": \"健康评分\",\n \"nlQuery\": \"自然语言查询\",\n \"portfolioSummary\": \"组合周报\",\n \"progress\": \"进度估算\",\n \"riskAnalysis\": \"风险分析\",\n \"summary\": \"项目摘要\",\n \"trendAnalysis\": \"趋势分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI 回答\",\n \"costFailed\": \"成本统计查询失败(未知,不是 ¥0)\",\n \"detailToggle\": \"近 {{days}} 天分析明细\",\n \"guarding\": \"AI 正在守护\",\n \"inputLabel\": \"向 AI 提问\",\n \"notConfigured\": \"AI 问答与成本统计尚未启用 —— 在「设置 → AI 提供方」填入 API Key 后,这里会出现自然语言提问入口。\",\n \"placeholder\": \"向 AI 提问,如:哪个项目最近不活跃?帮我生成本周总结\",\n \"projectsUnit\": \"个项目\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"问答\",\n \"typeRisk\": \"风险\",\n \"typeSummary\": \"摘要\",\n \"typeTrend\": \"趋势\",\n \"typeWeekly\": \"周报\"\n },\n \"risk\": {\n \"analyze\": \"分析风险\",\n \"analyzing\": \"正在分析风险…\",\n \"levelHigh\": \"高风险\",\n \"levelLow\": \"低风险\",\n \"levelMedium\": \"中风险\",\n \"none\": \"项目状态健康,暂未发现风险\",\n \"sectionTitle\": \"风险分析\",\n \"title\": \"AI 风险分析\",\n \"typeActivity\": \"活跃度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"进度\",\n \"typeTechDebt\": \"技术债\"\n },\n \"weekly\": {\n \"analyzing\": \"正在分析 {{projects}} 个项目数据…\",\n \"cached\": \"缓存\",\n \"copied\": \"已复制\",\n \"copyFailed\": \"复制失败\",\n \"copySuccess\": \"周报已复制到剪贴板\",\n \"dialogTitle\": \"AI 智能周报\",\n \"errorGenerate\": \"周报生成失败,请稍后重试。\",\n \"errorNoProvider\": \"未配置 AI 提供方,请先在设置中配置 AI Key。\",\n \"generate\": \"生成周报\",\n \"windowDays\": \"{{days}}天\",\n \"windowHint\": \"· 近 {{days}} 天数据\"\n }\n }\n}\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785846934.3967957, "n": 158575, "h": "d266a7e241bab994", "c": "{\n \"projectWiki\": {\n \"title\": \"项目 Wiki / 知识基线\",\n \"subtitle\": \"可被人类与 Agent 共同消费的工程知识基线\",\n \"loading\": \"正在扫描 Wiki…\",\n \"notInitialized\": \"未检测到 wiki/index.md\",\n \"pageCount\": \"{{count}} 个页面\",\n \"sourceRefs\": \"{{count}} 个源码引用\",\n \"questions\": \"{{count}} 个待查\",\n \"lastUpdated\": \"最近更新\",\n \"status\": {\n \"missing\": \"未初始化\",\n \"scaffolded\": \"已初始化\",\n \"effective\": \"新鲜\",\n \"drifted\": \"已变更\",\n \"invalid\": \"Lint 失败\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · 快速入门\",\n \"L2\": \"L2 · 接口对接\",\n \"L3\": \"L3 · 运维排障\"\n },\n \"coverage\": {\n \"corePages\": \"核心页面\",\n \"componentPages\": \"组件\",\n \"flowPages\": \"流程\",\n \"apiPages\": \"接口\",\n \"runbookPages\": \"运维手册\"\n },\n \"actions\": {\n \"init\": \"初始化 Wiki\",\n \"lint\": \"运行 Lint 校验\",\n \"refresh\": \"刷新\",\n \"openInEditor\": \"在编辑器中打开\",\n \"previewInit\": \"预览初始化\",\n \"toggleQuality\": \"切换 quality 模式\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 刚初始化,变更映射尚未生效\",\n \"coldStartProgress\": \"当前有效 source_files 页面:{{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"请点击“生成项目 Wiki”,使用设置中的 AI 提供方生成并验收\",\n \"affectedPages\": \"{{count}} 个源码变更,影响 {{pages}} 个 wiki 页面\",\n \"unmapped\": \"{{count}} 个未映射变更\",\n \"noChanges\": \"无源码变更,wiki 页面均为最新\"\n },\n \"lint\": {\n \"passed\": \"Lint 通过\",\n \"failed\": \"Lint 失败:{{errors}} 个错误\",\n \"warnings\": \"{{count}} 个警告\",\n \"qualityLevel\": \"质量等级:{{level}}\",\n \"errors\": \"错误\",\n \"more\": \"还有 {{count}} 条\",\n \"noFiles\": \"无 Wiki 文件可检查\",\n \"summary\": \"{{files}} 文件 / {{errors}} 错误 / {{warnings}} 警告 / 等级 {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初始化预检\",\n \"willCreate\": \"将创建 {{count}} 个文件\",\n \"alreadyExists\": \"{{count}} 个文件已存在(将跳过)\",\n \"confirm\": \"确认初始化\",\n \"success\": \"Wiki 初始化完成,已创建 {{count}} 个文件\",\n \"blocked\": \"安全审计阻断\"\n },\n \"changed\": {\n \"affectedPages\": \"影响页面\",\n \"changedFiles\": \"变更\",\n \"coldStart\": \"冷启动态\",\n \"title\": \"变更映射\",\n \"unmapped\": \"未映射\"\n },\n \"accept\": {\n \"success\": \"Wiki 已验收,并已建立 Commit 同步基线\"\n },\n \"candidates\": {\n \"importSuccess\": \"已导入 {{count}} 个文件,正式 Wiki 已进入待验收状态\"\n },\n \"generator\": {\n \"success\": \"项目 Wiki 已生成并导入,共 {{count}} 个页面,请继续验收\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code / Codex / Gemini CLI 全方位辅助工具\"\n },\n \"common\": {\n \"add\": \"添加\",\n \"edit\": \"编辑\",\n \"delete\": \"删除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"取消\",\n \"confirm\": \"确定\",\n \"close\": \"关闭\",\n \"done\": \"完成\",\n \"settings\": \"设置\",\n \"about\": \"关于\",\n \"version\": \"版本\",\n \"loading\": \"加载中...\",\n \"notInstalled\": \"未安装\",\n \"success\": \"成功\",\n \"error\": \"错误\",\n \"unknown\": \"未知\",\n \"enterValidValue\": \"请输入有效的内容\",\n \"clear\": \"清除\",\n \"toggleTheme\": \"切换主题\",\n \"format\": \"格式化\",\n \"formatSuccess\": \"格式化成功\",\n \"formatError\": \"格式化失败:{{error}}\",\n \"copy\": \"复制\",\n \"view\": \"查看\",\n \"back\": \"返回\",\n \"refresh\": \"刷新\",\n \"refreshing\": \"刷新中...\",\n \"import\": \"导入\",\n \"all\": \"全部\",\n \"search\": \"查询\",\n \"reset\": \"重置\",\n \"actions\": \"操作\",\n \"deleting\": \"删除中...\",\n \"auto\": \"自动\",\n \"enabled\": \"已开启\",\n \"notSet\": \"未设置\",\n \"darkMode\": \"切换深色模式\",\n \"lightMode\": \"切换浅色模式\",\n \"next\": \"下一步\",\n \"optional\": \"可选\",\n \"previous\": \"上一页\",\n \"retry\": \"重试\",\n \"unknownError\": \"未知错误\"\n },\n \"firstRunNotice\": {\n \"title\": \"欢迎使用 OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar 可以帮你在 Claude Code / Codex / Gemini CLI 的多个供应商之间一键切换。如果你之前已经配置过这些工具,OpenSunstar 会自动把现有设置保存为名为 “default” 的供应商,保证你的配置不会丢失。\",\n \"bodyOfficial\": \"列表里还预置了 “官方(Official)” 供应商,随时点一下即可切回官方默认配置。切换前 OpenSunstar 会自动把当前配置备份回 default,可以放心来回切。OpenSunstar 就是这样工作的 😊\",\n \"confirm\": \"我知道了\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"请输入API Key\",\n \"show\": \"显示API Key\",\n \"hide\": \"隐藏API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"配置必须是JSON对象,不能是数组或其他类型\",\n \"invalidJson\": \"JSON格式错误\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"什么是通用配置片段?\",\n \"guidePurpose\": \"用来在不同供应商之间共享插件、环境变量等非敏感配置。切换供应商时不会丢失这些设置。\",\n \"guideUsage\": \"用法:① 点击「从编辑内容提取」保存通用部分 ② 新建供应商时勾选「写入通用配置」\",\n \"guideReExtract\": \"如果您新安装了插件或 Hook,请重新提取一次通用配置,以便同步到其他供应商。\",\n \"guideReassurance\": \"放心:您的原始配置已保存在默认供应商中,不会丢失。\",\n \"emptyTitle\": \"还没有通用配置片段\",\n \"emptyHint\": \"点击下方「从编辑内容提取」按钮,从当前配置中提取可复用的部分\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code 配置 (JSON) *\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑通用配置片段\",\n \"commonConfigHint\": \"该片段会在勾选\\\"写入通用配置\\\"时合并到 settings.json 中\",\n \"fullSettingsHint\": \"完整的 Claude Code settings.json 配置内容\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"hideAttribution\": \"隐藏 AI 署名\",\n \"enableTeammates\": \"Teammates 模式\",\n \"enableToolSearch\": \"启用 Tool Search\",\n \"effortMax\": \"最大强度思考\",\n \"disableAutoUpgrade\": \"禁用自动升级\"\n },\n \"header\": {\n \"viewOnGithub\": \"在 GitHub 上查看\",\n \"toggleDarkMode\": \"切换到暗色模式\",\n \"toggleLightMode\": \"切换到亮色模式\",\n \"addProvider\": \"添加供应商\",\n \"switchToChinese\": \"切换到中文\",\n \"switchToEnglish\": \"切换到英文\",\n \"enterEditMode\": \"进入编辑模式\",\n \"exitEditMode\": \"退出编辑模式\",\n \"windowMinimize\": \"最小化窗口\",\n \"windowMaximize\": \"最大化窗口\",\n \"windowRestore\": \"还原窗口\",\n \"windowClose\": \"关闭窗口\"\n },\n \"provider\": {\n \"tabProvider\": \"供应商\",\n \"tabUniversal\": \"统一供应商\",\n \"noProviders\": \"还没有添加任何供应商\",\n \"noProvidersDescription\": \"如果你已有配置,请点击\\\"导入当前配置\\\",所有数据将安全保存在 default 供应商中\",\n \"noProvidersDescriptionSnippet\": \"除 Key 和请求地址外的数据(如插件配置)会被保存到通用配置片段,用于在不同供应商之间共享\",\n \"importCurrent\": \"导入当前配置\",\n \"importFromClaude\": \"将 Claude Code 中已有的供应商导入\",\n \"importCurrentDescription\": \"将当前正在使用的配置导入为默认供应商\",\n \"currentlyUsing\": \"当前使用\",\n \"enable\": \"启用\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"代理接管模式下不可切换到官方供应商\",\n \"editProvider\": \"编辑供应商\",\n \"editProviderHint\": \"更新配置后将立即应用到当前供应商。\",\n \"deleteProvider\": \"删除供应商\",\n \"addNewProvider\": \"添加新供应商\",\n \"addClaudeProvider\": \"添加 Claude Code 供应商\",\n \"addCodexProvider\": \"添加 Codex 供应商\",\n \"addGeminiProvider\": \"添加 Gemini 供应商\",\n \"addOpenCodeProvider\": \"添加 OpenCode 供应商\",\n \"addToConfig\": \"添加\",\n \"removeFromConfig\": \"移除\",\n \"setAsDefault\": \"设为默认\",\n \"isDefault\": \"当前默认\",\n \"inConfig\": \"已添加\",\n \"addProviderHint\": \"填写信息后即可在列表中快速切换供应商。\",\n \"editClaudeProvider\": \"编辑 Claude Code 供应商\",\n \"editCodexProvider\": \"编辑 Codex 供应商\",\n \"configError\": \"配置错误\",\n \"notConfigured\": \"未配置官网地址\",\n \"applyToClaudePlugin\": \"应用到 Claude 插件\",\n \"removeFromClaudePlugin\": \"从 Claude 插件移除\",\n \"dragToReorder\": \"拖拽以重新排序\",\n \"dragHandle\": \"拖拽排序\",\n \"searchPlaceholder\": \"按名称/备注/网址搜索供应商...\",\n \"searchAriaLabel\": \"搜索供应商\",\n \"searchScopeHint\": \"根据名称、备注和官网链接匹配结果。\",\n \"searchCloseHint\": \"按 Esc 关闭\",\n \"searchCloseAriaLabel\": \"关闭供应商搜索\",\n \"noSearchResults\": \"没有符合搜索条件的供应商。\",\n \"duplicate\": \"复制\",\n \"sortUpdateFailed\": \"排序更新失败\",\n \"configureUsage\": \"配置用量查询\",\n \"officialPartner\": \"官方合作伙伴\",\n \"managedByHermes\": \"Hermes 托管\",\n \"managedByHermesHint\": \"该条目定义在 Hermes 的 providers: dict,请在 Hermes Web UI 中编辑或删除。\",\n \"openTerminal\": \"打开终端\",\n \"terminalOpened\": \"终端已打开\",\n \"terminalOpenFailed\": \"打开终端失败\",\n \"name\": \"供应商名称\",\n \"namePlaceholder\": \"例如:Claude 官方\",\n \"websiteUrl\": \"官网链接\",\n \"notes\": \"备注\",\n \"notesPlaceholder\": \"例如:公司专用账号\",\n \"configJson\": \"配置 JSON\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfigButton\": \"编辑通用配置\",\n \"configJsonHint\": \"请填写完整的 Claude Code 配置\",\n \"editCommonConfigTitle\": \"编辑通用配置片段\",\n \"editCommonConfigHint\": \"通用配置片段将合并到所有启用它的供应商配置中\",\n \"addProvider\": \"添加供应商\",\n \"sortUpdated\": \"排序已更新\",\n \"usageSaved\": \"用量查询配置已保存\",\n \"usageSaveFailed\": \"用量查询配置保存失败\",\n \"geminiConfig\": \"Gemini 配置\",\n \"geminiConfigHint\": \"使用 .env 格式配置 Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"模型\",\n \"oauthTitle\": \"OAuth 认证模式\",\n \"oauthHint\": \"Google 官方使用 OAuth 个人认证,无需填写 API Key。首次使用时会自动打开浏览器进行登录。\",\n \"apiKeyPlaceholder\": \"请输入 Gemini API Key\"\n }\n },\n \"activeProviderHint\": \"当前请求将使用此供应商\",\n \"activeRouteHint\": \"当前请求正通过本地路由使用此供应商\",\n \"copyName\": \"{{name}} 副本\",\n \"refreshing\": \"正在刷新供应商列表…\",\n \"routed\": \"路由中\"\n },\n \"claudeCode\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支持路由\"\n },\n \"codex\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支持路由\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop 官方供应商使用应用内置的 1P 登录,无需配置 API Key 和接口地址。\",\n \"mode\": \"模型处理方式\",\n \"modeDirect\": \"直连\",\n \"modeProxy\": \"需要路由\",\n \"modelMappingToggle\": \"需要模型映射\",\n \"modelMappingOffHint\": \"仅当供应商直接接受 Claude Desktop 可识别的三档角色 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)时才适用直连;其他模型名(含 claude-3-5-sonnet-… 等旧式 ID)请打开此开关走映射。\",\n \"modelMappingOnHint\": \"Claude Desktop 只接受 claude-sonnet-* / claude-opus-* / claude-haiku-* 三档角色 ID。开启后 OpenSunstar 会把这三档映射到供应商的实际模型,并在使用期间保持本地路由开启。\",\n \"routeMapTitle\": \"模型映射\",\n \"routeMapHint\": \"为 Sonnet、Opus、Haiku 三档分别填写实际请求模型;菜单显示名可写 DeepSeek、Kimi 等品牌名。留空的档会自动沿用 Sonnet(或第一个已填档)的模型,确保子 agent 调用的 Haiku 始终可用。\",\n \"routeModelLabel\": \"模型角色\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"菜单显示名\",\n \"upstreamModelLabel\": \"实际请求模型\",\n \"supports1mLabel\": \"声明支持 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"手动指定 Claude Desktop 模型列表(高级,可选)\",\n \"directModelListCollapsedHint\": \"原生 Claude 模型供应商通常不用填写,Claude Desktop 会自动读取 /v1/models。\",\n \"directModelListHint\": \"仅当供应商的 /v1/models 不可用或没有返回 Claude Desktop 可识别的 Sonnet / Opus / Haiku 模型名时填写;勾选 1M 会向 Claude Desktop 声明支持 1M 上下文。\",\n \"directModelInvalid\": \"直连模型必须使用 Claude Desktop 可识别的 Sonnet / Opus / Haiku 模型名\",\n \"addModel\": \"添加模型\",\n \"addRoute\": \"添加模型\",\n \"routeInvalid\": \"请选择模型角色并填写实际请求模型\",\n \"routesRequired\": \"至少填写一个模型映射\",\n \"statusTitle\": \"Claude Desktop 配置需要检查\",\n \"statusUnsupported\": \"当前平台暂不支持 Claude Desktop 3P 配置写入。\",\n \"statusStaleRawModels\": \"Claude Desktop profile 中存在非 Sonnet / Opus / Haiku 角色模型名,新版 Claude Desktop 可能拒绝加载;重新切换当前供应商可修复。\",\n \"statusMissingRouteMappings\": \"当前供应商启用了模型映射,但没有有效路由;请编辑供应商并补全至少一个模型映射。\",\n \"statusGatewayTokenMissing\": \"当前本地路由 token 尚未生成;重新切换该供应商会写入新的本地 token。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile 指向的地址与当前供应商不一致;当前为 {{actual}},应为 {{expected}}。重新切换当前供应商可修复。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop 本地路由已开启 - {{address}}:{{port}}\",\n \"inactive\": \"开启 Claude Desktop 本地路由,用于需要模型映射或格式转换的供应商。当前配置地址:{{address}}:{{port}}\"\n },\n \"stopBlockedByTakeover\": \"其它应用正在使用代理接管。请先在设置中关闭对应应用接管,再停止本地路由。\"\n }\n },\n \"notifications\": {\n \"providerAdded\": \"供应商已添加\",\n \"providerSaved\": \"供应商配置已保存\",\n \"providerDeleted\": \"供应商删除成功\",\n \"switchSuccess\": \"切换成功!\",\n \"codexRestartRequired\": \"切换成功,请重启客户端以生效\",\n \"claudeDesktopRestartRequired\": \"切换成功,重启 Claude Desktop 后生效\",\n \"claudeDesktopProxyRestartRequired\": \"切换成功,请保持 OpenSunstar 运行,并重启 Claude Desktop 后生效\",\n \"addToConfigSuccess\": \"已添加到配置\",\n \"removeFromConfigSuccess\": \"已从配置移除\",\n \"switchFailedTitle\": \"切换失败\",\n \"switchFailed\": \"切换失败:{{error}}\",\n \"autoImported\": \"已从现有配置创建默认供应商\",\n \"addFailed\": \"添加供应商失败:{{error}}\",\n \"saveFailed\": \"保存失败:{{error}}\",\n \"saveFailedGeneric\": \"保存失败,请重试\",\n \"appliedToClaudePlugin\": \"已应用到 Claude 插件\",\n \"removedFromClaudePlugin\": \"已从 Claude 插件移除\",\n \"syncClaudePluginFailed\": \"同步 Claude 插件失败\",\n \"skipClaudeOnboardingFailed\": \"跳过 Claude Code 初次安装确认失败\",\n \"clearClaudeOnboardingSkipFailed\": \"恢复 Claude Code 初次安装确认失败\",\n \"updateSuccess\": \"供应商更新成功\",\n \"updateFailed\": \"更新供应商失败:{{error}}\",\n \"deleteSuccess\": \"供应商已删除\",\n \"deleteFailed\": \"删除供应商失败:{{error}}\",\n \"settingsSaved\": \"设置已保存\",\n \"settingsSaveFailed\": \"保存设置失败:{{error}}\",\n \"proxyRequiredForSwitch\": \"此供应商{{reason}},需要路由服务才能正常使用,请先启动路由\",\n \"proxyReasonCopilot\": \"使用 GitHub Copilot 作为 Claude 供应商\",\n \"proxyReasonOpenAIChat\": \"使用 OpenAI Chat 接口格式\",\n \"proxyReasonOpenAIResponses\": \"使用 OpenAI Responses 接口格式\",\n \"proxyReasonFullUrl\": \"开启了完整 URL 连接模式\",\n \"openAIFormatHint\": \"此供应商使用 OpenAI 兼容格式,需要开启路由服务才能正常使用\",\n \"copilotProxyHint\": \"GitHub Copilot 作为 Claude 供应商时始终需要本地路由;路由会根据当前模型自动选择 Chat Completions 或 Responses。\",\n \"openLinkFailed\": \"链接打开失败\",\n \"openclawModelsRegistered\": \"模型已注册到 /model 列表\",\n \"openclawDefaultModelSet\": \"已设为默认模型\",\n \"openclawDefaultModelSetFailed\": \"设置默认模型失败\",\n \"openclawNoModels\": \"该供应商没有配置模型\",\n \"backfillWarning\": \"切换成功,但旧供应商配置回填失败,您手动修改的配置可能未保存\",\n \"windowControlFailed\": \"窗口控制失败:{{error}}\",\n \"officialBlockedByProxy\": \"本地路由模式下不能切换到官方供应商,使用路由访问官方 API 可能导致账号被封禁\",\n \"proxyOfficialWarning\": \"当前供应商 {{name}} 是官方供应商,建议切换到第三方供应商后再使用本地路由\",\n \"proxyReasonClaudeDesktop\": \"使用 Claude Desktop 本地路由模式\"\n },\n \"confirm\": {\n \"deleteProvider\": \"删除供应商\",\n \"deleteProviderMessage\": \"确定要删除供应商 \\\"{{name}}\\\" 吗?此操作无法撤销。\",\n \"removeProvider\": \"移除供应商\",\n \"removeProviderMessage\": \"确定要从配置中移除供应商 \\\"{{name}}\\\" 吗?\\n\\n移除后该供应商将不再生效,但配置数据会保留在 OpenSunstar 中,您可以随时重新添加。\",\n \"proxy\": {\n \"title\": \"启用本地路由服务\",\n \"message\": \"本地路由是一项高级功能,启用前请确保您已了解其工作原理。\\n\\n建议先查阅相关文档或咨询您的供应商,以获取正确的配置方式。\",\n \"confirm\": \"我已了解,继续启用\"\n },\n \"failover\": {\n \"title\": \"启用故障转移功能\",\n \"message\": \"故障转移是一项高级功能,启用前请确保您已了解其工作原理。\\n\\n建议先在故障转移队列中配置好供应商优先级。\",\n \"confirm\": \"我已了解,继续启用\"\n },\n \"usage\": {\n \"title\": \"配置用量查询\",\n \"message\": \"用量查询需要配置专用的查询脚本或 API 参数,请确保您已从供应商处获取相关信息。\\n\\n如不确定如何配置,请先查阅供应商文档。\",\n \"confirm\": \"我已了解,继续配置\"\n },\n \"streamCheck\": {\n \"title\": \"模型健康检测\",\n \"message\": \"健康检测通过直接发送 API 请求来测试供应商连通性,以下情况可能导致检测失败:\\n\\n• 官方供应商(使用 OAuth 登录,无独立 API Key)\\n• 部分中转服务(会校验请求是否来自 Claude Code CLI)\\n• AWS Bedrock(使用 IAM 签名认证)\\n\\n检测失败不代表供应商不可用,仅表示无法通过独立请求验证。请以应用内的实际情况为准。\",\n \"confirm\": \"我已了解,继续检测\"\n },\n \"autoSync\": {\n \"title\": \"开启自动同步\",\n \"message\": \"开启自动同步后,每次数据库变更都会自动上传到 WebDAV 服务器。\\n\\n这可能会产生较高的网络流量消耗,请确保您的网络环境和 WebDAV 服务支持频繁的数据传输。\",\n \"confirm\": \"我已了解,继续开启\"\n },\n \"commonConfig\": {\n \"title\": \"关于通用配置\",\n \"message\": \"「通用配置片段」可以在不同供应商之间共享插件、环境变量等配置,避免切换供应商时丢失这些设置。\\n\\n使用方法:\\n① 编辑供应商时点击「编辑通用配置」→「从编辑内容提取」\\n② 新建供应商时勾选「写入通用配置」(默认已勾选)\\n\\n如果您新安装了插件或 Hook,请重新提取一次通用配置。\",\n \"confirm\": \"我知道了\"\n }\n },\n \"settings\": {\n \"title\": \"设置\",\n \"general\": \"通用\",\n \"tabGeneral\": \"通用\",\n \"tabAuth\": \"认证\",\n \"tabAdvanced\": \"高级\",\n \"tabProxy\": \"路由\",\n \"authCenter\": {\n \"title\": \"认证中心\",\n \"description\": \"把第三方 Key 与官方订阅登录拆成两条认证轨道,帮助你识别每个 CLI 当前依赖的凭据来源。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"本地 CLI 登录状态\",\n \"readonlyProbe\": \"只读探测\",\n \"localCliDescription\": \"区分第三方 Key 与官方订阅登录,只披露本地状态信号,不接管 Claude 或 Google 账号凭据。\",\n \"localCliLoading\": \"正在读取本地 CLI 授权状态…\",\n \"managedAccountsTitle\": \"托管账号\",\n \"managedAccountsDescription\": \"由 OpenSunstar 管理的账号登录,可绑定到对应 Provider 或本地代理链路。\",\n \"copilotDescription\": \"管理 GitHub Copilot 账号\",\n \"codexOauthDescription\": \"管理 ChatGPT 账号\",\n \"defaultAccount\": \"默认\",\n \"localCliProfile\": \"本机 CLI 当前会话\",\n \"managedOauth\": \"OpenSunstar 托管 OAuth\",\n \"noSubscriptionAccount\": \"尚未发现可用订阅账号\",\n \"sourceLocal\": \"本机 CLI 当前会话\",\n \"sourceManaged\": \"托管 OAuth\",\n \"subscriptionAccountsDescription\": \"查看官方订阅的额度、重置时间与健康状态。仅托管的多账号支持默认标记;这里不绑定项目或第三方 API Key。\",\n \"subscriptionAccountsFailed\": \"无法读取订阅账号状态,请刷新后重试。\",\n \"subscriptionAccountsLoading\": \"正在并发读取订阅账号状态…\",\n \"subscriptionAccountsTitle\": \"订阅账号\",\n \"xaiOauthDescription\": \"管理 xAI / Grok 账号\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"配置文件目录\",\n \"description\": \"管理 Claude、Codex 和 Gemini 的配置存储路径\"\n },\n \"proxy\": {\n \"title\": \"本地路由\",\n \"description\": \"控制路由服务开关、查看状态与端口信息\",\n \"enableFeature\": \"在主页面显示本地路由开关\",\n \"enableFeatureDescription\": \"开启后,主页面顶部将显示路由和故障转移开关\",\n \"enableFailoverToggle\": \"在主页面显示故障转移开关\",\n \"enableFailoverToggleDescription\": \"开启后,主页面顶部将独立显示故障转移开关\",\n \"running\": \"运行中\",\n \"stopped\": \"已停止\"\n },\n \"modelTest\": {\n \"title\": \"模型测试配置\",\n \"description\": \"配置模型测试使用的默认模型和提示词\"\n },\n \"failover\": {\n \"title\": \"自动故障转移\",\n \"description\": \"配置故障转移队列和熔断策略\"\n },\n \"pricing\": {\n \"title\": \"成本定价\",\n \"description\": \"管理各模型 Token 计费规则\"\n },\n \"globalProxy\": {\n \"title\": \"全局出站代理\",\n \"description\": \"配置 OpenSunstar 访问外部 API 时使用的代理\"\n },\n \"data\": {\n \"title\": \"数据管理\",\n \"description\": \"导入和导出本地配置数据\"\n },\n \"backup\": {\n \"title\": \"备份与恢复\",\n \"description\": \"管理自动备份,查看和恢复数据库快照\"\n },\n \"cloudSync\": {\n \"title\": \"云同步\",\n \"description\": \"通过 WebDAV、S3 或 GitHub Gist 在多设备间同步数据\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"自动修复 API 请求中的兼容性问题\",\n \"enabled\": \"启用整流器\",\n \"enabledDescription\": \"总开关,关闭后所有整流功能将被禁用\",\n \"requestGroup\": \"请求整流\",\n \"responseGroup\": \"响应整流\",\n \"thinkingSignature\": \"Thinking 签名整流\",\n \"thinkingSignatureDescription\": \"当 Anthropic 类型供应商返回 thinking 签名不兼容或非法请求等错误时,自动移除不兼容的 thinking 相关块并对同一供应商重试一次\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"当 Anthropic 类型供应商返回 budget_tokens 约束错误(如至少 1024)时,自动将 thinking 规范为 enabled 并将 budget 设为 32000,同时在需要时将 max_tokens 设为 64000,然后重试一次\",\n \"mediaFallback\": \"不支持图片降级\",\n \"mediaFallbackDescription\": \"当供应商不支持图片输入时(已声明纯文本能力,或上游返回不支持图片的错误),自动将图片块替换为 [Unsupported Image] 标记,使对话不中断\",\n \"mediaHeuristic\": \"启发式纯文本模型识别\",\n \"mediaHeuristicDescription\": \"发送前按内置模型名列表预测性剥离图片。关闭后仅保留「已声明纯文本」与「上游报错兜底」两条事实驱动路径,避免内置列表把多模态模型误判为纯文本而静默丢图\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock 请求优化器\",\n \"description\": \"在请求发送前自动优化 Thinking 和 Cache 配置(仅 Bedrock 供应商生效)\",\n \"enabled\": \"启用优化器\",\n \"thinkingOptimizer\": \"Thinking 优化\",\n \"thinkingOptimizerDescription\": \"自动为 Opus/Sonnet 启用 Adaptive Thinking,为旧模型注入 Extended Thinking\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"自动在请求关键位置注入 Cache 断点,减少重复 token 计费\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分钟\",\n \"cacheTtl1h\": \"1 小时\"\n },\n \"logConfig\": {\n \"title\": \"日志管理\",\n \"description\": \"控制日志输出级别\",\n \"enabled\": \"启用日志\",\n \"enabledDescription\": \"总开关,关闭后所有日志将被禁用\",\n \"level\": \"日志级别\",\n \"levelDescription\": \"设置输出的最低日志级别\",\n \"levels\": {\n \"error\": \"错误\",\n \"warn\": \"警告\",\n \"info\": \"信息\",\n \"debug\": \"调试\",\n \"trace\": \"跟踪\"\n },\n \"levelHint\": \"日志级别说明:\",\n \"levelDesc\": {\n \"error\": \"仅严重错误\",\n \"warn\": \"错误 + 警告信息\",\n \"info\": \"一般操作信息(默认)\",\n \"debug\": \"详细信息,包含 SSE 流和请求/响应详情\",\n \"trace\": \"全部日志,最详细\"\n }\n },\n \"aiProvider\": {\n \"description\": \"配置项目看板的 AI 推理提供方(DeepSeek / GLM / 自定义)\",\n \"title\": \"AI 模型路由\"\n }\n },\n \"language\": \"界面语言\",\n \"languageHint\": \"切换后立即预览界面语言,保存后永久生效。\",\n \"theme\": \"外观主题\",\n \"themeHint\": \"选择应用的外观主题,立即生效。\",\n \"themeLight\": \"浅色\",\n \"themeDark\": \"深色\",\n \"themeSystem\": \"跟随系统\",\n \"importExport\": \"SQL 导入导出\",\n \"importExportHint\": \"导入/导出数据库 SQL 备份(仅支持导入由 OpenSunstar 导出的备份),便于备份或迁移。\",\n \"exportConfig\": \"导出 SQL 备份\",\n \"selectConfigFile\": \"选择 SQL 文件\",\n \"noFileSelected\": \"尚未选择配置文件。\",\n \"import\": \"导入\",\n \"importing\": \"导入中...\",\n \"importSuccess\": \"导入成功!\",\n \"importFailed\": \"导入失败\",\n \"syncLiveFailed\": \"已导入,但同步到当前供应商失败,请手动重新选择一次供应商。\",\n \"importPartialSuccess\": \"配置已导入,但同步到当前供应商失败。\",\n \"importPartialHint\": \"请手动重新选择一次供应商以刷新对应配置。\",\n \"configExported\": \"配置已导出到:\",\n \"exportFailed\": \"导出失败\",\n \"selectFileFailed\": \"请选择有效的 SQL 备份文件\",\n \"configCorrupted\": \"SQL 文件可能已损坏或格式不正确\",\n \"backupId\": \"备份ID\",\n \"backupManager\": {\n \"title\": \"数据库备份\",\n \"description\": \"自动备份的数据库快照,可用于恢复到之前的状态\",\n \"empty\": \"暂无备份\",\n \"restore\": \"恢复\",\n \"restoring\": \"恢复中...\",\n \"confirmTitle\": \"确认恢复备份\",\n \"confirmMessage\": \"恢复到此备份将覆盖当前数据库。恢复前会自动创建安全备份。\",\n \"restoreSuccess\": \"恢复成功!安全备份已创建\",\n \"restoreFailed\": \"恢复失败\",\n \"safetyBackupId\": \"安全备份ID\",\n \"intervalLabel\": \"自动备份间隔\",\n \"retainLabel\": \"备份保留数量\",\n \"intervalDisabled\": \"禁用\",\n \"intervalHours\": \"{{hours}} 小时\",\n \"intervalDays\": \"{{days}} 天\",\n \"rename\": \"重命名\",\n \"renameSuccess\": \"备份重命名成功\",\n \"renameFailed\": \"重命名失败\",\n \"namePlaceholder\": \"输入新名称\",\n \"createBackup\": \"立即备份\",\n \"creating\": \"备份中...\",\n \"createSuccess\": \"备份创建成功\",\n \"createFailed\": \"备份创建失败\",\n \"delete\": \"删除\",\n \"deleting\": \"删除中...\",\n \"deleteSuccess\": \"备份已删除\",\n \"deleteFailed\": \"删除失败\",\n \"deleteConfirmTitle\": \"确认删除备份\",\n \"deleteConfirmMessage\": \"此备份将被永久删除,此操作无法撤消。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV 云同步\",\n \"description\": \"通过 WebDAV 在多设备间同步数据库和技能配置。\",\n \"baseUrl\": \"WebDAV 服务器地址\",\n \"baseUrlPlaceholder\": \"https://dav.jianguoyun.com/dav/\",\n \"username\": \"WebDAV 账户\",\n \"usernamePlaceholder\": \"邮箱账号\",\n \"password\": \"WebDAV 密码\",\n \"passwordPlaceholder\": \"应用密码(坚果云请使用「第三方应用密码」)\",\n \"remoteRoot\": \"远程根目录\",\n \"profile\": \"同步配置名\",\n \"autoSync\": \"自动同步\",\n \"autoSyncHint\": \"开启后每次数据库变更都会自动上传到 WebDAV。\",\n \"test\": \"测试连接\",\n \"testing\": \"测试中...\",\n \"testSuccess\": \"连接成功\",\n \"testFailed\": \"连接失败:{{error}}\",\n \"save\": \"保存配置\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"保存配置失败:{{error}}\",\n \"upload\": \"上传到云端\",\n \"uploading\": \"上传中...\",\n \"uploadSuccess\": \"已上传到 WebDAV\",\n \"uploadFailed\": \"上传失败:{{error}}\",\n \"autoSyncFailedToast\": \"自动同步失败:{{error}}\",\n \"download\": \"从云端下载\",\n \"downloading\": \"下载中...\",\n \"downloadSuccess\": \"已从 WebDAV 下载并恢复\",\n \"downloadFailed\": \"下载失败:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次自动同步失败\",\n \"autoSyncLastErrorHint\": \"请检查网络或 WebDAV 配置,系统会在后续变更时继续自动重试。\",\n \"missingUrl\": \"请填写 WebDAV 服务器地址\",\n \"presets\": {\n \"label\": \"服务商\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"请在坚果云「安全选项」中生成「第三方应用密码」,不要使用登录密码。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"请将 your-server 替换为你的 Nextcloud 服务器地址,USERNAME 替换为你的用户名。\",\n \"synology\": \"群晖 NAS\",\n \"synologyHint\": \"请先在群晖「套件中心」安装并启用 WebDAV Server 套件。\",\n \"custom\": \"自定义\"\n },\n \"remoteRootDefault\": \"默认: OpenSunstar-sync\",\n \"profileDefault\": \"默认: default\",\n \"saveAndTestSuccess\": \"配置已保存,连接正常\",\n \"saveAndTestFailed\": \"配置已保存,但连接测试失败:{{error}}\",\n \"noRemoteData\": \"云端没有找到同步数据\",\n \"incompatibleVersion\": \"远端数据版本不兼容(协议 v{{protocolVersion}},数据库 {{dbCompatVersion}}),当前支持协议 v2 / db-v6\",\n \"unsaved\": \"未保存\",\n \"saved\": \"已保存\",\n \"unsavedChanges\": \"请先保存配置\",\n \"saveBeforeSync\": \"请先保存配置,再使用上传/下载。\",\n \"fetchingRemote\": \"获取远端信息...\",\n \"fetchRemoteFailed\": \"获取远端信息失败,请检查配置和网络后重试。\",\n \"confirmDownload\": {\n \"title\": \"从云端恢复\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"path\": \"远端路径\",\n \"dbCompat\": \"数据库兼容层\",\n \"artifacts\": \"包含内容\",\n \"legacyNotice\": \"检测到旧版云端路径。恢复完成后,下次上传将写入新路径 v2/db-v6。\",\n \"warning\": \"恢复将覆盖本地所有数据和技能配置\",\n \"confirm\": \"确认恢复\"\n },\n \"confirmUpload\": {\n \"title\": \"上传到云端\",\n \"content\": \"将同步以下内容到 WebDAV 服务器:\",\n \"dbItem\": \"数据库(所有 Provider 配置和数据)\",\n \"skillsItem\": \"技能包(所有自定义技能)\",\n \"targetPath\": \"目标路径\",\n \"existingData\": \"云端已有数据\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"path\": \"远端路径\",\n \"dbCompat\": \"数据库兼容层\",\n \"warning\": \"将覆盖云端已有的同步数据\",\n \"legacyNotice\": \"检测到旧版云端路径数据。本次上传将写入新路径 v2/db-v6,不会覆盖旧路径。\",\n \"confirm\": \"确认上传\"\n }\n },\n \"syncType\": {\n \"label\": \"同步方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 兼容存储\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"服务商\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"使用 IAM Access Key,需要 s3:PutObject/GetObject/HeadObject 权限。Region 示例:us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"需要自定义 Endpoint,如 http://minio.local:9000。Region 可设为 us-east-1\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com,Region 设为 auto\",\n \"oss\": \"阿里云 OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com,Region 示例:cn-hangzhou, cn-shanghai\",\n \"cos\": \"腾讯云 COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com,Region 示例:ap-guangzhou, ap-beijing\",\n \"obs\": \"华为云 OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com,Region 示例:cn-north-4, cn-east-3\",\n \"custom\": \"S3 兼容服务(自定义)\",\n \"customHint\": \"任意 S3 兼容服务,需要自定义 Endpoint\"\n },\n \"region\": \"区域 (Region)\",\n \"regionPlaceholder\": \"例如 us-east-1\",\n \"bucket\": \"存储桶 (Bucket)\",\n \"bucketPlaceholder\": \"例如 my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例如 AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"留空则保持现有密钥\",\n \"endpoint\": \"Endpoint(AWS 可留空)\",\n \"endpointHint\": \"多数 S3 兼容服务需要填写\",\n \"endpointPlaceholder\": \"例如 https://s3-compatible.example.com\",\n \"remoteRoot\": \"远程根目录\",\n \"remoteRootDefault\": \"默认: OpenSunstar-sync\",\n \"profile\": \"同步配置名\",\n \"profileDefault\": \"默认: default\",\n \"autoSync\": \"自动同步\",\n \"autoSyncHint\": \"开启后每次数据库变更都会自动上传到 S3。\",\n \"enabled\": \"启用 S3 同步\",\n \"enabledHint\": \"开启后可使用 S3 上传/下载和自动同步。\",\n \"mutualExclusionTitle\": \"切换同步方式\",\n \"mutualExclusionMessage\": \"启用 S3 同步将禁用当前的 WebDAV 同步,是否继续?\",\n \"mutualExclusionMessageReverse\": \"启用 WebDAV 同步将禁用当前的 S3 同步,是否继续?\",\n \"mutualExclusionFailed\": \"切换同步方式失败:{{error}}\",\n \"testConnection\": \"测试连接\",\n \"connectionOk\": \"S3 连接成功\",\n \"test\": \"测试连接\",\n \"testing\": \"测试中...\",\n \"testSuccess\": \"S3 连接成功\",\n \"testFailed\": \"S3 连接失败:{{error}}\",\n \"save\": \"保存配置\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"保存配置失败:{{error}}\",\n \"saveAndTestSuccess\": \"配置已保存,S3 连接正常\",\n \"saveAndTestFailed\": \"配置已保存,但 S3 连接测试失败:{{error}}\",\n \"upload\": \"上传到云端\",\n \"uploading\": \"上传中...\",\n \"uploadSuccess\": \"已上传到 S3\",\n \"uploadFailed\": \"S3 上传失败:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自动同步失败:{{error}}\",\n \"download\": \"从云端下载\",\n \"downloading\": \"下载中...\",\n \"downloadSuccess\": \"已从 S3 下载并恢复\",\n \"downloadFailed\": \"S3 下载失败:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次 S3 自动同步失败\",\n \"autoSyncLastErrorHint\": \"请检查网络或 S3 配置,系统会在后续变更时继续自动重试。\",\n \"missingBucket\": \"请填写 S3 存储桶\",\n \"noRemoteData\": \"S3 存储桶中没有找到同步数据\",\n \"incompatibleVersion\": \"远端数据版本不兼容(版本 {{version}}),当前支持协议 v2 / db-v6\",\n \"unsaved\": \"未保存\",\n \"saved\": \"已保存\",\n \"unsavedChanges\": \"请先保存配置\",\n \"saveBeforeSync\": \"请先保存配置,再使用上传/下载。\",\n \"fetchingRemote\": \"获取远端信息...\",\n \"fetchRemoteFailed\": \"获取远端信息失败,请检查配置和网络后重试。\",\n \"notConfigured\": \"未配置 S3 同步\",\n \"disabled\": \"S3 同步未启用\",\n \"confirmDownload\": {\n \"title\": \"从 S3 恢复\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"artifacts\": \"包含内容\",\n \"warning\": \"恢复将覆盖本地所有数据和技能配置\",\n \"confirm\": \"确认恢复\"\n },\n \"confirmUpload\": {\n \"title\": \"上传到 S3\",\n \"content\": \"将同步以下内容到 S3 存储桶:\",\n \"dbItem\": \"数据库(所有 Provider 配置和数据)\",\n \"skillsItem\": \"技能包(所有自定义技能)\",\n \"targetPath\": \"目标对象路径\",\n \"existingData\": \"云端已有数据\",\n \"deviceName\": \"上传设备\",\n \"createdAt\": \"上传时间\",\n \"warning\": \"将覆盖该 S3 路径下已有的同步数据\",\n \"confirm\": \"确认上传\"\n }\n },\n \"autoReload\": \"数据已刷新\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"窗口行为\",\n \"windowBehaviorHint\": \"配置窗口最小化与 Claude 插件联动策略。\",\n \"notificationPreferences\": \"通知偏好\",\n \"budgetAlertNotifications\": \"预算超限系统通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency 级别预算告警时发送系统级通知(warning 仍仅在应用内提示)\",\n \"failoverAlertNotifications\": \"故障转移系统通知\",\n \"failoverAlertNotificationsDescription\": \"供应商自动故障转移完成后发送系统级通知\",\n \"trayBadgeNotifications\": \"托盘红点提醒\",\n \"trayBadgeNotificationsDescription\": \"有未读告警时托盘图标切换为告警态并在菜单顶部显示告警条目\",\n \"workspaceAlertFirst\": \"工作区告警首屏\",\n \"workspaceAlertFirstDescription\": \"开启后「今日工作台」首屏展示告警卡片;关闭时告警仅通过托盘/系统通知触达,保持老用户习惯\",\n \"launchOnStartup\": \"开机自启\",\n \"launchOnStartupDescription\": \"随系统启动自动运行 OpenSunstar\",\n \"silentStartup\": \"静默启动\",\n \"silentStartupDescription\": \"程序启动时不显示主窗口,仅在系统托盘运行\",\n \"autoLaunchFailed\": \"设置开机自启失败\",\n \"minimizeToTray\": \"关闭时最小化到托盘\",\n \"minimizeToTrayDescription\": \"勾选后点击关闭按钮会隐藏到系统托盘,取消则直接退出应用。\",\n \"useAppWindowControls\": \"启用应用级窗口按钮\",\n \"useAppWindowControlsDescription\": \"开启后使用应用自建的最小化、最大化/还原、关闭按钮;关闭后沿用系统窗口模式。\",\n \"enableClaudePluginIntegration\": \"应用到 Claude Code 插件\",\n \"enableClaudePluginIntegrationDescription\": \"开启后 VS Code Claude Code 插件的供应商将随本软件切换\",\n \"skipClaudeOnboarding\": \"跳过 Claude Code 初次安装确认\",\n \"skipClaudeOnboardingDescription\": \"开启后跳过 Claude Code 初次安装确认\",\n \"codexAuth\": \"Codex 应用增强\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 官方登录保护\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"始终开启:供应商切换和本地代理不会覆盖或保存 Codex 官方登录凭据\",\n \"appVisibility\": {\n \"title\": \"主页面显示\",\n \"description\": \"选择在主页面显示的应用\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skills 存储位置\",\n \"description\": \"选择 OpenSunstar 存放 Skills 主副本的目录\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"技能存储在 ~/.OpenSunstar/skills/,由 OpenSunstar 统一管理并同步到各应用。\",\n \"unifiedHint\": \"技能存储在 ~/.agents/skills/,遵循 Agent Skills 开放标准。兼容的工具(Claude Code、Codex、Gemini CLI 等)可直接发现此目录中的技能。\",\n \"confirmTitle\": \"迁移技能存储\",\n \"confirmMessage\": \"将移动 {{count}} 个技能到新位置,是否继续?\",\n \"migrationSuccess\": \"已成功迁移 {{count}} 个技能\",\n \"migrationPartial\": \"迁移了 {{migrated}} 个技能,{{errors}} 个失败,请查看日志\"\n },\n \"skillSync\": {\n \"title\": \"Skills 同步方式\",\n \"description\": \"选择 Skills 的文件同步策略\",\n \"symlink\": \"软连接\",\n \"copy\": \"文件复制\",\n \"symlinkHint\": \"软连接节省磁盘空间并支持实时同步。注意:Windows 可能需要管理员权限或开启开发者模式\"\n },\n \"terminal\": {\n \"title\": \"首选终端\",\n \"description\": \"选择点击终端按钮时使用的终端应用\",\n \"fallbackHint\": \"如果选择的终端不可用,将自动使用系统默认终端\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"命令提示符\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"配置目录覆盖(高级)\",\n \"configDirectoryDescription\": \"在 WSL 等环境使用 Claude Code 或 Codex 的时候,可手动指定为 WSL 里的配置目录,供应商数据与主环境保持一致。\",\n \"appConfigDir\": \"OpenSunstar 配置目录\",\n \"appConfigDirDescription\": \"自定义 OpenSunstar 的配置存储位置(指定到云同步文件夹即可云同步配置)\",\n \"browsePlaceholderApp\": \"例如:C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 配置目录\",\n \"claudeConfigDirDescription\": \"覆盖 Claude 配置目录 (settings.json),同时会在同级存放 Claude MCP 的 claude.json。\",\n \"codexConfigDir\": \"Codex 配置目录\",\n \"codexConfigDirDescription\": \"覆盖 Codex 配置目录。\",\n \"geminiConfigDir\": \"Gemini 配置目录\",\n \"geminiConfigDirDescription\": \"覆盖 Gemini 配置目录 (.env)。\",\n \"opencodeConfigDir\": \"OpenCode 配置目录\",\n \"opencodeConfigDirDescription\": \"覆盖 OpenCode 配置目录 (opencode.json)。\",\n \"openclawConfigDir\": \"OpenClaw 配置目录\",\n \"openclawConfigDirDescription\": \"覆盖 OpenClaw 配置目录 (openclaw.json)。\",\n \"hermesConfigDir\": \"Hermes 配置目录\",\n \"hermesConfigDirDescription\": \"覆盖 Hermes 配置目录 (config.yaml)。\",\n \"browsePlaceholderClaude\": \"例如:/home/<你的用户名>/.claude\",\n \"browsePlaceholderCodex\": \"例如:/home/<你的用户名>/.codex\",\n \"browsePlaceholderGemini\": \"例如:/home/<你的用户名>/.gemini\",\n \"browsePlaceholderOpencode\": \"例如:/home/<你的用户名>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例如:/home/<你的用户名>/.openclaw\",\n \"browsePlaceholderHermes\": \"例如:/home/<你的用户名>/.hermes\",\n \"browseDirectory\": \"浏览目录\",\n \"resetDefault\": \"恢复默认目录(需保存后生效)\",\n \"checkForUpdates\": \"检查更新\",\n \"updateTo\": \"更新到 v{{version}}\",\n \"updating\": \"更新中...\",\n \"checking\": \"检查中...\",\n \"upToDate\": \"已是最新\",\n \"aboutHint\": \"查看版本信息与更新状态。\",\n \"portableMode\": \"当前为便携版,更新需手动下载。\",\n \"updateAvailable\": \"检测到新版本:{{version}}\",\n \"updateBadge\": \"有更新可用\",\n \"updateFailed\": \"更新安装失败,已尝试打开下载页面。\",\n \"checkUpdateFailed\": \"检查更新失败,请稍后重试。\",\n \"openReleaseNotesFailed\": \"打开更新日志失败\",\n \"releaseNotes\": \"更新日志\",\n \"viewReleaseNotes\": \"查看该版本更新日志\",\n \"viewCurrentReleaseNotes\": \"查看当前版本更新日志\",\n \"officialWebsite\": \"官方网站\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手动安装命令\",\n \"oneClickInstallHint\": \"安装或升级 Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes\",\n \"localEnvCheck\": \"本地环境检查\",\n \"updateAllTools\": \"全部升级({{count}})\",\n \"currentVersion\": \"当前版本\",\n \"latestVersion\": \"最新版本\",\n \"updateAvailableShort\": \"可升级\",\n \"toolInstall\": \"安装\",\n \"toolUpdate\": \"升级\",\n \"toolReady\": \"已就绪\",\n \"toolActionDone\": \"{{count}} 个工具{{action}}完成\",\n \"toolActionPartial\": \"{{succeeded}} 个{{action}}成功,{{failed}} 个失败\",\n \"toolActionFailed\": \"安装/升级命令执行失败\",\n \"toolNotRunnable\": \"已安装但无法运行(未探测到版本)\",\n \"toolActionVersionUnchangedTitle\": \"版本没有变化\",\n \"toolActionVersionUnchanged\": \"仍是 {{version}}(最新:{{latest}})。上游升级器可能报告成功但没有实际更新。\",\n \"toolActionInstalledNotRunnable\": \"已安装,但当前环境无法运行,请检查\",\n \"installedNotRunnable\": \"已安装·无法运行\",\n \"toolCheckEnv\": \"请检查运行环境\",\n \"toolDiagnose\": \"诊断安装冲突\",\n \"toolDiagnosing\": \"诊断中…\",\n \"toolConflictTitle\": \"检测到多处安装\",\n \"toolConflictHint\": \"命令行实际使用标「默认」的那处;升级可能写到了别处。\",\n \"toolConflictDefault\": \"默认\",\n \"toolConflictNotRunnable\": \"无法运行\",\n \"toolDiagnoseNoConflict\": \"未发现安装冲突\",\n \"toolDiagnoseFailed\": \"诊断失败\",\n \"toolUpgradeConfirmTitle\": \"确认升级位置\",\n \"toolUpgradeConfirmHint\": \"检测到多处安装。本次升级不会全部更新,具体作用的位置以下方各项为准。\",\n \"toolUpgradeWillRun\": \"将执行:\",\n \"toolUpgradeConfirmBtn\": \"确认升级\",\n \"toolUpgradeUnanchoredHint\": \"无法确定命令行实际使用哪处,将执行默认升级命令(可能装到 PATH 上第一个 npm)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"标志\",\n \"installCommandsCopied\": \"安装命令已复制\",\n \"installCommandsCopyFailed\": \"复制失败,请手动复制。\",\n \"importFailedError\": \"导入配置失败:{{message}}\",\n \"exportFailedError\": \"导出配置失败:\",\n \"restartRequired\": \"需要重启应用\",\n \"restartRequiredMessage\": \"修改 OpenSunstar 配置目录后需要重启应用才能生效,是否立即重启?\",\n \"restartNow\": \"立即重启\",\n \"restartLater\": \"稍后重启\",\n \"restartFailed\": \"应用重启失败,请手动关闭后重新打开。\",\n \"devModeRestartHint\": \"开发模式下不支持自动重启,请手动重新启动应用。\",\n \"saving\": \"正在保存...\",\n \"globalProxy\": {\n \"label\": \"全局代理\",\n \"hint\": \"代理所有请求(API、Skills 下载等)。开启本地路由时,应用的请求也会经过此代理。留空表示直连。\",\n \"username\": \"用户名(可选)\",\n \"password\": \"密码(可选)\",\n \"test\": \"测试连接\",\n \"scan\": \"扫描本地代理\",\n \"clear\": \"清除\",\n \"scanFailed\": \"扫描失败:{{error}}\",\n \"saved\": \"代理设置已保存\",\n \"saveFailed\": \"保存失败:{{error}}\",\n \"testSuccess\": \"连接成功!延迟 {{latency}}ms\",\n \"testFailed\": \"连接失败:{{error}}\",\n \"pricingDefaultsTitle\": \"计费默认配置\",\n \"pricingDefaultsDescription\": \"设置各应用的默认倍率与计费模式来源。\",\n \"pricingAppLabel\": \"应用\",\n \"defaultCostMultiplierLabel\": \"默认倍率\",\n \"defaultCostMultiplierHint\": \"用于成本计算的倍率,支持小数。\",\n \"pricingModelSourceLabel\": \"计费模式\",\n \"pricingModelSourceRequest\": \"请求模型\",\n \"pricingModelSourceResponse\": \"返回模型\",\n \"pricingSave\": \"保存计费配置\",\n \"pricingSaved\": \"计费配置已保存\",\n \"pricingSaveFailed\": \"保存计费配置失败:{{error}}\",\n \"pricingLoadFailed\": \"加载计费配置失败:{{error}}\",\n \"defaultCostMultiplierRequired\": \"默认倍率不能为空\",\n \"defaultCostMultiplierInvalid\": \"默认倍率格式不正确\"\n },\n \"saveFailedGeneric\": \"保存失败,请重试\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokBuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"Context\",\n \"subtitle\": \"管理 Claude Code、Codex、OpenCode、OpenClaw、Hermes 与 Gemini CLI 会话记录\",\n \"searchPlaceholder\": \"搜索会话内容、目录或 ID\",\n \"searchSessions\": \"搜索会话\",\n \"providerFilterAll\": \"全部\",\n \"sessionList\": \"会话列表\",\n \"manageBatchTooltip\": \"进入批量管理\",\n \"exitBatchModeTooltip\": \"退出批量管理\",\n \"batchModeHint\": \"勾选要导出或删除的会话\",\n \"exportSelected\": \"批量导出\",\n \"batchExporting\": \"导出中...\",\n \"batchExportSuccess\": \"已导出 {{count}} 个会话\",\n \"batchExportFailed\": \"批量导出失败,请稍后重试\",\n \"selectForBatch\": \"选择会话\",\n \"selectedCount\": \"已选 {{count}} 项\",\n \"selectAllFiltered\": \"全选当前\",\n \"clearFilteredSelection\": \"取消全选\",\n \"clearSelection\": \"清空已选\",\n \"deleteSelected\": \"批量删除\",\n \"batchDeleting\": \"删除中...\",\n \"loadingSessions\": \"加载会话中...\",\n \"noSessions\": \"未发现会话\",\n \"selectSession\": \"请选择会话查看详情\",\n \"noSummary\": \"暂无摘要\",\n \"lastActive\": \"最近活跃\",\n \"projectDir\": \"项目目录\",\n \"sourcePath\": \"原始文件\",\n \"copyResumeCommand\": \"复制恢复命令\",\n \"resumeCommandCopied\": \"恢复命令已复制\",\n \"openInTerminal\": \"在终端恢复\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"仅复制\",\n \"terminalLaunched\": \"终端已启动\",\n \"openFailed\": \"终端启动失败\",\n \"resumeFallbackCopied\": \"已复制恢复命令,可手动粘贴到终端\",\n \"copyProjectDir\": \"复制目录\",\n \"projectDirCopied\": \"目录已复制\",\n \"copySourcePath\": \"复制原始文件\",\n \"sourcePathCopied\": \"原始文件已复制\",\n \"delete\": \"删除会话\",\n \"deleting\": \"删除中...\",\n \"deleteTooltip\": \"永久删除此本地会话记录\",\n \"deleteConfirmTitle\": \"删除会话\",\n \"deleteConfirmMessage\": \"将永久删除本地会话“{{title}}”\\nSession ID: {{sessionId}}\\n\\n此操作不可恢复。\",\n \"deleteConfirmAction\": \"删除会话\",\n \"sessionDeleted\": \"会话已删除\",\n \"deleteFailed\": \"删除会话失败: {{error}}\",\n \"batchDeleteConfirmTitle\": \"批量删除会话\",\n \"batchDeleteConfirmMessage\": \"将永久删除已选中的 {{count}} 个本地会话记录。\\n\\n此操作不可恢复。\",\n \"batchDeleteConfirmAction\": \"删除所选会话\",\n \"batchDeleteSuccess\": \"已删除 {{count}} 个会话\",\n \"batchDeleteFailed\": \"{{failed}} 个会话删除失败\",\n \"batchDeleteRequestFailed\": \"批量删除失败,请稍后重试\",\n \"loadingMessages\": \"加载会话内容中...\",\n \"emptySession\": \"该会话暂无可展示内容\",\n \"clickToCopyPath\": \"点击复制路径\",\n \"tocTitle\": \"对话目录\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}} 分钟前\",\n \"hoursAgo\": \"{{count}} 小时前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"roleUser\": \"用户\",\n \"roleSystem\": \"系统\",\n \"roleTool\": \"工具\",\n \"resume\": \"恢复会话\",\n \"resumeTooltip\": \"在终端中恢复此会话\",\n \"noResumeCommand\": \"此会话无法恢复\",\n \"copyCommand\": \"复制命令\",\n \"copyMessage\": \"复制消息\",\n \"messageCopied\": \"已复制消息内容\",\n \"conversationHistory\": \"对话记录\",\n \"expandContent\": \"展开完整内容\",\n \"collapseContent\": \"收起\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"收到供应商切换事件:\",\n \"setupListenerFailed\": \"设置供应商切换监听器失败:\",\n \"updateProviderFailed\": \"更新供应商失败:\",\n \"autoImportFailed\": \"自动导入默认配置失败:\",\n \"openLinkFailed\": \"打开链接失败:\",\n \"getVersionFailed\": \"获取版本信息失败:\",\n \"loadSettingsFailed\": \"加载设置失败:\",\n \"getConfigPathFailed\": \"获取配置路径失败:\",\n \"getConfigDirFailed\": \"获取配置目录失败:\",\n \"detectPortableFailed\": \"检测便携模式失败:\",\n \"saveSettingsFailed\": \"保存设置失败:\",\n \"updateFailed\": \"更新失败:\",\n \"checkUpdateFailed\": \"检查更新失败:\",\n \"openConfigFolderFailed\": \"打开配置文件夹失败:\",\n \"selectConfigDirFailed\": \"选择配置目录失败:\",\n \"getDefaultConfigDirFailed\": \"获取默认配置目录失败:\",\n \"openReleaseNotesFailed\": \"打开更新日志失败:\"\n },\n \"providerForm\": {\n \"supplierName\": \"供应商名称\",\n \"supplierNameRequired\": \"供应商名称 *\",\n \"supplierNamePlaceholder\": \"例如:Anthropic 官方\",\n \"websiteUrl\": \"官网地址\",\n \"websiteUrlPlaceholder\": \"https://example.com(可选)\",\n \"apiEndpoint\": \"请求地址\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理与测速\",\n \"configContent\": \"配置内容\",\n \"officialNoApiKey\": \"官方登录无需填写 API Key,直接保存即可\",\n \"codexOfficialNoApiKey\": \"官方无需填写 API Key,直接保存即可\",\n \"codexApiKeyAutoFill\": \"只需要填这里,下方 auth.json 会自动填充\",\n \"apiKeyAutoFill\": \"只需要填这里,下方配置会自动填充\",\n \"cnOfficialApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"aggregatorApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"thirdPartyApiKeyHint\": \"💡 只需填写 API Key,请求地址已预设\",\n \"customApiKeyHint\": \"💡 自定义配置需手动填写所有必要字段\",\n \"omoHint\": \"💡 OMO 配置管理 Agent 模型分配,兼容 oh-my-openagent.jsonc / oh-my-opencode.jsonc\",\n \"officialHint\": \"💡 官方供应商使用浏览器登录,无需配置 API Key\",\n \"getApiKey\": \"获取 API Key\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册并在充值时填写 \\\"OpenSunstar\\\" 优惠码,可以享受9折优惠\",\n \"apikeyfun\": \"APIKEY.FUN 为 OpenSunstar 的用户提供了特别优惠,通过专属链接注册,可享受最高充值永久 95 折优惠。\",\n \"apinebula\": \"APINEBULA 为 OpenSunstar 用户提供特别优惠:使用专属链接注册并在充值时填写 \\\"OpenSunstar\\\" 优惠码,可享九折优惠。\",\n \"atlascloud\": \"Atlas Cloud 是一个全模态 AI 推理平台,通过单一 API 为开发者提供视频生成、图像生成及 LLM 接入。立即查看全新“编程计划”优惠,获取更具性价比的 API 接入。\",\n \"sudocode\": \"SudoCode 是全球一流 AI 模型聚合服务,一个 API Key 可通用多模型,并支持 Claude Code、Codex、Gemini CLI、OpenClaw 等工具接入。\",\n \"patewayai\": \"PatewayAI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册可以获得3美元额度。\",\n \"claudeapi\": \"ClaudeAPI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册可以领取测试额度。\",\n \"claudecn\": \"ClaudeCN 是一家实体企业运营的企业级AI中转平台,支持企业采购流程,可对公打款、签约,服务合规有保障。\",\n \"runapi\": \"RunAPI 为 OpenSunstar 的用户提供了特别福利,通过此链接注册并联系客服可领取 ¥14 免费额度。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特惠,Starter 套餐 9.9 元起\",\n \"minimax_en\": \"MiniMax Coding Plan 黑五特惠,Starter 套餐现仅 $2/月(2折优惠!)\",\n \"dmxapi\": \"Claude Code 专属模型 3.4 折优惠进行中!\",\n \"cubence\": \"Cubence 是 OpenSunstar 的官方合作伙伴,使用此链接注册并在充值时填写 \\\"OPENSUNSTAR\\\" 优惠码,每次充值均可享受9折优惠\",\n \"aigocode\": \"AIGoCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册首次充值时可以获得10%额度奖励!\",\n \"rightcode\": \"RightCode 是 OpenSunstar 的官方合作伙伴,使用此链接注册每次充值均可赠送5%额外额度!\",\n \"aicodemirror\": \"AICodeMirror 是 OpenSunstar 的官方合作伙伴,使用此链接注册可享受8折优惠!\",\n \"crazyrouter\": \"CrazyRouter 为 OpenSunstar 的用户提供了特殊优惠,首次充值赠予 30% 额外额度!\",\n \"sssaicode\": \"SSAI Code 为 OpenSunstar 的用户提供了特殊优惠,每次充值赠予额外 $10 额度!\",\n \"siliconflow\": \"硅基流动是 OpenSunstar 的官方合作伙伴\",\n \"ucloud\": \"优云智算为OpenSunstar 的用户提供了特殊优惠,通过此链接注册,可以获得五元平台体验金!\",\n \"micu\": \"Micu 是 OpenSunstar 的官方合作伙伴\",\n \"ctok\": \"官网加入CTok社群,订阅套餐。\",\n \"shengsuanyun\": \"胜算云为 OpenSunstar 的用户提供了特别福利,使用此链接注册的新用户可获 10 元模力及首充 10% 赠送!\",\n \"lemondata\": \"Lemon Code 为 OpenSunstar 的用户提供了特别优惠。使用此链接注册可以获得1美元免费额度。\",\n \"doubaoseed\": \"豆包大模型为 OpenSunstar 的用户提供了专属福利:通过此链接注册即可获取豆包全系列文本模型 50万tokens推理额度以及Seedance2.0的500万tokens免费额度\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan 为 OpenSunstar 的用户提供了专属福利:通过此链接订阅方舟AgentPlan,新客户首月40元起。\",\n \"byteplus\": \"通过此链接注册即可获取每个模型50万tokens的免费推理额度。\",\n \"ccsub\": \"CCSub 是稳定、实惠的 AI API 中转平台,Claude Code 官方订阅的超强平替,一个 Key 覆盖全部模型,价格约为官方 1/3。\",\n \"unity2\": \"Unity2.ai 为 OpenSunstar 用户提供专属福利:通过此链接注册可领取 $2 余额,加入官方群再送 $10,最高可领 $12 免费额度!\"\n },\n \"presets\": {\n \"ucloud\": \"优云智算\",\n \"ucloudCoding\": \"优云智算Coding Plan\",\n \"shengsuanyun\": \"胜算云\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"参数配置 - {{name}} *\",\n \"mainModel\": \"主模型 (可选)\",\n \"mainModelPlaceholder\": \"例如: GLM-4.6\",\n \"fastModel\": \"快速模型 (可选)\",\n \"fastModelPlaceholder\": \"例如: GLM-4.5-Air\",\n \"modelHint\": \"💡 留空将使用供应商的默认模型\",\n \"apiHint\": \"💡 填写兼容 Claude API 的服务端点地址,不要以斜杠结尾\",\n \"apiHintOAI\": \"💡 填写兼容 OpenAI Chat Completions 的服务端点地址,不要以斜杠结尾\",\n \"apiHintGeminiNative\": \"💡 建议填写 Gemini Native 的 base URL,例如 https://generativelanguage.googleapis.com 或 https://generativelanguage.googleapis.com/v1beta;代理会自动补全 models/*:generateContent\",\n \"codexApiHint\": \"💡 填写兼容 OpenAI Response 格式的服务端点地址\",\n \"fillSupplierName\": \"请填写供应商名称\",\n \"fillConfigContent\": \"请填写配置内容\",\n \"fillParameter\": \"请填写 {{label}}\",\n \"fillTemplateValue\": \"请填写 {{label}}\",\n \"endpointRequired\": \"非官方供应商请填写 API 端点\",\n \"apiKeyRequired\": \"非官方供应商请填写 API Key\",\n \"softValidation\": {\n \"title\": \"配置存在以下问题\",\n \"hint\": \"仍要保存吗?保存后切换此供应商时可能失败,可以之后再补全。\",\n \"saveAnyway\": \"仍要保存\"\n },\n \"configJsonError\": \"配置JSON格式错误,请检查语法\",\n \"authJsonRequired\": \"auth.json 必须是 JSON 对象\",\n \"authJsonError\": \"auth.json 格式错误,请检查JSON语法\",\n \"fillAuthJson\": \"请填写 auth.json 配置\",\n \"fillApiKey\": \"请填写 OPENAI_API_KEY\",\n \"visitWebsite\": \"访问 {{url}}\",\n \"anthropicModel\": \"主模型\",\n \"anthropicSmallFastModel\": \"快速模型\",\n \"apiFormat\": \"API 格式\",\n \"apiFormatHint\": \"选择供应商 API 的输入格式\",\n \"customUserAgent\": \"自定义 User-Agent\",\n \"customUserAgentHint\": \"仅在开启本地路由/代理接管后生效,会替换转发到供应商 API 请求中的 User-Agent。\",\n \"customUserAgentInvalid\": \"User-Agent 不能包含控制字符(如换行符),否则将被忽略。\",\n \"customUserAgentPresets\": \"预设\",\n \"fullUrlLabel\": \"完整 URL\",\n \"fullUrlEnabled\": \"完整 URL 模式\",\n \"fullUrlDisabled\": \"标记为完整 URL\",\n \"fullUrlHint\": \"💡 请填写完整请求 URL,并且必须开启路由后使用;路由将直接使用此 URL,不拼接路径\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native 下,完整 URL 模式同时兼容两类地址:1. 官方/标准 Gemini URL,代理会按模型和流式参数自动归一化;2. 自定义 relay 的完整 URL,代理会尽量原样使用,只补查询参数,不再强行追加 models 路径\",\n \"apiFormatAnthropic\": \"Anthropic Messages (原生)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (需开启路由)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (需开启路由)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (需开启路由)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (原生)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (需开启路由)\",\n \"codexApiFormatHint\": \"选择供应商真实支持的 Codex API 格式;配置仍保持 Responses 以兼容新版 Codex,Chat Completions 会通过本地路由自动转换。\",\n \"authField\": \"认证字段\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(默认)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"选择写入配置的认证环境变量名\",\n \"apiHintResponses\": \"💡 填写兼容 OpenAI Responses API 的服务端点地址,不要以斜杠结尾\",\n \"anthropicDefaultHaikuModel\": \"Haiku 默认模型\",\n \"anthropicDefaultSonnetModel\": \"Sonnet 默认模型\",\n \"anthropicDefaultOpusModel\": \"Opus 默认模型\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"可选:指定默认使用的 Claude 模型,留空则使用系统默认。\",\n \"modelMappingLabel\": \"模型映射\",\n \"modelMappingHint\": \"显示名称只影响 /model 菜单;1M 只是给 Claude Code 的上下文能力声明。\",\n \"modelRoleLabel\": \"模型角色\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"显示名称\",\n \"modelDisplayNamePlaceholder\": \"例如 DeepSeek V4 Pro\",\n \"requestModelLabel\": \"实际请求模型\",\n \"modelOneMHeader\": \"声明支持 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"默认兜底模型\",\n \"fallbackModelHint\": \"仅在 Claude Code 请求没有明确落到 Sonnet、Opus 或 Haiku 角色时使用;通常可以留空。\",\n \"quickSetModels\": \"一键设置\",\n \"quickSetSuccess\": \"已将模型名称应用到所有角色\",\n \"advancedOptionsToggle\": \"高级选项\",\n \"advancedOptionsHint\": \"包含 API 格式、认证字段、模型映射等配置。大多数场景下保持默认即可。\",\n \"categoryOfficial\": \"官方\",\n \"categoryCnOfficial\": \"开源官方\",\n \"categoryAggregation\": \"聚合服务\",\n \"categoryThirdParty\": \"第三方\",\n \"fetchModels\": \"获取模型列表\",\n \"fetchingModels\": \"正在获取...\",\n \"fetchModelsSuccess\": \"获取到 {{count}} 个模型\",\n \"fetchModelsFailed\": \"获取模型列表失败\",\n \"fetchModelsEmpty\": \"未找到可用模型\",\n \"fetchModelsNeedApiKey\": \"请先填写 API Key\",\n \"fetchModelsNeedEndpoint\": \"请先填写 API 端点\",\n \"fetchModelsNeedConfig\": \"请先填写 API 端点和 API Key\",\n \"fetchModelsAuthFailed\": \"API Key 无效或无权限\",\n \"fetchModelsNotSupported\": \"该供应商不支持获取模型列表\",\n \"fetchModelsEndpointNotFound\": \"未找到可用的模型列表端点,请检查 Base URL 或确认供应商是否开放该接口\",\n \"fetchModelsTimeout\": \"请求超时,请检查网络连接\",\n \"providerKeyStatusLoading\": \"正在加载供应商标识状态,请稍后再试\",\n \"apiKey\": \"API Key\",\n \"envKey\": \"环境变量名(可选)\",\n \"grokBuildHint\": \"配置会写入 ~/.grok/config.toml;仅维护 Grok Build 原生模型配置。\",\n \"model\": \"默认模型\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 认证\",\n \"authStatus\": \"认证状态\",\n \"authenticated\": \"已认证: {{username}}\",\n \"notAuthenticated\": \"未认证\",\n \"loginWithGitHub\": \"使用 GitHub 登录\",\n \"loginRequired\": \"请先登录 GitHub Copilot\",\n \"waitingForAuth\": \"等待授权中...\",\n \"enterCode\": \"请在浏览器中输入验证码:\",\n \"logout\": \"注销\",\n \"authSuccess\": \"GitHub Copilot 认证成功\",\n \"authFailed\": \"认证失败: {{error}}\",\n \"authTimeout\": \"认证超时,请重试\",\n \"tokenExpired\": \"令牌已过期,请重新认证\",\n \"accountCount\": \"{{count}} 个账号\",\n \"selectAccount\": \"选择账号\",\n \"selectAccountPlaceholder\": \"选择一个 GitHub 账号\",\n \"useDefaultAccount\": \"使用默认账号\",\n \"loggedInAccounts\": \"已登录账号\",\n \"defaultAccount\": \"默认\",\n \"selected\": \"已选中\",\n \"removeAccount\": \"移除账号\",\n \"setAsDefault\": \"设为默认\",\n \"addAnotherAccount\": \"添加其他账号\",\n \"logoutAll\": \"注销所有账号\",\n \"retry\": \"重试\",\n \"copyCode\": \"复制代码\",\n \"migrationFailed\": \"旧认证数据迁移失败:{{error}}\",\n \"loadModelsFailed\": \"加载 Copilot 模型列表失败\",\n \"deploymentType\": \"GitHub 部署类型\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例如:company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"认证状态\",\n \"notAuthenticated\": \"未认证\",\n \"loginWithChatGPT\": \"使用 ChatGPT 登录\",\n \"loginRequired\": \"请先登录 ChatGPT 账号\",\n \"waitingForAuth\": \"等待授权中...\",\n \"enterCode\": \"请在浏览器中输入以下验证码:\",\n \"accountCount\": \"{{count}} 个账号\",\n \"selectAccount\": \"选择账号\",\n \"selectAccountPlaceholder\": \"选择一个 ChatGPT 账号\",\n \"useDefaultAccount\": \"使用默认账号\",\n \"loggedInAccounts\": \"已登录账号\",\n \"defaultAccount\": \"默认\",\n \"selected\": \"已选中\",\n \"removeAccount\": \"移除账号\",\n \"setAsDefault\": \"设为默认\",\n \"addAnotherAccount\": \"添加其他账号\",\n \"logoutAll\": \"注销所有账号\",\n \"retry\": \"重试\",\n \"copyCode\": \"复制代码\",\n \"fastMode\": \"FAST 模式\",\n \"fastModeDescription\": \"发送 service_tier=\\\"priority\\\" 换取更低延迟。默认关闭——开启后会按更高速率消耗 ChatGPT 配额。\"\n },\n \"endpointTest\": {\n \"title\": \"请求地址管理\",\n \"endpoints\": \"个端点\",\n \"autoSelect\": \"自动选择\",\n \"testSpeed\": \"测速\",\n \"testing\": \"测速中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完成\",\n \"noEndpoints\": \"暂无端点\",\n \"failed\": \"失败\",\n \"enterValidUrl\": \"请输入有效的 URL\",\n \"invalidUrlFormat\": \"URL 格式不正确\",\n \"onlyHttps\": \"仅支持 HTTP/HTTPS\",\n \"urlExists\": \"该地址已存在\",\n \"saveFailed\": \"保存失败,请重试\",\n \"loadEndpointsFailed\": \"加载自定义端点失败:\",\n \"addEndpointFailed\": \"添加自定义端点失败:\",\n \"removeEndpointFailed\": \"删除自定义端点失败:\",\n \"removeFailed\": \"删除失败: {{error}}\",\n \"updateLastUsedFailed\": \"更新端点使用时间失败\",\n \"pleaseAddEndpoint\": \"请先添加端点\",\n \"testUnavailable\": \"测速功能不可用\",\n \"noResult\": \"未返回结果\",\n \"testFailed\": \"测速失败: {{error}}\",\n \"empty\": \"暂无端点\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"模型测试配置\",\n \"useCustomConfig\": \"使用单独配置\",\n \"testConfigDesc\": \"为此供应商配置单独的模型测试参数,不启用时使用全局配置。\",\n \"testModel\": \"测试模型\",\n \"testModelPlaceholder\": \"留空使用全局配置\",\n \"timeoutSecs\": \"超时时间(秒)\",\n \"testPrompt\": \"测试提示词\",\n \"degradedThreshold\": \"降级阈值(毫秒)\",\n \"maxRetries\": \"最大重试次数\",\n \"pricingConfig\": \"计费配置\",\n \"useCustomPricing\": \"使用单独配置\",\n \"pricingConfigDesc\": \"为此供应商配置单独的计费参数,不启用时使用全局默认配置。\",\n \"costMultiplier\": \"成本倍率\",\n \"costMultiplierPlaceholder\": \"留空使用全局默认(1)\",\n \"costMultiplierHint\": \"实际成本 = 基础成本 × 倍率,支持小数如 1.5\",\n \"pricingModelSourceLabel\": \"计费模式\",\n \"pricingModelSourceInherit\": \"继承全局默认\",\n \"pricingModelSourceRequest\": \"请求模型\",\n \"pricingModelSourceResponse\": \"返回模型\",\n \"pricingModelSourceHint\": \"选择按请求模型还是返回模型进行定价匹配\"\n },\n \"providerBudget\": {\n \"title\": \"用量预算\",\n \"description\": \"设置日/月美元预算上限,超出后将触发预警通知(留空表示不限制)\",\n \"dailyLimit\": \"日预算 (USD)\",\n \"dailyLimitPlaceholder\": \"例如 0.01\",\n \"dailyLimitInvalid\": \"日预算必须为非负数\",\n \"monthlyLimit\": \"月预算 (USD)\",\n \"monthlyLimitPlaceholder\": \"例如 10.00\",\n \"monthlyLimitInvalid\": \"月预算必须为非负数\"\n },\n \"onboarding\": {\n \"title\": \"快速上手\",\n \"dismiss\": \"关闭引导\",\n \"prev\": \"上一步\",\n \"next\": \"下一步\",\n \"done\": \"知道了\",\n \"step1\": {\n \"title\": \"添加项目\",\n \"desc\": \"所有功能围绕项目展开。点击侧边栏「我的项目 → 添加项目」,把你的代码仓库加进来,OpenSunstar 会自动扫描 AI 配置状态。\"\n },\n \"step2\": {\n \"title\": \"项目驾驶舱 — 今天有没有事\",\n \"desc\": \"「今日告警」只回答一个问题:今天有没有事。没事就显示「今天没事」—— 没事就是最好的消息。「项目看板」放聚合指标与资产矩阵,巡视内容不占开机第一眼。\"\n },\n \"step3\": {\n \"title\": \"AI资产配置 — 为项目落地资产\",\n \"desc\": \"在「项目配置 → AI资产配置」里为项目关联 MCP 服务器、Skills、Prompts 等资产。侧栏「Agent 配置」管全局库,这里管它们在项目上的关联。\"\n },\n \"step4\": {\n \"title\": \"工作流编排 — 建立可执行流程\",\n \"desc\": \"在「项目配置 → 工作流编排」里为项目配置阶段、预设与变更执行方案。方法论识别、预设编排、自定义编排、设计合约——四个独立维度,按需选用,无先后依赖。\"\n },\n \"addProvidersManually\": \"您可以在设置中手动添加供应商。\",\n \"apiKeyBadge\": \"API Key\",\n \"detectedMcpServers\": \"检测到的 MCP 服务器\",\n \"detectedProviders\": \"检测到的供应商\",\n \"getStarted\": \"开始使用\",\n \"mcpFromSource\": \"来自 {{source}}\",\n \"noConfigsFound\": \"未发现已有的 AI 工具配置。\",\n \"scanning\": \"扫描中...\",\n \"scanResultsSummary\": \"在您的系统中找到 {{count}} 项配置\",\n \"scanResultsTitle\": \"扫描结果\",\n \"scanSystem\": \"扫描我的系统\",\n \"skipForNow\": \"暂时跳过\",\n \"welcomeDescription\": \"您的 AI 编程助手统一控制面板。让我们扫描系统中已有的配置。\",\n \"welcomeTitle\": \"欢迎使用 OpenSunstar\"\n },\n \"bridge\": {\n \"title\": \"桥接 Prompt\",\n \"description\": \"将「{{name}}」桥接到其他 AI 工具,内容将自动转换格式。\",\n \"targetTool\": \"目标工具\",\n \"selectTarget\": \"选择目标工具...\",\n \"generatingPreview\": \"正在生成预览...\",\n \"previewLabel\": \"预览(前 500 字符)\",\n \"autoSyncOnEdit\": \"编辑时自动同步\",\n \"autoSyncDescription\": \"保存源 Prompt 时自动推送变更到已桥接的目标\",\n \"saveSettingFailed\": \"保存设置失败:{{error}}\",\n \"createBridge\": \"创建桥接\",\n \"bridging\": \"桥接中...\",\n \"createdWithWarnings\": \"桥接已创建,但有警告\",\n \"createdSuccess\": \"Prompt 已桥接到 {{label}}\",\n \"failed\": \"桥接失败:{{error}}\"\n },\n \"gistSync\": {\n \"title\": \"GitHub Gist 同步\",\n \"description\": \"通过私有 GitHub Gist 同步设置与 Skills\",\n \"sectionLabel\": \"GitHub Gist 同步\",\n \"patHint\": \"输入具有 gist 权限的 GitHub Personal Access Token 以启用 Gist 同步。\",\n \"save\": \"保存\",\n \"test\": \"测试连接\",\n \"upload\": \"上传\",\n \"download\": \"下载\",\n \"clear\": \"清除\",\n \"enterPat\": \"请输入 GitHub PAT\",\n \"patSaved\": \"GitHub PAT 已安全保存\",\n \"savePatFailed\": \"保存 PAT 失败:{{error}}\",\n \"connectedAs\": \"已连接为 {{username}}\",\n \"connectionFailed\": \"连接失败:{{error}}\",\n \"uploadSuccess\": \"已上传到 Gist {{gistId}}...\",\n \"uploadFailed\": \"上传失败:{{error}}\",\n \"downloadSuccess\": \"已从 {{device}} 下载\",\n \"downloadFailed\": \"下载失败:{{error}}\",\n \"remoteDevice\": \"远程设备\",\n \"configCleared\": \"Gist 同步配置已清除\",\n \"clearFailed\": \"清除失败:{{error}}\",\n \"gistIdLabel\": \"Gist ID\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json 配置内容\",\n \"authJsonStorageHint\": \"代理接管中显示的是存储的 auth 配置,不是实时 auth.json\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml 配置内容\",\n \"configTomlStorageHint\": \"代理接管中显示的是存储的 config 配置,不是实时 config.toml\",\n \"proxyTakeoverStorageNotice\": \"💡 当前应用处于代理接管状态。这里编辑的是存储的供应商配置,真实 live 配置已由代理临时接管\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑 Codex 通用配置片段\",\n \"commonConfigHint\": \"该片段会在勾选'写入通用配置'时追加到 config.toml 末尾\",\n \"enableGoalMode\": \"启用 Goal mode\",\n \"enableRemoteCompaction\": \"启用远程压缩\",\n \"remoteCompactionHint\": \"开启后会将当前 model_providers 条目的 name 写为 OpenAI,使 Codex 尝试使用远程压缩。\",\n \"apiUrlLabel\": \"API 请求地址\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"modelNameHint\": \"指定使用的模型,将自动更新到 config.toml 中\",\n \"modelName\": \"模型名称\",\n \"localRoutingToggle\": \"需要本地路由映射\",\n \"localRoutingOffHint\": \"如果您的供应商不是原生 OpenAI Responses API,或者模型名不是 Codex 默认的 GPT 系列,请打开此开关。\",\n \"localRoutingOnHint\": \"Codex 目前仅原生支持 OpenAI Responses API 与 GPT 系列模型;如果您的供应商使用 Chat Completions 协议或非 GPT 模型(如 DeepSeek、Kimi),则需要打开本开关,并在使用过程中保持本地路由开启。\",\n \"upstreamModelName\": \"上游模型名称\",\n \"upstreamModelNameHint\": \"Chat 格式下这里填写真实上游模型;路由会把 Codex 的 Responses 请求转换为 Chat Completions 并保持该模型。\",\n \"modelNamePlaceholder\": \"例如: gpt-5-codex\",\n \"contextWindow1M\": \"1M 上下文窗口\",\n \"contextWindow\": \"上下文窗口\",\n \"contextWindowPlaceholder\": \"例如: 128000\",\n \"autoCompactLimit\": \"压缩阈值\",\n \"autoCompactLimitPlaceholder\": \"例如: 90000\",\n \"autoCompactLimitHint\": \"上下文 token 数达到此阈值时自动压缩历史\",\n \"modelMetadataAdvanced\": \"模型元数据高级选项\",\n \"modelMetadataAdvancedHint\": \"用于未知模型的 Codex 元数据覆盖;清空字段会从 config.toml 删除对应配置。\",\n \"modelMappingTitle\": \"模型映射\",\n \"modelMappingHint\": \"生成 Codex model_catalog_json,让 /model 命令显示这些第三方模型名;表中条目按填写内容原样保存。修改后需要重启 Codex 才能刷新模型列表。\",\n \"addCatalogModel\": \"添加模型\",\n \"catalogDisplayName\": \"显示名称\",\n \"catalogDisplayNamePlaceholder\": \"例如: DeepSeek V4 Flash\",\n \"catalogModelId\": \"模型 ID\",\n \"catalogModelPlaceholder\": \"例如: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"菜单显示名\",\n \"catalogColumnModel\": \"实际请求模型\",\n \"catalogColumnContext\": \"上下文窗口\",\n \"reasoningModeToggle\": \"支持思考模式\",\n \"reasoningModeHint\": \"上游 Chat Completions 接口支持开启或关闭 thinking 时启用。Kimi、GLM、Qwen 等通常属于这一类。\",\n \"reasoningEffortToggle\": \"支持思考等级\",\n \"reasoningEffortHint\": \"上游支持 low/high/max 等思考深度控制时启用。启用后会自动启用思考模式,并把 Codex 的 reasoning.effort 转成上游 Chat 参数。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"预设供应商已自动配置;自定义供应商会按名称/地址自动推断。仅当自动识别不准时才需手动覆盖。\",\n \"advancedSectionHint\": \"包含本地路由映射、模型映射、思考能力与自定义 User-Agent。供应商使用 Chat Completions 协议或非 GPT 模型时,需在此开启本地路由映射。\",\n \"noCommonConfigToApply\": \"通用配置片段为空或没有可写入的内容\"\n },\n \"geminiConfig\": {\n \"envFile\": \"环境变量 (.env)\",\n \"envFileHint\": \"使用 .env 格式配置 Gemini 环境变量\",\n \"configJson\": \"配置文件 (config.json)\",\n \"configJsonHint\": \"使用 JSON 格式配置 Gemini 扩展参数(可选)\",\n \"writeCommonConfig\": \"写入通用配置\",\n \"editCommonConfig\": \"编辑通用配置\",\n \"editCommonConfigTitle\": \"编辑 Gemini 通用配置片段\",\n \"commonConfigHint\": \"该片段会写入 Gemini 的 .env(不允许包含 GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY)\",\n \"extractFromCurrent\": \"从编辑内容提取\",\n \"extractNoCommonConfig\": \"当前编辑内容没有可提取的通用配置\",\n \"extractFailed\": \"提取失败: {{error}}\",\n \"saveFailed\": \"保存失败: {{error}}\",\n \"extractedConfigInvalid\": \"提取的配置格式错误\",\n \"invalidJsonFormat\": \"通用配置片段格式错误(必须是有效的 JSON)\",\n \"commonConfigInvalidKeys\": \"通用配置片段不能包含 GOOGLE_GEMINI_BASE_URL 或 GEMINI_API_KEY(发现:{{keys}})\",\n \"commonConfigInvalidValues\": \"通用配置片段的值必须是字符串\",\n \"noCommonConfigToApply\": \"通用配置片段为空或没有可写入的内容\",\n \"configMergeFailed\": \"配置合并失败: {{error}}\",\n \"configReplaceFailed\": \"配置替换失败: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"接口格式\",\n \"selectPackage\": \"选择接口格式\",\n \"npmPackageHint\": \"选择 AI 服务的 API 接口格式\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"自定义 API 端点地址\",\n \"models\": \"模型配置\",\n \"modelsHint\": \"配置可用的模型及其显示名称\",\n \"addModel\": \"添加模型\",\n \"modelId\": \"模型 ID\",\n \"modelName\": \"显示名称\",\n \"noModels\": \"暂无模型配置\",\n \"modelsRequired\": \"请至少添加一个模型配置\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"配置文件中的唯一标识符,只能使用小写字母、数字和连字符\",\n \"providerKeyLockedHint\": \"该供应商已添加到应用配置中,供应商标识不可修改\",\n \"providerKeyRequired\": \"请填写供应商标识\",\n \"providerKeyDuplicate\": \"此标识已被使用,请更换\",\n \"providerKeyInvalid\": \"标识格式无效,只能使用小写字母、数字和连字符\",\n \"extraOptions\": \"额外选项\",\n \"extraOptionsHint\": \"配置额外的 SDK 选项,如 timeout、setCacheKey 等。值会自动解析类型(数字、布尔值等)。\",\n \"addExtraOption\": \"添加\",\n \"extraOptionKey\": \"键名\",\n \"extraOptionValue\": \"值\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"暂无额外选项\",\n \"noModelOptions\": \"模型选项,点击 + 添加\",\n \"modelExtraFields\": \"模型属性\",\n \"noModelExtraFields\": \"模型属性 (variants, cost 等),点击 + 添加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK 选项\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"预设供应商\",\n \"custom\": \"自定义配置\",\n \"other\": \"其他\",\n \"hint\": \"选择预设后可继续调整下方字段。\",\n \"searchTooltip\": \"搜索预设\",\n \"searchAriaLabel\": \"搜索预设供应商\",\n \"searchPlaceholder\": \"搜索名称、官网或分类...\",\n \"sortAriaLabel\": \"切换预设排序\",\n \"sortNameAscTooltip\": \"按名称 A-Z 排序\",\n \"sortOriginalTooltip\": \"恢复原始顺序\",\n \"noSearchResults\": \"没有匹配的预设供应商。\"\n },\n \"usage\": {\n \"title\": \"使用统计\",\n \"subtitle\": \"查看 AI 模型的使用情况和成本统计\",\n \"today\": \"24小时\",\n \"last7days\": \"7天\",\n \"last30days\": \"30天\",\n \"presetToday\": \"当天\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"总请求数\",\n \"totalCost\": \"总成本\",\n \"cost\": \"成本\",\n \"perMillion\": \"(每百万)\",\n \"trends\": \"使用趋势\",\n \"rangeToday\": \"过去 24 小时 (按小时)\",\n \"rangeLast7Days\": \"过去 7 天\",\n \"rangeLast30Days\": \"过去 30 天\",\n \"totalTokens\": \"新生成 Token (Input+Output)\",\n \"cacheTokens\": \"缓存 Token\",\n \"realTotal\": \"真实消耗 Tokens\",\n \"realTotalHint\": \"Input + Output + 缓存写入 + 缓存命中\",\n \"freshInput\": \"新增输入\",\n \"cacheHitRate\": \"缓存命中率\",\n \"requestLogs\": \"请求日志\",\n \"providerStats\": \"Provider 统计\",\n \"modelStats\": \"模型统计\",\n \"time\": \"时间\",\n \"provider\": \"供应商\",\n \"billingModel\": \"计费模型\",\n \"inputTokens\": \"输入\",\n \"outputTokens\": \"输出\",\n \"cacheReadTokens\": \"缓存命中\",\n \"cacheCreationTokens\": \"缓存创建\",\n \"timingInfo\": \"用时/首字\",\n \"status\": \"状态\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"请求模型\",\n \"responseModel\": \"返回模型\",\n \"noData\": \"暂无数据\",\n \"unknownProvider\": \"未知供应商\",\n \"stream\": \"流\",\n \"nonStream\": \"非流\",\n \"source\": \"来源\",\n \"requestsLabel\": \"次请求\",\n \"costLabel\": \"总成本\",\n \"appFilter\": {\n \"all\": \"全部\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokbuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"数据来源\",\n \"dataSource\": {\n \"proxy\": \"路由\",\n \"session_log\": \"会话日志\",\n \"codex_db\": \"Codex 数据库\",\n \"codex_session\": \"Codex 会话日志\",\n \"gemini_session\": \"Gemini 会话日志\",\n \"opencode_session\": \"OpenCode 会话日志\"\n },\n \"sessionSync\": {\n \"trigger\": \"同步会话日志\",\n \"import\": \"导入会话\",\n \"resync\": \"同步\",\n \"imported\": \"从会话日志导入了 {{count}} 条记录\",\n \"upToDate\": \"会话日志已是最新\",\n \"failed\": \"会话同步失败\"\n },\n \"totalRecords\": \"共 {{total}} 条记录\",\n \"goToPage\": \"跳转\",\n \"pageInputPlaceholder\": \"页码\",\n \"modelPricing\": \"模型定价\",\n \"loadPricingError\": \"加载定价数据失败\",\n \"modelPricingDesc\": \"配置各模型的 Token 成本\",\n \"noPricingData\": \"暂无定价数据。点击\\\"新增\\\"添加模型定价配置。\",\n \"model\": \"模型\",\n \"pricingModel\": \"计价模型\",\n \"displayName\": \"显示名称\",\n \"inputCost\": \"输入成本\",\n \"outputCost\": \"输出成本\",\n \"cacheReadCost\": \"缓存命中\",\n \"cacheWriteCost\": \"缓存创建\",\n \"pricingAudit\": \"审计\",\n \"pricingBuiltinPublic\": \"内置公开价格\",\n \"pricingUserOverride\": \"用户自定义\",\n \"pricingEffectiveAt\": \"生效\",\n \"longContextRate\": \"长上下文\",\n \"deleteConfirmTitle\": \"确认删除\",\n \"deleteConfirmDesc\": \"确定要删除此模型定价配置吗?此操作无法撤销。\",\n \"queryFailed\": \"查询失败\",\n \"refreshUsage\": \"刷新用量\",\n \"planUsage\": \"套餐用量\",\n \"hostConfirm\": {\n \"title\": \"确认外发域名\",\n \"message\": \"该供应商的自定义用量脚本要向以下域名发起请求(其中会包含你的 API 密钥):\\n\\n{{host}}\\n\\n仅在你信任该域名时才继续。确认后将记住此选择,直到目标域名发生变化。\",\n \"pending\": \"需先确认才能访问 {{host}}\",\n \"reviewButton\": \"查看\",\n \"confirm\": \"信任并继续\",\n \"cancel\": \"取消\"\n },\n \"invalid\": \"已失效\",\n \"total\": \"总:\",\n \"used\": \"已使用:\",\n \"remaining\": \"剩余:\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}} 分钟前\",\n \"hoursAgo\": \"{{count}} 小时前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"multiplePlans\": \"{{count}} 个套餐\",\n \"expand\": \"展开\",\n \"collapse\": \"收起\",\n \"modelIdPlaceholder\": \"例如: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例如: Claude 3.5 Sonnet\",\n \"appType\": \"应用类型\",\n \"allApps\": \"全部应用\",\n \"statusCode\": \"状态码\",\n \"searchProviderPlaceholder\": \"搜索供应商...\",\n \"searchModelPlaceholder\": \"搜索模型...\",\n \"timeRange\": \"时间范围\",\n \"customRange\": \"日历筛选\",\n \"customRangeHint\": \"支持日期与时间\",\n \"startTime\": \"开始时间\",\n \"endTime\": \"结束时间\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"创建\",\n \"cacheWriteNotReported\": \"OpenAI 协议不区分缓存写入,仅上报缓存命中\",\n \"cacheWritePartial\": \"部分协议(如 OpenAI)不上报缓存写入,数值可能偏低\",\n \"cacheRead\": \"命中\",\n \"baseCost\": \"基础\",\n \"costMultiplier\": \"成本倍率\",\n \"withMultiplier\": \"含倍率\",\n \"requestDetail\": \"请求详情\",\n \"requestNotFound\": \"请求未找到\",\n \"basicInfo\": \"基本信息\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"缓存写入成本\",\n \"costBreakdown\": \"成本明细\",\n \"performance\": \"性能信息\",\n \"latency\": \"延迟\",\n \"errorMessage\": \"错误信息\",\n \"requests\": \"请求数\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"平均成本\",\n \"avgLatency\": \"平均延迟\",\n \"successRate\": \"成功率\",\n \"requestId\": \"请求 ID\",\n \"never\": \"从不\",\n \"modelId\": \"模型 ID\",\n \"modelIdRequired\": \"模型 ID 不能为空\",\n \"inputCostPerMillion\": \"输入成本 (每百万 tokens, USD)\",\n \"outputCostPerMillion\": \"输出成本 (每百万 tokens, USD)\",\n \"invalidPrice\": \"价格必须为非负数\",\n \"invalidTimeRange\": \"请选择完整的开始/结束时间\",\n \"invalidTimeRangeOrder\": \"开始时间不能晚于结束时间\",\n \"timeRangeTooLarge\": \"时间范围过大,请缩小范围\",\n \"addPricing\": \"新增定价\",\n \"editPricing\": \"编辑定价\",\n \"pricingAdded\": \"定价已添加\",\n \"pricingUpdated\": \"定价已更新\",\n \"cacheReadCostPerMillion\": \"缓存读取成本 (每百万 tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"缓存写入成本 (每百万 tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"配置用量查询\",\n \"enableUsageQuery\": \"启用用量查询\",\n \"presetTemplate\": \"预设模板\",\n \"requestUrl\": \"请求地址\",\n \"requestUrlPlaceholder\": \"例如:https://api.example.com\",\n \"method\": \"HTTP 方法\",\n \"templateCustom\": \"自定义\",\n \"templateGeneral\": \"通用模板\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"官方\",\n \"templateOfficialSubscription\": \"官方订阅\",\n \"copilotAutoAuth\": \"自动使用 OAuth 认证,无需手动配置凭证\",\n \"tokenPlanHint\": \"自动使用供应商的 API Key 和 Base URL 查询 Token Plan 额度\",\n \"balanceHint\": \"自动使用供应商的 API Key 查询账户余额\",\n \"officialSubscriptionHint\": \"读取本机 CLI 的 OAuth 凭据,并调用官方接口查询订阅额度。默认关闭,只有启用后才会请求。\",\n \"resetDate\": \"重置日期\",\n \"premiumRequests\": \"Premium 请求\",\n \"credentialsConfig\": \"凭证配置\",\n \"credentialsHint\": \"留空则自动使用供应商配置\",\n \"optional\": \"可选\",\n \"apiKeyPlaceholder\": \"留空则使用供应商的 API Key\",\n \"baseUrlPlaceholder\": \"留空则使用供应商的请求地址\",\n \"baseUrl\": \"请求地址\",\n \"accessToken\": \"访问令牌(在个人安全设置里获取)\",\n \"accessTokenPlaceholder\": \"在'安全设置'里生成\",\n \"userId\": \"用户 ID\",\n \"userIdPlaceholder\": \"例如:114514\",\n \"defaultPlan\": \"默认套餐\",\n \"queryFailedMessage\": \"查询失败\",\n \"queryScript\": \"查询脚本(JavaScript)\",\n \"timeoutSeconds\": \"超时时间(秒)\",\n \"headers\": \"请求头\",\n \"body\": \"请求 Body\",\n \"timeoutHint\": \"范围: 2-30 秒\",\n \"timeoutMustBeInteger\": \"超时时间必须为整数,小数部分已忽略\",\n \"timeoutCannotBeNegative\": \"超时时间不能为负数\",\n \"autoIntervalMinutes\": \"自动查询间隔(分钟,0 表示不自动查询)\",\n \"autoQueryInterval\": \"自动查询间隔(分钟)\",\n \"autoQueryIntervalHint\": \"0 表示不自动查询,建议 5-60 分钟\",\n \"intervalMustBeInteger\": \"自动查询间隔必须为整数,小数部分已忽略\",\n \"intervalCannotBeNegative\": \"自动查询间隔不能为负数\",\n \"intervalAdjusted\": \"自动查询间隔已调整为 {{value}} 分钟\",\n \"scriptHelp\": \"脚本编写说明:\",\n \"configFormat\": \"配置格式:\",\n \"commentOptional\": \"可选\",\n \"commentResponseIsJson\": \"response 是 API 返回的 JSON 数据\",\n \"extractorFormat\": \"extractor 返回格式(所有字段均为可选):\",\n \"tips\": \"💡 提示:\",\n \"testing\": \"测试中...\",\n \"testScript\": \"测试脚本\",\n \"format\": \"格式化\",\n \"saveConfig\": \"保存配置\",\n \"scriptEmpty\": \"脚本配置不能为空\",\n \"mustHaveReturn\": \"脚本必须包含 return 语句\",\n \"testSuccess\": \"测试成功!\",\n \"testFailed\": \"测试失败\",\n \"formatSuccess\": \"格式化成功\",\n \"formatFailed\": \"格式化失败\",\n \"supportedVariables\": \"支持的变量\",\n \"variablesHint\": \"支持变量: {{apiKey}}, {{baseUrl}} | extractor 函数接收 API 响应的 JSON 对象\",\n \"scriptConfig\": \"请求配置\",\n \"extractorCode\": \"提取器代码\",\n \"extractorHint\": \"返回对象需包含剩余额度等字段\",\n \"fieldIsValid\": \"• isValid: 布尔值,套餐是否有效\",\n \"fieldInvalidMessage\": \"• invalidMessage: 字符串,失效原因说明(当 isValid 为 false 时显示)\",\n \"fieldRemaining\": \"• remaining: 数字,剩余额度\",\n \"fieldUnit\": \"• unit: 字符串,单位(如 \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: 字符串,套餐名称\",\n \"fieldTotal\": \"• total: 数字,总额度\",\n \"fieldUsed\": \"• used: 数字,已用额度\",\n \"fieldExtra\": \"• extra: 字符串,扩展字段,可自由补充需要展示的文本\",\n \"tip1\": \"• 变量 {{apiKey}} 和 {{baseUrl}} 会自动替换\",\n \"tip2\": \"• extractor 函数在沙箱环境中执行,支持 ES2020+ 语法\",\n \"tip3\": \"• 整个配置必须用 () 包裹,形成对象字面量表达式\"\n },\n \"errors\": {\n \"usage_query_failed\": \"用量查询失败\",\n \"configLoadFailedTitle\": \"配置加载失败\",\n \"configLoadFailedMessage\": \"无法读取配置文件:\\n{{path}}\\n\\n错误详情:\\n{{detail}}\\n\\n请手动检查 JSON 是否有效,或从同目录的备份文件(如 config.json.bak)恢复。\\n\\n应用将退出以便您进行修复。\",\n \"mcpPageLoadFailed\": \"发现 MCP 页面加载失败\",\n \"mcpPageLoadDescription\": \"MCP 注册表页面渲染出错,可能是数据异常或网络问题。\",\n \"pageLoadFailed\": \"页面加载失败\",\n \"pageLoadFailedDescription\": \"当前视图渲染过程中发生了未预期的错误,请尝试切换到其他页面或刷新。\"\n },\n \"presetSelector\": {\n \"title\": \"选择配置类型\",\n \"custom\": \"自定义\",\n \"customDescription\": \"手动配置供应商,需要填写完整的配置信息\",\n \"officialDescription\": \"官方登录,不需要填写 API Key\",\n \"presetDescription\": \"使用预设配置,只需填写 API Key\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"导入\",\n \"importExisting\": \"导入已有\",\n \"addMcp\": \"添加MCP\",\n \"discover\": \"发现MCP\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP 服务器管理\",\n \"addServer\": \"添加服务器\",\n \"editServer\": \"编辑服务器\",\n \"deleteServer\": \"删除服务器\",\n \"deleteConfirm\": \"确定要删除服务器 \\\"{{id}}\\\" 吗?此操作无法撤销。\",\n \"noServers\": \"暂无服务器\",\n \"enabledApps\": \"启用的应用\",\n \"noImportFound\": \"未发现需要导入的 MCP 服务器。所有服务器已在 OpenSunstar 统一管理中。\",\n \"importSuccess\": \"成功导入 {{count}} 个 MCP 服务器\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"用户级 MCP 配置路径\",\n \"serverList\": \"服务器列表\",\n \"loading\": \"加载中...\",\n \"empty\": \"暂无 MCP 服务器\",\n \"emptyDescription\": \"点击右上角按钮添加第一个 MCP 服务器\",\n \"add\": \"添加 MCP\",\n \"addServer\": \"新增 MCP\",\n \"editServer\": \"编辑 MCP\",\n \"addClaudeServer\": \"新增 Claude Code MCP\",\n \"editClaudeServer\": \"编辑 Claude Code MCP\",\n \"addCodexServer\": \"新增 Codex MCP\",\n \"editCodexServer\": \"编辑 Codex MCP\",\n \"configPath\": \"配置路径\",\n \"serverCount\": \"已配置 {{count}} 个 MCP 服务器\",\n \"enabledCount\": \"已启用 {{count}} 个\",\n \"template\": {\n \"fetch\": \"快速模板:mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP 标题(唯一)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"显示名称\",\n \"namePlaceholder\": \"例如 @modelcontextprotocol/server-time\",\n \"enabledApps\": \"启用到应用\",\n \"noAppsWarning\": \"至少选择一个应用\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"可选的描述信息\",\n \"tags\": \"标签(逗号分隔)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"主页链接\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"文档链接\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"附加信息\",\n \"jsonConfig\": \"完整的 JSON 配置\",\n \"jsonConfigOrPrefix\": \"完整的 JSON 配置或者使用\",\n \"tomlConfigOrPrefix\": \"完整的 TOML 配置或者使用\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"完整的 TOML 配置\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"配置向导\",\n \"syncOtherSide\": \"同步到 {{target}}\",\n \"syncOtherSideHint\": \"勾选后会把当前配置同时写入 {{target}},若存在同名配置将被覆盖\",\n \"willOverwriteWarning\": \"将覆盖 {{target}} 中的同名配置\"\n },\n \"wizard\": {\n \"title\": \"MCP 配置向导\",\n \"hint\": \"快速配置 MCP 服务器,自动生成 JSON 配置\",\n \"type\": \"类型\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"命令\",\n \"commandPlaceholder\": \"npx 或 uvx\",\n \"args\": \"参数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"环境变量\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"请输入 URL\",\n \"headers\": \"请求头(可选)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"配置预览\",\n \"apply\": \"应用配置\"\n },\n \"id\": \"标识 (唯一)\",\n \"type\": \"类型\",\n \"command\": \"命令\",\n \"validateCommand\": \"校验命令\",\n \"args\": \"参数\",\n \"argsPlaceholder\": \"例如:mcp-server-fetch --help\",\n \"env\": \"环境变量 (一行一个,KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"重置\",\n \"msg\": {\n \"saved\": \"已保存\",\n \"deleted\": \"已删除\",\n \"enabled\": \"已启用\",\n \"disabled\": \"已禁用\",\n \"templateAdded\": \"已添加模板\"\n },\n \"error\": {\n \"idRequired\": \"请填写标识\",\n \"idExists\": \"该标识已存在,请更换\",\n \"jsonInvalid\": \"JSON 格式错误,请检查\",\n \"tomlInvalid\": \"TOML 格式错误,请检查\",\n \"commandRequired\": \"请填写命令\",\n \"singleServerObjectRequired\": \"此处只需单个服务器对象,请不要粘贴包含 mcpServers 的整份配置\",\n \"saveFailed\": \"保存失败\",\n \"deleteFailed\": \"删除失败\"\n },\n \"discovery\": {\n \"title\": \"发现 MCP\",\n \"searchPlaceholder\": \"输入关键字搜索 MCP 服务器...\",\n \"totalFound\": \"找到 {{count}} 个服务器\",\n \"alreadyInstalled\": \"已安装 {{count}} 个\",\n \"noResults\": \"未找到与 \\\"{{query}}\\\" 相关的服务器\",\n \"noServers\": \"暂无可用服务器\",\n \"official\": \"官方\",\n \"installed\": \"已安装\",\n \"install\": \"安装\",\n \"remotes\": \"连接方式\",\n \"website\": \"网站\",\n \"repository\": \"仓库\",\n \"hotSubtitle\": \"按安装量排序的热门 MCP 服务器(Smithery)\",\n \"loadError\": \"加载 MCP 注册表失败\",\n \"picksSubtitle\": \"经 Smithery 认证的高质量 MCP 服务器\",\n \"tabHot\": \"安装热榜\",\n \"tabPicks\": \"编辑精选\",\n \"tabSearch\": \"搜索 MCP\",\n \"verified\": \"认证\"\n },\n \"test\": {\n \"testConnection\": \"测试链接\",\n \"batchTestConnection\": \"批量测试所有服务器链接\",\n \"batchProgress\": \"测试中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全部 {{count}} 个服务器连接成功\",\n \"batchSummary\": \"{{connected}} 个成功,{{failed}} 个失败(共 {{total}} 个)\",\n \"noServersToTest\": \"没有可测试的服务器\",\n \"connected\": \"已连接\",\n \"authRequired\": \"需验证\",\n \"unreachable\": \"无法连接\",\n \"timeout\": \"超时\",\n \"commandFailed\": \"启动失败\",\n \"unexpected\": \"异常\"\n },\n \"validation\": {\n \"ok\": \"命令可用\",\n \"fail\": \"命令不可用\"\n },\n \"confirm\": {\n \"deleteTitle\": \"删除 MCP 服务器\",\n \"deleteMessage\": \"确定要删除 MCP 服务器 \\\"{{id}}\\\" 吗?此操作无法撤销。\"\n },\n \"presets\": {\n \"title\": \"选择 MCP 类型\",\n \"enable\": \"启用\",\n \"enabled\": \"已启用\",\n \"installed\": \"已安装\",\n \"docs\": \"文档\",\n \"requiresEnv\": \"需要环境变量\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"通用 HTTP 请求工具,支持 GET/POST 等 HTTP 方法,适合快速请求接口/抓取网页数据\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"时间查询工具,提供当前时间、时区转换、日期计算等功能\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"知识图谱记忆系统,支持存储实体、关系和观察,让 AI 记住对话中的重要信息\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"顺序思考工具,帮助 AI 将复杂问题分解为多个步骤,逐步深入思考\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 文档搜索工具,提供最新的库文档和代码示例,配置 key 会有更高限额\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude 提示词管理\",\n \"codexTitle\": \"Codex 提示词管理\",\n \"add\": \"添加提示词\",\n \"edit\": \"编辑提示词\",\n \"addTitle\": \"添加 {{appName}} 提示词\",\n \"editTitle\": \"编辑 {{appName}} 提示词\",\n \"import\": \"导入现有\",\n \"count\": \"共 {{count}} 个提示词\",\n \"enabled\": \"已启用\",\n \"enable\": \"启用\",\n \"enabledName\": \"已启用: {{name}}\",\n \"noneEnabled\": \"未启用任何提示词\",\n \"currentFile\": \"当前 {{filename}} 内容\",\n \"empty\": \"暂无提示词\",\n \"emptyDescription\": \"点击右上角按钮添加或导入提示词\",\n \"loading\": \"加载中...\",\n \"name\": \"名称\",\n \"namePlaceholder\": \"例如:项目默认提示词\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"可选的描述信息\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\n在此输入提示词内容...\",\n \"loadFailed\": \"加载提示词失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"enableSuccess\": \"启用成功\",\n \"enableFailed\": \"启用失败\",\n \"disableSuccess\": \"禁用成功\",\n \"disableFailed\": \"禁用失败\",\n \"importSuccess\": \"导入成功\",\n \"importFailed\": \"导入失败\",\n \"confirm\": {\n \"deleteTitle\": \"确认删除\",\n \"deleteMessage\": \"确定要删除提示词 \\\"{{name}}\\\" 吗?\"\n },\n \"fragment\": {\n \"isFragment\": \"规则片段\",\n \"parent\": \"所属 Prompt\",\n \"selectParent\": \"选择父 Prompt\",\n \"priority\": \"优先级(高者优先合并)\",\n \"targets\": \"目标工具(逗号分隔,* 表示全部)\",\n \"globs\": \"文件 Glob(JSON 数组)\",\n \"badge\": \"片段\"\n }\n },\n \"dryRun\": {\n \"title\": \"预览模式(Dry Run)\",\n \"description\": \"开启后,Prompt 激活等写入操作将先显示 Diff 预览,确认后才实际写入\",\n \"settingsTitle\": \"预览模式(Dry Run)\",\n \"settingsDescription\": \"写入前预览 Diff,确认后再应用到磁盘\",\n \"confirmWrite\": \"确认写入\",\n \"promptActivationTitle\": \"Prompt 激活预览\",\n \"promptActivationDesc\": \"预览模式已开启,确认后将写入目标文件\",\n \"current\": \"当前文件\",\n \"after\": \"激活后\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"命令\",\n \"empty\": \"暂无自定义命令\",\n \"add\": \"添加命令\",\n \"edit\": \"编辑命令\",\n \"count\": \"共 {{count}} 个命令\",\n \"loadFailed\": \"加载命令失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"confirm\": {\n \"deleteTitle\": \"删除命令\",\n \"deleteMessage\": \"确定删除命令 \\\"{{name}}\\\"?已同步的文件将被清理。\"\n },\n \"form\": {\n \"name\": \"命令名称\",\n \"description\": \"描述\",\n \"content\": \"命令内容(Markdown)\",\n \"arguments\": \"参数定义(JSON)\",\n \"syncTargets\": \"同步到\"\n },\n \"variableHelp\": {\n \"title\": \"模板变量\",\n \"arguments\": \"Claude Code / Gemini 用户输入参数占位符\",\n \"codexNote\": \"Codex 不支持独立命令文件,勾选后不会写入磁盘。\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"暂无生命周期钩子\",\n \"add\": \"添加钩子\",\n \"edit\": \"编辑钩子\",\n \"count\": \"共 {{count}} 个钩子\",\n \"loadFailed\": \"加载钩子失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"syncSuccess\": \"已同步到 Claude Code\",\n \"syncFailed\": \"同步失败\",\n \"syncNow\": \"同步到 Claude\",\n \"claudeOnlyNote\": \"当前仅支持同步到 Claude Code(settings.json hooks 字段)\",\n \"timeoutLabel\": \"超时 {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"删除钩子\",\n \"deleteMessage\": \"确定删除此钩子?settings.json 将同步更新。\"\n },\n \"form\": {\n \"eventType\": \"事件类型\",\n \"toolPattern\": \"工具匹配(glob)\",\n \"hookCommand\": \"Shell 命令\",\n \"timeout\": \"超时(秒,1-300)\",\n \"description\": \"描述\"\n },\n \"eventType\": {\n \"PreToolUse\": \"工具调用前\",\n \"PostToolUse\": \"工具调用后\",\n \"Notification\": \"通知\",\n \"Stop\": \"停止\"\n },\n \"multiCliNote\": \"默认同步到 Claude Code;可通过列表项图标启用 Codex / Gemini CLI / Hermes。\",\n \"toggleFailed\": \"切换同步目标失败\"\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"在 Claude / Codex / Gemini 等工具间迁移 Prompt、MCP、Skill 与 Command 配置\",\n \"sourceApp\": \"源工具\",\n \"targetApp\": \"目标工具\",\n \"contentType\": \"配置类型\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"选择目标工具\",\n \"notFound\": \"文件不存在\",\n \"loadFailed\": \"检测源配置失败\",\n \"previewing\": \"生成预览…\",\n \"warnings\": \"转换提示\",\n \"unmapped\": \"未映射章节: {{section}}\",\n \"sourcePreview\": \"源内容\",\n \"convertedPreview\": \"转换后\",\n \"overwrite\": \"覆盖已存在的目标文件(写入前会自动备份 .bak.opensunstar)\",\n \"apply\": \"确认写入\",\n \"applySuccess\": \"配置已写入目标工具\",\n \"applyFailed\": \"写入失败\",\n \"steps\": {\n \"source\": \"选择源\",\n \"previewSource\": \"预览源\",\n \"previewTarget\": \"预览转换\",\n \"confirm\": \"确认写入\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore\",\n \"empty\": \"暂无忽略规则\",\n \"emptyHint\": \"添加 glob 规则后,将同步到 .claudeignore、.codexignore 等文件\",\n \"add\": \"添加规则\",\n \"edit\": \"编辑忽略规则\",\n \"count\": \"共 {{count}} 条规则\",\n \"loadFailed\": \"加载忽略规则失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"importGitignore\": \"从 .gitignore 导入\",\n \"importSuccess\": \"已导入 {{count}} 条规则\",\n \"importFailed\": \"导入失败\",\n \"syncNow\": \"同步到工具\",\n \"syncSuccess\": \"已同步到各工具 ignore 文件\",\n \"syncFailed\": \"同步失败\",\n \"confirm\": {\n \"deleteTitle\": \"删除规则\",\n \"deleteMessage\": \"确定删除此忽略规则?相关 ignore 文件将同步更新。\"\n },\n \"form\": {\n \"pattern\": \"Glob 模式\",\n \"description\": \"描述\",\n \"syncTargets\": \"同步到\"\n }\n },\n \"permissions\": {\n \"title\": \"Permissions\",\n \"empty\": \"暂无工具权限规则\",\n \"emptyHint\": \"管理 Claude Code 的 allow/deny 工具列表,可与 Hooks 共存于 settings.json\",\n \"add\": \"添加权限\",\n \"edit\": \"编辑权限\",\n \"count\": \"共 {{count}} 条权限\",\n \"loadFailed\": \"加载权限失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"syncNow\": \"同步到 Claude\",\n \"syncSuccess\": \"已同步到 Claude settings.json\",\n \"syncFailed\": \"同步失败\",\n \"presets\": \"预设模板:\",\n \"presetApplied\": \"预设已应用\",\n \"presetFailed\": \"应用预设失败\",\n \"claudeOnlyNote\": \"当前仅同步到 Claude Code settings.json permissions 字段\",\n \"confirm\": {\n \"deleteTitle\": \"删除权限\",\n \"deleteMessage\": \"确定删除此权限规则?settings.json 将同步更新。\"\n },\n \"form\": {\n \"type\": \"权限类型\",\n \"toolPattern\": \"工具匹配\",\n \"description\": \"描述\"\n },\n \"type\": {\n \"allowedTools\": \"允许\",\n \"deniedTools\": \"拒绝\",\n \"autoApprove\": \"自动批准\"\n },\n \"multiCliNote\": \"默认同步到 Claude Code;保存后可在列表中切换 Codex、Gemini、OpenCode、OpenClaw 等目标。\",\n \"toggleFailed\": \"切换同步目标失败\"\n },\n \"workspace\": {\n \"title\": \"项目驾驶舱\",\n \"subtitle\": \"汇总各项目 AI 配置状态与近期活跃度,帮你先看该看的\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 配置\"\n },\n \"tabs\": {\n \"label\": \"工作区视图\",\n \"dashboard\": \"今日告警\",\n \"board\": \"项目看板\"\n },\n \"dashboard\": {\n \"title\": \"今日告警\",\n \"subtitle\": \"共 {{count}} 个项目 · 优先关注进度与 AI 资产配置\",\n \"attentionCount\": \"待关注项目\",\n \"attentionHint\": \"就绪不足或资产缺失\",\n \"avgReadiness\": \"平均就绪分\",\n \"missingMcp\": \"缺 MCP 项目\",\n \"activeProjects\": \"近 {{days}} 天活跃\",\n \"activeHint\": \"有 Git 提交\",\n \"queueTitle\": \"建议优先处理\",\n \"allGood\": \"各项目配置状态良好,可直接进入迭代。\",\n \"configureAssets\": \"配置资产\",\n \"reasonReadiness\": \"就绪分 {{score}}/{{max}}\",\n \"reasonDrift\": \"配置不一致 {{count}} 项\",\n \"reasonUnmanaged\": \"尚未纳入 OpenSunstar 管理\",\n \"reasonMcp\": \"未关联 MCP\",\n \"reasonSkills\": \"未配置 Skills\",\n \"reasonPrompts\": \"未关联 Prompts\",\n \"reasonProgress\": \"MVP 进度 {{progress}}%\",\n \"lastUpdated\": \"上次更新\",\n \"updatedJustNow\": \"刚刚更新\",\n \"updatedMinutesAgo\": \"{{count}} 分钟前更新\",\n \"updatedHoursAgo\": \"{{count}} 小时前更新\",\n \"updatedAt\": \"更新于 {{time}}\",\n \"refreshing\": \"正在刷新…\",\n \"loading\": \"正在汇总项目就绪与资产数据…\",\n \"mvpBehindHint\": \"{{count}} 个 MVP 项目进度低于 50%,建议优先推进。\",\n \"activeSub\": \"共 {{commits}} 次提交 · 活跃度 {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 资产总览\",\n \"subtitle\": \"按项目查看 MCP / Skills / Prompts 关联与就绪状态\",\n \"loading\": \"正在汇总各项目 AI 资产…\",\n \"project\": \"项目\",\n \"stage\": \"阶段\",\n \"readiness\": \"就绪\",\n \"progress\": \"进度\",\n \"refreshing\": \"更新中\",\n \"subtitle8\": \"按项目查看 8 类 AI 资产关联数量与就绪状态(项目级启用子集)\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"已创建备份:{{path}}\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"配置文件中的唯一标识符,只能使用小写字母、数字和连字符\",\n \"providerKeyLockedHint\": \"该供应商已添加到应用配置中,供应商标识不可修改\",\n \"providerKeyRequired\": \"请填写供应商标识\",\n \"providerKeyDuplicate\": \"此标识已被使用,请更换\",\n \"providerKeyInvalid\": \"标识格式无效,只能使用小写字母、数字和连字符\",\n \"apiProtocol\": \"API 协议\",\n \"selectProtocol\": \"选择 API 协议\",\n \"apiProtocolHint\": \"选择与供应商 API 兼容的协议类型。大多数供应商使用 OpenAI Completions 格式。\",\n \"baseUrl\": \"API 端点\",\n \"baseUrlHint\": \"供应商的 API 端点地址。\",\n \"models\": \"模型列表\",\n \"addModel\": \"添加模型\",\n \"noModels\": \"暂无模型配置。点击添加模型来配置可用模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"显示名称\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"上下文窗口\",\n \"maxTokens\": \"最大输出 Tokens\",\n \"reasoning\": \"推理模式\",\n \"reasoningOn\": \"启用\",\n \"reasoningOff\": \"关闭\",\n \"inputTypes\": \"输入类型\",\n \"inputCost\": \"输入价格 ($/M tokens)\",\n \"outputCost\": \"输出价格 ($/M tokens)\",\n \"advancedOptions\": \"高级选项\",\n \"cacheReadCost\": \"缓存读取价格 ($/M tokens)\",\n \"cacheWriteCost\": \"缓存写入价格 ($/M tokens)\",\n \"cacheCostHint\": \"缓存价格用于计算 Prompt Caching 的成本。如不使用缓存可留空。\",\n \"modelsHint\": \"配置该供应商支持的模型。模型 ID 用于 API 调用,显示名称用于界面展示。\",\n \"userAgent\": \"发送 User-Agent\",\n \"userAgentHint\": \"部分供应商需要浏览器 User-Agent 才能正常访问。\",\n \"env\": {\n \"title\": \"环境变量\",\n \"description\": \"管理 openclaw.json 中的环境变量配置(API Key、自定义变量等)\",\n \"editorHint\": \"以 JSON 形式编辑整个 env 节点。支持 env.vars、env.shellEnv 等嵌套对象。\",\n \"objectRequired\": \"OpenClaw 的 env 必须是 JSON 对象。\",\n \"invalidJson\": \"OpenClaw 的 env 必须是合法 JSON。\",\n \"empty\": \"OpenClaw 的 env 不能为空。空对象请使用 {}。\",\n \"keyPlaceholder\": \"变量名\",\n \"valuePlaceholder\": \"值\",\n \"add\": \"添加变量\",\n \"saveSuccess\": \"环境变量已保存\",\n \"saveFailed\": \"保存环境变量失败\",\n \"loadFailed\": \"读取环境变量失败\",\n \"duplicateKey\": \"检测到重复的变量名: {{key}}\"\n },\n \"tools\": {\n \"title\": \"工具权限\",\n \"description\": \"管理 openclaw.json 中的工具权限配置(允许/拒绝列表)\",\n \"profile\": \"权限模式\",\n \"profileMinimal\": \"最小权限\",\n \"profileCoding\": \"编码\",\n \"profileMessaging\": \"对话\",\n \"profileFull\": \"完全访问\",\n \"profileUnset\": \"未设置\",\n \"unsupportedProfileTitle\": \"检测到不受支持的工具配置\",\n \"unsupportedProfileDescription\": \"当前 tools.profile 的值“{{value}}”不在 OpenClaw 支持列表内。在你手动选择新值之前,它会被保留。\",\n \"unsupportedProfileLabel\": \"不受支持\",\n \"allowList\": \"允许列表\",\n \"denyList\": \"拒绝列表\",\n \"patternPlaceholder\": \"工具名称或模式\",\n \"addAllow\": \"添加允许\",\n \"addDeny\": \"添加拒绝\",\n \"saveSuccess\": \"工具权限已保存\",\n \"saveFailed\": \"保存工具权限失败\",\n \"loadFailed\": \"读取工具权限失败\"\n },\n \"agents\": {\n \"title\": \"Agents 配置\",\n \"description\": \"管理 openclaw.json 中的 agents.defaults 配置(默认模型、运行参数等)\",\n \"modelSection\": \"模型配置\",\n \"primaryModel\": \"默认模型\",\n \"primaryModelHint\": \"从已配置供应商的模型中选择默认模型\",\n \"notSet\": \"未设置\",\n \"fallbackModels\": \"回退模型\",\n \"fallbackModelsHint\": \"当主模型不可用时,按优先级依次尝试以下回退模型\",\n \"addFallback\": \"添加回退模型\",\n \"noModels\": \"暂无已配置的供应商模型。请先添加 OpenClaw 供应商。\",\n \"notInList\": \"{{value}} (供应商未配置)\",\n \"runtimeSection\": \"运行参数\",\n \"workspace\": \"工作区路径\",\n \"timeout\": \"超时时间(秒)\",\n \"contextTokens\": \"上下文 Token 数\",\n \"maxConcurrent\": \"最大并发数\",\n \"legacyTimeoutTitle\": \"检测到旧版超时字段\",\n \"legacyTimeoutDescription\": \"当前配置仍在使用 agents.defaults.timeout。保存本页面时会迁移为 timeoutSeconds。\",\n \"saveSuccess\": \"Agents 配置已保存\",\n \"saveFailed\": \"保存 Agents 配置失败\",\n \"loadFailed\": \"读取 Agents 配置失败\"\n },\n \"health\": {\n \"title\": \"检测到 OpenClaw 配置警告\",\n \"invalidToolsProfile\": \"tools.profile 使用了不受支持的值。OpenClaw 当前只支持 minimal、coding、messaging、full。\",\n \"legacyTimeout\": \"agents.defaults.timeout 已废弃。打开并保存 Agents 面板即可迁移到 timeoutSeconds。\",\n \"stringifiedEnvVars\": \"env.vars 应为对象,但当前值看起来像被字符串化或已损坏。\",\n \"stringifiedShellEnv\": \"env.shellEnv 应为对象,但当前值看起来像被字符串化或已损坏。\",\n \"parseFailed\": \"openclaw.json 不是合法 JSON5。请先修复文件,再通过这里编辑。\"\n },\n \"primaryModel\": \"默认模型\",\n \"fallbackModel\": \"回退模型\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API 端点\",\n \"baseUrlHint\": \"供应商的 API 端点地址。\",\n \"providerKey\": \"供应商标识\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"只能使用小写字母、数字和连字符。用作 config.yaml 中的供应商名称。\",\n \"providerKeyLockedHint\": \"该供应商已添加到 Hermes 配置中,标识不可修改。\",\n \"providerKeyRequired\": \"供应商标识不能为空\",\n \"providerKeyInvalid\": \"供应商标识只能包含小写字母、数字和连字符\",\n \"providerKeyDuplicate\": \"该供应商标识已存在\",\n \"apiMode\": \"API 模式\",\n \"apiModeHint\": \"供应商 API 协议。请根据端点选择正确的协议。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API 端点不能为空\",\n \"baseUrlScheme\": \"请使用 http:// 或 https:// 开头的地址\",\n \"baseUrlInvalid\": \"API 端点不是有效的 URL\",\n \"models\": \"模型列表\",\n \"addModel\": \"添加模型\",\n \"noModels\": \"暂无模型配置。切换到此供应商时将不会更新默认模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"显示名称\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"上下文长度\",\n \"advancedOptions\": \"高级选项\",\n \"modelsHint\": \"切换到此供应商时,第一个模型会写入顶层 model.default。\",\n \"primaryModel\": \"默认模型\",\n \"fallbackModel\": \"备选模型\",\n \"providerAdvanced\": \"供应商高级选项\",\n \"rateLimitDelay\": \"请求间隔(秒)\",\n \"rateLimitDelayHint\": \"连续请求间的最小间隔秒数(可选)。留空表示无限制。\"\n },\n \"webui\": {\n \"open\": \"打开 Hermes Web UI\",\n \"offline\": \"Hermes Web UI 未启动,请先运行 `hermes dashboard` 启动服务。\",\n \"openFailed\": \"打开 Hermes Web UI 失败\",\n \"launchConfirmTitle\": \"Hermes Dashboard 未启动\",\n \"launchConfirmMessage\": \"是否打开终端并运行 `hermes dashboard` 启动服务?\\n\\n启动完成后会自动打开浏览器。\\n\\n若终端提示找不到 hermes 或缺少 web 依赖,请先运行:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"打开终端并启动\",\n \"launching\": \"已在终端启动 hermes dashboard\",\n \"launchFailed\": \"打开终端失败\"\n },\n \"memory\": {\n \"title\": \"记忆管理\",\n \"agentTab\": \"Agent 记忆 (MEMORY.md)\",\n \"userTab\": \"用户画像 (USER.md)\",\n \"usage\": \"已用 {{current}} / {{limit}} 字符\",\n \"overLimit\": \"已超过上限,Hermes 下次加载时会截断\",\n \"enableOn\": \"已启用\",\n \"enableOff\": \"已禁用\",\n \"disabledHint\": \"在重新启用前 Hermes 会跳过此记忆\",\n \"toggleFailed\": \"切换记忆状态失败\",\n \"saveSuccess\": \"记忆已保存\",\n \"saveFailed\": \"保存记忆失败\",\n \"loadFailed\": \"读取记忆文件失败\",\n \"openConfig\": \"在 Hermes Web UI 调整上限\",\n \"runtimeNote\": \"更改将在 Hermes 下次启动或新建会话时生效。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"检测到系统环境变量冲突\",\n \"description\": \"发现 {{count}} 个环境变量可能会覆盖您的配置\"\n },\n \"actions\": {\n \"expand\": \"查看详情\",\n \"collapse\": \"收起\",\n \"selectAll\": \"全选\",\n \"clearSelection\": \"取消选择\",\n \"deleteSelected\": \"删除选中 ({{count}})\",\n \"deleting\": \"删除中...\"\n },\n \"field\": {\n \"value\": \"值\",\n \"source\": \"来源\"\n },\n \"source\": {\n \"userRegistry\": \"用户环境变量 (注册表)\",\n \"systemRegistry\": \"系统环境变量 (注册表)\",\n \"systemEnv\": \"系统环境变量\"\n },\n \"delete\": {\n \"success\": \"环境变量已成功删除\",\n \"error\": \"删除环境变量失败\"\n },\n \"backup\": {\n \"location\": \"备份位置: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"确认删除环境变量\",\n \"message\": \"确定要删除 {{count}} 个环境变量吗?\",\n \"backupNotice\": \"删除前将自动备份,您可以稍后恢复。删除后需要重启应用或终端才能生效。\",\n \"confirm\": \"确认删除\"\n },\n \"error\": {\n \"noSelection\": \"请选择要删除的环境变量\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"从流行的仓库发现并安装技能,扩展 Claude Code/Codex/Gemini 的能力\",\n \"refresh\": \"刷新\",\n \"refreshing\": \"刷新中...\",\n \"repoManager\": \"仓库管理\",\n \"count\": \"共 {{count}} 个技能\",\n \"empty\": \"暂无可用技能\",\n \"emptyDescription\": \"添加技能仓库以发现可用的技能\",\n \"addRepo\": \"添加技能仓库\",\n \"loading\": \"加载中...\",\n \"installed\": \"已安装\",\n \"install\": \"安装\",\n \"installing\": \"安装中...\",\n \"uninstall\": \"卸载\",\n \"uninstalling\": \"卸载中...\",\n \"view\": \"查看\",\n \"noDescription\": \"暂无描述\",\n \"loadFailed\": \"加载失败\",\n \"installSuccess\": \"技能 {{name}} 已安装\",\n \"installFailed\": \"安装失败\",\n \"uninstallSuccess\": \"技能 {{name}} 已卸载\",\n \"uninstallFailed\": \"卸载失败\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"可更新\",\n \"updateSuccess\": \"技能 {{name}} 已更新到最新版本\",\n \"updateFailed\": \"更新失败\",\n \"checkUpdates\": \"检查更新\",\n \"checkingUpdates\": \"检查中...\",\n \"noUpdates\": \"所有技能已是最新版本\",\n \"updatesFound\": \"发现 {{count}} 个技能有可用更新\",\n \"updateAll\": \"全部更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"已成功更新 {{count}} 个技能\",\n \"batchSelect\": \"批量操作\",\n \"exitBatch\": \"取消选择\",\n \"selectAll\": \"全选\",\n \"deselectAll\": \"取消全选\",\n \"selectedCount\": \"已选 {{count}} 项\",\n \"batchForApp\": \"对选中应用\",\n \"batchEnableSuccess\": \"已为 {{count}} 个技能启用 {{app}}\",\n \"batchDisableSuccess\": \"已为 {{count}} 个技能禁用 {{app}}\",\n \"batchUninstall\": \"卸载\",\n \"batchUninstallTitle\": \"批量卸载\",\n \"batchUninstallConfirm\": \"确定要卸载 {{count}} 个技能吗?\",\n \"batchUninstallSuccess\": \"成功卸载 {{count}} 个技能\",\n \"batchUninstallPartial\": \"卸载完成:{{success}} 成功,{{fail}} 失败\",\n \"error\": {\n \"skillNotFound\": \"技能不存在:{{directory}}\",\n \"missingRepoInfo\": \"缺少仓库信息(owner 或 name)\",\n \"downloadTimeout\": \"下载仓库 {{owner}}/{{name}} 超时({{timeout}}秒)\",\n \"downloadTimeoutHint\": \"请检查网络连接或稍后重试\",\n \"skillPathNotFound\": \"仓库 {{owner}}/{{name}} 中未找到技能路径 '{{path}}'\",\n \"skillDirNotFound\": \"技能目录不存在:{{path}}\",\n \"directoryConflict\": \"技能目录 '{{directory}}' 已被 {{existing_repo}} 占用,无法从 {{new_repo}} 安装\",\n \"emptyArchive\": \"下载的压缩包为空\",\n \"downloadFailed\": \"下载失败:HTTP {{status}}\",\n \"allBranchesFailed\": \"所有分支下载失败,尝试了:{{branches}}\",\n \"httpError\": \"HTTP 错误 {{status}}\",\n \"http403\": \"GitHub 访问受限,可能是请求频率过高\",\n \"http404\": \"仓库或分支不存在,请检查地址\",\n \"http429\": \"请求过于频繁,请等待后重试\",\n \"parseMetadataFailed\": \"解析技能元数据失败\",\n \"getHomeDirFailed\": \"无法获取用户主目录\",\n \"noSkillsInZip\": \"ZIP 文件中未找到技能(需包含 SKILL.md 文件)\",\n \"networkError\": \"网络错误\",\n \"fsError\": \"文件系统错误\",\n \"unknownError\": \"未知错误\",\n \"suggestion\": {\n \"checkNetwork\": \"请检查网络连接\",\n \"checkProxy\": \"建议配置 HTTP 代理\",\n \"retryLater\": \"请稍后重试\",\n \"checkRepoUrl\": \"请检查仓库地址和分支名称\",\n \"checkDiskSpace\": \"请检查磁盘空间\",\n \"checkPermission\": \"请检查目录权限\",\n \"uninstallFirst\": \"请先卸载已安装的同名技能\",\n \"checkZipContent\": \"请确认 ZIP 文件包含有效的技能目录(含 SKILL.md 文件)\"\n }\n },\n \"repo\": {\n \"title\": \"管理技能仓库\",\n \"description\": \"添加或删除 GitHub 技能仓库源\",\n \"url\": \"仓库 URL\",\n \"urlPlaceholder\": \"owner/name 或 https://github.com/owner/name\",\n \"branch\": \"分支\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"技能路径\",\n \"pathPlaceholder\": \"skills (可选,留空扫描根目录)\",\n \"add\": \"添加仓库\",\n \"list\": \"已添加的仓库\",\n \"empty\": \"暂无仓库\",\n \"invalidUrl\": \"无效的仓库 URL 格式\",\n \"addSuccess\": \"仓库 {{owner}}/{{name}} 已添加,识别到 {{count}} 个技能\",\n \"addFailed\": \"添加失败\",\n \"removeSuccess\": \"仓库 {{owner}}/{{name}} 已删除\",\n \"removeFailed\": \"删除失败\",\n \"skillCount\": \"识别到 {{count}} 个技能\",\n \"disable\": \"禁用\",\n \"disabled\": \"已禁用\",\n \"enable\": \"启用\"\n },\n \"search\": \"搜索技能\",\n \"searchPlaceholder\": \"搜索技能名称或仓库名称...\",\n \"searchSource\": {\n \"all\": \"全部\",\n \"repos\": \"仓库\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全站总榜\",\n \"leaderboardTrending\": \"24h 趋势\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全站总榜\",\n \"trendingTitle\": \"24h 趋势\",\n \"allTimeDesc\": \"与 skills.sh 官网 All Time 排行榜 TOP50 对齐(历史总安装量)\",\n \"trendingDesc\": \"与 skills.sh 官网 Trending (24h) 排行榜 TOP50 对齐\",\n \"syncedAt\": \"同步于 {{time}}\",\n \"fromCache\": \"本地缓存\",\n \"registryTotal\": \"全站累计 {{count}} 次安装\",\n \"loading\": \"正在同步 skills.sh 官方排行榜…\",\n \"error\": \"无法同步 skills.sh 官方排行榜\",\n \"empty\": \"暂无排行榜数据\",\n \"syncPolicy\": \"非实时数据 · 默认每 {{hours}} 小时从 skills.sh 同步 · 点击刷新可立即更新\",\n \"nextSyncAt\": \"下次自动同步约 {{time}}\",\n \"refreshNow\": \"立即从 skills.sh 同步\",\n \"pageRange\": \"{{range}} · 第 {{page}}/{{totalPages}} 页(共 {{total}} 条)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"输入关键词搜索所有来源(仓库 / skills.sh / ClawHub)...\",\n \"searching\": \"正在搜索多个来源...\",\n \"typeToSearch\": \"输入关键词搜索 skills.sh 和 ClawHub 技能\",\n \"typeToSearchMore\": \"输入关键词可搜索更多来源\",\n \"mergedCount\": \"共 {{total}} 个结果\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"搜索 skills.sh(至少 2 个字符)...\",\n \"installs\": \"{{count}} 次安装\",\n \"loadMore\": \"加载更多\",\n \"loading\": \"正在搜索 skills.sh...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相关技能\",\n \"error\": \"搜索 skills.sh 失败\",\n \"poweredBy\": \"由 skills.sh 提供\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"搜索 ClawHub(至少 2 个字符)...\",\n \"loading\": \"正在搜索 ClawHub...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相关技能\",\n \"resultCount\": \"共 {{count}} 个结果\",\n \"poweredBy\": \"由 ClawHub 提供\",\n \"installViaCli\": \"ClawHub 技能请通过 CLI 安装\",\n \"installSuccess\": \"{{slug}} 安装成功\",\n \"installFailed\": \"ClawHub 技能安装失败\",\n \"installing\": \"正在安装...\"\n },\n \"filter\": {\n \"placeholder\": \"状态筛选\",\n \"all\": \"全部\",\n \"installed\": \"已安装\",\n \"uninstalled\": \"未安装\",\n \"repo\": \"仓库筛选\",\n \"allRepos\": \"全部仓库\"\n },\n \"noResults\": \"未找到匹配的技能\",\n \"noInstalled\": \"暂无已安装的技能\",\n \"noInstalledDescription\": \"从仓库发现并安装技能,或导入已有的技能\",\n \"discover\": \"发现技能\",\n \"import\": \"导入已有\",\n \"importDescription\": \"选择要导入到 OpenSunstar 统一管理的技能\",\n \"importSuccess\": \"成功导入 {{count}} 个技能\",\n \"importSelected\": \"导入已选 ({{count}})\",\n \"noUnmanagedFound\": \"未发现需要导入的技能。所有技能已在 OpenSunstar 统一管理中。\",\n \"foundIn\": \"发现于\",\n \"local\": \"本地\",\n \"uninstallConfirm\": \"确定要卸载技能 \\\"{{name}}\\\" 吗?这将从所有应用中移除该技能,并在删除前自动创建本地备份。\",\n \"uninstallInMainPanel\": \"请在主面板中卸载技能\",\n \"notFound\": \"未找到技能\",\n \"backup\": {\n \"location\": \"备份位置: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"从备份中恢复\",\n \"title\": \"从备份中恢复\",\n \"description\": \"选择一个 Skills 备份,将文件恢复到本地并重新加入当前列表。\",\n \"empty\": \"暂无可恢复的 Skills 备份\",\n \"createdAt\": \"备份时间\",\n \"path\": \"备份路径\",\n \"restore\": \"恢复\",\n \"restoring\": \"恢复中...\",\n \"delete\": \"删除\",\n \"deleting\": \"删除中...\",\n \"deleteSuccess\": \"技能备份 {{name}} 已删除\",\n \"deleteFailed\": \"删除技能备份失败\",\n \"deleteConfirmTitle\": \"确认删除备份\",\n \"deleteConfirmMessage\": \"确定要删除技能备份 \\\"{{name}}\\\" 吗?此操作无法撤销。\",\n \"success\": \"技能 {{name}} 已从备份恢复\",\n \"failed\": \"从备份恢复失败\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"从 ZIP 安装\",\n \"installing\": \"安装中...\",\n \"successSingle\": \"技能 {{name}} 已安装\",\n \"successMultiple\": \"成功安装 {{count}} 个技能\",\n \"noSkillsFound\": \"ZIP 文件中未找到技能(需包含 SKILL.md 文件)\"\n },\n \"detail\": \"详情\",\n \"info\": {\n \"apps\": \"已启用应用\",\n \"branch\": \"分支\",\n \"directory\": \"目录\",\n \"hash\": \"内容哈希\",\n \"installedAt\": \"安装时间\",\n \"updatedAt\": \"更新时间\",\n \"viewReadme\": \"查看文档\"\n },\n \"modelscope\": {\n \"loading\": \"正在搜索 ModelScope 技能中心...\",\n \"openPage\": \"已打开 ModelScope 技能页面,请在页面中查看安装方式\",\n \"poweredBy\": \"数据来源:ModelScope 魔塔社区\",\n \"searchPlaceholder\": \"输入关键词搜索 ModelScope 技能中心...\"\n },\n \"resync\": \"修复同步\"\n },\n \"deeplink\": {\n \"confirmImport\": \"确认导入供应商配置\",\n \"confirmImportDescription\": \"以下配置将导入到 OpenSunstar\",\n \"importPrompt\": \"导入提示词\",\n \"importPromptDescription\": \"请确认是否导入此系统提示词\",\n \"importMcp\": \"导入 MCP Servers\",\n \"importMcpDescription\": \"请确认是否导入这些 MCP Servers\",\n \"importSkill\": \"添加 Skill 仓库\",\n \"importSkillDescription\": \"请确认是否添加此 Skill 仓库\",\n \"promptImportSuccess\": \"提示词导入成功\",\n \"promptImportSuccessDescription\": \"已导入提示词: {{name}}\",\n \"mcpImportSuccess\": \"MCP Servers 导入成功\",\n \"mcpImportSuccessDescription\": \"成功导入 {{count}} 个服务器\",\n \"mcpPartialSuccess\": \"部分导入成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}, 失败: {{failed}}\",\n \"skillImportSuccess\": \"Skill 仓库添加成功\",\n \"skillImportSuccessDescription\": \"已添加仓库: {{repo}}\",\n \"app\": \"应用类型\",\n \"providerName\": \"供应商名称\",\n \"homepage\": \"官网地址\",\n \"endpoint\": \"API 端点\",\n \"apiKey\": \"API 密钥\",\n \"icon\": \"图标\",\n \"model\": \"模型\",\n \"haikuModel\": \"Haiku 模型\",\n \"sonnetModel\": \"Sonnet 模型\",\n \"opusModel\": \"Opus 模型\",\n \"multiModel\": \"多模态模型\",\n \"notes\": \"备注\",\n \"import\": \"导入\",\n \"importing\": \"导入中...\",\n \"warning\": \"请确认以上信息准确无误后再导入。导入后可在供应商列表中编辑或删除。\",\n \"parseError\": \"深链接解析失败\",\n \"importSuccess\": \"导入成功\",\n \"importSuccessDescription\": \"供应商 \\\"{{name}}\\\" 已成功导入\",\n \"importError\": \"导入失败\",\n \"configSource\": \"配置来源\",\n \"configEmbedded\": \"内嵌配置\",\n \"configRemote\": \"远程配置\",\n \"configDetails\": \"配置详情\",\n \"configUrl\": \"配置文件 URL\",\n \"configMergeError\": \"合并配置文件失败\",\n \"primaryEndpoint\": \"主\",\n \"mcp\": {\n \"title\": \"批量导入 MCP Servers\",\n \"targetApps\": \"目标应用\",\n \"serverCount\": \"MCP Servers ({{count}} 个)\",\n \"enabledWarning\": \"导入后将立即写入所有指定应用的配置文件\"\n },\n \"prompt\": {\n \"title\": \"导入系统提示词\",\n \"app\": \"应用\",\n \"name\": \"名称\",\n \"description\": \"描述\",\n \"contentPreview\": \"内容预览\",\n \"enabledWarning\": \"导入后将立即启用此提示词,其他提示词将被禁用\"\n },\n \"skill\": {\n \"title\": \"添加 Claude Skill 仓库\",\n \"repo\": \"GitHub 仓库\",\n \"directory\": \"目标目录\",\n \"branch\": \"分支\",\n \"skillsPath\": \"Skills 路径\",\n \"hint\": \"此操作将添加 Skill 仓库到列表。\",\n \"hintDetail\": \"添加后,您可以在 Skills 管理界面中选择安装具体的 Skill。\"\n },\n \"usageScript\": \"用量查询\",\n \"usageScriptEnabled\": \"已启用\",\n \"usageScriptDisabled\": \"未启用\",\n \"usageApiKey\": \"用量 API Key\",\n \"usageBaseUrl\": \"用量查询地址\",\n \"usageAutoInterval\": \"自动查询\",\n \"usageAutoIntervalValue\": \"每 {{minutes}} 分钟\"\n },\n \"iconPicker\": {\n \"search\": \"搜索图标\",\n \"searchPlaceholder\": \"输入图标名称...\",\n \"noResults\": \"未找到匹配的图标\",\n \"category\": {\n \"aiProvider\": \"AI 服务商\",\n \"cloud\": \"云平台\",\n \"tool\": \"开发工具\",\n \"other\": \"其他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"图标\",\n \"colorLabel\": \"图标颜色\",\n \"selectIcon\": \"选择图标\",\n \"preview\": \"预览\",\n \"clickToChange\": \"点击更换图标\",\n \"clickToSelect\": \"点击选择图标\",\n \"color\": \"图标颜色\"\n },\n \"simpleConnect\": {\n \"nav\": \"快速接入\",\n \"pageTitle\": \"快速接入\",\n \"tabSimple\": \"快速接入\",\n \"tabExpert\": \"高级 Provider\",\n \"title\": \"快速接入\",\n \"subtitle\": \"粘贴 API Key,三步即可在 CLI 中用起来\",\n \"step1\": \"供应商\",\n \"step2\": \"密钥\",\n \"step3\": \"应用\",\n \"supplier\": \"供应商\",\n \"customSupplier\": \"自定义 OpenAI 兼容\",\n \"cliTool\": \"CLI 工具\",\n \"model\": \"模型\",\n \"modelPlaceholder\": \"先拉取模型列表\",\n \"fetchModels\": \"拉取模型列表\",\n \"apply\": \"应用配置\",\n \"applySuccess\": \"{{tool}} 配置已应用\",\n \"applySuccessMulti\": \"{{tools}} 配置已应用\",\n \"modelsLoaded\": \"已加载 {{count}} 个模型\",\n \"poolProxy\": \"本地代理 :{{port}} 已启用\",\n \"keyRequired\": \"请先在 Keychain 中保存 API Key\",\n \"keyRequiredHint\": \"保存主 Key 后才能进入应用步骤\",\n \"customBaseRequired\": \"请先填写自定义 API Base URL\",\n \"modelsFallback\": \"拉取失败,已使用预设模型 {{model}}\",\n \"toolStatusTitle\": \"CLI 配置状态\",\n \"toolStatusLoading\": \"读取 CLI 状态…\",\n \"toolCleared\": \"{{tool}} 已清除快速接入配置\",\n \"clearTool\": \"清除 {{tool}}\",\n \"wizardNav\": \"快速接入步骤\",\n \"summaryStep\": \"步骤 {{step}}/3\",\n \"step3Hint\": \"选择 CLI 与模型后应用;详情见下方折叠面板\",\n \"step3Sections\": {\n \"statusSection\": \"CLI 配置状态\",\n \"runtimeSection\": \"密钥池运行态\",\n \"usageSection\": \"用量概览(只读)\"\n },\n \"supplierChangeTitle\": \"切换供应商?\",\n \"supplierChangeBody\": \"切换后将使用新的 upstream;已保存的 Key 仍对应原供应商命名空间。应用配置时会自动备份并重写 CLI。\",\n \"supplierChangeConfirm\": \"继续切换\",\n \"supplierChangedApply\": \"已切换供应商并写入 CLI;原配置已备份\",\n \"pickSupplier\": \"选择供应商\",\n \"pickCli\": \"选择要配置的 CLI\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"任意 OpenAI-compatible Base URL\",\n \"openWebsite\": \"官网\",\n \"keySaved\": \"Key 已保存\",\n \"keyMissing\": \"未保存 Key\",\n \"poolBadge\": \"密钥池 ×{{count}}\",\n \"keySavedToast\": \"API Key 已安全存入 Keychain\",\n \"keyReadyHint\": \"主 Key 已就绪,可进入下一步\",\n \"poolKeyAdded\": \"备用 Key 已添加\",\n \"applyTo\": \"应用到 {{tool}}\",\n \"modelsLoading\": \"正在拉取模型…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} 已配置\",\n \"backToSimple\": \"返回快速接入\",\n \"openProxySettings\": \"代理与故障队列设置\",\n \"proxyRunning\": \"主代理运行中\",\n \"cliGeneric\": \"CLI 配置\",\n \"expertNoticeTitle\": \"Expert Provider(精简保留)\",\n \"expertNoticeBody\": \"故障队列、代理接管、Universal 等高级能力仍在此管理。默认推荐先用「快速接入」。\",\n \"pool\": {\n \"step2Hint\": \"输入 API Key 并保存,CLI 将通过本地代理安全访问\",\n \"enable\": \"开启密钥池\",\n \"enableHint\": \"多 Key 加权轮询 + 429 阶梯冷却;CLI 始终写 local token,真实 Key 仅存 Keychain\",\n \"securityNote\": \"密钥仅写入系统 Keychain,不会出现在配置文件或日志中。CLI 通过本地代理 token 访问。\",\n \"required\": \"必需\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"主 Key\",\n \"extra\": \"备用 Key\",\n \"extraKey\": \"添加备用 Key\",\n \"supplierHint\": \"Key 存储于 Keychain:simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"密钥池运行时\",\n \"running\": \"代理运行中\",\n \"stopped\": \"代理未启动\",\n \"idleHint\": \"应用配置后将启动本地代理,此处显示 Key 成功/失败与冷却状态\",\n \"available\": \"可用\",\n \"cooling\": \"冷却中\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"用量概览(只读)\",\n \"input\": \"输入\",\n \"output\": \"输出\",\n \"sessions\": \"会话条数\",\n \"proxyPort\": \"代理 :{{port}}\",\n \"proxySession\": \"本次会话\",\n \"byTool\": \"按 CLI 拆分\",\n \"empty\": \"暂无本地会话用量数据\"\n },\n \"import\": {\n \"title\": \"确认导入 API Key\",\n \"description\": \"密钥将写入 Keychain,不会出现在配置文件中。导入前会校验 Key 有效性。\",\n \"label\": \"标签\",\n \"supplier\": \"供应商\",\n \"warning\": \"请确认链接来源可信。可在快速接入中禁用 URL 导入。\",\n \"confirm\": \"确认导入\",\n \"importing\": \"导入中…\",\n \"success\": \"已导入 {{count}} 个 Key 到 Keychain\",\n \"duplicates\": \"跳过 {{count}} 个重复 Key\",\n \"parseError\": \"导入链接解析失败\"\n },\n \"advanced\": {\n \"title\": \"高级\",\n \"verifyKey\": \"保存前校验 Key\",\n \"verifyKeyHint\": \"调用 /v1/models 验证;关闭后仅高级用户手动导入\",\n \"deeplinkImport\": \"允许 URL 导入 Key\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"备份目录安全扫描\",\n \"files\": \"已扫描 {{count}} 个文件\",\n \"clean\": \"未发现明文 Key\",\n \"suspicious\": \"{{count}} 处可疑内容\",\n \"hint\": \"扫描 simple-connect/backups 下 CLI 配置备份,确保无 sk- 明文落盘。\"\n },\n \"privacy\": {\n \"bannerShort\": \"本地优先 · 密钥存系统 Keychain · 无遥测\",\n \"viewDetails\": \"查看安全与隐私说明\",\n \"title\": \"安全与隐私说明\",\n \"intro\": \"快速接入遵循「数据留在本机、密钥不进配置文件、网络由你指定」的原则。以下为快速接入范围内的处理方式。\",\n \"close\": \"知道了\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"本地优先\",\n \"body\": \"供应商选择、模型缓存、CLI 配置状态与用量统计等偏好均保存在本机应用数据目录。写入 CLI 前会自动备份原配置到本地 simple-connect/backups,可在 Step 2 高级区扫描备份是否含明文密钥。\"\n },\n \"keychain\": {\n \"title\": \"凭据存系统 Keychain\",\n \"body\": \"API Key 仅写入操作系统密钥链(Windows DPAPI / macOS Keychain / Linux libsecret),不会出现在 JSON、TOML、环境变量或应用日志中。CLI 侧仅注入 sc-local-* 本地代理令牌;真实 Key 仅在本地代理进程内从 Keychain 读取。\"\n },\n \"network\": {\n \"title\": \"网络直连你选的供应商\",\n \"body\": \"模型拉取、Key 校验(若开启)与 upstream 请求均从本机直接发往你选择的 API Base。本地代理(127.0.0.1:17172)仅在本机环回地址监听,用于密钥池与 CLI 统一入口,不对外网暴露。\"\n },\n \"noTelemetry\": {\n \"title\": \"无遥测、无账号绑定\",\n \"body\": \"快速接入不会向 OpenSunstar 官方或第三方上报 API Key、对话内容、模型调用明细或设备指纹。用量面板数据来自本机 CLI 会话日志与本地代理计数,仅供你在本机查看。\"\n },\n \"yourControl\": {\n \"title\": \"你可自行控制的风险项\",\n \"body\": \"URL 导入 Key 仅在确认链接来源可信时启用,可在 Step 2 高级区关闭。选择自定义供应商时,请自行评估第三方 Base URL 的可信度与隐私政策。\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"快速接入\",\n \"title\": \"快速接入\",\n \"subtitle\": \"三步完成接入:选供应商 → 填 Key → 一键启用\",\n \"tabs\": {\n \"wizard\": \"快速接入\",\n \"manage\": \"管理供应商\"\n },\n \"openManage\": \"管理全部供应商\",\n \"openProxySettings\": \"代理与故障队列设置\",\n \"searchPlaceholder\": \"搜索供应商名称或网址…\",\n \"noResults\": \"未找到匹配的供应商\",\n \"official\": \"官方\",\n \"officialDesc\": \"官方账号按客户端登录。\",\n \"partner\": \"合作伙伴\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"粘贴你的 API Key\",\n \"keychainHint\": \"API Key 保存在本机安全凭据库;接入时会更新本地配置。\",\n \"getKey\": \"获取 API Key\",\n \"apply\": \"一键启用\",\n \"success\": \"接入成功!已切换为当前供应商\",\n \"doneTitle\": \"接入成功!\",\n \"doneDesc\": \"供应商已配置完成并切换为当前生效。现在可以在 Claude Code 中直接使用了。\",\n \"doneDescApp\": \"{{app}} 已配置并切换为当前供应商。\",\n \"failedTitle\": \"接入未完成\",\n \"compensatedDesc\": \"操作失败,系统已恢复到接入前状态;可修正配置后重试。\",\n \"recoveryRequired\": \"自动恢复未完成,请点击“继续恢复”后再重试。\",\n \"operationId\": \"操作编号\",\n \"retry\": \"重试接入\",\n \"continueRecovery\": \"继续恢复\",\n \"changeSelection\": \"修改配置\",\n \"rollback\": \"撤销本次接入\",\n \"rollbackDone\": \"已恢复到接入前状态\",\n \"rollbackFailed\": \"恢复失败,请重试或前往代理设置检查状态\",\n \"proxyRunningHint\": \"Claude Code 的请求经本地代理(127.0.0.1:15721)转发。请保持 OpenSunstar 运行,关闭应用后 Claude Code 将无法连接。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop 经本地代理转发。请保持 OpenSunstar 运行,关闭应用后将无法连接。\",\n \"addAnother\": \"再接入一个\",\n \"openSettings\": \"前往供应商管理\",\n \"firstProviderHint\": \"检测到这是你的第一个供应商,如需启动代理请在设置中确认\",\n \"verify\": \"验证 Key\",\n \"verifyOk\": \"Key 有效!\",\n \"verifyOkAnthropic\": \"Key 有效(该供应商不提供模型列表 API,将使用预设默认模型)\",\n \"verifyOkGemini\": \"Key 有效,Gemini 原生接口验证通过\",\n \"verifyOkWithModels\": \"Key 有效,已获取 {{count}} 个模型\",\n \"verifyOkNoModelList\": \"Key 有效(模型列表拉取失败,将使用预设默认模型)\",\n \"verifyHint\": \"系统按当前协议验证;Anthropic 约消耗 1 token,OpenAI/Gemini 获取到模型列表后可用于高级映射\",\n \"modelsList\": \"可用模型({{count}})\",\n \"myProviders\": \"API Key 接入\",\n \"switch\": \"切换\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"category\": {\n \"custom\": \"自定义\",\n \"aiGlobal\": \"AI国际\",\n \"aiChina\": \"AI中国\",\n \"relay\": \"聚合/中转\",\n \"customModel\": \"自定义模型配置\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini 快速接入当前启用 Google 官方和 Gemini Native 兼容端点;OpenAI Chat 网关会显示协议不匹配提示。\"\n },\n \"custom\": {\n \"cardTitle\": \"自定义配置\",\n \"cardSubtitle\": \"自填 Base URL 与模型\",\n \"hint\": \"填写名称、Base URL 与默认模型;API 格式、认证字段和模型映射可在下方高级选项中调整。\",\n \"geminiHint\": \"填写名称、Gemini Native Base URL 与模型;Gemini CLI 原生协议在高级选项中展示。\",\n \"agentHint\": \"填写名称、Base URL 与默认模型;OpenSunstar 会按该客户端的原生配置格式写入本地配置。\",\n \"name\": \"供应商名称\",\n \"namePlaceholder\": \"例如:我的 DeepSeek 网关\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"默认模型\",\n \"geminiModel\": \"模型 ID\",\n \"defaultName\": \"自定义供应商\"\n },\n \"apiKeyOnlyHint\": \"该客户端通过 API Key 接入供应商;选择预设或添加自定义网关后即可启用。\",\n \"advanced\": {\n \"title\": \"高级选项\",\n \"subtitle\": \"大多数场景保持默认即可\",\n \"upstreamModel\": \"上游模型\",\n \"defaultModel\": \"默认模型\",\n \"apiFormat\": \"API 格式\",\n \"authField\": \"认证字段\",\n \"roleMapping\": \"模型角色映射\",\n \"roleMappingHint\": \"显示名称用于 /model 菜单;实际请求模型会写入 Claude Code 环境变量。\",\n \"role\": \"角色\",\n \"displayName\": \"显示名称\",\n \"requestModel\": \"实际请求模型\",\n \"roleRequestModel\": \"{{role}} 实际请求模型\",\n \"hiddenFromModelMenu\": \"不显示在 /model 菜单\",\n \"fallbackModel\": \"默认兜底模型\",\n \"desktopRoutes\": \"Claude Desktop 路由映射\",\n \"customProtocolHint\": \"自定义配置按上游真实接口选择协议。\",\n \"presetProtocolLocked\": \"供应商预设已按真实端点锁定协议,避免误选后连接失败。\",\n \"geminiNativeLocked\": \"Gemini CLI 当前透传原生 generateContent 协议;OpenAI Chat 端点需使用已实现协议转换的客户端入口。\"\n },\n \"badge\": {\n \"current\": \"当前\",\n \"proxy\": \"本地路由\"\n },\n \"warn\": {\n \"clearFailed\": \"清除旧快速接入标记失败,若切换仍报错请手动在设置中清除\",\n \"takeoverFailed\": \"供应商已添加,但代理接管开启失败。请在设置-本地路由中手动开启对应应用接管\"\n },\n \"error\": {\n \"emptyKey\": \"请填写 API Key\",\n \"failed\": \"接入失败,请检查 API Key 或网络后重试\",\n \"compensated\": \"接入失败,已自动恢复到操作前状态\",\n \"recoveryRequired\": \"接入失败且自动恢复未完成,请执行恢复后重试\",\n \"noBaseUrl\": \"请填写 Base URL\",\n \"noModel\": \"请填写默认模型\",\n \"customRequired\": \"请填写 Base URL 和默认模型\",\n \"verifyRequired\": \"请先验证 API Key 和上游连接后再启用\"\n },\n \"unavailableForApp\": \"当前客户端协议暂未适配\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex 快速接入当前使用 OpenAI Responses / Chat 上游协议\",\n \"claudeOauthOnly\": \"此 OAuth 预设面向 Claude 客户端\",\n \"geminiNativeOnly\": \"Gemini CLI 需要 Gemini Native 或 Gemini 兼容网关\",\n \"geminiOpenRouter\": \"OpenRouter 提供 OpenAI Chat 上游,Gemini CLI 当前透传 Gemini Native 协议\"\n },\n \"addProvider\": \"添加供应商\",\n \"addProviderHint\": \"从精选供应商开始,或添加自定义兼容接口。\",\n \"audit\": \"查看审计记录\",\n \"cannotDeleteCurrent\": \"当前使用中的供应商不能删除,请先切换到其他供应商。\",\n \"configureProvider\": \"配置供应商\",\n \"configureProviderHint\": \"只需填写必要信息;连接、写入与验证由系统自动处理。\",\n \"connectAndEnable\": \"连接并启用\",\n \"connectedProviders\": \"API Key 接入\",\n \"connectedProvidersHint\": \"\",\n \"deleteProviderMessage\": \"将删除 {{name}} 的已保存配置。此操作不会删除供应商平台上的账户或 API Key。\",\n \"enableUsage\": \"启用用量自动查询\",\n \"history\": {\n \"hint\": \"重启后仍可查看审计记录;成功操作可在安全守卫通过时撤销。\",\n \"title\": \"最近接入操作\"\n },\n \"manageSubscriptionAccounts\": \"管理订阅账号\",\n \"myProvidersHint\": \"API Key 保存在本机安全凭据库;接入时会更新本地配置。\",\n \"officialConnection\": \"订阅账号\",\n \"officialConnectionHint\": \"按客户端完成订阅登录。\",\n \"officialLoginNotice\": \"官方账号按客户端登录。\",\n \"openOfficialSite\": \"打开官网登录\",\n \"operationNeedsAttention\": \"本次接入需要处理\",\n \"proxySettings\": \"代理与故障设置\",\n \"recovery\": {\n \"action\": \"恢复未完成操作\",\n \"title\": \"恢复未完成操作\"\n },\n \"saveUsage\": \"保存用量配置\",\n \"usageConfigDescription\": \"为 {{name}} 保存查询脚本。默认复用该供应商已安全保存的连接凭据,不在此处重复录入密钥。\",\n \"usageInterval\": \"自动查询间隔(分钟,0 为关闭)\",\n \"usageScript\": \"查询脚本\",\n \"workbenchSubtitle\": \"选择客户端,再用订阅账号或 API Key 接入。\",\n \"workbenchTitle\": \"模型接入\",\n \"subscription\": {\n \"loginStatus\": \"登录状态\",\n \"accountManagement\": \"账号管理\",\n \"claude\": {\n \"title\": \"Claude 订阅登录\",\n \"description\": \"凭据由 Claude Code 管理;OpenSunstar 读取状态和额度。\",\n \"action\": \"Claude 订阅登录\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop 登录\",\n \"description\": \"登录由 Claude Desktop 管理。\",\n \"action\": \"获取 Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT 订阅登录\",\n \"description\": \"登录由 OpenSunstar 托管。\",\n \"action\": \"ChatGPT 订阅登录\",\n \"dialogHint\": \"按设备授权流程连接账号。\"\n },\n \"gemini\": {\n \"title\": \"Gemini 账号登录\",\n \"description\": \"凭据由 Gemini CLI 管理;OpenSunstar 读取状态和额度。\",\n \"action\": \"Gemini 登录指引\"\n },\n \"grokbuild\": {\n \"title\": \"Grok 订阅登录\",\n \"description\": \"登录由 OpenSunstar 托管;用于 xAI / Grok 官方账号。API Key 接入仍使用下方供应商配置。\",\n \"action\": \"Grok 订阅登录\",\n \"dialogHint\": \"按设备授权流程连接 xAI / Grok 账号。\"\n }\n },\n \"accessModeGrid\": \"接入方式\"\n },\n \"migration\": {\n \"success\": \"配置迁移成功\",\n \"skillsSuccess\": \"已自动导入 {{count}} 个技能到统一管理\",\n \"skillsFailed\": \"自动导入技能失败\",\n \"skillsFailedDescription\": \"请打开 Skills 页面点击“导入已有”手动导入(或重启后再试)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\",\n \"subtitle\": \"同步到 Claude / Gemini / OpenCode 的 agents 目录(Markdown)\",\n \"empty\": \"暂无 Subagent\",\n \"emptyHint\": \"创建自定义 Subagent 并同步到 ~/.claude/agents/ 等目录\",\n \"add\": \"添加 Subagent\",\n \"edit\": \"编辑 Subagent\",\n \"count\": \"共 {{count}} 个 Subagent\",\n \"loadFailed\": \"加载 Subagent 失败\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失败\",\n \"deleteSuccess\": \"删除成功\",\n \"deleteFailed\": \"删除失败\",\n \"toggleFailed\": \"切换同步目标失败\",\n \"geminiHint\": \"Gemini 需在 settings.json 中开启 experimental.enableSubagents 后生效\",\n \"codexHint\": \"已转换为 TOML 并写入 ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"暂不支持文件同步\"\n },\n \"confirm\": {\n \"deleteTitle\": \"删除 Subagent\",\n \"deleteMessage\": \"确定删除 Subagent \\\"{{name}}\\\"?已同步的文件将被清理。\"\n },\n \"form\": {\n \"name\": \"名称\",\n \"description\": \"描述\",\n \"content\": \"定义(Markdown + YAML frontmatter)\",\n \"syncTargets\": \"同步到\",\n \"geminiNote\": \"Gemini 需在 settings.json 开启 experimental.enableSubagents\",\n \"codexNote\": \"Codex 将自动把 Markdown 转为 TOML 写入 ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"测试模型\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"降级\",\n \"failed\": \"失败\",\n \"circuitOpen\": \"熔断\",\n \"consecutiveFailures\": \"连续失败 {{count}} 次\",\n \"title\": \"配置状态\",\n \"allClear\": \"所有项目 AI 配置状态正常。\",\n \"scan\": \"重复检测\",\n \"subtitle\": \"检测同名项目与重复路径,识别可能的冗余添加\",\n \"noDuplicates\": \"未发现重复项目\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"需关注\",\n \"alert\": \"异常\",\n \"unconfigured\": \"尚未配置\",\n \"unmanaged\": \"未纳管\",\n \"unscanned\": \"未扫描\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 处配置与预期不一致\",\n \"unscanned\": \"尚未完成 AI 配置状态扫描\",\n \"unmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"unconfigured\": \"尚未通过 OpenSunstar 关联任何 AI 资产\",\n \"gaps\": \"待补齐:{{items}}\",\n \"detectedOnly\": \"{{items}} — 发现配置文件但未纳入管理\",\n \"globalOnly\": \"{{items}} — 使用全局默认配置\",\n \"noMcp\": \"未关联 MCP 服务器\",\n \"noSkills\": \"未配置 Skills\",\n \"noPrompts\": \"未关联 Prompts\"\n },\n \"action\": {\n \"repair\": \"修复漂移\",\n \"inspectDetail\": \"查看详情\",\n \"configure\": \"配置资产\",\n \"setup\": \"去配置\",\n \"adopt\": \"纳入管理\",\n \"inspect\": \"查看项目\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} 故障转移已启用\",\n \"disabled\": \"{{app}} 故障转移已关闭\",\n \"toggleFailed\": \"操作失败: {{detail}}\",\n \"inQueue\": \"已加入\",\n \"addQueue\": \"加入\",\n \"priority\": {\n \"tooltip\": \"故障转移优先级 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} 故障转移已启用\\n按队列优先级(P1→P2→...)选择供应商\",\n \"disabled\": \"启用 {{app}} 故障转移\\n将立即切换到队列 P1,并在失败时自动切换到下一个\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"服务地址\",\n \"addressCopied\": \"地址已复制\",\n \"currentProvider\": \"当前 Provider:\",\n \"waitingFirstRequest\": \"当前 Provider:等待首次请求…\",\n \"stoppedTitle\": \"路由服务已停止\",\n \"stoppedDescription\": \"使用上方开关即可启动服务\",\n \"openSettings\": \"配置路由服务\",\n \"stats\": {\n \"activeConnections\": \"活跃连接\",\n \"totalRequests\": \"总请求数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"运行时间\"\n }\n },\n \"settings\": {\n \"title\": \"路由服务设置\",\n \"description\": \"配置本地路由服务器的监听地址、端口和运行参数,保存后立即生效。\",\n \"alert\": {\n \"autoApply\": \"保存后将自动同步到正在运行的路由服务,无需手动重启。\"\n },\n \"basic\": {\n \"title\": \"基础设置\",\n \"description\": \"配置路由服务监听的地址与端口。\"\n },\n \"advanced\": {\n \"title\": \"高级参数\",\n \"description\": \"控制请求的稳定性和日志记录。\"\n },\n \"timeout\": {\n \"title\": \"超时设置\",\n \"description\": \"配置流式和非流式请求的超时时间。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"监听地址\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"路由服务器监听的 IP 地址(推荐 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"监听端口\",\n \"placeholder\": \"15721\",\n \"description\": \"路由服务器监听的端口号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大重试次数\",\n \"placeholder\": \"3\",\n \"description\": \"请求失败时的重试次数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"请求超时(秒)\",\n \"placeholder\": \"0(不限)或 300\",\n \"description\": \"单个请求的最大等待时间(0 表示不限制,或设置 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"启用日志记录\",\n \"description\": \"记录所有路由请求,便于排查问题\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"流式首字超时(秒)\",\n \"description\": \"等待首个数据块的最大时间\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"流式静默超时(秒)\",\n \"description\": \"数据块之间的最大间隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非流式超时(秒)\",\n \"description\": \"非流式请求的总超时时间\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"请输入有效的IP地址\",\n \"portMin\": \"端口必须大于1024\",\n \"portMax\": \"端口必须小于65535\",\n \"retryMin\": \"重试次数不能为负\",\n \"retryMax\": \"重试次数不能超过10\",\n \"timeoutNonNegative\": \"超时时间不能为负数\",\n \"timeoutMax\": \"超时时间最多600秒\",\n \"timeoutRange\": \"请输入 0 或 10-600 之间的数值\",\n \"streamingTimeoutMin\": \"超时时间至少5秒\",\n \"streamingTimeoutMax\": \"超时时间最多300秒\"\n },\n \"actions\": {\n \"save\": \"保存配置\"\n },\n \"toast\": {\n \"saved\": \"路由配置已保存\",\n \"saveFailed\": \"保存失败: {{error}}\"\n },\n \"invalidPort\": \"端口无效,请输入 1024-65535 之间的数字\",\n \"invalidAddress\": \"地址无效,请输入 IPv4(如 127.0.0.1)、IPv6(如 ::1)或 localhost\",\n \"configSaved\": \"路由配置已保存\",\n \"configSaveFailed\": \"保存配置失败\",\n \"restartRequired\": \"修改地址或端口后需要重启路由服务才能生效\"\n },\n \"switchFailed\": \"切换失败: {{error}}\",\n \"takeover\": {\n \"hint\": \"选择要路由的应用,启用后该应用的请求将通过本地路由转发\",\n \"enabled\": \"{{app}} 路由已启用\",\n \"disabled\": \"{{app}} 路由已关闭\",\n \"failed\": \"切换路由状态失败: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} 路由中 - {{address}}:{{port}}\\n切换该应用供应商为热切换\",\n \"broken\": \"{{appLabel}} 路由中,但路由服务未运行\",\n \"inactive\": \"路由 {{appLabel}} 的请求,让该应用请求走本地路由\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"需要先启动路由服务才能配置故障转移\",\n \"autoSwitch\": \"自动故障转移\",\n \"autoSwitchDescription\": \"开启后将立即切换到队列 P1,并在请求失败时自动切换到队列中的下一个供应商\"\n },\n \"failoverQueue\": {\n \"title\": \"故障转移队列\",\n \"description\": \"管理各应用的供应商故障转移顺序\",\n \"info\": \"启用自动故障转移后,将按队列优先级选择供应商(P1 优先)。当请求失败时,系统会按队列顺序依次尝试下一个供应商。\",\n \"selectProvider\": \"选择供应商添加到队列\",\n \"noAvailableProviders\": \"没有可添加的供应商\",\n \"empty\": \"故障转移队列为空。添加供应商以启用自动故障转移。\",\n \"orderHint\": \"队列顺序与首页供应商列表顺序一致,可在首页拖拽调整顺序。\",\n \"dragHint\": \"拖拽供应商可调整故障转移顺序,序号越小优先级越高。\",\n \"toggleEnabled\": \"启用/禁用\",\n \"addSuccess\": \"已添加到故障转移队列\",\n \"addFailed\": \"添加失败\",\n \"removeSuccess\": \"已从故障转移队列移除\",\n \"removeFailed\": \"移除失败\",\n \"reorderSuccess\": \"队列顺序已更新\",\n \"reorderFailed\": \"更新顺序失败\",\n \"toggleFailed\": \"状态更新失败\"\n },\n \"autoFailover\": {\n \"info\": \"当故障转移队列中配置了多个供应商时,系统会在请求失败时按优先级顺序依次尝试。当某个供应商连续失败达到阈值时,熔断器会打开并在一段时间内跳过该供应商。\",\n \"configSaved\": \"自动故障转移配置已保存\",\n \"configSaveFailed\": \"保存失败\",\n \"validationFailed\": \"以下字段超出有效范围: {{fields}}\",\n \"retrySettings\": \"重试与超时设置\",\n \"failureThreshold\": \"失败阈值\",\n \"failureThresholdHint\": \"连续失败多少次后打开熔断器(建议: 3-10)\",\n \"timeout\": \"恢复等待时间(秒)\",\n \"timeoutHint\": \"熔断器打开后,等待多久后尝试恢复(建议: 30-120)\",\n \"circuitBreakerSettings\": \"熔断器设置\",\n \"successThreshold\": \"恢复成功阈值\",\n \"successThresholdHint\": \"半开状态下成功多少次后关闭熔断器\",\n \"errorRate\": \"错误率阈值 (%)\",\n \"errorRateHint\": \"错误率超过此值时打开熔断器\",\n \"minRequests\": \"最小请求数\",\n \"minRequestsHint\": \"计算错误率前的最小请求数\",\n \"explanationTitle\": \"工作原理\",\n \"failureThresholdLabel\": \"失败阈值\",\n \"failureThresholdExplain\": \"连续失败达到此次数时,熔断器打开,该供应商暂时不可用\",\n \"timeoutLabel\": \"恢复等待时间\",\n \"timeoutExplain\": \"熔断器打开后,等待此时间后尝试半开状态\",\n \"successThresholdLabel\": \"恢复成功阈值\",\n \"successThresholdExplain\": \"半开状态下,成功达到此次数时关闭熔断器,供应商恢复可用\",\n \"errorRateLabel\": \"错误率阈值\",\n \"errorRateExplain\": \"错误率超过此值时,即使未达到失败阈值也会打开熔断器\",\n \"maxRetries\": \"最大重试次数\",\n \"timeoutSettings\": \"超时配置\",\n \"streamingFirstByte\": \"流式首字节超时\",\n \"streamingIdle\": \"流式静默超时\",\n \"nonStreaming\": \"非流式超时\",\n \"maxRetriesHint\": \"请求失败时的重试次数(0-10)\",\n \"streamingFirstByteHint\": \"等待首个数据块的最大时间,范围 1-120 秒,默认 60 秒\",\n \"streamingIdleHint\": \"数据块之间的最大间隔,范围 60-600 秒,填 0 禁用(防止中途卡住)\",\n \"nonStreamingHint\": \"非流式请求的总超时时间,范围 60-1200 秒,默认 600 秒(10 分钟)\"\n },\n \"logging\": {\n \"enabled\": \"日志记录已启用\",\n \"disabled\": \"日志记录已关闭\",\n \"failed\": \"切换日志状态失败\"\n },\n \"server\": {\n \"started\": \"路由服务已启动 - {{address}}:{{port}}\",\n \"startFailed\": \"启动路由服务失败: {{detail}}\",\n \"stopped\": \"代理服务已停止\"\n },\n \"stoppedWithRestore\": \"路由服务已关闭,已恢复所有路由配置\",\n \"stopWithRestoreFailed\": \"停止失败: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"健康检查配置已保存\",\n \"configSaveFailed\": \"保存失败\",\n \"testModels\": \"测试模型\",\n \"claudeModel\": \"Claude 模型\",\n \"codexModel\": \"Codex 模型\",\n \"geminiModel\": \"Gemini 模型\",\n \"checkParams\": \"检查参数\",\n \"timeout\": \"超时时间(秒)\",\n \"maxRetries\": \"最大重试次数\",\n \"degradedThreshold\": \"降级阈值(毫秒)\",\n \"testPrompt\": \"检查提示词\",\n \"operational\": \"{{providerName}} 运行正常 ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} 响应较慢 ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} 检查失败: {{message}}\",\n \"rejected\": \"{{providerName}} 检查被拒: {{message}}\",\n \"error\": \"{{providerName}} 检查出错: {{error}}\",\n \"modelNotFound\": \"{{providerName}} 测试模型 {{model}} 不存在或已下架\",\n \"modelNotFoundHint\": \"该模型可能已被供应商弃用。请在\\\"模型测试配置\\\"中更新默认测试模型。\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan 额度已用尽\",\n \"quotaExceededHint\": \"百度千帆返回了 Coding Plan 超额错误。请等待 5 小时/每周/每月额度刷新,或在千帆控制台切换套餐。\",\n \"httpHint\": {\n \"400\": \"供应商拒绝了请求格式。健康检查的探测格式可能与实际使用不同。\",\n \"401\": \"API Key 可能无效,或供应商使用 OAuth 等认证方式。检查失败不代表实际不可用。\",\n \"402\": \"账户配额或计费问题。\",\n \"403\": \"供应商拒绝了此请求。部分供应商会校验客户端身份,检查失败但实际使用可能正常。\",\n \"404\": \"接口地址不存在,请检查 Base URL 和 API 路径。\",\n \"429\": \"请求频率过高,请稍后重试。\",\n \"5xx\": \"供应商内部错误,通常是临时问题。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"路由总开关\",\n \"appTakeover\": \"路由启用\",\n \"perAppConfig\": \"应用配置\",\n \"circuitBreaker\": \"熔断器配置\",\n \"circuitBreakerSettings\": \"熔断器设置\",\n \"failureThreshold\": \"失败阈值\",\n \"successThreshold\": \"恢复阈值\",\n \"recoveryTimeout\": \"恢复等待时间\",\n \"errorRateThreshold\": \"错误率阈值\",\n \"minRequests\": \"最小请求数\",\n \"timeoutConfig\": \"超时配置\",\n \"streamingFirstByte\": \"流式首字节超时\",\n \"streamingIdle\": \"流式静默超时\",\n \"nonStreaming\": \"非流式超时\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失败阈值\",\n \"successThreshold\": \"成功阈值\",\n \"timeoutSeconds\": \"超时时间(秒)\",\n \"errorRateThreshold\": \"错误率阈值 (%)\",\n \"minRequests\": \"最小请求数\",\n \"validationFailed\": \"以下字段超出有效范围: {{fields}}\",\n \"configSaved\": \"熔断器配置已保存\",\n \"saveFailed\": \"保存失败\",\n \"loading\": \"加载中...\",\n \"title\": \"熔断器配置\",\n \"description\": \"调整熔断器参数以控制故障检测和恢复行为\",\n \"failureThresholdHint\": \"连续失败多少次后打开熔断器\",\n \"timeoutSecondsHint\": \"熔断器打开后多久尝试恢复(半开状态)\",\n \"successThresholdHint\": \"半开状态下成功多少次后关闭熔断器\",\n \"errorRateThresholdHint\": \"错误率超过此值时打开熔断器\",\n \"minRequestsHint\": \"计算错误率前的最小请求数\",\n \"saveConfig\": \"保存配置\",\n \"instructionsTitle\": \"配置说明\",\n \"instructions\": {\n \"failureThreshold\": \"连续失败达到此次数时,熔断器打开\",\n \"timeout\": \"熔断器打开后,等待此时间后尝试半开\",\n \"successThreshold\": \"半开状态下,成功达到此次数时关闭熔断器\",\n \"errorRate\": \"错误率超过此值时,熔断器打开\",\n \"minRequests\": \"只有请求数达到此值后才计算错误率\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"复制\",\n \"duplicatedAndSynced\": \"统一供应商已复制并同步\",\n \"duplicateError\": \"复制统一供应商失败\",\n \"title\": \"统一供应商\",\n \"description\": \"统一供应商可以同时管理 Claude、Codex 和 Gemini 的配置。修改后会自动同步到所有启用的应用。\",\n \"add\": \"添加统一供应商\",\n \"edit\": \"编辑统一供应商\",\n \"empty\": \"还没有统一供应商\",\n \"emptyHint\": \"点击下方「添加统一供应商」按钮创建一个\",\n \"selectPreset\": \"选择预设类型\",\n \"name\": \"名称\",\n \"namePlaceholder\": \"例如:我的 NewAPI\",\n \"baseUrl\": \"API 地址\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"官网地址\",\n \"websiteUrlPlaceholder\": \"https://example.com(可选,用于在列表中显示)\",\n \"notes\": \"备注\",\n \"notesPlaceholder\": \"可选:添加备注信息\",\n \"enabledApps\": \"启用的应用\",\n \"modelConfig\": \"模型配置\",\n \"model\": \"模型\",\n \"sync\": \"同步到应用\",\n \"synced\": \"已同步到所有应用\",\n \"syncError\": \"同步失败\",\n \"noAppsEnabled\": \"未启用任何应用\",\n \"added\": \"统一供应商已添加\",\n \"addedAndSynced\": \"统一供应商已添加并同步\",\n \"updated\": \"统一供应商已更新\",\n \"deleted\": \"统一供应商已删除\",\n \"addSuccess\": \"统一供应商添加成功\",\n \"addFailed\": \"统一供应商添加失败\",\n \"hint\": \"跨应用统一配置,自动同步到 Claude/Codex/Gemini\",\n \"manage\": \"管理\",\n \"loadError\": \"加载统一供应商失败\",\n \"saveError\": \"保存统一供应商失败\",\n \"deleteError\": \"删除统一供应商失败\",\n \"deleteConfirmTitle\": \"删除统一供应商\",\n \"deleteConfirmDescription\": \"确定要删除 \\\"{{name}}\\\" 吗?这将同时删除它在各应用中生成的供应商配置。\",\n \"syncConfirmTitle\": \"同步统一供应商\",\n \"syncConfirmDescription\": \"同步 \\\"{{name}}\\\" 将会覆盖 Claude、Codex 和 Gemini 中关联的供应商配置。确定要继续吗?\",\n \"syncConfirm\": \"同步\",\n \"saveAndSync\": \"保存并同步\",\n \"savedAndSynced\": \"已保存并同步到所有应用\",\n \"saveAndSyncError\": \"保存并同步失败\",\n \"configJsonPreview\": \"配置 JSON 预览\",\n \"configJsonPreviewHint\": \"以下是将要同步到各应用的配置内容(仅覆盖显示的字段,保留其他自定义配置)\"\n },\n \"omo\": {\n \"editProfile\": \"编辑 OMO 配置\",\n \"newProfile\": \"新建 OMO 配置\",\n \"profileName\": \"名称\",\n \"mainAgents\": \"主 Agent\",\n \"subAgents\": \"子 Agent\",\n \"categories\": \"分类\",\n \"customAgents\": \"自定义 Agent\",\n \"noCustomAgents\": \"暂无自定义 Agent\",\n \"otherFields\": \"其他配置\",\n \"globalConfig\": \"OMO 全局配置\",\n \"globalConfigShort\": \"OMO 配置\",\n \"globalConfigSaved\": \"全局配置已保存\",\n \"addProfile\": \"添加 OMO 配置\",\n \"disabledItems\": \"禁用项设置\",\n \"advanced\": \"高级设置\",\n \"profileCreated\": \"OMO 配置已创建\",\n \"profileUpdated\": \"OMO 配置已更新\",\n \"invalidJson\": \"其他字段包含无效 JSON\",\n \"confirmDelete\": \"删除配置\",\n \"confirmDeleteMsg\": \"确定删除 \\\"{{name}}\\\" 吗?\",\n \"profileDeleted\": \"配置已删除\",\n \"imported\": \"已导入为 \\\"{{name}}\\\"\",\n \"import\": \"导入\",\n \"global\": \"全局\",\n \"empty\": \"暂无配置。点击 + 添加或从本地导入。\",\n \"applied\": \"已应用\",\n \"apply\": \"应用\",\n \"enable\": \"启用\",\n \"enabled\": \"启用中\",\n \"disabled\": \"OMO 已停用\",\n \"disableFailed\": \"停用 OMO 失败: {{error}}\",\n \"selectPlaceholder\": \"请选择...\",\n \"clear\": \"清空\",\n \"clearWrapped\": \"(清空)\",\n \"defaultWrapped\": \"(默认)\",\n \"variantPlaceholder\": \"思考等级\",\n \"selectEnabledModel\": \"选择已配置模型\",\n \"selectModel\": \"选择已配置模型\",\n \"recommendedHint\": \"推荐: {{model}}\",\n \"searchModel\": \"搜索模型...\",\n \"selectModelFirst\": \"先选择模型\",\n \"noEnabledModels\": \"暂无已配置模型\",\n \"noVariantsForModel\": \"该模型无思考等级\",\n \"currentValueNotEnabled\": \"{{value}}(当前值,未配置)\",\n \"currentValueUnavailable\": \"{{value}}(当前值,不可用)\",\n \"advancedLabel\": \"高级参数\",\n \"advancedJsonInvalid\": \"高级参数 JSON 无效\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用默认值\",\n \"noEnabledModelsWarning\": \"当前没有可用的已配置模型,请先配置 OpenCode 模型\",\n \"modelSourcePartialWarning\": \"部分供应商模型配置无效,已自动跳过。\",\n \"modelSourceFallbackWarning\": \"读取 live 供应商状态失败,已回退到已配置供应商列表。\",\n \"importLocalReplaceSuccess\": \"已从本地文件导入并覆盖 Agent/Category/Other Fields\",\n \"importLocalFailed\": \"读取本地文件失败: {{error}}\",\n \"agentKeyPlaceholder\": \"agent 键名\",\n \"categoryKeyPlaceholder\": \"分类键名\",\n \"modelNamePlaceholder\": \"模型名\",\n \"custom\": \"自定义\",\n \"customCategories\": \"自定义分类\",\n \"modelConfiguration\": \"模型配置\",\n \"fillRecommended\": \"填充推荐\",\n \"fillRecommendedSuccess\": \"已填充 {{count}} 个推荐模型\",\n \"fillRecommendedPartial\": \"已填充 {{filled}} 个推荐模型,{{unmatched}} 个未匹配\",\n \"fillRecommendedMostlyUnmatched\": \"仅填充了 {{filled}} 个,{{unmatched}} 个未匹配(如 {{examples}})。请配置提供这些模型的供应商,或手动选择替代项。\",\n \"fillRecommendedAllSet\": \"所有槽位已有模型配置\",\n \"fillRecommendedNoMatch\": \"推荐模型在已配置的供应商中未找到匹配(如 {{examples}})\",\n \"configSummary\": \"已配置 {{agents}} 个 Agent,{{categories}} 个 Category · 点击 ⚙ 展开高级参数\",\n \"enabledModelsCount\": \"可选已配置模型 {{count}} 个\",\n \"source\": \"来源:\",\n \"otherFieldsJson\": \"其他字段 (JSON)\",\n \"slimOtherFieldsHint\": \"OMO Slim 的 council、fallback、multiplexer、disabled_mcps、todoContinuation 等顶层配置请写在这里。\",\n \"searchOrType\": \"搜索或输入自定义值...\",\n \"noMatches\": \"无匹配项\",\n \"jsonMustBeObject\": \"{{field}} 必须是 JSON 对象\",\n \"jsonInvalid\": \"{{field}} 包含无效 JSON\",\n \"importGlobalSuccess\": \"已从本地文件导入全局配置(未保存)\",\n \"importGlobalFailed\": \"读取本地文件失败: {{error}}\",\n \"importLocal\": \"从本地导入\",\n \"saveGlobalConfig\": \"保存全局配置\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"重置默认\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 设置\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"禁用的 Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"禁用的 MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"禁用的 Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"禁用的 Skills\",\n \"advancedLsp\": \"LSP 配置\",\n \"advancedExperimental\": \"实验性功能\",\n \"advancedBackgroundTask\": \"后台任务\",\n \"advancedBrowserAutomation\": \"浏览器自动化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"主编排者\",\n \"hephaestus\": \"自主深度工作者\",\n \"prometheus\": \"战略规划者\",\n \"atlas\": \"任务管理者\",\n \"oracle\": \"战略顾问\",\n \"librarian\": \"多仓库研究员\",\n \"explore\": \"快速代码搜索\",\n \"multimodalLooker\": \"媒体分析器\",\n \"metis\": \"规划前分析顾问\",\n \"momus\": \"计划审查者\",\n \"sisyphusJunior\": \"委托任务执行器\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"主编排器,负责任务规划、委派与并行执行,使用扩展思考(32k 预算),通过 TODO 驱动工作流确保任务完成。\",\n \"atlas\": \"主编排器(持有 TODO 列表),负责执行阶段的任务分发与协调,不直接完成所有工作而是委派给专业代理。\",\n \"prometheus\": \"战略规划师,通过访谈模式收集需求并制定详细工作计划,仅能在 .sisyphus/ 目录读写 Markdown 文件,从不直接写代码。\",\n \"hephaestus\": \"自主深度工作者(「合法工匠」),受 AmpCode 深度模式启发,目标导向执行,行动前会并行启动 2-5 个探索/图书管理员代理进行研究。\",\n \"oracle\": \"架构决策与调试顾问,只读咨询代理,提供出色的逻辑推理和深度分析,不能写文件或委派任务。\",\n \"librarian\": \"多仓库分析与文档检索专家,深度理解代码库并提供基于证据的答案,擅长查找官方文档和开源实现示例。\",\n \"explore\": \"快速代码库探索与上下文 grep 专家,使用轻量级模型进行高速搜索,是理解代码结构的先锋。\",\n \"multimodalLooker\": \"视觉内容专家,分析 PDF、图片、图表等非文本媒体,提取其中的信息与洞察。\",\n \"metis\": \"计划顾问,在规划前进行预分析,识别隐藏意图、模糊点和 AI 失败点,防止过度工程化。\",\n \"momus\": \"计划评审员,高精度验证计划的清晰度、可验证性和完整性,拒绝并要求修订直到计划完美。\",\n \"sisyphusJunior\": \"类别生成的执行器,由 category 参数自动生成,专注于执行分配的任务且不能再委派,防止无限委派循环。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"视觉/前端工程\",\n \"ultrabrain\": \"超级思考\",\n \"deep\": \"深度工作\",\n \"artistry\": \"创意/文艺\",\n \"quick\": \"快速响应\",\n \"unspecifiedLow\": \"通用低配\",\n \"unspecifiedHigh\": \"通用高配\",\n \"writing\": \"写作\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"前端与视觉工程类别,专注于 UI/UX 设计、样式、动画和界面实现,默认使用 Gemini 3.5 Flash 模型。\",\n \"ultrabrain\": \"深度逻辑推理类别,用于需要广泛分析的复杂架构决策,默认使用 GPT-5.3 Codex 的超高推理变体。\",\n \"deep\": \"深度自主问题解决类别,目标导向执行,行动前进行彻底研究,适用于需要深度理解的棘手问题。\",\n \"artistry\": \"高度创意与艺术性任务类别,激发新颖想法和创造性解决方案,默认使用 Gemini 3.5 Flash 的高推理变体。\",\n \"quick\": \"轻量任务类别,用于单文件修改、错别字修复、简单调整等琐碎工作,默认使用 Claude Haiku 4.5 快速模型。\",\n \"unspecifiedLow\": \"未归类低工作量任务类别,适用于不适合其他类别且工作量较小的任务,默认使用 Claude Sonnet 4.5。\",\n \"unspecifiedHigh\": \"未归类高工作量任务类别,适用于不适合其他类别且工作量较大的任务,默认使用 Claude Opus 4.8 的最大变体。\",\n \"writing\": \"写作类别,专注于文档、散文和技术写作,默认使用 Kimi K2.5 模型。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"编排者\",\n \"oracle\": \"神谕者\",\n \"librarian\": \"图书管理员\",\n \"explorer\": \"探索者\",\n \"designer\": \"设计师\",\n \"fixer\": \"修复者\",\n \"council\": \"议会\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"编写执行代码,编排多代理工作流,召唤专家\",\n \"oracle\": \"根本原因分析、架构审查、调试指导(只读)\",\n \"librarian\": \"文档查询、GitHub 代码搜索(只读)\",\n \"explorer\": \"正则搜索、AST 模式匹配、文件发现(只读)\",\n \"designer\": \"现代响应式设计、CSS/Tailwind 精通\",\n \"fixer\": \"代码实现、重构、测试、验证\",\n \"council\": \"多模型共识代理,并行运行多个只读 councillor,再由 master 汇总最终答案。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"默认模型\",\n \"description\": \"配置 OpenClaw 的默认主模型和回退模型\",\n \"primary\": \"主模型\",\n \"primaryPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"fallbacks\": \"回退模型\",\n \"fallbacksPlaceholder\": \"例如: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"添加回退模型\",\n \"saved\": \"默认模型配置已保存\",\n \"saveFailed\": \"保存默认模型失败\"\n },\n \"modelCatalog\": {\n \"title\": \"模型目录\",\n \"description\": \"配置可用模型的别名和允许列表\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"alias\": \"别名\",\n \"aliasPlaceholder\": \"例如: DeepSeek\",\n \"addEntry\": \"添加模型\",\n \"removeEntry\": \"移除\",\n \"saved\": \"模型目录已保存\",\n \"saveFailed\": \"保存模型目录失败\",\n \"empty\": \"暂无模型目录配置\",\n \"emptyHint\": \"添加模型到目录以配置别名\"\n },\n \"suggestedDefaults\": \"应用建议默认配置\",\n \"suggestedDefaultsHint\": \"使用此预设推荐的默认模型配置\"\n },\n \"sidebar\": {\n \"kanban\": \"项目AI看板\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同步备份\",\n \"section\": {\n \"projects\": \"项目\",\n \"myProjects\": \"我的项目\",\n \"monitor\": \"运行监控\",\n \"aiModels\": \"AI模型\",\n \"cloudSync\": \"跨设备云同步\",\n \"teamCollab\": \"团队协作配置\",\n \"syncCollab\": \"同步与协作\"\n },\n \"agentConfig\": \"Agent 配置\",\n \"projectConfig\": \"项目配置\",\n \"planning\": \"规划中\",\n \"addProject\": \"添加项目\",\n \"collapse\": \"折叠侧边栏\",\n \"expand\": \"展开侧边栏\"\n },\n \"kanban\": {\n \"subtitle\": \"以 AI 驱动的全局多视角,多项目组合矩阵:全生命周期管理、项目健康评估、动态成本监控\",\n \"scanning\": \"正在扫描 {{done}}/{{total}} 个项目…\",\n \"refresh\": \"刷新指标\",\n \"addProject\": \"添加项目\",\n \"searchPlaceholder\": \"搜索项目…\",\n \"confirmRemoveTitle\": \"从项目AI看板中移除?\",\n \"confirmRemove\": \"将移除「{{name}}」;不会删除磁盘上的仓库文件,阶段与进度等本地看板数据也会清除。\",\n \"confirmRemoveBtn\": \"移除\",\n \"removed\": \"已移除「{{name}}」\",\n \"commits7dHint\": \"近 7 天共 {{count}} 次提交\",\n \"commitsWindowHint\": \"近 {{days}} 天共 {{count}} 次提交\",\n \"noRecentActivity\": \"近 7 天无提交\",\n \"noRecentActivityWindow\": \"近 {{days}} 天无提交\",\n \"stageDistribution\": \"阶段分布\",\n \"activity\": {\n \"veryHigh\": \"很高\",\n \"high\": \"高\",\n \"medium\": \"中等\",\n \"low\": \"低\"\n },\n \"detail\": {\n \"tabs\": \"项目详情\",\n \"overview\": \"概览\",\n \"aiAssets\": \"AI 资产配置\",\n \"projectAssets\": \"本项目启用的资产\",\n \"projectAssetsHint\": \"勾选后仅对当前项目生效;全局库在侧栏维护,项目关联仅存于本地数据库。\"\n },\n \"score\": {\n \"health\": \"健康评分\"\n },\n \"readiness\": {\n \"title\": \"Agent 配置就绪\",\n \"loading\": \"正在评估配置就绪度…\",\n \"hint\": \"点击下方条目可直达对应配置;项目级资产在「项目资产配置」中关联。\",\n \"configure\": \"去配置\",\n \"configureGlobal\": \"前往全局配置\",\n \"manage\": \"管理\",\n \"openAssetsTab\": \"打开项目资产配置\",\n \"compactTitle\": \"项目配置就绪度\",\n \"normalCount\": \"{{count}} 项正常\",\n \"driftCount\": \"{{count}} 项不一致\",\n \"missingCount\": \"{{count}} 项缺失\",\n \"priorityDrift\": \"优先处理:{{label}} 配置不一致\",\n \"priorityMissing\": \"优先处理:{{label}} 尚未配置\",\n \"completedSection\": \"已完成 {{count}} 项\",\n \"badgeHint\": \"点击查看详情\",\n \"scanEffective\": \"生效态扫描\",\n \"forApp\": \"按 {{app}} 计分\",\n \"status\": {\n \"global_only\": \"来源:全局基线\",\n \"detected_only\": \"来源:仓库探测\",\n \"partial\": \"部分 CLI 支持\",\n \"not_required\": \"当前目标 CLI 不支持此项,已从评分中排除\",\n \"unmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"unknown\": \"暂不能判定\",\n \"unhealthy\": \"配置与预期不一致\"\n },\n \"effective\": {\n \"configured\": \"已配置\",\n \"effective\": \"配置已验证\",\n \"drifted\": \"配置不一致\",\n \"unconfigured\": \"未配置\",\n \"unchecked\": \"暂未比对\",\n \"runtimePending\": \"已验证项目配置一致;目标 CLI 的运行时读取仍待验证。\"\n },\n \"driftBadge\": \"{{count}} 项配置不一致\",\n \"driftShort\": \"待处理 {{count}}\",\n \"repairDrift\": \"修复配置\",\n \"repairSuccess\": \"已写回并验证生效\",\n \"repairFailed\": \"修复后仍存在配置不一致\",\n \"repairError\": \"修复请求失败,请稍后重试\",\n \"repairNoop\": \"当前项无需修复\"\n },\n \"governance\": {\n \"title\": \"配置生效率\",\n \"forApp\": \"目标 CLI:{{app}}\",\n \"scannedProjects\": \"已扫描项目\",\n \"ofTotal\": \"共 {{total}} 个\",\n \"driftProjects\": \"配置不一致项目\",\n \"driftItems\": \"{{count}} 项待修复\",\n \"effectiveRate\": \"生效率\",\n \"comparableItems\": \"{{count}} 项可比对\",\n \"effectiveItems\": \"已生效项\",\n \"portfolioScope\": \"组合层汇总\",\n \"driftBreakdown\": \"配置不一致分布(按资产类型)\",\n \"allEffective\": \"可比对资产均已生效,组合层治理状态良好。\",\n \"awaitingScan\": \"就绪度扫描完成后将显示治理指标。\",\n \"repairConfirmTitle\": \"确认写回修复?\",\n \"repairConfirmProjectTitle\": \"确认修复全部不一致项?\",\n \"repairConfirmAssetIntro\": \"将把 OpenSunstar 库中的「{{label}}」写回目标 CLI({{app}})对应的项目级文件,可能覆盖你在 IDE/终端里手动改过的内容。\",\n \"repairConfirmProjectIntro\": \"将修复项目「{{name}}」的全部 {{count}} 项配置不一致:逐项写回 OpenSunstar 库内容到目标 CLI({{app}}),可能覆盖外部手动修改。\",\n \"repairConfirmDetail\": \"不一致说明:{{detail}}\",\n \"repairConfirmPath\": \"目标路径:{{path}}\",\n \"repairConfirmProceed\": \"确认后将立即写回并复扫验证;此操作不可自动撤销。\",\n \"repairConfirmAction\": \"确认写回\",\n \"repairConfirmProjectAction\": \"确认修复全部\",\n \"tooltip\": {\n \"scannedProjects\": \"已完成 AI 配置就绪度检查的项目数量\",\n \"driftProjects\": \"至少有 1 项 AI 配置与 OpenSunstar 中保存的预期状态不一致,通常来自本地文件被外部修改或删除。\",\n \"effectiveRate\": \"生效率 = 已生效项 ÷ 可比对项。\\n已生效 = 配置已正确写入项目;可比对项 = 排除「不支持」后的有效检查项总数。\",\n \"effectiveItems\": \"所有项目中,AI 配置已正确落地的检查项数量总和。\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"组合层生效状态巡检:未发现配置不一致。\",\n \"title\": \"{{projects}} 个项目存在配置不一致(共 {{items}} 项)\",\n \"forApp\": \"目标 CLI:{{app}}\",\n \"itemCount\": \"{{count}} 项待处理\",\n \"repairAll\": \"修复全部待处理项\",\n \"repairAllSuccess\": \"已修复 {{count}} 项配置不一致并验证生效\",\n \"repairPartial\": \"已修复 {{fixed}} 项,仍有 {{remaining}} 项配置不一致\",\n \"repairNone\": \"未发现可修复的配置不一致项\"\n },\n \"empty\": {\n \"description\": \"点击下方按钮或在侧边栏添加你的第一个项目\",\n \"title\": \"暂无项目\"\n },\n \"openFolder\": \"打开目录\",\n \"progress\": \"进度\",\n \"remove\": \"移除项目\",\n \"sortByDate\": \"日期\",\n \"sortByName\": \"名称\",\n \"stage\": {\n \"mvp\": {\n \"badge\": \"MVP\"\n },\n \"rapid\": {\n \"badge\": \"已上线\"\n },\n \"stable\": {\n \"badge\": \"稳定维护\"\n }\n },\n \"viewDetail\": \"查看详情\"\n },\n \"projectConfig\": {\n \"hint\": \"为当前项目勾选要启用的 MCP、Skills 与 Prompts。全局资产库在侧栏 Agent 配置中维护。\",\n \"mcpServers\": \"MCP 服务器\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"暂无 MCP 服务器\",\n \"noSkills\": \"暂无已安装的 Skills\",\n \"noPrompts\": \"暂无 Prompts\",\n \"goToMcp\": \"前往 MCP 管理\",\n \"goToSkills\": \"前往 Skills 管理\",\n \"goToPrompts\": \"前往 Prompts 管理\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore 规则\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"暂无 Commands\",\n \"noHooks\": \"暂无 Hooks\",\n \"noIgnore\": \"暂无 Ignore 规则\",\n \"noPermissions\": \"暂无 Permissions\",\n \"noSubagents\": \"暂无 Subagents\",\n \"goToCommands\": \"前往 Commands 管理\",\n \"goToHooks\": \"前往 Hooks 管理\",\n \"goToIgnore\": \"前往 Ignore 管理\",\n \"goToPermissions\": \"前往 Permissions 管理\",\n \"goToSubagents\": \"前往 Subagents 管理\"\n },\n \"projectAssets\": {\n \"projectLink\": \"本项目关联\",\n \"hint\": \"为当前项目勾选要启用的 AI 资产子集。关联仅写入 OpenSunstar 本地库,不会自动修改项目仓库文件;写入各 CLI 仍由侧栏全局资产管理。\",\n \"partialHint\": \"部分 CLI 支持有限制,悬停标签查看说明\",\n \"globalBaselineHint\": \"全局库已有 {{count}} 条规则作为安全基线;可为当前项目单独勾选启用子集。\",\n \"switchAllUnsupported\": \"当前资产类型在所有目标 CLI 上均不支持同步,无法为项目启用\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop 暂不参与此类资产同步\",\n \"openclawMcp\": \"OpenClaw 当前不支持 MCP 同步\",\n \"openclawSkills\": \"OpenClaw 当前不支持 Skills 同步\",\n \"openclawCommands\": \"OpenClaw 当前不支持 Commands 同步\",\n \"openclawIgnore\": \"OpenClaw 当前不支持 Ignore 同步\",\n \"openclawSubagents\": \"OpenClaw 当前不支持 Subagents 同步\",\n \"codexCommands\": \"Codex 不支持独立 slash command 文件\",\n \"codexSubagent\": \"Codex 通过 TOML 转换写入 ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks 当前仅 Claude Code 支持写回\",\n \"permissionsClaudeOnly\": \"Permissions 当前仅 Claude Code 支持写回\",\n \"hermesSubagents\": \"Hermes 不支持 Subagent 文件同步\"\n },\n \"scopeTitle\": \"当前作用域:\"\n },\n \"board\": {\n \"summary\": {\n \"title\": \"项目总览\",\n \"totalProjects\": \"总项目数\",\n \"totalCodeLines\": \"总代码行数\",\n \"linesUnit\": \"行\",\n \"avgActivity\": \"平均活跃度({{days}} 天)\",\n \"commitsInWindow\": \"近 {{days}} 天提交\",\n \"thisWeek\": \"近 7 天提交\",\n \"windowLabel\": \"Git 活跃统计周期\",\n \"daysUnit\": \"天\",\n \"updatesUnit\": \"次\"\n },\n \"duplicateCleanup\": \"重复资产检测\"\n },\n \"projectBlueprint\": {\n \"title\": \"项目基线 Blueprint\",\n \"hint\": \"选择模板一键关联全局库资产;合并模式仅新增关联,不删除已有配置。\",\n \"loading\": \"加载 Blueprint…\",\n \"exportSnapshot\": \"导出快照\",\n \"targetCli\": \"项目目标 CLI\",\n \"targetDefault\": \"沿用看板默认\",\n \"saveTarget\": \"保存\",\n \"previewing\": \"生成预览…\",\n \"previewTitle\": \"预览:将新增 {{count}} 项关联({{name}})\",\n \"apply\": \"应用 Blueprint\",\n \"applied\": \"已应用「{{name}}」,关联 {{count}} 项资产\",\n \"targetSaved\": \"项目目标 CLI 已保存\",\n \"snapshotExported\": \"基线快照已导出:{{path}}\"\n },\n \"subscription\": {\n \"title\": \"订阅额度\",\n \"fiveHour\": \"5小时\",\n \"sevenDay\": \"7天\",\n \"sevenDayOpus\": \"7天(Opus)\",\n \"sevenDaySonnet\": \"7天(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"每周\",\n \"copilotPremium\": \"高级请求\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}后重置\",\n \"extraUsage\": \"超额用量\",\n \"expired\": \"会话已过期\",\n \"expiredHint\": \"请运行 {{tool}} 命令刷新登录\",\n \"queryFailed\": \"查询失败\",\n \"refresh\": \"刷新\"\n },\n \"methodology\": {\n \"sidebar\": \"工作流编排\",\n \"title\": \"工作流编排\",\n \"subtitle\": \"为项目建立可执行流程与治理检查;方法论识别作为可选诊断。\",\n \"scanAll\": \"扫描所有项目\",\n \"scanAllNoProjects\": \"请先添加项目再扫描\",\n \"scanComplete\": \"框架探测完成\",\n \"scanCompleteWithCount\": \"已扫描 {{count}} 个项目\",\n \"tabMarket\": \"方法论识别\",\n \"tabOrchestration\": \"工作流配置\",\n \"notScanned\": \"未扫描\",\n \"verified\": \"已检测到\",\n \"inferred\": \"可能使用\",\n \"absent\": \"未检测到\",\n \"detectedInProjects\": \"{{detected}}/{{total}} 项目已检测到\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} 项目可能使用\",\n \"absentInAll\": \"{{total}} 项目均未检测到\",\n \"noneDetectedTitle\": \"未检测到任何方法论框架\",\n \"noneDetectedGuidance\": \"推荐从 flow-kit(纯 Markdown 模板体系)或 spec-kit(规格工具链)入手。review-only 预设适合已有代码审查流程的项目,无需安装框架。\",\n \"scanPromptTitle\": \"尚未扫描项目中的方法论框架\",\n \"scanPromptBody\": \"点击「扫描所有项目」进行只读探测,或直接进入工作流配置 / 变更执行方案——无需先安装或检测框架。\",\n \"goToOrchestration\": \"去工作流配置\",\n \"goToRecipe\": \"变更执行方案\",\n \"recommendedPreset\": \"推荐档位:{{preset}}\",\n \"recommendedFrameworks\": \"框架参考目录\",\n \"recommendedFrameworksHint\": \"受支持的开源方法论一览,供了解与选型参考(非安装向导)\",\n \"detectedFrameworks\": \"已检测到的框架\",\n \"directOrchestrationTitle\": \"不依赖框架也可开始编排\",\n \"directOrchestrationHint\": \"工作流配置与变更执行方案可独立使用,导出 workflow.profile.json 或变更执行方案文件。\",\n \"presetFull\": \"完整流程\",\n \"presetStandard\": \"标准流程\",\n \"presetMvp\": \"MVP 流程\",\n \"presetReviewOnly\": \"仅审查\",\n \"noDescriptors\": \"框架目录为空。请确认数据库已初始化。\",\n \"detectionMatrix\": \"检测矩阵\",\n \"detectionMatrixHint\": \"项目 × 框架检测结果(✓ 已检测到 / ? 可能使用 / ✗ 未检测到 / — 未扫描)\",\n \"matrixFramework\": \"框架 \\\\ 项目\",\n \"orchestrationEntry\": \"工作流配置\",\n \"orchestrationHint\": \"独立维度:选择一个项目,配置流程档位、模块和阶段,导出 workflow.profile.json 或 flow-config.yaml。无需先完成方法论框架扫描。\",\n \"orchestrationNoProjects\": \"暂无项目。请先在工作区添加项目,再进行流程编排配置。\",\n \"orchestrationSelectProject\": \"选择项目\",\n \"orchestrationChooseProject\": \"— 请选择项目 —\",\n \"orchestrationPickProjectHint\": \"请在上方下拉框选择一个项目,开始配置 SDD 流程编排。\",\n \"tabRecipe\": \"变更执行方案\",\n \"recipeEntry\": \"变更执行方案\",\n \"recipeHint\": \"用可视化阶段图组合阶段与模块,导出 YAML+Markdown 格式的变更执行方案;可独立使用。\",\n \"recipeNoProjects\": \"暂无项目。请先在工作区添加项目。\",\n \"recipeSelectProject\": \"选择项目\",\n \"recipePickPlaceholder\": \"— 选择项目 —\",\n \"recipePickProjectHint\": \"请在上方下拉框选择一个项目,开始制定变更执行方案。\",\n \"tabDesignContract\": \"设计合约\",\n \"designContractEntry\": \"设计合约配置器\",\n \"designContractHint\": \"独立维度:选择品牌模板或自定义配色,生成 DESIGN.md + DTCG tokens。与 SDD 方法论无关,任何有前端/UI 的项目均可独立使用。\",\n \"designContractNoProjects\": \"暂无项目。请先在工作区添加项目。\",\n \"designContractSelectProject\": \"选择项目\",\n \"designContractPickPlaceholder\": \"— 选择项目 —\",\n \"designContractPickProjectHint\": \"请在上方下拉框选择一个项目,开始配置设计合约。\",\n \"tabRulesContext\": \"规则与上下文\",\n \"rulesContextPickProjectHint\": \"请在上方下拉框选择一个项目,查看关联的规则片段与上下文文件。\"\n },\n \"rulesContext\": {\n \"title\": \"项目规则\",\n \"hint\": \"已关联到当前项目的规则片段。带 Glob 的规则仅在匹配文件存在时生效。\",\n \"empty\": \"暂无已关联的规则。在 Agent 配置 > Prompts 中创建规则片段,然后在项目详情中关联。\",\n \"fragment\": \"片段\",\n \"allTargets\": \"所有工具\",\n \"universal\": \"全局\",\n \"contextFiles\": \"上下文文件\",\n \"contextFilesHint\": \"项目同步时为各 AI 工具生成的上下文文件。仅关联了 Prompt 的工具会生成文件。\",\n \"willSync\": \"将同步\",\n \"managed\": \"已托管\",\n \"userCreated\": \"用户自建\",\n \"pendingSync\": \"待同步\",\n \"notLinked\": \"未关联\"\n },\n \"recipeComposer\": {\n \"title\": \"变更执行方案\",\n \"hybrid\": \"YAML+Markdown 混合格式\",\n \"loading\": \"加载变更执行方案中...\",\n \"preset\": \"流程档位\",\n \"projectType\": \"项目类型\",\n \"projectTypeBackend\": \"后端\",\n \"projectTypeFrontend\": \"前端\",\n \"projectTypeCli\": \"命令行\",\n \"recipeName\": \"方案名称\",\n \"recipeNamePlaceholder\": \"我的变更执行方案\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"基于标准流程的变更执行方案\",\n \"stageGraph\": \"阶段图\",\n \"nodesCount\": \"{{count}} 个节点\",\n \"modules\": \"模块\",\n \"stages\": \"阶段\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 已启用\",\n \"notes\": \"备注(可选)\",\n \"notesPlaceholder\": \"为该变更执行方案添加备注...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"如 feat-auth、fix-login-bug\",\n \"preview\": \"预览\",\n \"copy\": \"复制\",\n \"export\": \"导出执行方案\",\n \"install\": \"安装到项目\",\n \"installedSummary\": \"已安装:创建 {{created}} 个文件\",\n \"installedSkipped\": \",跳过 {{skipped}} 个已存在文件\",\n \"exists\": \"(已存在)\",\n \"previewTitle\": \"预览(YAML+Markdown 混合格式)\",\n \"collapse\": \"收起\",\n \"savedRecipes\": \"已保存的执行方案\",\n \"fitWidth\": \"适应宽度\",\n \"actualSize\": \"实际大小\",\n \"lateral\": \"横向(跨领域)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"半独立\",\n \"legendBranch\": \"分支\",\n \"legendNoArtifacts\": \"无产物\",\n \"toastExported\": \"变更执行方案「{{name}}」已导出到 .opensunstar/recipe/\",\n \"toastCopied\": \"变更执行方案内容已复制到剪贴板\",\n \"toastCopyFailed\": \"复制失败\",\n \"toastChangeIdRequired\": \"请填写 Change ID(如 feat-auth)\",\n \"toastInstalled\": \"变更执行方案已安装到项目:创建 {{created}} 个文件\",\n \"toastDeleted\": \"变更执行方案「{{name}}」已删除\"\n },\n \"designContract\": {\n \"title\": \"设计合约\",\n \"name\": \"合约名称\",\n \"description\": \"描述\",\n \"templates\": \"模板\",\n \"tokens\": \"令牌\",\n \"preview\": \"预览\",\n \"import\": \"导入\",\n \"colors\": \"颜色\",\n \"typography\": \"字体\",\n \"spacing\": \"间距基数 (px)\",\n \"copy\": \"复制\",\n \"copied\": \"已复制到剪贴板\",\n \"exported\": \"已导出\",\n \"installed\": \"已安装\",\n \"loadingTemplate\": \"加载模板中...\",\n \"noPreview\": \"点击预览生成 DESIGN.md\",\n \"importFile\": \"从文件导入\",\n \"pickFile\": \"选择 DESIGN.md 文件...\",\n \"importUrl\": \"从 URL 导入\",\n \"previewBtn\": \"预览\",\n \"copyBtn\": \"复制\",\n \"exportBtn\": \"导出\",\n \"installBtn\": \"安装到项目\",\n \"installResult\": \"已安装\",\n \"filesCreated\": \"个文件已创建\",\n \"filesSkipped\": \"已跳过\",\n \"exists\": \"已存在\",\n \"confirmExport\": \"确认覆盖导出\",\n \"confirmExportTitle\": \"确认覆盖导出设计规范\",\n \"exportOverwriteBtn\": \"覆盖导出 DESIGN.md\",\n \"verifyBtn\": \"验证项目产物\"\n },\n \"installConfirm\": {\n \"title\": \"确认安装到项目\",\n \"auditScan\": \"安全审计扫描\",\n \"filesScanned\": \"文件已扫描\",\n \"noFindings\": \"未发现安全问题。\",\n \"auditBlocked\": \"安全审计发现 CRITICAL 级别问题,安装已被阻断。请修复后重试。\",\n \"fileList\": \"文件清单\",\n \"toCreate\": \"将创建\",\n \"toSkip\": \"已存在跳过\",\n \"create\": \"创建\",\n \"skip\": \"跳过\",\n \"existing\": \"现有内容\",\n \"wouldOverwrite\": \"将覆盖为 (当前跳过)\",\n \"newContent\": \"新内容\",\n \"cancel\": \"取消\",\n \"confirmInstall\": \"确认安装\",\n \"overwrite\": \"覆盖\",\n \"toOverwrite\": \"将覆盖\",\n \"willOverwrite\": \"将覆盖为\"\n },\n \"sync\": {\n \"waiting\": \"等待变更\",\n \"syncing\": \"同步中...\",\n \"synced\": \"已同步\",\n \"failed\": \"同步失败\",\n \"disabled\": \"未启用\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{count}}分钟前\",\n \"hoursAgo\": \"{{count}}小时前\",\n \"daysAgo\": \"{{count}}天前\"\n },\n \"repairPreview\": {\n \"title\": \"配置修复预览\",\n \"description\": \"项目「{{name}}」共 {{count}} 项配置不一致,勾选需要修复的项:\",\n \"loading\": \"正在扫描待处理项…\",\n \"empty\": \"未发现配置不一致,无需修复\",\n \"selectAll\": \"全选\",\n \"deselectAll\": \"取消全选\",\n \"safetyHint\": \"{{count}} 项为安全关键项(Ignore/Permissions/Hooks),修复将覆盖访问控制或命令执行配置\",\n \"safetyCriticalTooltip\": \"安全关键项:修复将覆盖访问控制或命令执行相关配置\",\n \"safetyBadge\": \"安全关键\",\n \"confirmAction\": \"修复选中项({{count}})\",\n \"repairing\": \"修复中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 配置状态\",\n \"subtitle\": \"每个格子显示一类 AI 配置的短状态:已生效、不一致、缺失、全局、探测、未扫、不适用。点击查看详情。\",\n \"project\": \"项目\",\n \"stage\": \"阶段\",\n \"score\": \"分数\",\n \"loading\": \"正在扫描项目配置状态…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"需关注\",\n \"abnormal\": \"异常\",\n \"unscanned\": \"未扫描\",\n \"hasIssue\": \"需处理\",\n \"showProblemsOnly\": \"只看需处理\",\n \"filterLabel\": \"项目状态筛选\",\n \"filterAll\": \"全部\",\n \"filterNeedsAction\": \"需处理\",\n \"filterAbnormal\": \"异常\",\n \"filterUnscanned\": \"未扫\",\n \"allClear\": \"当前筛选下没有需要处理的项目\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"已生效\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"缺失\",\n \"cellGlobal\": \"全局\",\n \"cellDetected\": \"探测\",\n \"cellPartial\": \"部分\",\n \"cellWarn\": \"需关注\",\n \"cellCrit\": \"异常\",\n \"cellUnscanned\": \"未扫\",\n \"cellNA\": \"不适用\",\n \"cellRecent\": \"有更新\",\n \"cellStale\": \"无更新\",\n \"colUpkeep\": \"维护度\",\n \"colUpkeepTitle\": \"近 90 天项目资产关联更新\",\n \"linkedCount\": \"OpenSunstar 已关联\",\n \"linkedCountValue\": \"{{value}} 项\",\n \"detailRecentUpdates\": \"统计近 90 天内是否有项目级 AI 资产配置变更\",\n \"safetyBadge\": \"安全关键\",\n \"noData\": \"暂无扫描数据\",\n \"scanPending\": \"尚未完成扫描,当前状态不能判定为正常。\",\n \"detailEffective\": \"配置已生效,与 OpenSunstar 库一致\",\n \"detailDrifted\": \"配置与预期不一致,可能需要修复\",\n \"detailUnscanned\": \"已发现配置,但暂未完成目标 CLI 生效状态比对\",\n \"detailGlobal\": \"使用全局默认配置,项目级未自定义\",\n \"detailDetected\": \"检测到仓库中有配置,但未被 OpenSunstar 管理\",\n \"detailMissingSafety\": \"安全关键项未配置,建议尽快设置\",\n \"detailMissing\": \"未配置此项,如果不需要可忽略\",\n \"detailPartial\": \"部分配置,建议完善\",\n \"detailNA\": \"当前目标 CLI 不支持此项\",\n \"detailUnmanaged\": \"项目尚未纳入 OpenSunstar,不能判定为缺失\",\n \"statusOk\": \"配置正常\",\n \"statusWarn\": \"需要关注\",\n \"statusCrit\": \"存在异常\",\n \"statusUnscanned\": \"未完成扫描\",\n \"statusNA\": \"不适用\",\n \"stateDetail\": \"状态详情\",\n \"driftDetail\": \"状态详情\",\n \"checkDetail\": \"检查详情\",\n \"filePath\": \"配置文件路径\",\n \"viewProject\": \"查看项目资产\",\n \"goRepair\": \"去修复\"\n },\n \"portfolioNotice\": {\n \"title\": \"部分数据没读到,下面的「未扫 / 未配置 / 缺失」不代表磁盘上真的缺失。\",\n \"readinessFailed\": \"{{failed}}/{{total}} 个项目的就绪度读取失败\",\n \"assetFailed\": \"资产统计失败:{{reason}}\",\n \"retry\": \"重试\"\n },\n \"scope\": {\n \"globalEnabled\": \"全局已启用\",\n \"globalNotEnabled\": \"全局未启用\",\n \"activeProject\": \"项目:{{name}}\",\n \"backToProject\": \"返回项目:{{name}}\",\n \"globalScope\": \"全局\",\n \"projectScope\": \"项目级\",\n \"globalToast\": \"已为 {{app}} 全局启用\",\n \"globalDisableToast\": \"已为 {{app}} 全局停用\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"跨设备云同步\",\n \"subtitle\": \"配置数据在多台设备间实时同步,随时随地保持一致的开发环境\",\n \"status\": \"同步状态\",\n \"backend\": \"同步后端\",\n \"notConfigured\": \"未配置\",\n \"notConfiguredHint\": \"请先在设置中配置云同步后端(WebDAV / S3 / GitHub Gist)\",\n \"goSettings\": \"前往同步设置\",\n \"lastSync\": \"上次同步\",\n \"never\": \"从未同步\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 对象存储\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"已启用\",\n \"disabled\": \"未启用\",\n \"autoSync\": \"自动同步\",\n \"on\": \"开\",\n \"off\": \"关\",\n \"description\": \"云同步解决的是「空间轴」问题——配置在多台设备间保持一致。与项目环境快照(时间轴·版本回溯)互为补充,按需选用。\"\n },\n \"aiProvider\": {\n \"apiUrl\": \"API 地址\",\n \"configured\": \"已配置\",\n \"custom\": \"自定义\",\n \"customDescription\": \"兼容 OpenAI 格式的任意 API。填入端点地址、模型名和 API Key 即可。\",\n \"customTitle\": \"自定义\",\n \"description\": \"选择用于项目看板 AI 能力的模型提供方。DeepSeek 使用 deepseek-chat,GLM 使用智谱模型。密钥仅保存在本机。\",\n \"model\": \"模型\",\n \"saved\": \"DeepSeek 配置已保存\",\n \"testConnection\": \"测试连接\",\n \"title\": \"AI 提供方\"\n },\n \"flowOrchestrator\": {\n \"activity\": \"最近编排操作\",\n \"advancedDetails\": \"高级详情:CI 命令与生成文件\",\n \"checkGate\": \"检查\",\n \"ciSnippet\": \"GitHub Actions / 自动检查片段\",\n \"ciSnippetCopied\": \"已复制 CI 门禁片段\",\n \"confirmFlowConfig\": \"确认导出\",\n \"confirmFlowConfigTitle\": \"确认导出 CI 检查配置\",\n \"confirmProfile\": \"确认保存\",\n \"confirmProfileTitle\": \"确认保存项目流程\",\n \"exportCiConfig\": \"导出 CI 检查配置\",\n \"exportOk\": \"已导出 .opensunstar/workflow.profile.json\",\n \"flowConfigOk\": \"已导出 .opensunstar/flow-config.yaml (R9.6 安全阀已注入)\",\n \"gateBlock\": \"缺少工件\",\n \"gatePass\": \"可通过\",\n \"loading\": \"加载流程预设…\",\n \"loopHint\": \"先保存项目工作规则,再生成变更材料,最后接入自动检查;高级文件细节可在下方展开查看。\",\n \"loopTitle\": \"让项目规则真正生效\",\n \"missingArtifacts\": \"缺: {{list}}\",\n \"modules\": \"高级:选择规则模块\",\n \"noActivity\": \"暂无编排操作。保存流程、生成自动检查配置或运行检查后会显示在这里。\",\n \"noChanges\": \"暂无 change 目录。复制 flow-kit 并在 .specs/<id>/ 下创建工件。\",\n \"pathInvalid\": \"路径无效\",\n \"pickChange\": \"请先选择 change\",\n \"preset\": \"流程档位\",\n \"projectType\": \"项目类型\",\n \"r96Summary\": \"R9.6: max_retry={{retry}}, role_sep={{sep}}, diff_boundary={{diff}}\",\n \"rescan\": \"刷新索引\",\n \"rollbackLatest\": \"恢复上次编排\",\n \"rollbackOk\": \"已恢复最近一次编排变更({{count}} 个文件操作)\",\n \"saveProjectFlow\": \"保存项目流程\",\n \"specsIndex\": \".specs 变更索引\",\n \"stageGate\": \"阶段门禁试算 (R2.7)\",\n \"stages\": \"高级:调整执行步骤\",\n \"stepCi\": \"3. 接入门禁校验\",\n \"stepCiDone\": \"自动检查规则已生成\",\n \"stepCiTodo\": \"导出 CI 检查配置并复制命令\",\n \"stepProfile\": \"1. 保存项目流程\",\n \"stepProfileDone\": \"项目工作规则已保存\",\n \"stepProfileTodo\": \"选择档位、模块和阶段后保存\",\n \"stepSpecs\": \"2. 生成变更材料\",\n \"stepSpecsDone\": \"已检测到 .specs 变更工件\",\n \"stepSpecsTodo\": \"到“变更执行方案”生成 .specs\",\n \"strictMode\": \"发现明显冲突时先拦住\",\n \"strictModeHint\": \"默认开启。适合团队协作;探索期可关闭,先生成文件再人工确认。\",\n \"subtitle\": \"flow-kit 兼容 · 档位 + 模块 + .specs 索引 + 阶段门禁\",\n \"tasks\": \"任务 {{done}}/{{total}} 完成\",\n \"title\": \"项目工作规则\"\n },\n \"projectEnvironment\": {\n \"hint\": \"保存当前供应商、MCP、Skills 与 Prompt 激活状态;应用前预览差异,应用后写入验证回执并可回滚。\",\n \"title\": \"项目环境快照\"\n },\n \"projects\": {\n \"addDescription\": \"添加本地项目仓库到侧边栏,方便快速切换管理\",\n \"addTitle\": \"添加项目\",\n \"browseFolder\": \"浏览文件夹\",\n \"descLabel\": \"项目描述\",\n \"descPlaceholder\": \"简要描述项目用途、技术栈或当前目标\",\n \"manualPathHint\": \"请手动输入项目路径\",\n \"nameLabel\": \"项目名称\",\n \"namePlaceholder\": \"例如:我的项目\",\n \"pathLabel\": \"本地路径\",\n \"pathPlaceholder\": \"例如:D:\\\\projects\\\\my-repo\",\n \"validation\": {\n \"nameRequired\": \"请输入项目名称\",\n \"pathRequired\": \"请输入项目路径\"\n }\n },\n \"shortcuts\": {\n \"footer\": \"按 ? 或 Ctrl+/ 随时呼出此面板\",\n \"general\": \"通用\",\n \"goBack\": \"返回上一级 / 关闭弹窗\",\n \"kanban\": \"看板总览\",\n \"layout\": \"布局\",\n \"navigation\": \"导航\",\n \"sessions\": \"Context\",\n \"showHelp\": \"显示/隐藏此面板\",\n \"title\": \"键盘快捷键\",\n \"toggleSidebar\": \"折叠/展开侧边栏\",\n \"tokenStats\": \"AI Tokens\"\n },\n \"time\": {\n \"daysAgo\": \"{{n}} 天前\",\n \"hoursAgo\": \"{{n}} 小时前\",\n \"justNow\": \"刚刚\",\n \"minutesAgo\": \"{{n}} 分钟前\"\n },\n \"tokenStats\": {\n \"description\": \"Token 用量统计与费用分析\"\n },\n \"projectAiConfig\": {\n \"emptyProjects\": \"还没有添加项目,先添加一个再来配置 AI 资产。\",\n \"openWorkflow\": \"配置项目工作流\",\n \"orchestrationHint\": \"阶段、预设与变更执行方案在「流程与方法论」里配置,会带着当前项目跳过去。\",\n \"orchestrationLink\": \"工作流编排\",\n \"subtitle\": \"为单个项目落地 AI 资产:套用蓝图、检查就绪度、勾选生效的资产。侧栏「Agent 配置」管的是全局库,这里管它们在本项目上的关联。\",\n \"switcher\": \"当前配置项目\",\n \"targetCli\": \"目标 CLI\",\n \"tabs\": {\n \"assets\": \"资产关联\",\n \"readiness\": \"就绪与生效\",\n \"environment\": \"项目环境 & Wiki\"\n },\n \"title\": \"AI资产配置\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} 次分析\",\n \"cachedFree\": \"¥0(缓存)\",\n \"chartApiCalls\": \"API 调用\",\n \"chartCost\": \"费用\",\n \"chartNlQuery\": \"NL 问答\",\n \"colCost\": \"费用\",\n \"colCount\": \"次数\",\n \"colTokens\": \"Token\",\n \"colType\": \"类型\",\n \"disclaimer\": \"费用为基于公开定价的估算,以供应商账单为准。\",\n \"disclaimerCliSuffix\": \"CLI 代理用量见「设置 → 用量」。\",\n \"disclaimerShort\": \"估算 · 以供应商账单为准\",\n \"emptyRoi\": \"近 {{days}} 天尚无 AI 调用记录。触发摘要、风险分析或 NL 问答后将在此展示 ROI。\",\n \"estimatedSuffix\": \"估算\",\n \"lastCall\": \"本次\",\n \"loadingRoi\": \"加载 ROI 数据…\",\n \"monthTotal\": \"本月累计\",\n \"monthTotalFailed\": \"本月累计查询失败(未知,不是 ¥0)\",\n \"monthTotalLoading\": \"本月累计 统计中…\",\n \"nlQueryCount\": \"{{queries}} 次问答\",\n \"panelTitle\": \"AI 成本-价值追踪\",\n \"projectRisks\": \"{{risks}} 项风险\",\n \"projectScope\": \"{{projects}} 个项目\",\n \"projectUseful\": \"{{useful}} 次有用\",\n \"rangeDays\": \"{{days}} 天\",\n \"roiReport\": \"AI 投入报告\",\n \"sectionByProject\": \"按项目(消耗 ↔ 价值)\",\n \"sectionByType\": \"按分析类型\",\n \"statRisks\": \"发现风险\",\n \"statTokens\": \"Token\",\n \"statTotalSpend\": \"总投入\",\n \"statUseful\": \"标记有用\",\n \"stripTitle\": \"AI 成本透明\",\n \"trendTitle\": \"每日 AI 投入趋势\",\n \"unknownPricing\": \"单价未知\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI 反馈\",\n \"markNotUseful\": \"标记为无用\",\n \"markUseful\": \"标记为有用\",\n \"notUseful\": \"无用\",\n \"useful\": \"有用\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 就绪度\",\n \"health\": \"健康评分\",\n \"nlQuery\": \"自然语言查询\",\n \"portfolioSummary\": \"组合周报\",\n \"progress\": \"进度估算\",\n \"riskAnalysis\": \"风险分析\",\n \"summary\": \"项目摘要\",\n \"trendAnalysis\": \"趋势分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI 回答\",\n \"costFailed\": \"成本统计查询失败(未知,不是 ¥0)\",\n \"detailToggle\": \"近 {{days}} 天分析明细\",\n \"guarding\": \"AI 正在守护\",\n \"inputLabel\": \"向 AI 提问\",\n \"notConfigured\": \"AI 问答与成本统计尚未启用 —— 在「设置 → AI 提供方」填入 API Key 后,这里会出现自然语言提问入口。\",\n \"placeholder\": \"向 AI 提问,如:哪个项目最近不活跃?帮我生成本周总结\",\n \"projectsUnit\": \"个项目\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"问答\",\n \"typeRisk\": \"风险\",\n \"typeSummary\": \"摘要\",\n \"typeTrend\": \"趋势\",\n \"typeWeekly\": \"周报\"\n },\n \"risk\": {\n \"analyze\": \"分析风险\",\n \"analyzing\": \"正在分析风险…\",\n \"levelHigh\": \"高风险\",\n \"levelLow\": \"低风险\",\n \"levelMedium\": \"中风险\",\n \"none\": \"项目状态健康,暂未发现风险\",\n \"sectionTitle\": \"风险分析\",\n \"title\": \"AI 风险分析\",\n \"typeActivity\": \"活跃度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"进度\",\n \"typeTechDebt\": \"技术债\"\n },\n \"weekly\": {\n \"analyzing\": \"正在分析 {{projects}} 个项目数据…\",\n \"cached\": \"缓存\",\n \"copied\": \"已复制\",\n \"copyFailed\": \"复制失败\",\n \"copySuccess\": \"周报已复制到剪贴板\",\n \"dialogTitle\": \"AI 智能周报\",\n \"errorGenerate\": \"周报生成失败,请稍后重试。\",\n \"errorNoProvider\": \"未配置 AI 提供方,请先在设置中配置 AI Key。\",\n \"generate\": \"生成周报\",\n \"windowDays\": \"{{days}}天\",\n \"windowHint\": \"· 近 {{days}} 天数据\"\n }\n },\n \"alerts\": {\n \"action\": {\n \"budget\": \"调整预算\",\n \"configure\": \"去配置\",\n \"hintAssets\": \"→ 项目资产配置 · 资产关联\",\n \"hintReadiness\": \"→ 项目资产配置 · 就绪与生效\",\n \"repair\": \"去修复\",\n \"setup\": \"去配置\"\n },\n \"dismiss\": \"知道了\",\n \"empty\": {\n \"desc\": \"没有故障、没有超支、没有待修复。去写代码吧。\",\n \"title\": \"今天没事\"\n },\n \"money\": {\n \"critical\": \"预算超限\",\n \"emergency\": \"严重超限\",\n \"warning\": \"预算预警\"\n },\n \"onlyTasks\": \"命和钱都没事——剩下的都是可以排期的事。\",\n \"task\": {\n \"driftDesc\": \"配置与预期不一致,可预览后一键修复\",\n \"gapDesc\": \"就绪检查未满分,去「项目资产配置」补齐\"\n },\n \"viewAll\": \"查看项目全景\"\n },\n \"xaiOauth\": {\n \"authStatus\": \"xAI OAuth 认证\",\n \"accountCount\": \"{{count}} 个可用账号\",\n \"reauthRequired\": \"需要重新登录\",\n \"notAuthenticated\": \"未认证\",\n \"selectAccount\": \"选择账号\",\n \"selectAccountPlaceholder\": \"选择 xAI 账号\",\n \"useDefaultAccount\": \"使用默认账号\",\n \"accounts\": \"xAI 账号\",\n \"expired\": \"凭据已失效\",\n \"defaultAccount\": \"默认\",\n \"setAsDefault\": \"设为默认\",\n \"removeAccount\": \"移除账号\",\n \"addOrReauth\": \"添加账号或重新登录\",\n \"login\": \"使用 xAI 登录\",\n \"waitingForAuth\": \"等待 xAI 授权中…\",\n \"enterCode\": \"若浏览器未自动填入,请输入:\",\n \"retry\": \"重试\",\n \"logoutAll\": \"移除所有 xAI 账号\",\n \"loginRequired\": \"请先登录 xAI 账号\",\n \"selectedAccountNeedsReauth\": \"已绑定账号不存在或需要重新登录\",\n \"selectedAccountUnavailable\": \"已绑定账号不存在或需要重新登录,请重新选择账号\"\n }\n}\n"}}, "src/i18n/locales/zh-TW.json": {"7f658de920ce256b279a9888f7d34df16218d8f9": {"t": 1785674686.0797534, "n": 148008, "h": "2882a531083e4610", "c": "{\n \"projectWiki\": {\n \"title\": \"專案 Wiki / 知識基線\",\n \"subtitle\": \"可被人類與 Agent 共同消費的工程知識基線\",\n \"loading\": \"正在掃描 Wiki…\",\n \"notInitialized\": \"未偵測到 wiki/index.md\",\n \"pageCount\": \"{{count}} 個頁面\",\n \"sourceRefs\": \"{{count}} 個原始碼參照\",\n \"questions\": \"{{count}} 個待查\",\n \"lastUpdated\": \"最近更新\",\n \"status\": {\n \"missing\": \"未初始化\",\n \"scaffolded\": \"已初始化\",\n \"effective\": \"新鮮\",\n \"drifted\": \"已變更\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · 快速入門\",\n \"L2\": \"L2 · 介面對接\",\n \"L3\": \"L3 · 運維排障\"\n },\n \"coverage\": {\n \"corePages\": \"核心頁面\",\n \"componentPages\": \"元件\",\n \"flowPages\": \"流程\",\n \"apiPages\": \"介面\",\n \"runbookPages\": \"運維手冊\"\n },\n \"actions\": {\n \"init\": \"初始化 Wiki\",\n \"lint\": \"執行 Lint 校驗\",\n \"refresh\": \"重新整理\",\n \"openInEditor\": \"在編輯器中開啟\",\n \"previewInit\": \"預覽初始化\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 剛初始化,變更對映尚未生效\",\n \"coldStartProgress\": \"目前有效 source_files 頁面:{{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"請點擊「生成專案 Wiki」,使用設定中的 AI 提供方生成並驗收\",\n \"affectedPages\": \"{{count}} 個原始碼變更,影響 {{pages}} 個 wiki 頁面\",\n \"unmapped\": \"{{count}} 個未對映變更\",\n \"noChanges\": \"無原始碼變更,wiki 頁面均為最新\"\n },\n \"lint\": {\n \"passed\": \"Lint 通過\",\n \"failed\": \"Lint 失敗:{{errors}} 個錯誤\",\n \"warnings\": \"{{count}} 個警告\",\n \"qualityLevel\": \"品質等級:{{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初始化預檢\",\n \"willCreate\": \"將建立 {{count}} 個檔案\",\n \"alreadyExists\": \"{{count}} 個檔案已存在(將跳過)\",\n \"confirm\": \"確認初始化\",\n \"success\": \"Wiki 初始化完成,已建立 {{count}} 個檔案\",\n \"blocked\": \"安全稽核阻斷\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code / Codex / Gemini CLI 全方位輔助工具\"\n },\n \"common\": {\n \"add\": \"新增\",\n \"edit\": \"編輯\",\n \"delete\": \"刪除\",\n \"save\": \"儲存\",\n \"saving\": \"儲存中...\",\n \"cancel\": \"取消\",\n \"confirm\": \"確認\",\n \"close\": \"關閉\",\n \"done\": \"完成\",\n \"settings\": \"設定\",\n \"about\": \"關於\",\n \"version\": \"版本\",\n \"loading\": \"載入中...\",\n \"notInstalled\": \"未安裝\",\n \"success\": \"成功\",\n \"error\": \"錯誤\",\n \"unknown\": \"未知\",\n \"enterValidValue\": \"請輸入有效的內容\",\n \"clear\": \"清除\",\n \"toggleTheme\": \"切換主題\",\n \"format\": \"格式化\",\n \"formatSuccess\": \"格式化成功\",\n \"formatError\": \"格式化失敗:{{error}}\",\n \"copy\": \"複製\",\n \"view\": \"檢視\",\n \"back\": \"返回\",\n \"refresh\": \"重新整理\",\n \"refreshing\": \"重新整理中...\",\n \"import\": \"匯入\",\n \"all\": \"全部\",\n \"search\": \"搜尋\",\n \"reset\": \"重設\",\n \"actions\": \"操作\",\n \"deleting\": \"刪除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"已啟用\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"歡迎使用 OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar 可以協助您在 Claude Code / Codex / Gemini CLI 的多個供應商之間一鍵切換。如果您之前已經設定過這些工具,OpenSunstar 會自動將現有設定儲存為名為 default 的供應商,確保您的設定不會遺失。\",\n \"bodyOfficial\": \"清單中還預設了「官方 (Official)」供應商,隨時點擊即可切換回官方預設設定。切換前 OpenSunstar 會自動將目前設定備份回 default,可以放心來回切換。這就是 OpenSunstar 的運作方式。\",\n \"confirm\": \"我了解了\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"請輸入 API Key\",\n \"show\": \"顯示 API Key\",\n \"hide\": \"隱藏 API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定必須是 JSON 物件,不能是陣列或其他類型\",\n \"invalidJson\": \"JSON 格式錯誤\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"什麼是通用設定片段?\",\n \"guidePurpose\": \"用來在不同供應商之間共用外掛程式、環境變數等非敏感設定。切換供應商時不會遺失這些設定。\",\n \"guideUsage\": \"用法:① 點擊「從編輯內容擷取」儲存通用部分 ② 新增供應商時勾選「寫入通用設定」\",\n \"guideReExtract\": \"如果您新安裝了外掛程式或 Hook,請重新擷取一次通用設定,以便同步至其他供應商。\",\n \"guideReassurance\": \"請放心:您的原始設定已儲存在預設供應商中,不會遺失。\",\n \"emptyTitle\": \"尚未建立通用設定片段\",\n \"emptyHint\": \"點擊下方「從編輯內容擷取」按鈕,從目前設定中擷取可重複使用的部分\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code 設定 (JSON) *\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯通用設定片段\",\n \"commonConfigHint\": \"該片段會在勾選「寫入通用設定」時合併到 settings.json 中\",\n \"fullSettingsHint\": \"完整的 Claude Code settings.json 設定內容\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"hideAttribution\": \"隱藏 AI 署名\",\n \"enableTeammates\": \"Teammates 模式\",\n \"enableToolSearch\": \"啟用 Tool Search\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"停用自動升級\"\n },\n \"header\": {\n \"viewOnGithub\": \"在 GitHub 上檢視\",\n \"toggleDarkMode\": \"切換至深色模式\",\n \"toggleLightMode\": \"切換至淺色模式\",\n \"addProvider\": \"新增供應商\",\n \"switchToChinese\": \"切換至中文\",\n \"switchToEnglish\": \"切換至英文\",\n \"enterEditMode\": \"進入編輯模式\",\n \"exitEditMode\": \"退出編輯模式\",\n \"windowMinimize\": \"最小化視窗\",\n \"windowMaximize\": \"最大化視窗\",\n \"windowRestore\": \"還原視窗\",\n \"windowClose\": \"關閉視窗\"\n },\n \"provider\": {\n \"tabProvider\": \"供應商\",\n \"tabUniversal\": \"通用供應商\",\n \"noProviders\": \"尚未新增任何供應商\",\n \"noProvidersDescription\": \"如果您已有設定,請點擊「匯入目前設定」,所有資料將安全儲存在 default 供應商中\",\n \"noProvidersDescriptionSnippet\": \"除 API Key 和請求位址外的資料(如外掛程式設定)會被儲存至通用設定片段,用於在不同供應商之間共用\",\n \"importCurrent\": \"匯入目前設定\",\n \"importFromClaude\": \"將 Claude Code 中已有的供應商匯入\",\n \"importCurrentDescription\": \"將目前正在使用的設定匯入為預設供應商\",\n \"currentlyUsing\": \"目前使用\",\n \"enable\": \"啟用\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"代理接管模式下無法切換至官方供應商\",\n \"editProvider\": \"編輯供應商\",\n \"editProviderHint\": \"更新設定後將立即套用至目前供應商。\",\n \"deleteProvider\": \"刪除供應商\",\n \"addNewProvider\": \"新增供應商\",\n \"addClaudeProvider\": \"新增 Claude Code 供應商\",\n \"addCodexProvider\": \"新增 Codex 供應商\",\n \"addGeminiProvider\": \"新增 Gemini 供應商\",\n \"addOpenCodeProvider\": \"新增 OpenCode 供應商\",\n \"addToConfig\": \"新增\",\n \"removeFromConfig\": \"移除\",\n \"setAsDefault\": \"設為預設\",\n \"isDefault\": \"目前預設\",\n \"inConfig\": \"已新增\",\n \"addProviderHint\": \"填寫資訊後即可在清單中快速切換供應商。\",\n \"editClaudeProvider\": \"編輯 Claude Code 供應商\",\n \"editCodexProvider\": \"編輯 Codex 供應商\",\n \"configError\": \"設定錯誤\",\n \"notConfigured\": \"未設定官網位址\",\n \"applyToClaudePlugin\": \"套用至 Claude 外掛程式\",\n \"removeFromClaudePlugin\": \"從 Claude 外掛程式移除\",\n \"dragToReorder\": \"拖曳以重新排序\",\n \"dragHandle\": \"拖曳排序\",\n \"searchPlaceholder\": \"依名稱/備註/網址搜尋供應商...\",\n \"searchAriaLabel\": \"搜尋供應商\",\n \"searchScopeHint\": \"根據名稱、備註和官網連結比對結果。\",\n \"searchCloseHint\": \"按 Esc 關閉\",\n \"searchCloseAriaLabel\": \"關閉供應商搜尋\",\n \"noSearchResults\": \"沒有符合搜尋條件的供應商。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"排序更新失敗\",\n \"configureUsage\": \"設定用量查詢\",\n \"officialPartner\": \"官方合作夥伴\",\n \"managedByHermes\": \"Hermes 託管\",\n \"managedByHermesHint\": \"該專案定義於 Hermes 的 providers: dict,請在 Hermes Web UI 中編輯或刪除。\",\n \"openTerminal\": \"開啟終端機\",\n \"terminalOpened\": \"終端機已開啟\",\n \"terminalOpenFailed\": \"開啟終端機失敗\",\n \"name\": \"供應商名稱\",\n \"namePlaceholder\": \"例如:Claude 官方\",\n \"websiteUrl\": \"官網連結\",\n \"notes\": \"備註\",\n \"notesPlaceholder\": \"例如:公司專用帳號\",\n \"configJson\": \"設定 JSON\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfigButton\": \"編輯通用設定\",\n \"configJsonHint\": \"請填寫完整的 Claude Code 設定\",\n \"editCommonConfigTitle\": \"編輯通用設定片段\",\n \"editCommonConfigHint\": \"通用設定片段將合併至所有啟用它的供應商設定中\",\n \"addProvider\": \"新增供應商\",\n \"sortUpdated\": \"排序已更新\",\n \"usageSaved\": \"用量查詢設定已儲存\",\n \"usageSaveFailed\": \"用量查詢設定儲存失敗\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \"使用 .env 格式設定 Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"模型\",\n \"oauthTitle\": \"OAuth 驗證模式\",\n \"oauthHint\": \"Google 官方使用 OAuth 個人驗證,無需填寫 API Key。首次使用時會自動開啟瀏覽器進行登入。\",\n \"apiKeyPlaceholder\": \"請輸入 Gemini API Key\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支援路由\"\n },\n \"codex\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支援路由\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop 官方供應商使用應用程式內建的 1P 登入,無需設定 API Key 和 API 位址。\",\n \"mode\": \"模型處理方式\",\n \"modeDirect\": \"直連\",\n \"modeProxy\": \"需要路由\",\n \"modelMappingToggle\": \"需要模型對應\",\n \"modelMappingOffHint\": \"僅當供應商直接接受 Claude Desktop 可識別的三檔角色 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)時才適用直連;其他模型名(含 claude-3-5-sonnet-… 等舊式 ID)請開啟此開關走對應。\",\n \"modelMappingOnHint\": \"Claude Desktop 只接受 claude-sonnet-* / claude-opus-* / claude-haiku-* 三檔角色 ID。開啟後 OpenSunstar 會把這三檔對應到供應商的實際模型,並在使用期間保持本地路由開啟。\",\n \"routeMapTitle\": \"模型對應\",\n \"routeMapHint\": \"為 Sonnet、Opus、Haiku 三檔分別填寫實際請求模型;選單顯示名稱可寫 DeepSeek、Kimi 等品牌名。留空的檔會自動沿用 Sonnet(或第一個已填檔)的模型,確保子 agent 呼叫的 Haiku 始終可用。\",\n \"routeModelLabel\": \"模型角色\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"選單顯示名稱\",\n \"upstreamModelLabel\": \"實際請求模型\",\n \"supports1mLabel\": \"聲明支援 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"手動指定 Claude Desktop 模型清單(進階,選填)\",\n \"directModelListCollapsedHint\": \"原生 Claude 模型供應商通常不需填寫,Claude Desktop 會自動讀取 /v1/models。\",\n \"directModelListHint\": \"僅當供應商的 /v1/models 不可用或沒有回傳 Claude Desktop 可識別的 Sonnet / Opus / Haiku 模型名稱時填寫;勾選 1M 會向 Claude Desktop 聲明支援 1M 上下文。\",\n \"directModelInvalid\": \"直連模型必須使用 Claude Desktop 可識別的 Sonnet / Opus / Haiku 模型名稱\",\n \"addModel\": \"新增模型\",\n \"addRoute\": \"新增模型\",\n \"routeInvalid\": \"請選擇模型角色並填寫實際請求模型\",\n \"routesRequired\": \"至少填寫一個模型對應\",\n \"statusTitle\": \"Claude Desktop 設定需要檢查\",\n \"statusUnsupported\": \"目前平台暫不支援 Claude Desktop 3P 設定寫入。\",\n \"statusStaleRawModels\": \"Claude Desktop profile 中存在非 Sonnet / Opus / Haiku 角色模型名稱,新版 Claude Desktop 可能拒絕載入;重新切換目前供應商可修復。\",\n \"statusMissingRouteMappings\": \"目前供應商啟用了模型對應,但沒有有效路由;請編輯供應商並補全至少一個模型對應。\",\n \"statusGatewayTokenMissing\": \"目前本地路由 token 尚未產生;重新切換該供應商會寫入新的本地 token。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile 指向的位址與目前供應商不一致;目前為 {{actual}},應為 {{expected}}。重新切換目前供應商可修復。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop 本地路由已開啟 - {{address}}:{{port}}\",\n \"inactive\": \"開啟 Claude Desktop 本地路由,用於需要模型對應或格式轉換的供應商。目前設定位址:{{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"供應商已新增\",\n \"providerSaved\": \"供應商設定已儲存\",\n \"providerDeleted\": \"供應商刪除成功\",\n \"switchSuccess\": \"切換成功!\",\n \"codexRestartRequired\": \"切換成功,請重新啟動客戶端以套用\",\n \"claudeDesktopRestartRequired\": \"切換成功,重新啟動 Claude Desktop 後生效\",\n \"claudeDesktopProxyRestartRequired\": \"切換成功,請保持 OpenSunstar 執行,並重新啟動 Claude Desktop 後生效\",\n \"addToConfigSuccess\": \"已新增至設定\",\n \"removeFromConfigSuccess\": \"已從設定移除\",\n \"switchFailedTitle\": \"切換失敗\",\n \"switchFailed\": \"切換失敗:{{error}}\",\n \"autoImported\": \"已從現有設定建立預設供應商\",\n \"addFailed\": \"新增供應商失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"saveFailedGeneric\": \"儲存失敗,請重試\",\n \"appliedToClaudePlugin\": \"已套用至 Claude 外掛程式\",\n \"removedFromClaudePlugin\": \"已從 Claude 外掛程式移除\",\n \"syncClaudePluginFailed\": \"同步 Claude 外掛程式失敗\",\n \"skipClaudeOnboardingFailed\": \"跳過 Claude Code 初次安裝確認失敗\",\n \"clearClaudeOnboardingSkipFailed\": \"還原 Claude Code 初次安裝確認失敗\",\n \"updateSuccess\": \"供應商更新成功\",\n \"updateFailed\": \"更新供應商失敗:{{error}}\",\n \"deleteSuccess\": \"供應商已刪除\",\n \"deleteFailed\": \"刪除供應商失敗:{{error}}\",\n \"settingsSaved\": \"設定已儲存\",\n \"settingsSaveFailed\": \"儲存設定失敗:{{error}}\",\n \"proxyRequiredForSwitch\": \"此供應商 {{reason}},需要路由服務才能正常使用,請先啟動路由\",\n \"proxyReasonCopilot\": \"使用 GitHub Copilot 作為 Claude 供應商\",\n \"proxyReasonOpenAIChat\": \"使用 OpenAI Chat API 格式\",\n \"proxyReasonOpenAIResponses\": \"使用 OpenAI Responses API 格式\",\n \"proxyReasonFullUrl\": \"開啟了完整 URL 連線模式\",\n \"openAIFormatHint\": \"此供應商使用 OpenAI 相容格式,需要開啟路由服務才能正常使用\",\n \"copilotProxyHint\": \"GitHub Copilot 作為 Claude 供應商時始終需要本地路由;路由會根據目前模型自動選擇 Chat Completions 或 Responses。\",\n \"openLinkFailed\": \"連結開啟失敗\",\n \"openclawModelsRegistered\": \"模型已註冊至 /model 清單\",\n \"openclawDefaultModelSet\": \"已設為預設模型\",\n \"openclawDefaultModelSetFailed\": \"設定預設模型失敗\",\n \"openclawNoModels\": \"該供應商沒有設定模型\",\n \"backfillWarning\": \"切換成功,但舊供應商設定回填失敗,您手動修改的設定可能未儲存\",\n \"windowControlFailed\": \"視窗控制失敗:{{error}}\",\n \"officialBlockedByProxy\": \"本地路由模式下不能切換至官方供應商,使用路由存取官方 API 可能導致帳號被封鎖\",\n \"proxyOfficialWarning\": \"目前供應商 {{name}} 是官方供應商,建議切換至第三方供應商後再使用本地路由\"\n },\n \"confirm\": {\n \"deleteProvider\": \"刪除供應商\",\n \"deleteProviderMessage\": \"確定要刪除供應商「{{name}}」嗎?此操作無法復原。\",\n \"removeProvider\": \"移除供應商\",\n \"removeProviderMessage\": \"確定要從設定中移除供應商「{{name}}」嗎?\\n\\n移除後該供應商將不再生效,但設定資料會保留在 OpenSunstar 中,您可以隨時重新新增。\",\n \"proxy\": {\n \"title\": \"啟用本地路由服務\",\n \"message\": \"本地路由是一項進階功能,啟用前請確保您已了解其運作原理。\\n\\n建議先查閱相關文件或諮詢您的供應商,以取得正確的設定方式。\",\n \"confirm\": \"我已了解,繼續啟用\"\n },\n \"failover\": {\n \"title\": \"啟用故障轉移功能\",\n \"message\": \"故障轉移是一項進階功能,啟用前請確保您已了解其運作原理。\\n\\n建議先在故障轉移佇列中設定好供應商優先順序。\",\n \"confirm\": \"我已了解,繼續啟用\"\n },\n \"usage\": {\n \"title\": \"設定用量查詢\",\n \"message\": \"用量查詢需要設定專用的查詢腳本或 API 參數,請確保您已從供應商處取得相關資訊。\\n\\n如不確定如何設定,請先查閱供應商文件。\",\n \"confirm\": \"我已了解,繼續設定\"\n },\n \"streamCheck\": {\n \"title\": \"模型健康檢測\",\n \"message\": \"健康檢測透過直接發送 API 請求來測試供應商連線能力,以下情況可能導致檢測失敗:\\n\\n• 官方供應商(使用 OAuth 登入,無獨立 API Key)\\n• 部分中繼服務(會驗證請求是否來自 Claude Code CLI)\\n• AWS Bedrock(使用 IAM 簽章驗證)\\n\\n檢測失敗不代表供應商不可用,僅表示無法透過獨立請求驗證。請以應用程式內的實際情況為準。\",\n \"confirm\": \"我已了解,繼續檢測\"\n },\n \"autoSync\": {\n \"title\": \"開啟自動同步\",\n \"message\": \"開啟自動同步後,每次資料庫變更都會自動上傳至 WebDAV 伺服器。\\n\\n這可能會產生較高的網路流量消耗,請確保您的網路環境和 WebDAV 服務支援頻繁的資料傳輸。\",\n \"confirm\": \"我已了解,繼續開啟\"\n },\n \"commonConfig\": {\n \"title\": \"關於通用設定\",\n \"message\": \"「通用設定片段」可以在不同供應商之間共用外掛程式、環境變數等設定,避免切換供應商時遺失這些設定。\\n\\n使用方法:\\n① 編輯供應商時點擊「編輯通用設定」→「從編輯內容擷取」\\n② 新增供應商時勾選「寫入通用設定」(預設已勾選)\\n\\n如果您新安裝了外掛程式或 Hook,請重新擷取一次通用設定。\",\n \"confirm\": \"我了解了\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"通用\",\n \"tabGeneral\": \"通用\",\n \"tabAuth\": \"驗證\",\n \"tabAdvanced\": \"進階\",\n \"tabProxy\": \"路由\",\n \"authCenter\": {\n \"title\": \"驗證中心\",\n \"description\": \"將第三方 Key 與官方訂閱登入拆成兩條驗證軌道,協助你識別每個 CLI 目前依賴的憑據來源。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"本地 CLI 登入狀態\",\n \"readonlyProbe\": \"唯讀探測\",\n \"localCliDescription\": \"區分第三方 Key 與官方訂閱登入,只揭露本地狀態訊號,不接管 Claude 或 Google 帳號憑據。\",\n \"localCliLoading\": \"正在讀取本地 CLI 授權狀態…\",\n \"managedAccountsTitle\": \"託管帳號\",\n \"managedAccountsDescription\": \"由 OpenSunstar 管理的帳號登入,可綁定到對應 Provider 或本地代理鏈路。\",\n \"copilotDescription\": \"管理 GitHub Copilot 帳號\",\n \"codexOauthDescription\": \"管理 ChatGPT 帳號\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定檔目錄\",\n \"description\": \"管理 Claude、Codex 和 Gemini 的設定儲存路徑\"\n },\n \"proxy\": {\n \"title\": \"本地路由\",\n \"description\": \"控制路由服務開關、查看狀態與連接埠資訊\",\n \"enableFeature\": \"在主頁面顯示本地路由開關\",\n \"enableFeatureDescription\": \"開啟後,主頁面頂部將顯示路由和故障轉移開關\",\n \"enableFailoverToggle\": \"在主頁面顯示故障轉移開關\",\n \"enableFailoverToggleDescription\": \"開啟後,主頁面頂部將獨立顯示故障轉移開關\",\n \"running\": \"執行中\",\n \"stopped\": \"已停止\"\n },\n \"modelTest\": {\n \"title\": \"模型測試設定\",\n \"description\": \"設定模型測試使用的預設模型和提示詞\"\n },\n \"failover\": {\n \"title\": \"自動故障轉移\",\n \"description\": \"設定故障轉移佇列和斷路器策略\"\n },\n \"pricing\": {\n \"title\": \"成本定價\",\n \"description\": \"管理各模型 Token 計費規則\"\n },\n \"globalProxy\": {\n \"title\": \"全域出站代理伺服器\",\n \"description\": \"設定 OpenSunstar 存取外部 API 時使用的代理伺服器\"\n },\n \"data\": {\n \"title\": \"資料管理\",\n \"description\": \"匯入和匯出本地設定資料\"\n },\n \"backup\": {\n \"title\": \"備份與還原\",\n \"description\": \"管理自動備份,查看和還原資料庫快照\"\n },\n \"cloudSync\": {\n \"title\": \"雲端同步\",\n \"description\": \"透過 WebDAV 在多裝置間同步資料\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"自動修復 API 請求中的相容性問題\",\n \"enabled\": \"啟用整流器\",\n \"enabledDescription\": \"總開關,關閉後所有整流功能將被停用\",\n \"requestGroup\": \"請求整流\",\n \"responseGroup\": \"回應整流\",\n \"thinkingSignature\": \"Thinking 簽章整流\",\n \"thinkingSignatureDescription\": \"當 Anthropic 類型供應商回傳 thinking 簽章不相容或非法請求等錯誤時,自動移除不相容的 thinking 相關區塊,並對同一供應商重試一次\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"當 Anthropic 類型供應商回傳 budget_tokens 限制錯誤(如至少 1024)時,自動將 thinking 規範為 enabled,並將 budget 設為 32000,同時在需要時將 max_tokens 設為 64000,然後重試一次\",\n \"mediaFallback\": \"不支援圖片降級\",\n \"mediaFallbackDescription\": \"當供應商不支援圖片輸入時(已宣告純文字能力,或上游回傳不支援圖片的錯誤),自動將圖片區塊替換為 [Unsupported Image] 標記,使對話不中斷\",\n \"mediaHeuristic\": \"啟發式純文字模型辨識\",\n \"mediaHeuristicDescription\": \"傳送前依內建模型名稱清單預測性地移除圖片。關閉後僅保留「已宣告純文字」與「上游錯誤兜底」兩條事實驅動路徑,避免內建清單將多模態模型誤判為純文字而靜默丟失圖片\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock 請求最佳化工具\",\n \"description\": \"在請求發送前自動最佳化 Thinking 和 Cache 設定(僅 Bedrock 供應商生效)\",\n \"enabled\": \"啟用最佳化工具\",\n \"thinkingOptimizer\": \"Thinking 最佳化\",\n \"thinkingOptimizerDescription\": \"自動為 Opus/Sonnet 啟用 Adaptive Thinking,為舊模型注入 Extended Thinking\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"自動在請求關鍵位置注入 Cache 斷點,減少重複 token 計費\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分鐘\",\n \"cacheTtl1h\": \"1 小時\"\n },\n \"logConfig\": {\n \"title\": \"日誌管理\",\n \"description\": \"控制日誌輸出層級\",\n \"enabled\": \"啟用日誌\",\n \"enabledDescription\": \"總開關,關閉後所有日誌將被停用\",\n \"level\": \"日誌層級\",\n \"levelDescription\": \"設定輸出的最低日誌層級\",\n \"levels\": {\n \"error\": \"錯誤\",\n \"warn\": \"警告\",\n \"info\": \"資訊\",\n \"debug\": \"偵錯\",\n \"trace\": \"追蹤\"\n },\n \"levelHint\": \"日誌層級說明:\",\n \"levelDesc\": {\n \"error\": \"僅嚴重錯誤\",\n \"warn\": \"錯誤 + 警告資訊\",\n \"info\": \"一般操作資訊(預設)\",\n \"debug\": \"詳細資訊,包含 SSE 串流與請求/回應詳情\",\n \"trace\": \"全部日誌,最詳細\"\n }\n }\n },\n \"language\": \"介面語言\",\n \"languageHint\": \"切換後立即預覽介面語言,儲存後永久生效。\",\n \"theme\": \"外觀主題\",\n \"themeHint\": \"選擇應用程式的外觀主題,立即生效。\",\n \"themeLight\": \"淺色\",\n \"themeDark\": \"深色\",\n \"themeSystem\": \"跟隨系統\",\n \"importExport\": \"SQL 匯入匯出\",\n \"importExportHint\": \"匯入/匯出資料庫 SQL 備份(僅支援匯入由 OpenSunstar 匯出的備份),便於備份或遷移。\",\n \"exportConfig\": \"匯出 SQL 備份\",\n \"selectConfigFile\": \"選擇 SQL 檔案\",\n \"noFileSelected\": \"尚未選擇設定檔。\",\n \"import\": \"匯入\",\n \"importing\": \"匯入中...\",\n \"importSuccess\": \"匯入成功!\",\n \"importFailed\": \"匯入失敗\",\n \"syncLiveFailed\": \"已匯入,但同步至目前供應商失敗,請手動重新選擇一次供應商。\",\n \"importPartialSuccess\": \"設定已匯入,但同步至目前供應商失敗。\",\n \"importPartialHint\": \"請手動重新選擇一次供應商以重新整理對應設定。\",\n \"configExported\": \"設定已匯出至:\",\n \"exportFailed\": \"匯出失敗\",\n \"selectFileFailed\": \"請選擇有效的 SQL 備份檔案\",\n \"configCorrupted\": \"SQL 檔案可能已損壞或格式不正確\",\n \"backupId\": \"備份 ID\",\n \"backupManager\": {\n \"title\": \"資料庫備份\",\n \"description\": \"自動備份的資料庫快照,可用於還原至之前的狀態\",\n \"empty\": \"暫無備份\",\n \"restore\": \"還原\",\n \"restoring\": \"還原中...\",\n \"confirmTitle\": \"確認還原備份\",\n \"confirmMessage\": \"還原至此備份將覆寫目前資料庫。還原前會自動建立安全備份。\",\n \"restoreSuccess\": \"還原成功!安全備份已建立\",\n \"restoreFailed\": \"還原失敗\",\n \"safetyBackupId\": \"安全備份 ID\",\n \"intervalLabel\": \"自動備份間隔\",\n \"retainLabel\": \"備份保留數量\",\n \"intervalDisabled\": \"停用\",\n \"intervalHours\": \"{{hours}} 小時\",\n \"intervalDays\": \"{{days}} 天\",\n \"rename\": \"重新命名\",\n \"renameSuccess\": \"備份重新命名成功\",\n \"renameFailed\": \"重新命名失敗\",\n \"namePlaceholder\": \"輸入新名稱\",\n \"createBackup\": \"立即備份\",\n \"creating\": \"備份中...\",\n \"createSuccess\": \"備份建立成功\",\n \"createFailed\": \"備份建立失敗\",\n \"delete\": \"刪除\",\n \"deleting\": \"刪除中...\",\n \"deleteSuccess\": \"備份已刪除\",\n \"deleteFailed\": \"刪除失敗\",\n \"deleteConfirmTitle\": \"確認刪除備份\",\n \"deleteConfirmMessage\": \"此備份將被永久刪除,此操作無法復原。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV 雲端同步\",\n \"description\": \"透過 WebDAV 在多裝置間同步資料庫和技能設定。\",\n \"baseUrl\": \"WebDAV 伺服器位址\",\n \"baseUrlPlaceholder\": \"https://dav.jianguoyun.com/dav/\",\n \"username\": \"WebDAV 帳號\",\n \"usernamePlaceholder\": \"信箱帳號\",\n \"password\": \"WebDAV 密碼\",\n \"passwordPlaceholder\": \"應用程式密碼(堅果雲請使用「第三方應用程式密碼」)\",\n \"remoteRoot\": \"遠端根目錄\",\n \"profile\": \"同步設定名稱\",\n \"autoSync\": \"自動同步\",\n \"autoSyncHint\": \"開啟後每次資料庫變更都會自動上傳至 WebDAV。\",\n \"test\": \"測試連線\",\n \"testing\": \"測試中...\",\n \"testSuccess\": \"連線成功\",\n \"testFailed\": \"連線失敗:{{error}}\",\n \"save\": \"儲存設定\",\n \"saving\": \"儲存中...\",\n \"saveFailed\": \"儲存設定失敗:{{error}}\",\n \"upload\": \"上傳至雲端\",\n \"uploading\": \"上傳中...\",\n \"uploadSuccess\": \"已上傳至 WebDAV\",\n \"uploadFailed\": \"上傳失敗:{{error}}\",\n \"autoSyncFailedToast\": \"自動同步失敗:{{error}}\",\n \"download\": \"從雲端下載\",\n \"downloading\": \"下載中...\",\n \"downloadSuccess\": \"已從 WebDAV 下載並還原\",\n \"downloadFailed\": \"下載失敗:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次自動同步失敗\",\n \"autoSyncLastErrorHint\": \"請檢查網路或 WebDAV 設定,系統會在後續變更時繼續自動重試。\",\n \"missingUrl\": \"請填寫 WebDAV 伺服器位址\",\n \"presets\": {\n \"label\": \"服務商\",\n \"jianguoyun\": \"堅果雲\",\n \"jianguoyunHint\": \"請在堅果雲「安全選項」中產生「第三方應用程式密碼」,不要使用登入密碼。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"請將 your-server 替換為您的 Nextcloud 伺服器位址,USERNAME 替換為您的使用者名稱。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"請先在 Synology「套件中心」安裝並啟用 WebDAV Server 套件。\",\n \"custom\": \"自訂\"\n },\n \"remoteRootDefault\": \"預設: OpenSunstar-sync\",\n \"profileDefault\": \"預設: default\",\n \"saveAndTestSuccess\": \"設定已儲存,連線正常\",\n \"saveAndTestFailed\": \"設定已儲存,但連線測試失敗:{{error}}\",\n \"noRemoteData\": \"雲端沒有找到同步資料\",\n \"incompatibleVersion\": \"遠端資料版本不相容(協定 v{{protocolVersion}},資料庫 {{dbCompatVersion}}),目前支援協定 v2 / db-v6\",\n \"unsaved\": \"未儲存\",\n \"saved\": \"已儲存\",\n \"unsavedChanges\": \"請先儲存設定\",\n \"saveBeforeSync\": \"請先儲存設定,再使用上傳/下載。\",\n \"fetchingRemote\": \"取得遠端資訊...\",\n \"fetchRemoteFailed\": \"取得遠端資訊失敗,請檢查設定和網路後重試。\",\n \"confirmDownload\": {\n \"title\": \"從雲端還原\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"path\": \"遠端路徑\",\n \"dbCompat\": \"資料庫相容層\",\n \"artifacts\": \"包含內容\",\n \"legacyNotice\": \"檢測到舊版雲端路徑。還原完成後,下次上傳將寫入新路徑 v2/db-v6。\",\n \"warning\": \"還原將覆寫本地所有資料和技能設定\",\n \"confirm\": \"確認還原\"\n },\n \"confirmUpload\": {\n \"title\": \"上傳至雲端\",\n \"content\": \"將同步以下內容至 WebDAV 伺服器:\",\n \"dbItem\": \"資料庫(所有 Provider 設定和資料)\",\n \"skillsItem\": \"技能包(所有自訂技能)\",\n \"targetPath\": \"目標路徑\",\n \"existingData\": \"雲端已有資料\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"path\": \"遠端路徑\",\n \"dbCompat\": \"資料庫相容層\",\n \"warning\": \"將覆寫雲端已有的同步資料\",\n \"legacyNotice\": \"檢測到舊版雲端路徑資料。本次上傳將寫入新路徑 v2/db-v6,不會覆寫舊路徑。\",\n \"confirm\": \"確認上傳\"\n }\n },\n \"syncType\": {\n \"label\": \"同步方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 相容儲存\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"服務商\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"使用 IAM Access Key,需要 s3:PutObject/GetObject/HeadObject 權限。Region 範例:us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"需要自訂 Endpoint,如 http://minio.local:9000。Region 可設為 us-east-1\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com,Region 設為 auto\",\n \"oss\": \"阿里雲 OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com,Region 範例:cn-hangzhou, cn-shanghai\",\n \"cos\": \"騰訊雲 COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com,Region 範例:ap-guangzhou, ap-beijing\",\n \"obs\": \"華為雲 OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com,Region 範例:cn-north-4, cn-east-3\",\n \"custom\": \"S3 相容服務(自訂)\",\n \"customHint\": \"任意 S3 相容服務,需要自訂 Endpoint\"\n },\n \"region\": \"區域 (Region)\",\n \"regionPlaceholder\": \"例如 us-east-1\",\n \"bucket\": \"儲存桶 (Bucket)\",\n \"bucketPlaceholder\": \"例如 my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例如 AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"留空則保持現有金鑰\",\n \"endpoint\": \"Endpoint(AWS 可留空)\",\n \"endpointHint\": \"多數 S3 相容服務需要填寫\",\n \"endpointPlaceholder\": \"例如 https://s3-compatible.example.com\",\n \"remoteRoot\": \"遠端根目錄\",\n \"remoteRootDefault\": \"預設: OpenSunstar-sync\",\n \"profile\": \"同步設定檔名稱\",\n \"profileDefault\": \"預設: default\",\n \"autoSync\": \"自動同步\",\n \"autoSyncHint\": \"開啟後每次資料庫變更都會自動上傳到 S3。\",\n \"enabled\": \"啟用 S3 同步\",\n \"enabledHint\": \"開啟後可使用 S3 上傳/下載和自動同步。\",\n \"mutualExclusionTitle\": \"切換同步方式\",\n \"mutualExclusionMessage\": \"啟用 S3 同步將停用目前的 WebDAV 同步,是否繼續?\",\n \"mutualExclusionMessageReverse\": \"啟用 WebDAV 同步將停用目前的 S3 同步,是否繼續?\",\n \"mutualExclusionFailed\": \"切換同步方式失敗:{{error}}\",\n \"testConnection\": \"測試連線\",\n \"connectionOk\": \"S3 連線成功\",\n \"test\": \"測試連線\",\n \"testing\": \"測試中...\",\n \"testSuccess\": \"S3 連線成功\",\n \"testFailed\": \"S3 連線失敗:{{error}}\",\n \"save\": \"儲存設定\",\n \"saving\": \"儲存中...\",\n \"saveFailed\": \"儲存設定失敗:{{error}}\",\n \"saveAndTestSuccess\": \"設定已儲存,S3 連線正常\",\n \"saveAndTestFailed\": \"設定已儲存,但 S3 連線測試失敗:{{error}}\",\n \"upload\": \"上傳至雲端\",\n \"uploading\": \"上傳中...\",\n \"uploadSuccess\": \"已上傳到 S3\",\n \"uploadFailed\": \"S3 上傳失敗:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同步失敗:{{error}}\",\n \"download\": \"從雲端下載\",\n \"downloading\": \"下載中...\",\n \"downloadSuccess\": \"已從 S3 下載並還原\",\n \"downloadFailed\": \"S3 下載失敗:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次 S3 自動同步失敗\",\n \"autoSyncLastErrorHint\": \"請檢查網路或 S3 設定,系統會在後續變更時繼續自動重試。\",\n \"missingBucket\": \"請填寫 S3 儲存桶\",\n \"noRemoteData\": \"S3 儲存桶中沒有找到同步資料\",\n \"incompatibleVersion\": \"遠端資料版本不相容(版本 {{version}}),目前支援協議 v2 / db-v6\",\n \"unsaved\": \"未儲存\",\n \"saved\": \"已儲存\",\n \"unsavedChanges\": \"請先儲存設定\",\n \"saveBeforeSync\": \"請先儲存設定,再使用上傳/下載。\",\n \"fetchingRemote\": \"取得遠端資訊...\",\n \"fetchRemoteFailed\": \"取得遠端資訊失敗,請檢查設定和網路後重試。\",\n \"notConfigured\": \"未設定 S3 同步\",\n \"disabled\": \"S3 同步未啟用\",\n \"confirmDownload\": {\n \"title\": \"從 S3 還原\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"artifacts\": \"包含內容\",\n \"warning\": \"還原將覆寫本地所有資料和技能設定\",\n \"confirm\": \"確認還原\"\n },\n \"confirmUpload\": {\n \"title\": \"上傳到 S3\",\n \"content\": \"將同步以下內容到 S3 儲存桶:\",\n \"dbItem\": \"資料庫(所有 Provider 設定和資料)\",\n \"skillsItem\": \"技能包(所有自訂技能)\",\n \"targetPath\": \"目標物件路徑\",\n \"existingData\": \"雲端已有資料\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"warning\": \"將覆寫該 S3 路徑下已有的同步資料\",\n \"confirm\": \"確認上傳\"\n }\n },\n \"autoReload\": \"資料已重新整理\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"視窗行為\",\n \"windowBehaviorHint\": \"設定視窗最小化與 Claude 外掛程式連動策略。\",\n \"notificationPreferences\": \"通知偏好\",\n \"budgetAlertNotifications\": \"預算超限系統通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency 等級預算告警時發送系統級通知(warning 仍僅在應用內提示)\",\n \"failoverAlertNotifications\": \"故障轉移系統通知\",\n \"failoverAlertNotificationsDescription\": \"供應商自動故障轉移完成後發送系統級通知\",\n \"trayBadgeNotifications\": \"系統匣紅點提醒\",\n \"trayBadgeNotificationsDescription\": \"有未讀告警時系統匣圖示切換為告警態並在選單頂部顯示告警項目\",\n \"workspaceAlertFirst\": \"工作區告警首螢幕\",\n \"workspaceAlertFirstDescription\": \"開啟後「今日工作台」首屏顯示告警卡片;關閉時告警僅透過系統匣/系統通知觸達,保持既有使用習慣\",\n \"launchOnStartup\": \"開機自動啟動\",\n \"launchOnStartupDescription\": \"隨系統啟動自動執行 OpenSunstar\",\n \"silentStartup\": \"靜默啟動\",\n \"silentStartupDescription\": \"程式啟動時不顯示主視窗,僅在系統匣執行\",\n \"autoLaunchFailed\": \"設定開機自動啟動失敗\",\n \"minimizeToTray\": \"關閉時最小化至系統匣\",\n \"minimizeToTrayDescription\": \"勾選後點擊關閉按鈕會隱藏至系統匣,取消則直接退出應用程式。\",\n \"useAppWindowControls\": \"啟用應用程式等級視窗按鈕\",\n \"useAppWindowControlsDescription\": \"開啟後使用應用程式自建的最小化、最大化/還原、關閉按鈕;關閉後沿用系統視窗模式。\",\n \"enableClaudePluginIntegration\": \"套用至 Claude Code 外掛程式\",\n \"enableClaudePluginIntegrationDescription\": \"開啟後 VS Code Claude Code 外掛程式的供應商將隨本軟體切換\",\n \"skipClaudeOnboarding\": \"跳過 Claude Code 初次安裝確認\",\n \"skipClaudeOnboardingDescription\": \"開啟後跳過 Claude Code 初次安裝確認\",\n \"codexAuth\": \"Codex 應用增強\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 官方登入保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"始終開啟:供應商切換和本機代理不會覆寫或儲存 Codex 官方登入憑據\",\n \"appVisibility\": {\n \"title\": \"主頁面顯示\",\n \"description\": \"選擇在主頁面顯示的應用程式\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skills 儲存位置\",\n \"description\": \"選擇 OpenSunstar 存放 Skills 主副本的目錄\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"技能儲存在 ~/.OpenSunstar/skills/,由 OpenSunstar 統一管理並同步至各應用程式。\",\n \"unifiedHint\": \"技能儲存在 ~/.agents/skills/,遵循 Agent Skills 開放標準。相容的工具(Claude Code、Codex、Gemini CLI 等)可直接發現此目錄中的技能。\",\n \"confirmTitle\": \"遷移技能儲存位置\",\n \"confirmMessage\": \"將移動 {{count}} 個技能至新位置,是否繼續?\",\n \"migrationSuccess\": \"已成功遷移 {{count}} 個技能\",\n \"migrationPartial\": \"遷移了 {{migrated}} 個技能,{{errors}} 個失敗,請查看日誌\"\n },\n \"skillSync\": {\n \"title\": \"Skills 同步方式\",\n \"description\": \"選擇 Skills 的檔案同步策略\",\n \"symlink\": \"軟連結\",\n \"copy\": \"檔案複製\",\n \"symlinkHint\": \"軟連結節省磁碟空間並支援即時同步。注意:Windows 可能需要管理員權限或開啟開發者模式\"\n },\n \"terminal\": {\n \"title\": \"首選終端機\",\n \"description\": \"選擇點擊終端機按鈕時使用的終端機應用程式\",\n \"fallbackHint\": \"如果選擇的終端機不可用,將自動使用系統預設終端機\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"命令提示字元\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定目錄覆寫(進階)\",\n \"configDirectoryDescription\": \"在 WSL 等環境使用 Claude Code 或 Codex 的時候,可手動指定為 WSL 裡的設定目錄,供應商資料與主環境保持一致。\",\n \"appConfigDir\": \"OpenSunstar 設定目錄\",\n \"appConfigDirDescription\": \"自訂 OpenSunstar 的設定儲存位置(指定至雲端同步資料夾即可雲端同步設定)\",\n \"browsePlaceholderApp\": \"例如:C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定目錄\",\n \"claudeConfigDirDescription\": \"覆寫 Claude 設定目錄 (settings.json),同時會在同級存放 Claude MCP 的 claude.json。\",\n \"codexConfigDir\": \"Codex 設定目錄\",\n \"codexConfigDirDescription\": \"覆寫 Codex 設定目錄。\",\n \"geminiConfigDir\": \"Gemini 設定目錄\",\n \"geminiConfigDirDescription\": \"覆寫 Gemini 設定目錄 (.env)。\",\n \"opencodeConfigDir\": \"OpenCode 設定目錄\",\n \"opencodeConfigDirDescription\": \"覆寫 OpenCode 設定目錄 (opencode.json)。\",\n \"openclawConfigDir\": \"OpenClaw 設定目錄\",\n \"openclawConfigDirDescription\": \"覆寫 OpenClaw 設定目錄 (openclaw.json)。\",\n \"hermesConfigDir\": \"Hermes 設定目錄\",\n \"hermesConfigDirDescription\": \"覆寫 Hermes 設定目錄 (config.yaml)。\",\n \"browsePlaceholderClaude\": \"例如:/home/<您的帳號>/.claude\",\n \"browsePlaceholderCodex\": \"例如:/home/<您的帳號>/.codex\",\n \"browsePlaceholderGemini\": \"例如:/home/<您的帳號>/.gemini\",\n \"browsePlaceholderOpencode\": \"例如:/home/<您的帳號>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例如:/home/<您的帳號>/.openclaw\",\n \"browsePlaceholderHermes\": \"例如:/home/<您的帳號>/.hermes\",\n \"browseDirectory\": \"瀏覽目錄\",\n \"resetDefault\": \"還原預設目錄(需儲存後生效)\",\n \"checkForUpdates\": \"檢查更新\",\n \"updateTo\": \"更新至 v{{version}}\",\n \"updating\": \"更新中...\",\n \"checking\": \"檢查中...\",\n \"upToDate\": \"已是最新\",\n \"aboutHint\": \"檢視版本資訊與更新狀態。\",\n \"portableMode\": \"目前為可攜版,更新需手動下載。\",\n \"updateAvailable\": \"檢測到新版本:{{version}}\",\n \"updateBadge\": \"有更新可用\",\n \"updateFailed\": \"更新安裝失敗,已嘗試開啟下載頁面。\",\n \"checkUpdateFailed\": \"檢查更新失敗,請稍後重試。\",\n \"openReleaseNotesFailed\": \"開啟更新日誌失敗\",\n \"releaseNotes\": \"更新日誌\",\n \"viewReleaseNotes\": \"檢視該版本更新日誌\",\n \"viewCurrentReleaseNotes\": \"檢視目前版本更新日誌\",\n \"officialWebsite\": \"官方網站\",\n \"github\": \"GitHub\",\n \"oneClickInstall\": \"一鍵安裝\",\n \"oneClickInstallHint\": \"安裝 Claude Code / Codex / Gemini CLI / OpenCode\",\n \"localEnvCheck\": \"本地環境檢查\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"標誌\",\n \"installCommandsCopied\": \"安裝命令已複製\",\n \"installCommandsCopyFailed\": \"複製失敗,請手動複製。\",\n \"importFailedError\": \"匯入設定失敗:{{message}}\",\n \"exportFailedError\": \"匯出設定失敗:\",\n \"restartRequired\": \"需要重新啟動應用程式\",\n \"restartRequiredMessage\": \"修改 OpenSunstar 設定目錄後需要重新啟動應用程式才能生效,是否立即重新啟動?\",\n \"restartNow\": \"立即重新啟動\",\n \"restartLater\": \"稍後重新啟動\",\n \"restartFailed\": \"應用程式重新啟動失敗,請手動關閉後重新開啟。\",\n \"devModeRestartHint\": \"開發模式下不支援自動重新啟動,請手動重新啟動應用程式。\",\n \"saving\": \"正在儲存...\",\n \"globalProxy\": {\n \"label\": \"全域代理伺服器\",\n \"hint\": \"代理所有請求(API、Skills 下載等)。開啟本地路由時,應用程式的請求也會經過此代理伺服器。留空表示直連。\",\n \"username\": \"使用者名稱(選填)\",\n \"password\": \"密碼(選填)\",\n \"test\": \"測試連線\",\n \"scan\": \"掃描本地代理伺服器\",\n \"clear\": \"清除\",\n \"scanFailed\": \"掃描失敗:{{error}}\",\n \"saved\": \"代理伺服器設定已儲存\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"testSuccess\": \"連線成功!延遲 {{latency}}ms\",\n \"testFailed\": \"連線失敗:{{error}}\",\n \"pricingDefaultsTitle\": \"計費預設設定\",\n \"pricingDefaultsDescription\": \"設定各應用程式的預設倍率與計費模式來源。\",\n \"pricingAppLabel\": \"應用程式\",\n \"defaultCostMultiplierLabel\": \"預設倍率\",\n \"defaultCostMultiplierHint\": \"用於成本計算的倍率,支援小數。\",\n \"pricingModelSourceLabel\": \"計費模式\",\n \"pricingModelSourceRequest\": \"請求模型\",\n \"pricingModelSourceResponse\": \"回傳模型\",\n \"pricingSave\": \"儲存計費設定\",\n \"pricingSaved\": \"計費設定已儲存\",\n \"pricingSaveFailed\": \"儲存計費設定失敗:{{error}}\",\n \"pricingLoadFailed\": \"載入計費設定失敗:{{error}}\",\n \"defaultCostMultiplierRequired\": \"預設倍率不能為空\",\n \"defaultCostMultiplierInvalid\": \"預設倍率格式不正確\"\n },\n \"saveFailedGeneric\": \"儲存失敗,請重試\",\n \"manualInstallCommands\": \"手動安裝命令\",\n \"updateAllTools\": \"全部升級({{count}})\",\n \"currentVersion\": \"當前版本\",\n \"latestVersion\": \"最新版本\",\n \"updateAvailableShort\": \"可升級\",\n \"toolInstall\": \"安裝\",\n \"toolUpdate\": \"升級\",\n \"toolReady\": \"已就緒\",\n \"toolActionDone\": \"{{count}} 個工具{{action}}完成\",\n \"toolActionPartial\": \"{{succeeded}} 個{{action}}成功,{{failed}} 個失敗\",\n \"toolActionFailed\": \"安裝/升級命令執行失敗\",\n \"toolNotRunnable\": \"已安裝但無法運行(未探測到版本)\",\n \"toolActionVersionUnchangedTitle\": \"版本沒有變化\",\n \"toolActionVersionUnchanged\": \"仍是 {{version}}(最新:{{latest}})。上游升級器可能報告成功但沒有實際更新。\",\n \"toolActionInstalledNotRunnable\": \"已安裝,但當前環境無法運行,請檢查\",\n \"installedNotRunnable\": \"已安裝·無法運行\",\n \"toolCheckEnv\": \"請檢查運行環境\",\n \"toolDiagnose\": \"診斷安裝衝突\",\n \"toolDiagnosing\": \"診斷中…\",\n \"toolConflictTitle\": \"檢測到多處安裝\",\n \"toolConflictHint\": \"命令行實際使用標「默認」的那處;升級可能寫到了別處。\",\n \"toolConflictDefault\": \"默認\",\n \"toolConflictNotRunnable\": \"無法運行\",\n \"toolDiagnoseNoConflict\": \"未發現安裝衝突\",\n \"toolDiagnoseFailed\": \"診斷失敗\",\n \"toolUpgradeConfirmTitle\": \"確認升級位置\",\n \"toolUpgradeConfirmHint\": \"檢測到多處安裝。本次升級不會全部更新,具體作用的位置以下方各項為準。\",\n \"toolUpgradeWillRun\": \"將執行:\",\n \"toolUpgradeConfirmBtn\": \"確認升級\",\n \"toolUpgradeUnanchoredHint\": \"無法確定命令行實際使用哪處,將執行默認升級命令(可能裝到 PATH 上第一個 npm)。\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"工作階段管理\",\n \"subtitle\": \"管理 Claude Code、Codex、OpenCode、OpenClaw、Hermes 與 Gemini CLI 工作階段紀錄\",\n \"searchPlaceholder\": \"搜尋對話內容、目錄或 ID\",\n \"searchSessions\": \"搜尋工作階段\",\n \"providerFilterAll\": \"全部\",\n \"sessionList\": \"工作階段清單\",\n \"manageBatchTooltip\": \"進入批次管理\",\n \"exitBatchModeTooltip\": \"退出批次管理\",\n \"batchModeHint\": \"勾選要刪除的工作階段\",\n \"selectForBatch\": \"選擇工作階段\",\n \"selectedCount\": \"已選 {{count}} 項\",\n \"selectAllFiltered\": \"全選目前\",\n \"clearFilteredSelection\": \"取消全選\",\n \"clearSelection\": \"清空已選\",\n \"deleteSelected\": \"批次刪除\",\n \"batchDeleting\": \"批次刪除中...\",\n \"loadingSessions\": \"載入工作階段中...\",\n \"noSessions\": \"未發現工作階段\",\n \"selectSession\": \"請選擇工作階段檢視詳情\",\n \"noSummary\": \"暫無摘要\",\n \"lastActive\": \"最近活躍\",\n \"projectDir\": \"專案目錄\",\n \"sourcePath\": \"原始檔案\",\n \"copyResumeCommand\": \"複製繼續命令\",\n \"resumeCommandCopied\": \"已複製繼續命令\",\n \"openInTerminal\": \"在終端機繼續\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"僅複製\",\n \"terminalLaunched\": \"終端機已啟動\",\n \"openFailed\": \"開啟終端機失敗\",\n \"resumeFallbackCopied\": \"已複製繼續命令,可手動貼上至終端機\",\n \"copyProjectDir\": \"複製目錄\",\n \"projectDirCopied\": \"目錄已複製\",\n \"copySourcePath\": \"複製原始檔案\",\n \"sourcePathCopied\": \"原始檔案已複製\",\n \"delete\": \"刪除工作階段\",\n \"deleting\": \"刪除中...\",\n \"deleteTooltip\": \"永久刪除此本地工作階段紀錄\",\n \"deleteConfirmTitle\": \"刪除工作階段\",\n \"deleteConfirmMessage\": \"將永久刪除本地工作階段「{{title}}」\\nSession ID: {{sessionId}}\\n\\n此操作不可復原。\",\n \"deleteConfirmAction\": \"刪除工作階段\",\n \"sessionDeleted\": \"工作階段已刪除\",\n \"deleteFailed\": \"刪除工作階段失敗:{{error}}\",\n \"batchDeleteConfirmTitle\": \"批次刪除工作階段\",\n \"batchDeleteConfirmMessage\": \"將永久刪除已選取的 {{count}} 個本地工作階段紀錄。\\n\\n此操作不可復原。\",\n \"batchDeleteConfirmAction\": \"刪除所選工作階段\",\n \"batchDeleteSuccess\": \"已刪除 {{count}} 個工作階段\",\n \"batchDeleteFailed\": \"{{failed}} 個工作階段刪除失敗\",\n \"batchDeleteRequestFailed\": \"批次刪除失敗,請稍後重試\",\n \"loadingMessages\": \"載入對話內容中...\",\n \"emptySession\": \"該工作階段暫無可展示內容\",\n \"clickToCopyPath\": \"點擊複製路徑\",\n \"tocTitle\": \"對話目錄\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}} 分鐘前\",\n \"hoursAgo\": \"{{count}} 小時前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"roleUser\": \"使用者\",\n \"roleSystem\": \"系統\",\n \"roleTool\": \"工具\",\n \"resume\": \"繼續工作階段\",\n \"resumeTooltip\": \"在終端機中繼續此工作階段\",\n \"noResumeCommand\": \"此工作階段無法繼續\",\n \"copyCommand\": \"複製命令\",\n \"copyMessage\": \"複製訊息\",\n \"messageCopied\": \"已複製訊息內容\",\n \"conversationHistory\": \"對話紀錄\",\n \"expandContent\": \"展開完整內容\",\n \"collapseContent\": \"收起\",\n \"exportSelected\": \"批量導出\",\n \"batchExporting\": \"導出中...\",\n \"batchExportSuccess\": \"已導出 {{count}} 個會話\",\n \"batchExportFailed\": \"批量導出失敗,請稍後重試\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"收到供應商切換事件:\",\n \"setupListenerFailed\": \"設定供應商切換監聽器失敗:\",\n \"updateProviderFailed\": \"更新供應商失敗:\",\n \"autoImportFailed\": \"自動匯入預設設定失敗:\",\n \"openLinkFailed\": \"開啟連結失敗:\",\n \"getVersionFailed\": \"取得版本資訊失敗:\",\n \"loadSettingsFailed\": \"載入設定失敗:\",\n \"getConfigPathFailed\": \"取得設定路徑失敗:\",\n \"getConfigDirFailed\": \"取得設定目錄失敗:\",\n \"detectPortableFailed\": \"檢測可攜模式失敗:\",\n \"saveSettingsFailed\": \"儲存設定失敗:\",\n \"updateFailed\": \"更新失敗:\",\n \"checkUpdateFailed\": \"檢查更新失敗:\",\n \"openConfigFolderFailed\": \"開啟設定資料夾失敗:\",\n \"selectConfigDirFailed\": \"選擇設定目錄失敗:\",\n \"getDefaultConfigDirFailed\": \"取得預設設定目錄失敗:\",\n \"openReleaseNotesFailed\": \"開啟更新日誌失敗:\"\n },\n \"providerForm\": {\n \"supplierName\": \"供應商名稱\",\n \"supplierNameRequired\": \"供應商名稱 *\",\n \"supplierNamePlaceholder\": \"例如:Anthropic 官方\",\n \"websiteUrl\": \"官網位址\",\n \"websiteUrlPlaceholder\": \"https://example.com(選填)\",\n \"apiEndpoint\": \"請求位址\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理與測速\",\n \"configContent\": \"設定內容\",\n \"officialNoApiKey\": \"官方登入無需填寫 API Key,直接儲存即可\",\n \"codexOfficialNoApiKey\": \"官方無需填寫 API Key,直接儲存即可\",\n \"codexApiKeyAutoFill\": \"只需要填這裡,下方 auth.json 會自動填寫\",\n \"apiKeyAutoFill\": \"只需要填這裡,下方設定會自動填寫\",\n \"cnOfficialApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"aggregatorApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"thirdPartyApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"customApiKeyHint\": \"自訂設定需手動填寫所有必要欄位\",\n \"omoHint\": \"OMO 設定管理 Agent 模型指派,相容 oh-my-openagent.jsonc / oh-my-opencode.jsonc\",\n \"officialHint\": \"官方供應商使用瀏覽器登入,無需設定 API Key\",\n \"getApiKey\": \"取得 API Key\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊並在儲值時填寫「OpenSunstar」優惠碼,可以享受 9 折優惠\",\n \"apikeyfun\": \"APIKEY.FUN 為 OpenSunstar 的使用者提供了特別優惠,透過專屬連結註冊,可享受最高儲值永久 95 折優惠。\",\n \"apinebula\": \"APINEBULA 為 OpenSunstar 使用者提供特別優惠:使用專屬連結註冊並在儲值時填寫「OpenSunstar」優惠碼,可享 9 折優惠。\",\n \"atlascloud\": \"Atlas Cloud 是一個全模態 AI 推理平台,透過單一 API 為開發者提供影片生成、圖像生成及 LLM 接入。立即查看全新「編程計畫」優惠,取得更具性價比的 API 接入。\",\n \"sudocode\": \"SudoCode 是全球一流 AI 模型聚合服務,一個 API Key 可通用多模型,並支援 Claude Code、Codex、Gemini CLI、OpenClaw 等工具接入。\",\n \"patewayai\": \"PatewayAI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊可以獲得 3 美元額度。\",\n \"claudeapi\": \"ClaudeAPI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊可以領取測試額度。\",\n \"claudecn\": \"ClaudeCN 是一家實體企業營運的企業級 AI 中繼平台,支援企業採購流程,可對公打款、簽約,服務合規有保障。\",\n \"runapi\": \"RunAPI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊並聯繫客服可領取 ¥14 免費額度。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特惠,Starter 方案 9.9 元起\",\n \"minimax_en\": \"MiniMax Coding Plan 黑五特惠,Starter 方案現僅 $2 / 月(2 折優惠!)\",\n \"dmxapi\": \"Claude Code 專屬模型 3.4 折優惠進行中!\",\n \"cubence\": \"Cubence 是 OpenSunstar 的官方合作夥伴,使用此連結註冊並在儲值時填寫「OPENSUNSTAR」優惠碼,每次儲值均可享受 9 折優惠\",\n \"aigocode\": \"AIGoCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊首次儲值時可以獲得 10% 額度獎勵!\",\n \"rightcode\": \"RightCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊每次儲值均可贈送 5% 額外額度!\",\n \"aicodemirror\": \"AICodeMirror 是 OpenSunstar 的官方合作夥伴,使用此連結註冊可享受 8 折優惠!\",\n \"aicoding\": \"AI Coding 為 OpenSunstar 的使用者提供了特殊優惠,首次儲值可以享受 9 折優惠!\",\n \"crazyrouter\": \"CrazyRouter 為 OpenSunstar 的使用者提供了特殊優惠,首次儲值贈送 30% 額外額度!\",\n \"sssaicode\": \"SSAI Code 為 OpenSunstar 的使用者提供了特殊優惠,每次儲值贈送額外 $10 額度!\",\n \"siliconflow\": \"矽基流動是 OpenSunstar 的官方合作夥伴\",\n \"ucloud\": \"優雲智算為 OpenSunstar 的使用者提供了特殊優惠,透過此連結註冊,可以獲得 5 元平台體驗金!\",\n \"micu\": \"Micu 是 OpenSunstar 的官方合作夥伴\",\n \"ctok\": \"官網加入 CTok 社群,訂閱方案。\",\n \"shengsuanyun\": \"勝算雲為 OpenSunstar 的使用者提供了特別福利,使用此連結註冊的新使用者可獲 10 元模力及首儲 10% 贈送!\",\n \"lemondata\": \"Lemon Code 為 OpenSunstar 的使用者提供了特別優惠。使用此連結註冊可以獲得 1 美元免費額度。\",\n \"doubaoseed\": \"豆包大模型為 OpenSunstar 的使用者提供了專屬福利:透過此連結註冊即可取得豆包全系列文本模型 50 萬 tokens 推理額度以及 Seedance 2.0 的 500 萬 tokens 免費額度\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan 為 OpenSunstar 的使用者提供了專屬福利:透過此連結訂閱方舟 AgentPlan,新客戶首月 40 元起。\",\n \"byteplus\": \"透過此連結註冊即可取得每個模型 50 萬 tokens 的免費推理額度。\",\n \"ccsub\": \"CCSub 是穩定、實惠的 AI API 中轉平台,Claude Code 官方訂閱的超強平替,一個 Key 覆蓋全部模型,價格約為官方 1/3。\",\n \"unity2\": \"Unity2.ai 為 OpenSunstar 使用者提供專屬福利:透過此連結註冊可領取 $2 餘額,加入官方群再送 $10,最高可領 $12 免費額度!\"\n },\n \"presets\": {\n \"ucloud\": \"優雲智算\",\n \"ucloudCoding\": \"優雲智算 Coding Plan\",\n \"shengsuanyun\": \"勝算雲\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"參數設定 - {{name}} *\",\n \"mainModel\": \"主模型 (選填)\",\n \"mainModelPlaceholder\": \"例如: GLM-4.6\",\n \"fastModel\": \"快速模型 (選填)\",\n \"fastModelPlaceholder\": \"例如: GLM-4.5-Air\",\n \"modelHint\": \"留空將使用供應商的預設模型\",\n \"apiHint\": \"填寫相容 Claude API 的伺服器端點位址,請勿以斜線結尾\",\n \"apiHintOAI\": \"填寫相容 OpenAI Chat Completions 的伺服器端點位址,請勿以斜線結尾\",\n \"apiHintGeminiNative\": \"建議填寫 Gemini Native 的 base URL,例如 https://generativelanguage.googleapis.com 或 https://generativelanguage.googleapis.com/v1beta;代理伺服器會自動補齊 models/*:generateContent\",\n \"codexApiHint\": \"填寫相容 OpenAI Response 格式的伺服器端點位址\",\n \"fillSupplierName\": \"請填寫供應商名稱\",\n \"fillConfigContent\": \"請填寫設定內容\",\n \"fillParameter\": \"請填寫 {{label}}\",\n \"fillTemplateValue\": \"請填寫 {{label}}\",\n \"endpointRequired\": \"非官方供應商請填寫 API 端點\",\n \"apiKeyRequired\": \"非官方供應商請填寫 API Key\",\n \"softValidation\": {\n \"title\": \"設定存在以下問題\",\n \"hint\": \"仍要儲存嗎?儲存後切換此供應商時可能失敗,可以之後再補全。\",\n \"saveAnyway\": \"仍要儲存\"\n },\n \"configJsonError\": \"設定 JSON 格式錯誤,請檢查語法\",\n \"authJsonRequired\": \"auth.json 必須是 JSON 物件\",\n \"authJsonError\": \"auth.json 格式錯誤,請檢查 JSON 語法\",\n \"fillAuthJson\": \"請填寫 auth.json 設定\",\n \"fillApiKey\": \"請填寫 OPENAI_API_KEY\",\n \"visitWebsite\": \"造訪 {{url}}\",\n \"anthropicModel\": \"主模型\",\n \"anthropicSmallFastModel\": \"快速模型\",\n \"apiFormat\": \"API 格式\",\n \"apiFormatHint\": \"選擇供應商 API 的輸入格式\",\n \"customUserAgent\": \"自訂 User-Agent\",\n \"customUserAgentHint\": \"僅在開啟本地路由/代理接管後生效,會取代轉發至供應商 API 請求中的 User-Agent。\",\n \"customUserAgentInvalid\": \"User-Agent 不能包含控制字元(如換行字元),否則將被忽略。\",\n \"customUserAgentPresets\": \"預設\",\n \"fullUrlLabel\": \"完整 URL\",\n \"fullUrlEnabled\": \"完整 URL 模式\",\n \"fullUrlDisabled\": \"標記為完整 URL\",\n \"fullUrlHint\": \"請填寫完整請求 URL,並且必須開啟路由後使用;路由將直接使用此 URL,不拼接路徑\",\n \"fullUrlHintGeminiNative\": \"Gemini Native 下,完整 URL 模式同時相容兩類位址:1. 官方/標準 Gemini URL,代理伺服器會依模型和串流參數自動標準化;2. 自訂 relay 的完整 URL,代理伺服器會盡量原樣使用,只補齊查詢參數,不再強制附加 models 路徑\",\n \"apiFormatAnthropic\": \"Anthropic Messages (原生)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (需開啟路由)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (需開啟路由)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (需開啟路由)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (原生)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (需開啟路由)\",\n \"codexApiFormatHint\": \"選擇供應商真實支援的 Codex API 格式;設定仍保持 Responses 以相容新版 Codex,Chat Completions 會透過本地路由自動轉換。\",\n \"authField\": \"驗證欄位\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(預設)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"選擇寫入設定的驗證環境變數名稱\",\n \"apiHintResponses\": \"填寫相容 OpenAI Responses API 的伺服器端點位址,請勿以斜線結尾\",\n \"anthropicDefaultHaikuModel\": \"Haiku 預設模型\",\n \"anthropicDefaultSonnetModel\": \"Sonnet 預設模型\",\n \"anthropicDefaultOpusModel\": \"Opus 預設模型\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"選填:指定預設使用的 Claude 模型,留空則使用系統預設。\",\n \"modelMappingLabel\": \"模型對應\",\n \"modelMappingHint\": \"顯示名稱只影響 /model 選單;1M 只是提供給 Claude Code 的上下文能力聲明。\",\n \"modelRoleLabel\": \"模型角色\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"顯示名稱\",\n \"modelDisplayNamePlaceholder\": \"例如 DeepSeek V4 Pro\",\n \"requestModelLabel\": \"實際請求模型\",\n \"modelOneMHeader\": \"聲明支援 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"備用模型\",\n \"fallbackModelHint\": \"僅在 Claude Code 請求沒有明確落到 Sonnet、Opus 或 Haiku 角色時使用;通常可以留空。\",\n \"quickSetModels\": \"一鍵設定\",\n \"quickSetSuccess\": \"已將模型名稱套用至所有角色\",\n \"advancedOptionsToggle\": \"進階選項\",\n \"advancedOptionsHint\": \"包含 API 格式、驗證欄位、模型對應等設定。大多數場景下保持預設即可。\",\n \"categoryOfficial\": \"官方\",\n \"categoryCnOfficial\": \"開源官方\",\n \"categoryAggregation\": \"聚合服務\",\n \"categoryThirdParty\": \"第三方\",\n \"fetchModels\": \"取得模型清單\",\n \"fetchingModels\": \"正在取得...\",\n \"fetchModelsSuccess\": \"取得 {{count}} 個模型\",\n \"fetchModelsFailed\": \"取得模型清單失敗\",\n \"fetchModelsEmpty\": \"未找到可用模型\",\n \"fetchModelsNeedApiKey\": \"請先填寫 API Key\",\n \"fetchModelsNeedEndpoint\": \"請先填寫 API 端點\",\n \"fetchModelsNeedConfig\": \"請先填寫 API 端點和 API Key\",\n \"fetchModelsAuthFailed\": \"API Key 無效或無權限\",\n \"fetchModelsNotSupported\": \"該供應商不支援取得模型清單\",\n \"fetchModelsEndpointNotFound\": \"未找到可用的模型清單端點,請檢查 Base URL 或確認供應商是否開放該 API\",\n \"fetchModelsTimeout\": \"請求逾時,請檢查網路連線\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 驗證\",\n \"authStatus\": \"驗證狀態\",\n \"authenticated\": \"已驗證: {{username}}\",\n \"notAuthenticated\": \"未驗證\",\n \"loginWithGitHub\": \"使用 GitHub 登入\",\n \"loginRequired\": \"請先登入 GitHub Copilot\",\n \"waitingForAuth\": \"等待授權中...\",\n \"enterCode\": \"請在瀏覽器中輸入驗證碼:\",\n \"logout\": \"登出\",\n \"authSuccess\": \"GitHub Copilot 驗證成功\",\n \"authFailed\": \"驗證失敗:{{error}}\",\n \"authTimeout\": \"驗證逾時,請重試\",\n \"tokenExpired\": \"Token 已過期,請重新驗證\",\n \"accountCount\": \"{{count}} 個帳號\",\n \"selectAccount\": \"選擇帳號\",\n \"selectAccountPlaceholder\": \"選擇一個 GitHub 帳號\",\n \"useDefaultAccount\": \"使用預設帳號\",\n \"loggedInAccounts\": \"已登入帳號\",\n \"defaultAccount\": \"預設\",\n \"selected\": \"已選取\",\n \"removeAccount\": \"移除帳號\",\n \"setAsDefault\": \"設為預設\",\n \"addAnotherAccount\": \"新增其他帳號\",\n \"logoutAll\": \"登出所有帳號\",\n \"retry\": \"重試\",\n \"copyCode\": \"複製程式碼\",\n \"migrationFailed\": \"舊驗證資料遷移失敗:{{error}}\",\n \"loadModelsFailed\": \"載入 Copilot 模型清單失敗\",\n \"deploymentType\": \"GitHub 部署類型\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例如:company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"驗證狀態\",\n \"notAuthenticated\": \"未驗證\",\n \"loginWithChatGPT\": \"使用 ChatGPT 登入\",\n \"loginRequired\": \"請先登入 ChatGPT 帳號\",\n \"waitingForAuth\": \"等待授權中...\",\n \"enterCode\": \"請在瀏覽器中輸入以下驗證碼:\",\n \"accountCount\": \"{{count}} 個帳號\",\n \"selectAccount\": \"選擇帳號\",\n \"selectAccountPlaceholder\": \"選擇一個 ChatGPT 帳號\",\n \"useDefaultAccount\": \"使用預設帳號\",\n \"loggedInAccounts\": \"已登入帳號\",\n \"defaultAccount\": \"預設\",\n \"selected\": \"已選取\",\n \"removeAccount\": \"移除帳號\",\n \"setAsDefault\": \"設為預設\",\n \"addAnotherAccount\": \"新增其他帳號\",\n \"logoutAll\": \"登出所有帳號\",\n \"retry\": \"重試\",\n \"copyCode\": \"複製程式碼\",\n \"fastMode\": \"FAST 模式\",\n \"fastModeDescription\": \"發送 service_tier=\\\"priority\\\" 換取更低延遲。預設關閉——開啟後會以更高速率消耗 ChatGPT 配額。\"\n },\n \"endpointTest\": {\n \"title\": \"請求位址管理\",\n \"endpoints\": \"個端點\",\n \"autoSelect\": \"自動選擇\",\n \"testSpeed\": \"測速\",\n \"testing\": \"測速中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完成\",\n \"noEndpoints\": \"暫無端點\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"請輸入有效的 URL\",\n \"invalidUrlFormat\": \"URL 格式不正確\",\n \"onlyHttps\": \"僅支援 HTTP/HTTPS\",\n \"urlExists\": \"該位址已存在\",\n \"saveFailed\": \"儲存失敗,請重試\",\n \"loadEndpointsFailed\": \"載入自訂端點失敗:\",\n \"addEndpointFailed\": \"新增自訂端點失敗:\",\n \"removeEndpointFailed\": \"刪除自訂端點失敗:\",\n \"removeFailed\": \"刪除失敗:{{error}}\",\n \"updateLastUsedFailed\": \"更新端點使用時間失敗\",\n \"pleaseAddEndpoint\": \"請先新增端點\",\n \"testUnavailable\": \"測速功能不可用\",\n \"noResult\": \"未回傳結果\",\n \"testFailed\": \"測速失敗:{{error}}\",\n \"empty\": \"暫無端點\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"模型測試設定\",\n \"useCustomConfig\": \"使用獨立設定\",\n \"testConfigDesc\": \"為此供應商設定獨立的模型測試參數,不啟用時使用全域設定。\",\n \"testModel\": \"測試模型\",\n \"testModelPlaceholder\": \"留空使用全域設定\",\n \"timeoutSecs\": \"逾時時間(秒)\",\n \"testPrompt\": \"測試提示詞\",\n \"degradedThreshold\": \"降級閾值(毫秒)\",\n \"maxRetries\": \"最大重試次數\",\n \"pricingConfig\": \"計費設定\",\n \"useCustomPricing\": \"使用獨立設定\",\n \"pricingConfigDesc\": \"為此供應商設定獨立的計費參數,不啟用時使用全域預設設定。\",\n \"costMultiplier\": \"成本倍率\",\n \"costMultiplierPlaceholder\": \"留空使用全域預設(1)\",\n \"costMultiplierHint\": \"實際成本 = 基礎成本 × 倍率,支援小數如 1.5\",\n \"pricingModelSourceLabel\": \"計費模式\",\n \"pricingModelSourceInherit\": \"繼承全域預設\",\n \"pricingModelSourceRequest\": \"請求模型\",\n \"pricingModelSourceResponse\": \"回傳模型\",\n \"pricingModelSourceHint\": \"選擇依請求模型還是回傳模型進行定價比對\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json 設定內容\",\n \"authJsonStorageHint\": \"代理接管中顯示的是儲存的 auth 配置,不是即時 auth.json\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml 設定內容\",\n \"configTomlStorageHint\": \"代理接管中顯示的是儲存的 config 配置,不是即時 config.toml\",\n \"proxyTakeoverStorageNotice\": \"💡 目前應用處於代理接管狀態。這裡編輯的是儲存的供應商配置,真實 live 配置已由代理暫時接管\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯 Codex 通用設定片段\",\n \"commonConfigHint\": \"該片段會在勾選「寫入通用設定」時附加到 config.toml 末尾\",\n \"enableGoalMode\": \"啟用 Goal mode\",\n \"enableRemoteCompaction\": \"啟用遠端壓縮\",\n \"remoteCompactionHint\": \"開啟後會將目前 model_providers 條目的 name 寫為 OpenAI,讓 Codex 嘗試使用遠端壓縮。\",\n \"apiUrlLabel\": \"API 請求位址\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"modelNameHint\": \"指定使用的模型,將自動更新到 config.toml 中\",\n \"modelName\": \"模型名稱\",\n \"modelNamePlaceholder\": \"例如: gpt-5-codex\",\n \"contextWindow1M\": \"1M 上下文視窗\",\n \"autoCompactLimit\": \"壓縮閾值\",\n \"autoCompactLimitHint\": \"上下文 token 數達到此閾值時自動壓縮歷史\",\n \"autoCompactLimitPlaceholder\": \"例如: 90000\",\n \"localRoutingToggle\": \"需要本地路由映射\",\n \"localRoutingOnHint\": \"Codex 目前僅原生支援 OpenAI Responses API 與 GPT 系列模型;如果您的供應商使用 Chat Completions 協定或非 GPT 模型(如 DeepSeek、Kimi),則需要打開本開關,並在使用過程中保持本地路由開啟。\",\n \"localRoutingOffHint\": \"如果您的供應商不是原生 OpenAI Responses API,或者模型名不是 Codex 預設的 GPT 系列,請打開此開關。\",\n \"modelMappingTitle\": \"模型映射\",\n \"modelMappingHint\": \"產生 Codex model_catalog_json,讓 /model 指令顯示這些第三方模型名;表中條目按填寫內容原樣儲存。修改後需要重新啟動 Codex 才能重新整理模型清單。\",\n \"addCatalogModel\": \"新增模型\",\n \"catalogDisplayName\": \"顯示名稱\",\n \"catalogModelId\": \"模型 ID\",\n \"catalogColumnDisplay\": \"選單顯示名\",\n \"catalogColumnModel\": \"實際請求模型\",\n \"catalogColumnContext\": \"上下文視窗\",\n \"catalogDisplayNamePlaceholder\": \"例如: DeepSeek V4 Flash\",\n \"catalogModelPlaceholder\": \"例如: deepseek-v4-flash\",\n \"contextWindow\": \"上下文視窗\",\n \"contextWindowPlaceholder\": \"例如: 128000\",\n \"upstreamModelName\": \"上游模型名稱\",\n \"upstreamModelNameHint\": \"Chat 格式下這裡填寫真實上游模型;路由會把 Codex 的 Responses 請求轉換為 Chat Completions 並保持該模型。\",\n \"modelMetadataAdvanced\": \"模型中繼資料進階選項\",\n \"modelMetadataAdvancedHint\": \"用於未知模型的 Codex 中繼資料覆寫;清空欄位會從 config.toml 刪除對應設定。\",\n \"reasoningModeToggle\": \"支援思考模式\",\n \"reasoningModeHint\": \"上游 Chat Completions 介面支援開啟或關閉 thinking 時啟用。Kimi、GLM、Qwen 等通常屬於這一類。\",\n \"reasoningEffortToggle\": \"支援思考等級\",\n \"reasoningEffortHint\": \"上游支援 low/high/max 等思考深度控制時啟用。啟用後會自動啟用思考模式,並把 Codex 的 reasoning.effort 轉成上游 Chat 參數。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"預設供應商已自動設定;自訂供應商會按名稱/位址自動推斷。僅當自動識別不準時才需手動覆寫。\",\n \"advancedSectionHint\": \"包含本地路由映射、模型映射、思考能力與自訂 User-Agent。供應商使用 Chat Completions 協定或非 GPT 模型時,需在此開啟本地路由映射。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境變數 (.env)\",\n \"envFileHint\": \"使用 .env 格式設定 Gemini 環境變數\",\n \"configJson\": \"設定檔 (config.json)\",\n \"configJsonHint\": \"使用 JSON 格式設定 Gemini 擴充參數(選填)\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯 Gemini 通用設定片段\",\n \"commonConfigHint\": \"該片段會寫入 Gemini 的 .env(不允許包含 GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY)\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"extractedConfigInvalid\": \"擷取的設定格式錯誤\",\n \"invalidJsonFormat\": \"通用設定片段格式錯誤(必須是有效的 JSON)\",\n \"commonConfigInvalidKeys\": \"通用設定片段不能包含 GOOGLE_GEMINI_BASE_URL 或 GEMINI_API_KEY(發現:{{keys}})\",\n \"commonConfigInvalidValues\": \"通用設定片段的值必須是字串\",\n \"noCommonConfigToApply\": \"通用設定片段為空或沒有可寫入的內容\",\n \"configMergeFailed\": \"設定合併失敗:{{error}}\",\n \"configReplaceFailed\": \"設定替換失敗:{{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API 格式\",\n \"selectPackage\": \"選擇 API 格式\",\n \"npmPackageHint\": \"選擇 AI 服務的 API 格式\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"自訂 API 端點位址\",\n \"models\": \"模型設定\",\n \"modelsHint\": \"設定可用的模型及其顯示名稱\",\n \"addModel\": \"新增模型\",\n \"modelId\": \"模型 ID\",\n \"modelName\": \"顯示名稱\",\n \"noModels\": \"暫無模型設定\",\n \"modelsRequired\": \"請至少新增一個模型設定\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定檔中的唯一識別碼,只能使用小寫字母、數字和連字號\",\n \"providerKeyLockedHint\": \"該供應商已新增至應用程式設定中,供應商標識不可修改\",\n \"providerKeyRequired\": \"請填寫供應商標識\",\n \"providerKeyDuplicate\": \"此標識已被使用,請更換\",\n \"providerKeyInvalid\": \"標識格式無效,只能使用小寫字母、數字和連字號\",\n \"extraOptions\": \"額外選項\",\n \"extraOptionsHint\": \"設定額外的 SDK 選項,如 timeout、setCacheKey 等。值會自動解析類型(數字、布林值等)。\",\n \"addExtraOption\": \"新增\",\n \"extraOptionKey\": \"鍵名\",\n \"extraOptionValue\": \"值\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"暫無額外選項\",\n \"noModelOptions\": \"模型選項,點擊 + 新增\",\n \"modelExtraFields\": \"模型屬性\",\n \"noModelExtraFields\": \"模型屬性 (variants, cost 等),點擊 + 新增\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK 選項\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"預設供應商\",\n \"custom\": \"自訂設定\",\n \"other\": \"其他\",\n \"hint\": \"選擇預設後可繼續調整下方欄位。\",\n \"searchTooltip\": \"搜尋預設\",\n \"searchAriaLabel\": \"搜尋預設供應商\",\n \"searchPlaceholder\": \"搜尋名稱、官網或分類...\",\n \"sortAriaLabel\": \"切換預設排序\",\n \"sortNameAscTooltip\": \"按名稱 A-Z 排序\",\n \"sortOriginalTooltip\": \"恢復原始順序\",\n \"noSearchResults\": \"沒有相符的預設供應商。\"\n },\n \"usage\": {\n \"title\": \"使用統計\",\n \"subtitle\": \"查看 AI 模型的使用情況和成本統計\",\n \"today\": \"24 小時\",\n \"last7days\": \"7 天\",\n \"last30days\": \"30 天\",\n \"presetToday\": \"當天\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"總請求數\",\n \"totalCost\": \"總成本\",\n \"cost\": \"成本\",\n \"perMillion\": \"(每百萬)\",\n \"trends\": \"使用趨勢\",\n \"rangeToday\": \"過去 24 小時 (按小時)\",\n \"rangeLast7Days\": \"過去 7 天\",\n \"rangeLast30Days\": \"過去 30 天\",\n \"totalTokens\": \"新產生 Token (Input+Output)\",\n \"cacheTokens\": \"快取 Token\",\n \"realTotal\": \"真實消耗 Tokens\",\n \"realTotalHint\": \"Input + Output + 快取建立 + 快取命中\",\n \"freshInput\": \"新增輸入\",\n \"cacheHitRate\": \"快取命中率\",\n \"requestLogs\": \"請求日誌\",\n \"providerStats\": \"Provider 統計\",\n \"modelStats\": \"模型統計\",\n \"time\": \"時間\",\n \"provider\": \"供應商\",\n \"billingModel\": \"計費模型\",\n \"inputTokens\": \"輸入\",\n \"outputTokens\": \"輸出\",\n \"cacheReadTokens\": \"快取命中\",\n \"cacheCreationTokens\": \"快取建立\",\n \"timingInfo\": \"耗時/首字\",\n \"status\": \"狀態\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"請求模型\",\n \"responseModel\": \"回傳模型\",\n \"noData\": \"暫無資料\",\n \"unknownProvider\": \"未知供應商\",\n \"stream\": \"串流\",\n \"nonStream\": \"非串流\",\n \"source\": \"來源\",\n \"requestsLabel\": \"次請求\",\n \"costLabel\": \"總成本\",\n \"appFilter\": {\n \"all\": \"全部\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"資料來源\",\n \"dataSource\": {\n \"proxy\": \"路由\",\n \"session_log\": \"工作階段日誌\",\n \"codex_db\": \"Codex 資料庫\",\n \"codex_session\": \"Codex 工作階段日誌\",\n \"gemini_session\": \"Gemini 工作階段日誌\",\n \"opencode_session\": \"OpenCode 工作階段日誌\"\n },\n \"sessionSync\": {\n \"trigger\": \"同步工作階段日誌\",\n \"import\": \"匯入工作階段\",\n \"resync\": \"同步\",\n \"imported\": \"從工作階段日誌匯入了 {{count}} 筆紀錄\",\n \"upToDate\": \"工作階段日誌已是最新\",\n \"failed\": \"工作階段同步失敗\"\n },\n \"totalRecords\": \"共 {{total}} 筆紀錄\",\n \"goToPage\": \"跳轉\",\n \"pageInputPlaceholder\": \"頁碼\",\n \"modelPricing\": \"模型定價\",\n \"loadPricingError\": \"載入定價資料失敗\",\n \"modelPricingDesc\": \"設定各模型的 Token 成本\",\n \"noPricingData\": \"暫無定價資料。點擊「新增」加入模型定價設定。\",\n \"model\": \"模型\",\n \"pricingModel\": \"計價模型\",\n \"displayName\": \"顯示名稱\",\n \"inputCost\": \"輸入成本\",\n \"outputCost\": \"輸出成本\",\n \"cacheReadCost\": \"快取命中\",\n \"cacheWriteCost\": \"快取建立\",\n \"pricingAudit\": \"稽核\",\n \"pricingBuiltinPublic\": \"內建公開價格\",\n \"pricingUserOverride\": \"使用者自訂\",\n \"pricingEffectiveAt\": \"生效\",\n \"longContextRate\": \"長上下文\",\n \"deleteConfirmTitle\": \"確認刪除\",\n \"deleteConfirmDesc\": \"確定要刪除此模型定價設定嗎?此操作無法復原。\",\n \"queryFailed\": \"查詢失敗\",\n \"refreshUsage\": \"重新整理用量\",\n \"planUsage\": \"方案用量\",\n \"hostConfirm\": {\n \"title\": \"確認外送網域\",\n \"message\": \"此供應商的自訂用量指令碼要向以下網域發出請求(其中會包含你的 API 金鑰):\\n\\n{{host}}\\n\\n僅在你信任該網域時才繼續。確認後會記住此選擇,直到目標網域變更為止。\",\n \"pending\": \"需先確認才能存取 {{host}}\",\n \"reviewButton\": \"檢視\",\n \"confirm\": \"信任並繼續\",\n \"cancel\": \"取消\"\n },\n \"invalid\": \"已失效\",\n \"total\": \"總:\",\n \"used\": \"已使用:\",\n \"remaining\": \"剩餘:\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}} 分鐘前\",\n \"hoursAgo\": \"{{count}} 小時前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"multiplePlans\": \"{{count}} 個方案\",\n \"expand\": \"展開\",\n \"collapse\": \"收起\",\n \"modelIdPlaceholder\": \"例如: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例如: Claude 3.5 Sonnet\",\n \"appType\": \"應用程式類型\",\n \"allApps\": \"全部應用程式\",\n \"statusCode\": \"狀態碼\",\n \"searchProviderPlaceholder\": \"搜尋供應商...\",\n \"searchModelPlaceholder\": \"搜尋模型...\",\n \"timeRange\": \"時間範圍\",\n \"customRange\": \"日曆篩選\",\n \"customRangeHint\": \"支援日期與時間\",\n \"startTime\": \"開始時間\",\n \"endTime\": \"結束時間\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"建立\",\n \"cacheWriteNotReported\": \"OpenAI 協定不區分快取建立,僅上報快取命中\",\n \"cacheWritePartial\": \"部分協定(如 OpenAI)不上報快取建立,數值可能偏低\",\n \"cacheRead\": \"命中\",\n \"baseCost\": \"基礎\",\n \"costMultiplier\": \"成本倍率\",\n \"withMultiplier\": \"含倍率\",\n \"requestDetail\": \"請求詳情\",\n \"requestNotFound\": \"請求未找到\",\n \"basicInfo\": \"基本資訊\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"快取寫入成本\",\n \"costBreakdown\": \"成本明細\",\n \"performance\": \"效能資訊\",\n \"latency\": \"延遲\",\n \"errorMessage\": \"錯誤訊息\",\n \"requests\": \"請求數\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"平均成本\",\n \"avgLatency\": \"平均延遲\",\n \"successRate\": \"成功率\",\n \"requestId\": \"請求 ID\",\n \"never\": \"從不\",\n \"modelId\": \"模型 ID\",\n \"modelIdRequired\": \"模型 ID 不能為空\",\n \"inputCostPerMillion\": \"輸入成本 (每百萬 tokens, USD)\",\n \"outputCostPerMillion\": \"輸出成本 (每百萬 tokens, USD)\",\n \"invalidPrice\": \"價格必須為非負數\",\n \"invalidTimeRange\": \"請選擇完整的開始/結束時間\",\n \"invalidTimeRangeOrder\": \"開始時間不能晚於結束時間\",\n \"timeRangeTooLarge\": \"時間範圍過大,請縮小範圍\",\n \"addPricing\": \"新增定價\",\n \"editPricing\": \"編輯定價\",\n \"pricingAdded\": \"定價已新增\",\n \"pricingUpdated\": \"定價已更新\",\n \"cacheReadCostPerMillion\": \"快取讀取成本 (每百萬 tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"快取寫入成本 (每百萬 tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"設定用量查詢\",\n \"enableUsageQuery\": \"啟用用量查詢\",\n \"presetTemplate\": \"預設範本\",\n \"requestUrl\": \"請求位址\",\n \"requestUrlPlaceholder\": \"例如:https://api.example.com\",\n \"method\": \"HTTP 方法\",\n \"templateCustom\": \"自訂\",\n \"templateGeneral\": \"通用範本\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"官方\",\n \"templateOfficialSubscription\": \"官方訂閱\",\n \"copilotAutoAuth\": \"自動使用 OAuth 驗證,無需手動設定憑證\",\n \"tokenPlanHint\": \"自動使用供應商的 API Key 和 Base URL 查詢 Token Plan 額度\",\n \"balanceHint\": \"自動使用供應商的 API Key 查詢帳號餘額\",\n \"officialSubscriptionHint\": \"讀取本機 CLI 的 OAuth 憑證,並呼叫官方介面查詢訂閱額度。預設關閉,只有啟用後才會請求。\",\n \"resetDate\": \"重設日期\",\n \"premiumRequests\": \"Premium 請求\",\n \"credentialsConfig\": \"憑證設定\",\n \"credentialsHint\": \"留空則自動使用供應商設定\",\n \"optional\": \"選填\",\n \"apiKeyPlaceholder\": \"留空則使用供應商的 API Key\",\n \"baseUrlPlaceholder\": \"留空則使用供應商的請求位址\",\n \"baseUrl\": \"請求位址\",\n \"accessToken\": \"Access Token(在個人安全設定裡取得)\",\n \"accessTokenPlaceholder\": \"在「安全設定」裡產生\",\n \"userId\": \"使用者 ID\",\n \"userIdPlaceholder\": \"例如:114514\",\n \"defaultPlan\": \"預設方案\",\n \"queryFailedMessage\": \"查詢失敗\",\n \"queryScript\": \"查詢腳本(JavaScript)\",\n \"timeoutSeconds\": \"逾時時間(秒)\",\n \"headers\": \"請求標頭\",\n \"body\": \"請求 Body\",\n \"timeoutHint\": \"範圍: 2-30 秒\",\n \"timeoutMustBeInteger\": \"逾時時間必須為整數,小數部分已忽略\",\n \"timeoutCannotBeNegative\": \"逾時時間不能為負數\",\n \"autoIntervalMinutes\": \"自動查詢間隔(分鐘,0 表示不自動查詢)\",\n \"autoQueryInterval\": \"自動查詢間隔(分鐘)\",\n \"autoQueryIntervalHint\": \"0 表示不自動查詢,建議 5-60 分鐘\",\n \"intervalMustBeInteger\": \"自動查詢間隔必須為整數,小數部分已忽略\",\n \"intervalCannotBeNegative\": \"自動查詢間隔不能為負數\",\n \"intervalAdjusted\": \"自動查詢間隔已調整為 {{value}} 分鐘\",\n \"scriptHelp\": \"腳本編寫說明:\",\n \"configFormat\": \"設定格式:\",\n \"commentOptional\": \"選填\",\n \"commentResponseIsJson\": \"response 是 API 回傳的 JSON 資料\",\n \"extractorFormat\": \"extractor 回傳格式(所有欄位均為選填):\",\n \"tips\": \"💡 提示:\",\n \"testing\": \"測試中...\",\n \"testScript\": \"測試腳本\",\n \"format\": \"格式化\",\n \"saveConfig\": \"儲存設定\",\n \"scriptEmpty\": \"腳本設定不能為空\",\n \"mustHaveReturn\": \"腳本必須包含 return 敘述\",\n \"testSuccess\": \"測試成功!\",\n \"testFailed\": \"測試失敗\",\n \"formatSuccess\": \"格式化成功\",\n \"formatFailed\": \"格式化失敗\",\n \"supportedVariables\": \"支援的變數\",\n \"variablesHint\": \"支援變數: {{apiKey}}, {{baseUrl}} | extractor 函式接收 API 回應的 JSON 物件\",\n \"scriptConfig\": \"請求設定\",\n \"extractorCode\": \"提取器程式碼\",\n \"extractorHint\": \"回傳物件需包含剩餘額度等欄位\",\n \"fieldIsValid\": \"• isValid: 布林值,方案是否有效\",\n \"fieldInvalidMessage\": \"• invalidMessage: 字串,失效原因說明(當 isValid 為 false 時顯示)\",\n \"fieldRemaining\": \"• remaining: 數字,剩餘額度\",\n \"fieldUnit\": \"• unit: 字串,單位(如 \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: 字串,方案名稱\",\n \"fieldTotal\": \"• total: 數字,總額度\",\n \"fieldUsed\": \"• used: 數字,已用額度\",\n \"fieldExtra\": \"• extra: 字串,擴充欄位,可自由補充需要展示的文字\",\n \"tip1\": \"• 變數 {{apiKey}} 和 {{baseUrl}} 會自動替換\",\n \"tip2\": \"• extractor 函式在沙盒環境中執行,支援 ES2020+ 語法\",\n \"tip3\": \"• 整個設定必須用 () 包覆,形成物件實字運算式\"\n },\n \"errors\": {\n \"usage_query_failed\": \"用量查詢失敗\",\n \"configLoadFailedTitle\": \"設定載入失敗\",\n \"configLoadFailedMessage\": \"無法讀取設定檔:\\n{{path}}\\n\\n錯誤詳情:\\n{{detail}}\\n\\n請手動檢查 JSON 是否有效,或從同目錄的備份檔案(如 config.json.bak)還原。\\n\\n應用程式將退出以便您進行修復。\",\n \"mcpPageLoadFailed\": \"發現 MCP 頁面載入失敗\",\n \"mcpPageLoadDescription\": \"MCP 註冊表頁面渲染出錯,可能是資料異常或網路問題。\",\n \"pageLoadFailed\": \"頁面載入失敗\",\n \"pageLoadFailedDescription\": \"當前視圖渲染過程中發生了未預期的錯誤,請嘗試切換到其他頁面或重新整理。\"\n },\n \"presetSelector\": {\n \"title\": \"選擇設定類型\",\n \"custom\": \"自訂\",\n \"customDescription\": \"手動設定供應商,需要填寫完整的設定資訊\",\n \"officialDescription\": \"官方登入,不需要填寫 API Key\",\n \"presetDescription\": \"使用預設設定,只需填寫 API Key\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"匯入\",\n \"importExisting\": \"匯入已有\",\n \"addMcp\": \"新增 MCP\",\n \"discover\": \"發現MCP\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP 伺服器管理\",\n \"addServer\": \"新增伺服器\",\n \"editServer\": \"編輯伺服器\",\n \"deleteServer\": \"刪除伺服器\",\n \"deleteConfirm\": \"確定要刪除伺服器 \\\"{{id}}\\\" 嗎?此操作無法復原。\",\n \"noServers\": \"暫無伺服器\",\n \"enabledApps\": \"啟用的應用程式\",\n \"noImportFound\": \"未發現需要匯入的 MCP 伺服器。所有伺服器已在 OpenSunstar 統一管理中。\",\n \"importSuccess\": \"成功匯入 {{count}} 個 MCP 伺服器\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"使用者級 MCP 設定路徑\",\n \"serverList\": \"伺服器清單\",\n \"loading\": \"載入中...\",\n \"empty\": \"暫無 MCP 伺服器\",\n \"emptyDescription\": \"點擊右上角按鈕新增第一個 MCP 伺服器\",\n \"add\": \"新增 MCP\",\n \"addServer\": \"新增 MCP\",\n \"editServer\": \"編輯 MCP\",\n \"addClaudeServer\": \"新增 Claude Code MCP\",\n \"editClaudeServer\": \"編輯 Claude Code MCP\",\n \"addCodexServer\": \"新增 Codex MCP\",\n \"editCodexServer\": \"編輯 Codex MCP\",\n \"configPath\": \"設定路徑\",\n \"serverCount\": \"已設定 {{count}} 個 MCP 伺服器\",\n \"enabledCount\": \"已啟用 {{count}} 個\",\n \"template\": {\n \"fetch\": \"快速範本:mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP 標題(唯一)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"顯示名稱\",\n \"namePlaceholder\": \"例如 @modelcontextprotocol/server-time\",\n \"enabledApps\": \"啟用至應用程式\",\n \"noAppsWarning\": \"至少選擇一個應用程式\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"選填的描述資訊\",\n \"tags\": \"標籤(逗號分隔)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"首頁連結\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"文件連結\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"附加資訊\",\n \"jsonConfig\": \"完整的 JSON 設定\",\n \"jsonConfigOrPrefix\": \"完整的 JSON 設定或者使用\",\n \"tomlConfigOrPrefix\": \"完整的 TOML 設定或者使用\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"完整的 TOML 設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定精靈\",\n \"syncOtherSide\": \"同步至 {{target}}\",\n \"syncOtherSideHint\": \"勾選後會把目前設定同時寫入 {{target}},若存在同名設定將被覆寫\",\n \"willOverwriteWarning\": \"將覆寫 {{target}} 中的同名設定\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定精靈\",\n \"hint\": \"快速設定 MCP 伺服器,自動產生 JSON 設定\",\n \"type\": \"類型\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"命令\",\n \"commandPlaceholder\": \"npx 或 uvx\",\n \"args\": \"參數\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境變數\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"請輸入 URL\",\n \"headers\": \"請求標頭(選填)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定預覽\",\n \"apply\": \"套用設定\"\n },\n \"id\": \"標識 (唯一)\",\n \"type\": \"類型\",\n \"command\": \"命令\",\n \"validateCommand\": \"驗證命令\",\n \"args\": \"參數\",\n \"argsPlaceholder\": \"例如:mcp-server-fetch --help\",\n \"env\": \"環境變數 (一行一個,KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"重設\",\n \"msg\": {\n \"saved\": \"已儲存\",\n \"deleted\": \"已刪除\",\n \"enabled\": \"已啟用\",\n \"disabled\": \"已停用\",\n \"templateAdded\": \"已新增範本\"\n },\n \"error\": {\n \"idRequired\": \"請填寫標識\",\n \"idExists\": \"該標識已存在,請更換\",\n \"jsonInvalid\": \"JSON 格式錯誤,請檢查\",\n \"tomlInvalid\": \"TOML 格式錯誤,請檢查\",\n \"commandRequired\": \"請填寫命令\",\n \"singleServerObjectRequired\": \"此處只需單個伺服器物件,請不要貼上包含 mcpServers 的整份設定\",\n \"saveFailed\": \"儲存失敗\",\n \"deleteFailed\": \"刪除失敗\"\n },\n \"test\": {\n \"testConnection\": \"測試連結\",\n \"batchTestConnection\": \"批次測試所有伺服器連結\",\n \"batchProgress\": \"測試中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全部 {{count}} 個伺服器連線成功\",\n \"batchSummary\": \"{{connected}} 個成功,{{failed}} 個失敗(共 {{total}} 個)\",\n \"noServersToTest\": \"沒有可測試的伺服器\",\n \"connected\": \"已連線\",\n \"authRequired\": \"需驗證\",\n \"unreachable\": \"無法連線\",\n \"timeout\": \"逾時\",\n \"commandFailed\": \"啟動失敗\",\n \"unexpected\": \"異常\"\n },\n \"validation\": {\n \"ok\": \"命令可用\",\n \"fail\": \"命令不可用\"\n },\n \"confirm\": {\n \"deleteTitle\": \"刪除 MCP 伺服器\",\n \"deleteMessage\": \"確定要刪除 MCP 伺服器 \\\"{{id}}\\\" 嗎?此操作無法復原。\"\n },\n \"presets\": {\n \"title\": \"選擇 MCP 類型\",\n \"enable\": \"啟用\",\n \"enabled\": \"已啟用\",\n \"installed\": \"已安裝\",\n \"docs\": \"文件\",\n \"requiresEnv\": \"需要環境變數\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"通用 HTTP 請求工具,支援 GET/POST 等 HTTP 方法,適合快速請求 API / 抓取網頁資料\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"時間查詢工具,提供目前時間、時區轉換、日期計算等功能\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"知識圖譜記憶系統,支援儲存實體、關係和觀察,讓 AI 記住對話中的重要資訊\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"順序思考工具,協助 AI 將複雜問題分解為多個步驟,逐步深入思考\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 文件搜尋工具,提供最新的函式庫文件和程式碼範例,設定 key 會有更高限額\"\n }\n },\n \"discovery\": {\n \"title\": \"發現 MCP\",\n \"searchPlaceholder\": \"輸入關鍵字搜索 MCP 服務器...\",\n \"totalFound\": \"找到 {{count}} 個服務器\",\n \"alreadyInstalled\": \"已安裝 {{count}} 個\",\n \"noResults\": \"未找到與 \\\"{{query}}\\\" 相關的服務器\",\n \"noServers\": \"暫無可用服務器\",\n \"official\": \"官方\",\n \"installed\": \"已安裝\",\n \"install\": \"安裝\",\n \"remotes\": \"連接方式\",\n \"website\": \"網站\",\n \"repository\": \"倉庫\"\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude 提示詞管理\",\n \"codexTitle\": \"Codex 提示詞管理\",\n \"add\": \"新增提示詞\",\n \"edit\": \"編輯提示詞\",\n \"addTitle\": \"新增 {{appName}} 提示詞\",\n \"editTitle\": \"編輯 {{appName}} 提示詞\",\n \"import\": \"匯入現有\",\n \"count\": \"共 {{count}} 個提示詞\",\n \"enabled\": \"已啟用\",\n \"enable\": \"啟用\",\n \"enabledName\": \"已啟用:{{name}}\",\n \"noneEnabled\": \"未啟用任何提示詞\",\n \"currentFile\": \"目前 {{filename}} 內容\",\n \"empty\": \"暫無提示詞\",\n \"emptyDescription\": \"點擊右上角按鈕新增或匯入提示詞\",\n \"loading\": \"載入中...\",\n \"name\": \"名稱\",\n \"namePlaceholder\": \"例如:專案預設提示詞\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"選填的描述資訊\",\n \"content\": \"內容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\n在此輸入提示詞內容...\",\n \"loadFailed\": \"載入提示詞失敗\",\n \"saveSuccess\": \"儲存成功\",\n \"saveFailed\": \"儲存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"enableSuccess\": \"啟用成功\",\n \"enableFailed\": \"啟用失敗\",\n \"disableSuccess\": \"停用成功\",\n \"disableFailed\": \"停用失敗\",\n \"importSuccess\": \"匯入成功\",\n \"importFailed\": \"匯入失敗\",\n \"confirm\": {\n \"deleteTitle\": \"確認刪除\",\n \"deleteMessage\": \"確定要刪除提示詞 \\\"{{name}}\\\" 嗎?\"\n },\n \"fragment\": {\n \"isFragment\": \"規則片段\",\n \"parent\": \"所屬 Prompt\",\n \"selectParent\": \"選擇父 Prompt\",\n \"priority\": \"優先級(高者優先合併)\",\n \"targets\": \"目標工具(逗號分隔,* 表示全部)\",\n \"globs\": \"文件 Glob(JSON 數組)\",\n \"badge\": \"片段\"\n }\n },\n \"workspace\": {\n \"title\": \"專案駕駛艙\",\n \"manage\": \"Workspace\",\n \"files\": {\n \"agents\": \"Agent 操作指令和規則\",\n \"soul\": \"Agent 人格和溝通風格\",\n \"user\": \"使用者檔案和偏好\",\n \"identity\": \"Agent 名稱和頭像\",\n \"tools\": \"本地工具文件\",\n \"memory\": \"長期記憶和決策紀錄\",\n \"heartbeat\": \"心跳執行清單\",\n \"bootstrap\": \"首次執行儀式\",\n \"boot\": \"閘道器重新啟動清單\"\n },\n \"editing\": \"編輯 {{filename}}\",\n \"saveSuccess\": \"儲存成功\",\n \"saveFailed\": \"儲存失敗\",\n \"loadFailed\": \"讀取失敗\",\n \"openDirectory\": \"在檔案管理員中開啟\",\n \"dailyMemory\": {\n \"title\": \"每日記憶\",\n \"sectionTitle\": \"每日記憶\",\n \"cardTitle\": \"每日記憶檔案\",\n \"cardDescription\": \"瀏覽管理每日記憶\",\n \"createToday\": \"新增記憶\",\n \"empty\": \"暫無每日記憶檔案\",\n \"loadFailed\": \"載入每日記憶檔案失敗\",\n \"createFailed\": \"建立每日記憶檔案失敗\",\n \"deleteSuccess\": \"每日記憶檔案已刪除\",\n \"deleteFailed\": \"刪除每日記憶檔案失敗\",\n \"confirmDeleteTitle\": \"刪除每日記憶\",\n \"confirmDeleteMessage\": \"確定刪除 {{date}} 的每日記憶嗎?此操作不可復原。\",\n \"searchPlaceholder\": \"搜尋全文內容...\",\n \"searchScopeHint\": \"全文搜尋所有每日記憶 ⌘F\",\n \"searchCloseHint\": \"Esc 關閉\",\n \"noSearchResults\": \"沒有找到符合的每日記憶。\",\n \"searching\": \"搜尋中...\",\n \"searchFailed\": \"搜尋失敗\",\n \"matchCount\": \"{{count}} 處相符\"\n },\n \"subtitle\": \"彙總各項目 AI 配置狀態與近期活躍度,幫你先看該看的\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 配置\"\n },\n \"tabs\": {\n \"label\": \"工作區視圖\",\n \"dashboard\": \"今日告警\",\n \"board\": \"項目看板\"\n },\n \"dashboard\": {\n \"title\": \"今日告警\",\n \"subtitle\": \"共 {{count}} 個項目 · 優先關注進度與 AI 資產配置\",\n \"attentionCount\": \"待關注項目\",\n \"attentionHint\": \"就緒不足或資產缺失\",\n \"avgReadiness\": \"平均就緒分\",\n \"missingMcp\": \"缺 MCP 項目\",\n \"activeProjects\": \"近 {{days}} 天活躍\",\n \"activeHint\": \"有 Git 提交\",\n \"queueTitle\": \"建議優先處理\",\n \"allGood\": \"各項目配置狀態良好,可直接進入迭代。\",\n \"configureAssets\": \"配置資產\",\n \"reasonReadiness\": \"就緒分 {{score}}/{{max}}\",\n \"reasonDrift\": \"配置不一致 {{count}} 項\",\n \"reasonUnmanaged\": \"尚未納入 OpenSunstar 管理\",\n \"reasonMcp\": \"未關聯 MCP\",\n \"reasonSkills\": \"未配置 Skills\",\n \"reasonPrompts\": \"未關聯 Prompts\",\n \"reasonProgress\": \"MVP 進度 {{progress}}%\",\n \"lastUpdated\": \"上次更新\",\n \"updatedJustNow\": \"剛剛更新\",\n \"updatedMinutesAgo\": \"{{count}} 分鐘前更新\",\n \"updatedHoursAgo\": \"{{count}} 小時前更新\",\n \"updatedAt\": \"更新於 {{time}}\",\n \"refreshing\": \"正在刷新…\",\n \"loading\": \"正在彙總項目就緒與資產數據…\",\n \"mvpBehindHint\": \"{{count}} 個 MVP 項目進度低於 50%,建議優先推進。\",\n \"activeSub\": \"共 {{commits}} 次提交 · 活躍度 {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 資產總覽\",\n \"subtitle\": \"按項目查看 MCP / Skills / Prompts 關聯與就緒狀態\",\n \"loading\": \"正在彙總各項目 AI 資產…\",\n \"project\": \"項目\",\n \"stage\": \"階段\",\n \"readiness\": \"就緒\",\n \"progress\": \"進度\",\n \"refreshing\": \"更新中\",\n \"subtitle8\": \"按項目查看 8 類 AI 資產關聯數量與就緒狀態(項目級啟用子集)\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"已建立備份:{{path}}\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定檔中的唯一識別碼,只能使用小寫字母、數字和連字號\",\n \"providerKeyLockedHint\": \"該供應商已新增至應用程式設定中,供應商標識不可修改\",\n \"providerKeyRequired\": \"請填寫供應商標識\",\n \"providerKeyDuplicate\": \"此標識已被使用,請更換\",\n \"providerKeyInvalid\": \"標識格式無效,只能使用小寫字母、數字和連字號\",\n \"apiProtocol\": \"API 協定\",\n \"selectProtocol\": \"選擇 API 協定\",\n \"apiProtocolHint\": \"選擇與供應商 API 相容的協定類型。大多數供應商使用 OpenAI Completions 格式。\",\n \"baseUrl\": \"API 端點\",\n \"baseUrlHint\": \"供應商的 API 端點位址。\",\n \"models\": \"模型清單\",\n \"addModel\": \"新增模型\",\n \"noModels\": \"暫無模型設定。點擊新增模型來設定可用模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"顯示名稱\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"上下文視窗\",\n \"maxTokens\": \"最大輸出 Tokens\",\n \"reasoning\": \"推理模式\",\n \"reasoningOn\": \"啟用\",\n \"reasoningOff\": \"關閉\",\n \"inputTypes\": \"輸入類型\",\n \"inputCost\": \"輸入價格 ($/M tokens)\",\n \"outputCost\": \"輸出價格 ($/M tokens)\",\n \"advancedOptions\": \"進階選項\",\n \"cacheReadCost\": \"快取讀取價格 ($/M tokens)\",\n \"cacheWriteCost\": \"快取寫入價格 ($/M tokens)\",\n \"cacheCostHint\": \"快取價格用於計算 Prompt Caching 的成本。如不使用快取可留空。\",\n \"modelsHint\": \"設定該供應商支援的模型。模型 ID 用於 API 呼叫,顯示名稱用於介面展示。\",\n \"userAgent\": \"發送 User-Agent\",\n \"userAgentHint\": \"部分供應商需要瀏覽器 User-Agent 才能正常存取。\",\n \"env\": {\n \"title\": \"環境變數\",\n \"description\": \"管理 openclaw.json 中的環境變數設定(API Key、自訂變數等)\",\n \"editorHint\": \"以 JSON 形式編輯整個 env 節點。支援 env.vars、env.shellEnv 等巢狀物件。\",\n \"objectRequired\": \"OpenClaw 的 env 必須是 JSON 物件。\",\n \"invalidJson\": \"OpenClaw 的 env 必須是合法 JSON。\",\n \"empty\": \"OpenClaw 的 env 不能為空。空物件請使用 {}。\",\n \"keyPlaceholder\": \"變數名稱\",\n \"valuePlaceholder\": \"值\",\n \"add\": \"新增變數\",\n \"saveSuccess\": \"環境變數已儲存\",\n \"saveFailed\": \"儲存環境變數失敗\",\n \"loadFailed\": \"讀取環境變數失敗\",\n \"duplicateKey\": \"檢測到重複的變數名稱: {{key}}\"\n },\n \"tools\": {\n \"title\": \"工具權限\",\n \"description\": \"管理 openclaw.json 中的工具權限設定(允許/拒絕清單)\",\n \"profile\": \"權限模式\",\n \"profileMinimal\": \"最小權限\",\n \"profileCoding\": \"編碼\",\n \"profileMessaging\": \"對話\",\n \"profileFull\": \"完全存取\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"檢測到不受支援的工具設定\",\n \"unsupportedProfileDescription\": \"目前 tools.profile 的值「{{value}}」不在 OpenClaw 支援清單內。在您手動選擇新值之前,它會被保留。\",\n \"unsupportedProfileLabel\": \"不受支援\",\n \"allowList\": \"允許清單\",\n \"denyList\": \"拒絕清單\",\n \"patternPlaceholder\": \"工具名稱或模式\",\n \"addAllow\": \"新增允許\",\n \"addDeny\": \"新增拒絕\",\n \"saveSuccess\": \"工具權限已儲存\",\n \"saveFailed\": \"儲存工具權限失敗\",\n \"loadFailed\": \"讀取工具權限失敗\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"管理 openclaw.json 中的 agents.defaults 設定(預設模型、執行參數等)\",\n \"modelSection\": \"模型設定\",\n \"primaryModel\": \"預設模型\",\n \"primaryModelHint\": \"從已設定供應商的模型中選擇預設模型\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"備用模型\",\n \"fallbackModelsHint\": \"當主模型不可用時,依優先順序依次嘗試以下備用模型\",\n \"addFallback\": \"新增備用模型\",\n \"noModels\": \"暫無已設定的供應商模型。請先新增 OpenClaw 供應商。\",\n \"notInList\": \"{{value}} (供應商未設定)\",\n \"runtimeSection\": \"執行參數\",\n \"workspace\": \"工作區路徑\",\n \"timeout\": \"逾時時間(秒)\",\n \"contextTokens\": \"上下文 Token 數\",\n \"maxConcurrent\": \"最大並行數\",\n \"legacyTimeoutTitle\": \"檢測到舊版逾時欄位\",\n \"legacyTimeoutDescription\": \"目前設定仍在使用 agents.defaults.timeout。儲存本頁面時會遷移為 timeoutSeconds。\",\n \"saveSuccess\": \"Agents 設定已儲存\",\n \"saveFailed\": \"儲存 Agents 設定失敗\",\n \"loadFailed\": \"讀取 Agents 設定失敗\"\n },\n \"health\": {\n \"title\": \"檢測到 OpenClaw 設定警告\",\n \"invalidToolsProfile\": \"tools.profile 使用了不受支援的值。OpenClaw 目前只支援 minimal、coding、messaging、full。\",\n \"legacyTimeout\": \"agents.defaults.timeout 已廢棄。開啟並儲存 Agents 面板即可遷移至 timeoutSeconds。\",\n \"stringifiedEnvVars\": \"env.vars 應為物件,但目前值看起來像被字串化或已損壞。\",\n \"stringifiedShellEnv\": \"env.shellEnv 應為物件,但目前值看起來像被字串化或已損壞。\",\n \"parseFailed\": \"openclaw.json 不是合法 JSON5。請先修復檔案,再透過這裡編輯。\"\n },\n \"primaryModel\": \"預設模型\",\n \"fallbackModel\": \"備用模型\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API 端點\",\n \"baseUrlHint\": \"供應商的 API 端點位址。\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"只能使用小寫字母、數字和連字號。用作 config.yaml 中的供應商名稱。\",\n \"providerKeyLockedHint\": \"該供應商已新增至 Hermes 設定中,標識不可修改。\",\n \"providerKeyRequired\": \"供應商標識不能為空\",\n \"providerKeyInvalid\": \"供應商標識只能包含小寫字母、數字和連字號\",\n \"providerKeyDuplicate\": \"該供應商標識已存在\",\n \"apiMode\": \"API 模式\",\n \"apiModeHint\": \"供應商 API 協定。請根據端點選擇正確的協定。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API 端點不能為空\",\n \"baseUrlScheme\": \"請使用 http:// 或 https:// 開頭的位址\",\n \"baseUrlInvalid\": \"API 端點不是有效的 URL\",\n \"models\": \"模型清單\",\n \"addModel\": \"新增模型\",\n \"noModels\": \"暫無模型設定。切換至此供應商時將不會更新預設模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"顯示名稱\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"上下文長度\",\n \"advancedOptions\": \"進階選項\",\n \"modelsHint\": \"切換至此供應商時,第一個模型會寫入頂層 model.default。\",\n \"primaryModel\": \"預設模型\",\n \"fallbackModel\": \"備用模型\",\n \"providerAdvanced\": \"供應商進階選項\",\n \"rateLimitDelay\": \"請求間隔(秒)\",\n \"rateLimitDelayHint\": \"連續請求間的最小間隔秒數(選填)。留空表示無限制。\"\n },\n \"webui\": {\n \"open\": \"開啟 Hermes Web UI\",\n \"offline\": \"Hermes Web UI 未啟動,請先執行 `hermes dashboard` 啟動服務。\",\n \"openFailed\": \"開啟 Hermes Web UI 失敗\",\n \"launchConfirmTitle\": \"Hermes Dashboard 未啟動\",\n \"launchConfirmMessage\": \"是否開啟終端機並執行 `hermes dashboard` 啟動服務?\\n\\n啟動完成後會自動開啟瀏覽器。\\n\\n若終端機提示找不到 hermes 或缺少 web 相依套件,請先執行:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"開啟終端機並啟動\",\n \"launching\": \"已在終端機啟動 hermes dashboard\",\n \"launchFailed\": \"開啟終端機失敗\"\n },\n \"memory\": {\n \"title\": \"記憶管理\",\n \"agentTab\": \"Agent 記憶 (MEMORY.md)\",\n \"userTab\": \"使用者畫像 (USER.md)\",\n \"usage\": \"已用 {{current}} / {{limit}} 字元\",\n \"overLimit\": \"已超過上限,Hermes 下次載入時會截斷\",\n \"enableOn\": \"已啟用\",\n \"enableOff\": \"已停用\",\n \"disabledHint\": \"在重新啟用前 Hermes 會跳過此記憶\",\n \"toggleFailed\": \"切換記憶狀態失敗\",\n \"saveSuccess\": \"記憶已儲存\",\n \"saveFailed\": \"儲存記憶失敗\",\n \"loadFailed\": \"讀取記憶檔案失敗\",\n \"openConfig\": \"在 Hermes Web UI 調整上限\",\n \"runtimeNote\": \"變更將在 Hermes 下次啟動或建立新工作階段時生效。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"檢測到系統環境變數衝突\",\n \"description\": \"發現 {{count}} 個環境變數可能會覆寫您的設定\"\n },\n \"actions\": {\n \"expand\": \"查看詳情\",\n \"collapse\": \"收起\",\n \"selectAll\": \"全選\",\n \"clearSelection\": \"取消選擇\",\n \"deleteSelected\": \"刪除選取 ({{count}})\",\n \"deleting\": \"刪除中...\"\n },\n \"field\": {\n \"value\": \"值\",\n \"source\": \"來源\"\n },\n \"source\": {\n \"userRegistry\": \"使用者環境變數 (登錄檔)\",\n \"systemRegistry\": \"系統環境變數 (登錄檔)\",\n \"systemEnv\": \"系統環境變數\"\n },\n \"delete\": {\n \"success\": \"環境變數已成功刪除\",\n \"error\": \"刪除環境變數失敗\"\n },\n \"backup\": {\n \"location\": \"備份位置:{{path}}\"\n },\n \"confirm\": {\n \"title\": \"確認刪除環境變數\",\n \"message\": \"確定要刪除 {{count}} 個環境變數嗎?\",\n \"backupNotice\": \"刪除前將自動備份,您可以稍後還原。刪除後需要重新啟動應用程式或終端機才能生效。\",\n \"confirm\": \"確認刪除\"\n },\n \"error\": {\n \"noSelection\": \"請選擇要刪除的環境變數\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"從熱門的儲存庫發現並安裝技能,擴充 Claude Code/Codex/Gemini 的能力\",\n \"refresh\": \"重新整理\",\n \"refreshing\": \"重新整理中...\",\n \"repoManager\": \"儲存庫管理\",\n \"count\": \"共 {{count}} 個技能\",\n \"empty\": \"暫無可用技能\",\n \"emptyDescription\": \"新增技能儲存庫以發現可用的技能\",\n \"addRepo\": \"新增技能儲存庫\",\n \"loading\": \"載入中...\",\n \"installed\": \"已安裝\",\n \"install\": \"安裝\",\n \"installing\": \"安裝中...\",\n \"uninstall\": \"解除安裝\",\n \"uninstalling\": \"解除安裝中...\",\n \"view\": \"檢視\",\n \"noDescription\": \"暫無描述\",\n \"loadFailed\": \"載入失敗\",\n \"installSuccess\": \"技能 {{name}} 已安裝\",\n \"installFailed\": \"安裝失敗\",\n \"uninstallSuccess\": \"技能 {{name}} 已解除安裝\",\n \"uninstallFailed\": \"解除安裝失敗\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"可更新\",\n \"updateSuccess\": \"技能 {{name}} 已更新至最新版本\",\n \"updateFailed\": \"更新失敗\",\n \"checkUpdates\": \"檢查更新\",\n \"checkingUpdates\": \"檢查中...\",\n \"noUpdates\": \"所有技能已是最新版本\",\n \"updatesFound\": \"發現 {{count}} 個技能有可用更新\",\n \"updateAll\": \"全部更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"已成功更新 {{count}} 個技能\",\n \"error\": {\n \"skillNotFound\": \"技能不存在:{{directory}}\",\n \"missingRepoInfo\": \"缺少儲存庫資訊(owner 或 name)\",\n \"downloadTimeout\": \"下載儲存庫 {{owner}}/{{name}} 逾時({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"請檢查網路連線或稍後重試\",\n \"skillPathNotFound\": \"儲存庫 {{owner}}/{{name}} 中未找到技能路徑 '{{path}}'\",\n \"skillDirNotFound\": \"技能目錄不存在:{{path}}\",\n \"directoryConflict\": \"技能目錄 '{{directory}}' 已被 {{existing_repo}} 佔用,無法從 {{new_repo}} 安裝\",\n \"emptyArchive\": \"下載的壓縮檔為空\",\n \"downloadFailed\": \"下載失敗:HTTP {{status}}\",\n \"allBranchesFailed\": \"所有分支下載失敗,嘗試了:{{branches}}\",\n \"httpError\": \"HTTP 錯誤 {{status}}\",\n \"http403\": \"GitHub 存取受限,可能是請求頻率過高\",\n \"http404\": \"儲存庫或分支不存在,請檢查位址\",\n \"http429\": \"請求過於頻繁,請等待後重試\",\n \"parseMetadataFailed\": \"解析技能中繼資料失敗\",\n \"getHomeDirFailed\": \"無法取得使用者主目錄\",\n \"noSkillsInZip\": \"ZIP 檔案中未找到技能(需包含 SKILL.md 檔案)\",\n \"networkError\": \"網路錯誤\",\n \"fsError\": \"檔案系統錯誤\",\n \"unknownError\": \"未知錯誤\",\n \"suggestion\": {\n \"checkNetwork\": \"請檢查網路連線\",\n \"checkProxy\": \"建議設定 HTTP 代理伺服器\",\n \"retryLater\": \"請稍後重試\",\n \"checkRepoUrl\": \"請檢查儲存庫位址和分支名稱\",\n \"checkDiskSpace\": \"請檢查磁碟空間\",\n \"checkPermission\": \"請檢查目錄權限\",\n \"uninstallFirst\": \"請先解除安裝已安裝的同名技能\",\n \"checkZipContent\": \"請確認 ZIP 檔案包含有效的技能目錄(含 SKILL.md 檔案)\"\n }\n },\n \"repo\": {\n \"title\": \"管理技能儲存庫\",\n \"description\": \"新增或刪除 GitHub 技能儲存庫來源\",\n \"url\": \"儲存庫 URL\",\n \"urlPlaceholder\": \"owner/name 或 https://github.com/owner/name\",\n \"branch\": \"分支\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"技能路徑\",\n \"pathPlaceholder\": \"skills (選填,留空掃描根目錄)\",\n \"add\": \"新增儲存庫\",\n \"list\": \"已新增的儲存庫\",\n \"empty\": \"暫無儲存庫\",\n \"invalidUrl\": \"無效的儲存庫 URL 格式\",\n \"addSuccess\": \"儲存庫 {{owner}}/{{name}} 已新增,識別到 {{count}} 個技能\",\n \"addFailed\": \"新增失敗\",\n \"removeSuccess\": \"儲存庫 {{owner}}/{{name}} 已刪除\",\n \"removeFailed\": \"刪除失敗\",\n \"skillCount\": \"識別到 {{count}} 個技能\"\n },\n \"search\": \"搜尋技能\",\n \"searchPlaceholder\": \"搜尋技能名稱或儲存庫名稱...\",\n \"searchSource\": {\n \"repos\": \"儲存庫\",\n \"skillssh\": \"skills.sh\",\n \"all\": \"全部\",\n \"leaderboardAllTime\": \"全站總榜\",\n \"leaderboardTrending\": \"24h 趨勢\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"搜尋 skills.sh(至少 2 個字元)...\",\n \"installs\": \"{{count}} 次安裝\",\n \"loadMore\": \"載入更多\",\n \"loading\": \"正在搜尋 skills.sh...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相關技能\",\n \"error\": \"搜尋 skills.sh 失敗\",\n \"poweredBy\": \"由 skills.sh 提供\"\n },\n \"filter\": {\n \"placeholder\": \"狀態篩選\",\n \"all\": \"全部\",\n \"installed\": \"已安裝\",\n \"uninstalled\": \"未安裝\",\n \"repo\": \"儲存庫篩選\",\n \"allRepos\": \"全部儲存庫\"\n },\n \"noResults\": \"未找到相符的技能\",\n \"noInstalled\": \"暫無已安裝的技能\",\n \"noInstalledDescription\": \"從儲存庫發現並安裝技能,或匯入已有的技能\",\n \"discover\": \"發現技能\",\n \"import\": \"匯入已有\",\n \"importDescription\": \"選擇要匯入至 OpenSunstar 統一管理的技能\",\n \"importSuccess\": \"成功匯入 {{count}} 個技能\",\n \"importSelected\": \"匯入已選 ({{count}})\",\n \"noUnmanagedFound\": \"未發現需要匯入的技能。所有技能已在 OpenSunstar 統一管理中。\",\n \"foundIn\": \"發現於\",\n \"local\": \"本地\",\n \"uninstallConfirm\": \"確定要解除安裝技能 \\\"{{name}}\\\" 嗎?這將從所有應用程式中移除該技能,並在刪除前自動建立本地備份。\",\n \"uninstallInMainPanel\": \"請在主面板中解除安裝技能\",\n \"notFound\": \"未找到技能\",\n \"backup\": {\n \"location\": \"備份位置:{{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"從備份中還原\",\n \"title\": \"從備份中還原\",\n \"description\": \"選擇一個 Skills 備份,將檔案還原至本地並重新加入目前清單。\",\n \"empty\": \"暫無可還原的 Skills 備份\",\n \"createdAt\": \"備份時間\",\n \"path\": \"備份路徑\",\n \"restore\": \"還原\",\n \"restoring\": \"還原中...\",\n \"delete\": \"刪除\",\n \"deleting\": \"刪除中...\",\n \"deleteSuccess\": \"技能備份 {{name}} 已刪除\",\n \"deleteFailed\": \"刪除技能備份失敗\",\n \"deleteConfirmTitle\": \"確認刪除備份\",\n \"deleteConfirmMessage\": \"確定要刪除技能備份 \\\"{{name}}\\\" 嗎?此操作無法復原。\",\n \"success\": \"技能 {{name}} 已從備份還原\",\n \"failed\": \"從備份還原失敗\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"從 ZIP 安裝\",\n \"installing\": \"安裝中...\",\n \"successSingle\": \"技能 {{name}} 已安裝\",\n \"successMultiple\": \"成功安裝 {{count}} 個技能\",\n \"noSkillsFound\": \"ZIP 檔案中未找到技能(需包含 SKILL.md 檔案)\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全站總榜\",\n \"trendingTitle\": \"24h 趨勢\",\n \"allTimeDesc\": \"與 skills.sh 官網 All Time 排行榜 TOP50 對齊(歷史總安裝量)\",\n \"trendingDesc\": \"與 skills.sh 官網 Trending (24h) 排行榜 TOP50 對齊\",\n \"syncedAt\": \"同步於 {{time}}\",\n \"fromCache\": \"本地緩存\",\n \"registryTotal\": \"全站累計 {{count}} 次安裝\",\n \"loading\": \"正在同步 skills.sh 官方排行榜…\",\n \"error\": \"無法同步 skills.sh 官方排行榜\",\n \"empty\": \"暫無排行榜數據\",\n \"syncPolicy\": \"非實時數據 · 默認每 {{hours}} 小時從 skills.sh 同步 · 點擊刷新可立即更新\",\n \"nextSyncAt\": \"下次自動同步約 {{time}}\",\n \"refreshNow\": \"立即從 skills.sh 同步\",\n \"pageRange\": \"{{range}} · 第 {{page}}/{{totalPages}} 頁(共 {{total}} 條)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"輸入關鍵詞搜索所有來源(倉庫 / skills.sh / ClawHub)...\",\n \"searching\": \"正在搜索多個來源...\",\n \"typeToSearch\": \"輸入關鍵詞搜索 skills.sh 和 ClawHub 技能\",\n \"typeToSearchMore\": \"輸入關鍵詞可搜索更多來源\",\n \"mergedCount\": \"共 {{total}} 個結果\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"搜索 ClawHub(至少 2 個字符)...\",\n \"loading\": \"正在搜索 ClawHub...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相關技能\",\n \"resultCount\": \"共 {{count}} 個結果\",\n \"poweredBy\": \"由 ClawHub 提供\",\n \"installViaCli\": \"ClawHub 技能請通過 CLI 安裝\",\n \"installSuccess\": \"{{slug}} 安裝成功\",\n \"installFailed\": \"ClawHub 技能安裝失敗\",\n \"installing\": \"正在安裝...\"\n },\n \"batchUninstall\": \"卸載\",\n \"batchUninstallTitle\": \"批量卸載\",\n \"batchUninstallConfirm\": \"確定要卸載 {{count}} 個技能嗎?\",\n \"batchUninstallSuccess\": \"成功卸載 {{count}} 個技能\",\n \"batchUninstallPartial\": \"卸載完成:{{success}} 成功,{{fail}} 失敗\"\n },\n \"deeplink\": {\n \"confirmImport\": \"確認匯入供應商設定\",\n \"confirmImportDescription\": \"以下設定將匯入至 OpenSunstar\",\n \"importPrompt\": \"匯入提示詞\",\n \"importPromptDescription\": \"請確認是否匯入此系統提示詞\",\n \"importMcp\": \"匯入 MCP Servers\",\n \"importMcpDescription\": \"請確認是否匯入這些 MCP Servers\",\n \"importSkill\": \"新增 Skill 儲存庫\",\n \"importSkillDescription\": \"請確認是否新增此 Skill 儲存庫\",\n \"promptImportSuccess\": \"提示詞匯入成功\",\n \"promptImportSuccessDescription\": \"已匯入提示詞:{{name}}\",\n \"mcpImportSuccess\": \"MCP Servers 匯入成功\",\n \"mcpImportSuccessDescription\": \"成功匯入 {{count}} 個伺服器\",\n \"mcpPartialSuccess\": \"部分匯入成功\",\n \"mcpPartialSuccessDescription\": \"成功:{{success}},失敗:{{failed}}\",\n \"skillImportSuccess\": \"Skill 儲存庫新增成功\",\n \"skillImportSuccessDescription\": \"已新增儲存庫:{{repo}}\",\n \"app\": \"應用程式類型\",\n \"providerName\": \"供應商名稱\",\n \"homepage\": \"官網位址\",\n \"endpoint\": \"API 端點\",\n \"apiKey\": \"API 金鑰\",\n \"icon\": \"圖示\",\n \"model\": \"模型\",\n \"haikuModel\": \"Haiku 模型\",\n \"sonnetModel\": \"Sonnet 模型\",\n \"opusModel\": \"Opus 模型\",\n \"multiModel\": \"多模態模型\",\n \"notes\": \"備註\",\n \"import\": \"匯入\",\n \"importing\": \"匯入中...\",\n \"warning\": \"請確認以上資訊準確無誤後再匯入。匯入後可在供應商清單中編輯或刪除。\",\n \"parseError\": \"深層連結解析失敗\",\n \"importSuccess\": \"匯入成功\",\n \"importSuccessDescription\": \"供應商 \\\"{{name}}\\\" 已成功匯入\",\n \"importError\": \"匯入失敗\",\n \"configSource\": \"設定來源\",\n \"configEmbedded\": \"內嵌設定\",\n \"configRemote\": \"遠端設定\",\n \"configDetails\": \"設定詳情\",\n \"configUrl\": \"設定檔 URL\",\n \"configMergeError\": \"合併設定檔失敗\",\n \"primaryEndpoint\": \"主\",\n \"mcp\": {\n \"title\": \"批次匯入 MCP Servers\",\n \"targetApps\": \"目標應用程式\",\n \"serverCount\": \"MCP Servers ({{count}} 個)\",\n \"enabledWarning\": \"匯入後將立即寫入所有指定應用程式的設定檔\"\n },\n \"prompt\": {\n \"title\": \"匯入系統提示詞\",\n \"app\": \"應用程式\",\n \"name\": \"名稱\",\n \"description\": \"描述\",\n \"contentPreview\": \"內容預覽\",\n \"enabledWarning\": \"匯入後將立即啟用此提示詞,其他提示詞將被停用\"\n },\n \"skill\": {\n \"title\": \"新增 Claude Skill 儲存庫\",\n \"repo\": \"GitHub 儲存庫\",\n \"directory\": \"目標目錄\",\n \"branch\": \"分支\",\n \"skillsPath\": \"Skills 路徑\",\n \"hint\": \"此操作將新增 Skill 儲存庫至清單。\",\n \"hintDetail\": \"新增後,您可以在 Skills 管理介面中選擇安裝具體的 Skill。\"\n },\n \"usageScript\": \"用量查詢\",\n \"usageScriptEnabled\": \"已啟用\",\n \"usageScriptDisabled\": \"未啟用\",\n \"usageApiKey\": \"用量 API Key\",\n \"usageBaseUrl\": \"用量查詢位址\",\n \"usageAutoInterval\": \"自動查詢\",\n \"usageAutoIntervalValue\": \"每 {{minutes}} 分鐘\"\n },\n \"iconPicker\": {\n \"search\": \"搜尋圖示\",\n \"searchPlaceholder\": \"輸入圖示名稱...\",\n \"noResults\": \"未找到相符的圖示\",\n \"category\": {\n \"aiProvider\": \"AI 服務商\",\n \"cloud\": \"雲端平台\",\n \"tool\": \"開發工具\",\n \"other\": \"其他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"圖示\",\n \"colorLabel\": \"圖示顏色\",\n \"selectIcon\": \"選擇圖示\",\n \"preview\": \"預覽\",\n \"clickToChange\": \"點擊更換圖示\",\n \"clickToSelect\": \"點擊選擇圖示\",\n \"color\": \"圖示顏色\"\n },\n \"migration\": {\n \"success\": \"設定遷移成功\",\n \"skillsSuccess\": \"已自動匯入 {{count}} 個技能至統一管理\",\n \"skillsFailed\": \"自動匯入技能失敗\",\n \"skillsFailedDescription\": \"請開啟 Skills 頁面點擊「匯入現有」手動匯入(或重新啟動後再試)。\"\n },\n \"agents\": {\n \"title\": \"Agent\",\n \"subtitle\": \"同步到 Claude / Gemini / OpenCode 的 agents 目錄(Markdown)\",\n \"empty\": \"暫無 Subagent\",\n \"emptyHint\": \"創建自定義 Subagent 並同步到 ~/.claude/agents/ 等目錄\",\n \"add\": \"添加 Subagent\",\n \"edit\": \"編輯 Subagent\",\n \"count\": \"共 {{count}} 個 Subagent\",\n \"loadFailed\": \"加載 Subagent 失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"geminiHint\": \"Gemini 需在 settings.json 中開啟 experimental.enableSubagents 後生效\",\n \"codexHint\": \"已轉換為 TOML 並寫入 ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"暫不支持文件同步\"\n },\n \"confirm\": {\n \"deleteTitle\": \"刪除 Subagent\",\n \"deleteMessage\": \"確定刪除 Subagent \\\"{{name}}\\\"?已同步的文件將被清理。\"\n },\n \"form\": {\n \"name\": \"名稱\",\n \"description\": \"描述\",\n \"content\": \"定義(Markdown + YAML frontmatter)\",\n \"syncTargets\": \"同步到\",\n \"geminiNote\": \"Gemini 需在 settings.json 開啟 experimental.enableSubagents\",\n \"codexNote\": \"Codex 將自動把 Markdown 轉為 TOML 寫入 ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"測試模型\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"降級\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"斷路\",\n \"consecutiveFailures\": \"連續失敗 {{count}} 次\",\n \"title\": \"配置狀態\",\n \"allClear\": \"所有項目 AI 配置狀態正常。\",\n \"scan\": \"重複檢測\",\n \"subtitle\": \"檢測同名項目與重複路徑,識別可能的冗餘添加\",\n \"noDuplicates\": \"未發現重複項目\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"需關注\",\n \"alert\": \"異常\",\n \"unconfigured\": \"尚未配置\",\n \"unmanaged\": \"未納管\",\n \"unscanned\": \"未掃描\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 處配置與預期不一致\",\n \"unscanned\": \"尚未完成 AI 配置狀態掃描\",\n \"unmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"unconfigured\": \"尚未透過 OpenSunstar 關聯任何 AI 資產\",\n \"gaps\": \"待補齊:{{items}}\",\n \"detectedOnly\": \"{{items}} — 發現配置文件但未納入管理\",\n \"globalOnly\": \"{{items}} — 使用全局預設配置\",\n \"noMcp\": \"未關聯 MCP 伺服器\",\n \"noSkills\": \"未配置 Skills\",\n \"noPrompts\": \"未關聯 Prompts\"\n },\n \"action\": {\n \"repair\": \"修復漂移\",\n \"inspectDetail\": \"查看詳情\",\n \"configure\": \"配置資產\",\n \"setup\": \"去配置\",\n \"adopt\": \"納入管理\",\n \"inspect\": \"查看項目\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} 故障轉移已啟用\",\n \"disabled\": \"{{app}} 故障轉移已關閉\",\n \"toggleFailed\": \"操作失敗:{{detail}}\",\n \"inQueue\": \"已加入\",\n \"addQueue\": \"加入\",\n \"priority\": {\n \"tooltip\": \"故障轉移優先順序 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} 故障轉移已啟用\\n按佇列優先順序(P1→P2→...)選擇供應商\",\n \"disabled\": \"啟用 {{app}} 故障轉移\\n將立即切換至佇列 P1,並在失敗時自動切換至下一個\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"服務位址\",\n \"addressCopied\": \"位址已複製\",\n \"currentProvider\": \"目前 Provider:\",\n \"waitingFirstRequest\": \"目前 Provider:等待首次請求...\",\n \"stoppedTitle\": \"路由服務已停止\",\n \"stoppedDescription\": \"使用上方開關即可啟動服務\",\n \"openSettings\": \"設定路由服務\",\n \"stats\": {\n \"activeConnections\": \"活躍連線\",\n \"totalRequests\": \"總請求數\",\n \"successRate\": \"成功率\",\n \"uptime\": \"運作時間\"\n }\n },\n \"settings\": {\n \"title\": \"路由服務設定\",\n \"description\": \"設定本地路由伺服器的監聽位址、連接埠和執行參數,儲存後立即生效。\",\n \"alert\": {\n \"autoApply\": \"儲存後將自動同步至正在執行的路由服務,無需手動重新啟動。\"\n },\n \"basic\": {\n \"title\": \"基礎設定\",\n \"description\": \"設定路由服務監聽的位址與連接埠。\"\n },\n \"advanced\": {\n \"title\": \"進階參數\",\n \"description\": \"控制請求的穩定性和日誌紀錄。\"\n },\n \"timeout\": {\n \"title\": \"逾時設定\",\n \"description\": \"設定串流和非串流請求的逾時時間。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"監聽位址\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"路由伺服器監聽的 IP 位址(推薦 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"監聽連接埠\",\n \"placeholder\": \"15721\",\n \"description\": \"路由伺服器監聽的連接埠號(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大重試次數\",\n \"placeholder\": \"3\",\n \"description\": \"請求失敗時的重試次數(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"請求逾時(秒)\",\n \"placeholder\": \"0(不限)或 300\",\n \"description\": \"單個請求的最大等待時間(0 表示不限制,或設定 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"啟用日誌紀錄\",\n \"description\": \"紀錄所有路由請求,便於排查問題\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"串流首位元組逾時(秒)\",\n \"description\": \"等待首個資料區塊的最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"串流閒置逾時(秒)\",\n \"description\": \"資料區塊之間的最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非串流逾時(秒)\",\n \"description\": \"非串流請求的總逾時時間\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"請輸入有效的 IP 位址\",\n \"portMin\": \"連接埠必須大於 1024\",\n \"portMax\": \"連接埠必須小於 65535\",\n \"retryMin\": \"重試次數不能為負\",\n \"retryMax\": \"重試次數不能超過 10\",\n \"timeoutNonNegative\": \"逾時時間不能為負數\",\n \"timeoutMax\": \"逾時時間最多 600 秒\",\n \"timeoutRange\": \"請輸入 0 或 10-600 之間的數值\",\n \"streamingTimeoutMin\": \"逾時時間至少 5 秒\",\n \"streamingTimeoutMax\": \"逾時時間最多 300 秒\"\n },\n \"actions\": {\n \"save\": \"儲存設定\"\n },\n \"toast\": {\n \"saved\": \"路由設定已儲存\",\n \"saveFailed\": \"儲存失敗:{{error}}\"\n },\n \"invalidPort\": \"連接埠無效,請輸入 1024-65535 之間的數字\",\n \"invalidAddress\": \"位址無效,請輸入 IPv4(如 127.0.0.1)、IPv6(如 ::1)或 localhost\",\n \"configSaved\": \"路由設定已儲存\",\n \"configSaveFailed\": \"儲存設定失敗\",\n \"restartRequired\": \"修改位址或連接埠後需要重新啟動路由服務才能生效\"\n },\n \"switchFailed\": \"切換失敗:{{error}}\",\n \"takeover\": {\n \"hint\": \"選擇要路由的應用程式,啟用後該應用程式的請求將透過本地路由轉發\",\n \"enabled\": \"{{app}} 路由已啟用\",\n \"disabled\": \"{{app}} 路由已關閉\",\n \"failed\": \"切換路由狀態失敗:{{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} 路由中 - {{address}}:{{port}}\\n切換該應用程式供應商為熱切換\",\n \"broken\": \"{{appLabel}} 路由中,但路由服務未執行\",\n \"inactive\": \"路由 {{appLabel}} 的請求,讓該應用程式請求走本地路由\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"需要先啟動路由服務才能設定故障轉移\",\n \"autoSwitch\": \"自動故障轉移\",\n \"autoSwitchDescription\": \"開啟後將立即切換至佇列 P1,並在請求失敗時自動切換至佇列中的下一個供應商\"\n },\n \"failoverQueue\": {\n \"title\": \"故障轉移佇列\",\n \"description\": \"管理各應用程式的供應商故障轉移順序\",\n \"info\": \"啟用自動故障轉移後,將按佇列優先順序選擇供應商(P1 優先)。當請求失敗時,系統會按佇列順序依次嘗試下一個供應商。\",\n \"selectProvider\": \"選擇供應商新增至佇列\",\n \"noAvailableProviders\": \"沒有可新增的供應商\",\n \"empty\": \"故障轉移佇列為空。新增供應商以啟用自動故障轉移。\",\n \"orderHint\": \"佇列順序與首頁供應商清單順序一致,可在首頁拖曳調整順序。\",\n \"dragHint\": \"拖曳供應商可調整故障轉移順序,序號越小優先順序越高。\",\n \"toggleEnabled\": \"啟用/停用\",\n \"addSuccess\": \"已新增至故障轉移佇列\",\n \"addFailed\": \"新增失敗\",\n \"removeSuccess\": \"已從故障轉移佇列移除\",\n \"removeFailed\": \"移除失敗\",\n \"reorderSuccess\": \"佇列順序已更新\",\n \"reorderFailed\": \"更新順序失敗\",\n \"toggleFailed\": \"狀態更新失敗\"\n },\n \"autoFailover\": {\n \"info\": \"當故障轉移佇列中設定了多個供應商時,系統會在請求失敗時按優先順序依次嘗試。當某個供應商連續失敗達到閾值時,斷路器會打開並在一段時間內跳過該供應商。\",\n \"configSaved\": \"自動故障轉移設定已儲存\",\n \"configSaveFailed\": \"儲存失敗\",\n \"validationFailed\": \"以下欄位超出有效範圍:{{fields}}\",\n \"retrySettings\": \"重試與逾時設定\",\n \"failureThreshold\": \"失敗閾值\",\n \"failureThresholdHint\": \"連續失敗多少次後打開斷路器(建議:3-10)\",\n \"timeout\": \"恢復等待時間(秒)\",\n \"timeoutHint\": \"斷路器打開後,等待多久後嘗試恢復(建議:30-120)\",\n \"circuitBreakerSettings\": \"斷路器設定\",\n \"successThreshold\": \"恢復成功閾值\",\n \"successThresholdHint\": \"半開狀態下成功多少次後關閉斷路器\",\n \"errorRate\": \"錯誤率閾值 (%)\",\n \"errorRateHint\": \"錯誤率超過此值時打開斷路器\",\n \"minRequests\": \"最小請求數\",\n \"minRequestsHint\": \"計算錯誤率前的最小請求數\",\n \"explanationTitle\": \"運作原理\",\n \"failureThresholdLabel\": \"失敗閾值\",\n \"failureThresholdExplain\": \"連續失敗達到此次數時,斷路器打開,該供應商暫時不可用\",\n \"timeoutLabel\": \"恢復等待時間\",\n \"timeoutExplain\": \"斷路器打開後,等待此時間後嘗試半開狀態\",\n \"successThresholdLabel\": \"恢復成功閾值\",\n \"successThresholdExplain\": \"半開狀態下,成功達到此次數時關閉斷路器,供應商恢復可用\",\n \"errorRateLabel\": \"錯誤率閾值\",\n \"errorRateExplain\": \"錯誤率超過此值時,即使未達到失敗閾值也會打開斷路器\",\n \"maxRetries\": \"最大重試次數\",\n \"timeoutSettings\": \"逾時設定\",\n \"streamingFirstByte\": \"串流首位元組逾時\",\n \"streamingIdle\": \"串流閒置逾時\",\n \"nonStreaming\": \"非串流逾時\",\n \"maxRetriesHint\": \"請求失敗時的重試次數(0-10)\",\n \"streamingFirstByteHint\": \"等待首個資料區塊的最大時間,範圍 1-120 秒,預設 60 秒\",\n \"streamingIdleHint\": \"資料區塊之間的最大間隔,範圍 60-600 秒,填 0 停用(防止中途卡住)\",\n \"nonStreamingHint\": \"非串流請求的總逾時時間,範圍 60-1200 秒,預設 600 秒(10 分鐘)\"\n },\n \"logging\": {\n \"enabled\": \"日誌紀錄已啟用\",\n \"disabled\": \"日誌紀錄已關閉\",\n \"failed\": \"切換日誌狀態失敗\"\n },\n \"server\": {\n \"started\": \"路由服務已啟動 - {{address}}:{{port}}\",\n \"startFailed\": \"啟動路由服務失敗:{{detail}}\"\n },\n \"stoppedWithRestore\": \"路由服務已關閉,已還原所有路由設定\",\n \"stopWithRestoreFailed\": \"停止失敗:{{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"健康檢測設定已儲存\",\n \"configSaveFailed\": \"儲存失敗\",\n \"testModels\": \"測試模型\",\n \"claudeModel\": \"Claude 模型\",\n \"codexModel\": \"Codex 模型\",\n \"geminiModel\": \"Gemini 模型\",\n \"checkParams\": \"檢查參數\",\n \"timeout\": \"逾時時間(秒)\",\n \"maxRetries\": \"最大重試次數\",\n \"degradedThreshold\": \"降級閾值(毫秒)\",\n \"testPrompt\": \"檢查提示詞\",\n \"operational\": \"{{providerName}} 執行正常 ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} 回應較慢 ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} 檢查失敗:{{message}}\",\n \"rejected\": \"{{providerName}} 檢查被拒:{{message}}\",\n \"error\": \"{{providerName}} 檢查出錯:{{error}}\",\n \"modelNotFound\": \"{{providerName}} 測試模型 {{model}} 不存在或已下架\",\n \"modelNotFoundHint\": \"該模型可能已被供應商棄用。請在「模型測試設定」中更新預設測試模型。\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan 額度已用盡\",\n \"quotaExceededHint\": \"百度千帆回傳了 Coding Plan 超額錯誤。請等待 5 小時 / 每週 / 每月額度重新整理,或在千帆控制台切換方案。\",\n \"httpHint\": {\n \"400\": \"供應商拒絕了請求格式。健康檢測的探測格式可能與實際使用不同。\",\n \"401\": \"API Key 可能無效,或供應商使用 OAuth 等驗證方式。檢查失敗不代表實際不可用。\",\n \"402\": \"帳號配額或計費問題。\",\n \"403\": \"供應商拒絕了此請求。部分供應商會驗證用戶端身分,檢查失敗但實際使用可能正常。\",\n \"404\": \"API 位址不存在,請檢查 Base URL 和 API 路徑。\",\n \"429\": \"請求頻率過高,請稍後重試。\",\n \"5xx\": \"供應商內部錯誤,通常是臨時問題。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"路由總開關\",\n \"appTakeover\": \"路由啟用\",\n \"perAppConfig\": \"應用程式設定\",\n \"circuitBreaker\": \"斷路器設定\",\n \"circuitBreakerSettings\": \"斷路器設定\",\n \"failureThreshold\": \"失敗閾值\",\n \"successThreshold\": \"恢復閾值\",\n \"recoveryTimeout\": \"恢復等待時間\",\n \"errorRateThreshold\": \"錯誤率閾值\",\n \"minRequests\": \"最小請求數\",\n \"timeoutConfig\": \"逾時設定\",\n \"streamingFirstByte\": \"串流首位元組逾時\",\n \"streamingIdle\": \"串流閒置逾時\",\n \"nonStreaming\": \"非串流逾時\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾值\",\n \"successThreshold\": \"成功閾值\",\n \"timeoutSeconds\": \"逾時時間(秒)\",\n \"errorRateThreshold\": \"錯誤率閾值 (%)\",\n \"minRequests\": \"最小請求數\",\n \"validationFailed\": \"以下欄位超出有效範圍:{{fields}}\",\n \"configSaved\": \"斷路器設定已儲存\",\n \"saveFailed\": \"儲存失敗\",\n \"loading\": \"載入中...\",\n \"title\": \"斷路器設定\",\n \"description\": \"調整斷路器參數以控制故障檢測和恢復行為\",\n \"failureThresholdHint\": \"連續失敗多少次後打開斷路器\",\n \"timeoutSecondsHint\": \"斷路器打開後多久嘗試恢復(半開狀態)\",\n \"successThresholdHint\": \"半開狀態下成功多少次後關閉斷路器\",\n \"errorRateThresholdHint\": \"錯誤率超過此值時打開斷路器\",\n \"minRequestsHint\": \"計算錯誤率前的最小請求數\",\n \"saveConfig\": \"儲存設定\",\n \"instructionsTitle\": \"設定說明\",\n \"instructions\": {\n \"failureThreshold\": \"連續失敗達到此次數時,斷路器打開\",\n \"timeout\": \"斷路器打開後,等待此時間後嘗試半開\",\n \"successThreshold\": \"半開狀態下,成功達到此次數時關閉斷路器\",\n \"errorRate\": \"錯誤率超過此值時,斷路器打開\",\n \"minRequests\": \"只有請求數達到此值後才計算錯誤率\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"通用供應商已複製並同步\",\n \"duplicateError\": \"複製通用供應商失敗\",\n \"title\": \"通用供應商\",\n \"description\": \"通用供應商可以同時管理 Claude、Codex 和 Gemini 的設定。修改後會自動同步至所有啟用的應用程式。\",\n \"add\": \"新增通用供應商\",\n \"edit\": \"編輯通用供應商\",\n \"empty\": \"還沒有通用供應商\",\n \"emptyHint\": \"點擊下方「新增通用供應商」按鈕建立一個\",\n \"selectPreset\": \"選擇預設類型\",\n \"name\": \"名稱\",\n \"namePlaceholder\": \"例如:我的 NewAPI\",\n \"baseUrl\": \"API 位址\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"官網位址\",\n \"websiteUrlPlaceholder\": \"https://example.com(選填,用於在清單中顯示)\",\n \"notes\": \"備註\",\n \"notesPlaceholder\": \"選填:加入備註資訊\",\n \"enabledApps\": \"啟用的應用程式\",\n \"modelConfig\": \"模型設定\",\n \"model\": \"模型\",\n \"sync\": \"同步至應用程式\",\n \"synced\": \"已同步至所有應用程式\",\n \"syncError\": \"同步失敗\",\n \"noAppsEnabled\": \"未啟用任何應用程式\",\n \"added\": \"通用供應商已新增\",\n \"addedAndSynced\": \"通用供應商已新增並同步\",\n \"updated\": \"通用供應商已更新\",\n \"deleted\": \"通用供應商已刪除\",\n \"addSuccess\": \"通用供應商新增成功\",\n \"addFailed\": \"通用供應商新增失敗\",\n \"hint\": \"跨應用程式通用設定,自動同步至 Claude/Codex/Gemini\",\n \"manage\": \"管理\",\n \"loadError\": \"載入通用供應商失敗\",\n \"saveError\": \"儲存通用供應商失敗\",\n \"deleteError\": \"刪除通用供應商失敗\",\n \"deleteConfirmTitle\": \"刪除通用供應商\",\n \"deleteConfirmDescription\": \"確定要刪除 \\\"{{name}}\\\" 嗎?這將同時刪除它在各應用程式中產生的供應商設定。\",\n \"syncConfirmTitle\": \"同步通用供應商\",\n \"syncConfirmDescription\": \"同步 \\\"{{name}}\\\" 將會覆寫 Claude、Codex 和 Gemini 中關聯的供應商設定。確定要繼續嗎?\",\n \"syncConfirm\": \"同步\",\n \"saveAndSync\": \"儲存並同步\",\n \"savedAndSynced\": \"已儲存並同步至所有應用程式\",\n \"saveAndSyncError\": \"儲存並同步失敗\",\n \"configJsonPreview\": \"設定 JSON 預覽\",\n \"configJsonPreviewHint\": \"以下是將要同步至各應用程式的設定內容(僅覆寫顯示的欄位,保留其他自訂設定)\"\n },\n \"omo\": {\n \"editProfile\": \"編輯 OMO 設定\",\n \"newProfile\": \"新增 OMO 設定\",\n \"profileName\": \"名稱\",\n \"mainAgents\": \"主 Agent\",\n \"subAgents\": \"子 Agent\",\n \"categories\": \"分類\",\n \"customAgents\": \"自訂 Agent\",\n \"noCustomAgents\": \"暫無自訂 Agent\",\n \"otherFields\": \"其他設定\",\n \"globalConfig\": \"OMO 全域設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"全域設定已儲存\",\n \"addProfile\": \"新增 OMO 設定\",\n \"disabledItems\": \"停用項目設定\",\n \"advanced\": \"進階設定\",\n \"profileCreated\": \"OMO 設定已建立\",\n \"profileUpdated\": \"OMO 設定已更新\",\n \"invalidJson\": \"其他欄位包含無效 JSON\",\n \"confirmDelete\": \"刪除設定\",\n \"confirmDeleteMsg\": \"確定刪除 \\\"{{name}}\\\" 嗎?\",\n \"profileDeleted\": \"設定已刪除\",\n \"imported\": \"已匯入為 \\\"{{name}}\\\"\",\n \"import\": \"匯入\",\n \"global\": \"全域\",\n \"empty\": \"暫無設定。點擊 + 新增或從本地匯入。\",\n \"applied\": \"已套用\",\n \"apply\": \"套用\",\n \"enable\": \"啟用\",\n \"enabled\": \"啟用中\",\n \"disabled\": \"OMO 已停用\",\n \"disableFailed\": \"停用 OMO 失敗:{{error}}\",\n \"selectPlaceholder\": \"請選擇...\",\n \"clear\": \"清空\",\n \"clearWrapped\": \"(清空)\",\n \"defaultWrapped\": \"(預設)\",\n \"variantPlaceholder\": \"思考等級\",\n \"selectEnabledModel\": \"選擇已設定模型\",\n \"selectModel\": \"選擇已設定模型\",\n \"recommendedHint\": \"推薦:{{model}}\",\n \"searchModel\": \"搜尋模型...\",\n \"selectModelFirst\": \"先選擇模型\",\n \"noEnabledModels\": \"暫無已設定模型\",\n \"noVariantsForModel\": \"該模型無思考等級\",\n \"currentValueNotEnabled\": \"{{value}}(目前值,未設定)\",\n \"currentValueUnavailable\": \"{{value}}(目前值,不可用)\",\n \"advancedLabel\": \"進階參數\",\n \"advancedJsonInvalid\": \"進階參數 JSON 無效\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用預設值\",\n \"noEnabledModelsWarning\": \"目前沒有可用的已設定模型,請先設定 OpenCode 模型\",\n \"modelSourcePartialWarning\": \"部分供應商模型設定無效,已自動跳過。\",\n \"modelSourceFallbackWarning\": \"讀取 live 供應商狀態失敗,已回退至已設定供應商清單。\",\n \"importLocalReplaceSuccess\": \"已從本地檔案匯入並覆寫 Agent/Category/Other Fields\",\n \"importLocalFailed\": \"讀取本地檔案失敗:{{error}}\",\n \"agentKeyPlaceholder\": \"agent 鍵名\",\n \"categoryKeyPlaceholder\": \"分類鍵名\",\n \"modelNamePlaceholder\": \"模型名\",\n \"custom\": \"自訂\",\n \"customCategories\": \"自訂分類\",\n \"modelConfiguration\": \"模型設定\",\n \"fillRecommended\": \"填入推薦\",\n \"fillRecommendedSuccess\": \"已填入 {{count}} 個推薦模型\",\n \"fillRecommendedPartial\": \"已填入 {{filled}} 個推薦模型,{{unmatched}} 個未比對成功\",\n \"fillRecommendedMostlyUnmatched\": \"僅填入 {{filled}} 個,{{unmatched}} 個未比對成功(如 {{examples}})。請設定提供這些模型的供應商,或手動選擇替代項。\",\n \"fillRecommendedAllSet\": \"所有槽位已有模型設定\",\n \"fillRecommendedNoMatch\": \"推薦模型在已設定的供應商中未找到相符項目(如 {{examples}})\",\n \"configSummary\": \"已設定 {{agents}} 個 Agent,{{categories}} 個 Category · 點擊 ⚙ 展開進階參數\",\n \"enabledModelsCount\": \"可選已設定模型 {{count}} 個\",\n \"source\": \"來源:\",\n \"otherFieldsJson\": \"其他欄位 (JSON)\",\n \"slimOtherFieldsHint\": \"OMO Slim 的 council、fallback、multiplexer、disabled_mcps、todoContinuation 等頂層設定請寫在這裡。\",\n \"searchOrType\": \"搜尋或輸入自訂值...\",\n \"noMatches\": \"無相符項目\",\n \"jsonMustBeObject\": \"{{field}} 必須是 JSON 物件\",\n \"jsonInvalid\": \"{{field}} 包含無效 JSON\",\n \"importGlobalSuccess\": \"已從本地檔案匯入全域設定(未儲存)\",\n \"importGlobalFailed\": \"讀取本地檔案失敗:{{error}}\",\n \"importLocal\": \"從本地匯入\",\n \"saveGlobalConfig\": \"儲存全域設定\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"還原預設\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"停用的 Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"停用的 MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"停用的 Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"停用的 Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"實驗性功能\",\n \"advancedBackgroundTask\": \"背景任務\",\n \"advancedBrowserAutomation\": \"瀏覽器自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"主協調器\",\n \"hephaestus\": \"自主深度工作者\",\n \"prometheus\": \"戰略規劃者\",\n \"atlas\": \"任務管理者\",\n \"oracle\": \"戰略顧問\",\n \"librarian\": \"多儲存庫研究員\",\n \"explore\": \"快速程式碼搜尋\",\n \"multimodalLooker\": \"媒體分析器\",\n \"metis\": \"規劃前分析顧問\",\n \"momus\": \"計畫審查者\",\n \"sisyphusJunior\": \"委派任務執行器\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"主協調器,負責任務規劃、委派與並行執行,使用擴充思考(32k 預算),透過 TODO 驅動工作流程確保任務完成。\",\n \"atlas\": \"主協調器(持有 TODO 清單),負責執行階段的任務分發與協調,不直接完成所有工作而是委派給專業代理。\",\n \"prometheus\": \"戰略規劃師,透過訪談模式收集需求並制定詳細工作計畫,僅能在 .sisyphus/ 目錄讀寫 Markdown 檔案,從不直接寫程式碼。\",\n \"hephaestus\": \"自主深度工作者(「合法工匠」),受 AmpCode 深度模式啟發,目標導向執行,行動前會並行啟動 2-5 個探索 / 圖書管理員代理進行研究。\",\n \"oracle\": \"架構決策與除錯顧問,唯讀諮詢代理,提供出色的邏輯推理和深度分析,不能寫檔案或委派任務。\",\n \"librarian\": \"多儲存庫分析與文件檢索專家,深度理解程式碼庫並提供基於證據的答案,擅長尋找官方文件和開源實作範例。\",\n \"explore\": \"快速程式碼庫探索與上下文 grep 專家,使用輕量級模型進行高速搜尋,是理解程式碼結構的先鋒。\",\n \"multimodalLooker\": \"視覺內容專家,分析 PDF、圖片、圖表等非文字媒體,提取其中的資訊與洞見。\",\n \"metis\": \"計畫顧問,在規劃前進行預先分析,識別隱藏意圖、模糊點和 AI 失敗點,防止過度工程化。\",\n \"momus\": \"計畫審查員,高精度驗證計畫的清晰度、可驗證性和完整性,拒絕並要求修訂直到計畫完美。\",\n \"sisyphusJunior\": \"類別產生的執行器,由 category 參數自動產生,專注於執行分配的任務且不能再委派,防止無限委派迴圈。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"視覺 / 前端工程\",\n \"ultrabrain\": \"超級思考\",\n \"deep\": \"深度工作\",\n \"artistry\": \"創意 / 文藝\",\n \"quick\": \"快速回應\",\n \"unspecifiedLow\": \"通用低階\",\n \"unspecifiedHigh\": \"通用高階\",\n \"writing\": \"寫作\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"前端與視覺工程類別,專注於 UI/UX 設計、樣式、動畫和介面實作,預設使用 Gemini 3.5 Flash 模型。\",\n \"ultrabrain\": \"深度邏輯推理類別,用於需要廣泛分析的複雜架構決策,預設使用 GPT-5.3 Codex 的超高推理變體。\",\n \"deep\": \"深度自主問題解決類別,目標導向執行,行動前進行徹底研究,適用於需要深度理解的棘手問題。\",\n \"artistry\": \"高度創意與藝術性任務類別,激發新穎想法和創造性解決方案,預設使用 Gemini 3.5 Flash 的高推理變體。\",\n \"quick\": \"輕量任務類別,用於單檔案修改、錯別字修復、簡單調整等瑣碎工作,預設使用 Claude Haiku 4.5 快速模型。\",\n \"unspecifiedLow\": \"未分類低工作量任務類別,適用於不適合其他類別且工作量較小的任務,預設使用 Claude Sonnet 4.5。\",\n \"unspecifiedHigh\": \"未分類高工作量任務類別,適用於不適合其他類別且工作量較大的任務,預設使用 Claude Opus 4.8 的最大變體。\",\n \"writing\": \"寫作類別,專注於文件、散文和技術寫作,預設使用 Kimi K2.5 模型。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"協調器\",\n \"oracle\": \"神諭者\",\n \"librarian\": \"圖書管理員\",\n \"explorer\": \"探索者\",\n \"designer\": \"設計師\",\n \"fixer\": \"修復者\",\n \"council\": \"議會\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"編寫執行程式碼,協調多代理工作流程,召喚專家\",\n \"oracle\": \"根本原因分析、架構審查、除錯指導(唯讀)\",\n \"librarian\": \"文件查詢、GitHub 程式碼搜尋(唯讀)\",\n \"explorer\": \"正規搜尋、AST 模式比對、檔案發現(唯讀)\",\n \"designer\": \"現代響應式設計、CSS / Tailwind 精通\",\n \"fixer\": \"程式碼實作、重構、測試、驗證\",\n \"council\": \"多模型共識代理,並行執行多個唯讀 councillor,再由 master 彙整最終答案。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"預設模型\",\n \"description\": \"設定 OpenClaw 的預設主模型和備用模型\",\n \"primary\": \"主模型\",\n \"primaryPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"fallbacks\": \"備用模型\",\n \"fallbacksPlaceholder\": \"例如: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"新增備用模型\",\n \"saved\": \"預設模型設定已儲存\",\n \"saveFailed\": \"儲存預設模型失敗\"\n },\n \"modelCatalog\": {\n \"title\": \"模型目錄\",\n \"description\": \"設定可用模型的別名和允許清單\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"alias\": \"別名\",\n \"aliasPlaceholder\": \"例如: DeepSeek\",\n \"addEntry\": \"新增模型\",\n \"removeEntry\": \"移除\",\n \"saved\": \"模型目錄已儲存\",\n \"saveFailed\": \"儲存模型目錄失敗\",\n \"empty\": \"暫無模型目錄設定\",\n \"emptyHint\": \"新增模型至目錄以設定別名\"\n },\n \"suggestedDefaults\": \"套用建議預設設定\",\n \"suggestedDefaultsHint\": \"使用此預設推薦的預設模型設定\"\n },\n \"subscription\": {\n \"title\": \"訂閱額度\",\n \"fiveHour\": \"5 小時\",\n \"sevenDay\": \"7 天\",\n \"sevenDayOpus\": \"7 天 (Opus)\",\n \"sevenDaySonnet\": \"7 天 (Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"每週\",\n \"copilotPremium\": \"進階請求\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}} 後重設\",\n \"extraUsage\": \"超額用量\",\n \"expired\": \"工作階段已過期\",\n \"expiredHint\": \"請執行 {{tool}} 命令重新整理登入\",\n \"queryFailed\": \"查詢失敗\",\n \"refresh\": \"重新整理\"\n },\n \"methodology\": {\n \"sidebar\": \"工作流程編排\",\n \"title\": \"工作流程編排\",\n \"subtitle\": \"方法論、流程預設、自訂編排、設計合約——四個獨立配置維度,按需選用,無先後依賴。框架偵測為唯讀,不修改專案檔案。\",\n \"scanAll\": \"掃描所有專案\",\n \"scanAllNoProjects\": \"請先新增專案再掃描\",\n \"scanComplete\": \"框架探測完成\",\n \"scanCompleteWithCount\": \"已掃描 {{count}} 個專案\",\n \"tabMarket\": \"方法論辨識\",\n \"tabOrchestration\": \"工作流程設定\",\n \"notScanned\": \"未掃描\",\n \"verified\": \"已偵測到\",\n \"inferred\": \"可能使用\",\n \"absent\": \"未偵測到\",\n \"detectedInProjects\": \"{{detected}}/{{total}} 專案已偵測到\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} 專案可能使用\",\n \"absentInAll\": \"{{total}} 專案均未偵測到\",\n \"noneDetectedTitle\": \"未偵測到任何方法論框架\",\n \"noneDetectedGuidance\": \"推薦從 flow-kit(純 Markdown 模板體系)或 spec-kit(規格工具鏈)入手。review-only 預設適合已有程式碼審查流程的專案,無需安裝框架。\",\n \"scanPromptTitle\": \"尚未掃描專案中的方法論框架\",\n \"scanPromptBody\": \"點擊「掃描所有專案」進行唯讀偵測,或直接進入預設編排 / 自訂編排——無需先安裝或檢測框架。\",\n \"goToOrchestration\": \"去預設編排\",\n \"goToRecipe\": \"自訂編排\",\n \"recommendedPreset\": \"推薦檔位:{{preset}}\",\n \"recommendedFrameworks\": \"框架參考目錄\",\n \"recommendedFrameworksHint\": \"受支援的開源方法論一覽,供了解與選型參考(非安裝精靈)\",\n \"detectedFrameworks\": \"已檢測到的框架\",\n \"directOrchestrationTitle\": \"不依賴框架也可開始編排\",\n \"directOrchestrationHint\": \"預設編排與自訂編排可獨立使用,匯出 workflow.profile.json 或 Recipe 檔案。\",\n \"presetFull\": \"完整流程\",\n \"presetStandard\": \"標準流程\",\n \"presetMvp\": \"MVP 流程\",\n \"presetReviewOnly\": \"僅審查\",\n \"noDescriptors\": \"框架目錄為空。請確認資料庫已初始化。\",\n \"detectionMatrix\": \"偵測矩陣\",\n \"detectionMatrixHint\": \"專案 × 框架偵測結果(✓ 已偵測到 / ? 可能使用 / ✗ 未偵測到 / — 未掃描)\",\n \"matrixFramework\": \"框架 \\\\ 專案\",\n \"orchestrationEntry\": \"預設編排器\",\n \"orchestrationHint\": \"獨立維度:選擇一個專案,設定流程檔位、模組和階段,匯出 workflow.profile.json 或 flow-config.yaml。無需先完成方法論框架掃描。\",\n \"orchestrationNoProjects\": \"暫無專案。請先在工作區新增專案,再進行流程編排設定。\",\n \"orchestrationSelectProject\": \"選擇專案\",\n \"orchestrationChooseProject\": \"— 請選擇專案 —\",\n \"orchestrationPickProjectHint\": \"請在上方下拉框選擇一個專案,開始設定 SDD 流程編排。\",\n \"tabRecipe\": \"變更執行方案\",\n \"recipeEntry\": \"變更執行方案\",\n \"recipeHint\": \"獨立維度:視覺化階段圖 + 自由組合階段與模組,匯出 YAML+Markdown 混合格式 Recipe 檔案。可獨立使用,無需先設定其他維度。\",\n \"recipeNoProjects\": \"暫無專案。請先在工作區新增專案。\",\n \"recipeSelectProject\": \"選擇專案\",\n \"recipePickPlaceholder\": \"— 選擇專案 —\",\n \"recipePickProjectHint\": \"請在上方下拉框選擇一個專案,開始編排 Recipe。\",\n \"tabDesignContract\": \"設計合約\",\n \"designContractEntry\": \"設計合約設定器\",\n \"designContractHint\": \"獨立維度:選擇品牌範本或自訂配色,產生 DESIGN.md + DTCG tokens。與 SDD 方法論無關,任何有前端/UI 的專案均可獨立使用。\",\n \"designContractNoProjects\": \"暫無專案。請先在工作區新增專案。\",\n \"designContractSelectProject\": \"選擇專案\",\n \"designContractPickPlaceholder\": \"— 選擇專案 —\",\n \"designContractPickProjectHint\": \"請在上方下拉框選擇一個專案,開始設定設計合約。\",\n \"tabRulesContext\": \"規則與上下文\",\n \"rulesContextPickProjectHint\": \"請在上方下拉框選擇一個專案,查看關聯的規則片段與上下文檔案。\"\n },\n \"rulesContext\": {\n \"title\": \"專案規則\",\n \"hint\": \"已關聯到當前專案的規則片段。帶 Glob 的規則僅在符合檔案存在時生效。\",\n \"empty\": \"暫無已關聯的規則。在 Agent 設定 > Prompts 中建立規則片段,然後在專案詳情中關聯。\",\n \"fragment\": \"片段\",\n \"allTargets\": \"所有工具\",\n \"universal\": \"全域\",\n \"contextFiles\": \"上下文檔案\",\n \"contextFilesHint\": \"專案同步時為各 AI 工具產生的上下文檔案。僅關聯了 Prompt 的工具會產生檔案。\",\n \"willSync\": \"將同步\",\n \"managed\": \"已託管\",\n \"userCreated\": \"使用者自建\",\n \"pendingSync\": \"待同步\",\n \"notLinked\": \"未關聯\"\n },\n \"recipeComposer\": {\n \"title\": \"變更執行方案\",\n \"hybrid\": \"YAML+Markdown 混合格式\",\n \"loading\": \"載入編排器中...\",\n \"preset\": \"流程檔位\",\n \"projectType\": \"專案類型\",\n \"projectTypeBackend\": \"後端\",\n \"projectTypeFrontend\": \"前端\",\n \"projectTypeCli\": \"命令列\",\n \"recipeName\": \"Recipe 名稱\",\n \"recipeNamePlaceholder\": \"我的 Recipe\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"基於標準流程編排的 Recipe\",\n \"stageGraph\": \"階段圖\",\n \"nodesCount\": \"{{count}} 個節點\",\n \"modules\": \"模組\",\n \"stages\": \"階段\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 已啟用\",\n \"notes\": \"備註(選填)\",\n \"notesPlaceholder\": \"為該 Recipe 新增自訂備註...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"如 feat-auth、fix-login-bug\",\n \"preview\": \"預覽\",\n \"copy\": \"複製\",\n \"export\": \"匯出 Recipe\",\n \"install\": \"安裝到專案\",\n \"installedSummary\": \"已安裝:建立 {{created}} 個檔案\",\n \"installedSkipped\": \",跳過 {{skipped}} 個已存在檔案\",\n \"exists\": \"(已存在)\",\n \"previewTitle\": \"預覽(YAML+Markdown 混合格式)\",\n \"collapse\": \"收合\",\n \"savedRecipes\": \"已儲存的 Recipe\",\n \"fitWidth\": \"符合寬度\",\n \"actualSize\": \"實際大小\",\n \"lateral\": \"橫向(跨領域)\",\n \"legendStandalone\": \"獨立\",\n \"legendSemi\": \"半獨立\",\n \"legendBranch\": \"分支\",\n \"legendNoArtifacts\": \"無產物\",\n \"toastExported\": \"Recipe「{{name}}」已匯出到 .opensunstar/recipe/\",\n \"toastCopied\": \"Recipe 內容已複製到剪貼簿\",\n \"toastCopyFailed\": \"複製失敗\",\n \"toastChangeIdRequired\": \"請填寫 Change ID(如 feat-auth)\",\n \"toastInstalled\": \"Recipe 已安裝到專案:建立 {{created}} 個檔案\",\n \"toastDeleted\": \"Recipe「{{name}}」已刪除\"\n },\n \"designContract\": {\n \"title\": \"設計合約\",\n \"name\": \"合約名稱\",\n \"description\": \"描述\",\n \"templates\": \"範本\",\n \"tokens\": \"令牌\",\n \"preview\": \"預覽\",\n \"import\": \"匯入\",\n \"colors\": \"顏色\",\n \"typography\": \"字體\",\n \"spacing\": \"間距基數 (px)\",\n \"copy\": \"複製\",\n \"copied\": \"已複製到剪貼簿\",\n \"exported\": \"已匯出\",\n \"installed\": \"已安裝\",\n \"loadingTemplate\": \"載入範本中...\",\n \"noPreview\": \"點擊預覽產生 DESIGN.md\",\n \"importFile\": \"從檔案匯入\",\n \"pickFile\": \"選擇 DESIGN.md 檔案...\",\n \"importUrl\": \"從 URL 匯入\",\n \"previewBtn\": \"預覽\",\n \"copyBtn\": \"複製\",\n \"exportBtn\": \"匯出\",\n \"installBtn\": \"安裝到專案\",\n \"installResult\": \"已安裝\",\n \"filesCreated\": \"個檔案已建立\",\n \"filesSkipped\": \"已跳過\",\n \"exists\": \"已存在\"\n },\n \"installConfirm\": {\n \"title\": \"確認安裝到專案\",\n \"auditScan\": \"安全審計掃描\",\n \"filesScanned\": \"檔案已掃描\",\n \"noFindings\": \"未發現安全問題。\",\n \"auditBlocked\": \"安全審計發現 CRITICAL 級別問題,安裝已被阻斷。請修復後重試。\",\n \"fileList\": \"檔案清單\",\n \"toCreate\": \"將建立\",\n \"toSkip\": \"已存在跳過\",\n \"create\": \"建立\",\n \"skip\": \"跳過\",\n \"existing\": \"現有內容\",\n \"wouldOverwrite\": \"將覆蓋為 (當前跳過)\",\n \"newContent\": \"新內容\",\n \"cancel\": \"取消\",\n \"confirmInstall\": \"確認安裝\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同步備份\",\n \"kanban\": \"項目AI看板\",\n \"tokenStats\": \"AI Tokens\",\n \"agentConfig\": \"Agent 配置\",\n \"projectConfig\": \"專案配置\",\n \"planning\": \"規劃中\",\n \"section\": {\n \"projects\": \"項目\",\n \"myProjects\": \"我的專案\",\n \"monitor\": \"運行監控\",\n \"aiModels\": \"AI模型\",\n \"cloudSync\": \"跨設備雲同步\",\n \"teamCollab\": \"團隊協作配置\",\n \"syncCollab\": \"同步與協作\"\n }\n },\n \"sync\": {\n \"waiting\": \"等待變更\",\n \"syncing\": \"同步中...\",\n \"synced\": \"已同步\",\n \"failed\": \"同步失敗\",\n \"disabled\": \"未啟用\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}}分鐘前\",\n \"hoursAgo\": \"{{count}}小時前\",\n \"daysAgo\": \"{{count}}天前\"\n },\n \"dryRun\": {\n \"title\": \"預覽模式(Dry Run)\",\n \"description\": \"開啟後,Prompt 激活等寫入操作將先顯示 Diff 預覽,確認後才實際寫入\",\n \"settingsTitle\": \"預覽模式(Dry Run)\",\n \"settingsDescription\": \"寫入前預覽 Diff,確認後再應用到磁盤\",\n \"confirmWrite\": \"確認寫入\",\n \"promptActivationTitle\": \"Prompt 激活預覽\",\n \"promptActivationDesc\": \"預覽模式已開啟,確認後將寫入目標文件\",\n \"current\": \"當前文件\",\n \"after\": \"激活後\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"命令\",\n \"empty\": \"暫無自定義命令\",\n \"add\": \"添加命令\",\n \"edit\": \"編輯命令\",\n \"count\": \"共 {{count}} 個命令\",\n \"loadFailed\": \"加載命令失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"confirm\": {\n \"deleteTitle\": \"刪除命令\",\n \"deleteMessage\": \"確定刪除命令 \\\"{{name}}\\\"?已同步的文件將被清理。\"\n },\n \"form\": {\n \"name\": \"命令名稱\",\n \"description\": \"描述\",\n \"content\": \"命令內容(Markdown)\",\n \"arguments\": \"參數定義(JSON)\",\n \"syncTargets\": \"同步到\"\n },\n \"variableHelp\": {\n \"title\": \"模板變量\",\n \"arguments\": \"Claude Code / Gemini 用戶輸入參數佔位符\",\n \"codexNote\": \"Codex 不支持獨立命令文件,勾選後不會寫入磁盤。\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"暫無生命週期鉤子\",\n \"add\": \"添加鉤子\",\n \"edit\": \"編輯鉤子\",\n \"count\": \"共 {{count}} 個鉤子\",\n \"loadFailed\": \"加載鉤子失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"syncSuccess\": \"已同步到 Claude Code\",\n \"syncFailed\": \"同步失敗\",\n \"syncNow\": \"同步到 Claude\",\n \"claudeOnlyNote\": \"當前僅支持同步到 Claude Code(settings.json hooks 字段)\",\n \"timeoutLabel\": \"超時 {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"刪除鉤子\",\n \"deleteMessage\": \"確定刪除此鉤子?settings.json 將同步更新。\"\n },\n \"form\": {\n \"eventType\": \"事件類型\",\n \"toolPattern\": \"工具匹配(glob)\",\n \"hookCommand\": \"Shell 命令\",\n \"timeout\": \"超時(秒,1-300)\",\n \"description\": \"描述\"\n },\n \"eventType\": {\n \"PreToolUse\": \"工具調用前\",\n \"PostToolUse\": \"工具調用後\",\n \"Notification\": \"通知\",\n \"Stop\": \"停止\"\n }\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"在 Claude / Codex / Gemini 等工具間遷移 Prompt、MCP、Skill 與 Command 配置\",\n \"sourceApp\": \"源工具\",\n \"targetApp\": \"目標工具\",\n \"contentType\": \"配置類型\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"選擇目標工具\",\n \"notFound\": \"文件不存在\",\n \"loadFailed\": \"檢測源配置失敗\",\n \"previewing\": \"生成預覽…\",\n \"warnings\": \"轉換提示\",\n \"unmapped\": \"未映射章節: {{section}}\",\n \"sourcePreview\": \"源內容\",\n \"convertedPreview\": \"轉換後\",\n \"overwrite\": \"覆蓋已存在的目標文件(寫入前會自動備份 .bak.opensunstar)\",\n \"apply\": \"確認寫入\",\n \"applySuccess\": \"配置已寫入目標工具\",\n \"applyFailed\": \"寫入失敗\",\n \"steps\": {\n \"source\": \"選擇源\",\n \"previewSource\": \"預覽源\",\n \"previewTarget\": \"預覽轉換\",\n \"confirm\": \"確認寫入\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore\",\n \"empty\": \"暫無忽略規則\",\n \"emptyHint\": \"添加 glob 規則後,將同步到 .claudeignore、.codexignore 等文件\",\n \"add\": \"添加規則\",\n \"edit\": \"編輯忽略規則\",\n \"count\": \"共 {{count}} 條規則\",\n \"loadFailed\": \"加載忽略規則失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"importGitignore\": \"從 .gitignore 導入\",\n \"importSuccess\": \"已導入 {{count}} 條規則\",\n \"importFailed\": \"導入失敗\",\n \"syncNow\": \"同步到工具\",\n \"syncSuccess\": \"已同步到各工具 ignore 文件\",\n \"syncFailed\": \"同步失敗\",\n \"confirm\": {\n \"deleteTitle\": \"刪除規則\",\n \"deleteMessage\": \"確定刪除此忽略規則?相關 ignore 文件將同步更新。\"\n },\n \"form\": {\n \"pattern\": \"Glob 模式\",\n \"description\": \"描述\",\n \"syncTargets\": \"同步到\"\n }\n },\n \"permissions\": {\n \"title\": \"Permissions\",\n \"empty\": \"暫無工具權限規則\",\n \"emptyHint\": \"管理 Claude Code 的 allow/deny 工具列表,可與 Hooks 共存於 settings.json\",\n \"add\": \"添加權限\",\n \"edit\": \"編輯權限\",\n \"count\": \"共 {{count}} 條權限\",\n \"loadFailed\": \"加載權限失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"syncNow\": \"同步到 Claude\",\n \"syncSuccess\": \"已同步到 Claude settings.json\",\n \"syncFailed\": \"同步失敗\",\n \"presets\": \"預設模板:\",\n \"presetApplied\": \"預設已應用\",\n \"presetFailed\": \"應用預設失敗\",\n \"claudeOnlyNote\": \"當前僅同步到 Claude Code settings.json permissions 字段\",\n \"confirm\": {\n \"deleteTitle\": \"刪除權限\",\n \"deleteMessage\": \"確定刪除此權限規則?settings.json 將同步更新。\"\n },\n \"form\": {\n \"type\": \"權限類型\",\n \"toolPattern\": \"工具匹配\",\n \"description\": \"描述\"\n },\n \"type\": {\n \"allowedTools\": \"允許\",\n \"deniedTools\": \"拒絕\",\n \"autoApprove\": \"自動批准\"\n }\n },\n \"simpleConnect\": {\n \"nav\": \"快速接入\",\n \"pageTitle\": \"快速接入\",\n \"tabSimple\": \"快速接入\",\n \"tabExpert\": \"高級 Provider\",\n \"title\": \"快速接入\",\n \"subtitle\": \"粘貼 API Key,三步即可在 CLI 中用起來\",\n \"step1\": \"供應商\",\n \"step2\": \"密鑰\",\n \"step3\": \"應用\",\n \"supplier\": \"供應商\",\n \"customSupplier\": \"自定義 OpenAI 兼容\",\n \"cliTool\": \"CLI 工具\",\n \"model\": \"模型\",\n \"modelPlaceholder\": \"先拉取模型列表\",\n \"fetchModels\": \"拉取模型列表\",\n \"apply\": \"應用配置\",\n \"applySuccess\": \"{{tool}} 配置已應用\",\n \"applySuccessMulti\": \"{{tools}} 配置已應用\",\n \"modelsLoaded\": \"已加載 {{count}} 個模型\",\n \"poolProxy\": \"本地代理 :{{port}} 已啟用\",\n \"keyRequired\": \"請先在 Keychain 中保存 API Key\",\n \"keyRequiredHint\": \"保存主 Key 後才能進入應用步驟\",\n \"customBaseRequired\": \"請先填寫自定義 API Base URL\",\n \"modelsFallback\": \"拉取失敗,已使用預設模型 {{model}}\",\n \"toolStatusTitle\": \"CLI 配置狀態\",\n \"toolStatusLoading\": \"讀取 CLI 狀態…\",\n \"toolCleared\": \"{{tool}} 已清除快速接入配置\",\n \"clearTool\": \"清除 {{tool}}\",\n \"wizardNav\": \"快速接入步驟\",\n \"summaryStep\": \"步驟 {{step}}/3\",\n \"step3Hint\": \"選擇 CLI 與模型後應用;詳情見下方摺疊面板\",\n \"step3Sections\": {\n \"statusSection\": \"CLI 配置狀態\",\n \"runtimeSection\": \"密鑰池運行態\",\n \"usageSection\": \"用量概覽(只讀)\"\n },\n \"supplierChangeTitle\": \"切換供應商?\",\n \"supplierChangeBody\": \"切換後將使用新的 upstream;已保存的 Key 仍對應原供應商命名空間。應用配置時會自動備份並重寫 CLI。\",\n \"supplierChangeConfirm\": \"繼續切換\",\n \"supplierChangedApply\": \"已切換供應商並寫入 CLI;原配置已備份\",\n \"pickSupplier\": \"選擇供應商\",\n \"pickCli\": \"選擇要配置的 CLI\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"任意 OpenAI-compatible Base URL\",\n \"openWebsite\": \"官網\",\n \"keySaved\": \"Key 已保存\",\n \"keyMissing\": \"未保存 Key\",\n \"poolBadge\": \"密鑰池 ×{{count}}\",\n \"keySavedToast\": \"API Key 已安全存入 Keychain\",\n \"keyReadyHint\": \"主 Key 已就緒,可進入下一步\",\n \"poolKeyAdded\": \"備用 Key 已添加\",\n \"applyTo\": \"應用到 {{tool}}\",\n \"modelsLoading\": \"正在拉取模型…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} 已配置\",\n \"backToSimple\": \"返回快速接入\",\n \"openProxySettings\": \"代理與故障隊列設置\",\n \"proxyRunning\": \"主代理運行中\",\n \"cliGeneric\": \"CLI 配置\",\n \"expertNoticeTitle\": \"Expert Provider(精簡保留)\",\n \"expertNoticeBody\": \"故障隊列、代理接管、Universal 等高級能力仍在此管理。默認推薦先用「快速接入」。\",\n \"pool\": {\n \"step2Hint\": \"輸入 API Key 並保存,CLI 將通過本地代理安全訪問\",\n \"enable\": \"開啟密鑰池\",\n \"enableHint\": \"多 Key 加權輪詢 + 429 階梯冷卻;CLI 始終寫 local token,真實 Key 僅存 Keychain\",\n \"securityNote\": \"密鑰僅寫入系統 Keychain,不會出現在配置文件或日誌中。CLI 通過本地代理 token 訪問。\",\n \"required\": \"必需\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"主 Key\",\n \"extra\": \"備用 Key\",\n \"extraKey\": \"添加備用 Key\",\n \"supplierHint\": \"Key 存儲於 Keychain:simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"密鑰池運行時\",\n \"running\": \"代理運行中\",\n \"stopped\": \"代理未啟動\",\n \"idleHint\": \"應用配置後將啟動本地代理,此處顯示 Key 成功/失敗與冷卻狀態\",\n \"available\": \"可用\",\n \"cooling\": \"冷卻中\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"用量概覽(只讀)\",\n \"input\": \"輸入\",\n \"output\": \"輸出\",\n \"sessions\": \"會話條數\",\n \"proxyPort\": \"代理 :{{port}}\",\n \"proxySession\": \"本次會話\",\n \"byTool\": \"按 CLI 拆分\",\n \"empty\": \"暫無本地會話用量數據\"\n },\n \"import\": {\n \"title\": \"確認導入 API Key\",\n \"description\": \"密鑰將寫入 Keychain,不會出現在配置文件中。導入前會校驗 Key 有效性。\",\n \"label\": \"標籤\",\n \"supplier\": \"供應商\",\n \"warning\": \"請確認鏈接來源可信。可在快速接入中禁用 URL 導入。\",\n \"confirm\": \"確認導入\",\n \"importing\": \"導入中…\",\n \"success\": \"已導入 {{count}} 個 Key 到 Keychain\",\n \"duplicates\": \"跳過 {{count}} 個重複 Key\",\n \"parseError\": \"導入鏈接解析失敗\"\n },\n \"advanced\": {\n \"title\": \"高級\",\n \"verifyKey\": \"保存前校驗 Key\",\n \"verifyKeyHint\": \"調用 /v1/models 驗證;關閉後僅高級用戶手動導入\",\n \"deeplinkImport\": \"允許 URL 導入 Key\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"備份目錄安全掃描\",\n \"files\": \"已掃描 {{count}} 個文件\",\n \"clean\": \"未發現明文 Key\",\n \"suspicious\": \"{{count}} 處可疑內容\",\n \"hint\": \"掃描 simple-connect/backups 下 CLI 配置備份,確保無 sk- 明文落盤。\"\n },\n \"privacy\": {\n \"bannerShort\": \"本地優先 · 密鑰存系統 Keychain · 無遙測\",\n \"viewDetails\": \"查看安全與隱私說明\",\n \"title\": \"安全與隱私說明\",\n \"intro\": \"快速接入遵循「數據留在本機、密鑰不進配置文件、網絡由你指定」的原則。以下為快速接入範圍內的處理方式。\",\n \"close\": \"知道了\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"本地優先\",\n \"body\": \"供應商選擇、模型緩存、CLI 配置狀態與用量統計等偏好均保存在本機應用數據目錄。寫入 CLI 前會自動備份原配置到本地 simple-connect/backups,可在 Step 2 高級區掃描備份是否含明文密鑰。\"\n },\n \"keychain\": {\n \"title\": \"憑據存系統 Keychain\",\n \"body\": \"API Key 僅寫入操作系統密鑰鏈(Windows DPAPI / macOS Keychain / Linux libsecret),不會出現在 JSON、TOML、環境變量或應用日誌中。CLI 側僅注入 sc-local-* 本地代理令牌;真實 Key 僅在本地代理進程內從 Keychain 讀取。\"\n },\n \"network\": {\n \"title\": \"網絡直連你選的供應商\",\n \"body\": \"模型拉取、Key 校驗(若開啟)與 upstream 請求均從本機直接發往你選擇的 API Base。本地代理(127.0.0.1:17172)僅在本機環回地址監聽,用於密鑰池與 CLI 統一入口,不對外網暴露。\"\n },\n \"noTelemetry\": {\n \"title\": \"無遙測、無賬號綁定\",\n \"body\": \"快速接入不會向 OpenSunstar 官方或第三方上報 API Key、對話內容、模型調用明細或設備指紋。用量面板數據來自本機 CLI 會話日誌與本地代理計數,僅供你在本機查看。\"\n },\n \"yourControl\": {\n \"title\": \"你可自行控制的風險項\",\n \"body\": \"URL 導入 Key 僅在確認鏈接來源可信時啟用,可在 Step 2 高級區關閉。選擇自定義供應商時,請自行評估第三方 Base URL 的可信度與隱私政策。\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"快速接入\",\n \"title\": \"快速接入\",\n \"subtitle\": \"三步完成接入:選供應商 → 填 Key → 一鍵啟用\",\n \"tabs\": {\n \"wizard\": \"快速接入\",\n \"manage\": \"管理供應商\"\n },\n \"openManage\": \"管理全部供應商\",\n \"openProxySettings\": \"代理與故障隊列設置\",\n \"searchPlaceholder\": \"搜索供應商名稱或網址…\",\n \"noResults\": \"未找到匹配的供應商\",\n \"official\": \"官方\",\n \"officialDesc\": \"官方帳號按客戶端登入。\",\n \"partner\": \"合作伙伴\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"粘貼你的 API Key\",\n \"keychainHint\": \"API Key 保存在本機安全憑據庫;接入時會更新本機設定。\",\n \"getKey\": \"獲取 API Key\",\n \"apply\": \"一鍵啟用\",\n \"success\": \"接入成功!已切換為當前供應商\",\n \"doneTitle\": \"接入成功!\",\n \"doneDesc\": \"供應商已配置完成並切換為當前生效。現在可以在 Claude Code 中直接使用了。\",\n \"doneDescApp\": \"{{app}} 已配置並切換為當前供應商。\",\n \"failedTitle\": \"接入未完成\",\n \"compensatedDesc\": \"操作失敗,系統已恢復到接入前狀態;可修正配置後重試。\",\n \"recoveryRequired\": \"自動恢復未完成,請點擊「繼續恢復」後再重試。\",\n \"operationId\": \"操作編號\",\n \"retry\": \"重試接入\",\n \"continueRecovery\": \"繼續恢復\",\n \"changeSelection\": \"修改配置\",\n \"rollback\": \"撤銷本次接入\",\n \"rollbackDone\": \"已恢復到接入前狀態\",\n \"rollbackFailed\": \"恢復失敗,請重試或前往代理設置檢查狀態\",\n \"proxyRunningHint\": \"Claude Code 的請求經本地代理(127.0.0.1:15721)轉發。請保持 OpenSunstar 運行,關閉應用後 Claude Code 將無法連接。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop 經本地代理轉發。請保持 OpenSunstar 運行,關閉應用後將無法連接。\",\n \"addAnother\": \"再接入一個\",\n \"openSettings\": \"前往供應商管理\",\n \"firstProviderHint\": \"檢測到這是你的第一個供應商,如需啟動代理請在設置中確認\",\n \"verify\": \"驗證 Key\",\n \"verifyOk\": \"Key 有效!\",\n \"verifyOkAnthropic\": \"Key 有效(該供應商不提供模型列表 API,將使用預設默認模型)\",\n \"verifyOkGemini\": \"Key 有效,Gemini 原生接口驗證通過\",\n \"verifyOkWithModels\": \"Key 有效,已獲取 {{count}} 個模型\",\n \"verifyOkNoModelList\": \"Key 有效(模型列表拉取失敗,將使用預設默認模型)\",\n \"verifyHint\": \"系統按目前協議驗證;Anthropic 約消耗 1 token,OpenAI/Gemini 取得模型列表後可用於進階映射\",\n \"modelsList\": \"可用模型({{count}})\",\n \"myProviders\": \"API Key 接入\",\n \"switch\": \"切換\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"自定義\",\n \"aiGlobal\": \"AI國際\",\n \"aiChina\": \"AI中國\",\n \"relay\": \"聚合/中轉\",\n \"customModel\": \"自定義模型配置\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini 快速接入目前啟用 Google 官方和 Gemini Native 相容端點;OpenAI Chat 網關會顯示協議不匹配提示。\"\n },\n \"custom\": {\n \"cardTitle\": \"自定義配置\",\n \"cardSubtitle\": \"自填 Base URL 與模型\",\n \"hint\": \"填寫名稱、Base URL 與默認模型;API 格式、認證字段和模型映射可在下方高級選項中調整。\",\n \"geminiHint\": \"填寫名稱、Gemini Native Base URL 與模型;Gemini CLI 原生協議會在進階選項中顯示。\",\n \"name\": \"供應商名稱\",\n \"namePlaceholder\": \"例如:我的 DeepSeek 網關\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"默認模型\",\n \"geminiModel\": \"模型 ID\",\n \"defaultName\": \"自定義供應商\"\n },\n \"advanced\": {\n \"title\": \"高級選項\",\n \"subtitle\": \"大多數場景保持默認即可\",\n \"upstreamModel\": \"上游模型\",\n \"defaultModel\": \"默認模型\",\n \"apiFormat\": \"API 格式\",\n \"authField\": \"認證字段\",\n \"roleMapping\": \"模型角色映射\",\n \"roleMappingHint\": \"顯示名稱用於 /model 選單;實際請求模型會寫入 Claude Code 環境變數。\",\n \"role\": \"角色\",\n \"displayName\": \"顯示名稱\",\n \"requestModel\": \"實際請求模型\",\n \"roleRequestModel\": \"{{role}} 實際請求模型\",\n \"hiddenFromModelMenu\": \"不顯示在 /model 選單\",\n \"fallbackModel\": \"預設兜底模型\",\n \"desktopRoutes\": \"Claude Desktop 路由映射\",\n \"customProtocolHint\": \"自定義配置按上游真實介面選擇協議。\",\n \"presetProtocolLocked\": \"供應商預設已按真實端點鎖定協議,避免誤選後連線失敗。\",\n \"geminiNativeLocked\": \"Gemini CLI 目前透傳原生 generateContent 協議;OpenAI Chat 端點需使用已實作協議轉換的客戶端入口。\"\n },\n \"badge\": {\n \"current\": \"當前\",\n \"proxy\": \"本地路由\"\n },\n \"warn\": {\n \"clearFailed\": \"清除舊快速接入標記失敗,若切換仍報錯請手動在設置中清除\",\n \"takeoverFailed\": \"供應商已添加,但代理接管開啟失敗。請在設置-本地路由中手動開啟對應應用接管\"\n },\n \"unavailableForApp\": \"當前客戶端協議暫未適配\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex 快速接入目前使用 OpenAI Responses / Chat 上游協議\",\n \"claudeOauthOnly\": \"此 OAuth 預設面向 Claude 客戶端\",\n \"geminiNativeOnly\": \"Gemini CLI 需要 Gemini Native 或 Gemini 相容網關\",\n \"geminiOpenRouter\": \"OpenRouter 提供 OpenAI Chat 上游,Gemini CLI 目前透傳 Gemini Native 協議\"\n },\n \"error\": {\n \"emptyKey\": \"請填寫 API Key\",\n \"failed\": \"接入失敗,請檢查 API Key 或網絡後重試\",\n \"compensated\": \"接入失敗,已自動恢復到操作前狀態\",\n \"recoveryRequired\": \"接入失敗且自動恢復未完成,請先執行恢復\",\n \"noBaseUrl\": \"請填寫 Base URL\",\n \"noModel\": \"請填寫默認模型\"\n },\n \"addProvider\": \"添加供應商\",\n \"addProviderHint\": \"選擇預設或添加相容端點。\",\n \"configureProvider\": \"配置供應商\",\n \"configureProviderHint\": \"只填必需資訊;連接和驗證會自動完成。\",\n \"connectAndEnable\": \"連接並啟用\",\n \"myProvidersHint\": \"API Key 保存在本機安全憑據庫;接入時會更新本機設定。\",\n \"officialConnection\": \"訂閱帳號\",\n \"officialConnectionHint\": \"按客戶端完成訂閱登入。\",\n \"workbenchSubtitle\": \"選擇客戶端,再用訂閱帳號或 API Key 接入。\",\n \"workbenchTitle\": \"模型接入\",\n \"subscription\": {\n \"loginStatus\": \"登入狀態\",\n \"accountManagement\": \"帳號管理\",\n \"claude\": {\n \"title\": \"Claude 訂閱登入\",\n \"description\": \"憑據由 Claude Code 管理;OpenSunstar 讀取狀態和額度。\",\n \"action\": \"Claude 訂閱登入\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop 登入\",\n \"description\": \"登入由 Claude Desktop 管理。\",\n \"action\": \"取得 Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT 訂閱登入\",\n \"description\": \"登入由 OpenSunstar 託管。\",\n \"action\": \"ChatGPT 訂閱登入\",\n \"dialogHint\": \"按裝置授權流程連接帳號。\"\n },\n \"gemini\": {\n \"title\": \"Gemini 帳號登入\",\n \"description\": \"憑據由 Gemini CLI 管理;OpenSunstar 讀取狀態和額度。\",\n \"action\": \"Gemini 登入指引\"\n }\n }\n },\n \"kanban\": {\n \"subtitle\": \"以 AI 驅動的全局多視角,多項目組合矩陣:全生命週期管理、項目健康評估、動態成本監控\",\n \"scanning\": \"正在掃描 {{done}}/{{total}} 個項目…\",\n \"refresh\": \"刷新指標\",\n \"addProject\": \"添加項目\",\n \"searchPlaceholder\": \"搜索項目…\",\n \"confirmRemoveTitle\": \"從項目AI看板中移除?\",\n \"confirmRemove\": \"將移除「{{name}}」;不會刪除磁盤上的倉庫文件,階段與進度等本地看板數據也會清除。\",\n \"confirmRemoveBtn\": \"移除\",\n \"removed\": \"已移除「{{name}}」\",\n \"commits7dHint\": \"近 7 天共 {{count}} 次提交\",\n \"commitsWindowHint\": \"近 {{days}} 天共 {{count}} 次提交\",\n \"noRecentActivity\": \"近 7 天無提交\",\n \"noRecentActivityWindow\": \"近 {{days}} 天無提交\",\n \"stageDistribution\": \"階段分佈\",\n \"activity\": {\n \"veryHigh\": \"很高\",\n \"high\": \"高\",\n \"medium\": \"中等\",\n \"low\": \"低\"\n },\n \"detail\": {\n \"tabs\": \"項目詳情\",\n \"overview\": \"概覽\",\n \"aiAssets\": \"AI 資產配置\",\n \"projectAssets\": \"本項目啟用的資產\",\n \"projectAssetsHint\": \"勾選後僅對當前項目生效;全局庫在側欄維護,項目關聯僅存於本地數據庫。\"\n },\n \"score\": {\n \"health\": \"健康評分\"\n },\n \"readiness\": {\n \"title\": \"Agent 配置就緒\",\n \"loading\": \"正在評估配置就緒度…\",\n \"hint\": \"點擊下方條目可直達對應配置;項目級資產在本頁「AI 資產配置」中關聯。\",\n \"configure\": \"去配置\",\n \"configureGlobal\": \"前往全局配置\",\n \"manage\": \"管理\",\n \"openAssetsTab\": \"打開專案資產配置\",\n \"compactTitle\": \"專案配置就緒度\",\n \"normalCount\": \"{{count}} 項正常\",\n \"driftCount\": \"{{count}} 項不一致\",\n \"missingCount\": \"{{count}} 項缺失\",\n \"priorityDrift\": \"優先處理:{{label}} 配置不一致\",\n \"priorityMissing\": \"優先處理:{{label}} 尚未配置\",\n \"completedSection\": \"已完成 {{count}} 項\",\n \"badgeHint\": \"點擊查看詳情\",\n \"scanEffective\": \"生效態掃描\",\n \"forApp\": \"按 {{app}} 計分\",\n \"status\": {\n \"global_only\": \"來源:全局基線\",\n \"detected_only\": \"來源:倉庫探測\",\n \"partial\": \"部分 CLI 支持\",\n \"not_required\": \"當前目標 CLI 不支持此項,已從評分中排除\",\n \"unmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"unknown\": \"暫不能判定\",\n \"unhealthy\": \"配置與預期不一致\"\n },\n \"effective\": {\n \"configured\": \"已配置\",\n \"effective\": \"已生效\",\n \"drifted\": \"未生效\",\n \"unconfigured\": \"未配置\",\n \"unchecked\": \"暫未比對\"\n },\n \"driftBadge\": \"{{count}} 項配置不一致\",\n \"driftShort\": \"待處理 {{count}}\",\n \"repairDrift\": \"修復配置\",\n \"repairSuccess\": \"已寫回並驗證生效\",\n \"repairFailed\": \"修復後仍存在配置不一致\",\n \"repairError\": \"修復請求失敗,請稍後重試\",\n \"repairNoop\": \"當前項無需修復\"\n },\n \"governance\": {\n \"title\": \"配置生效率\",\n \"forApp\": \"目標 CLI:{{app}}\",\n \"scannedProjects\": \"已掃描項目\",\n \"ofTotal\": \"共 {{total}} 個\",\n \"driftProjects\": \"配置不一致項目\",\n \"driftItems\": \"{{count}} 項待修復\",\n \"effectiveRate\": \"生效率\",\n \"comparableItems\": \"{{count}} 項可比對\",\n \"effectiveItems\": \"已生效項\",\n \"portfolioScope\": \"組合層彙總\",\n \"driftBreakdown\": \"配置不一致分佈(按資產類型)\",\n \"allEffective\": \"可比對資產均已生效,組合層治理狀態良好。\",\n \"awaitingScan\": \"就緒度掃描完成後將顯示治理指標。\",\n \"repairConfirmTitle\": \"確認寫回修復?\",\n \"repairConfirmProjectTitle\": \"確認修復全部不一致項?\",\n \"repairConfirmAssetIntro\": \"將把 OpenSunstar 庫中的「{{label}}」寫回目標 CLI({{app}})對應的項目級文件,可能覆蓋你在 IDE/終端裡手動改過的內容。\",\n \"repairConfirmProjectIntro\": \"將修復項目「{{name}}」的全部 {{count}} 項配置不一致:逐項寫回 OpenSunstar 庫內容到目標 CLI({{app}}),可能覆蓋外部手動修改。\",\n \"repairConfirmDetail\": \"不一致說明:{{detail}}\",\n \"repairConfirmPath\": \"目標路徑:{{path}}\",\n \"repairConfirmProceed\": \"確認後將立即寫回並復掃驗證;此操作不可自動撤銷。\",\n \"repairConfirmAction\": \"確認寫回\",\n \"repairConfirmProjectAction\": \"確認修復全部\",\n \"tooltip\": {\n \"scannedProjects\": \"已完成 AI 配置就緒度檢查的項目數量\",\n \"driftProjects\": \"至少有 1 項 AI 配置與 OpenSunstar 中保存的預期狀態不一致,通常來自本地文件被外部修改或刪除。\",\n \"effectiveRate\": \"生效率 = 已生效項 ÷ 可比對項。\\n已生效 = 配置已正確寫入項目;可比對項 = 排除「不支援」後的有效檢查項總數。\",\n \"effectiveItems\": \"所有項目中,AI 配置已正確落地的檢查項數量總和。\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"組合層生效狀態巡檢:未發現配置不一致。\",\n \"title\": \"{{projects}} 個項目存在配置不一致(共 {{items}} 項)\",\n \"forApp\": \"目標 CLI:{{app}}\",\n \"itemCount\": \"{{count}} 項待處理\",\n \"repairAll\": \"修復全部待處理項\",\n \"repairAllSuccess\": \"已修復 {{count}} 項配置不一致並驗證生效\",\n \"repairPartial\": \"已修復 {{fixed}} 項,仍有 {{remaining}} 項配置不一致\",\n \"repairNone\": \"未發現可修復的配置不一致項\"\n }\n },\n \"projectConfig\": {\n \"hint\": \"為當前項目勾選要啟用的 MCP、Skills 與 Prompts。全局資產庫在側欄 Agent 配置中維護。\",\n \"mcpServers\": \"MCP 服務器\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"暫無 MCP 服務器\",\n \"noSkills\": \"暫無已安裝的 Skills\",\n \"noPrompts\": \"暫無 Prompts\",\n \"goToMcp\": \"前往 MCP 管理\",\n \"goToSkills\": \"前往 Skills 管理\",\n \"goToPrompts\": \"前往 Prompts 管理\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore 規則\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"暫無 Commands\",\n \"noHooks\": \"暫無 Hooks\",\n \"noIgnore\": \"暫無 Ignore 規則\",\n \"noPermissions\": \"暫無 Permissions\",\n \"noSubagents\": \"暫無 Subagents\",\n \"goToCommands\": \"前往 Commands 管理\",\n \"goToHooks\": \"前往 Hooks 管理\",\n \"goToIgnore\": \"前往 Ignore 管理\",\n \"goToPermissions\": \"前往 Permissions 管理\",\n \"goToSubagents\": \"前往 Subagents 管理\"\n },\n \"projectAssets\": {\n \"projectLink\": \"本專案關聯\",\n \"hint\": \"為當前項目勾選要啟用的 AI 資產子集。關聯僅寫入 OpenSunstar 本地庫,不會自動修改項目倉庫文件;寫入各 CLI 仍由側欄全局資產管理。\",\n \"partialHint\": \"部分 CLI 支持有限制,懸停標籤查看說明\",\n \"globalBaselineHint\": \"全局庫已有 {{count}} 條規則作為安全基線;可為當前項目單獨勾選啟用子集。\",\n \"switchAllUnsupported\": \"當前資產類型在所有目標 CLI 上均不支持同步,無法為項目啟用\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop 暫不參與此類資產同步\",\n \"openclawMcp\": \"OpenClaw 當前不支持 MCP 同步\",\n \"openclawSkills\": \"OpenClaw 當前不支持 Skills 同步\",\n \"openclawCommands\": \"OpenClaw 當前不支持 Commands 同步\",\n \"openclawIgnore\": \"OpenClaw 當前不支持 Ignore 同步\",\n \"openclawSubagents\": \"OpenClaw 當前不支持 Subagents 同步\",\n \"codexCommands\": \"Codex 不支持獨立 slash command 文件\",\n \"codexSubagent\": \"Codex 通過 TOML 轉換寫入 ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks 當前僅 Claude Code 支持寫回\",\n \"permissionsClaudeOnly\": \"Permissions 當前僅 Claude Code 支持寫回\",\n \"hermesSubagents\": \"Hermes 不支持 Subagent 文件同步\"\n }\n },\n \"board\": {\n \"summary\": {\n \"title\": \"項目總覽\",\n \"totalProjects\": \"總項目數\",\n \"totalCodeLines\": \"總代碼行數\",\n \"linesUnit\": \"行\",\n \"avgActivity\": \"平均活躍度({{days}} 天)\",\n \"commitsInWindow\": \"近 {{days}} 天提交\",\n \"thisWeek\": \"近 7 天提交\",\n \"windowLabel\": \"Git 活躍統計週期\",\n \"daysUnit\": \"天\",\n \"updatesUnit\": \"次\"\n },\n \"duplicateCleanup\": \"重複資產檢測\"\n },\n \"projectBlueprint\": {\n \"title\": \"項目基線 Blueprint\",\n \"hint\": \"選擇模板一鍵關聯全局庫資產;合併模式僅新增關聯,不刪除已有配置。\",\n \"loading\": \"加載 Blueprint…\",\n \"exportSnapshot\": \"導出快照\",\n \"targetCli\": \"項目目標 CLI\",\n \"targetDefault\": \"沿用看板默認\",\n \"saveTarget\": \"保存\",\n \"previewing\": \"生成預覽…\",\n \"previewTitle\": \"預覽:將新增 {{count}} 項關聯({{name}})\",\n \"apply\": \"應用 Blueprint\",\n \"applied\": \"已應用「{{name}}」,關聯 {{count}} 項資產\",\n \"targetSaved\": \"項目目標 CLI 已保存\",\n \"snapshotExported\": \"基線快照已導出:{{path}}\"\n },\n \"onboarding\": {\n \"title\": \"快速上手\",\n \"dismiss\": \"關閉引導\",\n \"prev\": \"上一步\",\n \"next\": \"下一步\",\n \"done\": \"知道了\",\n \"step1\": {\n \"title\": \"新增專案\",\n \"desc\": \"所有功能圍繞專案展開。點擊側邊欄「我的專案 → 新增專案」,把你的程式碼倉庫加進來,OpenSunstar 會自動掃描 AI 配置狀態。\"\n },\n \"step2\": {\n \"title\": \"專案駕駛艙 — 今天有沒有事\",\n \"desc\": \"「今日告警」只回答一個問題:今天有沒有事。沒事就顯示「今天沒事」—— 沒事就是最好的消息。「專案看板」放彙總指標與資產矩陣,巡視內容不占開機第一眼。\"\n },\n \"step3\": {\n \"title\": \"AI資產配置 — 為專案落地資產\",\n \"desc\": \"在「專案配置 → AI資產配置」裡為專案關聯 MCP 伺服器、Skills、Prompts 等資產。側欄「Agent 配置」管全域資產庫,這裡管它們在專案上的關聯。\"\n },\n \"step4\": {\n \"title\": \"工作流程編排 — 建立可執行流程\",\n \"desc\": \"在「專案配置 → 工作流程編排」裡為專案配置階段、預設與變更執行方案。方法論辨識、預設編排、自訂編排、設計合約——四個獨立維度,按需選用,無先後依賴。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"配置修復預覽\",\n \"description\": \"項目「{{name}}」共 {{count}} 項配置不一致,勾選需要修復的項:\",\n \"loading\": \"正在掃描待處理項…\",\n \"empty\": \"未發現配置不一致,無需修復\",\n \"selectAll\": \"全選\",\n \"deselectAll\": \"取消全選\",\n \"safetyHint\": \"{{count}} 項為安全關鍵項(Ignore/Permissions/Hooks),修復將覆蓋存取控制或命令執行配置\",\n \"safetyCriticalTooltip\": \"安全關鍵項:修復將覆蓋存取控制或命令執行相關配置\",\n \"safetyBadge\": \"安全關鍵\",\n \"confirmAction\": \"修復選中項({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 配置狀態\",\n \"subtitle\": \"每個格子顯示一類 AI 配置的短狀態:已生效、不一致、缺失、全局、探測、未掃、不適用。點擊查看詳情。\",\n \"project\": \"項目\",\n \"stage\": \"階段\",\n \"score\": \"分數\",\n \"loading\": \"正在掃描項目配置狀態…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"需關注\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未掃描\",\n \"hasIssue\": \"需處理\",\n \"showProblemsOnly\": \"只看需處理\",\n \"filterLabel\": \"項目狀態篩選\",\n \"filterAll\": \"全部\",\n \"filterNeedsAction\": \"需處理\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未掃\",\n \"allClear\": \"當前篩選下沒有需要處理的項目\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"已生效\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"缺失\",\n \"cellGlobal\": \"全局\",\n \"cellDetected\": \"探測\",\n \"cellPartial\": \"部分\",\n \"cellWarn\": \"需關注\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未掃\",\n \"cellNA\": \"不適用\",\n \"cellRecent\": \"有更新\",\n \"cellStale\": \"無更新\",\n \"colUpkeep\": \"維護度\",\n \"colUpkeepTitle\": \"近 90 天專案資產關聯更新\",\n \"linkedCount\": \"OpenSunstar 已關聯\",\n \"linkedCountValue\": \"{{value}} 項\",\n \"detailRecentUpdates\": \"統計近 90 天內是否有專案級 AI 資產配置變更\",\n \"safetyBadge\": \"安全關鍵\",\n \"noData\": \"暫無掃描數據\",\n \"scanPending\": \"尚未完成掃描,當前狀態不能判定為正常。\",\n \"detailEffective\": \"配置已生效,與 OpenSunstar 庫一致\",\n \"detailDrifted\": \"配置與預期不一致,可能需要修復\",\n \"detailUnscanned\": \"已發現配置,但暫未完成目標 CLI 生效狀態比對\",\n \"detailGlobal\": \"使用全局默認配置,項目級未自定義\",\n \"detailDetected\": \"檢測到倉庫中有配置,但未被 OpenSunstar 管理\",\n \"detailMissingSafety\": \"安全關鍵項未配置,建議盡快設置\",\n \"detailMissing\": \"未配置此項,如果不需要可忽略\",\n \"detailPartial\": \"部分配置,建議完善\",\n \"detailNA\": \"當前目標 CLI 不支持此項\",\n \"detailUnmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"statusOk\": \"配置正常\",\n \"statusWarn\": \"需要關注\",\n \"statusCrit\": \"存在異常\",\n \"statusUnscanned\": \"未完成掃描\",\n \"statusNA\": \"不適用\",\n \"stateDetail\": \"狀態詳情\",\n \"driftDetail\": \"狀態詳情\",\n \"checkDetail\": \"檢查詳情\",\n \"filePath\": \"配置文件路徑\",\n \"viewProject\": \"查看項目資產\",\n \"goRepair\": \"去修復\"\n },\n \"portfolioNotice\": {\n \"title\": \"部分資料沒讀到,下面的「未掃 / 未設定 / 缺失」不代表磁碟上真的缺失。\",\n \"readinessFailed\": \"{{failed}}/{{total}} 個專案的就緒度讀取失敗\",\n \"assetFailed\": \"資產統計失敗:{{reason}}\",\n \"retry\": \"重試\"\n },\n \"scope\": {\n \"globalEnabled\": \"全域已啟用\",\n \"globalNotEnabled\": \"全域未啟用\",\n \"activeProject\": \"專案:{{name}}\",\n \"backToProject\": \"返回專案:{{name}}\",\n \"globalScope\": \"全域\",\n \"projectScope\": \"專案層級\",\n \"globalToast\": \"已為 {{app}} 全域啟用\",\n \"globalDisableToast\": \"已為 {{app}} 全域停用\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"跨設備雲同步\",\n \"subtitle\": \"配置數據在多台設備間即時同步,隨時隨地保持一致的開發環境\",\n \"status\": \"同步狀態\",\n \"backend\": \"同步後端\",\n \"notConfigured\": \"未配置\",\n \"notConfiguredHint\": \"請先在設定中配置雲同步後端(WebDAV / S3 / GitHub Gist)\",\n \"goSettings\": \"前往同步設定\",\n \"lastSync\": \"上次同步\",\n \"never\": \"從未同步\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 物件儲存\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"已啟用\",\n \"disabled\": \"未啟用\",\n \"autoSync\": \"自動同步\",\n \"on\": \"開\",\n \"off\": \"關\",\n \"description\": \"雲同步解決的是「空間軸」問題——配置在多台設備間保持一致。與專案環境快照(時間軸·版本回溯)互為補充,按需選用。\"\n },\n \"projectAiConfig\": {\n \"title\": \"AI資產配置\",\n \"subtitle\": \"為單一專案落地 AI 資產:套用藍圖、檢查就緒度、勾選生效的資產。側欄「Agent 配置」管的是全域資產庫,這裡管它們在本專案上的關聯。\",\n \"switcher\": \"目前配置專案\",\n \"targetCli\": \"目標 CLI\",\n \"tabs\": {\n \"assets\": \"資產關聯\",\n \"readiness\": \"就緒與生效\",\n \"environment\": \"專案環境 & Wiki\"\n },\n \"emptyProjects\": \"還沒有加入專案,先加入一個再來配置 AI 資產。\",\n \"openWorkflow\": \"設定專案工作流程\",\n \"orchestrationLink\": \"工作流程編排\",\n \"orchestrationHint\": \"階段、預設與變更執行方案在「流程與方法論」裡配置,會帶著目前專案跳過去。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} 次分析\",\n \"cachedFree\": \"¥0(快取)\",\n \"chartApiCalls\": \"API 呼叫\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 問答\",\n \"colCost\": \"費用\",\n \"colCount\": \"次數\",\n \"colTokens\": \"Token\",\n \"colType\": \"類型\",\n \"disclaimer\": \"費用為基於公開定價的估算,以供應商帳單為準。\",\n \"disclaimerCliSuffix\": \"CLI 代理用量見「設定 → 用量」。\",\n \"disclaimerShort\": \"估算 · 以供應商帳單為準\",\n \"emptyRoi\": \"近 {{days}} 天尚無 AI 呼叫記錄。觸發摘要、風險分析或 NL 問答後將在此展示 ROI。\",\n \"estimatedSuffix\": \"估算\",\n \"lastCall\": \"本次\",\n \"loadingRoi\": \"載入 ROI 資料…\",\n \"monthTotal\": \"本月累計\",\n \"monthTotalFailed\": \"本月累計查詢失敗(未知,不是 ¥0)\",\n \"monthTotalLoading\": \"本月累計 統計中…\",\n \"nlQueryCount\": \"{{queries}} 次問答\",\n \"panelTitle\": \"AI 成本-價值追蹤\",\n \"projectRisks\": \"{{risks}} 項風險\",\n \"projectScope\": \"{{projects}} 個專案\",\n \"projectUseful\": \"{{useful}} 次有用\",\n \"rangeDays\": \"{{days}} 天\",\n \"roiReport\": \"AI 投入報告\",\n \"sectionByProject\": \"按專案(消耗 ↔ 價值)\",\n \"sectionByType\": \"按分析類型\",\n \"statRisks\": \"發現風險\",\n \"statTokens\": \"Token\",\n \"statTotalSpend\": \"總投入\",\n \"statUseful\": \"標記有用\",\n \"stripTitle\": \"AI 成本透明\",\n \"trendTitle\": \"每日 AI 投入趨勢\",\n \"unknownPricing\": \"單價未知\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI 回饋\",\n \"markNotUseful\": \"標記為無用\",\n \"markUseful\": \"標記為有用\",\n \"notUseful\": \"無用\",\n \"useful\": \"有用\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 就緒度\",\n \"health\": \"健康評分\",\n \"nlQuery\": \"自然語言查詢\",\n \"portfolioSummary\": \"組合週報\",\n \"progress\": \"進度估算\",\n \"riskAnalysis\": \"風險分析\",\n \"summary\": \"專案摘要\",\n \"trendAnalysis\": \"趨勢分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI 回答\",\n \"costFailed\": \"成本統計查詢失敗(未知,不是 ¥0)\",\n \"detailToggle\": \"近 {{days}} 天分析明細\",\n \"guarding\": \"AI 正在守護\",\n \"inputLabel\": \"向 AI 提問\",\n \"notConfigured\": \"AI 問答與成本統計尚未啟用 —— 在「設定 → AI 供應方」填入 API Key 後,這裡會出現自然語言提問入口。\",\n \"placeholder\": \"向 AI 提問,如:哪個專案最近不活躍?幫我產生本週總結\",\n \"projectsUnit\": \"個專案\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"問答\",\n \"typeRisk\": \"風險\",\n \"typeSummary\": \"摘要\",\n \"typeTrend\": \"趨勢\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"分析風險\",\n \"analyzing\": \"正在分析風險…\",\n \"levelHigh\": \"高風險\",\n \"levelLow\": \"低風險\",\n \"levelMedium\": \"中風險\",\n \"none\": \"專案狀態健康,暫未發現風險\",\n \"sectionTitle\": \"風險分析\",\n \"title\": \"AI 風險分析\",\n \"typeActivity\": \"活躍度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"進度\",\n \"typeTechDebt\": \"技術債\"\n },\n \"weekly\": {\n \"analyzing\": \"正在分析 {{projects}} 個專案資料…\",\n \"cached\": \"快取\",\n \"copied\": \"已複製\",\n \"copyFailed\": \"複製失敗\",\n \"copySuccess\": \"週報已複製到剪貼簿\",\n \"dialogTitle\": \"AI 智慧週報\",\n \"errorGenerate\": \"週報產生失敗,請稍後重試。\",\n \"errorNoProvider\": \"未設定 AI 供應方,請先在設定中設定 AI Key。\",\n \"generate\": \"產生週報\",\n \"windowDays\": \"{{days}}天\",\n \"windowHint\": \"· 近 {{days}} 天資料\"\n }\n }\n}\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785846934.392311, "n": 150312, "h": "f819114668f56b36", "c": "{\n \"projectWiki\": {\n \"title\": \"專案 Wiki / 知識基線\",\n \"subtitle\": \"可被人類與 Agent 共同消費的工程知識基線\",\n \"loading\": \"正在掃描 Wiki…\",\n \"notInitialized\": \"未偵測到 wiki/index.md\",\n \"pageCount\": \"{{count}} 個頁面\",\n \"sourceRefs\": \"{{count}} 個原始碼參照\",\n \"questions\": \"{{count}} 個待查\",\n \"lastUpdated\": \"最近更新\",\n \"status\": {\n \"missing\": \"未初始化\",\n \"scaffolded\": \"已初始化\",\n \"effective\": \"新鮮\",\n \"drifted\": \"已變更\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · 快速入門\",\n \"L2\": \"L2 · 介面對接\",\n \"L3\": \"L3 · 運維排障\"\n },\n \"coverage\": {\n \"corePages\": \"核心頁面\",\n \"componentPages\": \"元件\",\n \"flowPages\": \"流程\",\n \"apiPages\": \"介面\",\n \"runbookPages\": \"運維手冊\"\n },\n \"actions\": {\n \"init\": \"初始化 Wiki\",\n \"lint\": \"執行 Lint 校驗\",\n \"refresh\": \"重新整理\",\n \"openInEditor\": \"在編輯器中開啟\",\n \"previewInit\": \"預覽初始化\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 剛初始化,變更對映尚未生效\",\n \"coldStartProgress\": \"目前有效 source_files 頁面:{{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"請點擊「生成專案 Wiki」,使用設定中的 AI 提供方生成並驗收\",\n \"affectedPages\": \"{{count}} 個原始碼變更,影響 {{pages}} 個 wiki 頁面\",\n \"unmapped\": \"{{count}} 個未對映變更\",\n \"noChanges\": \"無原始碼變更,wiki 頁面均為最新\"\n },\n \"lint\": {\n \"passed\": \"Lint 通過\",\n \"failed\": \"Lint 失敗:{{errors}} 個錯誤\",\n \"warnings\": \"{{count}} 個警告\",\n \"qualityLevel\": \"品質等級:{{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初始化預檢\",\n \"willCreate\": \"將建立 {{count}} 個檔案\",\n \"alreadyExists\": \"{{count}} 個檔案已存在(將跳過)\",\n \"confirm\": \"確認初始化\",\n \"success\": \"Wiki 初始化完成,已建立 {{count}} 個檔案\",\n \"blocked\": \"安全稽核阻斷\"\n },\n \"accept\": {\n \"success\": \"Wiki 已驗收,並已建立 Commit 同步基線\"\n },\n \"candidates\": {\n \"importSuccess\": \"已匯入 {{count}} 個檔案,正式 Wiki 已進入待驗收狀態\"\n },\n \"generator\": {\n \"success\": \"專案 Wiki 已生成並匯入,共 {{count}} 個頁面,請繼續驗收\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code / Codex / Gemini CLI 全方位輔助工具\"\n },\n \"common\": {\n \"add\": \"新增\",\n \"edit\": \"編輯\",\n \"delete\": \"刪除\",\n \"save\": \"儲存\",\n \"saving\": \"儲存中...\",\n \"cancel\": \"取消\",\n \"confirm\": \"確認\",\n \"close\": \"關閉\",\n \"done\": \"完成\",\n \"settings\": \"設定\",\n \"about\": \"關於\",\n \"version\": \"版本\",\n \"loading\": \"載入中...\",\n \"notInstalled\": \"未安裝\",\n \"success\": \"成功\",\n \"error\": \"錯誤\",\n \"unknown\": \"未知\",\n \"enterValidValue\": \"請輸入有效的內容\",\n \"clear\": \"清除\",\n \"toggleTheme\": \"切換主題\",\n \"format\": \"格式化\",\n \"formatSuccess\": \"格式化成功\",\n \"formatError\": \"格式化失敗:{{error}}\",\n \"copy\": \"複製\",\n \"view\": \"檢視\",\n \"back\": \"返回\",\n \"refresh\": \"重新整理\",\n \"refreshing\": \"重新整理中...\",\n \"import\": \"匯入\",\n \"all\": \"全部\",\n \"search\": \"搜尋\",\n \"reset\": \"重設\",\n \"actions\": \"操作\",\n \"deleting\": \"刪除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"已啟用\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"歡迎使用 OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar 可以協助您在 Claude Code / Codex / Gemini CLI 的多個供應商之間一鍵切換。如果您之前已經設定過這些工具,OpenSunstar 會自動將現有設定儲存為名為 default 的供應商,確保您的設定不會遺失。\",\n \"bodyOfficial\": \"清單中還預設了「官方 (Official)」供應商,隨時點擊即可切換回官方預設設定。切換前 OpenSunstar 會自動將目前設定備份回 default,可以放心來回切換。這就是 OpenSunstar 的運作方式。\",\n \"confirm\": \"我了解了\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"請輸入 API Key\",\n \"show\": \"顯示 API Key\",\n \"hide\": \"隱藏 API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定必須是 JSON 物件,不能是陣列或其他類型\",\n \"invalidJson\": \"JSON 格式錯誤\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"什麼是通用設定片段?\",\n \"guidePurpose\": \"用來在不同供應商之間共用外掛程式、環境變數等非敏感設定。切換供應商時不會遺失這些設定。\",\n \"guideUsage\": \"用法:① 點擊「從編輯內容擷取」儲存通用部分 ② 新增供應商時勾選「寫入通用設定」\",\n \"guideReExtract\": \"如果您新安裝了外掛程式或 Hook,請重新擷取一次通用設定,以便同步至其他供應商。\",\n \"guideReassurance\": \"請放心:您的原始設定已儲存在預設供應商中,不會遺失。\",\n \"emptyTitle\": \"尚未建立通用設定片段\",\n \"emptyHint\": \"點擊下方「從編輯內容擷取」按鈕,從目前設定中擷取可重複使用的部分\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code 設定 (JSON) *\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯通用設定片段\",\n \"commonConfigHint\": \"該片段會在勾選「寫入通用設定」時合併到 settings.json 中\",\n \"fullSettingsHint\": \"完整的 Claude Code settings.json 設定內容\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"hideAttribution\": \"隱藏 AI 署名\",\n \"enableTeammates\": \"Teammates 模式\",\n \"enableToolSearch\": \"啟用 Tool Search\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"停用自動升級\"\n },\n \"header\": {\n \"viewOnGithub\": \"在 GitHub 上檢視\",\n \"toggleDarkMode\": \"切換至深色模式\",\n \"toggleLightMode\": \"切換至淺色模式\",\n \"addProvider\": \"新增供應商\",\n \"switchToChinese\": \"切換至中文\",\n \"switchToEnglish\": \"切換至英文\",\n \"enterEditMode\": \"進入編輯模式\",\n \"exitEditMode\": \"退出編輯模式\",\n \"windowMinimize\": \"最小化視窗\",\n \"windowMaximize\": \"最大化視窗\",\n \"windowRestore\": \"還原視窗\",\n \"windowClose\": \"關閉視窗\"\n },\n \"provider\": {\n \"tabProvider\": \"供應商\",\n \"tabUniversal\": \"通用供應商\",\n \"noProviders\": \"尚未新增任何供應商\",\n \"noProvidersDescription\": \"如果您已有設定,請點擊「匯入目前設定」,所有資料將安全儲存在 default 供應商中\",\n \"noProvidersDescriptionSnippet\": \"除 API Key 和請求位址外的資料(如外掛程式設定)會被儲存至通用設定片段,用於在不同供應商之間共用\",\n \"importCurrent\": \"匯入目前設定\",\n \"importFromClaude\": \"將 Claude Code 中已有的供應商匯入\",\n \"importCurrentDescription\": \"將目前正在使用的設定匯入為預設供應商\",\n \"currentlyUsing\": \"目前使用\",\n \"enable\": \"啟用\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"代理接管模式下無法切換至官方供應商\",\n \"editProvider\": \"編輯供應商\",\n \"editProviderHint\": \"更新設定後將立即套用至目前供應商。\",\n \"deleteProvider\": \"刪除供應商\",\n \"addNewProvider\": \"新增供應商\",\n \"addClaudeProvider\": \"新增 Claude Code 供應商\",\n \"addCodexProvider\": \"新增 Codex 供應商\",\n \"addGeminiProvider\": \"新增 Gemini 供應商\",\n \"addOpenCodeProvider\": \"新增 OpenCode 供應商\",\n \"addToConfig\": \"新增\",\n \"removeFromConfig\": \"移除\",\n \"setAsDefault\": \"設為預設\",\n \"isDefault\": \"目前預設\",\n \"inConfig\": \"已新增\",\n \"addProviderHint\": \"填寫資訊後即可在清單中快速切換供應商。\",\n \"editClaudeProvider\": \"編輯 Claude Code 供應商\",\n \"editCodexProvider\": \"編輯 Codex 供應商\",\n \"configError\": \"設定錯誤\",\n \"notConfigured\": \"未設定官網位址\",\n \"applyToClaudePlugin\": \"套用至 Claude 外掛程式\",\n \"removeFromClaudePlugin\": \"從 Claude 外掛程式移除\",\n \"dragToReorder\": \"拖曳以重新排序\",\n \"dragHandle\": \"拖曳排序\",\n \"searchPlaceholder\": \"依名稱/備註/網址搜尋供應商...\",\n \"searchAriaLabel\": \"搜尋供應商\",\n \"searchScopeHint\": \"根據名稱、備註和官網連結比對結果。\",\n \"searchCloseHint\": \"按 Esc 關閉\",\n \"searchCloseAriaLabel\": \"關閉供應商搜尋\",\n \"noSearchResults\": \"沒有符合搜尋條件的供應商。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"排序更新失敗\",\n \"configureUsage\": \"設定用量查詢\",\n \"officialPartner\": \"官方合作夥伴\",\n \"managedByHermes\": \"Hermes 託管\",\n \"managedByHermesHint\": \"該專案定義於 Hermes 的 providers: dict,請在 Hermes Web UI 中編輯或刪除。\",\n \"openTerminal\": \"開啟終端機\",\n \"terminalOpened\": \"終端機已開啟\",\n \"terminalOpenFailed\": \"開啟終端機失敗\",\n \"name\": \"供應商名稱\",\n \"namePlaceholder\": \"例如:Claude 官方\",\n \"websiteUrl\": \"官網連結\",\n \"notes\": \"備註\",\n \"notesPlaceholder\": \"例如:公司專用帳號\",\n \"configJson\": \"設定 JSON\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfigButton\": \"編輯通用設定\",\n \"configJsonHint\": \"請填寫完整的 Claude Code 設定\",\n \"editCommonConfigTitle\": \"編輯通用設定片段\",\n \"editCommonConfigHint\": \"通用設定片段將合併至所有啟用它的供應商設定中\",\n \"addProvider\": \"新增供應商\",\n \"sortUpdated\": \"排序已更新\",\n \"usageSaved\": \"用量查詢設定已儲存\",\n \"usageSaveFailed\": \"用量查詢設定儲存失敗\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \"使用 .env 格式設定 Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"模型\",\n \"oauthTitle\": \"OAuth 驗證模式\",\n \"oauthHint\": \"Google 官方使用 OAuth 個人驗證,無需填寫 API Key。首次使用時會自動開啟瀏覽器進行登入。\",\n \"apiKeyPlaceholder\": \"請輸入 Gemini API Key\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支援路由\"\n },\n \"codex\": {\n \"needsRouting\": \"需要路由\",\n \"noRoutingSupport\": \"不支援路由\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop 官方供應商使用應用程式內建的 1P 登入,無需設定 API Key 和 API 位址。\",\n \"mode\": \"模型處理方式\",\n \"modeDirect\": \"直連\",\n \"modeProxy\": \"需要路由\",\n \"modelMappingToggle\": \"需要模型對應\",\n \"modelMappingOffHint\": \"僅當供應商直接接受 Claude Desktop 可識別的三檔角色 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)時才適用直連;其他模型名(含 claude-3-5-sonnet-… 等舊式 ID)請開啟此開關走對應。\",\n \"modelMappingOnHint\": \"Claude Desktop 只接受 claude-sonnet-* / claude-opus-* / claude-haiku-* 三檔角色 ID。開啟後 OpenSunstar 會把這三檔對應到供應商的實際模型,並在使用期間保持本地路由開啟。\",\n \"routeMapTitle\": \"模型對應\",\n \"routeMapHint\": \"為 Sonnet、Opus、Haiku 三檔分別填寫實際請求模型;選單顯示名稱可寫 DeepSeek、Kimi 等品牌名。留空的檔會自動沿用 Sonnet(或第一個已填檔)的模型,確保子 agent 呼叫的 Haiku 始終可用。\",\n \"routeModelLabel\": \"模型角色\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"選單顯示名稱\",\n \"upstreamModelLabel\": \"實際請求模型\",\n \"supports1mLabel\": \"聲明支援 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"手動指定 Claude Desktop 模型清單(進階,選填)\",\n \"directModelListCollapsedHint\": \"原生 Claude 模型供應商通常不需填寫,Claude Desktop 會自動讀取 /v1/models。\",\n \"directModelListHint\": \"僅當供應商的 /v1/models 不可用或沒有回傳 Claude Desktop 可識別的 Sonnet / Opus / Haiku 模型名稱時填寫;勾選 1M 會向 Claude Desktop 聲明支援 1M 上下文。\",\n \"directModelInvalid\": \"直連模型必須使用 Claude Desktop 可識別的 Sonnet / Opus / Haiku 模型名稱\",\n \"addModel\": \"新增模型\",\n \"addRoute\": \"新增模型\",\n \"routeInvalid\": \"請選擇模型角色並填寫實際請求模型\",\n \"routesRequired\": \"至少填寫一個模型對應\",\n \"statusTitle\": \"Claude Desktop 設定需要檢查\",\n \"statusUnsupported\": \"目前平台暫不支援 Claude Desktop 3P 設定寫入。\",\n \"statusStaleRawModels\": \"Claude Desktop profile 中存在非 Sonnet / Opus / Haiku 角色模型名稱,新版 Claude Desktop 可能拒絕載入;重新切換目前供應商可修復。\",\n \"statusMissingRouteMappings\": \"目前供應商啟用了模型對應,但沒有有效路由;請編輯供應商並補全至少一個模型對應。\",\n \"statusGatewayTokenMissing\": \"目前本地路由 token 尚未產生;重新切換該供應商會寫入新的本地 token。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile 指向的位址與目前供應商不一致;目前為 {{actual}},應為 {{expected}}。重新切換目前供應商可修復。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop 本地路由已開啟 - {{address}}:{{port}}\",\n \"inactive\": \"開啟 Claude Desktop 本地路由,用於需要模型對應或格式轉換的供應商。目前設定位址:{{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"供應商已新增\",\n \"providerSaved\": \"供應商設定已儲存\",\n \"providerDeleted\": \"供應商刪除成功\",\n \"switchSuccess\": \"切換成功!\",\n \"codexRestartRequired\": \"切換成功,請重新啟動客戶端以套用\",\n \"claudeDesktopRestartRequired\": \"切換成功,重新啟動 Claude Desktop 後生效\",\n \"claudeDesktopProxyRestartRequired\": \"切換成功,請保持 OpenSunstar 執行,並重新啟動 Claude Desktop 後生效\",\n \"addToConfigSuccess\": \"已新增至設定\",\n \"removeFromConfigSuccess\": \"已從設定移除\",\n \"switchFailedTitle\": \"切換失敗\",\n \"switchFailed\": \"切換失敗:{{error}}\",\n \"autoImported\": \"已從現有設定建立預設供應商\",\n \"addFailed\": \"新增供應商失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"saveFailedGeneric\": \"儲存失敗,請重試\",\n \"appliedToClaudePlugin\": \"已套用至 Claude 外掛程式\",\n \"removedFromClaudePlugin\": \"已從 Claude 外掛程式移除\",\n \"syncClaudePluginFailed\": \"同步 Claude 外掛程式失敗\",\n \"skipClaudeOnboardingFailed\": \"跳過 Claude Code 初次安裝確認失敗\",\n \"clearClaudeOnboardingSkipFailed\": \"還原 Claude Code 初次安裝確認失敗\",\n \"updateSuccess\": \"供應商更新成功\",\n \"updateFailed\": \"更新供應商失敗:{{error}}\",\n \"deleteSuccess\": \"供應商已刪除\",\n \"deleteFailed\": \"刪除供應商失敗:{{error}}\",\n \"settingsSaved\": \"設定已儲存\",\n \"settingsSaveFailed\": \"儲存設定失敗:{{error}}\",\n \"proxyRequiredForSwitch\": \"此供應商 {{reason}},需要路由服務才能正常使用,請先啟動路由\",\n \"proxyReasonCopilot\": \"使用 GitHub Copilot 作為 Claude 供應商\",\n \"proxyReasonOpenAIChat\": \"使用 OpenAI Chat API 格式\",\n \"proxyReasonOpenAIResponses\": \"使用 OpenAI Responses API 格式\",\n \"proxyReasonFullUrl\": \"開啟了完整 URL 連線模式\",\n \"openAIFormatHint\": \"此供應商使用 OpenAI 相容格式,需要開啟路由服務才能正常使用\",\n \"copilotProxyHint\": \"GitHub Copilot 作為 Claude 供應商時始終需要本地路由;路由會根據目前模型自動選擇 Chat Completions 或 Responses。\",\n \"openLinkFailed\": \"連結開啟失敗\",\n \"openclawModelsRegistered\": \"模型已註冊至 /model 清單\",\n \"openclawDefaultModelSet\": \"已設為預設模型\",\n \"openclawDefaultModelSetFailed\": \"設定預設模型失敗\",\n \"openclawNoModels\": \"該供應商沒有設定模型\",\n \"backfillWarning\": \"切換成功,但舊供應商設定回填失敗,您手動修改的設定可能未儲存\",\n \"windowControlFailed\": \"視窗控制失敗:{{error}}\",\n \"officialBlockedByProxy\": \"本地路由模式下不能切換至官方供應商,使用路由存取官方 API 可能導致帳號被封鎖\",\n \"proxyOfficialWarning\": \"目前供應商 {{name}} 是官方供應商,建議切換至第三方供應商後再使用本地路由\"\n },\n \"confirm\": {\n \"deleteProvider\": \"刪除供應商\",\n \"deleteProviderMessage\": \"確定要刪除供應商「{{name}}」嗎?此操作無法復原。\",\n \"removeProvider\": \"移除供應商\",\n \"removeProviderMessage\": \"確定要從設定中移除供應商「{{name}}」嗎?\\n\\n移除後該供應商將不再生效,但設定資料會保留在 OpenSunstar 中,您可以隨時重新新增。\",\n \"proxy\": {\n \"title\": \"啟用本地路由服務\",\n \"message\": \"本地路由是一項進階功能,啟用前請確保您已了解其運作原理。\\n\\n建議先查閱相關文件或諮詢您的供應商,以取得正確的設定方式。\",\n \"confirm\": \"我已了解,繼續啟用\"\n },\n \"failover\": {\n \"title\": \"啟用故障轉移功能\",\n \"message\": \"故障轉移是一項進階功能,啟用前請確保您已了解其運作原理。\\n\\n建議先在故障轉移佇列中設定好供應商優先順序。\",\n \"confirm\": \"我已了解,繼續啟用\"\n },\n \"usage\": {\n \"title\": \"設定用量查詢\",\n \"message\": \"用量查詢需要設定專用的查詢腳本或 API 參數,請確保您已從供應商處取得相關資訊。\\n\\n如不確定如何設定,請先查閱供應商文件。\",\n \"confirm\": \"我已了解,繼續設定\"\n },\n \"streamCheck\": {\n \"title\": \"模型健康檢測\",\n \"message\": \"健康檢測透過直接發送 API 請求來測試供應商連線能力,以下情況可能導致檢測失敗:\\n\\n• 官方供應商(使用 OAuth 登入,無獨立 API Key)\\n• 部分中繼服務(會驗證請求是否來自 Claude Code CLI)\\n• AWS Bedrock(使用 IAM 簽章驗證)\\n\\n檢測失敗不代表供應商不可用,僅表示無法透過獨立請求驗證。請以應用程式內的實際情況為準。\",\n \"confirm\": \"我已了解,繼續檢測\"\n },\n \"autoSync\": {\n \"title\": \"開啟自動同步\",\n \"message\": \"開啟自動同步後,每次資料庫變更都會自動上傳至 WebDAV 伺服器。\\n\\n這可能會產生較高的網路流量消耗,請確保您的網路環境和 WebDAV 服務支援頻繁的資料傳輸。\",\n \"confirm\": \"我已了解,繼續開啟\"\n },\n \"commonConfig\": {\n \"title\": \"關於通用設定\",\n \"message\": \"「通用設定片段」可以在不同供應商之間共用外掛程式、環境變數等設定,避免切換供應商時遺失這些設定。\\n\\n使用方法:\\n① 編輯供應商時點擊「編輯通用設定」→「從編輯內容擷取」\\n② 新增供應商時勾選「寫入通用設定」(預設已勾選)\\n\\n如果您新安裝了外掛程式或 Hook,請重新擷取一次通用設定。\",\n \"confirm\": \"我了解了\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"通用\",\n \"tabGeneral\": \"通用\",\n \"tabAuth\": \"驗證\",\n \"tabAdvanced\": \"進階\",\n \"tabProxy\": \"路由\",\n \"authCenter\": {\n \"title\": \"驗證中心\",\n \"description\": \"將第三方 Key 與官方訂閱登入拆成兩條驗證軌道,協助你識別每個 CLI 目前依賴的憑據來源。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"本地 CLI 登入狀態\",\n \"readonlyProbe\": \"唯讀探測\",\n \"localCliDescription\": \"區分第三方 Key 與官方訂閱登入,只揭露本地狀態訊號,不接管 Claude 或 Google 帳號憑據。\",\n \"localCliLoading\": \"正在讀取本地 CLI 授權狀態…\",\n \"managedAccountsTitle\": \"託管帳號\",\n \"managedAccountsDescription\": \"由 OpenSunstar 管理的帳號登入,可綁定到對應 Provider 或本地代理鏈路。\",\n \"copilotDescription\": \"管理 GitHub Copilot 帳號\",\n \"codexOauthDescription\": \"管理 ChatGPT 帳號\",\n \"xaiOauthDescription\": \"管理 xAI / Grok 帳號\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定檔目錄\",\n \"description\": \"管理 Claude、Codex 和 Gemini 的設定儲存路徑\"\n },\n \"proxy\": {\n \"title\": \"本地路由\",\n \"description\": \"控制路由服務開關、查看狀態與連接埠資訊\",\n \"enableFeature\": \"在主頁面顯示本地路由開關\",\n \"enableFeatureDescription\": \"開啟後,主頁面頂部將顯示路由和故障轉移開關\",\n \"enableFailoverToggle\": \"在主頁面顯示故障轉移開關\",\n \"enableFailoverToggleDescription\": \"開啟後,主頁面頂部將獨立顯示故障轉移開關\",\n \"running\": \"執行中\",\n \"stopped\": \"已停止\"\n },\n \"modelTest\": {\n \"title\": \"模型測試設定\",\n \"description\": \"設定模型測試使用的預設模型和提示詞\"\n },\n \"failover\": {\n \"title\": \"自動故障轉移\",\n \"description\": \"設定故障轉移佇列和斷路器策略\"\n },\n \"pricing\": {\n \"title\": \"成本定價\",\n \"description\": \"管理各模型 Token 計費規則\"\n },\n \"globalProxy\": {\n \"title\": \"全域出站代理伺服器\",\n \"description\": \"設定 OpenSunstar 存取外部 API 時使用的代理伺服器\"\n },\n \"data\": {\n \"title\": \"資料管理\",\n \"description\": \"匯入和匯出本地設定資料\"\n },\n \"backup\": {\n \"title\": \"備份與還原\",\n \"description\": \"管理自動備份,查看和還原資料庫快照\"\n },\n \"cloudSync\": {\n \"title\": \"雲端同步\",\n \"description\": \"透過 WebDAV 在多裝置間同步資料\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"自動修復 API 請求中的相容性問題\",\n \"enabled\": \"啟用整流器\",\n \"enabledDescription\": \"總開關,關閉後所有整流功能將被停用\",\n \"requestGroup\": \"請求整流\",\n \"responseGroup\": \"回應整流\",\n \"thinkingSignature\": \"Thinking 簽章整流\",\n \"thinkingSignatureDescription\": \"當 Anthropic 類型供應商回傳 thinking 簽章不相容或非法請求等錯誤時,自動移除不相容的 thinking 相關區塊,並對同一供應商重試一次\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"當 Anthropic 類型供應商回傳 budget_tokens 限制錯誤(如至少 1024)時,自動將 thinking 規範為 enabled,並將 budget 設為 32000,同時在需要時將 max_tokens 設為 64000,然後重試一次\",\n \"mediaFallback\": \"不支援圖片降級\",\n \"mediaFallbackDescription\": \"當供應商不支援圖片輸入時(已宣告純文字能力,或上游回傳不支援圖片的錯誤),自動將圖片區塊替換為 [Unsupported Image] 標記,使對話不中斷\",\n \"mediaHeuristic\": \"啟發式純文字模型辨識\",\n \"mediaHeuristicDescription\": \"傳送前依內建模型名稱清單預測性地移除圖片。關閉後僅保留「已宣告純文字」與「上游錯誤兜底」兩條事實驅動路徑,避免內建清單將多模態模型誤判為純文字而靜默丟失圖片\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock 請求最佳化工具\",\n \"description\": \"在請求發送前自動最佳化 Thinking 和 Cache 設定(僅 Bedrock 供應商生效)\",\n \"enabled\": \"啟用最佳化工具\",\n \"thinkingOptimizer\": \"Thinking 最佳化\",\n \"thinkingOptimizerDescription\": \"自動為 Opus/Sonnet 啟用 Adaptive Thinking,為舊模型注入 Extended Thinking\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"自動在請求關鍵位置注入 Cache 斷點,減少重複 token 計費\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分鐘\",\n \"cacheTtl1h\": \"1 小時\"\n },\n \"logConfig\": {\n \"title\": \"日誌管理\",\n \"description\": \"控制日誌輸出層級\",\n \"enabled\": \"啟用日誌\",\n \"enabledDescription\": \"總開關,關閉後所有日誌將被停用\",\n \"level\": \"日誌層級\",\n \"levelDescription\": \"設定輸出的最低日誌層級\",\n \"levels\": {\n \"error\": \"錯誤\",\n \"warn\": \"警告\",\n \"info\": \"資訊\",\n \"debug\": \"偵錯\",\n \"trace\": \"追蹤\"\n },\n \"levelHint\": \"日誌層級說明:\",\n \"levelDesc\": {\n \"error\": \"僅嚴重錯誤\",\n \"warn\": \"錯誤 + 警告資訊\",\n \"info\": \"一般操作資訊(預設)\",\n \"debug\": \"詳細資訊,包含 SSE 串流與請求/回應詳情\",\n \"trace\": \"全部日誌,最詳細\"\n }\n }\n },\n \"language\": \"介面語言\",\n \"languageHint\": \"切換後立即預覽介面語言,儲存後永久生效。\",\n \"theme\": \"外觀主題\",\n \"themeHint\": \"選擇應用程式的外觀主題,立即生效。\",\n \"themeLight\": \"淺色\",\n \"themeDark\": \"深色\",\n \"themeSystem\": \"跟隨系統\",\n \"importExport\": \"SQL 匯入匯出\",\n \"importExportHint\": \"匯入/匯出資料庫 SQL 備份(僅支援匯入由 OpenSunstar 匯出的備份),便於備份或遷移。\",\n \"exportConfig\": \"匯出 SQL 備份\",\n \"selectConfigFile\": \"選擇 SQL 檔案\",\n \"noFileSelected\": \"尚未選擇設定檔。\",\n \"import\": \"匯入\",\n \"importing\": \"匯入中...\",\n \"importSuccess\": \"匯入成功!\",\n \"importFailed\": \"匯入失敗\",\n \"syncLiveFailed\": \"已匯入,但同步至目前供應商失敗,請手動重新選擇一次供應商。\",\n \"importPartialSuccess\": \"設定已匯入,但同步至目前供應商失敗。\",\n \"importPartialHint\": \"請手動重新選擇一次供應商以重新整理對應設定。\",\n \"configExported\": \"設定已匯出至:\",\n \"exportFailed\": \"匯出失敗\",\n \"selectFileFailed\": \"請選擇有效的 SQL 備份檔案\",\n \"configCorrupted\": \"SQL 檔案可能已損壞或格式不正確\",\n \"backupId\": \"備份 ID\",\n \"backupManager\": {\n \"title\": \"資料庫備份\",\n \"description\": \"自動備份的資料庫快照,可用於還原至之前的狀態\",\n \"empty\": \"暫無備份\",\n \"restore\": \"還原\",\n \"restoring\": \"還原中...\",\n \"confirmTitle\": \"確認還原備份\",\n \"confirmMessage\": \"還原至此備份將覆寫目前資料庫。還原前會自動建立安全備份。\",\n \"restoreSuccess\": \"還原成功!安全備份已建立\",\n \"restoreFailed\": \"還原失敗\",\n \"safetyBackupId\": \"安全備份 ID\",\n \"intervalLabel\": \"自動備份間隔\",\n \"retainLabel\": \"備份保留數量\",\n \"intervalDisabled\": \"停用\",\n \"intervalHours\": \"{{hours}} 小時\",\n \"intervalDays\": \"{{days}} 天\",\n \"rename\": \"重新命名\",\n \"renameSuccess\": \"備份重新命名成功\",\n \"renameFailed\": \"重新命名失敗\",\n \"namePlaceholder\": \"輸入新名稱\",\n \"createBackup\": \"立即備份\",\n \"creating\": \"備份中...\",\n \"createSuccess\": \"備份建立成功\",\n \"createFailed\": \"備份建立失敗\",\n \"delete\": \"刪除\",\n \"deleting\": \"刪除中...\",\n \"deleteSuccess\": \"備份已刪除\",\n \"deleteFailed\": \"刪除失敗\",\n \"deleteConfirmTitle\": \"確認刪除備份\",\n \"deleteConfirmMessage\": \"此備份將被永久刪除,此操作無法復原。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV 雲端同步\",\n \"description\": \"透過 WebDAV 在多裝置間同步資料庫和技能設定。\",\n \"baseUrl\": \"WebDAV 伺服器位址\",\n \"baseUrlPlaceholder\": \"https://dav.jianguoyun.com/dav/\",\n \"username\": \"WebDAV 帳號\",\n \"usernamePlaceholder\": \"信箱帳號\",\n \"password\": \"WebDAV 密碼\",\n \"passwordPlaceholder\": \"應用程式密碼(堅果雲請使用「第三方應用程式密碼」)\",\n \"remoteRoot\": \"遠端根目錄\",\n \"profile\": \"同步設定名稱\",\n \"autoSync\": \"自動同步\",\n \"autoSyncHint\": \"開啟後每次資料庫變更都會自動上傳至 WebDAV。\",\n \"test\": \"測試連線\",\n \"testing\": \"測試中...\",\n \"testSuccess\": \"連線成功\",\n \"testFailed\": \"連線失敗:{{error}}\",\n \"save\": \"儲存設定\",\n \"saving\": \"儲存中...\",\n \"saveFailed\": \"儲存設定失敗:{{error}}\",\n \"upload\": \"上傳至雲端\",\n \"uploading\": \"上傳中...\",\n \"uploadSuccess\": \"已上傳至 WebDAV\",\n \"uploadFailed\": \"上傳失敗:{{error}}\",\n \"autoSyncFailedToast\": \"自動同步失敗:{{error}}\",\n \"download\": \"從雲端下載\",\n \"downloading\": \"下載中...\",\n \"downloadSuccess\": \"已從 WebDAV 下載並還原\",\n \"downloadFailed\": \"下載失敗:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次自動同步失敗\",\n \"autoSyncLastErrorHint\": \"請檢查網路或 WebDAV 設定,系統會在後續變更時繼續自動重試。\",\n \"missingUrl\": \"請填寫 WebDAV 伺服器位址\",\n \"presets\": {\n \"label\": \"服務商\",\n \"jianguoyun\": \"堅果雲\",\n \"jianguoyunHint\": \"請在堅果雲「安全選項」中產生「第三方應用程式密碼」,不要使用登入密碼。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"請將 your-server 替換為您的 Nextcloud 伺服器位址,USERNAME 替換為您的使用者名稱。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"請先在 Synology「套件中心」安裝並啟用 WebDAV Server 套件。\",\n \"custom\": \"自訂\"\n },\n \"remoteRootDefault\": \"預設: OpenSunstar-sync\",\n \"profileDefault\": \"預設: default\",\n \"saveAndTestSuccess\": \"設定已儲存,連線正常\",\n \"saveAndTestFailed\": \"設定已儲存,但連線測試失敗:{{error}}\",\n \"noRemoteData\": \"雲端沒有找到同步資料\",\n \"incompatibleVersion\": \"遠端資料版本不相容(協定 v{{protocolVersion}},資料庫 {{dbCompatVersion}}),目前支援協定 v2 / db-v6\",\n \"unsaved\": \"未儲存\",\n \"saved\": \"已儲存\",\n \"unsavedChanges\": \"請先儲存設定\",\n \"saveBeforeSync\": \"請先儲存設定,再使用上傳/下載。\",\n \"fetchingRemote\": \"取得遠端資訊...\",\n \"fetchRemoteFailed\": \"取得遠端資訊失敗,請檢查設定和網路後重試。\",\n \"confirmDownload\": {\n \"title\": \"從雲端還原\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"path\": \"遠端路徑\",\n \"dbCompat\": \"資料庫相容層\",\n \"artifacts\": \"包含內容\",\n \"legacyNotice\": \"檢測到舊版雲端路徑。還原完成後,下次上傳將寫入新路徑 v2/db-v6。\",\n \"warning\": \"還原將覆寫本地所有資料和技能設定\",\n \"confirm\": \"確認還原\"\n },\n \"confirmUpload\": {\n \"title\": \"上傳至雲端\",\n \"content\": \"將同步以下內容至 WebDAV 伺服器:\",\n \"dbItem\": \"資料庫(所有 Provider 設定和資料)\",\n \"skillsItem\": \"技能包(所有自訂技能)\",\n \"targetPath\": \"目標路徑\",\n \"existingData\": \"雲端已有資料\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"path\": \"遠端路徑\",\n \"dbCompat\": \"資料庫相容層\",\n \"warning\": \"將覆寫雲端已有的同步資料\",\n \"legacyNotice\": \"檢測到舊版雲端路徑資料。本次上傳將寫入新路徑 v2/db-v6,不會覆寫舊路徑。\",\n \"confirm\": \"確認上傳\"\n }\n },\n \"syncType\": {\n \"label\": \"同步方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 相容儲存\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"服務商\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"使用 IAM Access Key,需要 s3:PutObject/GetObject/HeadObject 權限。Region 範例:us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"需要自訂 Endpoint,如 http://minio.local:9000。Region 可設為 us-east-1\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com,Region 設為 auto\",\n \"oss\": \"阿里雲 OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com,Region 範例:cn-hangzhou, cn-shanghai\",\n \"cos\": \"騰訊雲 COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com,Region 範例:ap-guangzhou, ap-beijing\",\n \"obs\": \"華為雲 OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com,Region 範例:cn-north-4, cn-east-3\",\n \"custom\": \"S3 相容服務(自訂)\",\n \"customHint\": \"任意 S3 相容服務,需要自訂 Endpoint\"\n },\n \"region\": \"區域 (Region)\",\n \"regionPlaceholder\": \"例如 us-east-1\",\n \"bucket\": \"儲存桶 (Bucket)\",\n \"bucketPlaceholder\": \"例如 my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例如 AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"留空則保持現有金鑰\",\n \"endpoint\": \"Endpoint(AWS 可留空)\",\n \"endpointHint\": \"多數 S3 相容服務需要填寫\",\n \"endpointPlaceholder\": \"例如 https://s3-compatible.example.com\",\n \"remoteRoot\": \"遠端根目錄\",\n \"remoteRootDefault\": \"預設: OpenSunstar-sync\",\n \"profile\": \"同步設定檔名稱\",\n \"profileDefault\": \"預設: default\",\n \"autoSync\": \"自動同步\",\n \"autoSyncHint\": \"開啟後每次資料庫變更都會自動上傳到 S3。\",\n \"enabled\": \"啟用 S3 同步\",\n \"enabledHint\": \"開啟後可使用 S3 上傳/下載和自動同步。\",\n \"mutualExclusionTitle\": \"切換同步方式\",\n \"mutualExclusionMessage\": \"啟用 S3 同步將停用目前的 WebDAV 同步,是否繼續?\",\n \"mutualExclusionMessageReverse\": \"啟用 WebDAV 同步將停用目前的 S3 同步,是否繼續?\",\n \"mutualExclusionFailed\": \"切換同步方式失敗:{{error}}\",\n \"testConnection\": \"測試連線\",\n \"connectionOk\": \"S3 連線成功\",\n \"test\": \"測試連線\",\n \"testing\": \"測試中...\",\n \"testSuccess\": \"S3 連線成功\",\n \"testFailed\": \"S3 連線失敗:{{error}}\",\n \"save\": \"儲存設定\",\n \"saving\": \"儲存中...\",\n \"saveFailed\": \"儲存設定失敗:{{error}}\",\n \"saveAndTestSuccess\": \"設定已儲存,S3 連線正常\",\n \"saveAndTestFailed\": \"設定已儲存,但 S3 連線測試失敗:{{error}}\",\n \"upload\": \"上傳至雲端\",\n \"uploading\": \"上傳中...\",\n \"uploadSuccess\": \"已上傳到 S3\",\n \"uploadFailed\": \"S3 上傳失敗:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同步失敗:{{error}}\",\n \"download\": \"從雲端下載\",\n \"downloading\": \"下載中...\",\n \"downloadSuccess\": \"已從 S3 下載並還原\",\n \"downloadFailed\": \"S3 下載失敗:{{error}}\",\n \"lastSync\": \"上次同步:{{time}}\",\n \"autoSyncLastErrorTitle\": \"上次 S3 自動同步失敗\",\n \"autoSyncLastErrorHint\": \"請檢查網路或 S3 設定,系統會在後續變更時繼續自動重試。\",\n \"missingBucket\": \"請填寫 S3 儲存桶\",\n \"noRemoteData\": \"S3 儲存桶中沒有找到同步資料\",\n \"incompatibleVersion\": \"遠端資料版本不相容(版本 {{version}}),目前支援協議 v2 / db-v6\",\n \"unsaved\": \"未儲存\",\n \"saved\": \"已儲存\",\n \"unsavedChanges\": \"請先儲存設定\",\n \"saveBeforeSync\": \"請先儲存設定,再使用上傳/下載。\",\n \"fetchingRemote\": \"取得遠端資訊...\",\n \"fetchRemoteFailed\": \"取得遠端資訊失敗,請檢查設定和網路後重試。\",\n \"notConfigured\": \"未設定 S3 同步\",\n \"disabled\": \"S3 同步未啟用\",\n \"confirmDownload\": {\n \"title\": \"從 S3 還原\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"artifacts\": \"包含內容\",\n \"warning\": \"還原將覆寫本地所有資料和技能設定\",\n \"confirm\": \"確認還原\"\n },\n \"confirmUpload\": {\n \"title\": \"上傳到 S3\",\n \"content\": \"將同步以下內容到 S3 儲存桶:\",\n \"dbItem\": \"資料庫(所有 Provider 設定和資料)\",\n \"skillsItem\": \"技能包(所有自訂技能)\",\n \"targetPath\": \"目標物件路徑\",\n \"existingData\": \"雲端已有資料\",\n \"deviceName\": \"上傳裝置\",\n \"createdAt\": \"上傳時間\",\n \"warning\": \"將覆寫該 S3 路徑下已有的同步資料\",\n \"confirm\": \"確認上傳\"\n }\n },\n \"autoReload\": \"資料已重新整理\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"視窗行為\",\n \"windowBehaviorHint\": \"設定視窗最小化與 Claude 外掛程式連動策略。\",\n \"notificationPreferences\": \"通知偏好\",\n \"budgetAlertNotifications\": \"預算超限系統通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency 等級預算告警時發送系統級通知(warning 仍僅在應用內提示)\",\n \"failoverAlertNotifications\": \"故障轉移系統通知\",\n \"failoverAlertNotificationsDescription\": \"供應商自動故障轉移完成後發送系統級通知\",\n \"trayBadgeNotifications\": \"系統匣紅點提醒\",\n \"trayBadgeNotificationsDescription\": \"有未讀告警時系統匣圖示切換為告警態並在選單頂部顯示告警項目\",\n \"workspaceAlertFirst\": \"工作區告警首螢幕\",\n \"workspaceAlertFirstDescription\": \"開啟後「今日工作台」首屏顯示告警卡片;關閉時告警僅透過系統匣/系統通知觸達,保持既有使用習慣\",\n \"launchOnStartup\": \"開機自動啟動\",\n \"launchOnStartupDescription\": \"隨系統啟動自動執行 OpenSunstar\",\n \"silentStartup\": \"靜默啟動\",\n \"silentStartupDescription\": \"程式啟動時不顯示主視窗,僅在系統匣執行\",\n \"autoLaunchFailed\": \"設定開機自動啟動失敗\",\n \"minimizeToTray\": \"關閉時最小化至系統匣\",\n \"minimizeToTrayDescription\": \"勾選後點擊關閉按鈕會隱藏至系統匣,取消則直接退出應用程式。\",\n \"useAppWindowControls\": \"啟用應用程式等級視窗按鈕\",\n \"useAppWindowControlsDescription\": \"開啟後使用應用程式自建的最小化、最大化/還原、關閉按鈕;關閉後沿用系統視窗模式。\",\n \"enableClaudePluginIntegration\": \"套用至 Claude Code 外掛程式\",\n \"enableClaudePluginIntegrationDescription\": \"開啟後 VS Code Claude Code 外掛程式的供應商將隨本軟體切換\",\n \"skipClaudeOnboarding\": \"跳過 Claude Code 初次安裝確認\",\n \"skipClaudeOnboardingDescription\": \"開啟後跳過 Claude Code 初次安裝確認\",\n \"codexAuth\": \"Codex 應用增強\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 官方登入保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"始終開啟:供應商切換和本機代理不會覆寫或儲存 Codex 官方登入憑據\",\n \"appVisibility\": {\n \"title\": \"主頁面顯示\",\n \"description\": \"選擇在主頁面顯示的應用程式\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skills 儲存位置\",\n \"description\": \"選擇 OpenSunstar 存放 Skills 主副本的目錄\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"技能儲存在 ~/.OpenSunstar/skills/,由 OpenSunstar 統一管理並同步至各應用程式。\",\n \"unifiedHint\": \"技能儲存在 ~/.agents/skills/,遵循 Agent Skills 開放標準。相容的工具(Claude Code、Codex、Gemini CLI 等)可直接發現此目錄中的技能。\",\n \"confirmTitle\": \"遷移技能儲存位置\",\n \"confirmMessage\": \"將移動 {{count}} 個技能至新位置,是否繼續?\",\n \"migrationSuccess\": \"已成功遷移 {{count}} 個技能\",\n \"migrationPartial\": \"遷移了 {{migrated}} 個技能,{{errors}} 個失敗,請查看日誌\"\n },\n \"skillSync\": {\n \"title\": \"Skills 同步方式\",\n \"description\": \"選擇 Skills 的檔案同步策略\",\n \"symlink\": \"軟連結\",\n \"copy\": \"檔案複製\",\n \"symlinkHint\": \"軟連結節省磁碟空間並支援即時同步。注意:Windows 可能需要管理員權限或開啟開發者模式\"\n },\n \"terminal\": {\n \"title\": \"首選終端機\",\n \"description\": \"選擇點擊終端機按鈕時使用的終端機應用程式\",\n \"fallbackHint\": \"如果選擇的終端機不可用,將自動使用系統預設終端機\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"命令提示字元\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定目錄覆寫(進階)\",\n \"configDirectoryDescription\": \"在 WSL 等環境使用 Claude Code 或 Codex 的時候,可手動指定為 WSL 裡的設定目錄,供應商資料與主環境保持一致。\",\n \"appConfigDir\": \"OpenSunstar 設定目錄\",\n \"appConfigDirDescription\": \"自訂 OpenSunstar 的設定儲存位置(指定至雲端同步資料夾即可雲端同步設定)\",\n \"browsePlaceholderApp\": \"例如:C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定目錄\",\n \"claudeConfigDirDescription\": \"覆寫 Claude 設定目錄 (settings.json),同時會在同級存放 Claude MCP 的 claude.json。\",\n \"codexConfigDir\": \"Codex 設定目錄\",\n \"codexConfigDirDescription\": \"覆寫 Codex 設定目錄。\",\n \"geminiConfigDir\": \"Gemini 設定目錄\",\n \"geminiConfigDirDescription\": \"覆寫 Gemini 設定目錄 (.env)。\",\n \"opencodeConfigDir\": \"OpenCode 設定目錄\",\n \"opencodeConfigDirDescription\": \"覆寫 OpenCode 設定目錄 (opencode.json)。\",\n \"openclawConfigDir\": \"OpenClaw 設定目錄\",\n \"openclawConfigDirDescription\": \"覆寫 OpenClaw 設定目錄 (openclaw.json)。\",\n \"hermesConfigDir\": \"Hermes 設定目錄\",\n \"hermesConfigDirDescription\": \"覆寫 Hermes 設定目錄 (config.yaml)。\",\n \"browsePlaceholderClaude\": \"例如:/home/<您的帳號>/.claude\",\n \"browsePlaceholderCodex\": \"例如:/home/<您的帳號>/.codex\",\n \"browsePlaceholderGemini\": \"例如:/home/<您的帳號>/.gemini\",\n \"browsePlaceholderOpencode\": \"例如:/home/<您的帳號>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例如:/home/<您的帳號>/.openclaw\",\n \"browsePlaceholderHermes\": \"例如:/home/<您的帳號>/.hermes\",\n \"browseDirectory\": \"瀏覽目錄\",\n \"resetDefault\": \"還原預設目錄(需儲存後生效)\",\n \"checkForUpdates\": \"檢查更新\",\n \"updateTo\": \"更新至 v{{version}}\",\n \"updating\": \"更新中...\",\n \"checking\": \"檢查中...\",\n \"upToDate\": \"已是最新\",\n \"aboutHint\": \"檢視版本資訊與更新狀態。\",\n \"portableMode\": \"目前為可攜版,更新需手動下載。\",\n \"updateAvailable\": \"檢測到新版本:{{version}}\",\n \"updateBadge\": \"有更新可用\",\n \"updateFailed\": \"更新安裝失敗,已嘗試開啟下載頁面。\",\n \"checkUpdateFailed\": \"檢查更新失敗,請稍後重試。\",\n \"openReleaseNotesFailed\": \"開啟更新日誌失敗\",\n \"releaseNotes\": \"更新日誌\",\n \"viewReleaseNotes\": \"檢視該版本更新日誌\",\n \"viewCurrentReleaseNotes\": \"檢視目前版本更新日誌\",\n \"officialWebsite\": \"官方網站\",\n \"github\": \"GitHub\",\n \"oneClickInstall\": \"一鍵安裝\",\n \"oneClickInstallHint\": \"安裝 Claude Code / Codex / Gemini CLI / OpenCode\",\n \"localEnvCheck\": \"本地環境檢查\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"標誌\",\n \"installCommandsCopied\": \"安裝命令已複製\",\n \"installCommandsCopyFailed\": \"複製失敗,請手動複製。\",\n \"importFailedError\": \"匯入設定失敗:{{message}}\",\n \"exportFailedError\": \"匯出設定失敗:\",\n \"restartRequired\": \"需要重新啟動應用程式\",\n \"restartRequiredMessage\": \"修改 OpenSunstar 設定目錄後需要重新啟動應用程式才能生效,是否立即重新啟動?\",\n \"restartNow\": \"立即重新啟動\",\n \"restartLater\": \"稍後重新啟動\",\n \"restartFailed\": \"應用程式重新啟動失敗,請手動關閉後重新開啟。\",\n \"devModeRestartHint\": \"開發模式下不支援自動重新啟動,請手動重新啟動應用程式。\",\n \"saving\": \"正在儲存...\",\n \"globalProxy\": {\n \"label\": \"全域代理伺服器\",\n \"hint\": \"代理所有請求(API、Skills 下載等)。開啟本地路由時,應用程式的請求也會經過此代理伺服器。留空表示直連。\",\n \"username\": \"使用者名稱(選填)\",\n \"password\": \"密碼(選填)\",\n \"test\": \"測試連線\",\n \"scan\": \"掃描本地代理伺服器\",\n \"clear\": \"清除\",\n \"scanFailed\": \"掃描失敗:{{error}}\",\n \"saved\": \"代理伺服器設定已儲存\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"testSuccess\": \"連線成功!延遲 {{latency}}ms\",\n \"testFailed\": \"連線失敗:{{error}}\",\n \"pricingDefaultsTitle\": \"計費預設設定\",\n \"pricingDefaultsDescription\": \"設定各應用程式的預設倍率與計費模式來源。\",\n \"pricingAppLabel\": \"應用程式\",\n \"defaultCostMultiplierLabel\": \"預設倍率\",\n \"defaultCostMultiplierHint\": \"用於成本計算的倍率,支援小數。\",\n \"pricingModelSourceLabel\": \"計費模式\",\n \"pricingModelSourceRequest\": \"請求模型\",\n \"pricingModelSourceResponse\": \"回傳模型\",\n \"pricingSave\": \"儲存計費設定\",\n \"pricingSaved\": \"計費設定已儲存\",\n \"pricingSaveFailed\": \"儲存計費設定失敗:{{error}}\",\n \"pricingLoadFailed\": \"載入計費設定失敗:{{error}}\",\n \"defaultCostMultiplierRequired\": \"預設倍率不能為空\",\n \"defaultCostMultiplierInvalid\": \"預設倍率格式不正確\"\n },\n \"saveFailedGeneric\": \"儲存失敗,請重試\",\n \"manualInstallCommands\": \"手動安裝命令\",\n \"updateAllTools\": \"全部升級({{count}})\",\n \"currentVersion\": \"當前版本\",\n \"latestVersion\": \"最新版本\",\n \"updateAvailableShort\": \"可升級\",\n \"toolInstall\": \"安裝\",\n \"toolUpdate\": \"升級\",\n \"toolReady\": \"已就緒\",\n \"toolActionDone\": \"{{count}} 個工具{{action}}完成\",\n \"toolActionPartial\": \"{{succeeded}} 個{{action}}成功,{{failed}} 個失敗\",\n \"toolActionFailed\": \"安裝/升級命令執行失敗\",\n \"toolNotRunnable\": \"已安裝但無法運行(未探測到版本)\",\n \"toolActionVersionUnchangedTitle\": \"版本沒有變化\",\n \"toolActionVersionUnchanged\": \"仍是 {{version}}(最新:{{latest}})。上游升級器可能報告成功但沒有實際更新。\",\n \"toolActionInstalledNotRunnable\": \"已安裝,但當前環境無法運行,請檢查\",\n \"installedNotRunnable\": \"已安裝·無法運行\",\n \"toolCheckEnv\": \"請檢查運行環境\",\n \"toolDiagnose\": \"診斷安裝衝突\",\n \"toolDiagnosing\": \"診斷中…\",\n \"toolConflictTitle\": \"檢測到多處安裝\",\n \"toolConflictHint\": \"命令行實際使用標「默認」的那處;升級可能寫到了別處。\",\n \"toolConflictDefault\": \"默認\",\n \"toolConflictNotRunnable\": \"無法運行\",\n \"toolDiagnoseNoConflict\": \"未發現安裝衝突\",\n \"toolDiagnoseFailed\": \"診斷失敗\",\n \"toolUpgradeConfirmTitle\": \"確認升級位置\",\n \"toolUpgradeConfirmHint\": \"檢測到多處安裝。本次升級不會全部更新,具體作用的位置以下方各項為準。\",\n \"toolUpgradeWillRun\": \"將執行:\",\n \"toolUpgradeConfirmBtn\": \"確認升級\",\n \"toolUpgradeUnanchoredHint\": \"無法確定命令行實際使用哪處,將執行默認升級命令(可能裝到 PATH 上第一個 npm)。\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokBuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"工作階段管理\",\n \"subtitle\": \"管理 Claude Code、Codex、OpenCode、OpenClaw、Hermes 與 Gemini CLI 工作階段紀錄\",\n \"searchPlaceholder\": \"搜尋對話內容、目錄或 ID\",\n \"searchSessions\": \"搜尋工作階段\",\n \"providerFilterAll\": \"全部\",\n \"sessionList\": \"工作階段清單\",\n \"manageBatchTooltip\": \"進入批次管理\",\n \"exitBatchModeTooltip\": \"退出批次管理\",\n \"batchModeHint\": \"勾選要刪除的工作階段\",\n \"selectForBatch\": \"選擇工作階段\",\n \"selectedCount\": \"已選 {{count}} 項\",\n \"selectAllFiltered\": \"全選目前\",\n \"clearFilteredSelection\": \"取消全選\",\n \"clearSelection\": \"清空已選\",\n \"deleteSelected\": \"批次刪除\",\n \"batchDeleting\": \"批次刪除中...\",\n \"loadingSessions\": \"載入工作階段中...\",\n \"noSessions\": \"未發現工作階段\",\n \"selectSession\": \"請選擇工作階段檢視詳情\",\n \"noSummary\": \"暫無摘要\",\n \"lastActive\": \"最近活躍\",\n \"projectDir\": \"專案目錄\",\n \"sourcePath\": \"原始檔案\",\n \"copyResumeCommand\": \"複製繼續命令\",\n \"resumeCommandCopied\": \"已複製繼續命令\",\n \"openInTerminal\": \"在終端機繼續\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"僅複製\",\n \"terminalLaunched\": \"終端機已啟動\",\n \"openFailed\": \"開啟終端機失敗\",\n \"resumeFallbackCopied\": \"已複製繼續命令,可手動貼上至終端機\",\n \"copyProjectDir\": \"複製目錄\",\n \"projectDirCopied\": \"目錄已複製\",\n \"copySourcePath\": \"複製原始檔案\",\n \"sourcePathCopied\": \"原始檔案已複製\",\n \"delete\": \"刪除工作階段\",\n \"deleting\": \"刪除中...\",\n \"deleteTooltip\": \"永久刪除此本地工作階段紀錄\",\n \"deleteConfirmTitle\": \"刪除工作階段\",\n \"deleteConfirmMessage\": \"將永久刪除本地工作階段「{{title}}」\\nSession ID: {{sessionId}}\\n\\n此操作不可復原。\",\n \"deleteConfirmAction\": \"刪除工作階段\",\n \"sessionDeleted\": \"工作階段已刪除\",\n \"deleteFailed\": \"刪除工作階段失敗:{{error}}\",\n \"batchDeleteConfirmTitle\": \"批次刪除工作階段\",\n \"batchDeleteConfirmMessage\": \"將永久刪除已選取的 {{count}} 個本地工作階段紀錄。\\n\\n此操作不可復原。\",\n \"batchDeleteConfirmAction\": \"刪除所選工作階段\",\n \"batchDeleteSuccess\": \"已刪除 {{count}} 個工作階段\",\n \"batchDeleteFailed\": \"{{failed}} 個工作階段刪除失敗\",\n \"batchDeleteRequestFailed\": \"批次刪除失敗,請稍後重試\",\n \"loadingMessages\": \"載入對話內容中...\",\n \"emptySession\": \"該工作階段暫無可展示內容\",\n \"clickToCopyPath\": \"點擊複製路徑\",\n \"tocTitle\": \"對話目錄\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}} 分鐘前\",\n \"hoursAgo\": \"{{count}} 小時前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"roleUser\": \"使用者\",\n \"roleSystem\": \"系統\",\n \"roleTool\": \"工具\",\n \"resume\": \"繼續工作階段\",\n \"resumeTooltip\": \"在終端機中繼續此工作階段\",\n \"noResumeCommand\": \"此工作階段無法繼續\",\n \"copyCommand\": \"複製命令\",\n \"copyMessage\": \"複製訊息\",\n \"messageCopied\": \"已複製訊息內容\",\n \"conversationHistory\": \"對話紀錄\",\n \"expandContent\": \"展開完整內容\",\n \"collapseContent\": \"收起\",\n \"exportSelected\": \"批量導出\",\n \"batchExporting\": \"導出中...\",\n \"batchExportSuccess\": \"已導出 {{count}} 個會話\",\n \"batchExportFailed\": \"批量導出失敗,請稍後重試\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"收到供應商切換事件:\",\n \"setupListenerFailed\": \"設定供應商切換監聽器失敗:\",\n \"updateProviderFailed\": \"更新供應商失敗:\",\n \"autoImportFailed\": \"自動匯入預設設定失敗:\",\n \"openLinkFailed\": \"開啟連結失敗:\",\n \"getVersionFailed\": \"取得版本資訊失敗:\",\n \"loadSettingsFailed\": \"載入設定失敗:\",\n \"getConfigPathFailed\": \"取得設定路徑失敗:\",\n \"getConfigDirFailed\": \"取得設定目錄失敗:\",\n \"detectPortableFailed\": \"檢測可攜模式失敗:\",\n \"saveSettingsFailed\": \"儲存設定失敗:\",\n \"updateFailed\": \"更新失敗:\",\n \"checkUpdateFailed\": \"檢查更新失敗:\",\n \"openConfigFolderFailed\": \"開啟設定資料夾失敗:\",\n \"selectConfigDirFailed\": \"選擇設定目錄失敗:\",\n \"getDefaultConfigDirFailed\": \"取得預設設定目錄失敗:\",\n \"openReleaseNotesFailed\": \"開啟更新日誌失敗:\"\n },\n \"providerForm\": {\n \"supplierName\": \"供應商名稱\",\n \"supplierNameRequired\": \"供應商名稱 *\",\n \"supplierNamePlaceholder\": \"例如:Anthropic 官方\",\n \"websiteUrl\": \"官網位址\",\n \"websiteUrlPlaceholder\": \"https://example.com(選填)\",\n \"apiEndpoint\": \"請求位址\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理與測速\",\n \"configContent\": \"設定內容\",\n \"officialNoApiKey\": \"官方登入無需填寫 API Key,直接儲存即可\",\n \"codexOfficialNoApiKey\": \"官方無需填寫 API Key,直接儲存即可\",\n \"codexApiKeyAutoFill\": \"只需要填這裡,下方 auth.json 會自動填寫\",\n \"apiKeyAutoFill\": \"只需要填這裡,下方設定會自動填寫\",\n \"cnOfficialApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"aggregatorApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"thirdPartyApiKeyHint\": \"只需填寫 API Key,請求位址已預設\",\n \"customApiKeyHint\": \"自訂設定需手動填寫所有必要欄位\",\n \"omoHint\": \"OMO 設定管理 Agent 模型指派,相容 oh-my-openagent.jsonc / oh-my-opencode.jsonc\",\n \"officialHint\": \"官方供應商使用瀏覽器登入,無需設定 API Key\",\n \"getApiKey\": \"取得 API Key\",\n \"apiKey\": \"API Key\",\n \"envKey\": \"環境變數名稱(選填)\",\n \"grokBuildHint\": \"設定會寫入 ~/.grok/config.toml;僅管理 Grok Build 原生模型設定。\",\n \"model\": \"預設模型\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊並在儲值時填寫「OpenSunstar」優惠碼,可以享受 9 折優惠\",\n \"apikeyfun\": \"APIKEY.FUN 為 OpenSunstar 的使用者提供了特別優惠,透過專屬連結註冊,可享受最高儲值永久 95 折優惠。\",\n \"apinebula\": \"APINEBULA 為 OpenSunstar 使用者提供特別優惠:使用專屬連結註冊並在儲值時填寫「OpenSunstar」優惠碼,可享 9 折優惠。\",\n \"atlascloud\": \"Atlas Cloud 是一個全模態 AI 推理平台,透過單一 API 為開發者提供影片生成、圖像生成及 LLM 接入。立即查看全新「編程計畫」優惠,取得更具性價比的 API 接入。\",\n \"sudocode\": \"SudoCode 是全球一流 AI 模型聚合服務,一個 API Key 可通用多模型,並支援 Claude Code、Codex、Gemini CLI、OpenClaw 等工具接入。\",\n \"patewayai\": \"PatewayAI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊可以獲得 3 美元額度。\",\n \"claudeapi\": \"ClaudeAPI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊可以領取測試額度。\",\n \"claudecn\": \"ClaudeCN 是一家實體企業營運的企業級 AI 中繼平台,支援企業採購流程,可對公打款、簽約,服務合規有保障。\",\n \"runapi\": \"RunAPI 為 OpenSunstar 的使用者提供了特別福利,透過此連結註冊並聯繫客服可領取 ¥14 免費額度。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特惠,Starter 方案 9.9 元起\",\n \"minimax_en\": \"MiniMax Coding Plan 黑五特惠,Starter 方案現僅 $2 / 月(2 折優惠!)\",\n \"dmxapi\": \"Claude Code 專屬模型 3.4 折優惠進行中!\",\n \"cubence\": \"Cubence 是 OpenSunstar 的官方合作夥伴,使用此連結註冊並在儲值時填寫「OPENSUNSTAR」優惠碼,每次儲值均可享受 9 折優惠\",\n \"aigocode\": \"AIGoCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊首次儲值時可以獲得 10% 額度獎勵!\",\n \"rightcode\": \"RightCode 是 OpenSunstar 的官方合作夥伴,使用此連結註冊每次儲值均可贈送 5% 額外額度!\",\n \"aicodemirror\": \"AICodeMirror 是 OpenSunstar 的官方合作夥伴,使用此連結註冊可享受 8 折優惠!\",\n \"aicoding\": \"AI Coding 為 OpenSunstar 的使用者提供了特殊優惠,首次儲值可以享受 9 折優惠!\",\n \"crazyrouter\": \"CrazyRouter 為 OpenSunstar 的使用者提供了特殊優惠,首次儲值贈送 30% 額外額度!\",\n \"sssaicode\": \"SSAI Code 為 OpenSunstar 的使用者提供了特殊優惠,每次儲值贈送額外 $10 額度!\",\n \"siliconflow\": \"矽基流動是 OpenSunstar 的官方合作夥伴\",\n \"ucloud\": \"優雲智算為 OpenSunstar 的使用者提供了特殊優惠,透過此連結註冊,可以獲得 5 元平台體驗金!\",\n \"micu\": \"Micu 是 OpenSunstar 的官方合作夥伴\",\n \"ctok\": \"官網加入 CTok 社群,訂閱方案。\",\n \"shengsuanyun\": \"勝算雲為 OpenSunstar 的使用者提供了特別福利,使用此連結註冊的新使用者可獲 10 元模力及首儲 10% 贈送!\",\n \"lemondata\": \"Lemon Code 為 OpenSunstar 的使用者提供了特別優惠。使用此連結註冊可以獲得 1 美元免費額度。\",\n \"doubaoseed\": \"豆包大模型為 OpenSunstar 的使用者提供了專屬福利:透過此連結註冊即可取得豆包全系列文本模型 50 萬 tokens 推理額度以及 Seedance 2.0 的 500 萬 tokens 免費額度\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan 為 OpenSunstar 的使用者提供了專屬福利:透過此連結訂閱方舟 AgentPlan,新客戶首月 40 元起。\",\n \"byteplus\": \"透過此連結註冊即可取得每個模型 50 萬 tokens 的免費推理額度。\",\n \"ccsub\": \"CCSub 是穩定、實惠的 AI API 中轉平台,Claude Code 官方訂閱的超強平替,一個 Key 覆蓋全部模型,價格約為官方 1/3。\",\n \"unity2\": \"Unity2.ai 為 OpenSunstar 使用者提供專屬福利:透過此連結註冊可領取 $2 餘額,加入官方群再送 $10,最高可領 $12 免費額度!\"\n },\n \"presets\": {\n \"ucloud\": \"優雲智算\",\n \"ucloudCoding\": \"優雲智算 Coding Plan\",\n \"shengsuanyun\": \"勝算雲\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"參數設定 - {{name}} *\",\n \"mainModel\": \"主模型 (選填)\",\n \"mainModelPlaceholder\": \"例如: GLM-4.6\",\n \"fastModel\": \"快速模型 (選填)\",\n \"fastModelPlaceholder\": \"例如: GLM-4.5-Air\",\n \"modelHint\": \"留空將使用供應商的預設模型\",\n \"apiHint\": \"填寫相容 Claude API 的伺服器端點位址,請勿以斜線結尾\",\n \"apiHintOAI\": \"填寫相容 OpenAI Chat Completions 的伺服器端點位址,請勿以斜線結尾\",\n \"apiHintGeminiNative\": \"建議填寫 Gemini Native 的 base URL,例如 https://generativelanguage.googleapis.com 或 https://generativelanguage.googleapis.com/v1beta;代理伺服器會自動補齊 models/*:generateContent\",\n \"codexApiHint\": \"填寫相容 OpenAI Response 格式的伺服器端點位址\",\n \"fillSupplierName\": \"請填寫供應商名稱\",\n \"fillConfigContent\": \"請填寫設定內容\",\n \"fillParameter\": \"請填寫 {{label}}\",\n \"fillTemplateValue\": \"請填寫 {{label}}\",\n \"endpointRequired\": \"非官方供應商請填寫 API 端點\",\n \"apiKeyRequired\": \"非官方供應商請填寫 API Key\",\n \"softValidation\": {\n \"title\": \"設定存在以下問題\",\n \"hint\": \"仍要儲存嗎?儲存後切換此供應商時可能失敗,可以之後再補全。\",\n \"saveAnyway\": \"仍要儲存\"\n },\n \"configJsonError\": \"設定 JSON 格式錯誤,請檢查語法\",\n \"authJsonRequired\": \"auth.json 必須是 JSON 物件\",\n \"authJsonError\": \"auth.json 格式錯誤,請檢查 JSON 語法\",\n \"fillAuthJson\": \"請填寫 auth.json 設定\",\n \"fillApiKey\": \"請填寫 OPENAI_API_KEY\",\n \"visitWebsite\": \"造訪 {{url}}\",\n \"anthropicModel\": \"主模型\",\n \"anthropicSmallFastModel\": \"快速模型\",\n \"apiFormat\": \"API 格式\",\n \"apiFormatHint\": \"選擇供應商 API 的輸入格式\",\n \"customUserAgent\": \"自訂 User-Agent\",\n \"customUserAgentHint\": \"僅在開啟本地路由/代理接管後生效,會取代轉發至供應商 API 請求中的 User-Agent。\",\n \"customUserAgentInvalid\": \"User-Agent 不能包含控制字元(如換行字元),否則將被忽略。\",\n \"customUserAgentPresets\": \"預設\",\n \"fullUrlLabel\": \"完整 URL\",\n \"fullUrlEnabled\": \"完整 URL 模式\",\n \"fullUrlDisabled\": \"標記為完整 URL\",\n \"fullUrlHint\": \"請填寫完整請求 URL,並且必須開啟路由後使用;路由將直接使用此 URL,不拼接路徑\",\n \"fullUrlHintGeminiNative\": \"Gemini Native 下,完整 URL 模式同時相容兩類位址:1. 官方/標準 Gemini URL,代理伺服器會依模型和串流參數自動標準化;2. 自訂 relay 的完整 URL,代理伺服器會盡量原樣使用,只補齊查詢參數,不再強制附加 models 路徑\",\n \"apiFormatAnthropic\": \"Anthropic Messages (原生)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (需開啟路由)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (需開啟路由)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (需開啟路由)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (原生)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (需開啟路由)\",\n \"codexApiFormatHint\": \"選擇供應商真實支援的 Codex API 格式;設定仍保持 Responses 以相容新版 Codex,Chat Completions 會透過本地路由自動轉換。\",\n \"authField\": \"驗證欄位\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(預設)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"選擇寫入設定的驗證環境變數名稱\",\n \"apiHintResponses\": \"填寫相容 OpenAI Responses API 的伺服器端點位址,請勿以斜線結尾\",\n \"anthropicDefaultHaikuModel\": \"Haiku 預設模型\",\n \"anthropicDefaultSonnetModel\": \"Sonnet 預設模型\",\n \"anthropicDefaultOpusModel\": \"Opus 預設模型\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"選填:指定預設使用的 Claude 模型,留空則使用系統預設。\",\n \"modelMappingLabel\": \"模型對應\",\n \"modelMappingHint\": \"顯示名稱只影響 /model 選單;1M 只是提供給 Claude Code 的上下文能力聲明。\",\n \"modelRoleLabel\": \"模型角色\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"顯示名稱\",\n \"modelDisplayNamePlaceholder\": \"例如 DeepSeek V4 Pro\",\n \"requestModelLabel\": \"實際請求模型\",\n \"modelOneMHeader\": \"聲明支援 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"備用模型\",\n \"fallbackModelHint\": \"僅在 Claude Code 請求沒有明確落到 Sonnet、Opus 或 Haiku 角色時使用;通常可以留空。\",\n \"quickSetModels\": \"一鍵設定\",\n \"quickSetSuccess\": \"已將模型名稱套用至所有角色\",\n \"advancedOptionsToggle\": \"進階選項\",\n \"advancedOptionsHint\": \"包含 API 格式、驗證欄位、模型對應等設定。大多數場景下保持預設即可。\",\n \"categoryOfficial\": \"官方\",\n \"categoryCnOfficial\": \"開源官方\",\n \"categoryAggregation\": \"聚合服務\",\n \"categoryThirdParty\": \"第三方\",\n \"fetchModels\": \"取得模型清單\",\n \"fetchingModels\": \"正在取得...\",\n \"fetchModelsSuccess\": \"取得 {{count}} 個模型\",\n \"fetchModelsFailed\": \"取得模型清單失敗\",\n \"fetchModelsEmpty\": \"未找到可用模型\",\n \"fetchModelsNeedApiKey\": \"請先填寫 API Key\",\n \"fetchModelsNeedEndpoint\": \"請先填寫 API 端點\",\n \"fetchModelsNeedConfig\": \"請先填寫 API 端點和 API Key\",\n \"fetchModelsAuthFailed\": \"API Key 無效或無權限\",\n \"fetchModelsNotSupported\": \"該供應商不支援取得模型清單\",\n \"fetchModelsEndpointNotFound\": \"未找到可用的模型清單端點,請檢查 Base URL 或確認供應商是否開放該 API\",\n \"fetchModelsTimeout\": \"請求逾時,請檢查網路連線\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 驗證\",\n \"authStatus\": \"驗證狀態\",\n \"authenticated\": \"已驗證: {{username}}\",\n \"notAuthenticated\": \"未驗證\",\n \"loginWithGitHub\": \"使用 GitHub 登入\",\n \"loginRequired\": \"請先登入 GitHub Copilot\",\n \"waitingForAuth\": \"等待授權中...\",\n \"enterCode\": \"請在瀏覽器中輸入驗證碼:\",\n \"logout\": \"登出\",\n \"authSuccess\": \"GitHub Copilot 驗證成功\",\n \"authFailed\": \"驗證失敗:{{error}}\",\n \"authTimeout\": \"驗證逾時,請重試\",\n \"tokenExpired\": \"Token 已過期,請重新驗證\",\n \"accountCount\": \"{{count}} 個帳號\",\n \"selectAccount\": \"選擇帳號\",\n \"selectAccountPlaceholder\": \"選擇一個 GitHub 帳號\",\n \"useDefaultAccount\": \"使用預設帳號\",\n \"loggedInAccounts\": \"已登入帳號\",\n \"defaultAccount\": \"預設\",\n \"selected\": \"已選取\",\n \"removeAccount\": \"移除帳號\",\n \"setAsDefault\": \"設為預設\",\n \"addAnotherAccount\": \"新增其他帳號\",\n \"logoutAll\": \"登出所有帳號\",\n \"retry\": \"重試\",\n \"copyCode\": \"複製程式碼\",\n \"migrationFailed\": \"舊驗證資料遷移失敗:{{error}}\",\n \"loadModelsFailed\": \"載入 Copilot 模型清單失敗\",\n \"deploymentType\": \"GitHub 部署類型\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例如:company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"驗證狀態\",\n \"notAuthenticated\": \"未驗證\",\n \"loginWithChatGPT\": \"使用 ChatGPT 登入\",\n \"loginRequired\": \"請先登入 ChatGPT 帳號\",\n \"waitingForAuth\": \"等待授權中...\",\n \"enterCode\": \"請在瀏覽器中輸入以下驗證碼:\",\n \"accountCount\": \"{{count}} 個帳號\",\n \"selectAccount\": \"選擇帳號\",\n \"selectAccountPlaceholder\": \"選擇一個 ChatGPT 帳號\",\n \"useDefaultAccount\": \"使用預設帳號\",\n \"loggedInAccounts\": \"已登入帳號\",\n \"defaultAccount\": \"預設\",\n \"selected\": \"已選取\",\n \"removeAccount\": \"移除帳號\",\n \"setAsDefault\": \"設為預設\",\n \"addAnotherAccount\": \"新增其他帳號\",\n \"logoutAll\": \"登出所有帳號\",\n \"retry\": \"重試\",\n \"copyCode\": \"複製程式碼\",\n \"fastMode\": \"FAST 模式\",\n \"fastModeDescription\": \"發送 service_tier=\\\"priority\\\" 換取更低延遲。預設關閉——開啟後會以更高速率消耗 ChatGPT 配額。\"\n },\n \"endpointTest\": {\n \"title\": \"請求位址管理\",\n \"endpoints\": \"個端點\",\n \"autoSelect\": \"自動選擇\",\n \"testSpeed\": \"測速\",\n \"testing\": \"測速中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完成\",\n \"noEndpoints\": \"暫無端點\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"請輸入有效的 URL\",\n \"invalidUrlFormat\": \"URL 格式不正確\",\n \"onlyHttps\": \"僅支援 HTTP/HTTPS\",\n \"urlExists\": \"該位址已存在\",\n \"saveFailed\": \"儲存失敗,請重試\",\n \"loadEndpointsFailed\": \"載入自訂端點失敗:\",\n \"addEndpointFailed\": \"新增自訂端點失敗:\",\n \"removeEndpointFailed\": \"刪除自訂端點失敗:\",\n \"removeFailed\": \"刪除失敗:{{error}}\",\n \"updateLastUsedFailed\": \"更新端點使用時間失敗\",\n \"pleaseAddEndpoint\": \"請先新增端點\",\n \"testUnavailable\": \"測速功能不可用\",\n \"noResult\": \"未回傳結果\",\n \"testFailed\": \"測速失敗:{{error}}\",\n \"empty\": \"暫無端點\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"模型測試設定\",\n \"useCustomConfig\": \"使用獨立設定\",\n \"testConfigDesc\": \"為此供應商設定獨立的模型測試參數,不啟用時使用全域設定。\",\n \"testModel\": \"測試模型\",\n \"testModelPlaceholder\": \"留空使用全域設定\",\n \"timeoutSecs\": \"逾時時間(秒)\",\n \"testPrompt\": \"測試提示詞\",\n \"degradedThreshold\": \"降級閾值(毫秒)\",\n \"maxRetries\": \"最大重試次數\",\n \"pricingConfig\": \"計費設定\",\n \"useCustomPricing\": \"使用獨立設定\",\n \"pricingConfigDesc\": \"為此供應商設定獨立的計費參數,不啟用時使用全域預設設定。\",\n \"costMultiplier\": \"成本倍率\",\n \"costMultiplierPlaceholder\": \"留空使用全域預設(1)\",\n \"costMultiplierHint\": \"實際成本 = 基礎成本 × 倍率,支援小數如 1.5\",\n \"pricingModelSourceLabel\": \"計費模式\",\n \"pricingModelSourceInherit\": \"繼承全域預設\",\n \"pricingModelSourceRequest\": \"請求模型\",\n \"pricingModelSourceResponse\": \"回傳模型\",\n \"pricingModelSourceHint\": \"選擇依請求模型還是回傳模型進行定價比對\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json 設定內容\",\n \"authJsonStorageHint\": \"代理接管中顯示的是儲存的 auth 配置,不是即時 auth.json\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml 設定內容\",\n \"configTomlStorageHint\": \"代理接管中顯示的是儲存的 config 配置,不是即時 config.toml\",\n \"proxyTakeoverStorageNotice\": \"💡 目前應用處於代理接管狀態。這裡編輯的是儲存的供應商配置,真實 live 配置已由代理暫時接管\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯 Codex 通用設定片段\",\n \"commonConfigHint\": \"該片段會在勾選「寫入通用設定」時附加到 config.toml 末尾\",\n \"enableGoalMode\": \"啟用 Goal mode\",\n \"enableRemoteCompaction\": \"啟用遠端壓縮\",\n \"remoteCompactionHint\": \"開啟後會將目前 model_providers 條目的 name 寫為 OpenAI,讓 Codex 嘗試使用遠端壓縮。\",\n \"apiUrlLabel\": \"API 請求位址\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"modelNameHint\": \"指定使用的模型,將自動更新到 config.toml 中\",\n \"modelName\": \"模型名稱\",\n \"modelNamePlaceholder\": \"例如: gpt-5-codex\",\n \"contextWindow1M\": \"1M 上下文視窗\",\n \"autoCompactLimit\": \"壓縮閾值\",\n \"autoCompactLimitHint\": \"上下文 token 數達到此閾值時自動壓縮歷史\",\n \"autoCompactLimitPlaceholder\": \"例如: 90000\",\n \"localRoutingToggle\": \"需要本地路由映射\",\n \"localRoutingOnHint\": \"Codex 目前僅原生支援 OpenAI Responses API 與 GPT 系列模型;如果您的供應商使用 Chat Completions 協定或非 GPT 模型(如 DeepSeek、Kimi),則需要打開本開關,並在使用過程中保持本地路由開啟。\",\n \"localRoutingOffHint\": \"如果您的供應商不是原生 OpenAI Responses API,或者模型名不是 Codex 預設的 GPT 系列,請打開此開關。\",\n \"modelMappingTitle\": \"模型映射\",\n \"modelMappingHint\": \"產生 Codex model_catalog_json,讓 /model 指令顯示這些第三方模型名;表中條目按填寫內容原樣儲存。修改後需要重新啟動 Codex 才能重新整理模型清單。\",\n \"addCatalogModel\": \"新增模型\",\n \"catalogDisplayName\": \"顯示名稱\",\n \"catalogModelId\": \"模型 ID\",\n \"catalogColumnDisplay\": \"選單顯示名\",\n \"catalogColumnModel\": \"實際請求模型\",\n \"catalogColumnContext\": \"上下文視窗\",\n \"catalogDisplayNamePlaceholder\": \"例如: DeepSeek V4 Flash\",\n \"catalogModelPlaceholder\": \"例如: deepseek-v4-flash\",\n \"contextWindow\": \"上下文視窗\",\n \"contextWindowPlaceholder\": \"例如: 128000\",\n \"upstreamModelName\": \"上游模型名稱\",\n \"upstreamModelNameHint\": \"Chat 格式下這裡填寫真實上游模型;路由會把 Codex 的 Responses 請求轉換為 Chat Completions 並保持該模型。\",\n \"modelMetadataAdvanced\": \"模型中繼資料進階選項\",\n \"modelMetadataAdvancedHint\": \"用於未知模型的 Codex 中繼資料覆寫;清空欄位會從 config.toml 刪除對應設定。\",\n \"reasoningModeToggle\": \"支援思考模式\",\n \"reasoningModeHint\": \"上游 Chat Completions 介面支援開啟或關閉 thinking 時啟用。Kimi、GLM、Qwen 等通常屬於這一類。\",\n \"reasoningEffortToggle\": \"支援思考等級\",\n \"reasoningEffortHint\": \"上游支援 low/high/max 等思考深度控制時啟用。啟用後會自動啟用思考模式,並把 Codex 的 reasoning.effort 轉成上游 Chat 參數。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"預設供應商已自動設定;自訂供應商會按名稱/位址自動推斷。僅當自動識別不準時才需手動覆寫。\",\n \"advancedSectionHint\": \"包含本地路由映射、模型映射、思考能力與自訂 User-Agent。供應商使用 Chat Completions 協定或非 GPT 模型時,需在此開啟本地路由映射。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境變數 (.env)\",\n \"envFileHint\": \"使用 .env 格式設定 Gemini 環境變數\",\n \"configJson\": \"設定檔 (config.json)\",\n \"configJsonHint\": \"使用 JSON 格式設定 Gemini 擴充參數(選填)\",\n \"writeCommonConfig\": \"寫入通用設定\",\n \"editCommonConfig\": \"編輯通用設定\",\n \"editCommonConfigTitle\": \"編輯 Gemini 通用設定片段\",\n \"commonConfigHint\": \"該片段會寫入 Gemini 的 .env(不允許包含 GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY)\",\n \"extractFromCurrent\": \"從編輯內容擷取\",\n \"extractNoCommonConfig\": \"目前編輯內容沒有可擷取的通用設定\",\n \"extractFailed\": \"擷取失敗:{{error}}\",\n \"saveFailed\": \"儲存失敗:{{error}}\",\n \"extractedConfigInvalid\": \"擷取的設定格式錯誤\",\n \"invalidJsonFormat\": \"通用設定片段格式錯誤(必須是有效的 JSON)\",\n \"commonConfigInvalidKeys\": \"通用設定片段不能包含 GOOGLE_GEMINI_BASE_URL 或 GEMINI_API_KEY(發現:{{keys}})\",\n \"commonConfigInvalidValues\": \"通用設定片段的值必須是字串\",\n \"noCommonConfigToApply\": \"通用設定片段為空或沒有可寫入的內容\",\n \"configMergeFailed\": \"設定合併失敗:{{error}}\",\n \"configReplaceFailed\": \"設定替換失敗:{{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API 格式\",\n \"selectPackage\": \"選擇 API 格式\",\n \"npmPackageHint\": \"選擇 AI 服務的 API 格式\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"自訂 API 端點位址\",\n \"models\": \"模型設定\",\n \"modelsHint\": \"設定可用的模型及其顯示名稱\",\n \"addModel\": \"新增模型\",\n \"modelId\": \"模型 ID\",\n \"modelName\": \"顯示名稱\",\n \"noModels\": \"暫無模型設定\",\n \"modelsRequired\": \"請至少新增一個模型設定\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定檔中的唯一識別碼,只能使用小寫字母、數字和連字號\",\n \"providerKeyLockedHint\": \"該供應商已新增至應用程式設定中,供應商標識不可修改\",\n \"providerKeyRequired\": \"請填寫供應商標識\",\n \"providerKeyDuplicate\": \"此標識已被使用,請更換\",\n \"providerKeyInvalid\": \"標識格式無效,只能使用小寫字母、數字和連字號\",\n \"extraOptions\": \"額外選項\",\n \"extraOptionsHint\": \"設定額外的 SDK 選項,如 timeout、setCacheKey 等。值會自動解析類型(數字、布林值等)。\",\n \"addExtraOption\": \"新增\",\n \"extraOptionKey\": \"鍵名\",\n \"extraOptionValue\": \"值\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"暫無額外選項\",\n \"noModelOptions\": \"模型選項,點擊 + 新增\",\n \"modelExtraFields\": \"模型屬性\",\n \"noModelExtraFields\": \"模型屬性 (variants, cost 等),點擊 + 新增\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK 選項\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"預設供應商\",\n \"custom\": \"自訂設定\",\n \"other\": \"其他\",\n \"hint\": \"選擇預設後可繼續調整下方欄位。\",\n \"searchTooltip\": \"搜尋預設\",\n \"searchAriaLabel\": \"搜尋預設供應商\",\n \"searchPlaceholder\": \"搜尋名稱、官網或分類...\",\n \"sortAriaLabel\": \"切換預設排序\",\n \"sortNameAscTooltip\": \"按名稱 A-Z 排序\",\n \"sortOriginalTooltip\": \"恢復原始順序\",\n \"noSearchResults\": \"沒有相符的預設供應商。\"\n },\n \"usage\": {\n \"title\": \"使用統計\",\n \"subtitle\": \"查看 AI 模型的使用情況和成本統計\",\n \"today\": \"24 小時\",\n \"last7days\": \"7 天\",\n \"last30days\": \"30 天\",\n \"presetToday\": \"當天\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"總請求數\",\n \"totalCost\": \"總成本\",\n \"cost\": \"成本\",\n \"perMillion\": \"(每百萬)\",\n \"trends\": \"使用趨勢\",\n \"rangeToday\": \"過去 24 小時 (按小時)\",\n \"rangeLast7Days\": \"過去 7 天\",\n \"rangeLast30Days\": \"過去 30 天\",\n \"totalTokens\": \"新產生 Token (Input+Output)\",\n \"cacheTokens\": \"快取 Token\",\n \"realTotal\": \"真實消耗 Tokens\",\n \"realTotalHint\": \"Input + Output + 快取建立 + 快取命中\",\n \"freshInput\": \"新增輸入\",\n \"cacheHitRate\": \"快取命中率\",\n \"requestLogs\": \"請求日誌\",\n \"providerStats\": \"Provider 統計\",\n \"modelStats\": \"模型統計\",\n \"time\": \"時間\",\n \"provider\": \"供應商\",\n \"billingModel\": \"計費模型\",\n \"inputTokens\": \"輸入\",\n \"outputTokens\": \"輸出\",\n \"cacheReadTokens\": \"快取命中\",\n \"cacheCreationTokens\": \"快取建立\",\n \"timingInfo\": \"耗時/首字\",\n \"status\": \"狀態\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"請求模型\",\n \"responseModel\": \"回傳模型\",\n \"noData\": \"暫無資料\",\n \"unknownProvider\": \"未知供應商\",\n \"stream\": \"串流\",\n \"nonStream\": \"非串流\",\n \"source\": \"來源\",\n \"requestsLabel\": \"次請求\",\n \"costLabel\": \"總成本\",\n \"appFilter\": {\n \"all\": \"全部\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokbuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"資料來源\",\n \"dataSource\": {\n \"proxy\": \"路由\",\n \"session_log\": \"工作階段日誌\",\n \"codex_db\": \"Codex 資料庫\",\n \"codex_session\": \"Codex 工作階段日誌\",\n \"gemini_session\": \"Gemini 工作階段日誌\",\n \"opencode_session\": \"OpenCode 工作階段日誌\"\n },\n \"sessionSync\": {\n \"trigger\": \"同步工作階段日誌\",\n \"import\": \"匯入工作階段\",\n \"resync\": \"同步\",\n \"imported\": \"從工作階段日誌匯入了 {{count}} 筆紀錄\",\n \"upToDate\": \"工作階段日誌已是最新\",\n \"failed\": \"工作階段同步失敗\"\n },\n \"totalRecords\": \"共 {{total}} 筆紀錄\",\n \"goToPage\": \"跳轉\",\n \"pageInputPlaceholder\": \"頁碼\",\n \"modelPricing\": \"模型定價\",\n \"loadPricingError\": \"載入定價資料失敗\",\n \"modelPricingDesc\": \"設定各模型的 Token 成本\",\n \"noPricingData\": \"暫無定價資料。點擊「新增」加入模型定價設定。\",\n \"model\": \"模型\",\n \"pricingModel\": \"計價模型\",\n \"displayName\": \"顯示名稱\",\n \"inputCost\": \"輸入成本\",\n \"outputCost\": \"輸出成本\",\n \"cacheReadCost\": \"快取命中\",\n \"cacheWriteCost\": \"快取建立\",\n \"pricingAudit\": \"稽核\",\n \"pricingBuiltinPublic\": \"內建公開價格\",\n \"pricingUserOverride\": \"使用者自訂\",\n \"pricingEffectiveAt\": \"生效\",\n \"longContextRate\": \"長上下文\",\n \"deleteConfirmTitle\": \"確認刪除\",\n \"deleteConfirmDesc\": \"確定要刪除此模型定價設定嗎?此操作無法復原。\",\n \"queryFailed\": \"查詢失敗\",\n \"refreshUsage\": \"重新整理用量\",\n \"planUsage\": \"方案用量\",\n \"hostConfirm\": {\n \"title\": \"確認外送網域\",\n \"message\": \"此供應商的自訂用量指令碼要向以下網域發出請求(其中會包含你的 API 金鑰):\\n\\n{{host}}\\n\\n僅在你信任該網域時才繼續。確認後會記住此選擇,直到目標網域變更為止。\",\n \"pending\": \"需先確認才能存取 {{host}}\",\n \"reviewButton\": \"檢視\",\n \"confirm\": \"信任並繼續\",\n \"cancel\": \"取消\"\n },\n \"invalid\": \"已失效\",\n \"total\": \"總:\",\n \"used\": \"已使用:\",\n \"remaining\": \"剩餘:\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}} 分鐘前\",\n \"hoursAgo\": \"{{count}} 小時前\",\n \"daysAgo\": \"{{count}} 天前\",\n \"multiplePlans\": \"{{count}} 個方案\",\n \"expand\": \"展開\",\n \"collapse\": \"收起\",\n \"modelIdPlaceholder\": \"例如: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例如: Claude 3.5 Sonnet\",\n \"appType\": \"應用程式類型\",\n \"allApps\": \"全部應用程式\",\n \"statusCode\": \"狀態碼\",\n \"searchProviderPlaceholder\": \"搜尋供應商...\",\n \"searchModelPlaceholder\": \"搜尋模型...\",\n \"timeRange\": \"時間範圍\",\n \"customRange\": \"日曆篩選\",\n \"customRangeHint\": \"支援日期與時間\",\n \"startTime\": \"開始時間\",\n \"endTime\": \"結束時間\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"建立\",\n \"cacheWriteNotReported\": \"OpenAI 協定不區分快取建立,僅上報快取命中\",\n \"cacheWritePartial\": \"部分協定(如 OpenAI)不上報快取建立,數值可能偏低\",\n \"cacheRead\": \"命中\",\n \"baseCost\": \"基礎\",\n \"costMultiplier\": \"成本倍率\",\n \"withMultiplier\": \"含倍率\",\n \"requestDetail\": \"請求詳情\",\n \"requestNotFound\": \"請求未找到\",\n \"basicInfo\": \"基本資訊\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"快取寫入成本\",\n \"costBreakdown\": \"成本明細\",\n \"performance\": \"效能資訊\",\n \"latency\": \"延遲\",\n \"errorMessage\": \"錯誤訊息\",\n \"requests\": \"請求數\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"平均成本\",\n \"avgLatency\": \"平均延遲\",\n \"successRate\": \"成功率\",\n \"requestId\": \"請求 ID\",\n \"never\": \"從不\",\n \"modelId\": \"模型 ID\",\n \"modelIdRequired\": \"模型 ID 不能為空\",\n \"inputCostPerMillion\": \"輸入成本 (每百萬 tokens, USD)\",\n \"outputCostPerMillion\": \"輸出成本 (每百萬 tokens, USD)\",\n \"invalidPrice\": \"價格必須為非負數\",\n \"invalidTimeRange\": \"請選擇完整的開始/結束時間\",\n \"invalidTimeRangeOrder\": \"開始時間不能晚於結束時間\",\n \"timeRangeTooLarge\": \"時間範圍過大,請縮小範圍\",\n \"addPricing\": \"新增定價\",\n \"editPricing\": \"編輯定價\",\n \"pricingAdded\": \"定價已新增\",\n \"pricingUpdated\": \"定價已更新\",\n \"cacheReadCostPerMillion\": \"快取讀取成本 (每百萬 tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"快取寫入成本 (每百萬 tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"設定用量查詢\",\n \"enableUsageQuery\": \"啟用用量查詢\",\n \"presetTemplate\": \"預設範本\",\n \"requestUrl\": \"請求位址\",\n \"requestUrlPlaceholder\": \"例如:https://api.example.com\",\n \"method\": \"HTTP 方法\",\n \"templateCustom\": \"自訂\",\n \"templateGeneral\": \"通用範本\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"官方\",\n \"templateOfficialSubscription\": \"官方訂閱\",\n \"copilotAutoAuth\": \"自動使用 OAuth 驗證,無需手動設定憑證\",\n \"tokenPlanHint\": \"自動使用供應商的 API Key 和 Base URL 查詢 Token Plan 額度\",\n \"balanceHint\": \"自動使用供應商的 API Key 查詢帳號餘額\",\n \"officialSubscriptionHint\": \"讀取本機 CLI 的 OAuth 憑證,並呼叫官方介面查詢訂閱額度。預設關閉,只有啟用後才會請求。\",\n \"resetDate\": \"重設日期\",\n \"premiumRequests\": \"Premium 請求\",\n \"credentialsConfig\": \"憑證設定\",\n \"credentialsHint\": \"留空則自動使用供應商設定\",\n \"optional\": \"選填\",\n \"apiKeyPlaceholder\": \"留空則使用供應商的 API Key\",\n \"baseUrlPlaceholder\": \"留空則使用供應商的請求位址\",\n \"baseUrl\": \"請求位址\",\n \"accessToken\": \"Access Token(在個人安全設定裡取得)\",\n \"accessTokenPlaceholder\": \"在「安全設定」裡產生\",\n \"userId\": \"使用者 ID\",\n \"userIdPlaceholder\": \"例如:114514\",\n \"defaultPlan\": \"預設方案\",\n \"queryFailedMessage\": \"查詢失敗\",\n \"queryScript\": \"查詢腳本(JavaScript)\",\n \"timeoutSeconds\": \"逾時時間(秒)\",\n \"headers\": \"請求標頭\",\n \"body\": \"請求 Body\",\n \"timeoutHint\": \"範圍: 2-30 秒\",\n \"timeoutMustBeInteger\": \"逾時時間必須為整數,小數部分已忽略\",\n \"timeoutCannotBeNegative\": \"逾時時間不能為負數\",\n \"autoIntervalMinutes\": \"自動查詢間隔(分鐘,0 表示不自動查詢)\",\n \"autoQueryInterval\": \"自動查詢間隔(分鐘)\",\n \"autoQueryIntervalHint\": \"0 表示不自動查詢,建議 5-60 分鐘\",\n \"intervalMustBeInteger\": \"自動查詢間隔必須為整數,小數部分已忽略\",\n \"intervalCannotBeNegative\": \"自動查詢間隔不能為負數\",\n \"intervalAdjusted\": \"自動查詢間隔已調整為 {{value}} 分鐘\",\n \"scriptHelp\": \"腳本編寫說明:\",\n \"configFormat\": \"設定格式:\",\n \"commentOptional\": \"選填\",\n \"commentResponseIsJson\": \"response 是 API 回傳的 JSON 資料\",\n \"extractorFormat\": \"extractor 回傳格式(所有欄位均為選填):\",\n \"tips\": \"💡 提示:\",\n \"testing\": \"測試中...\",\n \"testScript\": \"測試腳本\",\n \"format\": \"格式化\",\n \"saveConfig\": \"儲存設定\",\n \"scriptEmpty\": \"腳本設定不能為空\",\n \"mustHaveReturn\": \"腳本必須包含 return 敘述\",\n \"testSuccess\": \"測試成功!\",\n \"testFailed\": \"測試失敗\",\n \"formatSuccess\": \"格式化成功\",\n \"formatFailed\": \"格式化失敗\",\n \"supportedVariables\": \"支援的變數\",\n \"variablesHint\": \"支援變數: {{apiKey}}, {{baseUrl}} | extractor 函式接收 API 回應的 JSON 物件\",\n \"scriptConfig\": \"請求設定\",\n \"extractorCode\": \"提取器程式碼\",\n \"extractorHint\": \"回傳物件需包含剩餘額度等欄位\",\n \"fieldIsValid\": \"• isValid: 布林值,方案是否有效\",\n \"fieldInvalidMessage\": \"• invalidMessage: 字串,失效原因說明(當 isValid 為 false 時顯示)\",\n \"fieldRemaining\": \"• remaining: 數字,剩餘額度\",\n \"fieldUnit\": \"• unit: 字串,單位(如 \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: 字串,方案名稱\",\n \"fieldTotal\": \"• total: 數字,總額度\",\n \"fieldUsed\": \"• used: 數字,已用額度\",\n \"fieldExtra\": \"• extra: 字串,擴充欄位,可自由補充需要展示的文字\",\n \"tip1\": \"• 變數 {{apiKey}} 和 {{baseUrl}} 會自動替換\",\n \"tip2\": \"• extractor 函式在沙盒環境中執行,支援 ES2020+ 語法\",\n \"tip3\": \"• 整個設定必須用 () 包覆,形成物件實字運算式\"\n },\n \"errors\": {\n \"usage_query_failed\": \"用量查詢失敗\",\n \"configLoadFailedTitle\": \"設定載入失敗\",\n \"configLoadFailedMessage\": \"無法讀取設定檔:\\n{{path}}\\n\\n錯誤詳情:\\n{{detail}}\\n\\n請手動檢查 JSON 是否有效,或從同目錄的備份檔案(如 config.json.bak)還原。\\n\\n應用程式將退出以便您進行修復。\",\n \"mcpPageLoadFailed\": \"發現 MCP 頁面載入失敗\",\n \"mcpPageLoadDescription\": \"MCP 註冊表頁面渲染出錯,可能是資料異常或網路問題。\",\n \"pageLoadFailed\": \"頁面載入失敗\",\n \"pageLoadFailedDescription\": \"當前視圖渲染過程中發生了未預期的錯誤,請嘗試切換到其他頁面或重新整理。\"\n },\n \"presetSelector\": {\n \"title\": \"選擇設定類型\",\n \"custom\": \"自訂\",\n \"customDescription\": \"手動設定供應商,需要填寫完整的設定資訊\",\n \"officialDescription\": \"官方登入,不需要填寫 API Key\",\n \"presetDescription\": \"使用預設設定,只需填寫 API Key\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"匯入\",\n \"importExisting\": \"匯入已有\",\n \"addMcp\": \"新增 MCP\",\n \"discover\": \"發現MCP\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP 伺服器管理\",\n \"addServer\": \"新增伺服器\",\n \"editServer\": \"編輯伺服器\",\n \"deleteServer\": \"刪除伺服器\",\n \"deleteConfirm\": \"確定要刪除伺服器 \\\"{{id}}\\\" 嗎?此操作無法復原。\",\n \"noServers\": \"暫無伺服器\",\n \"enabledApps\": \"啟用的應用程式\",\n \"noImportFound\": \"未發現需要匯入的 MCP 伺服器。所有伺服器已在 OpenSunstar 統一管理中。\",\n \"importSuccess\": \"成功匯入 {{count}} 個 MCP 伺服器\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"使用者級 MCP 設定路徑\",\n \"serverList\": \"伺服器清單\",\n \"loading\": \"載入中...\",\n \"empty\": \"暫無 MCP 伺服器\",\n \"emptyDescription\": \"點擊右上角按鈕新增第一個 MCP 伺服器\",\n \"add\": \"新增 MCP\",\n \"addServer\": \"新增 MCP\",\n \"editServer\": \"編輯 MCP\",\n \"addClaudeServer\": \"新增 Claude Code MCP\",\n \"editClaudeServer\": \"編輯 Claude Code MCP\",\n \"addCodexServer\": \"新增 Codex MCP\",\n \"editCodexServer\": \"編輯 Codex MCP\",\n \"configPath\": \"設定路徑\",\n \"serverCount\": \"已設定 {{count}} 個 MCP 伺服器\",\n \"enabledCount\": \"已啟用 {{count}} 個\",\n \"template\": {\n \"fetch\": \"快速範本:mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP 標題(唯一)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"顯示名稱\",\n \"namePlaceholder\": \"例如 @modelcontextprotocol/server-time\",\n \"enabledApps\": \"啟用至應用程式\",\n \"noAppsWarning\": \"至少選擇一個應用程式\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"選填的描述資訊\",\n \"tags\": \"標籤(逗號分隔)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"首頁連結\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"文件連結\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"附加資訊\",\n \"jsonConfig\": \"完整的 JSON 設定\",\n \"jsonConfigOrPrefix\": \"完整的 JSON 設定或者使用\",\n \"tomlConfigOrPrefix\": \"完整的 TOML 設定或者使用\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"完整的 TOML 設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定精靈\",\n \"syncOtherSide\": \"同步至 {{target}}\",\n \"syncOtherSideHint\": \"勾選後會把目前設定同時寫入 {{target}},若存在同名設定將被覆寫\",\n \"willOverwriteWarning\": \"將覆寫 {{target}} 中的同名設定\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定精靈\",\n \"hint\": \"快速設定 MCP 伺服器,自動產生 JSON 設定\",\n \"type\": \"類型\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"命令\",\n \"commandPlaceholder\": \"npx 或 uvx\",\n \"args\": \"參數\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境變數\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"請輸入 URL\",\n \"headers\": \"請求標頭(選填)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定預覽\",\n \"apply\": \"套用設定\"\n },\n \"id\": \"標識 (唯一)\",\n \"type\": \"類型\",\n \"command\": \"命令\",\n \"validateCommand\": \"驗證命令\",\n \"args\": \"參數\",\n \"argsPlaceholder\": \"例如:mcp-server-fetch --help\",\n \"env\": \"環境變數 (一行一個,KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"重設\",\n \"msg\": {\n \"saved\": \"已儲存\",\n \"deleted\": \"已刪除\",\n \"enabled\": \"已啟用\",\n \"disabled\": \"已停用\",\n \"templateAdded\": \"已新增範本\"\n },\n \"error\": {\n \"idRequired\": \"請填寫標識\",\n \"idExists\": \"該標識已存在,請更換\",\n \"jsonInvalid\": \"JSON 格式錯誤,請檢查\",\n \"tomlInvalid\": \"TOML 格式錯誤,請檢查\",\n \"commandRequired\": \"請填寫命令\",\n \"singleServerObjectRequired\": \"此處只需單個伺服器物件,請不要貼上包含 mcpServers 的整份設定\",\n \"saveFailed\": \"儲存失敗\",\n \"deleteFailed\": \"刪除失敗\"\n },\n \"test\": {\n \"testConnection\": \"測試連結\",\n \"batchTestConnection\": \"批次測試所有伺服器連結\",\n \"batchProgress\": \"測試中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全部 {{count}} 個伺服器連線成功\",\n \"batchSummary\": \"{{connected}} 個成功,{{failed}} 個失敗(共 {{total}} 個)\",\n \"noServersToTest\": \"沒有可測試的伺服器\",\n \"connected\": \"已連線\",\n \"authRequired\": \"需驗證\",\n \"unreachable\": \"無法連線\",\n \"timeout\": \"逾時\",\n \"commandFailed\": \"啟動失敗\",\n \"unexpected\": \"異常\"\n },\n \"validation\": {\n \"ok\": \"命令可用\",\n \"fail\": \"命令不可用\"\n },\n \"confirm\": {\n \"deleteTitle\": \"刪除 MCP 伺服器\",\n \"deleteMessage\": \"確定要刪除 MCP 伺服器 \\\"{{id}}\\\" 嗎?此操作無法復原。\"\n },\n \"presets\": {\n \"title\": \"選擇 MCP 類型\",\n \"enable\": \"啟用\",\n \"enabled\": \"已啟用\",\n \"installed\": \"已安裝\",\n \"docs\": \"文件\",\n \"requiresEnv\": \"需要環境變數\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"通用 HTTP 請求工具,支援 GET/POST 等 HTTP 方法,適合快速請求 API / 抓取網頁資料\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"時間查詢工具,提供目前時間、時區轉換、日期計算等功能\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"知識圖譜記憶系統,支援儲存實體、關係和觀察,讓 AI 記住對話中的重要資訊\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"順序思考工具,協助 AI 將複雜問題分解為多個步驟,逐步深入思考\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 文件搜尋工具,提供最新的函式庫文件和程式碼範例,設定 key 會有更高限額\"\n }\n },\n \"discovery\": {\n \"title\": \"發現 MCP\",\n \"searchPlaceholder\": \"輸入關鍵字搜索 MCP 服務器...\",\n \"totalFound\": \"找到 {{count}} 個服務器\",\n \"alreadyInstalled\": \"已安裝 {{count}} 個\",\n \"noResults\": \"未找到與 \\\"{{query}}\\\" 相關的服務器\",\n \"noServers\": \"暫無可用服務器\",\n \"official\": \"官方\",\n \"installed\": \"已安裝\",\n \"install\": \"安裝\",\n \"remotes\": \"連接方式\",\n \"website\": \"網站\",\n \"repository\": \"倉庫\"\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude 提示詞管理\",\n \"codexTitle\": \"Codex 提示詞管理\",\n \"add\": \"新增提示詞\",\n \"edit\": \"編輯提示詞\",\n \"addTitle\": \"新增 {{appName}} 提示詞\",\n \"editTitle\": \"編輯 {{appName}} 提示詞\",\n \"import\": \"匯入現有\",\n \"count\": \"共 {{count}} 個提示詞\",\n \"enabled\": \"已啟用\",\n \"enable\": \"啟用\",\n \"enabledName\": \"已啟用:{{name}}\",\n \"noneEnabled\": \"未啟用任何提示詞\",\n \"currentFile\": \"目前 {{filename}} 內容\",\n \"empty\": \"暫無提示詞\",\n \"emptyDescription\": \"點擊右上角按鈕新增或匯入提示詞\",\n \"loading\": \"載入中...\",\n \"name\": \"名稱\",\n \"namePlaceholder\": \"例如:專案預設提示詞\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"選填的描述資訊\",\n \"content\": \"內容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\n在此輸入提示詞內容...\",\n \"loadFailed\": \"載入提示詞失敗\",\n \"saveSuccess\": \"儲存成功\",\n \"saveFailed\": \"儲存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"enableSuccess\": \"啟用成功\",\n \"enableFailed\": \"啟用失敗\",\n \"disableSuccess\": \"停用成功\",\n \"disableFailed\": \"停用失敗\",\n \"importSuccess\": \"匯入成功\",\n \"importFailed\": \"匯入失敗\",\n \"confirm\": {\n \"deleteTitle\": \"確認刪除\",\n \"deleteMessage\": \"確定要刪除提示詞 \\\"{{name}}\\\" 嗎?\"\n },\n \"fragment\": {\n \"isFragment\": \"規則片段\",\n \"parent\": \"所屬 Prompt\",\n \"selectParent\": \"選擇父 Prompt\",\n \"priority\": \"優先級(高者優先合併)\",\n \"targets\": \"目標工具(逗號分隔,* 表示全部)\",\n \"globs\": \"文件 Glob(JSON 數組)\",\n \"badge\": \"片段\"\n }\n },\n \"workspace\": {\n \"title\": \"專案駕駛艙\",\n \"manage\": \"Workspace\",\n \"files\": {\n \"agents\": \"Agent 操作指令和規則\",\n \"soul\": \"Agent 人格和溝通風格\",\n \"user\": \"使用者檔案和偏好\",\n \"identity\": \"Agent 名稱和頭像\",\n \"tools\": \"本地工具文件\",\n \"memory\": \"長期記憶和決策紀錄\",\n \"heartbeat\": \"心跳執行清單\",\n \"bootstrap\": \"首次執行儀式\",\n \"boot\": \"閘道器重新啟動清單\"\n },\n \"editing\": \"編輯 {{filename}}\",\n \"saveSuccess\": \"儲存成功\",\n \"saveFailed\": \"儲存失敗\",\n \"loadFailed\": \"讀取失敗\",\n \"openDirectory\": \"在檔案管理員中開啟\",\n \"dailyMemory\": {\n \"title\": \"每日記憶\",\n \"sectionTitle\": \"每日記憶\",\n \"cardTitle\": \"每日記憶檔案\",\n \"cardDescription\": \"瀏覽管理每日記憶\",\n \"createToday\": \"新增記憶\",\n \"empty\": \"暫無每日記憶檔案\",\n \"loadFailed\": \"載入每日記憶檔案失敗\",\n \"createFailed\": \"建立每日記憶檔案失敗\",\n \"deleteSuccess\": \"每日記憶檔案已刪除\",\n \"deleteFailed\": \"刪除每日記憶檔案失敗\",\n \"confirmDeleteTitle\": \"刪除每日記憶\",\n \"confirmDeleteMessage\": \"確定刪除 {{date}} 的每日記憶嗎?此操作不可復原。\",\n \"searchPlaceholder\": \"搜尋全文內容...\",\n \"searchScopeHint\": \"全文搜尋所有每日記憶 ⌘F\",\n \"searchCloseHint\": \"Esc 關閉\",\n \"noSearchResults\": \"沒有找到符合的每日記憶。\",\n \"searching\": \"搜尋中...\",\n \"searchFailed\": \"搜尋失敗\",\n \"matchCount\": \"{{count}} 處相符\"\n },\n \"subtitle\": \"彙總各項目 AI 配置狀態與近期活躍度,幫你先看該看的\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 配置\"\n },\n \"tabs\": {\n \"label\": \"工作區視圖\",\n \"dashboard\": \"今日告警\",\n \"board\": \"項目看板\"\n },\n \"dashboard\": {\n \"title\": \"今日告警\",\n \"subtitle\": \"共 {{count}} 個項目 · 優先關注進度與 AI 資產配置\",\n \"attentionCount\": \"待關注項目\",\n \"attentionHint\": \"就緒不足或資產缺失\",\n \"avgReadiness\": \"平均就緒分\",\n \"missingMcp\": \"缺 MCP 項目\",\n \"activeProjects\": \"近 {{days}} 天活躍\",\n \"activeHint\": \"有 Git 提交\",\n \"queueTitle\": \"建議優先處理\",\n \"allGood\": \"各項目配置狀態良好,可直接進入迭代。\",\n \"configureAssets\": \"配置資產\",\n \"reasonReadiness\": \"就緒分 {{score}}/{{max}}\",\n \"reasonDrift\": \"配置不一致 {{count}} 項\",\n \"reasonUnmanaged\": \"尚未納入 OpenSunstar 管理\",\n \"reasonMcp\": \"未關聯 MCP\",\n \"reasonSkills\": \"未配置 Skills\",\n \"reasonPrompts\": \"未關聯 Prompts\",\n \"reasonProgress\": \"MVP 進度 {{progress}}%\",\n \"lastUpdated\": \"上次更新\",\n \"updatedJustNow\": \"剛剛更新\",\n \"updatedMinutesAgo\": \"{{count}} 分鐘前更新\",\n \"updatedHoursAgo\": \"{{count}} 小時前更新\",\n \"updatedAt\": \"更新於 {{time}}\",\n \"refreshing\": \"正在刷新…\",\n \"loading\": \"正在彙總項目就緒與資產數據…\",\n \"mvpBehindHint\": \"{{count}} 個 MVP 項目進度低於 50%,建議優先推進。\",\n \"activeSub\": \"共 {{commits}} 次提交 · 活躍度 {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 資產總覽\",\n \"subtitle\": \"按項目查看 MCP / Skills / Prompts 關聯與就緒狀態\",\n \"loading\": \"正在彙總各項目 AI 資產…\",\n \"project\": \"項目\",\n \"stage\": \"階段\",\n \"readiness\": \"就緒\",\n \"progress\": \"進度\",\n \"refreshing\": \"更新中\",\n \"subtitle8\": \"按項目查看 8 類 AI 資產關聯數量與就緒狀態(項目級啟用子集)\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"已建立備份:{{path}}\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定檔中的唯一識別碼,只能使用小寫字母、數字和連字號\",\n \"providerKeyLockedHint\": \"該供應商已新增至應用程式設定中,供應商標識不可修改\",\n \"providerKeyRequired\": \"請填寫供應商標識\",\n \"providerKeyDuplicate\": \"此標識已被使用,請更換\",\n \"providerKeyInvalid\": \"標識格式無效,只能使用小寫字母、數字和連字號\",\n \"apiProtocol\": \"API 協定\",\n \"selectProtocol\": \"選擇 API 協定\",\n \"apiProtocolHint\": \"選擇與供應商 API 相容的協定類型。大多數供應商使用 OpenAI Completions 格式。\",\n \"baseUrl\": \"API 端點\",\n \"baseUrlHint\": \"供應商的 API 端點位址。\",\n \"models\": \"模型清單\",\n \"addModel\": \"新增模型\",\n \"noModels\": \"暫無模型設定。點擊新增模型來設定可用模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"顯示名稱\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"上下文視窗\",\n \"maxTokens\": \"最大輸出 Tokens\",\n \"reasoning\": \"推理模式\",\n \"reasoningOn\": \"啟用\",\n \"reasoningOff\": \"關閉\",\n \"inputTypes\": \"輸入類型\",\n \"inputCost\": \"輸入價格 ($/M tokens)\",\n \"outputCost\": \"輸出價格 ($/M tokens)\",\n \"advancedOptions\": \"進階選項\",\n \"cacheReadCost\": \"快取讀取價格 ($/M tokens)\",\n \"cacheWriteCost\": \"快取寫入價格 ($/M tokens)\",\n \"cacheCostHint\": \"快取價格用於計算 Prompt Caching 的成本。如不使用快取可留空。\",\n \"modelsHint\": \"設定該供應商支援的模型。模型 ID 用於 API 呼叫,顯示名稱用於介面展示。\",\n \"userAgent\": \"發送 User-Agent\",\n \"userAgentHint\": \"部分供應商需要瀏覽器 User-Agent 才能正常存取。\",\n \"env\": {\n \"title\": \"環境變數\",\n \"description\": \"管理 openclaw.json 中的環境變數設定(API Key、自訂變數等)\",\n \"editorHint\": \"以 JSON 形式編輯整個 env 節點。支援 env.vars、env.shellEnv 等巢狀物件。\",\n \"objectRequired\": \"OpenClaw 的 env 必須是 JSON 物件。\",\n \"invalidJson\": \"OpenClaw 的 env 必須是合法 JSON。\",\n \"empty\": \"OpenClaw 的 env 不能為空。空物件請使用 {}。\",\n \"keyPlaceholder\": \"變數名稱\",\n \"valuePlaceholder\": \"值\",\n \"add\": \"新增變數\",\n \"saveSuccess\": \"環境變數已儲存\",\n \"saveFailed\": \"儲存環境變數失敗\",\n \"loadFailed\": \"讀取環境變數失敗\",\n \"duplicateKey\": \"檢測到重複的變數名稱: {{key}}\"\n },\n \"tools\": {\n \"title\": \"工具權限\",\n \"description\": \"管理 openclaw.json 中的工具權限設定(允許/拒絕清單)\",\n \"profile\": \"權限模式\",\n \"profileMinimal\": \"最小權限\",\n \"profileCoding\": \"編碼\",\n \"profileMessaging\": \"對話\",\n \"profileFull\": \"完全存取\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"檢測到不受支援的工具設定\",\n \"unsupportedProfileDescription\": \"目前 tools.profile 的值「{{value}}」不在 OpenClaw 支援清單內。在您手動選擇新值之前,它會被保留。\",\n \"unsupportedProfileLabel\": \"不受支援\",\n \"allowList\": \"允許清單\",\n \"denyList\": \"拒絕清單\",\n \"patternPlaceholder\": \"工具名稱或模式\",\n \"addAllow\": \"新增允許\",\n \"addDeny\": \"新增拒絕\",\n \"saveSuccess\": \"工具權限已儲存\",\n \"saveFailed\": \"儲存工具權限失敗\",\n \"loadFailed\": \"讀取工具權限失敗\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"管理 openclaw.json 中的 agents.defaults 設定(預設模型、執行參數等)\",\n \"modelSection\": \"模型設定\",\n \"primaryModel\": \"預設模型\",\n \"primaryModelHint\": \"從已設定供應商的模型中選擇預設模型\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"備用模型\",\n \"fallbackModelsHint\": \"當主模型不可用時,依優先順序依次嘗試以下備用模型\",\n \"addFallback\": \"新增備用模型\",\n \"noModels\": \"暫無已設定的供應商模型。請先新增 OpenClaw 供應商。\",\n \"notInList\": \"{{value}} (供應商未設定)\",\n \"runtimeSection\": \"執行參數\",\n \"workspace\": \"工作區路徑\",\n \"timeout\": \"逾時時間(秒)\",\n \"contextTokens\": \"上下文 Token 數\",\n \"maxConcurrent\": \"最大並行數\",\n \"legacyTimeoutTitle\": \"檢測到舊版逾時欄位\",\n \"legacyTimeoutDescription\": \"目前設定仍在使用 agents.defaults.timeout。儲存本頁面時會遷移為 timeoutSeconds。\",\n \"saveSuccess\": \"Agents 設定已儲存\",\n \"saveFailed\": \"儲存 Agents 設定失敗\",\n \"loadFailed\": \"讀取 Agents 設定失敗\"\n },\n \"health\": {\n \"title\": \"檢測到 OpenClaw 設定警告\",\n \"invalidToolsProfile\": \"tools.profile 使用了不受支援的值。OpenClaw 目前只支援 minimal、coding、messaging、full。\",\n \"legacyTimeout\": \"agents.defaults.timeout 已廢棄。開啟並儲存 Agents 面板即可遷移至 timeoutSeconds。\",\n \"stringifiedEnvVars\": \"env.vars 應為物件,但目前值看起來像被字串化或已損壞。\",\n \"stringifiedShellEnv\": \"env.shellEnv 應為物件,但目前值看起來像被字串化或已損壞。\",\n \"parseFailed\": \"openclaw.json 不是合法 JSON5。請先修復檔案,再透過這裡編輯。\"\n },\n \"primaryModel\": \"預設模型\",\n \"fallbackModel\": \"備用模型\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API 端點\",\n \"baseUrlHint\": \"供應商的 API 端點位址。\",\n \"providerKey\": \"供應商標識\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"只能使用小寫字母、數字和連字號。用作 config.yaml 中的供應商名稱。\",\n \"providerKeyLockedHint\": \"該供應商已新增至 Hermes 設定中,標識不可修改。\",\n \"providerKeyRequired\": \"供應商標識不能為空\",\n \"providerKeyInvalid\": \"供應商標識只能包含小寫字母、數字和連字號\",\n \"providerKeyDuplicate\": \"該供應商標識已存在\",\n \"apiMode\": \"API 模式\",\n \"apiModeHint\": \"供應商 API 協定。請根據端點選擇正確的協定。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API 端點不能為空\",\n \"baseUrlScheme\": \"請使用 http:// 或 https:// 開頭的位址\",\n \"baseUrlInvalid\": \"API 端點不是有效的 URL\",\n \"models\": \"模型清單\",\n \"addModel\": \"新增模型\",\n \"noModels\": \"暫無模型設定。切換至此供應商時將不會更新預設模型。\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"顯示名稱\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"上下文長度\",\n \"advancedOptions\": \"進階選項\",\n \"modelsHint\": \"切換至此供應商時,第一個模型會寫入頂層 model.default。\",\n \"primaryModel\": \"預設模型\",\n \"fallbackModel\": \"備用模型\",\n \"providerAdvanced\": \"供應商進階選項\",\n \"rateLimitDelay\": \"請求間隔(秒)\",\n \"rateLimitDelayHint\": \"連續請求間的最小間隔秒數(選填)。留空表示無限制。\"\n },\n \"webui\": {\n \"open\": \"開啟 Hermes Web UI\",\n \"offline\": \"Hermes Web UI 未啟動,請先執行 `hermes dashboard` 啟動服務。\",\n \"openFailed\": \"開啟 Hermes Web UI 失敗\",\n \"launchConfirmTitle\": \"Hermes Dashboard 未啟動\",\n \"launchConfirmMessage\": \"是否開啟終端機並執行 `hermes dashboard` 啟動服務?\\n\\n啟動完成後會自動開啟瀏覽器。\\n\\n若終端機提示找不到 hermes 或缺少 web 相依套件,請先執行:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"開啟終端機並啟動\",\n \"launching\": \"已在終端機啟動 hermes dashboard\",\n \"launchFailed\": \"開啟終端機失敗\"\n },\n \"memory\": {\n \"title\": \"記憶管理\",\n \"agentTab\": \"Agent 記憶 (MEMORY.md)\",\n \"userTab\": \"使用者畫像 (USER.md)\",\n \"usage\": \"已用 {{current}} / {{limit}} 字元\",\n \"overLimit\": \"已超過上限,Hermes 下次載入時會截斷\",\n \"enableOn\": \"已啟用\",\n \"enableOff\": \"已停用\",\n \"disabledHint\": \"在重新啟用前 Hermes 會跳過此記憶\",\n \"toggleFailed\": \"切換記憶狀態失敗\",\n \"saveSuccess\": \"記憶已儲存\",\n \"saveFailed\": \"儲存記憶失敗\",\n \"loadFailed\": \"讀取記憶檔案失敗\",\n \"openConfig\": \"在 Hermes Web UI 調整上限\",\n \"runtimeNote\": \"變更將在 Hermes 下次啟動或建立新工作階段時生效。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"檢測到系統環境變數衝突\",\n \"description\": \"發現 {{count}} 個環境變數可能會覆寫您的設定\"\n },\n \"actions\": {\n \"expand\": \"查看詳情\",\n \"collapse\": \"收起\",\n \"selectAll\": \"全選\",\n \"clearSelection\": \"取消選擇\",\n \"deleteSelected\": \"刪除選取 ({{count}})\",\n \"deleting\": \"刪除中...\"\n },\n \"field\": {\n \"value\": \"值\",\n \"source\": \"來源\"\n },\n \"source\": {\n \"userRegistry\": \"使用者環境變數 (登錄檔)\",\n \"systemRegistry\": \"系統環境變數 (登錄檔)\",\n \"systemEnv\": \"系統環境變數\"\n },\n \"delete\": {\n \"success\": \"環境變數已成功刪除\",\n \"error\": \"刪除環境變數失敗\"\n },\n \"backup\": {\n \"location\": \"備份位置:{{path}}\"\n },\n \"confirm\": {\n \"title\": \"確認刪除環境變數\",\n \"message\": \"確定要刪除 {{count}} 個環境變數嗎?\",\n \"backupNotice\": \"刪除前將自動備份,您可以稍後還原。刪除後需要重新啟動應用程式或終端機才能生效。\",\n \"confirm\": \"確認刪除\"\n },\n \"error\": {\n \"noSelection\": \"請選擇要刪除的環境變數\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"從熱門的儲存庫發現並安裝技能,擴充 Claude Code/Codex/Gemini 的能力\",\n \"refresh\": \"重新整理\",\n \"refreshing\": \"重新整理中...\",\n \"repoManager\": \"儲存庫管理\",\n \"count\": \"共 {{count}} 個技能\",\n \"empty\": \"暫無可用技能\",\n \"emptyDescription\": \"新增技能儲存庫以發現可用的技能\",\n \"addRepo\": \"新增技能儲存庫\",\n \"loading\": \"載入中...\",\n \"installed\": \"已安裝\",\n \"install\": \"安裝\",\n \"installing\": \"安裝中...\",\n \"uninstall\": \"解除安裝\",\n \"uninstalling\": \"解除安裝中...\",\n \"view\": \"檢視\",\n \"noDescription\": \"暫無描述\",\n \"loadFailed\": \"載入失敗\",\n \"installSuccess\": \"技能 {{name}} 已安裝\",\n \"installFailed\": \"安裝失敗\",\n \"uninstallSuccess\": \"技能 {{name}} 已解除安裝\",\n \"uninstallFailed\": \"解除安裝失敗\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"可更新\",\n \"updateSuccess\": \"技能 {{name}} 已更新至最新版本\",\n \"updateFailed\": \"更新失敗\",\n \"checkUpdates\": \"檢查更新\",\n \"checkingUpdates\": \"檢查中...\",\n \"noUpdates\": \"所有技能已是最新版本\",\n \"updatesFound\": \"發現 {{count}} 個技能有可用更新\",\n \"updateAll\": \"全部更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"已成功更新 {{count}} 個技能\",\n \"error\": {\n \"skillNotFound\": \"技能不存在:{{directory}}\",\n \"missingRepoInfo\": \"缺少儲存庫資訊(owner 或 name)\",\n \"downloadTimeout\": \"下載儲存庫 {{owner}}/{{name}} 逾時({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"請檢查網路連線或稍後重試\",\n \"skillPathNotFound\": \"儲存庫 {{owner}}/{{name}} 中未找到技能路徑 '{{path}}'\",\n \"skillDirNotFound\": \"技能目錄不存在:{{path}}\",\n \"directoryConflict\": \"技能目錄 '{{directory}}' 已被 {{existing_repo}} 佔用,無法從 {{new_repo}} 安裝\",\n \"emptyArchive\": \"下載的壓縮檔為空\",\n \"downloadFailed\": \"下載失敗:HTTP {{status}}\",\n \"allBranchesFailed\": \"所有分支下載失敗,嘗試了:{{branches}}\",\n \"httpError\": \"HTTP 錯誤 {{status}}\",\n \"http403\": \"GitHub 存取受限,可能是請求頻率過高\",\n \"http404\": \"儲存庫或分支不存在,請檢查位址\",\n \"http429\": \"請求過於頻繁,請等待後重試\",\n \"parseMetadataFailed\": \"解析技能中繼資料失敗\",\n \"getHomeDirFailed\": \"無法取得使用者主目錄\",\n \"noSkillsInZip\": \"ZIP 檔案中未找到技能(需包含 SKILL.md 檔案)\",\n \"networkError\": \"網路錯誤\",\n \"fsError\": \"檔案系統錯誤\",\n \"unknownError\": \"未知錯誤\",\n \"suggestion\": {\n \"checkNetwork\": \"請檢查網路連線\",\n \"checkProxy\": \"建議設定 HTTP 代理伺服器\",\n \"retryLater\": \"請稍後重試\",\n \"checkRepoUrl\": \"請檢查儲存庫位址和分支名稱\",\n \"checkDiskSpace\": \"請檢查磁碟空間\",\n \"checkPermission\": \"請檢查目錄權限\",\n \"uninstallFirst\": \"請先解除安裝已安裝的同名技能\",\n \"checkZipContent\": \"請確認 ZIP 檔案包含有效的技能目錄(含 SKILL.md 檔案)\"\n }\n },\n \"repo\": {\n \"title\": \"管理技能儲存庫\",\n \"description\": \"新增或刪除 GitHub 技能儲存庫來源\",\n \"url\": \"儲存庫 URL\",\n \"urlPlaceholder\": \"owner/name 或 https://github.com/owner/name\",\n \"branch\": \"分支\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"技能路徑\",\n \"pathPlaceholder\": \"skills (選填,留空掃描根目錄)\",\n \"add\": \"新增儲存庫\",\n \"list\": \"已新增的儲存庫\",\n \"empty\": \"暫無儲存庫\",\n \"invalidUrl\": \"無效的儲存庫 URL 格式\",\n \"addSuccess\": \"儲存庫 {{owner}}/{{name}} 已新增,識別到 {{count}} 個技能\",\n \"addFailed\": \"新增失敗\",\n \"removeSuccess\": \"儲存庫 {{owner}}/{{name}} 已刪除\",\n \"removeFailed\": \"刪除失敗\",\n \"skillCount\": \"識別到 {{count}} 個技能\"\n },\n \"search\": \"搜尋技能\",\n \"searchPlaceholder\": \"搜尋技能名稱或儲存庫名稱...\",\n \"searchSource\": {\n \"repos\": \"儲存庫\",\n \"skillssh\": \"skills.sh\",\n \"all\": \"全部\",\n \"leaderboardAllTime\": \"全站總榜\",\n \"leaderboardTrending\": \"24h 趨勢\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"搜尋 skills.sh(至少 2 個字元)...\",\n \"installs\": \"{{count}} 次安裝\",\n \"loadMore\": \"載入更多\",\n \"loading\": \"正在搜尋 skills.sh...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相關技能\",\n \"error\": \"搜尋 skills.sh 失敗\",\n \"poweredBy\": \"由 skills.sh 提供\"\n },\n \"filter\": {\n \"placeholder\": \"狀態篩選\",\n \"all\": \"全部\",\n \"installed\": \"已安裝\",\n \"uninstalled\": \"未安裝\",\n \"repo\": \"儲存庫篩選\",\n \"allRepos\": \"全部儲存庫\"\n },\n \"noResults\": \"未找到相符的技能\",\n \"noInstalled\": \"暫無已安裝的技能\",\n \"noInstalledDescription\": \"從儲存庫發現並安裝技能,或匯入已有的技能\",\n \"discover\": \"發現技能\",\n \"import\": \"匯入已有\",\n \"importDescription\": \"選擇要匯入至 OpenSunstar 統一管理的技能\",\n \"importSuccess\": \"成功匯入 {{count}} 個技能\",\n \"importSelected\": \"匯入已選 ({{count}})\",\n \"noUnmanagedFound\": \"未發現需要匯入的技能。所有技能已在 OpenSunstar 統一管理中。\",\n \"foundIn\": \"發現於\",\n \"local\": \"本地\",\n \"uninstallConfirm\": \"確定要解除安裝技能 \\\"{{name}}\\\" 嗎?這將從所有應用程式中移除該技能,並在刪除前自動建立本地備份。\",\n \"uninstallInMainPanel\": \"請在主面板中解除安裝技能\",\n \"notFound\": \"未找到技能\",\n \"backup\": {\n \"location\": \"備份位置:{{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"從備份中還原\",\n \"title\": \"從備份中還原\",\n \"description\": \"選擇一個 Skills 備份,將檔案還原至本地並重新加入目前清單。\",\n \"empty\": \"暫無可還原的 Skills 備份\",\n \"createdAt\": \"備份時間\",\n \"path\": \"備份路徑\",\n \"restore\": \"還原\",\n \"restoring\": \"還原中...\",\n \"delete\": \"刪除\",\n \"deleting\": \"刪除中...\",\n \"deleteSuccess\": \"技能備份 {{name}} 已刪除\",\n \"deleteFailed\": \"刪除技能備份失敗\",\n \"deleteConfirmTitle\": \"確認刪除備份\",\n \"deleteConfirmMessage\": \"確定要刪除技能備份 \\\"{{name}}\\\" 嗎?此操作無法復原。\",\n \"success\": \"技能 {{name}} 已從備份還原\",\n \"failed\": \"從備份還原失敗\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"從 ZIP 安裝\",\n \"installing\": \"安裝中...\",\n \"successSingle\": \"技能 {{name}} 已安裝\",\n \"successMultiple\": \"成功安裝 {{count}} 個技能\",\n \"noSkillsFound\": \"ZIP 檔案中未找到技能(需包含 SKILL.md 檔案)\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全站總榜\",\n \"trendingTitle\": \"24h 趨勢\",\n \"allTimeDesc\": \"與 skills.sh 官網 All Time 排行榜 TOP50 對齊(歷史總安裝量)\",\n \"trendingDesc\": \"與 skills.sh 官網 Trending (24h) 排行榜 TOP50 對齊\",\n \"syncedAt\": \"同步於 {{time}}\",\n \"fromCache\": \"本地緩存\",\n \"registryTotal\": \"全站累計 {{count}} 次安裝\",\n \"loading\": \"正在同步 skills.sh 官方排行榜…\",\n \"error\": \"無法同步 skills.sh 官方排行榜\",\n \"empty\": \"暫無排行榜數據\",\n \"syncPolicy\": \"非實時數據 · 默認每 {{hours}} 小時從 skills.sh 同步 · 點擊刷新可立即更新\",\n \"nextSyncAt\": \"下次自動同步約 {{time}}\",\n \"refreshNow\": \"立即從 skills.sh 同步\",\n \"pageRange\": \"{{range}} · 第 {{page}}/{{totalPages}} 頁(共 {{total}} 條)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"輸入關鍵詞搜索所有來源(倉庫 / skills.sh / ClawHub)...\",\n \"searching\": \"正在搜索多個來源...\",\n \"typeToSearch\": \"輸入關鍵詞搜索 skills.sh 和 ClawHub 技能\",\n \"typeToSearchMore\": \"輸入關鍵詞可搜索更多來源\",\n \"mergedCount\": \"共 {{total}} 個結果\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"搜索 ClawHub(至少 2 個字符)...\",\n \"loading\": \"正在搜索 ClawHub...\",\n \"noResults\": \"未找到 \\\"{{query}}\\\" 相關技能\",\n \"resultCount\": \"共 {{count}} 個結果\",\n \"poweredBy\": \"由 ClawHub 提供\",\n \"installViaCli\": \"ClawHub 技能請通過 CLI 安裝\",\n \"installSuccess\": \"{{slug}} 安裝成功\",\n \"installFailed\": \"ClawHub 技能安裝失敗\",\n \"installing\": \"正在安裝...\"\n },\n \"batchUninstall\": \"卸載\",\n \"batchUninstallTitle\": \"批量卸載\",\n \"batchUninstallConfirm\": \"確定要卸載 {{count}} 個技能嗎?\",\n \"batchUninstallSuccess\": \"成功卸載 {{count}} 個技能\",\n \"batchUninstallPartial\": \"卸載完成:{{success}} 成功,{{fail}} 失敗\"\n },\n \"deeplink\": {\n \"confirmImport\": \"確認匯入供應商設定\",\n \"confirmImportDescription\": \"以下設定將匯入至 OpenSunstar\",\n \"importPrompt\": \"匯入提示詞\",\n \"importPromptDescription\": \"請確認是否匯入此系統提示詞\",\n \"importMcp\": \"匯入 MCP Servers\",\n \"importMcpDescription\": \"請確認是否匯入這些 MCP Servers\",\n \"importSkill\": \"新增 Skill 儲存庫\",\n \"importSkillDescription\": \"請確認是否新增此 Skill 儲存庫\",\n \"promptImportSuccess\": \"提示詞匯入成功\",\n \"promptImportSuccessDescription\": \"已匯入提示詞:{{name}}\",\n \"mcpImportSuccess\": \"MCP Servers 匯入成功\",\n \"mcpImportSuccessDescription\": \"成功匯入 {{count}} 個伺服器\",\n \"mcpPartialSuccess\": \"部分匯入成功\",\n \"mcpPartialSuccessDescription\": \"成功:{{success}},失敗:{{failed}}\",\n \"skillImportSuccess\": \"Skill 儲存庫新增成功\",\n \"skillImportSuccessDescription\": \"已新增儲存庫:{{repo}}\",\n \"app\": \"應用程式類型\",\n \"providerName\": \"供應商名稱\",\n \"homepage\": \"官網位址\",\n \"endpoint\": \"API 端點\",\n \"apiKey\": \"API 金鑰\",\n \"icon\": \"圖示\",\n \"model\": \"模型\",\n \"haikuModel\": \"Haiku 模型\",\n \"sonnetModel\": \"Sonnet 模型\",\n \"opusModel\": \"Opus 模型\",\n \"multiModel\": \"多模態模型\",\n \"notes\": \"備註\",\n \"import\": \"匯入\",\n \"importing\": \"匯入中...\",\n \"warning\": \"請確認以上資訊準確無誤後再匯入。匯入後可在供應商清單中編輯或刪除。\",\n \"parseError\": \"深層連結解析失敗\",\n \"importSuccess\": \"匯入成功\",\n \"importSuccessDescription\": \"供應商 \\\"{{name}}\\\" 已成功匯入\",\n \"importError\": \"匯入失敗\",\n \"configSource\": \"設定來源\",\n \"configEmbedded\": \"內嵌設定\",\n \"configRemote\": \"遠端設定\",\n \"configDetails\": \"設定詳情\",\n \"configUrl\": \"設定檔 URL\",\n \"configMergeError\": \"合併設定檔失敗\",\n \"primaryEndpoint\": \"主\",\n \"mcp\": {\n \"title\": \"批次匯入 MCP Servers\",\n \"targetApps\": \"目標應用程式\",\n \"serverCount\": \"MCP Servers ({{count}} 個)\",\n \"enabledWarning\": \"匯入後將立即寫入所有指定應用程式的設定檔\"\n },\n \"prompt\": {\n \"title\": \"匯入系統提示詞\",\n \"app\": \"應用程式\",\n \"name\": \"名稱\",\n \"description\": \"描述\",\n \"contentPreview\": \"內容預覽\",\n \"enabledWarning\": \"匯入後將立即啟用此提示詞,其他提示詞將被停用\"\n },\n \"skill\": {\n \"title\": \"新增 Claude Skill 儲存庫\",\n \"repo\": \"GitHub 儲存庫\",\n \"directory\": \"目標目錄\",\n \"branch\": \"分支\",\n \"skillsPath\": \"Skills 路徑\",\n \"hint\": \"此操作將新增 Skill 儲存庫至清單。\",\n \"hintDetail\": \"新增後,您可以在 Skills 管理介面中選擇安裝具體的 Skill。\"\n },\n \"usageScript\": \"用量查詢\",\n \"usageScriptEnabled\": \"已啟用\",\n \"usageScriptDisabled\": \"未啟用\",\n \"usageApiKey\": \"用量 API Key\",\n \"usageBaseUrl\": \"用量查詢位址\",\n \"usageAutoInterval\": \"自動查詢\",\n \"usageAutoIntervalValue\": \"每 {{minutes}} 分鐘\"\n },\n \"iconPicker\": {\n \"search\": \"搜尋圖示\",\n \"searchPlaceholder\": \"輸入圖示名稱...\",\n \"noResults\": \"未找到相符的圖示\",\n \"category\": {\n \"aiProvider\": \"AI 服務商\",\n \"cloud\": \"雲端平台\",\n \"tool\": \"開發工具\",\n \"other\": \"其他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"圖示\",\n \"colorLabel\": \"圖示顏色\",\n \"selectIcon\": \"選擇圖示\",\n \"preview\": \"預覽\",\n \"clickToChange\": \"點擊更換圖示\",\n \"clickToSelect\": \"點擊選擇圖示\",\n \"color\": \"圖示顏色\"\n },\n \"migration\": {\n \"success\": \"設定遷移成功\",\n \"skillsSuccess\": \"已自動匯入 {{count}} 個技能至統一管理\",\n \"skillsFailed\": \"自動匯入技能失敗\",\n \"skillsFailedDescription\": \"請開啟 Skills 頁面點擊「匯入現有」手動匯入(或重新啟動後再試)。\"\n },\n \"agents\": {\n \"title\": \"Agent\",\n \"subtitle\": \"同步到 Claude / Gemini / OpenCode 的 agents 目錄(Markdown)\",\n \"empty\": \"暫無 Subagent\",\n \"emptyHint\": \"創建自定義 Subagent 並同步到 ~/.claude/agents/ 等目錄\",\n \"add\": \"添加 Subagent\",\n \"edit\": \"編輯 Subagent\",\n \"count\": \"共 {{count}} 個 Subagent\",\n \"loadFailed\": \"加載 Subagent 失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"geminiHint\": \"Gemini 需在 settings.json 中開啟 experimental.enableSubagents 後生效\",\n \"codexHint\": \"已轉換為 TOML 並寫入 ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"暫不支持文件同步\"\n },\n \"confirm\": {\n \"deleteTitle\": \"刪除 Subagent\",\n \"deleteMessage\": \"確定刪除 Subagent \\\"{{name}}\\\"?已同步的文件將被清理。\"\n },\n \"form\": {\n \"name\": \"名稱\",\n \"description\": \"描述\",\n \"content\": \"定義(Markdown + YAML frontmatter)\",\n \"syncTargets\": \"同步到\",\n \"geminiNote\": \"Gemini 需在 settings.json 開啟 experimental.enableSubagents\",\n \"codexNote\": \"Codex 將自動把 Markdown 轉為 TOML 寫入 ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"測試模型\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"降級\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"斷路\",\n \"consecutiveFailures\": \"連續失敗 {{count}} 次\",\n \"title\": \"配置狀態\",\n \"allClear\": \"所有項目 AI 配置狀態正常。\",\n \"scan\": \"重複檢測\",\n \"subtitle\": \"檢測同名項目與重複路徑,識別可能的冗餘添加\",\n \"noDuplicates\": \"未發現重複項目\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"需關注\",\n \"alert\": \"異常\",\n \"unconfigured\": \"尚未配置\",\n \"unmanaged\": \"未納管\",\n \"unscanned\": \"未掃描\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 處配置與預期不一致\",\n \"unscanned\": \"尚未完成 AI 配置狀態掃描\",\n \"unmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"unconfigured\": \"尚未透過 OpenSunstar 關聯任何 AI 資產\",\n \"gaps\": \"待補齊:{{items}}\",\n \"detectedOnly\": \"{{items}} — 發現配置文件但未納入管理\",\n \"globalOnly\": \"{{items}} — 使用全局預設配置\",\n \"noMcp\": \"未關聯 MCP 伺服器\",\n \"noSkills\": \"未配置 Skills\",\n \"noPrompts\": \"未關聯 Prompts\"\n },\n \"action\": {\n \"repair\": \"修復漂移\",\n \"inspectDetail\": \"查看詳情\",\n \"configure\": \"配置資產\",\n \"setup\": \"去配置\",\n \"adopt\": \"納入管理\",\n \"inspect\": \"查看項目\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} 故障轉移已啟用\",\n \"disabled\": \"{{app}} 故障轉移已關閉\",\n \"toggleFailed\": \"操作失敗:{{detail}}\",\n \"inQueue\": \"已加入\",\n \"addQueue\": \"加入\",\n \"priority\": {\n \"tooltip\": \"故障轉移優先順序 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} 故障轉移已啟用\\n按佇列優先順序(P1→P2→...)選擇供應商\",\n \"disabled\": \"啟用 {{app}} 故障轉移\\n將立即切換至佇列 P1,並在失敗時自動切換至下一個\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"服務位址\",\n \"addressCopied\": \"位址已複製\",\n \"currentProvider\": \"目前 Provider:\",\n \"waitingFirstRequest\": \"目前 Provider:等待首次請求...\",\n \"stoppedTitle\": \"路由服務已停止\",\n \"stoppedDescription\": \"使用上方開關即可啟動服務\",\n \"openSettings\": \"設定路由服務\",\n \"stats\": {\n \"activeConnections\": \"活躍連線\",\n \"totalRequests\": \"總請求數\",\n \"successRate\": \"成功率\",\n \"uptime\": \"運作時間\"\n }\n },\n \"settings\": {\n \"title\": \"路由服務設定\",\n \"description\": \"設定本地路由伺服器的監聽位址、連接埠和執行參數,儲存後立即生效。\",\n \"alert\": {\n \"autoApply\": \"儲存後將自動同步至正在執行的路由服務,無需手動重新啟動。\"\n },\n \"basic\": {\n \"title\": \"基礎設定\",\n \"description\": \"設定路由服務監聽的位址與連接埠。\"\n },\n \"advanced\": {\n \"title\": \"進階參數\",\n \"description\": \"控制請求的穩定性和日誌紀錄。\"\n },\n \"timeout\": {\n \"title\": \"逾時設定\",\n \"description\": \"設定串流和非串流請求的逾時時間。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"監聽位址\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"路由伺服器監聽的 IP 位址(推薦 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"監聽連接埠\",\n \"placeholder\": \"15721\",\n \"description\": \"路由伺服器監聽的連接埠號(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大重試次數\",\n \"placeholder\": \"3\",\n \"description\": \"請求失敗時的重試次數(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"請求逾時(秒)\",\n \"placeholder\": \"0(不限)或 300\",\n \"description\": \"單個請求的最大等待時間(0 表示不限制,或設定 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"啟用日誌紀錄\",\n \"description\": \"紀錄所有路由請求,便於排查問題\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"串流首位元組逾時(秒)\",\n \"description\": \"等待首個資料區塊的最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"串流閒置逾時(秒)\",\n \"description\": \"資料區塊之間的最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非串流逾時(秒)\",\n \"description\": \"非串流請求的總逾時時間\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"請輸入有效的 IP 位址\",\n \"portMin\": \"連接埠必須大於 1024\",\n \"portMax\": \"連接埠必須小於 65535\",\n \"retryMin\": \"重試次數不能為負\",\n \"retryMax\": \"重試次數不能超過 10\",\n \"timeoutNonNegative\": \"逾時時間不能為負數\",\n \"timeoutMax\": \"逾時時間最多 600 秒\",\n \"timeoutRange\": \"請輸入 0 或 10-600 之間的數值\",\n \"streamingTimeoutMin\": \"逾時時間至少 5 秒\",\n \"streamingTimeoutMax\": \"逾時時間最多 300 秒\"\n },\n \"actions\": {\n \"save\": \"儲存設定\"\n },\n \"toast\": {\n \"saved\": \"路由設定已儲存\",\n \"saveFailed\": \"儲存失敗:{{error}}\"\n },\n \"invalidPort\": \"連接埠無效,請輸入 1024-65535 之間的數字\",\n \"invalidAddress\": \"位址無效,請輸入 IPv4(如 127.0.0.1)、IPv6(如 ::1)或 localhost\",\n \"configSaved\": \"路由設定已儲存\",\n \"configSaveFailed\": \"儲存設定失敗\",\n \"restartRequired\": \"修改位址或連接埠後需要重新啟動路由服務才能生效\"\n },\n \"switchFailed\": \"切換失敗:{{error}}\",\n \"takeover\": {\n \"hint\": \"選擇要路由的應用程式,啟用後該應用程式的請求將透過本地路由轉發\",\n \"enabled\": \"{{app}} 路由已啟用\",\n \"disabled\": \"{{app}} 路由已關閉\",\n \"failed\": \"切換路由狀態失敗:{{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} 路由中 - {{address}}:{{port}}\\n切換該應用程式供應商為熱切換\",\n \"broken\": \"{{appLabel}} 路由中,但路由服務未執行\",\n \"inactive\": \"路由 {{appLabel}} 的請求,讓該應用程式請求走本地路由\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"需要先啟動路由服務才能設定故障轉移\",\n \"autoSwitch\": \"自動故障轉移\",\n \"autoSwitchDescription\": \"開啟後將立即切換至佇列 P1,並在請求失敗時自動切換至佇列中的下一個供應商\"\n },\n \"failoverQueue\": {\n \"title\": \"故障轉移佇列\",\n \"description\": \"管理各應用程式的供應商故障轉移順序\",\n \"info\": \"啟用自動故障轉移後,將按佇列優先順序選擇供應商(P1 優先)。當請求失敗時,系統會按佇列順序依次嘗試下一個供應商。\",\n \"selectProvider\": \"選擇供應商新增至佇列\",\n \"noAvailableProviders\": \"沒有可新增的供應商\",\n \"empty\": \"故障轉移佇列為空。新增供應商以啟用自動故障轉移。\",\n \"orderHint\": \"佇列順序與首頁供應商清單順序一致,可在首頁拖曳調整順序。\",\n \"dragHint\": \"拖曳供應商可調整故障轉移順序,序號越小優先順序越高。\",\n \"toggleEnabled\": \"啟用/停用\",\n \"addSuccess\": \"已新增至故障轉移佇列\",\n \"addFailed\": \"新增失敗\",\n \"removeSuccess\": \"已從故障轉移佇列移除\",\n \"removeFailed\": \"移除失敗\",\n \"reorderSuccess\": \"佇列順序已更新\",\n \"reorderFailed\": \"更新順序失敗\",\n \"toggleFailed\": \"狀態更新失敗\"\n },\n \"autoFailover\": {\n \"info\": \"當故障轉移佇列中設定了多個供應商時,系統會在請求失敗時按優先順序依次嘗試。當某個供應商連續失敗達到閾值時,斷路器會打開並在一段時間內跳過該供應商。\",\n \"configSaved\": \"自動故障轉移設定已儲存\",\n \"configSaveFailed\": \"儲存失敗\",\n \"validationFailed\": \"以下欄位超出有效範圍:{{fields}}\",\n \"retrySettings\": \"重試與逾時設定\",\n \"failureThreshold\": \"失敗閾值\",\n \"failureThresholdHint\": \"連續失敗多少次後打開斷路器(建議:3-10)\",\n \"timeout\": \"恢復等待時間(秒)\",\n \"timeoutHint\": \"斷路器打開後,等待多久後嘗試恢復(建議:30-120)\",\n \"circuitBreakerSettings\": \"斷路器設定\",\n \"successThreshold\": \"恢復成功閾值\",\n \"successThresholdHint\": \"半開狀態下成功多少次後關閉斷路器\",\n \"errorRate\": \"錯誤率閾值 (%)\",\n \"errorRateHint\": \"錯誤率超過此值時打開斷路器\",\n \"minRequests\": \"最小請求數\",\n \"minRequestsHint\": \"計算錯誤率前的最小請求數\",\n \"explanationTitle\": \"運作原理\",\n \"failureThresholdLabel\": \"失敗閾值\",\n \"failureThresholdExplain\": \"連續失敗達到此次數時,斷路器打開,該供應商暫時不可用\",\n \"timeoutLabel\": \"恢復等待時間\",\n \"timeoutExplain\": \"斷路器打開後,等待此時間後嘗試半開狀態\",\n \"successThresholdLabel\": \"恢復成功閾值\",\n \"successThresholdExplain\": \"半開狀態下,成功達到此次數時關閉斷路器,供應商恢復可用\",\n \"errorRateLabel\": \"錯誤率閾值\",\n \"errorRateExplain\": \"錯誤率超過此值時,即使未達到失敗閾值也會打開斷路器\",\n \"maxRetries\": \"最大重試次數\",\n \"timeoutSettings\": \"逾時設定\",\n \"streamingFirstByte\": \"串流首位元組逾時\",\n \"streamingIdle\": \"串流閒置逾時\",\n \"nonStreaming\": \"非串流逾時\",\n \"maxRetriesHint\": \"請求失敗時的重試次數(0-10)\",\n \"streamingFirstByteHint\": \"等待首個資料區塊的最大時間,範圍 1-120 秒,預設 60 秒\",\n \"streamingIdleHint\": \"資料區塊之間的最大間隔,範圍 60-600 秒,填 0 停用(防止中途卡住)\",\n \"nonStreamingHint\": \"非串流請求的總逾時時間,範圍 60-1200 秒,預設 600 秒(10 分鐘)\"\n },\n \"logging\": {\n \"enabled\": \"日誌紀錄已啟用\",\n \"disabled\": \"日誌紀錄已關閉\",\n \"failed\": \"切換日誌狀態失敗\"\n },\n \"server\": {\n \"started\": \"路由服務已啟動 - {{address}}:{{port}}\",\n \"startFailed\": \"啟動路由服務失敗:{{detail}}\"\n },\n \"stoppedWithRestore\": \"路由服務已關閉,已還原所有路由設定\",\n \"stopWithRestoreFailed\": \"停止失敗:{{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"健康檢測設定已儲存\",\n \"configSaveFailed\": \"儲存失敗\",\n \"testModels\": \"測試模型\",\n \"claudeModel\": \"Claude 模型\",\n \"codexModel\": \"Codex 模型\",\n \"geminiModel\": \"Gemini 模型\",\n \"checkParams\": \"檢查參數\",\n \"timeout\": \"逾時時間(秒)\",\n \"maxRetries\": \"最大重試次數\",\n \"degradedThreshold\": \"降級閾值(毫秒)\",\n \"testPrompt\": \"檢查提示詞\",\n \"operational\": \"{{providerName}} 執行正常 ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} 回應較慢 ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} 檢查失敗:{{message}}\",\n \"rejected\": \"{{providerName}} 檢查被拒:{{message}}\",\n \"error\": \"{{providerName}} 檢查出錯:{{error}}\",\n \"modelNotFound\": \"{{providerName}} 測試模型 {{model}} 不存在或已下架\",\n \"modelNotFoundHint\": \"該模型可能已被供應商棄用。請在「模型測試設定」中更新預設測試模型。\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan 額度已用盡\",\n \"quotaExceededHint\": \"百度千帆回傳了 Coding Plan 超額錯誤。請等待 5 小時 / 每週 / 每月額度重新整理,或在千帆控制台切換方案。\",\n \"httpHint\": {\n \"400\": \"供應商拒絕了請求格式。健康檢測的探測格式可能與實際使用不同。\",\n \"401\": \"API Key 可能無效,或供應商使用 OAuth 等驗證方式。檢查失敗不代表實際不可用。\",\n \"402\": \"帳號配額或計費問題。\",\n \"403\": \"供應商拒絕了此請求。部分供應商會驗證用戶端身分,檢查失敗但實際使用可能正常。\",\n \"404\": \"API 位址不存在,請檢查 Base URL 和 API 路徑。\",\n \"429\": \"請求頻率過高,請稍後重試。\",\n \"5xx\": \"供應商內部錯誤,通常是臨時問題。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"路由總開關\",\n \"appTakeover\": \"路由啟用\",\n \"perAppConfig\": \"應用程式設定\",\n \"circuitBreaker\": \"斷路器設定\",\n \"circuitBreakerSettings\": \"斷路器設定\",\n \"failureThreshold\": \"失敗閾值\",\n \"successThreshold\": \"恢復閾值\",\n \"recoveryTimeout\": \"恢復等待時間\",\n \"errorRateThreshold\": \"錯誤率閾值\",\n \"minRequests\": \"最小請求數\",\n \"timeoutConfig\": \"逾時設定\",\n \"streamingFirstByte\": \"串流首位元組逾時\",\n \"streamingIdle\": \"串流閒置逾時\",\n \"nonStreaming\": \"非串流逾時\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾值\",\n \"successThreshold\": \"成功閾值\",\n \"timeoutSeconds\": \"逾時時間(秒)\",\n \"errorRateThreshold\": \"錯誤率閾值 (%)\",\n \"minRequests\": \"最小請求數\",\n \"validationFailed\": \"以下欄位超出有效範圍:{{fields}}\",\n \"configSaved\": \"斷路器設定已儲存\",\n \"saveFailed\": \"儲存失敗\",\n \"loading\": \"載入中...\",\n \"title\": \"斷路器設定\",\n \"description\": \"調整斷路器參數以控制故障檢測和恢復行為\",\n \"failureThresholdHint\": \"連續失敗多少次後打開斷路器\",\n \"timeoutSecondsHint\": \"斷路器打開後多久嘗試恢復(半開狀態)\",\n \"successThresholdHint\": \"半開狀態下成功多少次後關閉斷路器\",\n \"errorRateThresholdHint\": \"錯誤率超過此值時打開斷路器\",\n \"minRequestsHint\": \"計算錯誤率前的最小請求數\",\n \"saveConfig\": \"儲存設定\",\n \"instructionsTitle\": \"設定說明\",\n \"instructions\": {\n \"failureThreshold\": \"連續失敗達到此次數時,斷路器打開\",\n \"timeout\": \"斷路器打開後,等待此時間後嘗試半開\",\n \"successThreshold\": \"半開狀態下,成功達到此次數時關閉斷路器\",\n \"errorRate\": \"錯誤率超過此值時,斷路器打開\",\n \"minRequests\": \"只有請求數達到此值後才計算錯誤率\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"通用供應商已複製並同步\",\n \"duplicateError\": \"複製通用供應商失敗\",\n \"title\": \"通用供應商\",\n \"description\": \"通用供應商可以同時管理 Claude、Codex 和 Gemini 的設定。修改後會自動同步至所有啟用的應用程式。\",\n \"add\": \"新增通用供應商\",\n \"edit\": \"編輯通用供應商\",\n \"empty\": \"還沒有通用供應商\",\n \"emptyHint\": \"點擊下方「新增通用供應商」按鈕建立一個\",\n \"selectPreset\": \"選擇預設類型\",\n \"name\": \"名稱\",\n \"namePlaceholder\": \"例如:我的 NewAPI\",\n \"baseUrl\": \"API 位址\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"官網位址\",\n \"websiteUrlPlaceholder\": \"https://example.com(選填,用於在清單中顯示)\",\n \"notes\": \"備註\",\n \"notesPlaceholder\": \"選填:加入備註資訊\",\n \"enabledApps\": \"啟用的應用程式\",\n \"modelConfig\": \"模型設定\",\n \"model\": \"模型\",\n \"sync\": \"同步至應用程式\",\n \"synced\": \"已同步至所有應用程式\",\n \"syncError\": \"同步失敗\",\n \"noAppsEnabled\": \"未啟用任何應用程式\",\n \"added\": \"通用供應商已新增\",\n \"addedAndSynced\": \"通用供應商已新增並同步\",\n \"updated\": \"通用供應商已更新\",\n \"deleted\": \"通用供應商已刪除\",\n \"addSuccess\": \"通用供應商新增成功\",\n \"addFailed\": \"通用供應商新增失敗\",\n \"hint\": \"跨應用程式通用設定,自動同步至 Claude/Codex/Gemini\",\n \"manage\": \"管理\",\n \"loadError\": \"載入通用供應商失敗\",\n \"saveError\": \"儲存通用供應商失敗\",\n \"deleteError\": \"刪除通用供應商失敗\",\n \"deleteConfirmTitle\": \"刪除通用供應商\",\n \"deleteConfirmDescription\": \"確定要刪除 \\\"{{name}}\\\" 嗎?這將同時刪除它在各應用程式中產生的供應商設定。\",\n \"syncConfirmTitle\": \"同步通用供應商\",\n \"syncConfirmDescription\": \"同步 \\\"{{name}}\\\" 將會覆寫 Claude、Codex 和 Gemini 中關聯的供應商設定。確定要繼續嗎?\",\n \"syncConfirm\": \"同步\",\n \"saveAndSync\": \"儲存並同步\",\n \"savedAndSynced\": \"已儲存並同步至所有應用程式\",\n \"saveAndSyncError\": \"儲存並同步失敗\",\n \"configJsonPreview\": \"設定 JSON 預覽\",\n \"configJsonPreviewHint\": \"以下是將要同步至各應用程式的設定內容(僅覆寫顯示的欄位,保留其他自訂設定)\"\n },\n \"omo\": {\n \"editProfile\": \"編輯 OMO 設定\",\n \"newProfile\": \"新增 OMO 設定\",\n \"profileName\": \"名稱\",\n \"mainAgents\": \"主 Agent\",\n \"subAgents\": \"子 Agent\",\n \"categories\": \"分類\",\n \"customAgents\": \"自訂 Agent\",\n \"noCustomAgents\": \"暫無自訂 Agent\",\n \"otherFields\": \"其他設定\",\n \"globalConfig\": \"OMO 全域設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"全域設定已儲存\",\n \"addProfile\": \"新增 OMO 設定\",\n \"disabledItems\": \"停用項目設定\",\n \"advanced\": \"進階設定\",\n \"profileCreated\": \"OMO 設定已建立\",\n \"profileUpdated\": \"OMO 設定已更新\",\n \"invalidJson\": \"其他欄位包含無效 JSON\",\n \"confirmDelete\": \"刪除設定\",\n \"confirmDeleteMsg\": \"確定刪除 \\\"{{name}}\\\" 嗎?\",\n \"profileDeleted\": \"設定已刪除\",\n \"imported\": \"已匯入為 \\\"{{name}}\\\"\",\n \"import\": \"匯入\",\n \"global\": \"全域\",\n \"empty\": \"暫無設定。點擊 + 新增或從本地匯入。\",\n \"applied\": \"已套用\",\n \"apply\": \"套用\",\n \"enable\": \"啟用\",\n \"enabled\": \"啟用中\",\n \"disabled\": \"OMO 已停用\",\n \"disableFailed\": \"停用 OMO 失敗:{{error}}\",\n \"selectPlaceholder\": \"請選擇...\",\n \"clear\": \"清空\",\n \"clearWrapped\": \"(清空)\",\n \"defaultWrapped\": \"(預設)\",\n \"variantPlaceholder\": \"思考等級\",\n \"selectEnabledModel\": \"選擇已設定模型\",\n \"selectModel\": \"選擇已設定模型\",\n \"recommendedHint\": \"推薦:{{model}}\",\n \"searchModel\": \"搜尋模型...\",\n \"selectModelFirst\": \"先選擇模型\",\n \"noEnabledModels\": \"暫無已設定模型\",\n \"noVariantsForModel\": \"該模型無思考等級\",\n \"currentValueNotEnabled\": \"{{value}}(目前值,未設定)\",\n \"currentValueUnavailable\": \"{{value}}(目前值,不可用)\",\n \"advancedLabel\": \"進階參數\",\n \"advancedJsonInvalid\": \"進階參數 JSON 無效\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用預設值\",\n \"noEnabledModelsWarning\": \"目前沒有可用的已設定模型,請先設定 OpenCode 模型\",\n \"modelSourcePartialWarning\": \"部分供應商模型設定無效,已自動跳過。\",\n \"modelSourceFallbackWarning\": \"讀取 live 供應商狀態失敗,已回退至已設定供應商清單。\",\n \"importLocalReplaceSuccess\": \"已從本地檔案匯入並覆寫 Agent/Category/Other Fields\",\n \"importLocalFailed\": \"讀取本地檔案失敗:{{error}}\",\n \"agentKeyPlaceholder\": \"agent 鍵名\",\n \"categoryKeyPlaceholder\": \"分類鍵名\",\n \"modelNamePlaceholder\": \"模型名\",\n \"custom\": \"自訂\",\n \"customCategories\": \"自訂分類\",\n \"modelConfiguration\": \"模型設定\",\n \"fillRecommended\": \"填入推薦\",\n \"fillRecommendedSuccess\": \"已填入 {{count}} 個推薦模型\",\n \"fillRecommendedPartial\": \"已填入 {{filled}} 個推薦模型,{{unmatched}} 個未比對成功\",\n \"fillRecommendedMostlyUnmatched\": \"僅填入 {{filled}} 個,{{unmatched}} 個未比對成功(如 {{examples}})。請設定提供這些模型的供應商,或手動選擇替代項。\",\n \"fillRecommendedAllSet\": \"所有槽位已有模型設定\",\n \"fillRecommendedNoMatch\": \"推薦模型在已設定的供應商中未找到相符項目(如 {{examples}})\",\n \"configSummary\": \"已設定 {{agents}} 個 Agent,{{categories}} 個 Category · 點擊 ⚙ 展開進階參數\",\n \"enabledModelsCount\": \"可選已設定模型 {{count}} 個\",\n \"source\": \"來源:\",\n \"otherFieldsJson\": \"其他欄位 (JSON)\",\n \"slimOtherFieldsHint\": \"OMO Slim 的 council、fallback、multiplexer、disabled_mcps、todoContinuation 等頂層設定請寫在這裡。\",\n \"searchOrType\": \"搜尋或輸入自訂值...\",\n \"noMatches\": \"無相符項目\",\n \"jsonMustBeObject\": \"{{field}} 必須是 JSON 物件\",\n \"jsonInvalid\": \"{{field}} 包含無效 JSON\",\n \"importGlobalSuccess\": \"已從本地檔案匯入全域設定(未儲存)\",\n \"importGlobalFailed\": \"讀取本地檔案失敗:{{error}}\",\n \"importLocal\": \"從本地匯入\",\n \"saveGlobalConfig\": \"儲存全域設定\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"還原預設\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"停用的 Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"停用的 MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"停用的 Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"停用的 Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"實驗性功能\",\n \"advancedBackgroundTask\": \"背景任務\",\n \"advancedBrowserAutomation\": \"瀏覽器自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"主協調器\",\n \"hephaestus\": \"自主深度工作者\",\n \"prometheus\": \"戰略規劃者\",\n \"atlas\": \"任務管理者\",\n \"oracle\": \"戰略顧問\",\n \"librarian\": \"多儲存庫研究員\",\n \"explore\": \"快速程式碼搜尋\",\n \"multimodalLooker\": \"媒體分析器\",\n \"metis\": \"規劃前分析顧問\",\n \"momus\": \"計畫審查者\",\n \"sisyphusJunior\": \"委派任務執行器\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"主協調器,負責任務規劃、委派與並行執行,使用擴充思考(32k 預算),透過 TODO 驅動工作流程確保任務完成。\",\n \"atlas\": \"主協調器(持有 TODO 清單),負責執行階段的任務分發與協調,不直接完成所有工作而是委派給專業代理。\",\n \"prometheus\": \"戰略規劃師,透過訪談模式收集需求並制定詳細工作計畫,僅能在 .sisyphus/ 目錄讀寫 Markdown 檔案,從不直接寫程式碼。\",\n \"hephaestus\": \"自主深度工作者(「合法工匠」),受 AmpCode 深度模式啟發,目標導向執行,行動前會並行啟動 2-5 個探索 / 圖書管理員代理進行研究。\",\n \"oracle\": \"架構決策與除錯顧問,唯讀諮詢代理,提供出色的邏輯推理和深度分析,不能寫檔案或委派任務。\",\n \"librarian\": \"多儲存庫分析與文件檢索專家,深度理解程式碼庫並提供基於證據的答案,擅長尋找官方文件和開源實作範例。\",\n \"explore\": \"快速程式碼庫探索與上下文 grep 專家,使用輕量級模型進行高速搜尋,是理解程式碼結構的先鋒。\",\n \"multimodalLooker\": \"視覺內容專家,分析 PDF、圖片、圖表等非文字媒體,提取其中的資訊與洞見。\",\n \"metis\": \"計畫顧問,在規劃前進行預先分析,識別隱藏意圖、模糊點和 AI 失敗點,防止過度工程化。\",\n \"momus\": \"計畫審查員,高精度驗證計畫的清晰度、可驗證性和完整性,拒絕並要求修訂直到計畫完美。\",\n \"sisyphusJunior\": \"類別產生的執行器,由 category 參數自動產生,專注於執行分配的任務且不能再委派,防止無限委派迴圈。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"視覺 / 前端工程\",\n \"ultrabrain\": \"超級思考\",\n \"deep\": \"深度工作\",\n \"artistry\": \"創意 / 文藝\",\n \"quick\": \"快速回應\",\n \"unspecifiedLow\": \"通用低階\",\n \"unspecifiedHigh\": \"通用高階\",\n \"writing\": \"寫作\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"前端與視覺工程類別,專注於 UI/UX 設計、樣式、動畫和介面實作,預設使用 Gemini 3.5 Flash 模型。\",\n \"ultrabrain\": \"深度邏輯推理類別,用於需要廣泛分析的複雜架構決策,預設使用 GPT-5.3 Codex 的超高推理變體。\",\n \"deep\": \"深度自主問題解決類別,目標導向執行,行動前進行徹底研究,適用於需要深度理解的棘手問題。\",\n \"artistry\": \"高度創意與藝術性任務類別,激發新穎想法和創造性解決方案,預設使用 Gemini 3.5 Flash 的高推理變體。\",\n \"quick\": \"輕量任務類別,用於單檔案修改、錯別字修復、簡單調整等瑣碎工作,預設使用 Claude Haiku 4.5 快速模型。\",\n \"unspecifiedLow\": \"未分類低工作量任務類別,適用於不適合其他類別且工作量較小的任務,預設使用 Claude Sonnet 4.5。\",\n \"unspecifiedHigh\": \"未分類高工作量任務類別,適用於不適合其他類別且工作量較大的任務,預設使用 Claude Opus 4.8 的最大變體。\",\n \"writing\": \"寫作類別,專注於文件、散文和技術寫作,預設使用 Kimi K2.5 模型。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"協調器\",\n \"oracle\": \"神諭者\",\n \"librarian\": \"圖書管理員\",\n \"explorer\": \"探索者\",\n \"designer\": \"設計師\",\n \"fixer\": \"修復者\",\n \"council\": \"議會\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"編寫執行程式碼,協調多代理工作流程,召喚專家\",\n \"oracle\": \"根本原因分析、架構審查、除錯指導(唯讀)\",\n \"librarian\": \"文件查詢、GitHub 程式碼搜尋(唯讀)\",\n \"explorer\": \"正規搜尋、AST 模式比對、檔案發現(唯讀)\",\n \"designer\": \"現代響應式設計、CSS / Tailwind 精通\",\n \"fixer\": \"程式碼實作、重構、測試、驗證\",\n \"council\": \"多模型共識代理,並行執行多個唯讀 councillor,再由 master 彙整最終答案。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"預設模型\",\n \"description\": \"設定 OpenClaw 的預設主模型和備用模型\",\n \"primary\": \"主模型\",\n \"primaryPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"fallbacks\": \"備用模型\",\n \"fallbacksPlaceholder\": \"例如: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"新增備用模型\",\n \"saved\": \"預設模型設定已儲存\",\n \"saveFailed\": \"儲存預設模型失敗\"\n },\n \"modelCatalog\": {\n \"title\": \"模型目錄\",\n \"description\": \"設定可用模型的別名和允許清單\",\n \"modelId\": \"模型 ID\",\n \"modelIdPlaceholder\": \"例如: deepseek/deepseek-chat\",\n \"alias\": \"別名\",\n \"aliasPlaceholder\": \"例如: DeepSeek\",\n \"addEntry\": \"新增模型\",\n \"removeEntry\": \"移除\",\n \"saved\": \"模型目錄已儲存\",\n \"saveFailed\": \"儲存模型目錄失敗\",\n \"empty\": \"暫無模型目錄設定\",\n \"emptyHint\": \"新增模型至目錄以設定別名\"\n },\n \"suggestedDefaults\": \"套用建議預設設定\",\n \"suggestedDefaultsHint\": \"使用此預設推薦的預設模型設定\"\n },\n \"subscription\": {\n \"title\": \"訂閱額度\",\n \"fiveHour\": \"5 小時\",\n \"sevenDay\": \"7 天\",\n \"sevenDayOpus\": \"7 天 (Opus)\",\n \"sevenDaySonnet\": \"7 天 (Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"每週\",\n \"copilotPremium\": \"進階請求\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}} 後重設\",\n \"extraUsage\": \"超額用量\",\n \"expired\": \"工作階段已過期\",\n \"expiredHint\": \"請執行 {{tool}} 命令重新整理登入\",\n \"queryFailed\": \"查詢失敗\",\n \"refresh\": \"重新整理\"\n },\n \"methodology\": {\n \"sidebar\": \"工作流程編排\",\n \"title\": \"工作流程編排\",\n \"subtitle\": \"方法論、流程預設、自訂編排、設計合約——四個獨立配置維度,按需選用,無先後依賴。框架偵測為唯讀,不修改專案檔案。\",\n \"scanAll\": \"掃描所有專案\",\n \"scanAllNoProjects\": \"請先新增專案再掃描\",\n \"scanComplete\": \"框架探測完成\",\n \"scanCompleteWithCount\": \"已掃描 {{count}} 個專案\",\n \"tabMarket\": \"方法論辨識\",\n \"tabOrchestration\": \"工作流程設定\",\n \"notScanned\": \"未掃描\",\n \"verified\": \"已偵測到\",\n \"inferred\": \"可能使用\",\n \"absent\": \"未偵測到\",\n \"detectedInProjects\": \"{{detected}}/{{total}} 專案已偵測到\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} 專案可能使用\",\n \"absentInAll\": \"{{total}} 專案均未偵測到\",\n \"noneDetectedTitle\": \"未偵測到任何方法論框架\",\n \"noneDetectedGuidance\": \"推薦從 flow-kit(純 Markdown 模板體系)或 spec-kit(規格工具鏈)入手。review-only 預設適合已有程式碼審查流程的專案,無需安裝框架。\",\n \"scanPromptTitle\": \"尚未掃描專案中的方法論框架\",\n \"scanPromptBody\": \"點擊「掃描所有專案」進行唯讀偵測,或直接進入預設編排 / 自訂編排——無需先安裝或檢測框架。\",\n \"goToOrchestration\": \"去預設編排\",\n \"goToRecipe\": \"自訂編排\",\n \"recommendedPreset\": \"推薦檔位:{{preset}}\",\n \"recommendedFrameworks\": \"框架參考目錄\",\n \"recommendedFrameworksHint\": \"受支援的開源方法論一覽,供了解與選型參考(非安裝精靈)\",\n \"detectedFrameworks\": \"已檢測到的框架\",\n \"directOrchestrationTitle\": \"不依賴框架也可開始編排\",\n \"directOrchestrationHint\": \"預設編排與自訂編排可獨立使用,匯出 workflow.profile.json 或 Recipe 檔案。\",\n \"presetFull\": \"完整流程\",\n \"presetStandard\": \"標準流程\",\n \"presetMvp\": \"MVP 流程\",\n \"presetReviewOnly\": \"僅審查\",\n \"noDescriptors\": \"框架目錄為空。請確認資料庫已初始化。\",\n \"detectionMatrix\": \"偵測矩陣\",\n \"detectionMatrixHint\": \"專案 × 框架偵測結果(✓ 已偵測到 / ? 可能使用 / ✗ 未偵測到 / — 未掃描)\",\n \"matrixFramework\": \"框架 \\\\ 專案\",\n \"orchestrationEntry\": \"預設編排器\",\n \"orchestrationHint\": \"獨立維度:選擇一個專案,設定流程檔位、模組和階段,匯出 workflow.profile.json 或 flow-config.yaml。無需先完成方法論框架掃描。\",\n \"orchestrationNoProjects\": \"暫無專案。請先在工作區新增專案,再進行流程編排設定。\",\n \"orchestrationSelectProject\": \"選擇專案\",\n \"orchestrationChooseProject\": \"— 請選擇專案 —\",\n \"orchestrationPickProjectHint\": \"請在上方下拉框選擇一個專案,開始設定 SDD 流程編排。\",\n \"tabRecipe\": \"變更執行方案\",\n \"recipeEntry\": \"變更執行方案\",\n \"recipeHint\": \"獨立維度:視覺化階段圖 + 自由組合階段與模組,匯出 YAML+Markdown 混合格式 Recipe 檔案。可獨立使用,無需先設定其他維度。\",\n \"recipeNoProjects\": \"暫無專案。請先在工作區新增專案。\",\n \"recipeSelectProject\": \"選擇專案\",\n \"recipePickPlaceholder\": \"— 選擇專案 —\",\n \"recipePickProjectHint\": \"請在上方下拉框選擇一個專案,開始編排 Recipe。\",\n \"tabDesignContract\": \"設計合約\",\n \"designContractEntry\": \"設計合約設定器\",\n \"designContractHint\": \"獨立維度:選擇品牌範本或自訂配色,產生 DESIGN.md + DTCG tokens。與 SDD 方法論無關,任何有前端/UI 的專案均可獨立使用。\",\n \"designContractNoProjects\": \"暫無專案。請先在工作區新增專案。\",\n \"designContractSelectProject\": \"選擇專案\",\n \"designContractPickPlaceholder\": \"— 選擇專案 —\",\n \"designContractPickProjectHint\": \"請在上方下拉框選擇一個專案,開始設定設計合約。\",\n \"tabRulesContext\": \"規則與上下文\",\n \"rulesContextPickProjectHint\": \"請在上方下拉框選擇一個專案,查看關聯的規則片段與上下文檔案。\"\n },\n \"rulesContext\": {\n \"title\": \"專案規則\",\n \"hint\": \"已關聯到當前專案的規則片段。帶 Glob 的規則僅在符合檔案存在時生效。\",\n \"empty\": \"暫無已關聯的規則。在 Agent 設定 > Prompts 中建立規則片段,然後在專案詳情中關聯。\",\n \"fragment\": \"片段\",\n \"allTargets\": \"所有工具\",\n \"universal\": \"全域\",\n \"contextFiles\": \"上下文檔案\",\n \"contextFilesHint\": \"專案同步時為各 AI 工具產生的上下文檔案。僅關聯了 Prompt 的工具會產生檔案。\",\n \"willSync\": \"將同步\",\n \"managed\": \"已託管\",\n \"userCreated\": \"使用者自建\",\n \"pendingSync\": \"待同步\",\n \"notLinked\": \"未關聯\"\n },\n \"recipeComposer\": {\n \"title\": \"變更執行方案\",\n \"hybrid\": \"YAML+Markdown 混合格式\",\n \"loading\": \"載入編排器中...\",\n \"preset\": \"流程檔位\",\n \"projectType\": \"專案類型\",\n \"projectTypeBackend\": \"後端\",\n \"projectTypeFrontend\": \"前端\",\n \"projectTypeCli\": \"命令列\",\n \"recipeName\": \"Recipe 名稱\",\n \"recipeNamePlaceholder\": \"我的 Recipe\",\n \"description\": \"描述\",\n \"descriptionPlaceholder\": \"基於標準流程編排的 Recipe\",\n \"stageGraph\": \"階段圖\",\n \"nodesCount\": \"{{count}} 個節點\",\n \"modules\": \"模組\",\n \"stages\": \"階段\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 已啟用\",\n \"notes\": \"備註(選填)\",\n \"notesPlaceholder\": \"為該 Recipe 新增自訂備註...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"如 feat-auth、fix-login-bug\",\n \"preview\": \"預覽\",\n \"copy\": \"複製\",\n \"export\": \"匯出 Recipe\",\n \"install\": \"安裝到專案\",\n \"installedSummary\": \"已安裝:建立 {{created}} 個檔案\",\n \"installedSkipped\": \",跳過 {{skipped}} 個已存在檔案\",\n \"exists\": \"(已存在)\",\n \"previewTitle\": \"預覽(YAML+Markdown 混合格式)\",\n \"collapse\": \"收合\",\n \"savedRecipes\": \"已儲存的 Recipe\",\n \"fitWidth\": \"符合寬度\",\n \"actualSize\": \"實際大小\",\n \"lateral\": \"橫向(跨領域)\",\n \"legendStandalone\": \"獨立\",\n \"legendSemi\": \"半獨立\",\n \"legendBranch\": \"分支\",\n \"legendNoArtifacts\": \"無產物\",\n \"toastExported\": \"Recipe「{{name}}」已匯出到 .opensunstar/recipe/\",\n \"toastCopied\": \"Recipe 內容已複製到剪貼簿\",\n \"toastCopyFailed\": \"複製失敗\",\n \"toastChangeIdRequired\": \"請填寫 Change ID(如 feat-auth)\",\n \"toastInstalled\": \"Recipe 已安裝到專案:建立 {{created}} 個檔案\",\n \"toastDeleted\": \"Recipe「{{name}}」已刪除\"\n },\n \"designContract\": {\n \"title\": \"設計合約\",\n \"name\": \"合約名稱\",\n \"description\": \"描述\",\n \"templates\": \"範本\",\n \"tokens\": \"令牌\",\n \"preview\": \"預覽\",\n \"import\": \"匯入\",\n \"colors\": \"顏色\",\n \"typography\": \"字體\",\n \"spacing\": \"間距基數 (px)\",\n \"copy\": \"複製\",\n \"copied\": \"已複製到剪貼簿\",\n \"exported\": \"已匯出\",\n \"installed\": \"已安裝\",\n \"loadingTemplate\": \"載入範本中...\",\n \"noPreview\": \"點擊預覽產生 DESIGN.md\",\n \"importFile\": \"從檔案匯入\",\n \"pickFile\": \"選擇 DESIGN.md 檔案...\",\n \"importUrl\": \"從 URL 匯入\",\n \"previewBtn\": \"預覽\",\n \"copyBtn\": \"複製\",\n \"exportBtn\": \"匯出\",\n \"installBtn\": \"安裝到專案\",\n \"installResult\": \"已安裝\",\n \"filesCreated\": \"個檔案已建立\",\n \"filesSkipped\": \"已跳過\",\n \"exists\": \"已存在\"\n },\n \"installConfirm\": {\n \"title\": \"確認安裝到專案\",\n \"auditScan\": \"安全審計掃描\",\n \"filesScanned\": \"檔案已掃描\",\n \"noFindings\": \"未發現安全問題。\",\n \"auditBlocked\": \"安全審計發現 CRITICAL 級別問題,安裝已被阻斷。請修復後重試。\",\n \"fileList\": \"檔案清單\",\n \"toCreate\": \"將建立\",\n \"toSkip\": \"已存在跳過\",\n \"create\": \"建立\",\n \"skip\": \"跳過\",\n \"existing\": \"現有內容\",\n \"wouldOverwrite\": \"將覆蓋為 (當前跳過)\",\n \"newContent\": \"新內容\",\n \"cancel\": \"取消\",\n \"confirmInstall\": \"確認安裝\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同步備份\",\n \"kanban\": \"項目AI看板\",\n \"tokenStats\": \"AI Tokens\",\n \"agentConfig\": \"Agent 配置\",\n \"projectConfig\": \"專案配置\",\n \"planning\": \"規劃中\",\n \"section\": {\n \"projects\": \"項目\",\n \"myProjects\": \"我的專案\",\n \"monitor\": \"運行監控\",\n \"aiModels\": \"AI模型\",\n \"cloudSync\": \"跨設備雲同步\",\n \"teamCollab\": \"團隊協作配置\",\n \"syncCollab\": \"同步與協作\"\n }\n },\n \"sync\": {\n \"waiting\": \"等待變更\",\n \"syncing\": \"同步中...\",\n \"synced\": \"已同步\",\n \"failed\": \"同步失敗\",\n \"disabled\": \"未啟用\",\n \"justNow\": \"剛剛\",\n \"minutesAgo\": \"{{count}}分鐘前\",\n \"hoursAgo\": \"{{count}}小時前\",\n \"daysAgo\": \"{{count}}天前\"\n },\n \"dryRun\": {\n \"title\": \"預覽模式(Dry Run)\",\n \"description\": \"開啟後,Prompt 激活等寫入操作將先顯示 Diff 預覽,確認後才實際寫入\",\n \"settingsTitle\": \"預覽模式(Dry Run)\",\n \"settingsDescription\": \"寫入前預覽 Diff,確認後再應用到磁盤\",\n \"confirmWrite\": \"確認寫入\",\n \"promptActivationTitle\": \"Prompt 激活預覽\",\n \"promptActivationDesc\": \"預覽模式已開啟,確認後將寫入目標文件\",\n \"current\": \"當前文件\",\n \"after\": \"激活後\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"命令\",\n \"empty\": \"暫無自定義命令\",\n \"add\": \"添加命令\",\n \"edit\": \"編輯命令\",\n \"count\": \"共 {{count}} 個命令\",\n \"loadFailed\": \"加載命令失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"confirm\": {\n \"deleteTitle\": \"刪除命令\",\n \"deleteMessage\": \"確定刪除命令 \\\"{{name}}\\\"?已同步的文件將被清理。\"\n },\n \"form\": {\n \"name\": \"命令名稱\",\n \"description\": \"描述\",\n \"content\": \"命令內容(Markdown)\",\n \"arguments\": \"參數定義(JSON)\",\n \"syncTargets\": \"同步到\"\n },\n \"variableHelp\": {\n \"title\": \"模板變量\",\n \"arguments\": \"Claude Code / Gemini 用戶輸入參數佔位符\",\n \"codexNote\": \"Codex 不支持獨立命令文件,勾選後不會寫入磁盤。\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"暫無生命週期鉤子\",\n \"add\": \"添加鉤子\",\n \"edit\": \"編輯鉤子\",\n \"count\": \"共 {{count}} 個鉤子\",\n \"loadFailed\": \"加載鉤子失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"syncSuccess\": \"已同步到 Claude Code\",\n \"syncFailed\": \"同步失敗\",\n \"syncNow\": \"同步到 Claude\",\n \"claudeOnlyNote\": \"當前僅支持同步到 Claude Code(settings.json hooks 字段)\",\n \"timeoutLabel\": \"超時 {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"刪除鉤子\",\n \"deleteMessage\": \"確定刪除此鉤子?settings.json 將同步更新。\"\n },\n \"form\": {\n \"eventType\": \"事件類型\",\n \"toolPattern\": \"工具匹配(glob)\",\n \"hookCommand\": \"Shell 命令\",\n \"timeout\": \"超時(秒,1-300)\",\n \"description\": \"描述\"\n },\n \"eventType\": {\n \"PreToolUse\": \"工具調用前\",\n \"PostToolUse\": \"工具調用後\",\n \"Notification\": \"通知\",\n \"Stop\": \"停止\"\n }\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"在 Claude / Codex / Gemini 等工具間遷移 Prompt、MCP、Skill 與 Command 配置\",\n \"sourceApp\": \"源工具\",\n \"targetApp\": \"目標工具\",\n \"contentType\": \"配置類型\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"選擇目標工具\",\n \"notFound\": \"文件不存在\",\n \"loadFailed\": \"檢測源配置失敗\",\n \"previewing\": \"生成預覽…\",\n \"warnings\": \"轉換提示\",\n \"unmapped\": \"未映射章節: {{section}}\",\n \"sourcePreview\": \"源內容\",\n \"convertedPreview\": \"轉換後\",\n \"overwrite\": \"覆蓋已存在的目標文件(寫入前會自動備份 .bak.opensunstar)\",\n \"apply\": \"確認寫入\",\n \"applySuccess\": \"配置已寫入目標工具\",\n \"applyFailed\": \"寫入失敗\",\n \"steps\": {\n \"source\": \"選擇源\",\n \"previewSource\": \"預覽源\",\n \"previewTarget\": \"預覽轉換\",\n \"confirm\": \"確認寫入\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore\",\n \"empty\": \"暫無忽略規則\",\n \"emptyHint\": \"添加 glob 規則後,將同步到 .claudeignore、.codexignore 等文件\",\n \"add\": \"添加規則\",\n \"edit\": \"編輯忽略規則\",\n \"count\": \"共 {{count}} 條規則\",\n \"loadFailed\": \"加載忽略規則失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"toggleFailed\": \"切換同步目標失敗\",\n \"importGitignore\": \"從 .gitignore 導入\",\n \"importSuccess\": \"已導入 {{count}} 條規則\",\n \"importFailed\": \"導入失敗\",\n \"syncNow\": \"同步到工具\",\n \"syncSuccess\": \"已同步到各工具 ignore 文件\",\n \"syncFailed\": \"同步失敗\",\n \"confirm\": {\n \"deleteTitle\": \"刪除規則\",\n \"deleteMessage\": \"確定刪除此忽略規則?相關 ignore 文件將同步更新。\"\n },\n \"form\": {\n \"pattern\": \"Glob 模式\",\n \"description\": \"描述\",\n \"syncTargets\": \"同步到\"\n }\n },\n \"permissions\": {\n \"title\": \"Permissions\",\n \"empty\": \"暫無工具權限規則\",\n \"emptyHint\": \"管理 Claude Code 的 allow/deny 工具列表,可與 Hooks 共存於 settings.json\",\n \"add\": \"添加權限\",\n \"edit\": \"編輯權限\",\n \"count\": \"共 {{count}} 條權限\",\n \"loadFailed\": \"加載權限失敗\",\n \"saveSuccess\": \"保存成功\",\n \"saveFailed\": \"保存失敗\",\n \"deleteSuccess\": \"刪除成功\",\n \"deleteFailed\": \"刪除失敗\",\n \"syncNow\": \"同步到 Claude\",\n \"syncSuccess\": \"已同步到 Claude settings.json\",\n \"syncFailed\": \"同步失敗\",\n \"presets\": \"預設模板:\",\n \"presetApplied\": \"預設已應用\",\n \"presetFailed\": \"應用預設失敗\",\n \"claudeOnlyNote\": \"當前僅同步到 Claude Code settings.json permissions 字段\",\n \"confirm\": {\n \"deleteTitle\": \"刪除權限\",\n \"deleteMessage\": \"確定刪除此權限規則?settings.json 將同步更新。\"\n },\n \"form\": {\n \"type\": \"權限類型\",\n \"toolPattern\": \"工具匹配\",\n \"description\": \"描述\"\n },\n \"type\": {\n \"allowedTools\": \"允許\",\n \"deniedTools\": \"拒絕\",\n \"autoApprove\": \"自動批准\"\n }\n },\n \"simpleConnect\": {\n \"nav\": \"快速接入\",\n \"pageTitle\": \"快速接入\",\n \"tabSimple\": \"快速接入\",\n \"tabExpert\": \"高級 Provider\",\n \"title\": \"快速接入\",\n \"subtitle\": \"粘貼 API Key,三步即可在 CLI 中用起來\",\n \"step1\": \"供應商\",\n \"step2\": \"密鑰\",\n \"step3\": \"應用\",\n \"supplier\": \"供應商\",\n \"customSupplier\": \"自定義 OpenAI 兼容\",\n \"cliTool\": \"CLI 工具\",\n \"model\": \"模型\",\n \"modelPlaceholder\": \"先拉取模型列表\",\n \"fetchModels\": \"拉取模型列表\",\n \"apply\": \"應用配置\",\n \"applySuccess\": \"{{tool}} 配置已應用\",\n \"applySuccessMulti\": \"{{tools}} 配置已應用\",\n \"modelsLoaded\": \"已加載 {{count}} 個模型\",\n \"poolProxy\": \"本地代理 :{{port}} 已啟用\",\n \"keyRequired\": \"請先在 Keychain 中保存 API Key\",\n \"keyRequiredHint\": \"保存主 Key 後才能進入應用步驟\",\n \"customBaseRequired\": \"請先填寫自定義 API Base URL\",\n \"modelsFallback\": \"拉取失敗,已使用預設模型 {{model}}\",\n \"toolStatusTitle\": \"CLI 配置狀態\",\n \"toolStatusLoading\": \"讀取 CLI 狀態…\",\n \"toolCleared\": \"{{tool}} 已清除快速接入配置\",\n \"clearTool\": \"清除 {{tool}}\",\n \"wizardNav\": \"快速接入步驟\",\n \"summaryStep\": \"步驟 {{step}}/3\",\n \"step3Hint\": \"選擇 CLI 與模型後應用;詳情見下方摺疊面板\",\n \"step3Sections\": {\n \"statusSection\": \"CLI 配置狀態\",\n \"runtimeSection\": \"密鑰池運行態\",\n \"usageSection\": \"用量概覽(只讀)\"\n },\n \"supplierChangeTitle\": \"切換供應商?\",\n \"supplierChangeBody\": \"切換後將使用新的 upstream;已保存的 Key 仍對應原供應商命名空間。應用配置時會自動備份並重寫 CLI。\",\n \"supplierChangeConfirm\": \"繼續切換\",\n \"supplierChangedApply\": \"已切換供應商並寫入 CLI;原配置已備份\",\n \"pickSupplier\": \"選擇供應商\",\n \"pickCli\": \"選擇要配置的 CLI\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"任意 OpenAI-compatible Base URL\",\n \"openWebsite\": \"官網\",\n \"keySaved\": \"Key 已保存\",\n \"keyMissing\": \"未保存 Key\",\n \"poolBadge\": \"密鑰池 ×{{count}}\",\n \"keySavedToast\": \"API Key 已安全存入 Keychain\",\n \"keyReadyHint\": \"主 Key 已就緒,可進入下一步\",\n \"poolKeyAdded\": \"備用 Key 已添加\",\n \"applyTo\": \"應用到 {{tool}}\",\n \"modelsLoading\": \"正在拉取模型…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} 已配置\",\n \"backToSimple\": \"返回快速接入\",\n \"openProxySettings\": \"代理與故障隊列設置\",\n \"proxyRunning\": \"主代理運行中\",\n \"cliGeneric\": \"CLI 配置\",\n \"expertNoticeTitle\": \"Expert Provider(精簡保留)\",\n \"expertNoticeBody\": \"故障隊列、代理接管、Universal 等高級能力仍在此管理。默認推薦先用「快速接入」。\",\n \"pool\": {\n \"step2Hint\": \"輸入 API Key 並保存,CLI 將通過本地代理安全訪問\",\n \"enable\": \"開啟密鑰池\",\n \"enableHint\": \"多 Key 加權輪詢 + 429 階梯冷卻;CLI 始終寫 local token,真實 Key 僅存 Keychain\",\n \"securityNote\": \"密鑰僅寫入系統 Keychain,不會出現在配置文件或日誌中。CLI 通過本地代理 token 訪問。\",\n \"required\": \"必需\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"主 Key\",\n \"extra\": \"備用 Key\",\n \"extraKey\": \"添加備用 Key\",\n \"supplierHint\": \"Key 存儲於 Keychain:simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"密鑰池運行時\",\n \"running\": \"代理運行中\",\n \"stopped\": \"代理未啟動\",\n \"idleHint\": \"應用配置後將啟動本地代理,此處顯示 Key 成功/失敗與冷卻狀態\",\n \"available\": \"可用\",\n \"cooling\": \"冷卻中\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"用量概覽(只讀)\",\n \"input\": \"輸入\",\n \"output\": \"輸出\",\n \"sessions\": \"會話條數\",\n \"proxyPort\": \"代理 :{{port}}\",\n \"proxySession\": \"本次會話\",\n \"byTool\": \"按 CLI 拆分\",\n \"empty\": \"暫無本地會話用量數據\"\n },\n \"import\": {\n \"title\": \"確認導入 API Key\",\n \"description\": \"密鑰將寫入 Keychain,不會出現在配置文件中。導入前會校驗 Key 有效性。\",\n \"label\": \"標籤\",\n \"supplier\": \"供應商\",\n \"warning\": \"請確認鏈接來源可信。可在快速接入中禁用 URL 導入。\",\n \"confirm\": \"確認導入\",\n \"importing\": \"導入中…\",\n \"success\": \"已導入 {{count}} 個 Key 到 Keychain\",\n \"duplicates\": \"跳過 {{count}} 個重複 Key\",\n \"parseError\": \"導入鏈接解析失敗\"\n },\n \"advanced\": {\n \"title\": \"高級\",\n \"verifyKey\": \"保存前校驗 Key\",\n \"verifyKeyHint\": \"調用 /v1/models 驗證;關閉後僅高級用戶手動導入\",\n \"deeplinkImport\": \"允許 URL 導入 Key\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"備份目錄安全掃描\",\n \"files\": \"已掃描 {{count}} 個文件\",\n \"clean\": \"未發現明文 Key\",\n \"suspicious\": \"{{count}} 處可疑內容\",\n \"hint\": \"掃描 simple-connect/backups 下 CLI 配置備份,確保無 sk- 明文落盤。\"\n },\n \"privacy\": {\n \"bannerShort\": \"本地優先 · 密鑰存系統 Keychain · 無遙測\",\n \"viewDetails\": \"查看安全與隱私說明\",\n \"title\": \"安全與隱私說明\",\n \"intro\": \"快速接入遵循「數據留在本機、密鑰不進配置文件、網絡由你指定」的原則。以下為快速接入範圍內的處理方式。\",\n \"close\": \"知道了\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"本地優先\",\n \"body\": \"供應商選擇、模型緩存、CLI 配置狀態與用量統計等偏好均保存在本機應用數據目錄。寫入 CLI 前會自動備份原配置到本地 simple-connect/backups,可在 Step 2 高級區掃描備份是否含明文密鑰。\"\n },\n \"keychain\": {\n \"title\": \"憑據存系統 Keychain\",\n \"body\": \"API Key 僅寫入操作系統密鑰鏈(Windows DPAPI / macOS Keychain / Linux libsecret),不會出現在 JSON、TOML、環境變量或應用日誌中。CLI 側僅注入 sc-local-* 本地代理令牌;真實 Key 僅在本地代理進程內從 Keychain 讀取。\"\n },\n \"network\": {\n \"title\": \"網絡直連你選的供應商\",\n \"body\": \"模型拉取、Key 校驗(若開啟)與 upstream 請求均從本機直接發往你選擇的 API Base。本地代理(127.0.0.1:17172)僅在本機環回地址監聽,用於密鑰池與 CLI 統一入口,不對外網暴露。\"\n },\n \"noTelemetry\": {\n \"title\": \"無遙測、無賬號綁定\",\n \"body\": \"快速接入不會向 OpenSunstar 官方或第三方上報 API Key、對話內容、模型調用明細或設備指紋。用量面板數據來自本機 CLI 會話日誌與本地代理計數,僅供你在本機查看。\"\n },\n \"yourControl\": {\n \"title\": \"你可自行控制的風險項\",\n \"body\": \"URL 導入 Key 僅在確認鏈接來源可信時啟用,可在 Step 2 高級區關閉。選擇自定義供應商時,請自行評估第三方 Base URL 的可信度與隱私政策。\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"快速接入\",\n \"title\": \"快速接入\",\n \"subtitle\": \"三步完成接入:選供應商 → 填 Key → 一鍵啟用\",\n \"tabs\": {\n \"wizard\": \"快速接入\",\n \"manage\": \"管理供應商\"\n },\n \"openManage\": \"管理全部供應商\",\n \"openProxySettings\": \"代理與故障隊列設置\",\n \"searchPlaceholder\": \"搜索供應商名稱或網址…\",\n \"noResults\": \"未找到匹配的供應商\",\n \"official\": \"官方\",\n \"officialDesc\": \"官方帳號按客戶端登入。\",\n \"partner\": \"合作伙伴\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"粘貼你的 API Key\",\n \"keychainHint\": \"API Key 保存在本機安全憑據庫;接入時會更新本機設定。\",\n \"getKey\": \"獲取 API Key\",\n \"apply\": \"一鍵啟用\",\n \"success\": \"接入成功!已切換為當前供應商\",\n \"doneTitle\": \"接入成功!\",\n \"doneDesc\": \"供應商已配置完成並切換為當前生效。現在可以在 Claude Code 中直接使用了。\",\n \"doneDescApp\": \"{{app}} 已配置並切換為當前供應商。\",\n \"failedTitle\": \"接入未完成\",\n \"compensatedDesc\": \"操作失敗,系統已恢復到接入前狀態;可修正配置後重試。\",\n \"recoveryRequired\": \"自動恢復未完成,請點擊「繼續恢復」後再重試。\",\n \"operationId\": \"操作編號\",\n \"retry\": \"重試接入\",\n \"continueRecovery\": \"繼續恢復\",\n \"changeSelection\": \"修改配置\",\n \"rollback\": \"撤銷本次接入\",\n \"rollbackDone\": \"已恢復到接入前狀態\",\n \"rollbackFailed\": \"恢復失敗,請重試或前往代理設置檢查狀態\",\n \"proxyRunningHint\": \"Claude Code 的請求經本地代理(127.0.0.1:15721)轉發。請保持 OpenSunstar 運行,關閉應用後 Claude Code 將無法連接。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop 經本地代理轉發。請保持 OpenSunstar 運行,關閉應用後將無法連接。\",\n \"addAnother\": \"再接入一個\",\n \"openSettings\": \"前往供應商管理\",\n \"firstProviderHint\": \"檢測到這是你的第一個供應商,如需啟動代理請在設置中確認\",\n \"verify\": \"驗證 Key\",\n \"verifyOk\": \"Key 有效!\",\n \"verifyOkAnthropic\": \"Key 有效(該供應商不提供模型列表 API,將使用預設默認模型)\",\n \"verifyOkGemini\": \"Key 有效,Gemini 原生接口驗證通過\",\n \"verifyOkWithModels\": \"Key 有效,已獲取 {{count}} 個模型\",\n \"verifyOkNoModelList\": \"Key 有效(模型列表拉取失敗,將使用預設默認模型)\",\n \"verifyHint\": \"系統按目前協議驗證;Anthropic 約消耗 1 token,OpenAI/Gemini 取得模型列表後可用於進階映射\",\n \"modelsList\": \"可用模型({{count}})\",\n \"myProviders\": \"API Key 接入\",\n \"switch\": \"切換\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"category\": {\n \"custom\": \"自定義\",\n \"aiGlobal\": \"AI國際\",\n \"aiChina\": \"AI中國\",\n \"relay\": \"聚合/中轉\",\n \"customModel\": \"自定義模型配置\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini 快速接入目前啟用 Google 官方和 Gemini Native 相容端點;OpenAI Chat 網關會顯示協議不匹配提示。\"\n },\n \"custom\": {\n \"cardTitle\": \"自定義配置\",\n \"cardSubtitle\": \"自填 Base URL 與模型\",\n \"hint\": \"填寫名稱、Base URL 與默認模型;API 格式、認證字段和模型映射可在下方高級選項中調整。\",\n \"geminiHint\": \"填寫名稱、Gemini Native Base URL 與模型;Gemini CLI 原生協議會在進階選項中顯示。\",\n \"agentHint\": \"填寫名稱、Base URL 與默認模型;OpenSunstar 會按該客戶端的原生配置格式寫入本機設定。\",\n \"name\": \"供應商名稱\",\n \"namePlaceholder\": \"例如:我的 DeepSeek 網關\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"默認模型\",\n \"geminiModel\": \"模型 ID\",\n \"defaultName\": \"自定義供應商\"\n },\n \"apiKeyOnlyHint\": \"此客戶端透過 API Key 接入供應商;選擇預設或新增自定義閘道後即可啟用。\",\n \"advanced\": {\n \"title\": \"高級選項\",\n \"subtitle\": \"大多數場景保持默認即可\",\n \"upstreamModel\": \"上游模型\",\n \"defaultModel\": \"默認模型\",\n \"apiFormat\": \"API 格式\",\n \"authField\": \"認證字段\",\n \"roleMapping\": \"模型角色映射\",\n \"roleMappingHint\": \"顯示名稱用於 /model 選單;實際請求模型會寫入 Claude Code 環境變數。\",\n \"role\": \"角色\",\n \"displayName\": \"顯示名稱\",\n \"requestModel\": \"實際請求模型\",\n \"roleRequestModel\": \"{{role}} 實際請求模型\",\n \"hiddenFromModelMenu\": \"不顯示在 /model 選單\",\n \"fallbackModel\": \"預設兜底模型\",\n \"desktopRoutes\": \"Claude Desktop 路由映射\",\n \"customProtocolHint\": \"自定義配置按上游真實介面選擇協議。\",\n \"presetProtocolLocked\": \"供應商預設已按真實端點鎖定協議,避免誤選後連線失敗。\",\n \"geminiNativeLocked\": \"Gemini CLI 目前透傳原生 generateContent 協議;OpenAI Chat 端點需使用已實作協議轉換的客戶端入口。\"\n },\n \"badge\": {\n \"current\": \"當前\",\n \"proxy\": \"本地路由\"\n },\n \"warn\": {\n \"clearFailed\": \"清除舊快速接入標記失敗,若切換仍報錯請手動在設置中清除\",\n \"takeoverFailed\": \"供應商已添加,但代理接管開啟失敗。請在設置-本地路由中手動開啟對應應用接管\"\n },\n \"unavailableForApp\": \"當前客戶端協議暫未適配\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex 快速接入目前使用 OpenAI Responses / Chat 上游協議\",\n \"claudeOauthOnly\": \"此 OAuth 預設面向 Claude 客戶端\",\n \"geminiNativeOnly\": \"Gemini CLI 需要 Gemini Native 或 Gemini 相容網關\",\n \"geminiOpenRouter\": \"OpenRouter 提供 OpenAI Chat 上游,Gemini CLI 目前透傳 Gemini Native 協議\"\n },\n \"error\": {\n \"emptyKey\": \"請填寫 API Key\",\n \"failed\": \"接入失敗,請檢查 API Key 或網絡後重試\",\n \"compensated\": \"接入失敗,已自動恢復到操作前狀態\",\n \"recoveryRequired\": \"接入失敗且自動恢復未完成,請先執行恢復\",\n \"noBaseUrl\": \"請填寫 Base URL\",\n \"noModel\": \"請填寫默認模型\"\n },\n \"addProvider\": \"添加供應商\",\n \"addProviderHint\": \"選擇預設或添加相容端點。\",\n \"configureProvider\": \"配置供應商\",\n \"configureProviderHint\": \"只填必需資訊;連接和驗證會自動完成。\",\n \"connectAndEnable\": \"連接並啟用\",\n \"myProvidersHint\": \"API Key 保存在本機安全憑據庫;接入時會更新本機設定。\",\n \"officialConnection\": \"訂閱帳號\",\n \"officialConnectionHint\": \"按客戶端完成訂閱登入。\",\n \"workbenchSubtitle\": \"選擇客戶端,再用訂閱帳號或 API Key 接入。\",\n \"workbenchTitle\": \"模型接入\",\n \"subscription\": {\n \"loginStatus\": \"登入狀態\",\n \"accountManagement\": \"帳號管理\",\n \"claude\": {\n \"title\": \"Claude 訂閱登入\",\n \"description\": \"憑據由 Claude Code 管理;OpenSunstar 讀取狀態和額度。\",\n \"action\": \"Claude 訂閱登入\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop 登入\",\n \"description\": \"登入由 Claude Desktop 管理。\",\n \"action\": \"取得 Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT 訂閱登入\",\n \"description\": \"登入由 OpenSunstar 託管。\",\n \"action\": \"ChatGPT 訂閱登入\",\n \"dialogHint\": \"按裝置授權流程連接帳號。\"\n },\n \"gemini\": {\n \"title\": \"Gemini 帳號登入\",\n \"description\": \"憑據由 Gemini CLI 管理;OpenSunstar 讀取狀態和額度。\",\n \"action\": \"Gemini 登入指引\"\n },\n \"grokbuild\": {\n \"title\": \"Grok 訂閱登入\",\n \"description\": \"登入由 OpenSunstar 託管;用於 xAI / Grok 官方帳號。API Key 接入仍使用下方供應商設定。\",\n \"action\": \"Grok 訂閱登入\",\n \"dialogHint\": \"依裝置授權流程連接 xAI / Grok 帳號。\"\n }\n },\n \"accessModeGrid\": \"接入方式\"\n },\n \"kanban\": {\n \"subtitle\": \"以 AI 驅動的全局多視角,多項目組合矩陣:全生命週期管理、項目健康評估、動態成本監控\",\n \"scanning\": \"正在掃描 {{done}}/{{total}} 個項目…\",\n \"refresh\": \"刷新指標\",\n \"addProject\": \"添加項目\",\n \"searchPlaceholder\": \"搜索項目…\",\n \"confirmRemoveTitle\": \"從項目AI看板中移除?\",\n \"confirmRemove\": \"將移除「{{name}}」;不會刪除磁盤上的倉庫文件,階段與進度等本地看板數據也會清除。\",\n \"confirmRemoveBtn\": \"移除\",\n \"removed\": \"已移除「{{name}}」\",\n \"commits7dHint\": \"近 7 天共 {{count}} 次提交\",\n \"commitsWindowHint\": \"近 {{days}} 天共 {{count}} 次提交\",\n \"noRecentActivity\": \"近 7 天無提交\",\n \"noRecentActivityWindow\": \"近 {{days}} 天無提交\",\n \"stageDistribution\": \"階段分佈\",\n \"activity\": {\n \"veryHigh\": \"很高\",\n \"high\": \"高\",\n \"medium\": \"中等\",\n \"low\": \"低\"\n },\n \"detail\": {\n \"tabs\": \"項目詳情\",\n \"overview\": \"概覽\",\n \"aiAssets\": \"AI 資產配置\",\n \"projectAssets\": \"本項目啟用的資產\",\n \"projectAssetsHint\": \"勾選後僅對當前項目生效;全局庫在側欄維護,項目關聯僅存於本地數據庫。\"\n },\n \"score\": {\n \"health\": \"健康評分\"\n },\n \"readiness\": {\n \"title\": \"Agent 配置就緒\",\n \"loading\": \"正在評估配置就緒度…\",\n \"hint\": \"點擊下方條目可直達對應配置;項目級資產在本頁「AI 資產配置」中關聯。\",\n \"configure\": \"去配置\",\n \"configureGlobal\": \"前往全局配置\",\n \"manage\": \"管理\",\n \"openAssetsTab\": \"打開專案資產配置\",\n \"compactTitle\": \"專案配置就緒度\",\n \"normalCount\": \"{{count}} 項正常\",\n \"driftCount\": \"{{count}} 項不一致\",\n \"missingCount\": \"{{count}} 項缺失\",\n \"priorityDrift\": \"優先處理:{{label}} 配置不一致\",\n \"priorityMissing\": \"優先處理:{{label}} 尚未配置\",\n \"completedSection\": \"已完成 {{count}} 項\",\n \"badgeHint\": \"點擊查看詳情\",\n \"scanEffective\": \"生效態掃描\",\n \"forApp\": \"按 {{app}} 計分\",\n \"status\": {\n \"global_only\": \"來源:全局基線\",\n \"detected_only\": \"來源:倉庫探測\",\n \"partial\": \"部分 CLI 支持\",\n \"not_required\": \"當前目標 CLI 不支持此項,已從評分中排除\",\n \"unmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"unknown\": \"暫不能判定\",\n \"unhealthy\": \"配置與預期不一致\"\n },\n \"effective\": {\n \"configured\": \"已配置\",\n \"effective\": \"已生效\",\n \"drifted\": \"未生效\",\n \"unconfigured\": \"未配置\",\n \"unchecked\": \"暫未比對\"\n },\n \"driftBadge\": \"{{count}} 項配置不一致\",\n \"driftShort\": \"待處理 {{count}}\",\n \"repairDrift\": \"修復配置\",\n \"repairSuccess\": \"已寫回並驗證生效\",\n \"repairFailed\": \"修復後仍存在配置不一致\",\n \"repairError\": \"修復請求失敗,請稍後重試\",\n \"repairNoop\": \"當前項無需修復\"\n },\n \"governance\": {\n \"title\": \"配置生效率\",\n \"forApp\": \"目標 CLI:{{app}}\",\n \"scannedProjects\": \"已掃描項目\",\n \"ofTotal\": \"共 {{total}} 個\",\n \"driftProjects\": \"配置不一致項目\",\n \"driftItems\": \"{{count}} 項待修復\",\n \"effectiveRate\": \"生效率\",\n \"comparableItems\": \"{{count}} 項可比對\",\n \"effectiveItems\": \"已生效項\",\n \"portfolioScope\": \"組合層彙總\",\n \"driftBreakdown\": \"配置不一致分佈(按資產類型)\",\n \"allEffective\": \"可比對資產均已生效,組合層治理狀態良好。\",\n \"awaitingScan\": \"就緒度掃描完成後將顯示治理指標。\",\n \"repairConfirmTitle\": \"確認寫回修復?\",\n \"repairConfirmProjectTitle\": \"確認修復全部不一致項?\",\n \"repairConfirmAssetIntro\": \"將把 OpenSunstar 庫中的「{{label}}」寫回目標 CLI({{app}})對應的項目級文件,可能覆蓋你在 IDE/終端裡手動改過的內容。\",\n \"repairConfirmProjectIntro\": \"將修復項目「{{name}}」的全部 {{count}} 項配置不一致:逐項寫回 OpenSunstar 庫內容到目標 CLI({{app}}),可能覆蓋外部手動修改。\",\n \"repairConfirmDetail\": \"不一致說明:{{detail}}\",\n \"repairConfirmPath\": \"目標路徑:{{path}}\",\n \"repairConfirmProceed\": \"確認後將立即寫回並復掃驗證;此操作不可自動撤銷。\",\n \"repairConfirmAction\": \"確認寫回\",\n \"repairConfirmProjectAction\": \"確認修復全部\",\n \"tooltip\": {\n \"scannedProjects\": \"已完成 AI 配置就緒度檢查的項目數量\",\n \"driftProjects\": \"至少有 1 項 AI 配置與 OpenSunstar 中保存的預期狀態不一致,通常來自本地文件被外部修改或刪除。\",\n \"effectiveRate\": \"生效率 = 已生效項 ÷ 可比對項。\\n已生效 = 配置已正確寫入項目;可比對項 = 排除「不支援」後的有效檢查項總數。\",\n \"effectiveItems\": \"所有項目中,AI 配置已正確落地的檢查項數量總和。\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"組合層生效狀態巡檢:未發現配置不一致。\",\n \"title\": \"{{projects}} 個項目存在配置不一致(共 {{items}} 項)\",\n \"forApp\": \"目標 CLI:{{app}}\",\n \"itemCount\": \"{{count}} 項待處理\",\n \"repairAll\": \"修復全部待處理項\",\n \"repairAllSuccess\": \"已修復 {{count}} 項配置不一致並驗證生效\",\n \"repairPartial\": \"已修復 {{fixed}} 項,仍有 {{remaining}} 項配置不一致\",\n \"repairNone\": \"未發現可修復的配置不一致項\"\n }\n },\n \"projectConfig\": {\n \"hint\": \"為當前項目勾選要啟用的 MCP、Skills 與 Prompts。全局資產庫在側欄 Agent 配置中維護。\",\n \"mcpServers\": \"MCP 服務器\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"暫無 MCP 服務器\",\n \"noSkills\": \"暫無已安裝的 Skills\",\n \"noPrompts\": \"暫無 Prompts\",\n \"goToMcp\": \"前往 MCP 管理\",\n \"goToSkills\": \"前往 Skills 管理\",\n \"goToPrompts\": \"前往 Prompts 管理\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore 規則\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"暫無 Commands\",\n \"noHooks\": \"暫無 Hooks\",\n \"noIgnore\": \"暫無 Ignore 規則\",\n \"noPermissions\": \"暫無 Permissions\",\n \"noSubagents\": \"暫無 Subagents\",\n \"goToCommands\": \"前往 Commands 管理\",\n \"goToHooks\": \"前往 Hooks 管理\",\n \"goToIgnore\": \"前往 Ignore 管理\",\n \"goToPermissions\": \"前往 Permissions 管理\",\n \"goToSubagents\": \"前往 Subagents 管理\"\n },\n \"projectAssets\": {\n \"projectLink\": \"本專案關聯\",\n \"hint\": \"為當前項目勾選要啟用的 AI 資產子集。關聯僅寫入 OpenSunstar 本地庫,不會自動修改項目倉庫文件;寫入各 CLI 仍由側欄全局資產管理。\",\n \"partialHint\": \"部分 CLI 支持有限制,懸停標籤查看說明\",\n \"globalBaselineHint\": \"全局庫已有 {{count}} 條規則作為安全基線;可為當前項目單獨勾選啟用子集。\",\n \"switchAllUnsupported\": \"當前資產類型在所有目標 CLI 上均不支持同步,無法為項目啟用\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop 暫不參與此類資產同步\",\n \"openclawMcp\": \"OpenClaw 當前不支持 MCP 同步\",\n \"openclawSkills\": \"OpenClaw 當前不支持 Skills 同步\",\n \"openclawCommands\": \"OpenClaw 當前不支持 Commands 同步\",\n \"openclawIgnore\": \"OpenClaw 當前不支持 Ignore 同步\",\n \"openclawSubagents\": \"OpenClaw 當前不支持 Subagents 同步\",\n \"codexCommands\": \"Codex 不支持獨立 slash command 文件\",\n \"codexSubagent\": \"Codex 通過 TOML 轉換寫入 ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks 當前僅 Claude Code 支持寫回\",\n \"permissionsClaudeOnly\": \"Permissions 當前僅 Claude Code 支持寫回\",\n \"hermesSubagents\": \"Hermes 不支持 Subagent 文件同步\"\n }\n },\n \"board\": {\n \"summary\": {\n \"title\": \"項目總覽\",\n \"totalProjects\": \"總項目數\",\n \"totalCodeLines\": \"總代碼行數\",\n \"linesUnit\": \"行\",\n \"avgActivity\": \"平均活躍度({{days}} 天)\",\n \"commitsInWindow\": \"近 {{days}} 天提交\",\n \"thisWeek\": \"近 7 天提交\",\n \"windowLabel\": \"Git 活躍統計週期\",\n \"daysUnit\": \"天\",\n \"updatesUnit\": \"次\"\n },\n \"duplicateCleanup\": \"重複資產檢測\"\n },\n \"projectBlueprint\": {\n \"title\": \"項目基線 Blueprint\",\n \"hint\": \"選擇模板一鍵關聯全局庫資產;合併模式僅新增關聯,不刪除已有配置。\",\n \"loading\": \"加載 Blueprint…\",\n \"exportSnapshot\": \"導出快照\",\n \"targetCli\": \"項目目標 CLI\",\n \"targetDefault\": \"沿用看板默認\",\n \"saveTarget\": \"保存\",\n \"previewing\": \"生成預覽…\",\n \"previewTitle\": \"預覽:將新增 {{count}} 項關聯({{name}})\",\n \"apply\": \"應用 Blueprint\",\n \"applied\": \"已應用「{{name}}」,關聯 {{count}} 項資產\",\n \"targetSaved\": \"項目目標 CLI 已保存\",\n \"snapshotExported\": \"基線快照已導出:{{path}}\"\n },\n \"onboarding\": {\n \"title\": \"快速上手\",\n \"dismiss\": \"關閉引導\",\n \"prev\": \"上一步\",\n \"next\": \"下一步\",\n \"done\": \"知道了\",\n \"step1\": {\n \"title\": \"新增專案\",\n \"desc\": \"所有功能圍繞專案展開。點擊側邊欄「我的專案 → 新增專案」,把你的程式碼倉庫加進來,OpenSunstar 會自動掃描 AI 配置狀態。\"\n },\n \"step2\": {\n \"title\": \"專案駕駛艙 — 今天有沒有事\",\n \"desc\": \"「今日告警」只回答一個問題:今天有沒有事。沒事就顯示「今天沒事」—— 沒事就是最好的消息。「專案看板」放彙總指標與資產矩陣,巡視內容不占開機第一眼。\"\n },\n \"step3\": {\n \"title\": \"AI資產配置 — 為專案落地資產\",\n \"desc\": \"在「專案配置 → AI資產配置」裡為專案關聯 MCP 伺服器、Skills、Prompts 等資產。側欄「Agent 配置」管全域資產庫,這裡管它們在專案上的關聯。\"\n },\n \"step4\": {\n \"title\": \"工作流程編排 — 建立可執行流程\",\n \"desc\": \"在「專案配置 → 工作流程編排」裡為專案配置階段、預設與變更執行方案。方法論辨識、預設編排、自訂編排、設計合約——四個獨立維度,按需選用,無先後依賴。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"配置修復預覽\",\n \"description\": \"項目「{{name}}」共 {{count}} 項配置不一致,勾選需要修復的項:\",\n \"loading\": \"正在掃描待處理項…\",\n \"empty\": \"未發現配置不一致,無需修復\",\n \"selectAll\": \"全選\",\n \"deselectAll\": \"取消全選\",\n \"safetyHint\": \"{{count}} 項為安全關鍵項(Ignore/Permissions/Hooks),修復將覆蓋存取控制或命令執行配置\",\n \"safetyCriticalTooltip\": \"安全關鍵項:修復將覆蓋存取控制或命令執行相關配置\",\n \"safetyBadge\": \"安全關鍵\",\n \"confirmAction\": \"修復選中項({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 配置狀態\",\n \"subtitle\": \"每個格子顯示一類 AI 配置的短狀態:已生效、不一致、缺失、全局、探測、未掃、不適用。點擊查看詳情。\",\n \"project\": \"項目\",\n \"stage\": \"階段\",\n \"score\": \"分數\",\n \"loading\": \"正在掃描項目配置狀態…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"需關注\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未掃描\",\n \"hasIssue\": \"需處理\",\n \"showProblemsOnly\": \"只看需處理\",\n \"filterLabel\": \"項目狀態篩選\",\n \"filterAll\": \"全部\",\n \"filterNeedsAction\": \"需處理\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未掃\",\n \"allClear\": \"當前篩選下沒有需要處理的項目\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"已生效\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"缺失\",\n \"cellGlobal\": \"全局\",\n \"cellDetected\": \"探測\",\n \"cellPartial\": \"部分\",\n \"cellWarn\": \"需關注\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未掃\",\n \"cellNA\": \"不適用\",\n \"cellRecent\": \"有更新\",\n \"cellStale\": \"無更新\",\n \"colUpkeep\": \"維護度\",\n \"colUpkeepTitle\": \"近 90 天專案資產關聯更新\",\n \"linkedCount\": \"OpenSunstar 已關聯\",\n \"linkedCountValue\": \"{{value}} 項\",\n \"detailRecentUpdates\": \"統計近 90 天內是否有專案級 AI 資產配置變更\",\n \"safetyBadge\": \"安全關鍵\",\n \"noData\": \"暫無掃描數據\",\n \"scanPending\": \"尚未完成掃描,當前狀態不能判定為正常。\",\n \"detailEffective\": \"配置已生效,與 OpenSunstar 庫一致\",\n \"detailDrifted\": \"配置與預期不一致,可能需要修復\",\n \"detailUnscanned\": \"已發現配置,但暫未完成目標 CLI 生效狀態比對\",\n \"detailGlobal\": \"使用全局默認配置,項目級未自定義\",\n \"detailDetected\": \"檢測到倉庫中有配置,但未被 OpenSunstar 管理\",\n \"detailMissingSafety\": \"安全關鍵項未配置,建議盡快設置\",\n \"detailMissing\": \"未配置此項,如果不需要可忽略\",\n \"detailPartial\": \"部分配置,建議完善\",\n \"detailNA\": \"當前目標 CLI 不支持此項\",\n \"detailUnmanaged\": \"項目尚未納入 OpenSunstar,不能判定為缺失\",\n \"statusOk\": \"配置正常\",\n \"statusWarn\": \"需要關注\",\n \"statusCrit\": \"存在異常\",\n \"statusUnscanned\": \"未完成掃描\",\n \"statusNA\": \"不適用\",\n \"stateDetail\": \"狀態詳情\",\n \"driftDetail\": \"狀態詳情\",\n \"checkDetail\": \"檢查詳情\",\n \"filePath\": \"配置文件路徑\",\n \"viewProject\": \"查看項目資產\",\n \"goRepair\": \"去修復\"\n },\n \"portfolioNotice\": {\n \"title\": \"部分資料沒讀到,下面的「未掃 / 未設定 / 缺失」不代表磁碟上真的缺失。\",\n \"readinessFailed\": \"{{failed}}/{{total}} 個專案的就緒度讀取失敗\",\n \"assetFailed\": \"資產統計失敗:{{reason}}\",\n \"retry\": \"重試\"\n },\n \"scope\": {\n \"globalEnabled\": \"全域已啟用\",\n \"globalNotEnabled\": \"全域未啟用\",\n \"activeProject\": \"專案:{{name}}\",\n \"backToProject\": \"返回專案:{{name}}\",\n \"globalScope\": \"全域\",\n \"projectScope\": \"專案層級\",\n \"globalToast\": \"已為 {{app}} 全域啟用\",\n \"globalDisableToast\": \"已為 {{app}} 全域停用\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"跨設備雲同步\",\n \"subtitle\": \"配置數據在多台設備間即時同步,隨時隨地保持一致的開發環境\",\n \"status\": \"同步狀態\",\n \"backend\": \"同步後端\",\n \"notConfigured\": \"未配置\",\n \"notConfiguredHint\": \"請先在設定中配置雲同步後端(WebDAV / S3 / GitHub Gist)\",\n \"goSettings\": \"前往同步設定\",\n \"lastSync\": \"上次同步\",\n \"never\": \"從未同步\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 物件儲存\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"已啟用\",\n \"disabled\": \"未啟用\",\n \"autoSync\": \"自動同步\",\n \"on\": \"開\",\n \"off\": \"關\",\n \"description\": \"雲同步解決的是「空間軸」問題——配置在多台設備間保持一致。與專案環境快照(時間軸·版本回溯)互為補充,按需選用。\"\n },\n \"projectAiConfig\": {\n \"title\": \"AI資產配置\",\n \"subtitle\": \"為單一專案落地 AI 資產:套用藍圖、檢查就緒度、勾選生效的資產。側欄「Agent 配置」管的是全域資產庫,這裡管它們在本專案上的關聯。\",\n \"switcher\": \"目前配置專案\",\n \"targetCli\": \"目標 CLI\",\n \"tabs\": {\n \"assets\": \"資產關聯\",\n \"readiness\": \"就緒與生效\",\n \"environment\": \"專案環境 & Wiki\"\n },\n \"emptyProjects\": \"還沒有加入專案,先加入一個再來配置 AI 資產。\",\n \"openWorkflow\": \"設定專案工作流程\",\n \"orchestrationLink\": \"工作流程編排\",\n \"orchestrationHint\": \"階段、預設與變更執行方案在「流程與方法論」裡配置,會帶著目前專案跳過去。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} 次分析\",\n \"cachedFree\": \"¥0(快取)\",\n \"chartApiCalls\": \"API 呼叫\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 問答\",\n \"colCost\": \"費用\",\n \"colCount\": \"次數\",\n \"colTokens\": \"Token\",\n \"colType\": \"類型\",\n \"disclaimer\": \"費用為基於公開定價的估算,以供應商帳單為準。\",\n \"disclaimerCliSuffix\": \"CLI 代理用量見「設定 → 用量」。\",\n \"disclaimerShort\": \"估算 · 以供應商帳單為準\",\n \"emptyRoi\": \"近 {{days}} 天尚無 AI 呼叫記錄。觸發摘要、風險分析或 NL 問答後將在此展示 ROI。\",\n \"estimatedSuffix\": \"估算\",\n \"lastCall\": \"本次\",\n \"loadingRoi\": \"載入 ROI 資料…\",\n \"monthTotal\": \"本月累計\",\n \"monthTotalFailed\": \"本月累計查詢失敗(未知,不是 ¥0)\",\n \"monthTotalLoading\": \"本月累計 統計中…\",\n \"nlQueryCount\": \"{{queries}} 次問答\",\n \"panelTitle\": \"AI 成本-價值追蹤\",\n \"projectRisks\": \"{{risks}} 項風險\",\n \"projectScope\": \"{{projects}} 個專案\",\n \"projectUseful\": \"{{useful}} 次有用\",\n \"rangeDays\": \"{{days}} 天\",\n \"roiReport\": \"AI 投入報告\",\n \"sectionByProject\": \"按專案(消耗 ↔ 價值)\",\n \"sectionByType\": \"按分析類型\",\n \"statRisks\": \"發現風險\",\n \"statTokens\": \"Token\",\n \"statTotalSpend\": \"總投入\",\n \"statUseful\": \"標記有用\",\n \"stripTitle\": \"AI 成本透明\",\n \"trendTitle\": \"每日 AI 投入趨勢\",\n \"unknownPricing\": \"單價未知\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI 回饋\",\n \"markNotUseful\": \"標記為無用\",\n \"markUseful\": \"標記為有用\",\n \"notUseful\": \"無用\",\n \"useful\": \"有用\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 就緒度\",\n \"health\": \"健康評分\",\n \"nlQuery\": \"自然語言查詢\",\n \"portfolioSummary\": \"組合週報\",\n \"progress\": \"進度估算\",\n \"riskAnalysis\": \"風險分析\",\n \"summary\": \"專案摘要\",\n \"trendAnalysis\": \"趨勢分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI 回答\",\n \"costFailed\": \"成本統計查詢失敗(未知,不是 ¥0)\",\n \"detailToggle\": \"近 {{days}} 天分析明細\",\n \"guarding\": \"AI 正在守護\",\n \"inputLabel\": \"向 AI 提問\",\n \"notConfigured\": \"AI 問答與成本統計尚未啟用 —— 在「設定 → AI 供應方」填入 API Key 後,這裡會出現自然語言提問入口。\",\n \"placeholder\": \"向 AI 提問,如:哪個專案最近不活躍?幫我產生本週總結\",\n \"projectsUnit\": \"個專案\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"問答\",\n \"typeRisk\": \"風險\",\n \"typeSummary\": \"摘要\",\n \"typeTrend\": \"趨勢\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"分析風險\",\n \"analyzing\": \"正在分析風險…\",\n \"levelHigh\": \"高風險\",\n \"levelLow\": \"低風險\",\n \"levelMedium\": \"中風險\",\n \"none\": \"專案狀態健康,暫未發現風險\",\n \"sectionTitle\": \"風險分析\",\n \"title\": \"AI 風險分析\",\n \"typeActivity\": \"活躍度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"進度\",\n \"typeTechDebt\": \"技術債\"\n },\n \"weekly\": {\n \"analyzing\": \"正在分析 {{projects}} 個專案資料…\",\n \"cached\": \"快取\",\n \"copied\": \"已複製\",\n \"copyFailed\": \"複製失敗\",\n \"copySuccess\": \"週報已複製到剪貼簿\",\n \"dialogTitle\": \"AI 智慧週報\",\n \"errorGenerate\": \"週報產生失敗,請稍後重試。\",\n \"errorNoProvider\": \"未設定 AI 供應方,請先在設定中設定 AI Key。\",\n \"generate\": \"產生週報\",\n \"windowDays\": \"{{days}}天\",\n \"windowHint\": \"· 近 {{days}} 天資料\"\n }\n },\n \"alerts\": {\n \"action\": {\n \"budget\": \"調整預算\",\n \"configure\": \"前往設定\",\n \"hintAssets\": \"→ 專案資產設定 · 資產關聯\",\n \"hintReadiness\": \"→ 專案資產設定 · 就緒與生效\",\n \"repair\": \"前往修復\",\n \"setup\": \"前往設定\"\n },\n \"dismiss\": \"知道了\",\n \"empty\": {\n \"desc\": \"沒有故障、沒有超支、沒有待修復。回去寫程式吧。\",\n \"title\": \"今天沒事\"\n },\n \"money\": {\n \"critical\": \"預算超限\",\n \"emergency\": \"嚴重超限\",\n \"warning\": \"預算預警\"\n },\n \"onlyTasks\": \"狀態與花費都沒問題,其餘事項可以排程。\",\n \"task\": {\n \"driftDesc\": \"設定與預期不一致,可預覽後一鍵修復\",\n \"gapDesc\": \"就緒檢查尚未完成,請前往「專案資產設定」補齊\"\n },\n \"viewAll\": \"查看專案全景\"\n },\n \"xaiOauth\": {\n \"authStatus\": \"xAI OAuth 驗證\",\n \"accountCount\": \"{{count}} 個可用帳號\",\n \"reauthRequired\": \"需要重新登入\",\n \"notAuthenticated\": \"未驗證\",\n \"selectAccount\": \"選擇帳號\",\n \"selectAccountPlaceholder\": \"選擇 xAI 帳號\",\n \"useDefaultAccount\": \"使用預設帳號\",\n \"accounts\": \"xAI 帳號\",\n \"expired\": \"憑證已失效\",\n \"defaultAccount\": \"預設\",\n \"setAsDefault\": \"設為預設\",\n \"removeAccount\": \"移除帳號\",\n \"addOrReauth\": \"新增帳號或重新登入\",\n \"login\": \"使用 xAI 登入\",\n \"waitingForAuth\": \"等待 xAI 授權中…\",\n \"enterCode\": \"若瀏覽器未自動填入,請輸入:\",\n \"retry\": \"重試\",\n \"logoutAll\": \"移除所有 xAI 帳號\",\n \"loginRequired\": \"請先登入 xAI 帳號\",\n \"selectedAccountNeedsReauth\": \"已綁定帳號不存在或需要重新登入\",\n \"selectedAccountUnavailable\": \"已綁定帳號不存在或需要重新登入,請重新選擇帳號\"\n }\n}\n"}}, "src/i18n/locales/en.json": {"7f658de920ce256b279a9888f7d34df16218d8f9": {"t": 1785674687.270954, "n": 210206, "h": "130a1523829aed3e", "c": "{\n \"projectWiki\": {\n \"title\": \"Project Wiki / Knowledge Baseline\",\n \"subtitle\": \"Engineering knowledge baseline consumable by humans and agents\",\n \"loading\": \"Scanning Wiki…\",\n \"notInitialized\": \"No wiki/index.md detected\",\n \"pageCount\": \"{{count}} pages\",\n \"sourceRefs\": \"{{count}} source refs\",\n \"questions\": \"{{count}} open questions\",\n \"lastUpdated\": \"Last updated\",\n \"status\": {\n \"missing\": \"Not initialized\",\n \"scaffolded\": \"Scaffolded\",\n \"effective\": \"Fresh\",\n \"drifted\": \"Changed\",\n \"invalid\": \"Lint failed\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · Orientation\",\n \"L2\": \"L2 · Integration\",\n \"L3\": \"L3 · Operations\"\n },\n \"coverage\": {\n \"corePages\": \"Core pages\",\n \"componentPages\": \"Components\",\n \"flowPages\": \"Flows\",\n \"apiPages\": \"APIs\",\n \"runbookPages\": \"Runbooks\"\n },\n \"actions\": {\n \"init\": \"Initialize Wiki\",\n \"lint\": \"Run Lint\",\n \"refresh\": \"Refresh\",\n \"openInEditor\": \"Open in editor\",\n \"previewInit\": \"Preview init\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki just initialized, change mapping not yet active\",\n \"coldStartProgress\": \"Effective source_files pages: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Click Generate project Wiki, then use the configured AI provider and review the result\",\n \"affectedPages\": \"{{count}} source changes affect {{pages}} wiki pages\",\n \"unmapped\": \"{{count}} unmapped changes\",\n \"noChanges\": \"No source changes, wiki pages are up to date\"\n },\n \"lint\": {\n \"passed\": \"Lint passed\",\n \"failed\": \"Lint failed: {{errors}} errors\",\n \"warnings\": \"{{count}} warnings\",\n \"qualityLevel\": \"Quality level: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki init preview\",\n \"willCreate\": \"Will create {{count}} files\",\n \"alreadyExists\": \"{{count}} files already exist (will skip)\",\n \"confirm\": \"Confirm init\",\n \"success\": \"Wiki initialized, {{count}} files created\",\n \"blocked\": \"Safety audit blocked\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"All-in-One Assistant for Claude Code, Codex & Gemini CLI\"\n },\n \"common\": {\n \"add\": \"Add\",\n \"edit\": \"Edit\",\n \"delete\": \"Delete\",\n \"save\": \"Save\",\n \"saving\": \"Saving...\",\n \"cancel\": \"Cancel\",\n \"confirm\": \"Confirm\",\n \"close\": \"Close\",\n \"done\": \"Done\",\n \"settings\": \"Settings\",\n \"about\": \"About\",\n \"version\": \"Version\",\n \"loading\": \"Loading...\",\n \"notInstalled\": \"Not installed\",\n \"success\": \"Success\",\n \"error\": \"Error\",\n \"unknown\": \"Unknown\",\n \"enterValidValue\": \"Please enter a valid value\",\n \"clear\": \"Clear\",\n \"toggleTheme\": \"Toggle theme\",\n \"format\": \"Format\",\n \"formatSuccess\": \"Formatted successfully\",\n \"formatError\": \"Format failed: {{error}}\",\n \"copy\": \"Copy\",\n \"view\": \"View\",\n \"back\": \"Back\",\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing...\",\n \"import\": \"Import\",\n \"all\": \"All\",\n \"search\": \"Search\",\n \"reset\": \"Reset\",\n \"actions\": \"Actions\",\n \"deleting\": \"Deleting...\",\n \"auto\": \"Auto\",\n \"enabled\": \"Enabled\",\n \"notSet\": \"Not Set\"\n },\n \"firstRunNotice\": {\n \"title\": \"Welcome to OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar lets you switch between multiple Claude Code / Codex / Gemini CLI providers with a single click. If you already had these tools configured, OpenSunstar has saved your existing setup as a provider named “default” so none of your previous configuration is lost.\",\n \"bodyOfficial\": \"An “Official” preset is also included in the list — click it any time you want to switch back to the official default. OpenSunstar automatically backs up your current config to “default” before switching, so you can move back and forth freely. That's how OpenSunstar works 😊\",\n \"confirm\": \"Got it\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"Enter API Key\",\n \"show\": \"Show API Key\",\n \"hide\": \"Hide API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"Configuration must be a JSON object, not an array or other type\",\n \"invalidJson\": \"Invalid JSON format\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"What is a Common Config Snippet?\",\n \"guidePurpose\": \"It lets you share non-sensitive settings (plugins, environment variables, etc.) across different providers. These settings won't be lost when you switch providers.\",\n \"guideUsage\": \"How to use: ① Click \\\"Extract from Editor\\\" to save the common parts ② Check \\\"Write Common Config\\\" when creating a new provider\",\n \"guideReExtract\": \"If you've newly installed plugins or hooks, re-extract the common config so they sync to other providers.\",\n \"guideReassurance\": \"Don't worry — your original configuration is safely stored in the default provider and won't be lost.\",\n \"emptyTitle\": \"No common config snippet yet\",\n \"emptyHint\": \"Click \\\"Extract from Editor\\\" below to extract reusable parts from your current configuration\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Common Config Snippet\",\n \"commonConfigHint\": \"This snippet will be merged into settings.json when 'Write Common Config' is checked\",\n \"fullSettingsHint\": \"Full Claude Code settings.json content\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"hideAttribution\": \"Hide AI Attribution\",\n \"enableTeammates\": \"Teammates Mode\",\n \"enableToolSearch\": \"Enable Tool Search\",\n \"effortMax\": \"Max Effort Thinking\",\n \"disableAutoUpgrade\": \"Disable Auto-Upgrade\"\n },\n \"header\": {\n \"viewOnGithub\": \"View on GitHub\",\n \"toggleDarkMode\": \"Switch to Dark Mode\",\n \"toggleLightMode\": \"Switch to Light Mode\",\n \"addProvider\": \"Add Provider\",\n \"switchToChinese\": \"Switch to Chinese\",\n \"switchToEnglish\": \"Switch to English\",\n \"enterEditMode\": \"Enter Edit Mode\",\n \"exitEditMode\": \"Exit Edit Mode\",\n \"windowMinimize\": \"Minimize window\",\n \"windowMaximize\": \"Maximize window\",\n \"windowRestore\": \"Restore window\",\n \"windowClose\": \"Close window\"\n },\n \"provider\": {\n \"tabProvider\": \"Provider\",\n \"tabUniversal\": \"Universal\",\n \"noProviders\": \"No providers added yet\",\n \"noProvidersDescription\": \"If you already have a config, click \\\"Import Current Config\\\" — all data will be safely saved in a default provider\",\n \"noProvidersDescriptionSnippet\": \"Settings other than API key and endpoint (e.g. plugins) will be saved to a common config snippet for sharing across providers\",\n \"importCurrent\": \"Import Current Config\",\n \"importFromClaude\": \"Import existing providers from Claude Code\",\n \"importCurrentDescription\": \"Import current live config as default provider\",\n \"currentlyUsing\": \"Currently Using\",\n \"enable\": \"Enable\",\n \"inUse\": \"In Use\",\n \"blockedByProxyHint\": \"Can't switch to an official provider while proxy takeover is active\",\n \"editProvider\": \"Edit Provider\",\n \"editProviderHint\": \"Configuration will be applied to the current provider immediately after update.\",\n \"deleteProvider\": \"Delete Provider\",\n \"addNewProvider\": \"Add New Provider\",\n \"addClaudeProvider\": \"Add Claude Code Provider\",\n \"addCodexProvider\": \"Add Codex Provider\",\n \"addGeminiProvider\": \"Add Gemini Provider\",\n \"addOpenCodeProvider\": \"Add OpenCode Provider\",\n \"addToConfig\": \"Add\",\n \"removeFromConfig\": \"Remove\",\n \"setAsDefault\": \"Set Default\",\n \"isDefault\": \"Current Default\",\n \"inConfig\": \"Added\",\n \"addProviderHint\": \"Fill in the information to quickly switch providers in the list.\",\n \"editClaudeProvider\": \"Edit Claude Code Provider\",\n \"editCodexProvider\": \"Edit Codex Provider\",\n \"configError\": \"Configuration Error\",\n \"notConfigured\": \"Not configured for official website\",\n \"applyToClaudePlugin\": \"Apply to Claude plugin\",\n \"removeFromClaudePlugin\": \"Remove from Claude plugin\",\n \"dragToReorder\": \"Drag to reorder\",\n \"dragHandle\": \"Drag to reorder\",\n \"searchPlaceholder\": \"Search name, notes, or URL...\",\n \"searchAriaLabel\": \"Search providers\",\n \"searchScopeHint\": \"Matches provider name, notes, and URL.\",\n \"searchCloseHint\": \"Press Esc to close\",\n \"searchCloseAriaLabel\": \"Close provider search\",\n \"noSearchResults\": \"No providers match your search.\",\n \"duplicate\": \"Duplicate\",\n \"sortUpdateFailed\": \"Failed to update sort order\",\n \"configureUsage\": \"Configure usage query\",\n \"officialPartner\": \"Official Partner\",\n \"managedByHermes\": \"Hermes Managed\",\n \"managedByHermesHint\": \"Defined in Hermes' providers: dict. Edit or remove it via Hermes Web UI.\",\n \"openTerminal\": \"Open Terminal\",\n \"terminalOpened\": \"Terminal opened\",\n \"terminalOpenFailed\": \"Failed to open terminal\",\n \"name\": \"Provider Name\",\n \"namePlaceholder\": \"e.g., Claude Official\",\n \"websiteUrl\": \"Website URL\",\n \"notes\": \"Notes\",\n \"notesPlaceholder\": \"e.g., Company dedicated account\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"Write common config\",\n \"editCommonConfigButton\": \"Edit common config\",\n \"configJsonHint\": \"Please fill in complete Claude Code configuration\",\n \"editCommonConfigTitle\": \"Edit common config snippet\",\n \"editCommonConfigHint\": \"Common config snippet will be merged into all providers that enable it\",\n \"addProvider\": \"Add Provider\",\n \"sortUpdated\": \"Sort order updated\",\n \"usageSaved\": \"Usage query configuration saved\",\n \"usageSaveFailed\": \"Failed to save usage query configuration\",\n \"geminiConfig\": \"Gemini Configuration\",\n \"geminiConfigHint\": \"Use .env format to configure Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"Model\",\n \"oauthTitle\": \"OAuth Authentication Mode\",\n \"oauthHint\": \"Google official uses OAuth personal authentication, no need to fill in API Key. The browser will automatically open for login on first use.\",\n \"apiKeyPlaceholder\": \"Enter Gemini API Key\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"Needs Routing\",\n \"noRoutingSupport\": \"No Routing Support\"\n },\n \"codex\": {\n \"needsRouting\": \"Needs Routing\",\n \"noRoutingSupport\": \"No Routing Support\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop official providers use the built-in 1P sign-in. No API key or endpoint URL is required.\",\n \"mode\": \"Model handling\",\n \"modeDirect\": \"Direct\",\n \"modeProxy\": \"Requires routing\",\n \"modelMappingToggle\": \"Needs model mapping\",\n \"modelMappingOffHint\": \"Direct mode works only when the provider accepts Claude Desktop's three role IDs (claude-sonnet-* / claude-opus-* / claude-haiku-*); for any other model name (including legacy IDs like claude-3-5-sonnet-…), enable this switch to use mapping.\",\n \"modelMappingOnHint\": \"Claude Desktop only accepts the three role IDs claude-sonnet-* / claude-opus-* / claude-haiku-*. When enabled, OpenSunstar maps these three roles to your provider's actual models and keeps local routing running while in use.\",\n \"routeMapTitle\": \"Model mapping\",\n \"routeMapHint\": \"Fill in the actual request model for each of the Sonnet, Opus, and Haiku tiers. Use the menu display name for branded models such as DeepSeek or Kimi. Any tier left blank inherits the Sonnet tier's model (or the first tier you filled in), so the Haiku that sub-agents call is always available.\",\n \"routeModelLabel\": \"Model role\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"Menu display name\",\n \"upstreamModelLabel\": \"Requested model\",\n \"supports1mLabel\": \"Declare 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Manually specify Claude Desktop models (advanced, optional)\",\n \"directModelListCollapsedHint\": \"Native Claude model providers usually do not need this. Claude Desktop will fetch /v1/models automatically.\",\n \"directModelListHint\": \"Only fill this when the provider's /v1/models is unavailable or does not return Claude Desktop-recognized Sonnet / Opus / Haiku model IDs. Checking 1M declares 1M context support to Claude Desktop.\",\n \"directModelInvalid\": \"Direct models must use Claude Desktop-recognized Sonnet / Opus / Haiku model IDs\",\n \"addModel\": \"Add model\",\n \"addRoute\": \"Add model\",\n \"routeInvalid\": \"Choose a model role and enter the requested model\",\n \"routesRequired\": \"At least one model mapping is required\",\n \"statusTitle\": \"Claude Desktop configuration needs attention\",\n \"statusUnsupported\": \"This platform does not support writing Claude Desktop 3P configuration yet.\",\n \"statusStaleRawModels\": \"The Claude Desktop profile contains model IDs outside the Sonnet / Opus / Haiku role families. Newer Claude Desktop versions may reject it; switch to the current provider again to repair it.\",\n \"statusMissingRouteMappings\": \"The current provider has model mapping enabled but no valid routes. Edit the provider and add at least one mapping.\",\n \"statusGatewayTokenMissing\": \"The local routing token has not been generated yet. Switching to this provider again will write a new local token.\",\n \"statusBaseUrlMismatch\": \"The Claude Desktop profile points to a different URL than the current provider. Current: {{actual}}; expected: {{expected}}. Switch to the current provider again to repair it.\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop local routing is running - {{address}}:{{port}}\",\n \"inactive\": \"Turn on Claude Desktop local routing for providers that need model mapping or format conversion. Configured address: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"Provider added\",\n \"providerSaved\": \"Provider configuration saved\",\n \"providerDeleted\": \"Provider deleted successfully\",\n \"switchSuccess\": \"Switch successful!\",\n \"codexRestartRequired\": \"Switched successfully. Restart the client to apply changes.\",\n \"claudeDesktopRestartRequired\": \"Switched successfully. Restart Claude Desktop to apply changes.\",\n \"claudeDesktopProxyRestartRequired\": \"Switched successfully. Keep OpenSunstar running and restart Claude Desktop to apply changes.\",\n \"addToConfigSuccess\": \"Added to config\",\n \"removeFromConfigSuccess\": \"Removed from config\",\n \"switchFailedTitle\": \"Switch failed\",\n \"switchFailed\": \"Switch failed: {{error}}\",\n \"autoImported\": \"Default provider created from existing configuration\",\n \"addFailed\": \"Failed to add provider: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"saveFailedGeneric\": \"Save failed, please try again\",\n \"appliedToClaudePlugin\": \"Applied to Claude plugin\",\n \"removedFromClaudePlugin\": \"Removed from Claude plugin\",\n \"syncClaudePluginFailed\": \"Sync Claude plugin failed\",\n \"skipClaudeOnboardingFailed\": \"Failed to skip Claude Code first-run confirmation\",\n \"clearClaudeOnboardingSkipFailed\": \"Failed to restore Claude Code first-run confirmation\",\n \"updateSuccess\": \"Provider updated successfully\",\n \"updateFailed\": \"Failed to update provider: {{error}}\",\n \"deleteSuccess\": \"Provider deleted\",\n \"deleteFailed\": \"Failed to delete provider: {{error}}\",\n \"settingsSaved\": \"Settings saved\",\n \"settingsSaveFailed\": \"Failed to save settings: {{error}}\",\n \"proxyRequiredForSwitch\": \"This provider {{reason}}, requires the routing service to work properly. Start routing first.\",\n \"proxyReasonCopilot\": \"uses GitHub Copilot as a Claude provider\",\n \"proxyReasonOpenAIChat\": \"uses OpenAI Chat API format\",\n \"proxyReasonOpenAIResponses\": \"uses OpenAI Responses API format\",\n \"proxyReasonFullUrl\": \"has full URL connection mode enabled\",\n \"openAIFormatHint\": \"This provider uses OpenAI-compatible format and requires the routing service to be enabled\",\n \"copilotProxyHint\": \"GitHub Copilot as a Claude provider always requires local routing; routing automatically selects Chat Completions or Responses based on the current model.\",\n \"openLinkFailed\": \"Failed to open link\",\n \"openclawModelsRegistered\": \"Models have been registered to /model list\",\n \"openclawDefaultModelSet\": \"Set as default model\",\n \"openclawDefaultModelSetFailed\": \"Failed to set default model\",\n \"openclawNoModels\": \"No models configured\",\n \"backfillWarning\": \"Switched successfully, but failed to save changes back to the previous provider\",\n \"windowControlFailed\": \"Window control failed: {{error}}\",\n \"officialBlockedByProxy\": \"Cannot switch to official provider while local routing is active. Using routing with official APIs may cause account bans.\",\n \"proxyOfficialWarning\": \"Current provider {{name}} is official. Consider switching to a third-party provider before using local routing.\"\n },\n \"confirm\": {\n \"deleteProvider\": \"Delete Provider\",\n \"deleteProviderMessage\": \"Are you sure you want to delete provider \\\"{{name}}\\\"? This action cannot be undone.\",\n \"removeProvider\": \"Remove Provider\",\n \"removeProviderMessage\": \"Are you sure you want to remove provider \\\"{{name}}\\\" from the configuration?\\n\\nAfter removal, this provider will no longer be active, but the configuration data will be retained in OpenSunstar. You can re-add it at any time.\",\n \"proxy\": {\n \"title\": \"Enable Local Routing\",\n \"message\": \"Local routing is an advanced feature. Please make sure you understand how it works before enabling.\\n\\nWe recommend consulting the relevant documentation or your provider for proper configuration.\",\n \"confirm\": \"I understand, enable\"\n },\n \"failover\": {\n \"title\": \"Enable Failover\",\n \"message\": \"Failover is an advanced feature. Please make sure you understand how it works before enabling.\\n\\nWe recommend configuring provider priorities in the failover queue first.\",\n \"confirm\": \"I understand, enable\"\n },\n \"usage\": {\n \"title\": \"Configure Usage Query\",\n \"message\": \"Usage query requires a custom script or API parameters. Please make sure you have obtained the necessary information from your provider.\\n\\nIf unsure how to configure, please consult your provider's documentation first.\",\n \"confirm\": \"I understand, configure\"\n },\n \"streamCheck\": {\n \"title\": \"Model Health Check\",\n \"message\": \"Health check tests provider connectivity by sending a direct API request. The following may cause check failures:\\n\\n• Official providers (uses OAuth login, no standalone API Key)\\n• Some relay services (verify requests come from Claude Code CLI)\\n• AWS Bedrock (uses IAM signature authentication)\\n\\nA failed check does not mean the provider is unusable — it only means it cannot be verified via a standalone request. Please refer to actual behavior within the application.\",\n \"confirm\": \"I understand, proceed\"\n },\n \"autoSync\": {\n \"title\": \"Enable Auto Sync\",\n \"message\": \"When auto sync is enabled, every database change will be automatically uploaded to the WebDAV server.\\n\\nThis may result in significant network traffic. Please ensure your network and WebDAV service can handle frequent data transfers.\",\n \"confirm\": \"I understand, enable\"\n },\n \"commonConfig\": {\n \"title\": \"About Common Config\",\n \"message\": \"The \\\"Common Config Snippet\\\" lets you share plugins, environment variables, and other settings across different providers — so they won't be lost when you switch.\\n\\nHow to use:\\n① Edit a provider → click \\\"Edit Common Config\\\" → \\\"Extract from Editor\\\"\\n② When creating a new provider, check \\\"Write Common Config\\\" (enabled by default)\\n\\nIf you've newly installed plugins or hooks, re-extract the common config to keep them in sync.\",\n \"confirm\": \"Got it\"\n }\n },\n \"settings\": {\n \"title\": \"Settings\",\n \"general\": \"General\",\n \"tabGeneral\": \"General\",\n \"tabAuth\": \"Auth\",\n \"tabAdvanced\": \"Advanced\",\n \"tabProxy\": \"Routing\",\n \"authCenter\": {\n \"title\": \"Authentication Center\",\n \"description\": \"Separate third-party keys from official subscription sign-ins so each CLI shows its actual credential source.\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"Local CLI Sign-in Status\",\n \"readonlyProbe\": \"Read-only probe\",\n \"localCliDescription\": \"Distinguish third-party keys from official subscription sign-ins. OpenSunstar only reports local signals and does not take over Claude or Google account credentials.\",\n \"localCliLoading\": \"Reading local CLI authorization status…\",\n \"managedAccountsTitle\": \"Managed Accounts\",\n \"managedAccountsDescription\": \"Accounts managed by OpenSunstar can be bound to Providers or local proxy routes.\",\n \"copilotDescription\": \"Manage GitHub Copilot accounts\",\n \"codexOauthDescription\": \"Manage ChatGPT accounts\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"Configuration Directory\",\n \"description\": \"Manage storage paths for Claude, Codex and Gemini configurations\"\n },\n \"proxy\": {\n \"title\": \"Local Routing\",\n \"description\": \"Control routing service toggle, view status and port info\",\n \"enableFeature\": \"Show Routing Toggle on Main Page\",\n \"enableFeatureDescription\": \"When enabled, the routing and failover toggles will appear at the top of the main page\",\n \"enableFailoverToggle\": \"Show Failover Toggle on Main Page\",\n \"enableFailoverToggleDescription\": \"When enabled, the failover toggle will appear independently at the top of the main page\",\n \"running\": \"Running\",\n \"stopped\": \"Stopped\"\n },\n \"modelTest\": {\n \"title\": \"Model Test Config\",\n \"description\": \"Configure default models and prompts for model testing\"\n },\n \"failover\": {\n \"title\": \"Auto Failover\",\n \"description\": \"Configure failover queue and circuit breaker strategy\"\n },\n \"pricing\": {\n \"title\": \"Cost Pricing\",\n \"description\": \"Manage token pricing rules for each model\"\n },\n \"globalProxy\": {\n \"title\": \"Global Outbound Proxy\",\n \"description\": \"Configure proxy for OpenSunstar to access external APIs\"\n },\n \"data\": {\n \"title\": \"Data Management\",\n \"description\": \"Import and export local configuration data\"\n },\n \"backup\": {\n \"title\": \"Backup & Restore\",\n \"description\": \"Manage automatic backups, view and restore database snapshots\"\n },\n \"cloudSync\": {\n \"title\": \"Cloud Sync\",\n \"description\": \"Sync data across devices via WebDAV\"\n },\n \"rectifier\": {\n \"title\": \"Rectifier\",\n \"description\": \"Automatically fix API request compatibility issues\",\n \"enabled\": \"Enable Rectifier\",\n \"enabledDescription\": \"Master switch, all rectification features will be disabled when turned off\",\n \"requestGroup\": \"Request Rectification\",\n \"responseGroup\": \"Response Rectification\",\n \"thinkingSignature\": \"Thinking Signature Rectification\",\n \"thinkingSignatureDescription\": \"When an Anthropic-type provider returns thinking signature incompatibility or illegal request errors, automatically removes incompatible thinking-related blocks and retries once with the same provider\",\n \"thinkingBudget\": \"Thinking Budget Rectification\",\n \"thinkingBudgetDescription\": \"When an Anthropic-type provider returns budget_tokens constraint errors (such as at least 1024), automatically normalizes thinking to enabled, sets thinking budget to 32000, and raises max_tokens to 64000 if needed, then retries once\",\n \"mediaFallback\": \"Unsupported Image Fallback\",\n \"mediaFallbackDescription\": \"When a provider does not support image input (it declares text-only capability, or the upstream returns an unsupported-image error), automatically replaces image blocks with an [Unsupported Image] marker so the conversation is not interrupted\",\n \"mediaHeuristic\": \"Heuristic Text-Only Model Detection\",\n \"mediaHeuristicDescription\": \"Predictively strips images before sending based on a built-in model-name list. When off, only the declared-text-only and upstream-error fallback paths remain, preventing the built-in list from misclassifying a multimodal model as text-only and silently dropping images\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock Request Optimizer\",\n \"description\": \"Automatically optimize Thinking and Cache configuration before sending requests (only applies to Bedrock providers)\",\n \"enabled\": \"Enable Optimizer\",\n \"thinkingOptimizer\": \"Thinking Optimization\",\n \"thinkingOptimizerDescription\": \"Automatically enable Adaptive Thinking for Opus/Sonnet, and inject Extended Thinking for legacy models\",\n \"cacheInjection\": \"Cache Injection\",\n \"cacheInjectionDescription\": \"Automatically inject cache breakpoints at key positions in requests to reduce duplicate token billing\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 minutes\",\n \"cacheTtl1h\": \"1 hour\"\n },\n \"logConfig\": {\n \"title\": \"Log Management\",\n \"description\": \"Control log output level\",\n \"enabled\": \"Enable Logging\",\n \"enabledDescription\": \"Master switch, all logging will be disabled when turned off\",\n \"level\": \"Log Level\",\n \"levelDescription\": \"Set the minimum log level to output\",\n \"levels\": {\n \"error\": \"Error\",\n \"warn\": \"Warning\",\n \"info\": \"Info\",\n \"debug\": \"Debug\",\n \"trace\": \"Trace\"\n },\n \"levelHint\": \"Log level descriptions:\",\n \"levelDesc\": {\n \"error\": \"Critical errors only\",\n \"warn\": \"Errors + warnings\",\n \"info\": \"General operation info (default)\",\n \"debug\": \"Detailed info including SSE stream and request/response\",\n \"trace\": \"All logs, most verbose\"\n }\n }\n },\n \"language\": \"Language\",\n \"languageHint\": \"Preview interface language immediately after switching, takes effect permanently after saving.\",\n \"theme\": \"Theme\",\n \"themeHint\": \"Choose the appearance theme for the app, takes effect immediately.\",\n \"themeLight\": \"Light\",\n \"themeDark\": \"Dark\",\n \"themeSystem\": \"System\",\n \"importExport\": \"SQL Import/Export\",\n \"importExportHint\": \"Import or export database SQL backups for migration or restore (import supports only backups exported by OpenSunstar).\",\n \"exportConfig\": \"Export SQL Backup\",\n \"selectConfigFile\": \"Select SQL File\",\n \"noFileSelected\": \"No configuration file selected.\",\n \"import\": \"Import\",\n \"importing\": \"Importing...\",\n \"importSuccess\": \"Import Successful!\",\n \"importFailed\": \"Import Failed\",\n \"syncLiveFailed\": \"Imported, but failed to sync to the current provider. Please reselect the provider manually.\",\n \"importPartialSuccess\": \"Config imported, but failed to sync to the current provider.\",\n \"importPartialHint\": \"Please manually reselect the provider to refresh the live configuration.\",\n \"configExported\": \"Config exported to:\",\n \"exportFailed\": \"Export failed\",\n \"selectFileFailed\": \"Please choose a valid SQL backup file\",\n \"configCorrupted\": \"SQL file may be corrupted or invalid\",\n \"backupId\": \"Backup ID\",\n \"backupManager\": {\n \"title\": \"Database Backups\",\n \"description\": \"Automatic database snapshots for restoring to a previous state\",\n \"empty\": \"No backups yet\",\n \"restore\": \"Restore\",\n \"restoring\": \"Restoring...\",\n \"confirmTitle\": \"Confirm Restore\",\n \"confirmMessage\": \"Restoring this backup will overwrite the current database. A safety backup will be created first.\",\n \"restoreSuccess\": \"Restore successful! Safety backup created\",\n \"restoreFailed\": \"Restore failed\",\n \"safetyBackupId\": \"Safety Backup ID\",\n \"intervalLabel\": \"Auto-backup Interval\",\n \"retainLabel\": \"Backup Retention\",\n \"intervalDisabled\": \"Disabled\",\n \"intervalHours\": \"{{hours}} hours\",\n \"intervalDays\": \"{{days}} days\",\n \"rename\": \"Rename\",\n \"renameSuccess\": \"Backup renamed\",\n \"renameFailed\": \"Rename failed\",\n \"namePlaceholder\": \"Enter new name\",\n \"createBackup\": \"Backup Now\",\n \"creating\": \"Backing up...\",\n \"createSuccess\": \"Backup created successfully\",\n \"createFailed\": \"Backup failed\",\n \"delete\": \"Delete\",\n \"deleting\": \"Deleting...\",\n \"deleteSuccess\": \"Backup deleted\",\n \"deleteFailed\": \"Delete failed\",\n \"deleteConfirmTitle\": \"Confirm Delete\",\n \"deleteConfirmMessage\": \"This backup will be permanently deleted. This action cannot be undone.\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV Cloud Sync\",\n \"description\": \"Sync database and skill configurations across devices via WebDAV.\",\n \"baseUrl\": \"WebDAV Server URL\",\n \"baseUrlPlaceholder\": \"https://dav.example.com/dav/\",\n \"username\": \"WebDAV Account\",\n \"usernamePlaceholder\": \"Email or username\",\n \"password\": \"WebDAV Password\",\n \"passwordPlaceholder\": \"App password\",\n \"remoteRoot\": \"Remote Root Directory\",\n \"profile\": \"Sync Profile Name\",\n \"autoSync\": \"Auto Sync\",\n \"autoSyncHint\": \"When enabled, each database change triggers an automatic WebDAV upload.\",\n \"test\": \"Test Connection\",\n \"testing\": \"Testing...\",\n \"testSuccess\": \"Connection successful\",\n \"testFailed\": \"Connection failed: {{error}}\",\n \"save\": \"Save Config\",\n \"saving\": \"Saving...\",\n \"saveFailed\": \"Failed to save config: {{error}}\",\n \"upload\": \"Upload to Cloud\",\n \"uploading\": \"Uploading...\",\n \"uploadSuccess\": \"Uploaded to WebDAV\",\n \"uploadFailed\": \"Upload failed: {{error}}\",\n \"autoSyncFailedToast\": \"Auto sync failed: {{error}}\",\n \"download\": \"Download from Cloud\",\n \"downloading\": \"Downloading...\",\n \"downloadSuccess\": \"Downloaded and restored from WebDAV\",\n \"downloadFailed\": \"Download failed: {{error}}\",\n \"lastSync\": \"Last sync: {{time}}\",\n \"autoSyncLastErrorTitle\": \"Last auto sync failed\",\n \"autoSyncLastErrorHint\": \"Please check network or WebDAV settings. Auto sync will retry on future changes.\",\n \"missingUrl\": \"Please enter the WebDAV server URL\",\n \"presets\": {\n \"label\": \"Provider\",\n \"jianguoyun\": \"Jianguoyun\",\n \"jianguoyunHint\": \"Generate an \\\"App Password\\\" in Jianguoyun security settings. Do not use your login password.\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"Replace your-server with your Nextcloud domain and USERNAME with your username.\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Install and enable the WebDAV Server package in Synology Package Center first.\",\n \"custom\": \"Custom\"\n },\n \"remoteRootDefault\": \"Default: OpenSunstar-sync\",\n \"profileDefault\": \"Default: default\",\n \"saveAndTestSuccess\": \"Config saved, connection OK\",\n \"saveAndTestFailed\": \"Config saved, but connection test failed: {{error}}\",\n \"noRemoteData\": \"No sync data found on the remote server\",\n \"incompatibleVersion\": \"Remote data is incompatible (protocol v{{protocolVersion}}, database {{dbCompatVersion}}). This client supports protocol v2 / db-v6.\",\n \"unsaved\": \"Unsaved\",\n \"saved\": \"Saved\",\n \"unsavedChanges\": \"Please save config first\",\n \"saveBeforeSync\": \"Save configuration first to enable upload/download.\",\n \"fetchingRemote\": \"Fetching remote info...\",\n \"fetchRemoteFailed\": \"Failed to fetch remote info. Please check configuration and network.\",\n \"confirmDownload\": {\n \"title\": \"Restore from Cloud\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"path\": \"Remote path\",\n \"dbCompat\": \"DB compatibility\",\n \"artifacts\": \"Contents\",\n \"legacyNotice\": \"A legacy remote path was detected. After restoring, the next upload will write to the new v2/db-v6 path.\",\n \"warning\": \"This will overwrite all local data and skill configurations\",\n \"confirm\": \"Confirm Restore\"\n },\n \"confirmUpload\": {\n \"title\": \"Upload to Cloud\",\n \"content\": \"The following will be synced to the WebDAV server:\",\n \"dbItem\": \"Database (all provider configs and data)\",\n \"skillsItem\": \"Skills (all custom skills)\",\n \"targetPath\": \"Target path\",\n \"existingData\": \"Existing cloud data\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"path\": \"Remote path\",\n \"dbCompat\": \"DB compatibility\",\n \"warning\": \"This will overwrite existing sync data on the remote server\",\n \"legacyNotice\": \"Legacy remote data was detected. This upload will write to the new v2/db-v6 path and will not overwrite the legacy path.\",\n \"confirm\": \"Confirm Upload\"\n }\n },\n \"syncType\": {\n \"label\": \"Sync Type\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 Compatible\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"Provider\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"Use IAM Access Key with s3:PutObject/GetObject/HeadObject permissions. Region: us-east-1, ap-northeast-1, etc.\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"Custom endpoint required, e.g. http://minio.local:9000. Region can be 'us-east-1'.\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com. Region: 'auto'.\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com. Region: cn-hangzhou, cn-shanghai, etc.\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com. Region: ap-guangzhou, ap-beijing, etc.\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com. Region: cn-north-4, cn-east-3, etc.\",\n \"custom\": \"S3 Compatible (Custom)\",\n \"customHint\": \"Any S3-compatible service. Custom endpoint required.\"\n },\n \"region\": \"Region\",\n \"regionPlaceholder\": \"e.g. us-east-1\",\n \"bucket\": \"Bucket\",\n \"bucketPlaceholder\": \"e.g. my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"e.g. AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"Leave unchanged to keep the existing secret\",\n \"endpoint\": \"Endpoint (optional for AWS)\",\n \"endpointHint\": \"Required for most S3-compatible services\",\n \"endpointPlaceholder\": \"e.g. https://s3-compatible.example.com\",\n \"remoteRoot\": \"Remote Root Directory\",\n \"remoteRootDefault\": \"Default: OpenSunstar-sync\",\n \"profile\": \"Sync Profile Name\",\n \"profileDefault\": \"Default: default\",\n \"autoSync\": \"Auto Sync\",\n \"autoSyncHint\": \"When enabled, each database change triggers an automatic S3 upload.\",\n \"enabled\": \"Enable S3 Sync\",\n \"enabledHint\": \"Turn on S3 sync for manual and automatic cloud operations.\",\n \"mutualExclusionTitle\": \"Switch Sync Type\",\n \"mutualExclusionMessage\": \"Enabling S3 sync will disable the current WebDAV sync. Continue?\",\n \"mutualExclusionMessageReverse\": \"Enabling WebDAV sync will disable the current S3 sync. Continue?\",\n \"mutualExclusionFailed\": \"Failed to switch sync type: {{error}}\",\n \"testConnection\": \"Test Connection\",\n \"connectionOk\": \"S3 connection successful\",\n \"test\": \"Test Connection\",\n \"testing\": \"Testing...\",\n \"testSuccess\": \"S3 connection successful\",\n \"testFailed\": \"S3 connection failed: {{error}}\",\n \"save\": \"Save Config\",\n \"saving\": \"Saving...\",\n \"saveFailed\": \"Failed to save config: {{error}}\",\n \"saveAndTestSuccess\": \"Config saved, S3 connection OK\",\n \"saveAndTestFailed\": \"Config saved, but S3 connection test failed: {{error}}\",\n \"upload\": \"Upload to Cloud\",\n \"uploading\": \"Uploading...\",\n \"uploadSuccess\": \"Uploaded to S3\",\n \"uploadFailed\": \"S3 upload failed: {{error}}\",\n \"autoSyncFailedToast\": \"S3 auto sync failed: {{error}}\",\n \"download\": \"Download from Cloud\",\n \"downloading\": \"Downloading...\",\n \"downloadSuccess\": \"Downloaded and restored from S3\",\n \"downloadFailed\": \"S3 download failed: {{error}}\",\n \"lastSync\": \"Last sync: {{time}}\",\n \"autoSyncLastErrorTitle\": \"Last S3 auto sync failed\",\n \"autoSyncLastErrorHint\": \"Please check network or S3 settings. Auto sync will retry on future changes.\",\n \"missingBucket\": \"Please enter the S3 bucket\",\n \"noRemoteData\": \"No sync data found in the S3 bucket\",\n \"incompatibleVersion\": \"Remote data is incompatible (version {{version}}). This client supports protocol v2 / db-v6.\",\n \"unsaved\": \"Unsaved\",\n \"saved\": \"Saved\",\n \"unsavedChanges\": \"Please save config first\",\n \"saveBeforeSync\": \"Save configuration first to enable upload/download.\",\n \"fetchingRemote\": \"Fetching remote info...\",\n \"fetchRemoteFailed\": \"Failed to fetch remote info. Please check configuration and network.\",\n \"notConfigured\": \"S3 sync is not configured\",\n \"disabled\": \"S3 sync is disabled\",\n \"confirmDownload\": {\n \"title\": \"Restore from S3\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"artifacts\": \"Contents\",\n \"warning\": \"This will overwrite all local data and skill configurations\",\n \"confirm\": \"Confirm Restore\"\n },\n \"confirmUpload\": {\n \"title\": \"Upload to S3\",\n \"content\": \"The following will be synced to the S3 bucket:\",\n \"dbItem\": \"Database (all provider configs and data)\",\n \"skillsItem\": \"Skills (all custom skills)\",\n \"targetPath\": \"Target object path\",\n \"existingData\": \"Existing cloud data\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"warning\": \"This will overwrite existing sync data at the S3 path\",\n \"confirm\": \"Confirm Upload\"\n }\n },\n \"autoReload\": \"Data refreshed\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"Window Behavior\",\n \"windowBehaviorHint\": \"Configure window minimize and Claude plugin integration policies.\",\n \"notificationPreferences\": \"Notification Preferences\",\n \"budgetAlertNotifications\": \"Budget Overrun Notifications\",\n \"budgetAlertNotificationsDescription\": \"Send system notifications for Critical / Emergency budget alerts (warnings remain in-app only)\",\n \"failoverAlertNotifications\": \"Failover Notifications\",\n \"failoverAlertNotificationsDescription\": \"Send system notifications when provider auto-failover completes\",\n \"trayBadgeNotifications\": \"Tray Badge Alert\",\n \"trayBadgeNotificationsDescription\": \"Switch tray icon to alert state and show alert item at the top of the menu when unread alerts exist\",\n \"workspaceAlertFirst\": \"Workspace Alerts First\",\n \"workspaceAlertFirstDescription\": \"Show alert cards at the top of Today Workspace when enabled; when disabled, alerts only reach you via tray/system notifications\",\n \"launchOnStartup\": \"Launch on Startup\",\n \"launchOnStartupDescription\": \"Automatically run OpenSunstar when system starts\",\n \"silentStartup\": \"Silent Startup\",\n \"silentStartupDescription\": \"Start in background mode without showing main window\",\n \"autoLaunchFailed\": \"Failed to set auto-launch\",\n \"minimizeToTray\": \"Minimize to tray on close\",\n \"minimizeToTrayDescription\": \"When checked, clicking the close button will hide to system tray, otherwise the app will exit directly.\",\n \"useAppWindowControls\": \"Enable app-level window controls\",\n \"useAppWindowControlsDescription\": \"Use built-in minimize, maximize/restore, and close buttons in the app header.\",\n \"enableClaudePluginIntegration\": \"Apply to Claude Code extension\",\n \"enableClaudePluginIntegrationDescription\": \"When enabled, the VS Code Claude Code extension provider will switch with this app\",\n \"skipClaudeOnboarding\": \"Skip Claude Code first-run confirmation\",\n \"skipClaudeOnboardingDescription\": \"When enabled, Claude Code will skip the first-run confirmation\",\n \"codexAuth\": \"Codex App Enhancements\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Protect official Codex login\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"Always on: provider switching and local proxy routing never overwrite or store official Codex login credentials.\",\n \"appVisibility\": {\n \"title\": \"Homepage Display\",\n \"description\": \"Choose which apps to show on the homepage\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skill Storage Location\",\n \"description\": \"Choose where OpenSunstar stores the master copies of your skills\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"Skills are stored in ~/.OpenSunstar/skills/ and synced to each app via symlink or copy.\",\n \"unifiedHint\": \"Skills are stored in ~/.agents/skills/, the Agent Skills open standard. Compatible tools (Claude Code, Codex, Gemini CLI, etc.) discover skills here natively.\",\n \"confirmTitle\": \"Migrate Skill Storage\",\n \"confirmMessage\": \"{{count}} skill(s) will be moved to the new location. Continue?\",\n \"migrationSuccess\": \"Successfully migrated {{count}} skill(s)\",\n \"migrationPartial\": \"Migrated {{migrated}} skill(s), {{errors}} error(s). Check logs for details.\"\n },\n \"skillSync\": {\n \"title\": \"Skill Sync Method\",\n \"description\": \"Choose how to sync Skills files\",\n \"symlink\": \"Symlink\",\n \"copy\": \"Copy Files\",\n \"symlinkHint\": \"Symlinks save disk space and enable real-time sync. Note: May require admin privileges or Developer Mode on Windows\"\n },\n \"terminal\": {\n \"title\": \"Preferred Terminal\",\n \"description\": \"Choose which terminal app to use when clicking the terminal button\",\n \"fallbackHint\": \"If the selected terminal is unavailable, the system default will be used\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"Command Prompt\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"Configuration Directory Override (Advanced)\",\n \"configDirectoryDescription\": \"When using Claude Code or Codex in environments like WSL, you can manually specify the configuration directory to the one in WSL to keep provider data consistent with the main environment.\",\n \"appConfigDir\": \"OpenSunstar Configuration Directory\",\n \"appConfigDirDescription\": \"Customize the storage location for OpenSunstar configuration (point to cloud sync folder to enable config sync)\",\n \"browsePlaceholderApp\": \"e.g., C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code Configuration Directory\",\n \"claudeConfigDirDescription\": \"Override Claude configuration directory (settings.json) and keep claude.json (MCP) alongside it.\",\n \"codexConfigDir\": \"Codex Configuration Directory\",\n \"codexConfigDirDescription\": \"Override Codex configuration directory.\",\n \"geminiConfigDir\": \"Gemini Configuration Directory\",\n \"geminiConfigDirDescription\": \"Override Gemini configuration directory (.env).\",\n \"opencodeConfigDir\": \"OpenCode Configuration Directory\",\n \"opencodeConfigDirDescription\": \"Override OpenCode configuration directory (opencode.json).\",\n \"openclawConfigDir\": \"OpenClaw Configuration Directory\",\n \"openclawConfigDirDescription\": \"Override OpenClaw configuration directory (openclaw.json).\",\n \"hermesConfigDir\": \"Hermes Configuration Directory\",\n \"hermesConfigDirDescription\": \"Override Hermes configuration directory (config.yaml).\",\n \"browsePlaceholderClaude\": \"e.g., /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"e.g., /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"e.g., /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"e.g., /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"e.g., /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"e.g., /home/<your-username>/.hermes\",\n \"browseDirectory\": \"Browse Directory\",\n \"resetDefault\": \"Reset to default directory (takes effect after saving)\",\n \"checkForUpdates\": \"Check for Updates\",\n \"updateTo\": \"Update to v{{version}}\",\n \"updating\": \"Updating...\",\n \"checking\": \"Checking...\",\n \"upToDate\": \"Up to Date\",\n \"aboutHint\": \"View version information and update status.\",\n \"portableMode\": \"Portable mode: updates require manual download.\",\n \"updateAvailable\": \"New version available: {{version}}\",\n \"updateBadge\": \"Update available\",\n \"updateFailed\": \"Update installation failed, attempted to open download page.\",\n \"checkUpdateFailed\": \"Failed to check for updates, please try again later.\",\n \"openReleaseNotesFailed\": \"Failed to open release notes\",\n \"releaseNotes\": \"Release Notes\",\n \"viewReleaseNotes\": \"View release notes for this version\",\n \"viewCurrentReleaseNotes\": \"View current version release notes\",\n \"officialWebsite\": \"Official Website\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"Manual Install Commands\",\n \"oneClickInstallHint\": \"Install or upgrade Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes\",\n \"localEnvCheck\": \"Local environment check\",\n \"updateAllTools\": \"Update All ({{count}})\",\n \"currentVersion\": \"Current Version\",\n \"latestVersion\": \"Latest Version\",\n \"updateAvailableShort\": \"Update\",\n \"toolInstall\": \"Install\",\n \"toolUpdate\": \"Update\",\n \"toolReady\": \"Ready\",\n \"toolActionDone\": \"{{action}} completed for {{count}} tool(s)\",\n \"toolActionPartial\": \"{{action}} succeeded for {{succeeded}}, failed for {{failed}}\",\n \"toolActionFailed\": \"Install/update command failed\",\n \"toolNotRunnable\": \"Installed but not runnable (no version detected)\",\n \"toolActionVersionUnchangedTitle\": \"Version did not change\",\n \"toolActionVersionUnchanged\": \"Still on {{version}} (latest: {{latest}}). The updater may have reported success without applying the update.\",\n \"toolActionInstalledNotRunnable\": \"Installed, but it can't run in the current environment — please check\",\n \"installedNotRunnable\": \"Installed · can't run\",\n \"toolCheckEnv\": \"Check environment\",\n \"toolDiagnose\": \"Diagnose installs\",\n \"toolDiagnosing\": \"Diagnosing…\",\n \"toolConflictTitle\": \"Multiple installations detected\",\n \"toolConflictHint\": \"The command line uses the one marked Default; an upgrade may have written to another.\",\n \"toolConflictDefault\": \"Default\",\n \"toolConflictNotRunnable\": \"can't run\",\n \"toolDiagnoseNoConflict\": \"No conflicting installations found\",\n \"toolDiagnoseFailed\": \"Diagnosis failed\",\n \"toolUpgradeConfirmTitle\": \"Confirm upgrade target\",\n \"toolUpgradeConfirmHint\": \"Multiple installations detected. This upgrade won't update all of them; refer to each tool below for what it actually targets.\",\n \"toolUpgradeWillRun\": \"Will run:\",\n \"toolUpgradeConfirmBtn\": \"Confirm upgrade\",\n \"toolUpgradeUnanchoredHint\": \"Can't determine which install your command line uses; will run the default upgrade command (may install to the first npm on PATH).\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"Flag\",\n \"installCommandsCopied\": \"Install commands copied\",\n \"installCommandsCopyFailed\": \"Copy failed, please copy manually.\",\n \"importFailedError\": \"Import config failed: {{message}}\",\n \"exportFailedError\": \"Export config failed:\",\n \"restartRequired\": \"Restart Required\",\n \"restartRequiredMessage\": \"Modifying the OpenSunstar configuration directory requires restarting the application to take effect. Restart now?\",\n \"restartNow\": \"Restart Now\",\n \"restartLater\": \"Restart Later\",\n \"restartFailed\": \"Application restart failed, please manually close and reopen.\",\n \"devModeRestartHint\": \"Dev Mode: Automatic restart not supported, please manually restart the application.\",\n \"saving\": \"Saving...\",\n \"globalProxy\": {\n \"label\": \"Global Proxy\",\n \"hint\": \"Proxy all requests (API, Skills download, etc.). When local routing is enabled, app traffic is also routed through this proxy. Leave empty for direct connection.\",\n \"username\": \"Username (optional)\",\n \"password\": \"Password (optional)\",\n \"test\": \"Test Connection\",\n \"scan\": \"Scan Local Proxies\",\n \"clear\": \"Clear\",\n \"scanFailed\": \"Scan failed: {{error}}\",\n \"saved\": \"Proxy settings saved\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"testSuccess\": \"Connected! Latency {{latency}}ms\",\n \"testFailed\": \"Connection failed: {{error}}\",\n \"pricingDefaultsTitle\": \"Pricing Defaults\",\n \"pricingDefaultsDescription\": \"Set the default multiplier and pricing model source per app.\",\n \"pricingAppLabel\": \"App\",\n \"defaultCostMultiplierLabel\": \"Default Multiplier\",\n \"defaultCostMultiplierHint\": \"Multiplier for cost calculation, decimals supported.\",\n \"pricingModelSourceLabel\": \"Pricing Model Source\",\n \"pricingModelSourceRequest\": \"Request model\",\n \"pricingModelSourceResponse\": \"Response model\",\n \"pricingSave\": \"Save Pricing Defaults\",\n \"pricingSaved\": \"Pricing defaults saved\",\n \"pricingSaveFailed\": \"Failed to save pricing defaults: {{error}}\",\n \"pricingLoadFailed\": \"Failed to load pricing defaults: {{error}}\",\n \"defaultCostMultiplierRequired\": \"Default multiplier is required\",\n \"defaultCostMultiplierInvalid\": \"Invalid multiplier format\"\n },\n \"saveFailedGeneric\": \"Save failed, please try again\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"Session Manager\",\n \"subtitle\": \"Manage Claude Code, Codex, OpenCode, OpenClaw, Hermes and Gemini CLI sessions\",\n \"searchPlaceholder\": \"Search by content, directory, or ID\",\n \"searchSessions\": \"Search sessions\",\n \"providerFilterAll\": \"All\",\n \"sessionList\": \"Sessions\",\n \"manageBatchTooltip\": \"Enter batch management\",\n \"exitBatchModeTooltip\": \"Exit batch management\",\n \"batchModeHint\": \"Select sessions to export or delete\",\n \"exportSelected\": \"Export Selected\",\n \"batchExporting\": \"Exporting...\",\n \"batchExportSuccess\": \"Exported {{count}} sessions\",\n \"batchExportFailed\": \"Batch export failed, please try again\",\n \"selectForBatch\": \"Select session\",\n \"selectedCount\": \"{{count}} selected\",\n \"selectAllFiltered\": \"Select all\",\n \"clearFilteredSelection\": \"Clear selection\",\n \"clearSelection\": \"Clear\",\n \"deleteSelected\": \"Delete\",\n \"batchDeleting\": \"Deleting...\",\n \"loadingSessions\": \"Loading sessions...\",\n \"noSessions\": \"No sessions found\",\n \"selectSession\": \"Select a session to view details\",\n \"noSummary\": \"No summary available\",\n \"lastActive\": \"Last active\",\n \"projectDir\": \"Project directory\",\n \"sourcePath\": \"Source file\",\n \"copyResumeCommand\": \"Copy resume command\",\n \"resumeCommandCopied\": \"Resume command copied\",\n \"openInTerminal\": \"Resume in terminal\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"Copy only\",\n \"terminalLaunched\": \"Terminal launched\",\n \"openFailed\": \"Failed to launch terminal\",\n \"resumeFallbackCopied\": \"Resume command copied for manual use\",\n \"copyProjectDir\": \"Copy directory\",\n \"projectDirCopied\": \"Directory copied\",\n \"copySourcePath\": \"Copy source file\",\n \"sourcePathCopied\": \"Source file copied\",\n \"delete\": \"Delete session\",\n \"deleting\": \"Deleting...\",\n \"deleteTooltip\": \"Permanently delete this local session record\",\n \"deleteConfirmTitle\": \"Delete session\",\n \"deleteConfirmMessage\": \"This will permanently delete the local session \\\"{{title}}\\\"\\nSession ID: {{sessionId}}\\n\\nThis action cannot be undone.\",\n \"deleteConfirmAction\": \"Delete session\",\n \"sessionDeleted\": \"Session deleted\",\n \"deleteFailed\": \"Failed to delete session: {{error}}\",\n \"batchDeleteConfirmTitle\": \"Delete selected sessions\",\n \"batchDeleteConfirmMessage\": \"This will permanently delete {{count}} selected local sessions.\\n\\nThis action cannot be undone.\",\n \"batchDeleteConfirmAction\": \"Delete selected\",\n \"batchDeleteSuccess\": \"Deleted {{count}} sessions\",\n \"batchDeleteFailed\": \"{{failed}} sessions could not be deleted\",\n \"batchDeleteRequestFailed\": \"Batch delete failed. Please try again later.\",\n \"loadingMessages\": \"Loading transcript...\",\n \"emptySession\": \"No messages available\",\n \"clickToCopyPath\": \"Click to copy path\",\n \"tocTitle\": \"Contents\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} days ago\",\n \"roleUser\": \"User\",\n \"roleSystem\": \"System\",\n \"roleTool\": \"Tool\",\n \"resume\": \"Resume Session\",\n \"resumeTooltip\": \"Resume this session in terminal\",\n \"noResumeCommand\": \"This session cannot be resumed\",\n \"copyCommand\": \"Copy Command\",\n \"copyMessage\": \"Copy Message\",\n \"messageCopied\": \"Message copied\",\n \"conversationHistory\": \"Conversation History\",\n \"expandContent\": \"Expand full content\",\n \"collapseContent\": \"Collapse\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"Received provider switch event:\",\n \"setupListenerFailed\": \"Failed to setup provider switch listener:\",\n \"updateProviderFailed\": \"Update provider failed:\",\n \"autoImportFailed\": \"Auto import default configuration failed:\",\n \"openLinkFailed\": \"Failed to open link:\",\n \"getVersionFailed\": \"Failed to get version info:\",\n \"loadSettingsFailed\": \"Failed to load settings:\",\n \"getConfigPathFailed\": \"Failed to get config path:\",\n \"getConfigDirFailed\": \"Failed to get config directory:\",\n \"detectPortableFailed\": \"Failed to detect portable mode:\",\n \"saveSettingsFailed\": \"Failed to save settings:\",\n \"updateFailed\": \"Update failed:\",\n \"checkUpdateFailed\": \"Check for updates failed:\",\n \"openConfigFolderFailed\": \"Failed to open config folder:\",\n \"selectConfigDirFailed\": \"Failed to select config directory:\",\n \"getDefaultConfigDirFailed\": \"Failed to get default config directory:\",\n \"openReleaseNotesFailed\": \"Failed to open release notes:\"\n },\n \"providerForm\": {\n \"supplierName\": \"Provider Name\",\n \"supplierNameRequired\": \"Provider Name *\",\n \"supplierNamePlaceholder\": \"e.g., Anthropic Official\",\n \"websiteUrl\": \"Website URL\",\n \"websiteUrlPlaceholder\": \"https://example.com (optional)\",\n \"apiEndpoint\": \"API Endpoint\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"Manage & Test\",\n \"configContent\": \"Config Content\",\n \"officialNoApiKey\": \"Official login does not require API Key, save directly\",\n \"codexOfficialNoApiKey\": \"Official does not require API Key, save directly\",\n \"codexApiKeyAutoFill\": \"Just fill in here, auth.json below will be auto-filled\",\n \"apiKeyAutoFill\": \"Just fill in here, config below will be auto-filled\",\n \"cnOfficialApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"aggregatorApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"thirdPartyApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"customApiKeyHint\": \"💡 Custom configuration requires manually filling all necessary fields\",\n \"omoHint\": \"💡 OMO config manages Agent model assignments and supports both oh-my-openagent.jsonc and oh-my-opencode.jsonc\",\n \"officialHint\": \"💡 Official provider uses browser login, no API Key needed\",\n \"getApiKey\": \"Get API Key\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode is an official partner of OpenSunstar. Register using this link and enter \\\"OpenSunstar\\\" promo code during recharge to get 10% off\",\n \"apikeyfun\": \"APIKEY.FUN offers a special deal for OpenSunstar users. Register through the exclusive link to enjoy up to permanent 5% off top-ups.\",\n \"apinebula\": \"APINEBULA offers OpenSunstar users a special discount: register using the link and enter the \\\"OpenSunstar\\\" promo code during your first top-up to get 10% off.\",\n \"atlascloud\": \"Atlas Cloud is a full-modal AI inference platform that gives developers one API for video generation, image generation, and LLM access. Check out its new Coding Plan promotion for more budget-friendly API access.\",\n \"sudocode\": \"SudoCode is a global AI model aggregation service. One API key works across multiple models, with presets for Claude Code, Codex, Gemini CLI, OpenClaw, and more.\",\n \"patewayai\": \"PatewayAI offers special benefits for OpenSunstar users. Register via this link to receive $3 credit.\",\n \"claudeapi\": \"ClaudeAPI offers special benefits for OpenSunstar users. Register via this link to claim test credits.\",\n \"claudecn\": \"ClaudeCN is an enterprise-grade AI gateway operated by a registered company, supporting enterprise procurement processes with corporate payments, contracts, and compliance guarantees.\",\n \"runapi\": \"RunAPI offers special benefits for OpenSunstar users. Register via this link and contact customer support to claim ¥14 free credit.\",\n \"minimax_cn\": \"MiniMax Coding Plan Special Offer, Starter from ¥9.9\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday, Starter is now $2/mo (80% OFF!)\",\n \"dmxapi\": \"Claude Code exclusive model 66% OFF now!\",\n \"cubence\": \"Cubence is an official partner of OpenSunstar. Register using this link and enter \\\"OPENSUNSTAR\\\" promo code during recharge to get 10% off every top-up\",\n \"aigocode\": \"AIGoCode is an official partner of OpenSunstar. Register using this link and get 10% bonus credit on your first top-up!\",\n \"rightcode\": \"RightCode is an official partner of OpenSunstar. Register using this link and get 5% bonus credit on every top-up!\",\n \"aicodemirror\": \"AICodeMirror is an official partner of OpenSunstar. Register using this link to get 20% off!\",\n \"crazyrouter\": \"CrazyRouter offers an exclusive bonus for OpenSunstar users — 30% extra credit on your first top-up!\",\n \"sssaicode\": \"SSAI Code offers an exclusive bonus for OpenSunstar users — $10 extra credit on every top-up!\",\n \"siliconflow\": \"SiliconFlow is an official partner of OpenSunstar\",\n \"ucloud\": \"Compshare offers an exclusive bonus for OpenSunstar users — register via this link to get ¥5 platform trial credit!\",\n \"micu\": \"Micu is an official partner of OpenSunstar\",\n \"ctok\": \"Join the CTok community on the official website and subscribe to a plan.\",\n \"shengsuanyun\": \"Shengsuanyun offers exclusive benefits for OpenSunstar users. New users who register via this link get ¥10 free credits and 10% bonus on first top-up!\",\n \"lemondata\": \"Lemon Code offers a special promotion for OpenSunstar users. Sign up via this link to receive $1 in free credits.\",\n \"doubaoseed\": \"DouBao offers exclusive benefits for OpenSunstar users: register via this link to get 500K tokens of inference credits for all DouBao text models and 5M tokens of free Seedance 2.0 credits.\",\n \"volcengine_agentplan\": \"Volcengine Ark Agent Plan offers exclusive benefits for OpenSunstar users: subscribe via this link, starting from ¥40/month for new customers.\",\n \"byteplus\": \"Register via this link to get 500,000 tokens of free inference quota per model.\",\n \"ccsub\": \"CCSub is a stable, affordable AI API relay — a drop-in replacement for Claude.ai & OpenAI subscriptions, with one key for all models at ~30% of direct API cost.\",\n \"unity2\": \"Unity2.ai offers exclusive benefits for OpenSunstar users: register via this link to get $2 in credits, plus another $10 for joining the official group — up to $12 in free credits!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"Parameter Config - {{name}} *\",\n \"mainModel\": \"Main Model (optional)\",\n \"mainModelPlaceholder\": \"e.g., GLM-4.6\",\n \"fastModel\": \"Fast Model (optional)\",\n \"fastModelPlaceholder\": \"e.g., GLM-4.5-Air\",\n \"modelHint\": \"💡 Leave blank to use provider's default model\",\n \"apiHint\": \"💡 Fill in Claude API compatible service endpoint, avoid trailing slash\",\n \"apiHintOAI\": \"💡 Fill in OpenAI Chat Completions compatible service endpoint, avoid trailing slash\",\n \"apiHintGeminiNative\": \"💡 Prefer a Gemini Native base URL such as https://generativelanguage.googleapis.com or https://generativelanguage.googleapis.com/v1beta; the proxy will append models/*:generateContent automatically\",\n \"codexApiHint\": \"💡 Fill in service endpoint compatible with OpenAI Response format\",\n \"fillSupplierName\": \"Please fill in provider name\",\n \"fillConfigContent\": \"Please fill in configuration content\",\n \"fillParameter\": \"Please fill in {{label}}\",\n \"fillTemplateValue\": \"Please fill in {{label}}\",\n \"endpointRequired\": \"API endpoint is required for non-official providers\",\n \"apiKeyRequired\": \"API Key is required for non-official providers\",\n \"softValidation\": {\n \"title\": \"Configuration has the following issues\",\n \"hint\": \"Save anyway? Switching to this provider may fail; you can fill these in later.\",\n \"saveAnyway\": \"Save anyway\"\n },\n \"configJsonError\": \"Config JSON format error, please check syntax\",\n \"authJsonRequired\": \"auth.json must be a JSON object\",\n \"authJsonError\": \"auth.json format error, please check JSON syntax\",\n \"fillAuthJson\": \"Please fill in auth.json configuration\",\n \"fillApiKey\": \"Please fill in OPENAI_API_KEY\",\n \"visitWebsite\": \"Visit {{url}}\",\n \"anthropicModel\": \"Main Model\",\n \"anthropicSmallFastModel\": \"Fast Model\",\n \"apiFormat\": \"API Format\",\n \"apiFormatHint\": \"Select the input format for the provider's API\",\n \"customUserAgent\": \"Custom User-Agent\",\n \"customUserAgentHint\": \"Only takes effect when local routing/proxy takeover is enabled; replaces the User-Agent in requests forwarded to the provider API.\",\n \"customUserAgentInvalid\": \"User-Agent must not contain control characters (e.g. line breaks); otherwise it will be ignored.\",\n \"customUserAgentPresets\": \"Presets\",\n \"fullUrlLabel\": \"Full URL\",\n \"fullUrlEnabled\": \"Full URL Mode\",\n \"fullUrlDisabled\": \"Mark as Full URL\",\n \"fullUrlHint\": \"💡 Enter the full request URL. This mode requires routing to be enabled, and routing will use the URL as-is without appending a path\",\n \"fullUrlHintGeminiNative\": \"💡 In Gemini Native full URL mode, two inputs are supported: 1. official/structured Gemini URLs, which will still be normalized to the requested model and streaming method; 2. opaque custom relay URLs, which will be used mostly as-is with only query parameters appended\",\n \"apiFormatAnthropic\": \"Anthropic Messages (Native)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (Requires routing)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (Requires routing)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (Requires routing)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (Native)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (Requires routing)\",\n \"codexApiFormatHint\": \"Select the Codex API format actually supported by this provider; the config stays on Responses for newer Codex versions, while Chat Completions is converted through local routing.\",\n \"authField\": \"Auth Field\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN (Default)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"Select the authentication env variable name for the config\",\n \"apiHintResponses\": \"💡 Fill in OpenAI Responses API compatible service endpoint, avoid trailing slash\",\n \"anthropicDefaultHaikuModel\": \"Default Haiku Model\",\n \"anthropicDefaultSonnetModel\": \"Default Sonnet Model\",\n \"anthropicDefaultOpusModel\": \"Default Opus Model\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"Optional: Specify default Claude model to use, leave blank to use system default.\",\n \"modelMappingLabel\": \"Model Mapping\",\n \"modelMappingHint\": \"Display names only affect the /model menu; 1M is only a Claude Code context-capability declaration.\",\n \"modelRoleLabel\": \"Model role\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"Display name\",\n \"modelDisplayNamePlaceholder\": \"e.g. DeepSeek V4 Pro\",\n \"requestModelLabel\": \"Requested model\",\n \"modelOneMHeader\": \"Declare 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"Default fallback model\",\n \"fallbackModelHint\": \"Used only when a Claude Code request does not clearly map to Sonnet, Opus, or Haiku. Usually safe to leave blank.\",\n \"quickSetModels\": \"Quick Set\",\n \"quickSetSuccess\": \"Model name applied to all roles\",\n \"advancedOptionsToggle\": \"Advanced Options\",\n \"advancedOptionsHint\": \"Includes API format, auth field, and model mapping. Defaults work for most use cases.\",\n \"categoryOfficial\": \"Official\",\n \"categoryCnOfficial\": \"Opensource Official\",\n \"categoryAggregation\": \"Aggregation\",\n \"categoryThirdParty\": \"Third Party\",\n \"fetchModels\": \"Fetch Models\",\n \"fetchingModels\": \"Fetching...\",\n \"fetchModelsSuccess\": \"Found {{count}} models\",\n \"fetchModelsFailed\": \"Failed to fetch models\",\n \"fetchModelsEmpty\": \"No models found\",\n \"fetchModelsNeedApiKey\": \"Please fill in API Key first\",\n \"fetchModelsNeedEndpoint\": \"Please fill in API endpoint first\",\n \"fetchModelsNeedConfig\": \"Please fill in API endpoint and API Key first\",\n \"fetchModelsAuthFailed\": \"API Key is invalid or lacks permission\",\n \"fetchModelsNotSupported\": \"This provider does not support fetching model list\",\n \"fetchModelsEndpointNotFound\": \"No reachable models endpoint found. Please check the Base URL or confirm whether the provider exposes this API.\",\n \"fetchModelsTimeout\": \"Request timed out, please check network connection\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot Authentication\",\n \"authStatus\": \"Authentication Status\",\n \"authenticated\": \"Authenticated as {{username}}\",\n \"notAuthenticated\": \"Not authenticated\",\n \"loginWithGitHub\": \"Login with GitHub\",\n \"loginRequired\": \"Please login to GitHub Copilot first\",\n \"waitingForAuth\": \"Waiting for authorization...\",\n \"enterCode\": \"Please enter the code in your browser:\",\n \"logout\": \"Logout\",\n \"authSuccess\": \"GitHub Copilot authentication successful\",\n \"authFailed\": \"Authentication failed: {{error}}\",\n \"authTimeout\": \"Authentication timed out, please try again\",\n \"tokenExpired\": \"Token expired, please re-authenticate\",\n \"accountCount\": \"{{count}} account(s)\",\n \"selectAccount\": \"Select Account\",\n \"selectAccountPlaceholder\": \"Select a GitHub account\",\n \"useDefaultAccount\": \"Use default account\",\n \"loggedInAccounts\": \"Logged in accounts\",\n \"defaultAccount\": \"Default\",\n \"selected\": \"Selected\",\n \"removeAccount\": \"Remove account\",\n \"setAsDefault\": \"Set as default\",\n \"addAnotherAccount\": \"Add another account\",\n \"logoutAll\": \"Logout all accounts\",\n \"retry\": \"Retry\",\n \"copyCode\": \"Copy code\",\n \"migrationFailed\": \"Legacy auth migration failed: {{error}}\",\n \"loadModelsFailed\": \"Failed to load Copilot models\",\n \"deploymentType\": \"GitHub Deployment Type\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"e.g. company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"Auth status\",\n \"notAuthenticated\": \"Not authenticated\",\n \"loginWithChatGPT\": \"Sign in with ChatGPT\",\n \"loginRequired\": \"Please sign in to ChatGPT first\",\n \"waitingForAuth\": \"Waiting for authorization...\",\n \"enterCode\": \"Enter the code in your browser:\",\n \"accountCount\": \"{{count}} account(s)\",\n \"selectAccount\": \"Select account\",\n \"selectAccountPlaceholder\": \"Choose a ChatGPT account\",\n \"useDefaultAccount\": \"Use default account\",\n \"loggedInAccounts\": \"Logged in accounts\",\n \"defaultAccount\": \"Default\",\n \"selected\": \"Selected\",\n \"removeAccount\": \"Remove account\",\n \"setAsDefault\": \"Set as default\",\n \"addAnotherAccount\": \"Add another account\",\n \"logoutAll\": \"Logout all accounts\",\n \"retry\": \"Retry\",\n \"copyCode\": \"Copy code\",\n \"fastMode\": \"FAST mode\",\n \"fastModeDescription\": \"Send service_tier=\\\"priority\\\" for lower latency. Off by default — enabling it consumes your ChatGPT quota at a higher rate.\"\n },\n \"endpointTest\": {\n \"title\": \"API Endpoint Management\",\n \"endpoints\": \"endpoints\",\n \"autoSelect\": \"Auto Select\",\n \"testSpeed\": \"Test\",\n \"testing\": \"Testing\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"Done\",\n \"noEndpoints\": \"No endpoints\",\n \"failed\": \"Failed\",\n \"enterValidUrl\": \"Please enter a valid URL\",\n \"invalidUrlFormat\": \"Invalid URL format\",\n \"onlyHttps\": \"Only HTTP/HTTPS supported\",\n \"urlExists\": \"This URL already exists\",\n \"saveFailed\": \"Save failed, please try again\",\n \"loadEndpointsFailed\": \"Failed to load custom endpoints:\",\n \"addEndpointFailed\": \"Failed to add custom endpoint:\",\n \"removeEndpointFailed\": \"Failed to remove custom endpoint:\",\n \"removeFailed\": \"Remove failed: {{error}}\",\n \"updateLastUsedFailed\": \"Failed to update endpoint last used time\",\n \"pleaseAddEndpoint\": \"Please add an endpoint first\",\n \"testUnavailable\": \"Speed test unavailable\",\n \"noResult\": \"No result returned\",\n \"testFailed\": \"Speed test failed: {{error}}\",\n \"empty\": \"No endpoints\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"Model Test Config\",\n \"useCustomConfig\": \"Use separate config\",\n \"testConfigDesc\": \"Configure separate model testing parameters for this provider. Uses global settings when disabled.\",\n \"testModel\": \"Test Model\",\n \"testModelPlaceholder\": \"Leave empty to use global config\",\n \"timeoutSecs\": \"Timeout (seconds)\",\n \"testPrompt\": \"Test Prompt\",\n \"degradedThreshold\": \"Degraded Threshold (ms)\",\n \"maxRetries\": \"Max Retries\",\n \"pricingConfig\": \"Pricing Config\",\n \"useCustomPricing\": \"Use separate config\",\n \"pricingConfigDesc\": \"Configure separate pricing parameters for this provider. Uses global defaults when disabled.\",\n \"costMultiplier\": \"Cost Multiplier\",\n \"costMultiplierPlaceholder\": \"Leave empty to use global default (1)\",\n \"costMultiplierHint\": \"Actual cost = Base cost × Multiplier, supports decimals like 1.5\",\n \"pricingModelSourceLabel\": \"Pricing Mode\",\n \"pricingModelSourceInherit\": \"Inherit global default\",\n \"pricingModelSourceRequest\": \"Request model\",\n \"pricingModelSourceResponse\": \"Response model\",\n \"pricingModelSourceHint\": \"Choose whether to match pricing by request model or response model\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json configuration content\",\n \"authJsonStorageHint\": \"Proxy takeover is showing the stored auth, not the live auth.json.\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml configuration content\",\n \"configTomlStorageHint\": \"Proxy takeover is showing the stored config, not the live config.toml.\",\n \"proxyTakeoverStorageNotice\": \"💡 This app is under proxy takeover. You are editing the stored provider config; the live config is already temporarily managed by the proxy.\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Codex Common Config Snippet\",\n \"commonConfigHint\": \"This snippet will be appended to the end of config.toml when 'Write Common Config' is checked\",\n \"enableGoalMode\": \"Enable Goal mode\",\n \"enableRemoteCompaction\": \"Enable remote compaction\",\n \"remoteCompactionHint\": \"When enabled, the active model_providers entry name is written as OpenAI so Codex can try remote compaction.\",\n \"apiUrlLabel\": \"API Request URL\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"modelNameHint\": \"Specify the model to use, will be auto-updated in config.toml\",\n \"modelName\": \"Model Name\",\n \"localRoutingToggle\": \"Needs Local Routing\",\n \"localRoutingOffHint\": \"If your provider is not native OpenAI Responses API, or the model name is not Codex's default GPT series, please enable this switch.\",\n \"localRoutingOnHint\": \"Codex currently only natively supports OpenAI Responses API and GPT series models. If your provider uses the Chat Completions protocol or non-GPT models (such as DeepSeek or Kimi), enable this switch and keep local routing running while in use.\",\n \"upstreamModelName\": \"Upstream Model Name\",\n \"upstreamModelNameHint\": \"For Chat format, enter the real upstream model here; routing converts Codex Responses requests to Chat Completions while keeping this model.\",\n \"modelNamePlaceholder\": \"e.g., gpt-5-codex\",\n \"contextWindow1M\": \"1M Context Window\",\n \"contextWindow\": \"Context Window\",\n \"contextWindowPlaceholder\": \"e.g., 128000\",\n \"autoCompactLimit\": \"Auto Compact Limit\",\n \"autoCompactLimitPlaceholder\": \"e.g., 90000\",\n \"autoCompactLimitHint\": \"Auto-compacts history when context reaches this token limit\",\n \"modelMetadataAdvanced\": \"Model Metadata Advanced Options\",\n \"modelMetadataAdvancedHint\": \"Overrides Codex metadata for unknown models; clearing a field removes the matching config.toml entry.\",\n \"modelMappingTitle\": \"Model Mapping\",\n \"modelMappingHint\": \"Generates Codex model_catalog_json so /model can show these third-party model names; entries are saved exactly as listed. Codex must be restarted to refresh the model list after changes.\",\n \"addCatalogModel\": \"Add Model\",\n \"catalogDisplayName\": \"Display Name\",\n \"catalogDisplayNamePlaceholder\": \"e.g., DeepSeek V4 Flash\",\n \"catalogModelId\": \"Model ID\",\n \"catalogModelPlaceholder\": \"e.g., deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"Menu Display Name\",\n \"catalogColumnModel\": \"Actual Request Model\",\n \"catalogColumnContext\": \"Context Window\",\n \"reasoningModeToggle\": \"Supports Thinking Mode\",\n \"reasoningModeHint\": \"Enable when the upstream Chat Completions API supports toggling thinking on/off. Providers like Kimi, GLM and Qwen usually fall into this category.\",\n \"reasoningEffortToggle\": \"Supports Reasoning Effort\",\n \"reasoningEffortHint\": \"Enable when the upstream supports thinking-depth control such as low/high/max. Enabling this also turns on thinking mode and converts Codex's reasoning.effort into the upstream Chat parameter.\",\n \"reasoningGroupTitle\": \"Reasoning Capability\",\n \"reasoningSectionHint\": \"Preset providers are configured automatically; custom providers are inferred from name/URL. Override manually only when auto-detection is wrong.\",\n \"advancedSectionHint\": \"Includes local routing, model mapping, reasoning overrides and custom User-Agent. Enable local routing here when your provider uses the Chat Completions protocol or non-GPT models.\"\n },\n \"geminiConfig\": {\n \"envFile\": \"Environment Variables (.env)\",\n \"envFileHint\": \"Configure Gemini environment variables in .env format\",\n \"configJson\": \"Configuration File (config.json)\",\n \"configJsonHint\": \"Configure Gemini extended parameters in JSON format (optional)\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Gemini Common Config Snippet\",\n \"commonConfigHint\": \"This snippet writes to Gemini .env (GOOGLE_GEMINI_BASE_URL and GEMINI_API_KEY are not allowed)\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"extractedConfigInvalid\": \"Extracted config format is invalid\",\n \"invalidJsonFormat\": \"Common config snippet format error (must be valid JSON)\",\n \"commonConfigInvalidKeys\": \"Common config snippet must not include GOOGLE_GEMINI_BASE_URL or GEMINI_API_KEY (found: {{keys}})\",\n \"commonConfigInvalidValues\": \"Common config snippet values must be strings\",\n \"noCommonConfigToApply\": \"Common config snippet is empty or has no applicable entries\",\n \"configMergeFailed\": \"Config merge failed: {{error}}\",\n \"configReplaceFailed\": \"Config replace failed: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API Format\",\n \"selectPackage\": \"Select API format\",\n \"npmPackageHint\": \"Select the API format for the AI service\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"Custom API endpoint URL\",\n \"models\": \"Models\",\n \"modelsHint\": \"Configure available models and their display names\",\n \"addModel\": \"Add Model\",\n \"modelId\": \"Model ID\",\n \"modelName\": \"Display Name\",\n \"noModels\": \"No models configured\",\n \"modelsRequired\": \"Please add at least one model\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.\",\n \"providerKeyLockedHint\": \"This provider has already been added to the app config, so its key can no longer be changed.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyDuplicate\": \"This key is already in use\",\n \"providerKeyInvalid\": \"Invalid format. Use lowercase letters, numbers, and hyphens only.\",\n \"extraOptions\": \"Extra Options\",\n \"extraOptionsHint\": \"Configure extra SDK options like timeout, setCacheKey, etc. Values are auto-parsed to appropriate types (number, boolean, etc.).\",\n \"addExtraOption\": \"Add\",\n \"extraOptionKey\": \"Key\",\n \"extraOptionValue\": \"Value\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"No extra options configured\",\n \"noModelOptions\": \"Model options, click + to add\",\n \"modelExtraFields\": \"Model Properties\",\n \"noModelExtraFields\": \"Model properties (variants, cost, etc.), click + to add\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK Options\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"Provider Preset\",\n \"custom\": \"Custom Configuration\",\n \"other\": \"Other\",\n \"hint\": \"You can continue to adjust the fields below after selecting a preset.\",\n \"searchTooltip\": \"Search presets\",\n \"searchAriaLabel\": \"Search provider presets\",\n \"searchPlaceholder\": \"Search name, website, or category...\",\n \"sortAriaLabel\": \"Toggle preset sorting\",\n \"sortNameAscTooltip\": \"Sort by name A-Z\",\n \"sortOriginalTooltip\": \"Restore original order\",\n \"noSearchResults\": \"No provider presets match your search.\"\n },\n \"usage\": {\n \"title\": \"Usage Statistics\",\n \"subtitle\": \"View AI model usage and cost statistics\",\n \"today\": \"24 Hours\",\n \"last7days\": \"7 Days\",\n \"last30days\": \"30 Days\",\n \"presetToday\": \"Today\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"Total Requests\",\n \"totalCost\": \"Total Cost\",\n \"cost\": \"Cost\",\n \"perMillion\": \"(per million)\",\n \"trends\": \"Usage Trends\",\n \"rangeToday\": \"Last 24 hours (hourly)\",\n \"rangeLast7Days\": \"Last 7 days\",\n \"rangeLast30Days\": \"Last 30 days\",\n \"totalTokens\": \"New Tokens (Input+Output)\",\n \"cacheTokens\": \"Cache Tokens\",\n \"realTotal\": \"Tokens Processed\",\n \"realTotalHint\": \"Input + Output + Cache Write + Cache Read\",\n \"freshInput\": \"Fresh Input\",\n \"cacheHitRate\": \"Cache Hit Rate\",\n \"requestLogs\": \"Request Logs\",\n \"providerStats\": \"Provider Stats\",\n \"modelStats\": \"Model Stats\",\n \"time\": \"Time\",\n \"provider\": \"Provider\",\n \"billingModel\": \"Billing Model\",\n \"inputTokens\": \"Input\",\n \"outputTokens\": \"Output\",\n \"cacheReadTokens\": \"Cache Hit\",\n \"cacheCreationTokens\": \"Cache Creation\",\n \"timingInfo\": \"Duration/TTFT\",\n \"status\": \"Status\",\n \"multiplier\": \"Multiplier\",\n \"requestModel\": \"Request Model\",\n \"responseModel\": \"Response Model\",\n \"noData\": \"No data\",\n \"unknownProvider\": \"Unknown Provider\",\n \"stream\": \"Stream\",\n \"nonStream\": \"Non-stream\",\n \"source\": \"Source\",\n \"requestsLabel\": \"requests\",\n \"costLabel\": \"total cost\",\n \"appFilter\": {\n \"all\": \"All\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"Raw\",\n \"dataSources\": \"Data Sources\",\n \"dataSource\": {\n \"proxy\": \"Routing\",\n \"session_log\": \"Session Log\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex Session\",\n \"gemini_session\": \"Gemini Session\",\n \"opencode_session\": \"OpenCode Session\"\n },\n \"sessionSync\": {\n \"trigger\": \"Sync session logs\",\n \"import\": \"Import Sessions\",\n \"resync\": \"Sync\",\n \"imported\": \"Imported {{count}} records from session logs\",\n \"upToDate\": \"Session logs are up to date\",\n \"failed\": \"Session sync failed\"\n },\n \"totalRecords\": \"{{total}} records total\",\n \"goToPage\": \"Go\",\n \"pageInputPlaceholder\": \"Page\",\n \"modelPricing\": \"Model Pricing\",\n \"loadPricingError\": \"Failed to load pricing data\",\n \"modelPricingDesc\": \"Configure token costs for each model\",\n \"noPricingData\": \"No pricing data. Click \\\"Add\\\" to add model pricing configuration.\",\n \"model\": \"Model\",\n \"pricingModel\": \"Pricing Model\",\n \"displayName\": \"Display Name\",\n \"inputCost\": \"Input Cost\",\n \"outputCost\": \"Output Cost\",\n \"cacheReadCost\": \"Cache Hit\",\n \"cacheWriteCost\": \"Cache Creation\",\n \"pricingAudit\": \"Audit\",\n \"pricingBuiltinPublic\": \"Built-in public price\",\n \"pricingUserOverride\": \"User override\",\n \"pricingEffectiveAt\": \"Effective\",\n \"longContextRate\": \"Long context\",\n \"deleteConfirmTitle\": \"Confirm Delete\",\n \"deleteConfirmDesc\": \"Are you sure you want to delete this model pricing? This action cannot be undone.\",\n \"queryFailed\": \"Query failed\",\n \"refreshUsage\": \"Refresh usage\",\n \"planUsage\": \"Plan usage\",\n \"hostConfirm\": {\n \"title\": \"Confirm outbound domain\",\n \"message\": \"This provider's custom usage script wants to send a request (which includes your API key) to:\\n\\n{{host}}\\n\\nOnly continue if you trust this domain. Your choice is remembered for this provider until the target domain changes.\",\n \"pending\": \"Confirmation required before contacting {{host}}\",\n \"reviewButton\": \"Review\",\n \"confirm\": \"Trust & continue\",\n \"cancel\": \"Cancel\"\n },\n \"invalid\": \"Expired\",\n \"total\": \"Total:\",\n \"used\": \"Used:\",\n \"remaining\": \"Remaining:\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} day ago\",\n \"multiplePlans\": \"{{count}} plans\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"modelIdPlaceholder\": \"e.g., claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"e.g., Claude 3.5 Sonnet\",\n \"appType\": \"App Type\",\n \"allApps\": \"All Apps\",\n \"statusCode\": \"Status Code\",\n \"searchProviderPlaceholder\": \"Search provider...\",\n \"searchModelPlaceholder\": \"Search model...\",\n \"timeRange\": \"Time Range\",\n \"customRange\": \"Calendar Filter\",\n \"customRangeHint\": \"Supports both date and time\",\n \"startTime\": \"Start Time\",\n \"endTime\": \"End Time\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"Creation\",\n \"cacheWriteNotReported\": \"OpenAI protocol doesn't distinguish cache creation; only cache hits are reported\",\n \"cacheWritePartial\": \"Some protocols (e.g. OpenAI) don't report cache creation; the value may be incomplete\",\n \"cacheRead\": \"Hit\",\n \"baseCost\": \"Base\",\n \"costMultiplier\": \"Cost Multiplier\",\n \"withMultiplier\": \"with multiplier\",\n \"requestDetail\": \"Request Detail\",\n \"requestNotFound\": \"Request not found\",\n \"basicInfo\": \"Basic Info\",\n \"tokenUsage\": \"Token Usage\",\n \"cacheCreationCost\": \"Cache Creation Cost\",\n \"costBreakdown\": \"Cost Breakdown\",\n \"performance\": \"Performance\",\n \"latency\": \"Latency\",\n \"errorMessage\": \"Error Message\",\n \"requests\": \"Requests\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"Average Cost\",\n \"avgLatency\": \"Average Latency\",\n \"successRate\": \"Success Rate\",\n \"requestId\": \"Request ID\",\n \"never\": \"Never\",\n \"modelId\": \"Model ID\",\n \"modelIdRequired\": \"Model ID is required\",\n \"inputCostPerMillion\": \"Input Cost (per million tokens, USD)\",\n \"outputCostPerMillion\": \"Output Cost (per million tokens, USD)\",\n \"invalidPrice\": \"Price must be non-negative\",\n \"invalidTimeRange\": \"Please select complete start/end time\",\n \"invalidTimeRangeOrder\": \"Start time cannot be later than end time\",\n \"timeRangeTooLarge\": \"Time range is too large, please narrow it down\",\n \"addPricing\": \"Add Pricing\",\n \"editPricing\": \"Edit Pricing\",\n \"pricingAdded\": \"Pricing added\",\n \"pricingUpdated\": \"Pricing updated\",\n \"cacheReadCostPerMillion\": \"Cache Read Cost (per million tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"Cache Write Cost (per million tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"Configure Usage Query\",\n \"enableUsageQuery\": \"Enable usage query\",\n \"presetTemplate\": \"Preset template\",\n \"requestUrl\": \"Request URL\",\n \"requestUrlPlaceholder\": \"e.g. https://api.example.com\",\n \"method\": \"HTTP method\",\n \"templateCustom\": \"Custom\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"Official\",\n \"templateOfficialSubscription\": \"Official Subscription\",\n \"copilotAutoAuth\": \"Auto OAuth authentication, no manual credentials needed\",\n \"tokenPlanHint\": \"Automatically uses the provider's API Key and Base URL to query Token Plan quota\",\n \"balanceHint\": \"Automatically uses the provider's API Key to query account balance\",\n \"officialSubscriptionHint\": \"Reads the local CLI OAuth credentials and calls the official API to query subscription quota. Disabled by default and only requests after you enable it.\",\n \"resetDate\": \"Reset date\",\n \"premiumRequests\": \"Premium Requests\",\n \"credentialsConfig\": \"Credentials\",\n \"credentialsHint\": \"Leave empty to use provider config\",\n \"optional\": \"optional\",\n \"apiKeyPlaceholder\": \"Leave empty to use provider's API Key\",\n \"baseUrlPlaceholder\": \"Leave empty to use provider's base URL\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"Generate in 'Security Settings'\",\n \"userId\": \"User ID\",\n \"userIdPlaceholder\": \"e.g., 114514\",\n \"defaultPlan\": \"Default Plan\",\n \"queryFailedMessage\": \"Query failed\",\n \"queryScript\": \"Query script (JavaScript)\",\n \"timeoutSeconds\": \"Timeout (seconds)\",\n \"headers\": \"Headers\",\n \"body\": \"Body\",\n \"timeoutHint\": \"Range: 2-30 seconds\",\n \"timeoutMustBeInteger\": \"Timeout must be an integer, decimal part ignored\",\n \"timeoutCannotBeNegative\": \"Timeout cannot be negative\",\n \"autoIntervalMinutes\": \"Auto query interval (minutes, 0 to disable)\",\n \"autoQueryInterval\": \"Auto Query Interval (minutes)\",\n \"autoQueryIntervalHint\": \"0 to disable; recommend 5-60 minutes\",\n \"intervalMustBeInteger\": \"Interval must be an integer, decimal part ignored\",\n \"intervalCannotBeNegative\": \"Interval cannot be negative\",\n \"intervalAdjusted\": \"Interval adjusted to {{value}} minutes\",\n \"scriptHelp\": \"Script writing instructions:\",\n \"configFormat\": \"Configuration format:\",\n \"commentOptional\": \"optional\",\n \"commentResponseIsJson\": \"response is the JSON data returned by the API\",\n \"extractorFormat\": \"Extractor return format (all fields optional):\",\n \"tips\": \"💡 Tips:\",\n \"testing\": \"Testing...\",\n \"testScript\": \"Test script\",\n \"format\": \"Format\",\n \"saveConfig\": \"Save config\",\n \"scriptEmpty\": \"Script configuration cannot be empty\",\n \"mustHaveReturn\": \"Script must contain return statement\",\n \"testSuccess\": \"Test successful!\",\n \"testFailed\": \"Test failed\",\n \"formatSuccess\": \"Format successful\",\n \"formatFailed\": \"Format failed\",\n \"supportedVariables\": \"Supported Variables\",\n \"variablesHint\": \"Supported variables: {{apiKey}}, {{baseUrl}} | extractor function receives API response JSON object\",\n \"scriptConfig\": \"Request configuration\",\n \"extractorCode\": \"Extractor code\",\n \"extractorHint\": \"Return object should include remaining quota fields\",\n \"fieldIsValid\": \"• isValid: Boolean, whether plan is valid\",\n \"fieldInvalidMessage\": \"• invalidMessage: String, reason for expiration (shown when isValid is false)\",\n \"fieldRemaining\": \"• remaining: Number, remaining quota\",\n \"fieldUnit\": \"• unit: String, unit (e.g., \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String, plan name\",\n \"fieldTotal\": \"• total: Number, total quota\",\n \"fieldUsed\": \"• used: Number, used quota\",\n \"fieldExtra\": \"• extra: String, custom display text\",\n \"tip1\": \"• Variables {{apiKey}} and {{baseUrl}} are automatically replaced\",\n \"tip2\": \"• Extractor function runs in sandbox environment, supports ES2020+ syntax\",\n \"tip3\": \"• Entire config must be wrapped in () to form object literal expression\"\n },\n \"errors\": {\n \"usage_query_failed\": \"Usage query failed\",\n \"configLoadFailedTitle\": \"Configuration Load Failed\",\n \"configLoadFailedMessage\": \"Unable to read configuration file:\\n{{path}}\\n\\nError details:\\n{{detail}}\\n\\nPlease check if the JSON is valid, or restore from a backup file (e.g., config.json.bak) in the same directory.\\n\\nThe app will exit so you can fix this.\",\n \"mcpPageLoadFailed\": \"MCP Discovery page failed to load\",\n \"mcpPageLoadDescription\": \"The MCP registry page encountered a rendering error. This may be caused by data corruption or a network issue.\",\n \"pageLoadFailed\": \"Page failed to load\",\n \"pageLoadFailedDescription\": \"An unexpected error occurred while rendering the current view. Please try switching to another page or refreshing.\"\n },\n \"presetSelector\": {\n \"title\": \"Select Configuration Type\",\n \"custom\": \"Custom\",\n \"customDescription\": \"Manually configure provider, requires complete configuration\",\n \"officialDescription\": \"Official login, no API Key required\",\n \"presetDescription\": \"Use preset configuration, only API Key required\"\n },\n \"mcp\": {\n \"title\": \"MCP Management\",\n \"import\": \"Import\",\n \"importExisting\": \"Import Existing\",\n \"addMcp\": \"Add MCP\",\n \"discover\": \"Discover MCP\",\n \"claudeTitle\": \"Claude Code MCP Management\",\n \"codexTitle\": \"Codex MCP Management\",\n \"geminiTitle\": \"Gemini MCP Management\",\n \"unifiedPanel\": {\n \"title\": \"MCP Server Management\",\n \"addServer\": \"Add Server\",\n \"editServer\": \"Edit Server\",\n \"deleteServer\": \"Delete Server\",\n \"deleteConfirm\": \"Are you sure you want to delete server \\\"{{id}}\\\"? This action cannot be undone.\",\n \"noServers\": \"No servers yet\",\n \"enabledApps\": \"Enabled Apps\",\n \"noImportFound\": \"No MCP servers to import found. All servers are already managed by OpenSunstar.\",\n \"importSuccess\": \"Successfully imported {{count}} MCP servers\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"User-level MCP path\",\n \"serverList\": \"Servers\",\n \"loading\": \"Loading...\",\n \"empty\": \"No MCP servers\",\n \"emptyDescription\": \"Click the button in the top right to add your first MCP server\",\n \"add\": \"Add MCP\",\n \"addServer\": \"Add MCP\",\n \"editServer\": \"Edit MCP\",\n \"addClaudeServer\": \"Add Claude Code MCP\",\n \"editClaudeServer\": \"Edit Claude Code MCP\",\n \"addCodexServer\": \"Add Codex MCP\",\n \"editCodexServer\": \"Edit Codex MCP\",\n \"configPath\": \"Config Path\",\n \"serverCount\": \"{{count}} MCP server(s) configured\",\n \"enabledCount\": \"{{count}} enabled\",\n \"template\": {\n \"fetch\": \"Quick Template: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP Title (Unique)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"Display Name\",\n \"namePlaceholder\": \"e.g. @modelcontextprotocol/server-time\",\n \"enabledApps\": \"Enable to Apps\",\n \"noAppsWarning\": \"At least one app must be selected\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Optional description\",\n \"tags\": \"Tags (comma separated)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"Homepage\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"Docs\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"Additional Info\",\n \"jsonConfig\": \"Full JSON Configuration\",\n \"jsonConfigOrPrefix\": \"Full JSON configuration or use\",\n \"tomlConfigOrPrefix\": \"Full TOML configuration or use\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"Full TOML Configuration\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"Config Wizard\",\n \"syncOtherSide\": \"Mirror to {{target}}\",\n \"syncOtherSideHint\": \"Apply the same settings to {{target}}; existing entries with the same id will be overwritten.\",\n \"willOverwriteWarning\": \"Will overwrite existing config in {{target}}\"\n },\n \"wizard\": {\n \"title\": \"MCP Configuration Wizard\",\n \"hint\": \"Quickly configure MCP server and auto-generate JSON configuration\",\n \"type\": \"Type\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"Command\",\n \"commandPlaceholder\": \"npx or uvx\",\n \"args\": \"Arguments\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"Environment Variables\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"Please enter URL\",\n \"headers\": \"Headers (optional)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"Configuration Preview\",\n \"apply\": \"Apply Configuration\"\n },\n \"id\": \"Identifier (unique)\",\n \"type\": \"Type\",\n \"command\": \"Command\",\n \"validateCommand\": \"Validate Command\",\n \"args\": \"Args\",\n \"argsPlaceholder\": \"e.g., mcp-server-fetch --help\",\n \"env\": \"Environment (one per line, KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"Reset\",\n \"msg\": {\n \"saved\": \"Saved\",\n \"deleted\": \"Deleted\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"Disabled\",\n \"templateAdded\": \"Template added\"\n },\n \"error\": {\n \"idRequired\": \"Please enter identifier\",\n \"idExists\": \"Identifier already exists. Please choose another.\",\n \"jsonInvalid\": \"Invalid JSON format\",\n \"tomlInvalid\": \"Invalid TOML format\",\n \"commandRequired\": \"Please enter command\",\n \"singleServerObjectRequired\": \"Please paste a single MCP server object (do not include top-level mcpServers)\",\n \"saveFailed\": \"Save failed\",\n \"deleteFailed\": \"Delete failed\"\n },\n \"test\": {\n \"testConnection\": \"Test Connection\",\n \"batchTestConnection\": \"Batch test all server connections\",\n \"batchProgress\": \"Testing... ({{completed}}/{{total}})\",\n \"allConnected\": \"All {{count}} servers connected successfully\",\n \"batchSummary\": \"{{connected}} succeeded, {{failed}} failed ({{total}} total)\",\n \"noServersToTest\": \"No servers to test\",\n \"connected\": \"Connected\",\n \"authRequired\": \"Auth Required\",\n \"unreachable\": \"Unreachable\",\n \"timeout\": \"Timeout\",\n \"commandFailed\": \"Start Failed\",\n \"unexpected\": \"Unexpected\"\n },\n \"discovery\": {\n \"title\": \"Discover MCP\",\n \"searchPlaceholder\": \"Search MCP servers by keyword...\",\n \"totalFound\": \"Found {{count}} servers\",\n \"alreadyInstalled\": \"{{count}} installed\",\n \"noResults\": \"No servers found for \\\"{{query}}\\\"\",\n \"noServers\": \"No servers available\",\n \"official\": \"Official\",\n \"installed\": \"Installed\",\n \"install\": \"Install\",\n \"remotes\": \"Remotes\",\n \"website\": \"Website\",\n \"repository\": \"Repository\"\n },\n \"validation\": {\n \"ok\": \"Command available\",\n \"fail\": \"Command not found\"\n },\n \"confirm\": {\n \"deleteTitle\": \"Delete MCP Server\",\n \"deleteMessage\": \"Are you sure you want to delete MCP server \\\"{{id}}\\\"? This action cannot be undone.\"\n },\n \"presets\": {\n \"title\": \"Select MCP Type\",\n \"enable\": \"Enable\",\n \"enabled\": \"Enabled\",\n \"installed\": \"Installed\",\n \"docs\": \"Docs\",\n \"requiresEnv\": \"Requires env\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"Universal HTTP request tool, supports GET/POST and other HTTP methods, suitable for quick API requests and web data scraping\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"Time query tool providing current time, timezone conversion, and date calculation features\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"Knowledge graph memory system supporting entities, relations, and observations to help AI remember important information from conversations\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"Sequential thinking tool helping AI break down complex problems into multiple steps for deeper thinking\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 documentation search tool providing latest library docs and code examples, with higher limits when configured with a key\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude Prompt Management\",\n \"codexTitle\": \"Codex Prompt Management\",\n \"add\": \"Add Prompt\",\n \"edit\": \"Edit Prompt\",\n \"addTitle\": \"Add {{appName}} Prompt\",\n \"editTitle\": \"Edit {{appName}} Prompt\",\n \"import\": \"Import Existing\",\n \"count\": \"{{count}} prompts\",\n \"enabled\": \"Enabled\",\n \"enable\": \"Enable\",\n \"enabledName\": \"Enabled: {{name}}\",\n \"noneEnabled\": \"No prompt enabled\",\n \"currentFile\": \"Current {{filename}} Content\",\n \"empty\": \"No prompts yet\",\n \"emptyDescription\": \"Click the button above to add or import prompts\",\n \"loading\": \"Loading...\",\n \"name\": \"Name\",\n \"namePlaceholder\": \"e.g., Default Project Prompt\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Optional description\",\n \"content\": \"Content\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nEnter prompt content here...\",\n \"loadFailed\": \"Failed to load prompts\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"enableSuccess\": \"Enabled successfully\",\n \"enableFailed\": \"Failed to enable\",\n \"disableSuccess\": \"Disabled successfully\",\n \"disableFailed\": \"Failed to disable\",\n \"importSuccess\": \"Imported successfully\",\n \"importFailed\": \"Failed to import\",\n \"confirm\": {\n \"deleteTitle\": \"Confirm Delete\",\n \"deleteMessage\": \"Are you sure you want to delete prompt \\\"{{name}}\\\"?\"\n },\n \"fragment\": {\n \"isFragment\": \"Rule fragment\",\n \"parent\": \"Parent prompt\",\n \"selectParent\": \"Select parent prompt\",\n \"priority\": \"Priority (higher merges first)\",\n \"targets\": \"Target tools (comma-separated, * for all)\",\n \"globs\": \"File globs (JSON array)\",\n \"badge\": \"Fragment\"\n }\n },\n \"dryRun\": {\n \"title\": \"Preview mode (Dry Run)\",\n \"description\": \"When enabled, prompt activation shows a diff preview before writing to disk\",\n \"settingsTitle\": \"Preview mode (Dry Run)\",\n \"settingsDescription\": \"Preview diffs before applying writes to disk\",\n \"confirmWrite\": \"Confirm write\",\n \"promptActivationTitle\": \"Prompt activation preview\",\n \"promptActivationDesc\": \"Preview mode is on; confirm to write to the target file\",\n \"current\": \"Current file\",\n \"after\": \"After activation\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"Commands\",\n \"empty\": \"No custom commands yet\",\n \"add\": \"Add Command\",\n \"edit\": \"Edit Command\",\n \"count\": \"{{count}} commands\",\n \"loadFailed\": \"Failed to load commands\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Command\",\n \"deleteMessage\": \"Delete command \\\"{{name}}\\\"? Synced files will be removed.\"\n },\n \"form\": {\n \"name\": \"Command name\",\n \"description\": \"Description\",\n \"content\": \"Content (Markdown)\",\n \"arguments\": \"Arguments (JSON)\",\n \"syncTargets\": \"Sync to\"\n },\n \"variableHelp\": {\n \"title\": \"Template variables\",\n \"arguments\": \"User argument placeholder for Claude Code / Gemini\",\n \"codexNote\": \"Codex does not support standalone command files.\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"No lifecycle hooks yet\",\n \"add\": \"Add Hook\",\n \"edit\": \"Edit Hook\",\n \"count\": \"{{count}} hooks\",\n \"loadFailed\": \"Failed to load hooks\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"syncSuccess\": \"Synced to Claude Code\",\n \"syncFailed\": \"Sync failed\",\n \"syncNow\": \"Sync to Claude\",\n \"claudeOnlyNote\": \"Currently syncs to Claude Code settings.json hooks field only\",\n \"timeoutLabel\": \"Timeout {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Hook\",\n \"deleteMessage\": \"Delete this hook? settings.json will be updated.\"\n },\n \"form\": {\n \"eventType\": \"Event type\",\n \"toolPattern\": \"Tool pattern (glob)\",\n \"hookCommand\": \"Shell command\",\n \"timeout\": \"Timeout (seconds, 1-300)\",\n \"description\": \"Description\"\n },\n \"eventType\": {\n \"PreToolUse\": \"Pre tool use\",\n \"PostToolUse\": \"Post tool use\",\n \"Notification\": \"Notification\",\n \"Stop\": \"Stop\"\n }\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"Migrate Prompt, MCP, Skill, and Command configs between Claude, Codex, Gemini, and more\",\n \"sourceApp\": \"Source tool\",\n \"targetApp\": \"Target tool\",\n \"contentType\": \"Config type\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"Select target tool\",\n \"notFound\": \"File not found\",\n \"loadFailed\": \"Failed to detect source configs\",\n \"previewing\": \"Generating preview…\",\n \"warnings\": \"Conversion notes\",\n \"unmapped\": \"Unmapped section: {{section}}\",\n \"sourcePreview\": \"Source\",\n \"convertedPreview\": \"Converted\",\n \"overwrite\": \"Overwrite existing target file (auto backup as .bak.opensunstar)\",\n \"apply\": \"Apply\",\n \"applySuccess\": \"Config written to target tool\",\n \"applyFailed\": \"Write failed\",\n \"steps\": {\n \"source\": \"Select source\",\n \"previewSource\": \"Preview source\",\n \"previewTarget\": \"Preview conversion\",\n \"confirm\": \"Confirm write\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore Rules\",\n \"empty\": \"No ignore rules yet\",\n \"emptyHint\": \"Glob rules sync to .claudeignore, .codexignore, and similar files\",\n \"add\": \"Add Rule\",\n \"edit\": \"Edit Ignore Rule\",\n \"count\": \"{{count}} rules\",\n \"loadFailed\": \"Failed to load ignore rules\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"importGitignore\": \"Import from .gitignore\",\n \"importSuccess\": \"Imported {{count}} rules\",\n \"importFailed\": \"Import failed\",\n \"syncNow\": \"Sync to tools\",\n \"syncSuccess\": \"Synced to tool ignore files\",\n \"syncFailed\": \"Sync failed\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Rule\",\n \"deleteMessage\": \"Delete this ignore rule? Ignore files will be updated.\"\n },\n \"form\": {\n \"pattern\": \"Glob pattern\",\n \"description\": \"Description\",\n \"syncTargets\": \"Sync to\"\n }\n },\n \"permissions\": {\n \"title\": \"Tool Permissions\",\n \"empty\": \"No permission rules yet\",\n \"emptyHint\": \"Manage Claude Code allow/deny lists; coexists with hooks in settings.json\",\n \"add\": \"Add Permission\",\n \"edit\": \"Edit Permission\",\n \"count\": \"{{count}} permissions\",\n \"loadFailed\": \"Failed to load permissions\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"syncNow\": \"Sync to Claude\",\n \"syncSuccess\": \"Synced to Claude settings.json\",\n \"syncFailed\": \"Sync failed\",\n \"presets\": \"Presets:\",\n \"presetApplied\": \"Preset applied\",\n \"presetFailed\": \"Failed to apply preset\",\n \"claudeOnlyNote\": \"Currently syncs to Claude Code settings.json permissions field only\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Permission\",\n \"deleteMessage\": \"Delete this permission rule? settings.json will be updated.\"\n },\n \"form\": {\n \"type\": \"Permission type\",\n \"toolPattern\": \"Tool pattern\",\n \"description\": \"Description\"\n },\n \"type\": {\n \"allowedTools\": \"Allow\",\n \"deniedTools\": \"Deny\",\n \"autoApprove\": \"Auto-approve\"\n }\n },\n \"workspace\": {\n \"title\": \"Project Cockpit\",\n \"subtitle\": \"AI config status and recent activity across your projects, so you see what matters first\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI assets\"\n },\n \"tabs\": {\n \"label\": \"Workspace views\",\n \"dashboard\": \"Alerts\",\n \"board\": \"Project board\"\n },\n \"dashboard\": {\n \"title\": \"Alerts\",\n \"subtitle\": \"{{count}} projects · focus on progress and AI asset readiness\",\n \"attentionCount\": \"Needs attention\",\n \"attentionHint\": \"Low readiness or missing assets\",\n \"avgReadiness\": \"Avg. readiness\",\n \"missingMcp\": \"Missing MCP\",\n \"activeProjects\": \"Active ({{days}}d)\",\n \"activeHint\": \"Git commits\",\n \"queueTitle\": \"Priority queue\",\n \"allGood\": \"All projects look healthy — you're good to ship.\",\n \"configureAssets\": \"Configure assets\",\n \"reasonReadiness\": \"Readiness {{score}}/{{max}}\",\n \"reasonDrift\": \"{{count}} config mismatch item(s)\",\n \"reasonUnmanaged\": \"Not yet managed by OpenSunstar\",\n \"reasonMcp\": \"No MCP linked\",\n \"reasonSkills\": \"No Skills\",\n \"reasonPrompts\": \"No Prompts linked\",\n \"reasonProgress\": \"MVP {{progress}}%\",\n \"lastUpdated\": \"Last updated\",\n \"updatedJustNow\": \"Updated just now\",\n \"updatedMinutesAgo\": \"Updated {{count}}m ago\",\n \"updatedHoursAgo\": \"Updated {{count}}h ago\",\n \"updatedAt\": \"Updated {{time}}\",\n \"refreshing\": \"Refreshing…\",\n \"loading\": \"Loading readiness and asset data…\",\n \"mvpBehindHint\": \"{{count}} MVP project(s) below 50% progress — consider prioritizing.\",\n \"activeSub\": \"{{commits}} commits · activity {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI assets\",\n \"subtitle\": \"Per-project MCP / Skills / Prompts links and readiness\",\n \"loading\": \"Summarizing project AI assets…\",\n \"project\": \"Project\",\n \"stage\": \"Stage\",\n \"readiness\": \"Ready\",\n \"progress\": \"Progress\",\n \"refreshing\": \"Updating\",\n \"subtitle8\": \"Per-project counts for 8 asset types (project-enabled subset) and readiness\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"Backup created: {{path}}\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.\",\n \"providerKeyLockedHint\": \"This provider has already been added to the app config, so its key can no longer be changed.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyDuplicate\": \"This key is already in use\",\n \"providerKeyInvalid\": \"Invalid format. Use lowercase letters, numbers, and hyphens only.\",\n \"apiProtocol\": \"API Protocol\",\n \"selectProtocol\": \"Select API Protocol\",\n \"apiProtocolHint\": \"Select the protocol type compatible with the provider's API. Most providers use OpenAI Completions format.\",\n \"baseUrl\": \"API Endpoint\",\n \"baseUrlHint\": \"The provider's API endpoint address.\",\n \"models\": \"Models\",\n \"addModel\": \"Add Model\",\n \"noModels\": \"No models configured. Click Add Model to configure available models.\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"Display Name\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"Context Window\",\n \"maxTokens\": \"Max Output Tokens\",\n \"reasoning\": \"Reasoning Mode\",\n \"reasoningOn\": \"Enabled\",\n \"reasoningOff\": \"Disabled\",\n \"inputTypes\": \"Input Types\",\n \"inputCost\": \"Input Cost ($/M tokens)\",\n \"outputCost\": \"Output Cost ($/M tokens)\",\n \"advancedOptions\": \"Advanced Options\",\n \"cacheReadCost\": \"Cache Read Cost ($/M tokens)\",\n \"cacheWriteCost\": \"Cache Write Cost ($/M tokens)\",\n \"cacheCostHint\": \"Cache costs are used to calculate Prompt Caching costs. Leave empty if not using caching.\",\n \"modelsHint\": \"Configure the models supported by this provider. Model ID is used for API calls, Display Name for the interface.\",\n \"userAgent\": \"Send User-Agent\",\n \"userAgentHint\": \"Some providers require a browser User-Agent header to work properly.\",\n \"env\": {\n \"title\": \"Environment Variables\",\n \"description\": \"Manage environment variables in openclaw.json (API keys, custom variables, etc.)\",\n \"editorHint\": \"Edit the full env section as JSON. Nested objects such as env.vars and env.shellEnv are supported.\",\n \"objectRequired\": \"OpenClaw env must be a JSON object.\",\n \"invalidJson\": \"OpenClaw env must be valid JSON.\",\n \"empty\": \"OpenClaw env cannot be empty. Use {} for an empty object.\",\n \"keyPlaceholder\": \"Variable name\",\n \"valuePlaceholder\": \"Value\",\n \"add\": \"Add Variable\",\n \"saveSuccess\": \"Environment variables saved\",\n \"saveFailed\": \"Failed to save environment variables\",\n \"loadFailed\": \"Failed to load environment variables\",\n \"duplicateKey\": \"Duplicate variable name detected: {{key}}\"\n },\n \"tools\": {\n \"title\": \"Tool Permissions\",\n \"description\": \"Manage tool permissions in openclaw.json (allow/deny lists)\",\n \"profile\": \"Permission Profile\",\n \"profileMinimal\": \"Minimal\",\n \"profileCoding\": \"Coding\",\n \"profileMessaging\": \"Messaging\",\n \"profileFull\": \"Full\",\n \"profileUnset\": \"Not set\",\n \"unsupportedProfileTitle\": \"Unsupported tools profile detected\",\n \"unsupportedProfileDescription\": \"The current tools.profile value '{{value}}' is not in the supported OpenClaw list. It will be preserved until you choose a new value.\",\n \"unsupportedProfileLabel\": \"unsupported\",\n \"allowList\": \"Allow List\",\n \"denyList\": \"Deny List\",\n \"patternPlaceholder\": \"Tool name or pattern\",\n \"addAllow\": \"Add Allow\",\n \"addDeny\": \"Add Deny\",\n \"saveSuccess\": \"Tool permissions saved\",\n \"saveFailed\": \"Failed to save tool permissions\",\n \"loadFailed\": \"Failed to load tool permissions\"\n },\n \"agents\": {\n \"title\": \"Agents Config\",\n \"description\": \"Manage agents.defaults in openclaw.json (default model, runtime parameters, etc.)\",\n \"modelSection\": \"Model Configuration\",\n \"primaryModel\": \"Default Model\",\n \"primaryModelHint\": \"Select from models of configured providers\",\n \"notSet\": \"Not set\",\n \"fallbackModels\": \"Fallback Models\",\n \"fallbackModelsHint\": \"When the primary model is unavailable, fallbacks are tried in order\",\n \"addFallback\": \"Add fallback model\",\n \"noModels\": \"No configured provider models. Please add an OpenClaw provider first.\",\n \"notInList\": \"{{value}} (not configured)\",\n \"runtimeSection\": \"Runtime Parameters\",\n \"workspace\": \"Workspace Path\",\n \"timeout\": \"Timeout (seconds)\",\n \"contextTokens\": \"Context Tokens\",\n \"maxConcurrent\": \"Max Concurrent\",\n \"legacyTimeoutTitle\": \"Legacy timeout detected\",\n \"legacyTimeoutDescription\": \"This config still uses agents.defaults.timeout. Saving here will migrate it to timeoutSeconds.\",\n \"saveSuccess\": \"Agents config saved\",\n \"saveFailed\": \"Failed to save agents config\",\n \"loadFailed\": \"Failed to load agents config\"\n },\n \"health\": {\n \"title\": \"OpenClaw config warnings detected\",\n \"invalidToolsProfile\": \"tools.profile contains an unsupported value. OpenClaw currently expects minimal, coding, messaging, or full.\",\n \"legacyTimeout\": \"agents.defaults.timeout is deprecated. Save the Agents panel to migrate it to timeoutSeconds.\",\n \"stringifiedEnvVars\": \"env.vars should be an object, but the current value looks stringified or malformed.\",\n \"stringifiedShellEnv\": \"env.shellEnv should be an object, but the current value looks stringified or malformed.\",\n \"parseFailed\": \"openclaw.json could not be parsed as valid JSON5. Fix the file before editing it here.\"\n },\n \"primaryModel\": \"Primary Model\",\n \"fallbackModel\": \"Fallback Model\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API Endpoint\",\n \"baseUrlHint\": \"The API endpoint URL for this provider.\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Lowercase letters, numbers, and hyphens only. Used as the provider name in config.yaml.\",\n \"providerKeyLockedHint\": \"This provider is in Hermes config; key is locked.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyInvalid\": \"Provider key can only contain lowercase letters, numbers, and hyphens\",\n \"providerKeyDuplicate\": \"This provider key already exists\",\n \"apiMode\": \"API Mode\",\n \"apiModeHint\": \"Provider API protocol. Choose the format that matches your endpoint.\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API endpoint is required\",\n \"baseUrlScheme\": \"Use an http:// or https:// address\",\n \"baseUrlInvalid\": \"API endpoint is not a valid URL\",\n \"models\": \"Models\",\n \"addModel\": \"Add model\",\n \"noModels\": \"No models configured. Switching to this provider won't change the default model.\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"Display name\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"Context length\",\n \"advancedOptions\": \"Advanced options\",\n \"modelsHint\": \"On switch, the first model is written to top-level model.default.\",\n \"primaryModel\": \"Default\",\n \"fallbackModel\": \"Alternate\",\n \"providerAdvanced\": \"Provider advanced options\",\n \"rateLimitDelay\": \"Rate limit delay (seconds)\",\n \"rateLimitDelayHint\": \"Minimum delay in seconds between consecutive requests (optional). Leave empty for no limit.\"\n },\n \"webui\": {\n \"open\": \"Open Hermes Web UI\",\n \"offline\": \"Hermes Web UI is not running. Start it with `hermes dashboard` first.\",\n \"openFailed\": \"Failed to open Hermes Web UI\",\n \"launchConfirmTitle\": \"Hermes Dashboard is not running\",\n \"launchConfirmMessage\": \"Open a terminal and start it now with `hermes dashboard`?\\n\\nThe browser will open automatically once startup completes.\\n\\nIf the terminal reports that `hermes` cannot be found or the web extras are missing, run first:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"Open terminal & launch\",\n \"launching\": \"Started `hermes dashboard` in a terminal.\",\n \"launchFailed\": \"Failed to open terminal\"\n },\n \"memory\": {\n \"title\": \"Memory\",\n \"agentTab\": \"Agent Memory (MEMORY.md)\",\n \"userTab\": \"User Profile (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} characters\",\n \"overLimit\": \"Over budget — Hermes will truncate on next load\",\n \"enableOn\": \"Enabled\",\n \"enableOff\": \"Disabled\",\n \"disabledHint\": \"Hermes will skip this memory until re-enabled\",\n \"toggleFailed\": \"Failed to toggle memory\",\n \"saveSuccess\": \"Memory saved\",\n \"saveFailed\": \"Failed to save memory\",\n \"loadFailed\": \"Failed to read memory file\",\n \"openConfig\": \"Adjust limits in Hermes Web UI\",\n \"runtimeNote\": \"Changes apply on Hermes restart or new session.\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"Environment Variable Conflicts Detected\",\n \"description\": \"Found {{count}} environment variables that may override your configuration\"\n },\n \"actions\": {\n \"expand\": \"View Details\",\n \"collapse\": \"Collapse\",\n \"selectAll\": \"Select All\",\n \"clearSelection\": \"Clear Selection\",\n \"deleteSelected\": \"Delete Selected ({{count}})\",\n \"deleting\": \"Deleting...\"\n },\n \"field\": {\n \"value\": \"Value\",\n \"source\": \"Source\"\n },\n \"source\": {\n \"userRegistry\": \"User Environment Variable (Registry)\",\n \"systemRegistry\": \"System Environment Variable (Registry)\",\n \"systemEnv\": \"System Environment Variable\"\n },\n \"delete\": {\n \"success\": \"Environment variables deleted successfully\",\n \"error\": \"Failed to delete environment variables\"\n },\n \"backup\": {\n \"location\": \"Backup location: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"Confirm Delete Environment Variables\",\n \"message\": \"Are you sure you want to delete {{count}} environment variable(s)?\",\n \"backupNotice\": \"A backup will be created automatically before deletion. You can restore it later. Changes take effect after restarting the application or terminal.\",\n \"confirm\": \"Confirm Delete\"\n },\n \"error\": {\n \"noSelection\": \"Please select environment variables to delete\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills Management\",\n \"description\": \"Discover and install skills from popular repositories to extend Claude Code/Codex/Gemini capabilities\",\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing...\",\n \"repoManager\": \"Repository Management\",\n \"count\": \"{{count}} skills\",\n \"empty\": \"No skills available\",\n \"emptyDescription\": \"Add skill repositories to discover available skills\",\n \"addRepo\": \"Add Skill Repository\",\n \"loading\": \"Loading...\",\n \"installed\": \"Installed\",\n \"install\": \"Install\",\n \"installing\": \"Installing...\",\n \"uninstall\": \"Uninstall\",\n \"uninstalling\": \"Uninstalling...\",\n \"view\": \"View\",\n \"noDescription\": \"No description\",\n \"loadFailed\": \"Failed to load\",\n \"installSuccess\": \"Skill {{name}} installed\",\n \"installFailed\": \"Failed to install\",\n \"uninstallSuccess\": \"Skill {{name}} uninstalled\",\n \"uninstallFailed\": \"Failed to uninstall\",\n \"update\": \"Update\",\n \"updating\": \"Updating...\",\n \"updateAvailable\": \"Update\",\n \"updateSuccess\": \"Skill {{name}} updated to latest version\",\n \"updateFailed\": \"Failed to update\",\n \"checkUpdates\": \"Check Updates\",\n \"checkingUpdates\": \"Checking...\",\n \"noUpdates\": \"All skills are up to date\",\n \"updatesFound\": \"{{count}} skill(s) have updates available\",\n \"updateAll\": \"Update All ({{count}})\",\n \"updatingAll\": \"Updating...\",\n \"updateAllSuccess\": \"Successfully updated {{count}} skill(s)\",\n \"error\": {\n \"skillNotFound\": \"Skill not found: {{directory}}\",\n \"missingRepoInfo\": \"Missing repository info (owner or name)\",\n \"downloadTimeout\": \"Download repository {{owner}}/{{name}} timeout ({{timeout}}s)\",\n \"downloadTimeoutHint\": \"Please check network connection or retry later\",\n \"skillPathNotFound\": \"Skill path '{{path}}' not found in repository {{owner}}/{{name}}\",\n \"skillDirNotFound\": \"Skill directory not found: {{path}}\",\n \"directoryConflict\": \"Skill directory '{{directory}}' is already occupied by {{existing_repo}}, cannot install from {{new_repo}}\",\n \"emptyArchive\": \"Downloaded archive is empty\",\n \"downloadFailed\": \"Download failed: HTTP {{status}}\",\n \"allBranchesFailed\": \"All branches failed, tried: {{branches}}\",\n \"httpError\": \"HTTP error {{status}}\",\n \"http403\": \"GitHub access restricted, possibly rate limited\",\n \"http404\": \"Repository or branch not found, please check URL\",\n \"http429\": \"Too many requests, please wait and retry\",\n \"parseMetadataFailed\": \"Failed to parse skill metadata\",\n \"getHomeDirFailed\": \"Unable to get user home directory\",\n \"noSkillsInZip\": \"No skills found in ZIP file (requires SKILL.md file)\",\n \"networkError\": \"Network error\",\n \"fsError\": \"File system error\",\n \"unknownError\": \"Unknown error\",\n \"suggestion\": {\n \"checkNetwork\": \"Please check network connection\",\n \"checkProxy\": \"Consider configuring HTTP proxy\",\n \"retryLater\": \"Please retry later\",\n \"checkRepoUrl\": \"Please check repository URL and branch name\",\n \"checkDiskSpace\": \"Please check disk space\",\n \"checkPermission\": \"Please check directory permissions\",\n \"uninstallFirst\": \"Please uninstall the existing skill with the same name first\",\n \"checkZipContent\": \"Please verify the ZIP file contains valid skill directories (with SKILL.md files)\"\n }\n },\n \"repo\": {\n \"title\": \"Manage Skill Repositories\",\n \"description\": \"Add or remove GitHub skill repository sources\",\n \"url\": \"Repository URL\",\n \"urlPlaceholder\": \"owner/name or https://github.com/owner/name\",\n \"branch\": \"Branch\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"Skills Path\",\n \"pathPlaceholder\": \"skills (optional, leave empty for root)\",\n \"add\": \"Add Repository\",\n \"list\": \"Added Repositories\",\n \"empty\": \"No repositories\",\n \"invalidUrl\": \"Invalid repository URL format\",\n \"addSuccess\": \"Repository {{owner}}/{{name}} added, detected {{count}} skills\",\n \"addFailed\": \"Failed to add\",\n \"removeSuccess\": \"Repository {{owner}}/{{name}} removed\",\n \"removeFailed\": \"Failed to remove\",\n \"skillCount\": \"{{count}} skills detected\"\n },\n \"search\": \"Search Skills\",\n \"searchPlaceholder\": \"Search skill name or repo...\",\n \"searchSource\": {\n \"all\": \"All\",\n \"repos\": \"Repos\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"All Time\",\n \"leaderboardTrending\": \"24h Trending\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"All Time Top 50\",\n \"trendingTitle\": \"24h Trending\",\n \"allTimeDesc\": \"Aligned with skills.sh official All Time leaderboard (total installs)\",\n \"trendingDesc\": \"Aligned with skills.sh official Trending (24h) leaderboard\",\n \"syncedAt\": \"Synced {{time}}\",\n \"fromCache\": \"Cached locally\",\n \"registryTotal\": \"{{count}} total installs on skills.sh\",\n \"loading\": \"Syncing skills.sh official leaderboard…\",\n \"error\": \"Failed to sync skills.sh official leaderboard\",\n \"empty\": \"No leaderboard data\",\n \"syncPolicy\": \"Not live · syncs from skills.sh every {{hours}}h by default · click refresh to update now\",\n \"nextSyncAt\": \"Next auto-sync ~{{time}}\",\n \"refreshNow\": \"Sync from skills.sh now\",\n \"pageRange\": \"{{range}} · page {{page}}/{{totalPages}} ({{total}} items)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"Search all sources (Repos / skills.sh / ClawHub)...\",\n \"searching\": \"Searching multiple sources...\",\n \"typeToSearch\": \"Type keywords to search skills.sh and ClawHub\",\n \"typeToSearchMore\": \"Type keywords to search more sources\",\n \"mergedCount\": \"{{total}} results total\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"Search skills.sh (min 2 chars)...\",\n \"installs\": \"{{count}} installs\",\n \"loadMore\": \"Load More\",\n \"loading\": \"Searching skills.sh...\",\n \"noResults\": \"No skills found for \\\"{{query}}\\\"\",\n \"error\": \"Failed to search skills.sh\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"Search ClawHub (min 2 chars)...\",\n \"loading\": \"Searching ClawHub...\",\n \"noResults\": \"No skills found for \\\"{{query}}\\\"\",\n \"resultCount\": \"{{count}} results\",\n \"poweredBy\": \"Powered by ClawHub\",\n \"installViaCli\": \"ClawHub skills should be installed via CLI\",\n \"installSuccess\": \"{{slug}} installed successfully\",\n \"installFailed\": \"ClawHub skill installation failed\",\n \"installing\": \"Installing...\"\n },\n \"filter\": {\n \"placeholder\": \"Filter by status\",\n \"all\": \"All\",\n \"installed\": \"Installed\",\n \"uninstalled\": \"Not installed\",\n \"repo\": \"Filter by repo\",\n \"allRepos\": \"All repos\"\n },\n \"noResults\": \"No matching skills found\",\n \"noInstalled\": \"No skills installed\",\n \"noInstalledDescription\": \"Discover and install skills from repositories, or import existing skills\",\n \"discover\": \"Discover Skills\",\n \"import\": \"Import Existing\",\n \"importDescription\": \"Select skills to import into OpenSunstar unified management\",\n \"importSuccess\": \"Successfully imported {{count}} skills\",\n \"importSelected\": \"Import Selected ({{count}})\",\n \"noUnmanagedFound\": \"No skills to import found. All skills are already managed by OpenSunstar.\",\n \"foundIn\": \"Found in\",\n \"local\": \"Local\",\n \"uninstallConfirm\": \"Are you sure you want to uninstall \\\"{{name}}\\\"? This will remove the skill from all apps and create a local backup first.\",\n \"uninstallInMainPanel\": \"Please uninstall skills from the main panel\",\n \"notFound\": \"Skill not found\",\n \"backup\": {\n \"location\": \"Backup location: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"Restore Backup\",\n \"title\": \"Restore From Backup\",\n \"description\": \"Choose a Skills backup to restore its files locally and add it back to the current list.\",\n \"empty\": \"No Skills backups available to restore\",\n \"createdAt\": \"Backed up at\",\n \"path\": \"Backup path\",\n \"restore\": \"Restore\",\n \"restoring\": \"Restoring...\",\n \"delete\": \"Delete\",\n \"deleting\": \"Deleting...\",\n \"deleteSuccess\": \"Deleted backup for {{name}}\",\n \"deleteFailed\": \"Failed to delete skill backup\",\n \"deleteConfirmTitle\": \"Delete Backup\",\n \"deleteConfirmMessage\": \"Are you sure you want to delete the backup for \\\"{{name}}\\\"? This action cannot be undone.\",\n \"success\": \"Skill {{name}} restored from backup\",\n \"failed\": \"Failed to restore from backup\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"Install from ZIP\",\n \"installing\": \"Installing...\",\n \"successSingle\": \"Skill {{name}} installed\",\n \"successMultiple\": \"Successfully installed {{count}} skills\",\n \"noSkillsFound\": \"No skills found in ZIP file (requires SKILL.md file)\"\n },\n \"batchUninstall\": \"Uninstall\",\n \"batchUninstallTitle\": \"Batch Uninstall\",\n \"batchUninstallConfirm\": \"Are you sure you want to uninstall {{count}} skills?\",\n \"batchUninstallSuccess\": \"Successfully uninstalled {{count}} skills\",\n \"batchUninstallPartial\": \"Uninstall complete: {{success}} succeeded, {{fail}} failed\"\n },\n \"deeplink\": {\n \"confirmImport\": \"Confirm Import Provider\",\n \"confirmImportDescription\": \"The following configuration will be imported from deep link into OpenSunstar\",\n \"importPrompt\": \"Import Prompt\",\n \"importPromptDescription\": \"Please confirm whether to import this system prompt\",\n \"importMcp\": \"Import MCP Servers\",\n \"importMcpDescription\": \"Please confirm whether to import these MCP Servers\",\n \"importSkill\": \"Add Skill Repository\",\n \"importSkillDescription\": \"Please confirm whether to add this Skill repository\",\n \"promptImportSuccess\": \"Prompt imported successfully\",\n \"promptImportSuccessDescription\": \"Imported prompt: {{name}}\",\n \"mcpImportSuccess\": \"MCP Servers imported successfully\",\n \"mcpImportSuccessDescription\": \"Successfully imported {{count}} server(s)\",\n \"mcpPartialSuccess\": \"Partial import success\",\n \"mcpPartialSuccessDescription\": \"Success: {{success}}, Failed: {{failed}}\",\n \"skillImportSuccess\": \"Skill repository added successfully\",\n \"skillImportSuccessDescription\": \"Added repository: {{repo}}\",\n \"app\": \"App Type\",\n \"providerName\": \"Provider Name\",\n \"homepage\": \"Homepage\",\n \"endpoint\": \"API Endpoint\",\n \"apiKey\": \"API Key\",\n \"icon\": \"Icon\",\n \"model\": \"Model\",\n \"haikuModel\": \"Haiku Model\",\n \"sonnetModel\": \"Sonnet Model\",\n \"opusModel\": \"Opus Model\",\n \"multiModel\": \"Multi-Modal Model\",\n \"notes\": \"Notes\",\n \"import\": \"Import\",\n \"importing\": \"Importing...\",\n \"warning\": \"Please confirm the information above is correct before importing. You can edit or delete it later in the provider list.\",\n \"parseError\": \"Failed to parse deep link\",\n \"importSuccess\": \"Import successful\",\n \"importSuccessDescription\": \"Provider \\\"{{name}}\\\" has been successfully imported\",\n \"importError\": \"Failed to import\",\n \"configSource\": \"Config Source\",\n \"configEmbedded\": \"Embedded Config\",\n \"configRemote\": \"Remote Config\",\n \"configDetails\": \"Config Details\",\n \"configUrl\": \"Config File URL\",\n \"configMergeError\": \"Failed to merge configuration file\",\n \"primaryEndpoint\": \"Primary\",\n \"mcp\": {\n \"title\": \"Batch Import MCP Servers\",\n \"targetApps\": \"Target Apps\",\n \"serverCount\": \"MCP Servers ({{count}})\",\n \"enabledWarning\": \"After import, configurations will be written to all specified apps immediately\"\n },\n \"prompt\": {\n \"title\": \"Import System Prompt\",\n \"app\": \"App\",\n \"name\": \"Name\",\n \"description\": \"Description\",\n \"contentPreview\": \"Content Preview\",\n \"enabledWarning\": \"After import, this prompt will be enabled immediately and other prompts will be disabled\"\n },\n \"skill\": {\n \"title\": \"Add Claude Skill Repository\",\n \"repo\": \"GitHub Repository\",\n \"directory\": \"Target Directory\",\n \"branch\": \"Branch\",\n \"skillsPath\": \"Skills Path\",\n \"hint\": \"This will add the Skill repository to the list.\",\n \"hintDetail\": \"After adding, you can install specific Skills from the Skills management page.\"\n },\n \"usageScript\": \"Usage Query\",\n \"usageScriptEnabled\": \"Enabled\",\n \"usageScriptDisabled\": \"Disabled\",\n \"usageApiKey\": \"Usage API Key\",\n \"usageBaseUrl\": \"Usage Query URL\",\n \"usageAutoInterval\": \"Auto Query\",\n \"usageAutoIntervalValue\": \"Every {{minutes}} minutes\"\n },\n \"iconPicker\": {\n \"search\": \"Search Icons\",\n \"searchPlaceholder\": \"Enter icon name...\",\n \"noResults\": \"No matching icons found\",\n \"category\": {\n \"aiProvider\": \"AI Providers\",\n \"cloud\": \"Cloud Platforms\",\n \"tool\": \"Dev Tools\",\n \"other\": \"Other\"\n }\n },\n \"providerIcon\": {\n \"label\": \"Icon\",\n \"colorLabel\": \"Icon Color\",\n \"selectIcon\": \"Select Icon\",\n \"preview\": \"Preview\",\n \"clickToChange\": \"Click to change icon\",\n \"clickToSelect\": \"Click to select icon\",\n \"color\": \"Icon Color\"\n },\n \"simpleConnect\": {\n \"nav\": \"Quick Connect\",\n \"pageTitle\": \"Quick Connect\",\n \"tabSimple\": \"Quick Connect\",\n \"tabExpert\": \"Expert Provider\",\n \"title\": \"Quick Connect\",\n \"subtitle\": \"Paste your API key and start using CLI tools in 3 steps\",\n \"step1\": \"Supplier\",\n \"step2\": \"Keys\",\n \"step3\": \"Apply\",\n \"supplier\": \"Supplier\",\n \"customSupplier\": \"Custom OpenAI-compatible\",\n \"cliTool\": \"CLI tool\",\n \"model\": \"Model\",\n \"modelPlaceholder\": \"Fetch models first\",\n \"fetchModels\": \"Fetch models\",\n \"apply\": \"Apply configuration\",\n \"applySuccess\": \"{{tool}} configured\",\n \"applySuccessMulti\": \"{{tools}} configured\",\n \"modelsLoaded\": \"Loaded {{count}} models\",\n \"poolProxy\": \"Local proxy :{{port}} active\",\n \"keyRequired\": \"Save an API key to Keychain first\",\n \"keyRequiredHint\": \"Save the primary key before continuing to apply\",\n \"customBaseRequired\": \"Enter a custom API base URL first\",\n \"modelsFallback\": \"Fetch failed; using preset model {{model}}\",\n \"toolStatusTitle\": \"CLI configuration status\",\n \"toolStatusLoading\": \"Loading CLI status…\",\n \"toolCleared\": \"Cleared Quick Connect config for {{tool}}\",\n \"clearTool\": \"Clear {{tool}}\",\n \"wizardNav\": \"Quick Connect steps\",\n \"summaryStep\": \"Step {{step}}/3\",\n \"step3Hint\": \"Pick a CLI and model, then apply; expand sections below for details\",\n \"step3Sections\": {\n \"statusSection\": \"CLI configuration status\",\n \"runtimeSection\": \"Key pool runtime\",\n \"usageSection\": \"Usage overview (read-only)\"\n },\n \"supplierChangeTitle\": \"Switch supplier?\",\n \"supplierChangeBody\": \"Upstream will change; saved keys stay under the previous supplier namespace. Applying will backup and rewrite CLI configs.\",\n \"supplierChangeConfirm\": \"Continue\",\n \"supplierChangedApply\": \"Supplier switched and CLI updated; previous configs backed up\",\n \"pickSupplier\": \"Choose a supplier\",\n \"pickCli\": \"Choose a CLI to configure\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"Any OpenAI-compatible base URL\",\n \"openWebsite\": \"Website\",\n \"keySaved\": \"Key saved\",\n \"keyMissing\": \"No key saved\",\n \"poolBadge\": \"Pool ×{{count}}\",\n \"keySavedToast\": \"API key stored securely in Keychain\",\n \"keyReadyHint\": \"Primary key ready — continue to apply\",\n \"poolKeyAdded\": \"Backup key added\",\n \"applyTo\": \"Apply to {{tool}}\",\n \"modelsLoading\": \"Loading models…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} configured\",\n \"backToSimple\": \"Back to Quick Connect\",\n \"openProxySettings\": \"Proxy & failover settings\",\n \"proxyRunning\": \"Main proxy running\",\n \"cliGeneric\": \"CLI config\",\n \"expertNoticeTitle\": \"Expert Provider (trimmed)\",\n \"expertNoticeBody\": \"Failover, proxy takeover, Universal, etc. Advanced features stay here. Quick Connect is recommended by default.\",\n \"pool\": {\n \"step2Hint\": \"Enter your API key and save — CLI access is secured via local proxy\",\n \"enable\": \"Enable key pool\",\n \"enableHint\": \"Weighted pool + tiered 429 cooldown; CLI always gets local token, secrets in Keychain only\",\n \"securityNote\": \"Secrets are stored in OS Keychain only — never written to config files or logs. CLIs use the local proxy token.\",\n \"required\": \"required\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"Primary key\",\n \"extra\": \"Backup key\",\n \"extraKey\": \"Add backup key\",\n \"supplierHint\": \"Keys stored in Keychain: simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"Pool runtime\",\n \"running\": \"Proxy running\",\n \"stopped\": \"Proxy stopped\",\n \"idleHint\": \"Apply a CLI config to start the local proxy; success/failure and cooldown stats appear here\",\n \"available\": \"Available\",\n \"cooling\": \"Cooling down\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"Usage overview (read-only)\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"sessions\": \"Session records\",\n \"proxyPort\": \"Proxy :{{port}}\",\n \"proxySession\": \"This session\",\n \"byTool\": \"By CLI\",\n \"empty\": \"No local session usage data yet\"\n },\n \"import\": {\n \"title\": \"Confirm API Key import\",\n \"description\": \"Keys go to Keychain only — never written to config files. Keys are verified before import.\",\n \"label\": \"Label\",\n \"supplier\": \"Supplier\",\n \"warning\": \"Only import from trusted sources. You can disable URL import in Simple Connect.\",\n \"confirm\": \"Import\",\n \"importing\": \"Importing…\",\n \"success\": \"Imported {{count}} key(s) to Keychain\",\n \"duplicates\": \"Skipped {{count}} duplicate key(s)\",\n \"parseError\": \"Failed to parse import link\"\n },\n \"advanced\": {\n \"title\": \"Advanced\",\n \"verifyKey\": \"Verify key before save\",\n \"verifyKeyHint\": \"Calls /v1/models; disable only for advanced manual import\",\n \"deeplinkImport\": \"Allow URL key import\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"Backup directory scan\",\n \"files\": \"{{count}} file(s) scanned\",\n \"clean\": \"No plaintext keys found\",\n \"suspicious\": \"{{count}} suspicious item(s)\",\n \"hint\": \"Scans simple-connect/backups for CLI config copies without sk- secrets on disk.\"\n },\n \"privacy\": {\n \"bannerShort\": \"Local-first · keys in OS Keychain · no telemetry\",\n \"viewDetails\": \"Security & privacy\",\n \"title\": \"Security & privacy\",\n \"intro\": \"Quick Connect follows local-first principles: data stays on your machine, secrets never land in config files, and network targets are yours to choose. Details below apply to the Quick Connect flow only.\",\n \"close\": \"Got it\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"Local-first\",\n \"body\": \"Supplier choice, model cache, CLI status, and usage summaries are stored in the app's local data directory. Before writing CLI configs, originals are backed up under simple-connect/backups; you can scan backups in Step 2 advanced settings.\"\n },\n \"keychain\": {\n \"title\": \"Secrets in OS Keychain\",\n \"body\": \"API keys are stored only in the OS credential store (Windows DPAPI / macOS Keychain / Linux libsecret)—never in JSON, TOML, env files, or app logs. CLIs receive sc-local-* proxy tokens only; real keys are read from Keychain inside the local proxy process.\"\n },\n \"network\": {\n \"title\": \"Direct to your chosen upstream\",\n \"body\": \"Model fetch, optional key verification, and upstream API calls go from your machine to the base URL you select. The local proxy (127.0.0.1:17172) listens on loopback only—for key pooling and CLI routing—not exposed to the public internet.\"\n },\n \"noTelemetry\": {\n \"title\": \"No telemetry or account binding\",\n \"body\": \"Simple Connect does not send API keys, chat content, call logs, or device fingerprints to OpenSunstar or third parties. Usage panels read local CLI session logs and local proxy counters for on-device viewing only.\"\n },\n \"yourControl\": {\n \"title\": \"Risk items you control\",\n \"body\": \"URL key import should stay enabled only for links you trust—disable it in Step 2 advanced settings. With custom suppliers, assess the third-party base URL and privacy policy yourself.\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"Quick Start\",\n \"title\": \"Quick Start\",\n \"subtitle\": \"Three steps: pick a provider → enter key → activate\",\n \"tabs\": {\n \"wizard\": \"Quick Start\",\n \"manage\": \"Manage Providers\"\n },\n \"openManage\": \"Manage all providers\",\n \"openProxySettings\": \"Proxy & failover settings\",\n \"searchPlaceholder\": \"Search provider name or URL…\",\n \"noResults\": \"No matching providers\",\n \"official\": \"Official\",\n \"officialDesc\": \"Sign in through the corresponding client.\",\n \"partner\": \"Partner\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"Paste your API key\",\n \"keychainHint\": \"API keys stay in the local secure credential store; setup updates local client configuration.\",\n \"getKey\": \"Get API Key\",\n \"apply\": \"Activate\",\n \"success\": \"Connected! Switched to this provider\",\n \"doneTitle\": \"Connected!\",\n \"doneDesc\": \"Provider configured and activated. You can now use it in Claude Code.\",\n \"doneDescApp\": \"{{app}} is configured and set as the active provider.\",\n \"failedTitle\": \"Connection not completed\",\n \"compensatedDesc\": \"The operation failed and the previous state was restored. Correct the configuration and retry.\",\n \"recoveryRequired\": \"Automatic recovery did not finish. Continue recovery before retrying.\",\n \"operationId\": \"Operation ID\",\n \"retry\": \"Retry connection\",\n \"continueRecovery\": \"Continue recovery\",\n \"changeSelection\": \"Change configuration\",\n \"rollback\": \"Undo this connection\",\n \"rollbackDone\": \"Restored the state from before this connection\",\n \"rollbackFailed\": \"Recovery failed. Retry or inspect Local Routing settings.\",\n \"proxyRunningHint\": \"Claude Code requests are forwarded via the local proxy (127.0.0.1:15721). Keep OpenSunstar running — closing it will break Claude Code connectivity.\",\n \"proxyRunningHintDesktop\": \"Claude Desktop is routed via the local proxy. Keep OpenSunstar running — closing it will break connectivity.\",\n \"addAnother\": \"Add another\",\n \"openSettings\": \"Go to provider management\",\n \"firstProviderHint\": \"This is your first provider. Start the proxy in Settings if needed.\",\n \"verify\": \"Verify Key\",\n \"verifyOk\": \"Key is valid!\",\n \"verifyOkAnthropic\": \"Key is valid (no model list API — preset defaults will be used)\",\n \"verifyOkGemini\": \"The key is valid and the native Gemini endpoint passed verification.\",\n \"verifyOkWithModels\": \"Key is valid — fetched {{count}} models\",\n \"verifyOkNoModelList\": \"Key is valid (model list fetch failed — preset defaults will be used)\",\n \"verifyHint\": \"Verification follows the selected protocol. Anthropic uses about 1 token; OpenAI/Gemini model lists feed Advanced mappings when available.\",\n \"modelsList\": \"Available models ({{count}})\",\n \"myProviders\": \"API Key Access\",\n \"switch\": \"Switch\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"Custom\",\n \"aiGlobal\": \"International AI\",\n \"aiChina\": \"China AI\",\n \"relay\": \"Aggregators / Relays\",\n \"customModel\": \"Custom model configuration\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini Quick Connect enables Google and Gemini Native-compatible endpoints. OpenAI Chat gateways are shown as protocol mismatches.\"\n },\n \"custom\": {\n \"cardTitle\": \"Custom setup\",\n \"cardSubtitle\": \"Enter Base URL and model yourself\",\n \"hint\": \"Enter a name, Base URL, and default model. API format, credential field, and model mapping are available under Advanced below.\",\n \"geminiHint\": \"Enter a name, Gemini Native Base URL, and model. The fixed Gemini CLI native protocol is shown under Advanced.\",\n \"name\": \"Provider name\",\n \"namePlaceholder\": \"e.g. My DeepSeek gateway\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"Default model\",\n \"geminiModel\": \"Model ID\",\n \"defaultName\": \"Custom provider\"\n },\n \"advanced\": {\n \"title\": \"Advanced\",\n \"subtitle\": \"Defaults work for most cases\",\n \"upstreamModel\": \"Upstream model\",\n \"defaultModel\": \"Default model\",\n \"apiFormat\": \"API format\",\n \"authField\": \"Credential field\",\n \"roleMapping\": \"Model role mapping\",\n \"roleMappingHint\": \"Display names appear in /model; request models are written to the Claude Code environment.\",\n \"role\": \"Role\",\n \"displayName\": \"Display name\",\n \"requestModel\": \"Request model\",\n \"roleRequestModel\": \"{{role}} request model\",\n \"hiddenFromModelMenu\": \"Hidden from the /model menu\",\n \"fallbackModel\": \"Default fallback model\",\n \"desktopRoutes\": \"Claude Desktop route mapping\",\n \"customProtocolHint\": \"Choose the protocol implemented by the upstream endpoint.\",\n \"presetProtocolLocked\": \"The preset protocol is locked to its real endpoint to prevent connection failures.\",\n \"geminiNativeLocked\": \"Gemini CLI currently forwards native generateContent requests. Use a client entry with protocol conversion for OpenAI Chat endpoints.\"\n },\n \"badge\": {\n \"current\": \"Active\",\n \"proxy\": \"Local routing\"\n },\n \"warn\": {\n \"clearFailed\": \"Failed to clear legacy Quick Connect marker. If switching still fails, clear it manually in Settings.\",\n \"takeoverFailed\": \"Provider added, but proxy takeover failed. Enable the app takeover manually in Settings > Local Routing.\"\n },\n \"unavailableForApp\": \"This client protocol is not adapted yet\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex Quick Connect currently supports OpenAI Responses / Chat upstream protocols\",\n \"claudeOauthOnly\": \"This OAuth preset is for Claude clients\",\n \"geminiNativeOnly\": \"Gemini CLI requires Gemini Native or a Gemini-compatible gateway\",\n \"geminiOpenRouter\": \"OpenRouter exposes OpenAI Chat upstream while Gemini CLI currently forwards Gemini Native\"\n },\n \"error\": {\n \"emptyKey\": \"Please enter an API key\",\n \"failed\": \"Connection failed. Check your API key or network and retry.\",\n \"compensated\": \"Connection failed and the previous state was restored.\",\n \"recoveryRequired\": \"Connection failed and automatic recovery is incomplete.\",\n \"noBaseUrl\": \"Please enter a Base URL\",\n \"noModel\": \"Please enter a default model\"\n },\n \"addProvider\": \"Add Provider\",\n \"addProviderHint\": \"Choose a preset or add a compatible endpoint.\",\n \"configureProvider\": \"Configure Provider\",\n \"configureProviderHint\": \"Enter the required fields; setup and verification are automatic.\",\n \"connectAndEnable\": \"Connect & Enable\",\n \"myProvidersHint\": \"API keys stay in the local secure credential store; setup updates local configuration.\",\n \"officialConnection\": \"Subscription Account\",\n \"officialConnectionHint\": \"Sign in through the selected client.\",\n \"workbenchSubtitle\": \"Choose a client, then connect with a subscription account or API key.\",\n \"workbenchTitle\": \"Model Access\",\n \"subscription\": {\n \"loginStatus\": \"Login Status\",\n \"accountManagement\": \"Account Management\",\n \"claude\": {\n \"title\": \"Claude Subscription Login\",\n \"description\": \"Claude Code manages credentials; OpenSunstar reads status and quota.\",\n \"action\": \"Claude Subscription Login\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop Login\",\n \"description\": \"Claude Desktop manages login.\",\n \"action\": \"Get Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT Subscription Login\",\n \"description\": \"OpenSunstar manages this login.\",\n \"action\": \"ChatGPT Subscription Login\",\n \"dialogHint\": \"Connect an account with device authorization.\"\n },\n \"gemini\": {\n \"title\": \"Gemini Account Login\",\n \"description\": \"Gemini CLI manages credentials; OpenSunstar reads status and quota.\",\n \"action\": \"Gemini Login Guide\"\n }\n }\n },\n \"migration\": {\n \"success\": \"Configuration migrated successfully\",\n \"skillsSuccess\": \"Automatically imported {{count}} skill(s) into unified management\",\n \"skillsFailed\": \"Failed to auto import skills\",\n \"skillsFailedDescription\": \"Open the Skills page and click \\\"Import Existing\\\" to import manually (or restart and try again).\"\n },\n \"agents\": {\n \"title\": \"Subagents\",\n \"subtitle\": \"Sync Markdown definitions to Claude / Gemini / OpenCode agents directories\",\n \"empty\": \"No subagents yet\",\n \"emptyHint\": \"Create custom subagents and sync to ~/.claude/agents/ and similar paths\",\n \"add\": \"Add Subagent\",\n \"edit\": \"Edit Subagent\",\n \"count\": \"{{count}} subagents\",\n \"loadFailed\": \"Failed to load subagents\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"geminiHint\": \"Enable experimental.enableSubagents in Gemini settings.json for subagents to load\",\n \"codexHint\": \"Converted to TOML and written to ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"File sync not supported yet\"\n },\n \"confirm\": {\n \"deleteTitle\": \"Delete Subagent\",\n \"deleteMessage\": \"Delete subagent \\\"{{name}}\\\"? Synced files will be removed.\"\n },\n \"form\": {\n \"name\": \"Name\",\n \"description\": \"Description\",\n \"content\": \"Definition (Markdown + YAML frontmatter)\",\n \"syncTargets\": \"Sync to\",\n \"geminiNote\": \"Gemini requires experimental.enableSubagents in settings.json\",\n \"codexNote\": \"Codex auto-converts Markdown to TOML in ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"Test model\"\n },\n \"health\": {\n \"operational\": \"Operational\",\n \"degraded\": \"Degraded\",\n \"failed\": \"Failed\",\n \"circuitOpen\": \"Circuit Open\",\n \"consecutiveFailures\": \"{{count}} consecutive failures\",\n \"title\": \"Configuration status\",\n \"allClear\": \"All projects have healthy AI configurations.\",\n \"scan\": \"Duplicate scan\",\n \"subtitle\": \"Detect projects with the same name or duplicate paths\",\n \"noDuplicates\": \"No duplicate projects found\",\n \"level\": {\n \"ok\": \"OK\",\n \"warn\": \"Needs attention\",\n \"alert\": \"Abnormal\",\n \"unconfigured\": \"Not configured\",\n \"unmanaged\": \"Not managed\",\n \"unscanned\": \"Not scanned\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} config item(s) inconsistent with expected state\",\n \"unscanned\": \"AI configuration status scan has not completed\",\n \"unmanaged\": \"Project is not managed by OpenSunstar yet, so nothing can be judged as missing\",\n \"unconfigured\": \"No AI assets linked through OpenSunstar yet\",\n \"gaps\": \"To complete: {{items}}\",\n \"detectedOnly\": \"{{items}} — config files found but not managed\",\n \"globalOnly\": \"{{items}} — using global default config\",\n \"noMcp\": \"No MCP server linked\",\n \"noSkills\": \"No Skills configured\",\n \"noPrompts\": \"No Prompts linked\"\n },\n \"action\": {\n \"repair\": \"Repair drift\",\n \"inspectDetail\": \"View details\",\n \"configure\": \"Configure assets\",\n \"setup\": \"Set up\",\n \"adopt\": \"Start managing\",\n \"inspect\": \"View project\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} failover enabled\",\n \"disabled\": \"{{app}} failover disabled\",\n \"toggleFailed\": \"Operation failed: {{detail}}\",\n \"inQueue\": \"In queue\",\n \"addQueue\": \"Add\",\n \"priority\": {\n \"tooltip\": \"Failover priority {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} failover enabled\\nRequests follow queue priority (P1→P2→...)\",\n \"disabled\": \"Enable {{app}} failover\\nSwitches to queue P1 immediately, then falls back on failures\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"Service Address\",\n \"addressCopied\": \"Address copied\",\n \"currentProvider\": \"Current Provider:\",\n \"waitingFirstRequest\": \"Current Provider: Waiting for first request...\",\n \"stoppedTitle\": \"Routing Service Stopped\",\n \"stoppedDescription\": \"Use the toggle above to start the service\",\n \"openSettings\": \"Configure Routing Service\",\n \"stats\": {\n \"activeConnections\": \"Active Connections\",\n \"totalRequests\": \"Total Requests\",\n \"successRate\": \"Success Rate\",\n \"uptime\": \"Uptime\"\n }\n },\n \"settings\": {\n \"title\": \"Routing Service Settings\",\n \"description\": \"Configure local routing server listening address, port and runtime parameters. Changes take effect immediately after saving.\",\n \"alert\": {\n \"autoApply\": \"Changes will be automatically synced to the running routing service without manual restart.\"\n },\n \"basic\": {\n \"title\": \"Basic Settings\",\n \"description\": \"Configure routing service listening address and port.\"\n },\n \"advanced\": {\n \"title\": \"Advanced Parameters\",\n \"description\": \"Control request stability and logging.\"\n },\n \"timeout\": {\n \"title\": \"Timeout Settings\",\n \"description\": \"Configure timeout for streaming and non-streaming requests.\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"Listen Address\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"IP address the routing server listens on (recommended: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"Listen Port\",\n \"placeholder\": \"15721\",\n \"description\": \"Port number the routing server listens on (1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"Max Retries\",\n \"placeholder\": \"3\",\n \"description\": \"Number of retries on request failure (0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"Request Timeout (sec)\",\n \"placeholder\": \"0 (unlimited) or 300\",\n \"description\": \"Maximum wait time for a single request (0 = unlimited, or 10 ~ 600 seconds)\"\n },\n \"enableLogging\": {\n \"label\": \"Enable Logging\",\n \"description\": \"Log all routing requests for troubleshooting\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"Streaming First Byte Timeout (sec)\",\n \"description\": \"Maximum time to wait for the first data chunk\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"Streaming Idle Timeout (sec)\",\n \"description\": \"Maximum interval between data chunks\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"Non-Streaming Timeout (sec)\",\n \"description\": \"Total timeout for non-streaming requests\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"Please enter a valid IP address\",\n \"portMin\": \"Port must be greater than 1024\",\n \"portMax\": \"Port must be less than 65535\",\n \"retryMin\": \"Retry count cannot be negative\",\n \"retryMax\": \"Retry count cannot exceed 10\",\n \"timeoutNonNegative\": \"Timeout cannot be negative\",\n \"timeoutMax\": \"Timeout cannot exceed 600 seconds\",\n \"timeoutRange\": \"Please enter 0 or a value between 10-600\",\n \"streamingTimeoutMin\": \"Timeout must be at least 5 seconds\",\n \"streamingTimeoutMax\": \"Timeout cannot exceed 300 seconds\"\n },\n \"actions\": {\n \"save\": \"Save Configuration\"\n },\n \"toast\": {\n \"saved\": \"Routing configuration saved\",\n \"saveFailed\": \"Save failed: {{error}}\"\n },\n \"invalidPort\": \"Invalid port, please enter a number between 1024-65535\",\n \"invalidAddress\": \"Invalid address. Enter an IPv4 (e.g. 127.0.0.1), IPv6 (e.g. ::1), or localhost\",\n \"configSaved\": \"Routing configuration saved\",\n \"configSaveFailed\": \"Failed to save configuration\",\n \"restartRequired\": \"Restart routing service for address or port changes to take effect\"\n },\n \"switchFailed\": \"Switch failed: {{error}}\",\n \"takeover\": {\n \"hint\": \"Select apps to route — once enabled, requests from that app will go through local routing\",\n \"enabled\": \"{{app}} routing enabled\",\n \"disabled\": \"{{app}} routing disabled\",\n \"failed\": \"Failed to toggle routing: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} is routing - {{address}}:{{port}}\\nSwitch provider for hot switching\",\n \"broken\": \"{{appLabel}} is routing, but routing service is not running\",\n \"inactive\": \"Route {{appLabel}}'s requests through local routing\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"Routing service must be started to configure failover\",\n \"autoSwitch\": \"Auto Failover\",\n \"autoSwitchDescription\": \"When enabled, switches to queue P1 immediately and automatically tries the next provider in the queue on failures\"\n },\n \"failoverQueue\": {\n \"title\": \"Failover Queue\",\n \"description\": \"Manage failover order for each app's providers\",\n \"info\": \"When auto failover is enabled, requests follow the queue priority order (P1 first). On failures, the system will try the next provider in the queue.\",\n \"selectProvider\": \"Select a provider to add to queue\",\n \"noAvailableProviders\": \"No providers available to add\",\n \"empty\": \"Failover queue is empty. Add providers to enable automatic failover.\",\n \"orderHint\": \"Queue order matches the provider list order on the Home page. Reorder providers on the Home page to change priority.\",\n \"dragHint\": \"Drag providers to adjust failover order. Lower numbers have higher priority.\",\n \"toggleEnabled\": \"Enable/Disable\",\n \"addSuccess\": \"Added to failover queue\",\n \"addFailed\": \"Failed to add\",\n \"removeSuccess\": \"Removed from failover queue\",\n \"removeFailed\": \"Failed to remove\",\n \"reorderSuccess\": \"Queue order updated\",\n \"reorderFailed\": \"Failed to update order\",\n \"toggleFailed\": \"Failed to update status\"\n },\n \"autoFailover\": {\n \"info\": \"When the failover queue has multiple providers, the system will try them in priority order when requests fail. When a provider reaches the consecutive failure threshold, the circuit breaker will open and skip it temporarily.\",\n \"configSaved\": \"Auto failover config saved\",\n \"configSaveFailed\": \"Failed to save\",\n \"validationFailed\": \"The following fields are out of valid range: {{fields}}\",\n \"retrySettings\": \"Retry & Timeout Settings\",\n \"failureThreshold\": \"Failure Threshold\",\n \"failureThresholdHint\": \"Open circuit breaker after this many consecutive failures (recommended: 3-10)\",\n \"timeout\": \"Recovery Wait Time (seconds)\",\n \"timeoutHint\": \"Wait this long before trying to recover after circuit opens (recommended: 30-120)\",\n \"circuitBreakerSettings\": \"Circuit Breaker Settings\",\n \"successThreshold\": \"Recovery Success Threshold\",\n \"successThresholdHint\": \"Close circuit breaker after this many successes in half-open state\",\n \"errorRate\": \"Error Rate Threshold (%)\",\n \"errorRateHint\": \"Open circuit breaker when error rate exceeds this value\",\n \"minRequests\": \"Minimum Requests\",\n \"minRequestsHint\": \"Minimum requests before calculating error rate\",\n \"explanationTitle\": \"How It Works\",\n \"failureThresholdLabel\": \"Failure Threshold\",\n \"failureThresholdExplain\": \"Circuit breaker opens after this many consecutive failures, making the provider temporarily unavailable\",\n \"timeoutLabel\": \"Recovery Wait Time\",\n \"timeoutExplain\": \"After circuit opens, wait this long before trying half-open state\",\n \"successThresholdLabel\": \"Recovery Success Threshold\",\n \"successThresholdExplain\": \"In half-open state, close circuit breaker after this many successes, making provider available again\",\n \"errorRateLabel\": \"Error Rate Threshold\",\n \"errorRateExplain\": \"Open circuit breaker when error rate exceeds this value, even if failure threshold not reached\",\n \"maxRetries\": \"Max Retries\",\n \"timeoutSettings\": \"Timeout Settings\",\n \"streamingFirstByte\": \"Streaming First Byte Timeout\",\n \"streamingIdle\": \"Streaming Idle Timeout\",\n \"nonStreaming\": \"Non-Streaming Timeout\",\n \"maxRetriesHint\": \"Number of retries on request failure (0-10)\",\n \"streamingFirstByteHint\": \"Max time to wait for first data chunk, range 1-120s, default 60s\",\n \"streamingIdleHint\": \"Max interval between data chunks, range 60-600s, 0 to disable (prevents mid-stream stalls)\",\n \"nonStreamingHint\": \"Total timeout for non-streaming requests, range 60-1200s, default 600s (10 min)\"\n },\n \"logging\": {\n \"enabled\": \"Logging enabled\",\n \"disabled\": \"Logging disabled\",\n \"failed\": \"Failed to toggle logging\"\n },\n \"server\": {\n \"started\": \"Routing service started - {{address}}:{{port}}\",\n \"startFailed\": \"Failed to start routing service: {{detail}}\"\n },\n \"stoppedWithRestore\": \"Routing service stopped, all routing configs restored\",\n \"stopWithRestoreFailed\": \"Stop failed: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"Health check config saved\",\n \"configSaveFailed\": \"Save failed\",\n \"testModels\": \"Test Models\",\n \"claudeModel\": \"Claude Model\",\n \"codexModel\": \"Codex Model\",\n \"geminiModel\": \"Gemini Model\",\n \"checkParams\": \"Check Parameters\",\n \"timeout\": \"Timeout (seconds)\",\n \"maxRetries\": \"Max Retries\",\n \"degradedThreshold\": \"Degraded Threshold (ms)\",\n \"testPrompt\": \"Test Prompt\",\n \"operational\": \"{{providerName}} is operational ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} is slow ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} check failed: {{message}}\",\n \"rejected\": \"{{providerName}} check rejected: {{message}}\",\n \"error\": \"{{providerName}} check error: {{error}}\",\n \"modelNotFound\": \"{{providerName}} test model {{model}} does not exist or has been deprecated\",\n \"modelNotFoundHint\": \"This model may have been retired by the provider. Update the default test model in \\\"Model Test Config\\\".\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan quota has been exceeded\",\n \"quotaExceededHint\": \"Baidu Qianfan returned a Coding Plan quota-limit error. Wait for the 5-hour, weekly, or monthly quota refresh, or adjust the plan in the Qianfan console.\",\n \"httpHint\": {\n \"400\": \"Provider rejected request format. Health check probe may differ from actual usage.\",\n \"401\": \"API key may be invalid, or provider uses OAuth auth. Check failure doesn't mean it's unusable.\",\n \"402\": \"Account quota or billing issue.\",\n \"403\": \"Provider blocked this request. Some verify client identity; may work fine in actual use.\",\n \"404\": \"Endpoint not found. Check base URL and API path.\",\n \"429\": \"Too many requests. Try again later.\",\n \"5xx\": \"Provider internal error. Likely temporary.\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"Routing Master Switch\",\n \"appTakeover\": \"Routing Enabled\",\n \"perAppConfig\": \"Per-App Config\",\n \"circuitBreaker\": \"Circuit Breaker\",\n \"circuitBreakerSettings\": \"Circuit Breaker Settings\",\n \"failureThreshold\": \"Failure Threshold\",\n \"successThreshold\": \"Success Threshold\",\n \"recoveryTimeout\": \"Recovery Timeout\",\n \"errorRateThreshold\": \"Error Rate Threshold\",\n \"minRequests\": \"Min Requests\",\n \"timeoutConfig\": \"Timeout Config\",\n \"streamingFirstByte\": \"Streaming First Byte Timeout\",\n \"streamingIdle\": \"Streaming Idle Timeout\",\n \"nonStreaming\": \"Non-Streaming Timeout\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"Failure Threshold\",\n \"successThreshold\": \"Success Threshold\",\n \"timeoutSeconds\": \"Timeout (seconds)\",\n \"errorRateThreshold\": \"Error Rate Threshold (%)\",\n \"minRequests\": \"Minimum Requests\",\n \"validationFailed\": \"The following fields are out of valid range: {{fields}}\",\n \"configSaved\": \"Circuit breaker configuration saved\",\n \"saveFailed\": \"Save failed\",\n \"loading\": \"Loading...\",\n \"title\": \"Circuit Breaker Configuration\",\n \"description\": \"Adjust circuit breaker parameters to control fault detection and recovery behavior\",\n \"failureThresholdHint\": \"How many consecutive failures trigger the circuit breaker\",\n \"timeoutSecondsHint\": \"How long to wait before attempting recovery (half-open state)\",\n \"successThresholdHint\": \"How many successes in half-open state to close the circuit breaker\",\n \"errorRateThresholdHint\": \"Open circuit breaker when error rate exceeds this value\",\n \"minRequestsHint\": \"Minimum requests before calculating error rate\",\n \"saveConfig\": \"Save Configuration\",\n \"instructionsTitle\": \"Configuration Instructions\",\n \"instructions\": {\n \"failureThreshold\": \"Circuit breaker opens when consecutive failures reach this count\",\n \"timeout\": \"After circuit breaker opens, wait this time before attempting half-open\",\n \"successThreshold\": \"In half-open state, close circuit breaker when successes reach this count\",\n \"errorRate\": \"Circuit breaker opens when error rate exceeds this value\",\n \"minRequests\": \"Error rate is only calculated after request count reaches this value\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"Duplicate\",\n \"duplicatedAndSynced\": \"Universal provider duplicated and synced\",\n \"duplicateError\": \"Failed to duplicate universal provider\",\n \"title\": \"Universal Provider\",\n \"description\": \"Universal providers manage Claude, Codex, and Gemini configurations simultaneously. Changes are automatically synced to all enabled apps.\",\n \"add\": \"Add Universal Provider\",\n \"edit\": \"Edit Universal Provider\",\n \"empty\": \"No universal providers yet\",\n \"emptyHint\": \"Click the \\\"Add Universal Provider\\\" button below to create one\",\n \"selectPreset\": \"Select Preset Type\",\n \"name\": \"Name\",\n \"namePlaceholder\": \"e.g., My NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"Website URL\",\n \"websiteUrlPlaceholder\": \"https://example.com (optional, displayed in the list)\",\n \"notes\": \"Notes\",\n \"notesPlaceholder\": \"Optional: Add notes\",\n \"enabledApps\": \"Enabled Apps\",\n \"modelConfig\": \"Model Configuration\",\n \"model\": \"Model\",\n \"sync\": \"Sync to Apps\",\n \"synced\": \"Synced to all apps\",\n \"syncError\": \"Sync failed\",\n \"noAppsEnabled\": \"No apps enabled\",\n \"added\": \"Universal provider added\",\n \"addedAndSynced\": \"Universal provider added and synced\",\n \"updated\": \"Universal provider updated\",\n \"deleted\": \"Universal provider deleted\",\n \"addSuccess\": \"Universal provider added successfully\",\n \"addFailed\": \"Failed to add universal provider\",\n \"hint\": \"Cross-app unified config, auto-sync to Claude/Codex/Gemini\",\n \"manage\": \"Manage\",\n \"loadError\": \"Failed to load universal providers\",\n \"saveError\": \"Failed to save universal provider\",\n \"deleteError\": \"Failed to delete universal provider\",\n \"deleteConfirmTitle\": \"Delete Universal Provider\",\n \"deleteConfirmDescription\": \"Are you sure you want to delete \\\"{{name}}\\\"? This will also delete its generated provider configurations in each app.\",\n \"syncConfirmTitle\": \"Sync Universal Provider\",\n \"syncConfirmDescription\": \"Syncing \\\"{{name}}\\\" will overwrite the associated provider configurations in Claude, Codex, and Gemini. Do you want to continue?\",\n \"syncConfirm\": \"Sync\",\n \"saveAndSync\": \"Save & Sync\",\n \"savedAndSynced\": \"Saved and synced to all apps\",\n \"saveAndSyncError\": \"Failed to save and sync\",\n \"configJsonPreview\": \"Config JSON Preview\",\n \"configJsonPreviewHint\": \"The following configurations will be synced to each app (only the displayed fields will be overwritten, other custom settings will be preserved)\"\n },\n \"omo\": {\n \"editProfile\": \"Edit OMO Config\",\n \"newProfile\": \"New OMO Config\",\n \"profileName\": \"Name\",\n \"mainAgents\": \"Main Agents\",\n \"subAgents\": \"Sub Agents\",\n \"categories\": \"Categories\",\n \"customAgents\": \"Custom Agents\",\n \"noCustomAgents\": \"No custom agents\",\n \"otherFields\": \"Other Config\",\n \"globalConfig\": \"OMO Global Config\",\n \"globalConfigShort\": \"OMO Config\",\n \"globalConfigSaved\": \"Global config saved\",\n \"addProfile\": \"Add OMO Provider\",\n \"disabledItems\": \"Disabled Items\",\n \"advanced\": \"Advanced Settings\",\n \"profileCreated\": \"OMO config created\",\n \"profileUpdated\": \"OMO config updated\",\n \"invalidJson\": \"Other Fields contains invalid JSON\",\n \"confirmDelete\": \"Delete Config\",\n \"confirmDeleteMsg\": \"Delete \\\"{{name}}\\\"?\",\n \"profileDeleted\": \"Config deleted\",\n \"imported\": \"Imported as \\\"{{name}}\\\"\",\n \"import\": \"Import\",\n \"global\": \"Global\",\n \"empty\": \"No OMO configs yet. Click + Add or Import from local.\",\n \"applied\": \"Applied\",\n \"apply\": \"Apply\",\n \"enable\": \"Enable\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"OMO disabled\",\n \"disableFailed\": \"Failed to disable OMO: {{error}}\",\n \"selectPlaceholder\": \"Select...\",\n \"clear\": \"Clear\",\n \"clearWrapped\": \"(Clear)\",\n \"defaultWrapped\": \"(Default)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"Select configured model\",\n \"selectModel\": \"Select configured model\",\n \"recommendedHint\": \"Recommended: {{model}}\",\n \"searchModel\": \"Search model...\",\n \"selectModelFirst\": \"Select model first\",\n \"noEnabledModels\": \"No configured models\",\n \"noVariantsForModel\": \"No variants for model\",\n \"currentValueNotEnabled\": \"{{value}} (current value, not configured)\",\n \"currentValueUnavailable\": \"{{value}} (current value, unavailable)\",\n \"advancedLabel\": \"Advanced\",\n \"advancedJsonInvalid\": \"Advanced JSON is invalid\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults\",\n \"noEnabledModelsWarning\": \"No configured models available. Configure OpenCode models first.\",\n \"modelSourcePartialWarning\": \"Some provider model configs are invalid and were skipped.\",\n \"modelSourceFallbackWarning\": \"Failed to load live provider state. Falling back to configured providers.\",\n \"importLocalReplaceSuccess\": \"Imported local file and replaced Agents/Categories/Other Fields\",\n \"importLocalFailed\": \"Failed to read local file: {{error}}\",\n \"agentKeyPlaceholder\": \"agent key\",\n \"categoryKeyPlaceholder\": \"category key\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"Custom\",\n \"customCategories\": \"Custom Categories\",\n \"modelConfiguration\": \"Model Configuration\",\n \"fillRecommended\": \"Fill Recommended\",\n \"fillRecommendedSuccess\": \"Filled {{count}} recommended models\",\n \"fillRecommendedPartial\": \"Filled {{filled}} recommended models, {{unmatched}} unmatched\",\n \"fillRecommendedMostlyUnmatched\": \"Filled only {{filled}}, {{unmatched}} unmatched (e.g. {{examples}}). Configure providers offering these models or pick a substitute.\",\n \"fillRecommendedAllSet\": \"All slots already have models configured\",\n \"fillRecommendedNoMatch\": \"Recommended models not found in configured providers (e.g. {{examples}})\",\n \"configSummary\": \"{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params\",\n \"enabledModelsCount\": \"{{count}} configured models available\",\n \"source\": \"from:\",\n \"otherFieldsJson\": \"Other Fields (JSON)\",\n \"slimOtherFieldsHint\": \"Use this area for top-level OMO Slim config such as council, fallback, multiplexer, disabled_mcps, and todoContinuation.\",\n \"searchOrType\": \"Search or type custom value...\",\n \"noMatches\": \"No matches\",\n \"jsonMustBeObject\": \"{{field}} must be a JSON object\",\n \"jsonInvalid\": \"{{field}} contains invalid JSON\",\n \"importGlobalSuccess\": \"Imported global config from local file (unsaved)\",\n \"importGlobalFailed\": \"Failed to read local file: {{error}}\",\n \"importLocal\": \"Import Local\",\n \"saveGlobalConfig\": \"Save Global Config\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"Reset\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent Config\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"Disabled Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"Disabled MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"Disabled Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"Disabled Skills\",\n \"advancedLsp\": \"LSP Config\",\n \"advancedExperimental\": \"Experimental Features\",\n \"advancedBackgroundTask\": \"Background Tasks\",\n \"advancedBrowserAutomation\": \"Browser Automation\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"Main orchestrator\",\n \"hephaestus\": \"Autonomous deep worker\",\n \"prometheus\": \"Strategic planner\",\n \"atlas\": \"Task manager\",\n \"oracle\": \"Strategic advisor\",\n \"librarian\": \"Multi-repo researcher\",\n \"explore\": \"Fast code search\",\n \"multimodalLooker\": \"Media analyzer\",\n \"metis\": \"Pre-plan analysis advisor\",\n \"momus\": \"Plan reviewer\",\n \"sisyphusJunior\": \"Delegated task executor\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"Main orchestrator responsible for task planning, delegation and parallel execution. Uses extended thinking (32k budget) and drives workflows through TODO lists to ensure task completion.\",\n \"atlas\": \"Main orchestrator (holds TODO list) responsible for task distribution and coordination during execution phase. Delegates to specialized agents rather than completing all work directly.\",\n \"prometheus\": \"Strategic planner that collects requirements through interview mode and creates detailed work plans. Can only read/write Markdown files in .sisyphus/ directory, never writes code directly.\",\n \"hephaestus\": \"Autonomous deep worker (\\\"legitimate craftsman\\\") inspired by AmpCode deep mode. Goal-oriented execution that launches 2-5 explore/librarian agents in parallel for research before taking action.\",\n \"oracle\": \"Architecture decision and debugging advisor. Read-only consulting agent providing excellent logical reasoning and deep analysis. Cannot write files or delegate tasks.\",\n \"librarian\": \"Multi-repository analysis and documentation retrieval expert. Deeply understands codebases and provides evidence-based answers. Excels at finding official documentation and open-source implementation examples.\",\n \"explore\": \"Fast codebase exploration and context grep expert. Uses lightweight models for high-speed search. The scout for understanding code structure.\",\n \"multimodalLooker\": \"Visual content expert that analyzes PDFs, images, charts and other non-text media, extracting information and insights from them.\",\n \"metis\": \"Plan consultant that performs pre-analysis before planning. Identifies hidden intents, ambiguities and AI failure points to prevent over-engineering.\",\n \"momus\": \"Plan reviewer that validates plan clarity, verifiability and completeness with high precision. Rejects and requests revisions until plans are perfect.\",\n \"sisyphusJunior\": \"Category-generated executor, automatically created via category parameters. Focuses on executing assigned tasks and cannot re-delegate, preventing infinite delegation loops.\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"Visual/frontend engineering\",\n \"ultrabrain\": \"Ultra thinking\",\n \"deep\": \"Deep work\",\n \"artistry\": \"Creative/artistic\",\n \"quick\": \"Quick response\",\n \"unspecifiedLow\": \"General low tier\",\n \"unspecifiedHigh\": \"General high tier\",\n \"writing\": \"Writing\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"Frontend and visual engineering category for UI/UX design, styling, animation and interface implementation. Defaults to Gemini 3.5 Flash model.\",\n \"ultrabrain\": \"Deep logical reasoning category for complex architectural decisions requiring extensive analysis. Defaults to GPT-5.3 Codex ultra-high reasoning variant.\",\n \"deep\": \"Deep autonomous problem-solving category with goal-oriented execution. Conducts thorough research before action, suitable for difficult problems requiring deep understanding.\",\n \"artistry\": \"Highly creative and artistic task category that inspires novel ideas and creative solutions. Defaults to Gemini 3.5 Flash high variant.\",\n \"quick\": \"Lightweight task category for single-file modifications, typo fixes, and simple adjustments. Defaults to Claude Haiku 4.5 fast model.\",\n \"unspecifiedLow\": \"Uncategorized low-effort task category for tasks that don't fit other categories with small workload. Defaults to Claude Sonnet 4.5.\",\n \"unspecifiedHigh\": \"Uncategorized high-effort task category for tasks that don't fit other categories with large workload. Defaults to Claude Opus 4.8 max variant.\",\n \"writing\": \"Writing category for documentation, prose and technical writing. Defaults to Kimi K2.5 model.\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"Orchestrator\",\n \"oracle\": \"Oracle\",\n \"librarian\": \"Librarian\",\n \"explorer\": \"Explorer\",\n \"designer\": \"Designer\",\n \"fixer\": \"Fixer\",\n \"council\": \"Council\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"Writes executable code, orchestrates multi-agent workflow, summons experts\",\n \"oracle\": \"Root cause analysis, architecture review, debugging guidance (read-only)\",\n \"librarian\": \"Documentation lookup, GitHub code search (read-only)\",\n \"explorer\": \"Regex search, AST pattern matching, file discovery (read-only)\",\n \"designer\": \"Modern responsive design, CSS/Tailwind expertise\",\n \"fixer\": \"Code implementation, refactoring, testing, verification\",\n \"council\": \"Multi-model consensus agent. Runs multiple read-only councillors in parallel, then lets the master synthesize the final answer.\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"Default Model\",\n \"description\": \"Configure the default primary model and fallback models for OpenClaw\",\n \"primary\": \"Primary Model\",\n \"primaryPlaceholder\": \"e.g., deepseek/deepseek-chat\",\n \"fallbacks\": \"Fallback Models\",\n \"fallbacksPlaceholder\": \"e.g., openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"Add Fallback Model\",\n \"saved\": \"Default model configuration saved\",\n \"saveFailed\": \"Failed to save default model\"\n },\n \"modelCatalog\": {\n \"title\": \"Model Catalog\",\n \"description\": \"Configure model aliases and allowlist\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"e.g., deepseek/deepseek-chat\",\n \"alias\": \"Alias\",\n \"aliasPlaceholder\": \"e.g., DeepSeek\",\n \"addEntry\": \"Add Model\",\n \"removeEntry\": \"Remove\",\n \"saved\": \"Model catalog saved\",\n \"saveFailed\": \"Failed to save model catalog\",\n \"empty\": \"No model catalog entries\",\n \"emptyHint\": \"Add models to the catalog to configure aliases\"\n },\n \"suggestedDefaults\": \"Apply Suggested Defaults\",\n \"suggestedDefaultsHint\": \"Use this preset's recommended default model configuration\"\n },\n \"sidebar\": {\n \"kanban\": \"AI Kanban Board\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"Sync Backup\",\n \"agentConfig\": \"Agent Config\",\n \"projectConfig\": \"Project Config\",\n \"planning\": \"Coming Soon\",\n \"section\": {\n \"projects\": \"Projects\",\n \"myProjects\": \"My Projects\",\n \"monitor\": \"Monitoring\",\n \"aiModels\": \"AI Models\",\n \"cloudSync\": \"Cross-device Cloud Sync\",\n \"teamCollab\": \"Team Collaboration\",\n \"syncCollab\": \"Sync & Collaboration\"\n }\n },\n \"kanban\": {\n \"subtitle\": \"AI-driven global multi-perspective project portfolio matrix: full lifecycle management, health assessment, dynamic cost monitoring\",\n \"scanning\": \"Scanning {{done}}/{{total}} projects…\",\n \"refresh\": \"Refresh metrics\",\n \"addProject\": \"Add project\",\n \"searchPlaceholder\": \"Search projects…\",\n \"confirmRemoveTitle\": \"Remove from AI Kanban Board?\",\n \"confirmRemove\": \"「{{name}}」 will be removed from the portfolio. Disk files are not deleted; local board data (stage, progress, etc.) will be cleared.\",\n \"confirmRemoveBtn\": \"Remove\",\n \"removed\": \"Removed 「{{name}}」\",\n \"commits7dHint\": \"{{count}} commits in the last 7 days\",\n \"commitsWindowHint\": \"{{count}} commits in the last {{days}} days\",\n \"noRecentActivity\": \"No commits in the last 7 days\",\n \"noRecentActivityWindow\": \"No commits in the last {{days}} days\",\n \"stageDistribution\": \"Stage distribution\",\n \"activity\": {\n \"veryHigh\": \"Very high\",\n \"high\": \"High\",\n \"medium\": \"Medium\",\n \"low\": \"Low\"\n },\n \"detail\": {\n \"tabs\": \"Project details\",\n \"overview\": \"Overview\",\n \"aiAssets\": \"AI assets\",\n \"projectAssets\": \"Assets enabled for this project\",\n \"projectAssetsHint\": \"Selections apply to this project only; global library is in the sidebar; links are stored locally.\"\n },\n \"score\": {\n \"health\": \"Health score\"\n },\n \"readiness\": {\n \"title\": \"Agent readiness\",\n \"loading\": \"Assessing configuration readiness…\",\n \"hint\": \"Click an item to jump to the right place; link project-level assets under the AI assets tab.\",\n \"configure\": \"Configure\",\n \"configureGlobal\": \"Open global settings\",\n \"manage\": \"Manage\",\n \"openAssetsTab\": \"Open project asset setup\",\n \"compactTitle\": \"Project configuration readiness\",\n \"normalCount\": \"{{count}} ready\",\n \"driftCount\": \"{{count}} inconsistent\",\n \"missingCount\": \"{{count}} missing\",\n \"priorityDrift\": \"Prioritize: {{label}} is inconsistent\",\n \"priorityMissing\": \"Prioritize: configure {{label}}\",\n \"completedSection\": \"{{count}} completed\",\n \"badgeHint\": \"click for details\",\n \"scanEffective\": \"Effective-state scan\",\n \"forApp\": \"Scored for {{app}}\",\n \"status\": {\n \"global_only\": \"Source: global baseline\",\n \"detected_only\": \"Source: repo detected\",\n \"partial\": \"Partial CLI support\",\n \"not_required\": \"Not supported by the current target CLI; excluded from scoring\",\n \"unmanaged\": \"Project is not managed by OpenSunstar yet, so this cannot be judged as missing\",\n \"unknown\": \"Cannot be determined yet\",\n \"unhealthy\": \"Config does not match the expected state\"\n },\n \"effective\": {\n \"configured\": \"Configured\",\n \"effective\": \"In effect\",\n \"drifted\": \"Not in effect\",\n \"unconfigured\": \"Not configured\",\n \"unchecked\": \"Not compared\"\n },\n \"driftBadge\": \"{{count}} config mismatch item(s)\",\n \"driftShort\": \"To fix {{count}}\",\n \"repairDrift\": \"Repair config\",\n \"repairSuccess\": \"Write-back verified\",\n \"repairFailed\": \"Config mismatch remains after repair\",\n \"repairError\": \"Repair request failed — try again\",\n \"repairNoop\": \"No repair needed for this item\"\n },\n \"governance\": {\n \"title\": \"Config effectiveness\",\n \"forApp\": \"Target CLI: {{app}}\",\n \"scannedProjects\": \"Scanned projects\",\n \"ofTotal\": \"{{total}} total\",\n \"driftProjects\": \"Projects with config mismatch\",\n \"driftItems\": \"{{count}} item(s) to fix\",\n \"effectiveRate\": \"Effective rate\",\n \"comparableItems\": \"{{count}} comparable\",\n \"effectiveItems\": \"Effective items\",\n \"portfolioScope\": \"Portfolio aggregate\",\n \"driftBreakdown\": \"Config mismatch by asset type\",\n \"allEffective\": \"All comparable assets are effective.\",\n \"awaitingScan\": \"Governance metrics appear after readiness scan completes.\",\n \"repairConfirmTitle\": \"Confirm write-back repair?\",\n \"repairConfirmProjectTitle\": \"Repair all mismatched items for this project?\",\n \"repairConfirmAssetIntro\": \"OpenSunstar will write the library copy of \\\"{{label}}\\\" to the project-level files for {{app}}. This may overwrite manual edits you made outside OpenSunstar.\",\n \"repairConfirmProjectIntro\": \"Repair all {{count}} mismatched config item(s) for \\\"{{name}}\\\" by writing OpenSunstar library content to {{app}} project files. External manual edits may be overwritten.\",\n \"repairConfirmDetail\": \"Mismatch detail: {{detail}}\",\n \"repairConfirmPath\": \"Target path: {{path}}\",\n \"repairConfirmProceed\": \"Write-back and re-scan run immediately after you confirm. This cannot be undone automatically.\",\n \"repairConfirmAction\": \"Confirm write-back\",\n \"repairConfirmProjectAction\": \"Repair all\",\n \"tooltip\": {\n \"scannedProjects\": \"Number of projects that have completed AI configuration readiness checks\",\n \"driftProjects\": \"Projects with at least 1 AI config item inconsistent with the expected state saved in OpenSunstar, usually because local files were modified or deleted outside OpenSunstar.\",\n \"effectiveRate\": \"Effective rate = effective items ÷ comparable items.\\nEffective = config correctly written to project; comparable = total check items excluding unsupported.\",\n \"effectiveItems\": \"Total number of AI config check items correctly applied across all projects.\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"Portfolio effective-state scan: no config mismatch detected.\",\n \"title\": \"{{projects}} project(s) with config mismatch ({{items}} item(s) total)\",\n \"forApp\": \"Target CLI: {{app}}\",\n \"itemCount\": \"{{count}} to fix\",\n \"repairAll\": \"Repair all items to fix\",\n \"repairAllSuccess\": \"Repaired {{count}} config mismatch item(s) and verified\",\n \"repairPartial\": \"Fixed {{fixed}}, {{remaining}} config mismatch item(s) remain\",\n \"repairNone\": \"No config mismatch items to repair\"\n }\n },\n \"projectConfig\": {\n \"hint\": \"Choose MCP, Skills, and Prompts to enable for this project. Maintain the global library under Agent config in the sidebar.\",\n \"mcpServers\": \"MCP servers\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"No MCP servers yet\",\n \"noSkills\": \"No installed Skills yet\",\n \"noPrompts\": \"No Prompts yet\",\n \"goToMcp\": \"Go to MCP\",\n \"goToSkills\": \"Go to Skills\",\n \"goToPrompts\": \"Go to Prompts\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore rules\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"No Commands yet\",\n \"noHooks\": \"No Hooks yet\",\n \"noIgnore\": \"No Ignore rules yet\",\n \"noPermissions\": \"No Permissions yet\",\n \"noSubagents\": \"No Subagents yet\",\n \"goToCommands\": \"Go to Commands\",\n \"goToHooks\": \"Go to Hooks\",\n \"goToIgnore\": \"Go to Ignore\",\n \"goToPermissions\": \"Go to Permissions\",\n \"goToSubagents\": \"Go to Subagents\"\n },\n \"projectAssets\": {\n \"projectLink\": \"Link to this project\",\n \"hint\": \"Choose the AI asset subset to enable for this project. Links are stored in OpenSunstar only and do not modify the repo; syncing to CLIs still uses the global library in the sidebar.\",\n \"partialHint\": \"Some CLIs have limited support — hover chips for details\",\n \"globalBaselineHint\": \"{{count}} global rule(s) act as a safety baseline; you can enable a project subset separately.\",\n \"switchAllUnsupported\": \"This asset type cannot be synced to any target CLI — cannot enable for the project\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop does not participate in this asset sync\",\n \"openclawMcp\": \"OpenClaw does not support MCP sync\",\n \"openclawSkills\": \"OpenClaw does not support Skills sync\",\n \"openclawCommands\": \"OpenClaw does not support Commands sync\",\n \"openclawIgnore\": \"OpenClaw does not support Ignore sync\",\n \"openclawSubagents\": \"OpenClaw does not support Subagents sync\",\n \"codexCommands\": \"Codex does not use standalone slash command files\",\n \"codexSubagent\": \"Codex writes agents via TOML to ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks write-back is Claude Code only\",\n \"permissionsClaudeOnly\": \"Permissions write-back is Claude Code only\",\n \"hermesSubagents\": \"Hermes does not sync Subagent files\"\n }\n },\n \"board\": {\n \"summary\": {\n \"title\": \"Portfolio overview\",\n \"totalProjects\": \"Total projects\",\n \"totalCodeLines\": \"Total lines of code\",\n \"linesUnit\": \"lines\",\n \"avgActivity\": \"Avg. activity ({{days}} days)\",\n \"commitsInWindow\": \"Commits ({{days}} days)\",\n \"thisWeek\": \"Commits (7 days)\",\n \"windowLabel\": \"Git activity window\",\n \"daysUnit\": \"days\",\n \"updatesUnit\": \"commits\"\n },\n \"duplicateCleanup\": \"Duplicate asset detection\"\n },\n \"projectBlueprint\": {\n \"title\": \"Project baseline Blueprint\",\n \"hint\": \"Pick a template to link global library assets. Merge mode only adds links; existing config is kept.\",\n \"loading\": \"Loading blueprints…\",\n \"exportSnapshot\": \"Export snapshot\",\n \"targetCli\": \"Project target CLI\",\n \"targetDefault\": \"Use board default\",\n \"saveTarget\": \"Save\",\n \"previewing\": \"Building preview…\",\n \"previewTitle\": \"Preview: {{count}} new links ({{name}})\",\n \"apply\": \"Apply Blueprint\",\n \"applied\": \"Applied \\\"{{name}}\\\" — linked {{count}} assets\",\n \"targetSaved\": \"Project target CLI saved\",\n \"snapshotExported\": \"Baseline snapshot exported: {{path}}\"\n },\n \"subscription\": {\n \"title\": \"Subscription Quota\",\n \"fiveHour\": \"5-Hour\",\n \"sevenDay\": \"7-Day\",\n \"sevenDayOpus\": \"7-Day (Opus)\",\n \"sevenDaySonnet\": \"7-Day (Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"Weekly\",\n \"copilotPremium\": \"Premium\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"Resets in {{time}}\",\n \"extraUsage\": \"Extra Usage\",\n \"expired\": \"Session expired\",\n \"expiredHint\": \"Run the {{tool}} command to refresh your login\",\n \"queryFailed\": \"Query failed\",\n \"refresh\": \"Refresh\"\n },\n \"methodology\": {\n \"sidebar\": \"Workflow Orchestration\",\n \"title\": \"Workflow Orchestration\",\n \"subtitle\": \"Build executable workflows and governance checks for projects. Methodology detection is optional diagnostics.\",\n \"scanAll\": \"Scan all projects\",\n \"scanAllNoProjects\": \"Add a project first to scan\",\n \"scanComplete\": \"Framework detection complete\",\n \"scanCompleteWithCount\": \"Scanned {{count}} projects\",\n \"tabMarket\": \"Methodology Detection\",\n \"tabOrchestration\": \"Workflow Configuration\",\n \"notScanned\": \"Not scanned\",\n \"verified\": \"Detected\",\n \"inferred\": \"Possibly used\",\n \"absent\": \"Not detected\",\n \"detectedInProjects\": \"{{detected}}/{{total}} projects detected\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} projects possibly used\",\n \"absentInAll\": \"Not detected in {{total}} projects\",\n \"noneDetectedTitle\": \"No methodology framework detected\",\n \"noneDetectedGuidance\": \"Recommend starting with flow-kit (pure Markdown template system) or spec-kit (spec toolchain). The review-only preset suits projects with an existing code review workflow—no framework installation needed.\",\n \"scanPromptTitle\": \"Methodology frameworks not scanned yet\",\n \"scanPromptBody\": \"Click Scan all projects for a read-only probe, or go directly to Preset Orchestration / Custom Orchestration—no framework install or detection required.\",\n \"goToOrchestration\": \"Preset Orchestration\",\n \"goToRecipe\": \"Custom Orchestration\",\n \"recommendedPreset\": \"Recommended tier: {{preset}}\",\n \"recommendedFrameworks\": \"Framework reference catalog\",\n \"recommendedFrameworksHint\": \"Supported open-source methodologies for discovery and selection (not an install wizard)\",\n \"detectedFrameworks\": \"Detected frameworks\",\n \"directOrchestrationTitle\": \"Start orchestration without a framework\",\n \"directOrchestrationHint\": \"Preset and custom orchestration work independently—export workflow.profile.json or Recipe files.\",\n \"presetFull\": \"Full workflow\",\n \"presetStandard\": \"Standard workflow\",\n \"presetMvp\": \"MVP workflow\",\n \"presetReviewOnly\": \"Review only\",\n \"noDescriptors\": \"Framework catalog is empty. Please confirm the database is initialized.\",\n \"detectionMatrix\": \"Detection Matrix\",\n \"detectionMatrixHint\": \"Project × framework detection results (✓ detected / ? possibly used / ✗ not detected / — not scanned)\",\n \"matrixFramework\": \"Framework \\\\ Project\",\n \"orchestrationEntry\": \"Preset Orchestration Configurator\",\n \"orchestrationHint\": \"Independent dimension: Select a project, configure flow preset, modules, and stages, then export workflow.profile.json or flow-config.yaml. No need to scan frameworks first.\",\n \"orchestrationNoProjects\": \"No projects yet. Please add a project in the workspace before configuring flow orchestration.\",\n \"orchestrationSelectProject\": \"Select project\",\n \"orchestrationChooseProject\": \"— Choose a project —\",\n \"orchestrationPickProjectHint\": \"Pick a project from the dropdown above to start configuring SDD flow orchestration.\",\n \"tabRecipe\": \"Change Execution Plan\",\n \"recipeEntry\": \"Change Execution Plan\",\n \"recipeHint\": \"Independent dimension: Visual stage graph + freely combine stages and modules, export YAML+Markdown hybrid Recipe files. Can be used standalone without configuring other dimensions.\",\n \"recipeNoProjects\": \"No projects yet. Please add a project to your workspace first.\",\n \"recipeSelectProject\": \"Select project\",\n \"recipePickPlaceholder\": \"— Choose a project —\",\n \"recipePickProjectHint\": \"Pick a project from the dropdown above to start composing a Recipe.\",\n \"tabDesignContract\": \"Design Contract\",\n \"designContractEntry\": \"Design Contract Configurator\",\n \"designContractHint\": \"Independent dimension: Choose a brand template or custom colors to generate DESIGN.md + DTCG tokens. Unrelated to SDD methodology — any project with frontend/UI can use it independently.\",\n \"designContractNoProjects\": \"No projects yet. Please add a project to your workspace first.\",\n \"designContractSelectProject\": \"Select project\",\n \"designContractPickPlaceholder\": \"— Choose a project —\",\n \"designContractPickProjectHint\": \"Pick a project from the dropdown above to start configuring a design contract.\",\n \"tabRulesContext\": \"Rules & Context\",\n \"rulesContextPickProjectHint\": \"Pick a project from the dropdown above to view linked rules and context files.\"\n },\n \"rulesContext\": {\n \"title\": \"Project Rules\",\n \"hint\": \"Rule fragments linked to this project. Rules with globs only apply when matching files exist.\",\n \"empty\": \"No linked rules yet. Create rule fragments in Agent Config > Prompts, then link them in the project detail.\",\n \"fragment\": \"Fragment\",\n \"allTargets\": \"All tools\",\n \"universal\": \"Universal\",\n \"contextFiles\": \"Context Files\",\n \"contextFilesHint\": \"Context files generated per AI tool during project sync. Only tools with linked prompts will generate files.\",\n \"willSync\": \"Will sync\",\n \"managed\": \"Managed\",\n \"userCreated\": \"User-created\",\n \"pendingSync\": \"Pending sync\",\n \"notLinked\": \"Not linked\"\n },\n \"recipeComposer\": {\n \"title\": \"Recipe Composer\",\n \"hybrid\": \"YAML+Markdown hybrid\",\n \"loading\": \"Loading recipe composer...\",\n \"preset\": \"Preset\",\n \"projectType\": \"Project Type\",\n \"projectTypeBackend\": \"Backend\",\n \"projectTypeFrontend\": \"Frontend\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe Name\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Recipe composed from standard preset\",\n \"stageGraph\": \"Stage Graph\",\n \"nodesCount\": \"{{count}} nodes\",\n \"modules\": \"Modules\",\n \"stages\": \"Stages\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} enabled\",\n \"notes\": \"Notes (optional)\",\n \"notesPlaceholder\": \"Custom notes for this recipe...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"e.g. feat-auth, fix-login-bug\",\n \"preview\": \"Preview\",\n \"copy\": \"Copy\",\n \"export\": \"Export Recipe\",\n \"install\": \"Install to Project\",\n \"installedSummary\": \"Installed: {{created}} files created\",\n \"installedSkipped\": \", {{skipped}} skipped (already exist)\",\n \"exists\": \"(exists)\",\n \"previewTitle\": \"Preview (YAML+Markdown hybrid)\",\n \"collapse\": \"Collapse\",\n \"savedRecipes\": \"Saved Recipes\",\n \"fitWidth\": \"Fit width\",\n \"actualSize\": \"Actual size\",\n \"lateral\": \"Lateral (cross-cutting)\",\n \"legendStandalone\": \"Standalone\",\n \"legendSemi\": \"Semi-standalone\",\n \"legendBranch\": \"Branch\",\n \"legendNoArtifacts\": \"No artifacts\",\n \"toastExported\": \"Recipe \\\"{{name}}\\\" exported to .opensunstar/recipe/\",\n \"toastCopied\": \"Recipe content copied to clipboard\",\n \"toastCopyFailed\": \"Failed to copy\",\n \"toastChangeIdRequired\": \"Please enter a Change ID (e.g. feat-auth)\",\n \"toastInstalled\": \"Recipe installed: {{created}} files created\",\n \"toastDeleted\": \"Recipe \\\"{{name}}\\\" deleted\"\n },\n \"designContract\": {\n \"title\": \"Design Contract\",\n \"name\": \"Contract Name\",\n \"description\": \"Description\",\n \"templates\": \"Templates\",\n \"tokens\": \"Tokens\",\n \"preview\": \"Preview\",\n \"import\": \"Import\",\n \"colors\": \"Colors\",\n \"typography\": \"Typography\",\n \"spacing\": \"Spacing Base (px)\",\n \"copy\": \"Copy\",\n \"copied\": \"Copied to clipboard\",\n \"exported\": \"Exported\",\n \"installed\": \"Installed\",\n \"loadingTemplate\": \"Loading template...\",\n \"noPreview\": \"Click Preview to generate DESIGN.md\",\n \"importFile\": \"Import from File\",\n \"pickFile\": \"Pick DESIGN.md file...\",\n \"importUrl\": \"Import from URL\",\n \"previewBtn\": \"Preview\",\n \"copyBtn\": \"Copy\",\n \"exportBtn\": \"Export\",\n \"installBtn\": \"Install to Project\",\n \"installResult\": \"Installed\",\n \"filesCreated\": \"files created\",\n \"filesSkipped\": \"skipped\",\n \"exists\": \"exists\"\n },\n \"installConfirm\": {\n \"title\": \"Confirm Install to Project\",\n \"auditScan\": \"Security Audit Scan\",\n \"filesScanned\": \"files scanned\",\n \"noFindings\": \"No security issues found.\",\n \"auditBlocked\": \"CRITICAL issues found by security audit. Install blocked. Please fix and retry.\",\n \"fileList\": \"File List\",\n \"toCreate\": \"will create\",\n \"toSkip\": \"already exists, skip\",\n \"create\": \"Create\",\n \"skip\": \"Skip\",\n \"existing\": \"Existing Content\",\n \"wouldOverwrite\": \"Would overwrite (currently skipped)\",\n \"newContent\": \"New Content\",\n \"cancel\": \"Cancel\",\n \"confirmInstall\": \"Confirm Install\"\n },\n \"sync\": {\n \"waiting\": \"Waiting for changes\",\n \"syncing\": \"Syncing...\",\n \"synced\": \"Synced\",\n \"failed\": \"Sync failed\",\n \"disabled\": \"Disabled\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} days ago\"\n },\n \"onboarding\": {\n \"title\": \"Quick Start\",\n \"dismiss\": \"Dismiss guide\",\n \"prev\": \"Previous\",\n \"next\": \"Next\",\n \"done\": \"Got it\",\n \"step1\": {\n \"title\": \"Add a project\",\n \"desc\": \"Everything revolves around projects. Click \\\"My Projects → Add Project\\\" in the sidebar to bring your repo in — OpenSunstar will automatically scan its AI configuration status.\"\n },\n \"step2\": {\n \"title\": \"Project Cockpit — anything today?\",\n \"desc\": \"\\\"Alerts\\\" answers one question: is there anything today. All clear shows \\\"All clear\\\" — no news is the best news. \\\"Project Board\\\" holds aggregate metrics and asset matrix; overview content doesn't occupy the boot-time first glance.\"\n },\n \"step3\": {\n \"title\": \"AI Asset Setup — land assets on a project\",\n \"desc\": \"Under \\\"Project Config → AI Asset Setup\\\", link MCP servers, Skills, Prompts and other assets to a project. The sidebar's \\\"Agent Config\\\" manages the global library; this page manages how those assets attach to a project.\"\n },\n \"step4\": {\n \"title\": \"Workflow Orchestration — build executable workflows\",\n \"desc\": \"Under \\\"Project Config → Workflow Orchestration\\\", configure stages, presets and change-execution plans. Methodology detection, preset orchestration, custom orchestration, design contracts — four independent dimensions, pick as needed, no ordering dependency.\"\n }\n },\n \"repairPreview\": {\n \"title\": \"Config Repair Preview\",\n \"description\": \"Project \\\"{{name}}\\\" has {{count}} config mismatch item(s). Select the ones to repair:\",\n \"loading\": \"Scanning items to fix…\",\n \"empty\": \"No config mismatch found, nothing to repair\",\n \"selectAll\": \"Select all\",\n \"deselectAll\": \"Deselect all\",\n \"safetyHint\": \"{{count}} safety-critical item(s) (Ignore/Permissions/Hooks) — repair will overwrite access control or command execution config\",\n \"safetyCriticalTooltip\": \"Safety-critical: repair will overwrite access control or command execution config\",\n \"safetyBadge\": \"Safety-critical\",\n \"confirmAction\": \"Repair selected ({{count}})\",\n \"repairing\": \"Repairing…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI Config Status\",\n \"subtitle\": \"Each cell shows a short AI config status: effective, mismatch, missing, global, detected, unscanned, or not applicable. Click for details.\",\n \"project\": \"Project\",\n \"stage\": \"Stage\",\n \"score\": \"Score\",\n \"loading\": \"Scanning project configs…\",\n \"refreshing\": \"Refreshing\",\n \"normal\": \"OK\",\n \"attention\": \"Attention\",\n \"abnormal\": \"Abnormal\",\n \"unscanned\": \"Not scanned\",\n \"hasIssue\": \"Needs action\",\n \"showProblemsOnly\": \"Needs action only\",\n \"filterLabel\": \"Project status filter\",\n \"filterAll\": \"All\",\n \"filterNeedsAction\": \"Needs action\",\n \"filterAbnormal\": \"Abnormal\",\n \"filterUnscanned\": \"Unscanned\",\n \"allClear\": \"No projects need action under this filter\",\n \"cellOk\": \"OK\",\n \"cellEffective\": \"Effective\",\n \"cellMismatch\": \"Mismatch\",\n \"cellMissing\": \"Missing\",\n \"cellGlobal\": \"Global\",\n \"cellDetected\": \"Detected\",\n \"cellPartial\": \"Partial\",\n \"cellWarn\": \"Attention\",\n \"cellCrit\": \"Abnormal\",\n \"cellUnscanned\": \"Unscanned\",\n \"cellNA\": \"N/A\",\n \"cellRecent\": \"Recent\",\n \"cellStale\": \"Stale\",\n \"colUpkeep\": \"Upkeep\",\n \"colUpkeepTitle\": \"Project asset changes in the last 90 days\",\n \"linkedCount\": \"Linked in OpenSunstar\",\n \"linkedCountValue\": \"{{value}} item(s)\",\n \"detailRecentUpdates\": \"Tracks whether any project-level AI asset config changed in the last 90 days\",\n \"safetyBadge\": \"Safety-critical\",\n \"noData\": \"No scan data available\",\n \"scanPending\": \"Scan has not completed; this cannot be considered OK yet.\",\n \"detailEffective\": \"Config effective and matches OpenSunstar library\",\n \"detailDrifted\": \"Config differs from expected, may need repair\",\n \"detailUnscanned\": \"Config was found, but target CLI effective-state comparison has not completed\",\n \"detailGlobal\": \"Using global default, not customized at project level\",\n \"detailDetected\": \"Config detected in repo but not managed by OpenSunstar\",\n \"detailMissingSafety\": \"Safety-critical item not configured, set up soon recommended\",\n \"detailMissing\": \"Not configured, can be ignored if not needed\",\n \"detailPartial\": \"Partially configured, recommend completing\",\n \"detailNA\": \"Not supported by current target CLI\",\n \"statusOk\": \"Config OK\",\n \"statusWarn\": \"Needs attention\",\n \"statusCrit\": \"Problem found\",\n \"statusUnscanned\": \"Scan not completed\",\n \"statusNA\": \"Not applicable\",\n \"stateDetail\": \"Status details\",\n \"driftDetail\": \"Status details\",\n \"checkDetail\": \"Check details\",\n \"filePath\": \"Config file path\",\n \"viewProject\": \"View project assets\",\n \"goRepair\": \"Go to repair\"\n },\n \"portfolioNotice\": {\n \"title\": \"Some data failed to load. The \\\"unscanned / unconfigured / missing\\\" states below may not reflect what is actually on disk.\",\n \"readinessFailed\": \"Readiness lookup failed for {{failed}}/{{total}} projects\",\n \"assetFailed\": \"Asset summary failed: {{reason}}\",\n \"retry\": \"Retry\"\n },\n \"scope\": {\n \"globalEnabled\": \"Globally enabled\",\n \"globalNotEnabled\": \"Not enabled globally\",\n \"activeProject\": \"Project: {{name}}\",\n \"backToProject\": \"Back to project: {{name}}\",\n \"globalScope\": \"Global\",\n \"projectScope\": \"Project\",\n \"globalToast\": \"Enabled globally for {{app}}\",\n \"globalDisableToast\": \"Disabled globally for {{app}}\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"Cross-device Cloud Sync\",\n \"subtitle\": \"Keep your config data in sync across devices — consistent dev environment anywhere\",\n \"status\": \"Sync Status\",\n \"backend\": \"Sync Backend\",\n \"notConfigured\": \"Not Configured\",\n \"notConfiguredHint\": \"Configure a cloud sync backend (WebDAV / S3 / GitHub Gist) in Settings first\",\n \"goSettings\": \"Go to Sync Settings\",\n \"lastSync\": \"Last Sync\",\n \"never\": \"Never synced\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 Object Storage\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"Disabled\",\n \"autoSync\": \"Auto Sync\",\n \"on\": \"On\",\n \"off\": \"Off\",\n \"description\": \"Cloud sync addresses the spatial axis — keeping config consistent across devices. Complements project environment snapshots (temporal axis · version rollback). Use as needed.\"\n },\n \"projectAiConfig\": {\n \"title\": \"AI Asset Setup\",\n \"subtitle\": \"Land AI assets on a single project: apply a blueprint, check readiness, and pick which assets take effect. The sidebar's Agent Config manages the global library; this page manages how those assets attach to this project.\",\n \"switcher\": \"Project being configured\",\n \"targetCli\": \"Target CLI\",\n \"tabs\": {\n \"assets\": \"Asset links\",\n \"readiness\": \"Readiness & activation\",\n \"environment\": \"Project environment & Wiki\"\n },\n \"emptyProjects\": \"No projects yet. Add one before configuring AI assets.\",\n \"openWorkflow\": \"Configure project workflow\",\n \"orchestrationLink\": \"Workflow orchestration\",\n \"orchestrationHint\": \"Stages, presets and change-execution plans live under Workflow & Methodology; opening it carries the current project along.\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} analyses\",\n \"cachedFree\": \"¥0 (cached)\",\n \"chartApiCalls\": \"API calls\",\n \"chartCost\": \"Cost\",\n \"chartNlQuery\": \"NL queries\",\n \"colCost\": \"Cost\",\n \"colCount\": \"Count\",\n \"colTokens\": \"Tokens\",\n \"colType\": \"Type\",\n \"disclaimer\": \"Costs are estimates based on public pricing; your provider's invoice is authoritative.\",\n \"disclaimerCliSuffix\": \"For CLI agent usage, see Settings → Usage.\",\n \"disclaimerShort\": \"Estimate · provider invoice is authoritative\",\n \"emptyRoi\": \"No AI calls in the last {{days}} days. Run a summary, a risk analysis or an NL query and the ROI will show up here.\",\n \"estimatedSuffix\": \"est.\",\n \"lastCall\": \"This call\",\n \"loadingRoi\": \"Loading ROI data…\",\n \"monthTotal\": \"This month\",\n \"monthTotalFailed\": \"Could not load this month's total (unknown — not ¥0)\",\n \"monthTotalLoading\": \"This month — calculating…\",\n \"nlQueryCount\": \"{{queries}} queries\",\n \"panelTitle\": \"AI cost & value tracking\",\n \"projectRisks\": \"{{risks}} risks\",\n \"projectScope\": \"{{projects}} projects\",\n \"projectUseful\": \"{{useful}} marked useful\",\n \"rangeDays\": \"{{days}} days\",\n \"roiReport\": \"AI spend report\",\n \"sectionByProject\": \"By project (spend ↔ value)\",\n \"sectionByType\": \"By analysis type\",\n \"statRisks\": \"Risks found\",\n \"statTokens\": \"Tokens\",\n \"statTotalSpend\": \"Total spend\",\n \"statUseful\": \"Marked useful\",\n \"stripTitle\": \"AI cost transparency\",\n \"trendTitle\": \"Daily AI spend trend\",\n \"unknownPricing\": \"Pricing unknown\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI feedback\",\n \"markNotUseful\": \"Mark as not useful\",\n \"markUseful\": \"Mark as useful\",\n \"notUseful\": \"Not useful\",\n \"useful\": \"Useful\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent readiness\",\n \"health\": \"Health score\",\n \"nlQuery\": \"NL query\",\n \"portfolioSummary\": \"Portfolio weekly\",\n \"progress\": \"Progress estimate\",\n \"riskAnalysis\": \"Risk analysis\",\n \"summary\": \"Project summary\",\n \"trendAnalysis\": \"Trend analysis\"\n },\n \"query\": {\n \"answerTitle\": \"AI answer\",\n \"costFailed\": \"Could not load cost stats (unknown — not ¥0)\",\n \"detailToggle\": \"Analysis breakdown, last {{days}} days\",\n \"guarding\": \"AI is watching\",\n \"inputLabel\": \"Ask AI\",\n \"notConfigured\": \"AI queries and cost tracking are off — add an API key under Settings → AI provider and the natural-language input will appear here.\",\n \"placeholder\": \"Ask AI — e.g. which project has gone quiet? Draft this week's summary\",\n \"projectsUnit\": \"projects\",\n \"typeHealth\": \"Health\",\n \"typeNlQuery\": \"Q&A\",\n \"typeRisk\": \"Risk\",\n \"typeSummary\": \"Summary\",\n \"typeTrend\": \"Trend\",\n \"typeWeekly\": \"Weekly\"\n },\n \"risk\": {\n \"analyze\": \"Analyze risks\",\n \"analyzing\": \"Analyzing risks…\",\n \"levelHigh\": \"High risk\",\n \"levelLow\": \"Low risk\",\n \"levelMedium\": \"Medium risk\",\n \"none\": \"Project looks healthy — no risks found\",\n \"sectionTitle\": \"Risk analysis\",\n \"title\": \"AI risk analysis\",\n \"typeActivity\": \"Activity\",\n \"typeConcentration\": \"Concentration\",\n \"typeSchedule\": \"Schedule\",\n \"typeTechDebt\": \"Tech debt\"\n },\n \"weekly\": {\n \"analyzing\": \"Analyzing data from {{projects}} projects…\",\n \"cached\": \"cached\",\n \"copied\": \"Copied\",\n \"copyFailed\": \"Copy failed\",\n \"copySuccess\": \"Weekly report copied to clipboard\",\n \"dialogTitle\": \"AI weekly report\",\n \"errorGenerate\": \"Could not generate the weekly report. Please try again later.\",\n \"errorNoProvider\": \"No AI provider configured. Add an AI key in Settings first.\",\n \"generate\": \"Weekly report\",\n \"windowDays\": \"{{days}}d\",\n \"windowHint\": \"· last {{days}} days\"\n }\n }\n}\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785846934.764259, "n": 213649, "h": "9239d22750a79d4c", "c": "{\n \"projectWiki\": {\n \"title\": \"Project Wiki / Knowledge Baseline\",\n \"subtitle\": \"Engineering knowledge baseline consumable by humans and agents\",\n \"loading\": \"Scanning Wiki…\",\n \"notInitialized\": \"No wiki/index.md detected\",\n \"pageCount\": \"{{count}} pages\",\n \"sourceRefs\": \"{{count}} source refs\",\n \"questions\": \"{{count}} open questions\",\n \"lastUpdated\": \"Last updated\",\n \"status\": {\n \"missing\": \"Not initialized\",\n \"scaffolded\": \"Scaffolded\",\n \"effective\": \"Fresh\",\n \"drifted\": \"Changed\",\n \"invalid\": \"Lint failed\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · Orientation\",\n \"L2\": \"L2 · Integration\",\n \"L3\": \"L3 · Operations\"\n },\n \"coverage\": {\n \"corePages\": \"Core pages\",\n \"componentPages\": \"Components\",\n \"flowPages\": \"Flows\",\n \"apiPages\": \"APIs\",\n \"runbookPages\": \"Runbooks\"\n },\n \"actions\": {\n \"init\": \"Initialize Wiki\",\n \"lint\": \"Run Lint\",\n \"refresh\": \"Refresh\",\n \"openInEditor\": \"Open in editor\",\n \"previewInit\": \"Preview init\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki just initialized, change mapping not yet active\",\n \"coldStartProgress\": \"Effective source_files pages: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Click Generate project Wiki, then use the configured AI provider and review the result\",\n \"affectedPages\": \"{{count}} source changes affect {{pages}} wiki pages\",\n \"unmapped\": \"{{count}} unmapped changes\",\n \"noChanges\": \"No source changes, wiki pages are up to date\"\n },\n \"lint\": {\n \"passed\": \"Lint passed\",\n \"failed\": \"Lint failed: {{errors}} errors\",\n \"warnings\": \"{{count}} warnings\",\n \"qualityLevel\": \"Quality level: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki init preview\",\n \"willCreate\": \"Will create {{count}} files\",\n \"alreadyExists\": \"{{count}} files already exist (will skip)\",\n \"confirm\": \"Confirm init\",\n \"success\": \"Wiki initialized, {{count}} files created\",\n \"blocked\": \"Safety audit blocked\"\n },\n \"accept\": {\n \"success\": \"Wiki accepted and Commit sync baseline created\"\n },\n \"candidates\": {\n \"importSuccess\": \"Imported {{count}} files; the formal Wiki is ready for acceptance\"\n },\n \"generator\": {\n \"success\": \"Project Wiki generated and imported: {{count}} pages. Continue acceptance\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"All-in-One Assistant for Claude Code, Codex & Gemini CLI\"\n },\n \"common\": {\n \"add\": \"Add\",\n \"edit\": \"Edit\",\n \"delete\": \"Delete\",\n \"save\": \"Save\",\n \"saving\": \"Saving...\",\n \"cancel\": \"Cancel\",\n \"confirm\": \"Confirm\",\n \"close\": \"Close\",\n \"done\": \"Done\",\n \"settings\": \"Settings\",\n \"about\": \"About\",\n \"version\": \"Version\",\n \"loading\": \"Loading...\",\n \"notInstalled\": \"Not installed\",\n \"success\": \"Success\",\n \"error\": \"Error\",\n \"unknown\": \"Unknown\",\n \"enterValidValue\": \"Please enter a valid value\",\n \"clear\": \"Clear\",\n \"toggleTheme\": \"Toggle theme\",\n \"format\": \"Format\",\n \"formatSuccess\": \"Formatted successfully\",\n \"formatError\": \"Format failed: {{error}}\",\n \"copy\": \"Copy\",\n \"view\": \"View\",\n \"back\": \"Back\",\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing...\",\n \"import\": \"Import\",\n \"all\": \"All\",\n \"search\": \"Search\",\n \"reset\": \"Reset\",\n \"actions\": \"Actions\",\n \"deleting\": \"Deleting...\",\n \"auto\": \"Auto\",\n \"enabled\": \"Enabled\",\n \"notSet\": \"Not Set\"\n },\n \"firstRunNotice\": {\n \"title\": \"Welcome to OpenSunstar\",\n \"bodyDefault\": \"OpenSunstar lets you switch between multiple Claude Code / Codex / Gemini CLI providers with a single click. If you already had these tools configured, OpenSunstar has saved your existing setup as a provider named “default” so none of your previous configuration is lost.\",\n \"bodyOfficial\": \"An “Official” preset is also included in the list — click it any time you want to switch back to the official default. OpenSunstar automatically backs up your current config to “default” before switching, so you can move back and forth freely. That's how OpenSunstar works 😊\",\n \"confirm\": \"Got it\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"Enter API Key\",\n \"show\": \"Show API Key\",\n \"hide\": \"Hide API Key\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"Configuration must be a JSON object, not an array or other type\",\n \"invalidJson\": \"Invalid JSON format\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"What is a Common Config Snippet?\",\n \"guidePurpose\": \"It lets you share non-sensitive settings (plugins, environment variables, etc.) across different providers. These settings won't be lost when you switch providers.\",\n \"guideUsage\": \"How to use: ① Click \\\"Extract from Editor\\\" to save the common parts ② Check \\\"Write Common Config\\\" when creating a new provider\",\n \"guideReExtract\": \"If you've newly installed plugins or hooks, re-extract the common config so they sync to other providers.\",\n \"guideReassurance\": \"Don't worry — your original configuration is safely stored in the default provider and won't be lost.\",\n \"emptyTitle\": \"No common config snippet yet\",\n \"emptyHint\": \"Click \\\"Extract from Editor\\\" below to extract reusable parts from your current configuration\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Common Config Snippet\",\n \"commonConfigHint\": \"This snippet will be merged into settings.json when 'Write Common Config' is checked\",\n \"fullSettingsHint\": \"Full Claude Code settings.json content\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"hideAttribution\": \"Hide AI Attribution\",\n \"enableTeammates\": \"Teammates Mode\",\n \"enableToolSearch\": \"Enable Tool Search\",\n \"effortMax\": \"Max Effort Thinking\",\n \"disableAutoUpgrade\": \"Disable Auto-Upgrade\"\n },\n \"header\": {\n \"viewOnGithub\": \"View on GitHub\",\n \"toggleDarkMode\": \"Switch to Dark Mode\",\n \"toggleLightMode\": \"Switch to Light Mode\",\n \"addProvider\": \"Add Provider\",\n \"switchToChinese\": \"Switch to Chinese\",\n \"switchToEnglish\": \"Switch to English\",\n \"enterEditMode\": \"Enter Edit Mode\",\n \"exitEditMode\": \"Exit Edit Mode\",\n \"windowMinimize\": \"Minimize window\",\n \"windowMaximize\": \"Maximize window\",\n \"windowRestore\": \"Restore window\",\n \"windowClose\": \"Close window\"\n },\n \"provider\": {\n \"tabProvider\": \"Provider\",\n \"tabUniversal\": \"Universal\",\n \"noProviders\": \"No providers added yet\",\n \"noProvidersDescription\": \"If you already have a config, click \\\"Import Current Config\\\" — all data will be safely saved in a default provider\",\n \"noProvidersDescriptionSnippet\": \"Settings other than API key and endpoint (e.g. plugins) will be saved to a common config snippet for sharing across providers\",\n \"importCurrent\": \"Import Current Config\",\n \"importFromClaude\": \"Import existing providers from Claude Code\",\n \"importCurrentDescription\": \"Import current live config as default provider\",\n \"currentlyUsing\": \"Currently Using\",\n \"enable\": \"Enable\",\n \"inUse\": \"In Use\",\n \"blockedByProxyHint\": \"Can't switch to an official provider while proxy takeover is active\",\n \"editProvider\": \"Edit Provider\",\n \"editProviderHint\": \"Configuration will be applied to the current provider immediately after update.\",\n \"deleteProvider\": \"Delete Provider\",\n \"addNewProvider\": \"Add New Provider\",\n \"addClaudeProvider\": \"Add Claude Code Provider\",\n \"addCodexProvider\": \"Add Codex Provider\",\n \"addGeminiProvider\": \"Add Gemini Provider\",\n \"addOpenCodeProvider\": \"Add OpenCode Provider\",\n \"addToConfig\": \"Add\",\n \"removeFromConfig\": \"Remove\",\n \"setAsDefault\": \"Set Default\",\n \"isDefault\": \"Current Default\",\n \"inConfig\": \"Added\",\n \"addProviderHint\": \"Fill in the information to quickly switch providers in the list.\",\n \"editClaudeProvider\": \"Edit Claude Code Provider\",\n \"editCodexProvider\": \"Edit Codex Provider\",\n \"configError\": \"Configuration Error\",\n \"notConfigured\": \"Not configured for official website\",\n \"applyToClaudePlugin\": \"Apply to Claude plugin\",\n \"removeFromClaudePlugin\": \"Remove from Claude plugin\",\n \"dragToReorder\": \"Drag to reorder\",\n \"dragHandle\": \"Drag to reorder\",\n \"searchPlaceholder\": \"Search name, notes, or URL...\",\n \"searchAriaLabel\": \"Search providers\",\n \"searchScopeHint\": \"Matches provider name, notes, and URL.\",\n \"searchCloseHint\": \"Press Esc to close\",\n \"searchCloseAriaLabel\": \"Close provider search\",\n \"noSearchResults\": \"No providers match your search.\",\n \"duplicate\": \"Duplicate\",\n \"sortUpdateFailed\": \"Failed to update sort order\",\n \"configureUsage\": \"Configure usage query\",\n \"officialPartner\": \"Official Partner\",\n \"managedByHermes\": \"Hermes Managed\",\n \"managedByHermesHint\": \"Defined in Hermes' providers: dict. Edit or remove it via Hermes Web UI.\",\n \"openTerminal\": \"Open Terminal\",\n \"terminalOpened\": \"Terminal opened\",\n \"terminalOpenFailed\": \"Failed to open terminal\",\n \"name\": \"Provider Name\",\n \"namePlaceholder\": \"e.g., Claude Official\",\n \"websiteUrl\": \"Website URL\",\n \"notes\": \"Notes\",\n \"notesPlaceholder\": \"e.g., Company dedicated account\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"Write common config\",\n \"editCommonConfigButton\": \"Edit common config\",\n \"configJsonHint\": \"Please fill in complete Claude Code configuration\",\n \"editCommonConfigTitle\": \"Edit common config snippet\",\n \"editCommonConfigHint\": \"Common config snippet will be merged into all providers that enable it\",\n \"addProvider\": \"Add Provider\",\n \"sortUpdated\": \"Sort order updated\",\n \"usageSaved\": \"Usage query configuration saved\",\n \"usageSaveFailed\": \"Failed to save usage query configuration\",\n \"geminiConfig\": \"Gemini Configuration\",\n \"geminiConfigHint\": \"Use .env format to configure Gemini\",\n \"form\": {\n \"gemini\": {\n \"model\": \"Model\",\n \"oauthTitle\": \"OAuth Authentication Mode\",\n \"oauthHint\": \"Google official uses OAuth personal authentication, no need to fill in API Key. The browser will automatically open for login on first use.\",\n \"apiKeyPlaceholder\": \"Enter Gemini API Key\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"Needs Routing\",\n \"noRoutingSupport\": \"No Routing Support\"\n },\n \"codex\": {\n \"needsRouting\": \"Needs Routing\",\n \"noRoutingSupport\": \"No Routing Support\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop official providers use the built-in 1P sign-in. No API key or endpoint URL is required.\",\n \"mode\": \"Model handling\",\n \"modeDirect\": \"Direct\",\n \"modeProxy\": \"Requires routing\",\n \"modelMappingToggle\": \"Needs model mapping\",\n \"modelMappingOffHint\": \"Direct mode works only when the provider accepts Claude Desktop's three role IDs (claude-sonnet-* / claude-opus-* / claude-haiku-*); for any other model name (including legacy IDs like claude-3-5-sonnet-…), enable this switch to use mapping.\",\n \"modelMappingOnHint\": \"Claude Desktop only accepts the three role IDs claude-sonnet-* / claude-opus-* / claude-haiku-*. When enabled, OpenSunstar maps these three roles to your provider's actual models and keeps local routing running while in use.\",\n \"routeMapTitle\": \"Model mapping\",\n \"routeMapHint\": \"Fill in the actual request model for each of the Sonnet, Opus, and Haiku tiers. Use the menu display name for branded models such as DeepSeek or Kimi. Any tier left blank inherits the Sonnet tier's model (or the first tier you filled in), so the Haiku that sub-agents call is always available.\",\n \"routeModelLabel\": \"Model role\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"Menu display name\",\n \"upstreamModelLabel\": \"Requested model\",\n \"supports1mLabel\": \"Declare 1M\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Manually specify Claude Desktop models (advanced, optional)\",\n \"directModelListCollapsedHint\": \"Native Claude model providers usually do not need this. Claude Desktop will fetch /v1/models automatically.\",\n \"directModelListHint\": \"Only fill this when the provider's /v1/models is unavailable or does not return Claude Desktop-recognized Sonnet / Opus / Haiku model IDs. Checking 1M declares 1M context support to Claude Desktop.\",\n \"directModelInvalid\": \"Direct models must use Claude Desktop-recognized Sonnet / Opus / Haiku model IDs\",\n \"addModel\": \"Add model\",\n \"addRoute\": \"Add model\",\n \"routeInvalid\": \"Choose a model role and enter the requested model\",\n \"routesRequired\": \"At least one model mapping is required\",\n \"statusTitle\": \"Claude Desktop configuration needs attention\",\n \"statusUnsupported\": \"This platform does not support writing Claude Desktop 3P configuration yet.\",\n \"statusStaleRawModels\": \"The Claude Desktop profile contains model IDs outside the Sonnet / Opus / Haiku role families. Newer Claude Desktop versions may reject it; switch to the current provider again to repair it.\",\n \"statusMissingRouteMappings\": \"The current provider has model mapping enabled but no valid routes. Edit the provider and add at least one mapping.\",\n \"statusGatewayTokenMissing\": \"The local routing token has not been generated yet. Switching to this provider again will write a new local token.\",\n \"statusBaseUrlMismatch\": \"The Claude Desktop profile points to a different URL than the current provider. Current: {{actual}}; expected: {{expected}}. Switch to the current provider again to repair it.\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop local routing is running - {{address}}:{{port}}\",\n \"inactive\": \"Turn on Claude Desktop local routing for providers that need model mapping or format conversion. Configured address: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"Provider added\",\n \"providerSaved\": \"Provider configuration saved\",\n \"providerDeleted\": \"Provider deleted successfully\",\n \"switchSuccess\": \"Switch successful!\",\n \"codexRestartRequired\": \"Switched successfully. Restart the client to apply changes.\",\n \"claudeDesktopRestartRequired\": \"Switched successfully. Restart Claude Desktop to apply changes.\",\n \"claudeDesktopProxyRestartRequired\": \"Switched successfully. Keep OpenSunstar running and restart Claude Desktop to apply changes.\",\n \"addToConfigSuccess\": \"Added to config\",\n \"removeFromConfigSuccess\": \"Removed from config\",\n \"switchFailedTitle\": \"Switch failed\",\n \"switchFailed\": \"Switch failed: {{error}}\",\n \"autoImported\": \"Default provider created from existing configuration\",\n \"addFailed\": \"Failed to add provider: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"saveFailedGeneric\": \"Save failed, please try again\",\n \"appliedToClaudePlugin\": \"Applied to Claude plugin\",\n \"removedFromClaudePlugin\": \"Removed from Claude plugin\",\n \"syncClaudePluginFailed\": \"Sync Claude plugin failed\",\n \"skipClaudeOnboardingFailed\": \"Failed to skip Claude Code first-run confirmation\",\n \"clearClaudeOnboardingSkipFailed\": \"Failed to restore Claude Code first-run confirmation\",\n \"updateSuccess\": \"Provider updated successfully\",\n \"updateFailed\": \"Failed to update provider: {{error}}\",\n \"deleteSuccess\": \"Provider deleted\",\n \"deleteFailed\": \"Failed to delete provider: {{error}}\",\n \"settingsSaved\": \"Settings saved\",\n \"settingsSaveFailed\": \"Failed to save settings: {{error}}\",\n \"proxyRequiredForSwitch\": \"This provider {{reason}}, requires the routing service to work properly. Start routing first.\",\n \"proxyReasonCopilot\": \"uses GitHub Copilot as a Claude provider\",\n \"proxyReasonOpenAIChat\": \"uses OpenAI Chat API format\",\n \"proxyReasonOpenAIResponses\": \"uses OpenAI Responses API format\",\n \"proxyReasonFullUrl\": \"has full URL connection mode enabled\",\n \"openAIFormatHint\": \"This provider uses OpenAI-compatible format and requires the routing service to be enabled\",\n \"copilotProxyHint\": \"GitHub Copilot as a Claude provider always requires local routing; routing automatically selects Chat Completions or Responses based on the current model.\",\n \"openLinkFailed\": \"Failed to open link\",\n \"openclawModelsRegistered\": \"Models have been registered to /model list\",\n \"openclawDefaultModelSet\": \"Set as default model\",\n \"openclawDefaultModelSetFailed\": \"Failed to set default model\",\n \"openclawNoModels\": \"No models configured\",\n \"backfillWarning\": \"Switched successfully, but failed to save changes back to the previous provider\",\n \"windowControlFailed\": \"Window control failed: {{error}}\",\n \"officialBlockedByProxy\": \"Cannot switch to official provider while local routing is active. Using routing with official APIs may cause account bans.\",\n \"proxyOfficialWarning\": \"Current provider {{name}} is official. Consider switching to a third-party provider before using local routing.\"\n },\n \"confirm\": {\n \"deleteProvider\": \"Delete Provider\",\n \"deleteProviderMessage\": \"Are you sure you want to delete provider \\\"{{name}}\\\"? This action cannot be undone.\",\n \"removeProvider\": \"Remove Provider\",\n \"removeProviderMessage\": \"Are you sure you want to remove provider \\\"{{name}}\\\" from the configuration?\\n\\nAfter removal, this provider will no longer be active, but the configuration data will be retained in OpenSunstar. You can re-add it at any time.\",\n \"proxy\": {\n \"title\": \"Enable Local Routing\",\n \"message\": \"Local routing is an advanced feature. Please make sure you understand how it works before enabling.\\n\\nWe recommend consulting the relevant documentation or your provider for proper configuration.\",\n \"confirm\": \"I understand, enable\"\n },\n \"failover\": {\n \"title\": \"Enable Failover\",\n \"message\": \"Failover is an advanced feature. Please make sure you understand how it works before enabling.\\n\\nWe recommend configuring provider priorities in the failover queue first.\",\n \"confirm\": \"I understand, enable\"\n },\n \"usage\": {\n \"title\": \"Configure Usage Query\",\n \"message\": \"Usage query requires a custom script or API parameters. Please make sure you have obtained the necessary information from your provider.\\n\\nIf unsure how to configure, please consult your provider's documentation first.\",\n \"confirm\": \"I understand, configure\"\n },\n \"streamCheck\": {\n \"title\": \"Model Health Check\",\n \"message\": \"Health check tests provider connectivity by sending a direct API request. The following may cause check failures:\\n\\n• Official providers (uses OAuth login, no standalone API Key)\\n• Some relay services (verify requests come from Claude Code CLI)\\n• AWS Bedrock (uses IAM signature authentication)\\n\\nA failed check does not mean the provider is unusable — it only means it cannot be verified via a standalone request. Please refer to actual behavior within the application.\",\n \"confirm\": \"I understand, proceed\"\n },\n \"autoSync\": {\n \"title\": \"Enable Auto Sync\",\n \"message\": \"When auto sync is enabled, every database change will be automatically uploaded to the WebDAV server.\\n\\nThis may result in significant network traffic. Please ensure your network and WebDAV service can handle frequent data transfers.\",\n \"confirm\": \"I understand, enable\"\n },\n \"commonConfig\": {\n \"title\": \"About Common Config\",\n \"message\": \"The \\\"Common Config Snippet\\\" lets you share plugins, environment variables, and other settings across different providers — so they won't be lost when you switch.\\n\\nHow to use:\\n① Edit a provider → click \\\"Edit Common Config\\\" → \\\"Extract from Editor\\\"\\n② When creating a new provider, check \\\"Write Common Config\\\" (enabled by default)\\n\\nIf you've newly installed plugins or hooks, re-extract the common config to keep them in sync.\",\n \"confirm\": \"Got it\"\n }\n },\n \"settings\": {\n \"title\": \"Settings\",\n \"general\": \"General\",\n \"tabGeneral\": \"General\",\n \"tabAuth\": \"Auth\",\n \"tabAdvanced\": \"Advanced\",\n \"tabProxy\": \"Routing\",\n \"authCenter\": {\n \"title\": \"Authentication Center\",\n \"description\": \"Separate third-party keys from official subscription sign-ins so each CLI shows its actual credential source.\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"Local CLI Sign-in Status\",\n \"readonlyProbe\": \"Read-only probe\",\n \"localCliDescription\": \"Distinguish third-party keys from official subscription sign-ins. OpenSunstar only reports local signals and does not take over Claude or Google account credentials.\",\n \"localCliLoading\": \"Reading local CLI authorization status…\",\n \"managedAccountsTitle\": \"Managed Accounts\",\n \"managedAccountsDescription\": \"Accounts managed by OpenSunstar can be bound to Providers or local proxy routes.\",\n \"copilotDescription\": \"Manage GitHub Copilot accounts\",\n \"codexOauthDescription\": \"Manage ChatGPT accounts\",\n \"xaiOauthDescription\": \"Manage xAI / Grok accounts\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"Configuration Directory\",\n \"description\": \"Manage storage paths for Claude, Codex and Gemini configurations\"\n },\n \"proxy\": {\n \"title\": \"Local Routing\",\n \"description\": \"Control routing service toggle, view status and port info\",\n \"enableFeature\": \"Show Routing Toggle on Main Page\",\n \"enableFeatureDescription\": \"When enabled, the routing and failover toggles will appear at the top of the main page\",\n \"enableFailoverToggle\": \"Show Failover Toggle on Main Page\",\n \"enableFailoverToggleDescription\": \"When enabled, the failover toggle will appear independently at the top of the main page\",\n \"running\": \"Running\",\n \"stopped\": \"Stopped\"\n },\n \"modelTest\": {\n \"title\": \"Model Test Config\",\n \"description\": \"Configure default models and prompts for model testing\"\n },\n \"failover\": {\n \"title\": \"Auto Failover\",\n \"description\": \"Configure failover queue and circuit breaker strategy\"\n },\n \"pricing\": {\n \"title\": \"Cost Pricing\",\n \"description\": \"Manage token pricing rules for each model\"\n },\n \"globalProxy\": {\n \"title\": \"Global Outbound Proxy\",\n \"description\": \"Configure proxy for OpenSunstar to access external APIs\"\n },\n \"data\": {\n \"title\": \"Data Management\",\n \"description\": \"Import and export local configuration data\"\n },\n \"backup\": {\n \"title\": \"Backup & Restore\",\n \"description\": \"Manage automatic backups, view and restore database snapshots\"\n },\n \"cloudSync\": {\n \"title\": \"Cloud Sync\",\n \"description\": \"Sync data across devices via WebDAV\"\n },\n \"rectifier\": {\n \"title\": \"Rectifier\",\n \"description\": \"Automatically fix API request compatibility issues\",\n \"enabled\": \"Enable Rectifier\",\n \"enabledDescription\": \"Master switch, all rectification features will be disabled when turned off\",\n \"requestGroup\": \"Request Rectification\",\n \"responseGroup\": \"Response Rectification\",\n \"thinkingSignature\": \"Thinking Signature Rectification\",\n \"thinkingSignatureDescription\": \"When an Anthropic-type provider returns thinking signature incompatibility or illegal request errors, automatically removes incompatible thinking-related blocks and retries once with the same provider\",\n \"thinkingBudget\": \"Thinking Budget Rectification\",\n \"thinkingBudgetDescription\": \"When an Anthropic-type provider returns budget_tokens constraint errors (such as at least 1024), automatically normalizes thinking to enabled, sets thinking budget to 32000, and raises max_tokens to 64000 if needed, then retries once\",\n \"mediaFallback\": \"Unsupported Image Fallback\",\n \"mediaFallbackDescription\": \"When a provider does not support image input (it declares text-only capability, or the upstream returns an unsupported-image error), automatically replaces image blocks with an [Unsupported Image] marker so the conversation is not interrupted\",\n \"mediaHeuristic\": \"Heuristic Text-Only Model Detection\",\n \"mediaHeuristicDescription\": \"Predictively strips images before sending based on a built-in model-name list. When off, only the declared-text-only and upstream-error fallback paths remain, preventing the built-in list from misclassifying a multimodal model as text-only and silently dropping images\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock Request Optimizer\",\n \"description\": \"Automatically optimize Thinking and Cache configuration before sending requests (only applies to Bedrock providers)\",\n \"enabled\": \"Enable Optimizer\",\n \"thinkingOptimizer\": \"Thinking Optimization\",\n \"thinkingOptimizerDescription\": \"Automatically enable Adaptive Thinking for Opus/Sonnet, and inject Extended Thinking for legacy models\",\n \"cacheInjection\": \"Cache Injection\",\n \"cacheInjectionDescription\": \"Automatically inject cache breakpoints at key positions in requests to reduce duplicate token billing\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 minutes\",\n \"cacheTtl1h\": \"1 hour\"\n },\n \"logConfig\": {\n \"title\": \"Log Management\",\n \"description\": \"Control log output level\",\n \"enabled\": \"Enable Logging\",\n \"enabledDescription\": \"Master switch, all logging will be disabled when turned off\",\n \"level\": \"Log Level\",\n \"levelDescription\": \"Set the minimum log level to output\",\n \"levels\": {\n \"error\": \"Error\",\n \"warn\": \"Warning\",\n \"info\": \"Info\",\n \"debug\": \"Debug\",\n \"trace\": \"Trace\"\n },\n \"levelHint\": \"Log level descriptions:\",\n \"levelDesc\": {\n \"error\": \"Critical errors only\",\n \"warn\": \"Errors + warnings\",\n \"info\": \"General operation info (default)\",\n \"debug\": \"Detailed info including SSE stream and request/response\",\n \"trace\": \"All logs, most verbose\"\n }\n }\n },\n \"language\": \"Language\",\n \"languageHint\": \"Preview interface language immediately after switching, takes effect permanently after saving.\",\n \"theme\": \"Theme\",\n \"themeHint\": \"Choose the appearance theme for the app, takes effect immediately.\",\n \"themeLight\": \"Light\",\n \"themeDark\": \"Dark\",\n \"themeSystem\": \"System\",\n \"importExport\": \"SQL Import/Export\",\n \"importExportHint\": \"Import or export database SQL backups for migration or restore (import supports only backups exported by OpenSunstar).\",\n \"exportConfig\": \"Export SQL Backup\",\n \"selectConfigFile\": \"Select SQL File\",\n \"noFileSelected\": \"No configuration file selected.\",\n \"import\": \"Import\",\n \"importing\": \"Importing...\",\n \"importSuccess\": \"Import Successful!\",\n \"importFailed\": \"Import Failed\",\n \"syncLiveFailed\": \"Imported, but failed to sync to the current provider. Please reselect the provider manually.\",\n \"importPartialSuccess\": \"Config imported, but failed to sync to the current provider.\",\n \"importPartialHint\": \"Please manually reselect the provider to refresh the live configuration.\",\n \"configExported\": \"Config exported to:\",\n \"exportFailed\": \"Export failed\",\n \"selectFileFailed\": \"Please choose a valid SQL backup file\",\n \"configCorrupted\": \"SQL file may be corrupted or invalid\",\n \"backupId\": \"Backup ID\",\n \"backupManager\": {\n \"title\": \"Database Backups\",\n \"description\": \"Automatic database snapshots for restoring to a previous state\",\n \"empty\": \"No backups yet\",\n \"restore\": \"Restore\",\n \"restoring\": \"Restoring...\",\n \"confirmTitle\": \"Confirm Restore\",\n \"confirmMessage\": \"Restoring this backup will overwrite the current database. A safety backup will be created first.\",\n \"restoreSuccess\": \"Restore successful! Safety backup created\",\n \"restoreFailed\": \"Restore failed\",\n \"safetyBackupId\": \"Safety Backup ID\",\n \"intervalLabel\": \"Auto-backup Interval\",\n \"retainLabel\": \"Backup Retention\",\n \"intervalDisabled\": \"Disabled\",\n \"intervalHours\": \"{{hours}} hours\",\n \"intervalDays\": \"{{days}} days\",\n \"rename\": \"Rename\",\n \"renameSuccess\": \"Backup renamed\",\n \"renameFailed\": \"Rename failed\",\n \"namePlaceholder\": \"Enter new name\",\n \"createBackup\": \"Backup Now\",\n \"creating\": \"Backing up...\",\n \"createSuccess\": \"Backup created successfully\",\n \"createFailed\": \"Backup failed\",\n \"delete\": \"Delete\",\n \"deleting\": \"Deleting...\",\n \"deleteSuccess\": \"Backup deleted\",\n \"deleteFailed\": \"Delete failed\",\n \"deleteConfirmTitle\": \"Confirm Delete\",\n \"deleteConfirmMessage\": \"This backup will be permanently deleted. This action cannot be undone.\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV Cloud Sync\",\n \"description\": \"Sync database and skill configurations across devices via WebDAV.\",\n \"baseUrl\": \"WebDAV Server URL\",\n \"baseUrlPlaceholder\": \"https://dav.example.com/dav/\",\n \"username\": \"WebDAV Account\",\n \"usernamePlaceholder\": \"Email or username\",\n \"password\": \"WebDAV Password\",\n \"passwordPlaceholder\": \"App password\",\n \"remoteRoot\": \"Remote Root Directory\",\n \"profile\": \"Sync Profile Name\",\n \"autoSync\": \"Auto Sync\",\n \"autoSyncHint\": \"When enabled, each database change triggers an automatic WebDAV upload.\",\n \"test\": \"Test Connection\",\n \"testing\": \"Testing...\",\n \"testSuccess\": \"Connection successful\",\n \"testFailed\": \"Connection failed: {{error}}\",\n \"save\": \"Save Config\",\n \"saving\": \"Saving...\",\n \"saveFailed\": \"Failed to save config: {{error}}\",\n \"upload\": \"Upload to Cloud\",\n \"uploading\": \"Uploading...\",\n \"uploadSuccess\": \"Uploaded to WebDAV\",\n \"uploadFailed\": \"Upload failed: {{error}}\",\n \"autoSyncFailedToast\": \"Auto sync failed: {{error}}\",\n \"download\": \"Download from Cloud\",\n \"downloading\": \"Downloading...\",\n \"downloadSuccess\": \"Downloaded and restored from WebDAV\",\n \"downloadFailed\": \"Download failed: {{error}}\",\n \"lastSync\": \"Last sync: {{time}}\",\n \"autoSyncLastErrorTitle\": \"Last auto sync failed\",\n \"autoSyncLastErrorHint\": \"Please check network or WebDAV settings. Auto sync will retry on future changes.\",\n \"missingUrl\": \"Please enter the WebDAV server URL\",\n \"presets\": {\n \"label\": \"Provider\",\n \"jianguoyun\": \"Jianguoyun\",\n \"jianguoyunHint\": \"Generate an \\\"App Password\\\" in Jianguoyun security settings. Do not use your login password.\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"Replace your-server with your Nextcloud domain and USERNAME with your username.\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Install and enable the WebDAV Server package in Synology Package Center first.\",\n \"custom\": \"Custom\"\n },\n \"remoteRootDefault\": \"Default: OpenSunstar-sync\",\n \"profileDefault\": \"Default: default\",\n \"saveAndTestSuccess\": \"Config saved, connection OK\",\n \"saveAndTestFailed\": \"Config saved, but connection test failed: {{error}}\",\n \"noRemoteData\": \"No sync data found on the remote server\",\n \"incompatibleVersion\": \"Remote data is incompatible (protocol v{{protocolVersion}}, database {{dbCompatVersion}}). This client supports protocol v2 / db-v6.\",\n \"unsaved\": \"Unsaved\",\n \"saved\": \"Saved\",\n \"unsavedChanges\": \"Please save config first\",\n \"saveBeforeSync\": \"Save configuration first to enable upload/download.\",\n \"fetchingRemote\": \"Fetching remote info...\",\n \"fetchRemoteFailed\": \"Failed to fetch remote info. Please check configuration and network.\",\n \"confirmDownload\": {\n \"title\": \"Restore from Cloud\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"path\": \"Remote path\",\n \"dbCompat\": \"DB compatibility\",\n \"artifacts\": \"Contents\",\n \"legacyNotice\": \"A legacy remote path was detected. After restoring, the next upload will write to the new v2/db-v6 path.\",\n \"warning\": \"This will overwrite all local data and skill configurations\",\n \"confirm\": \"Confirm Restore\"\n },\n \"confirmUpload\": {\n \"title\": \"Upload to Cloud\",\n \"content\": \"The following will be synced to the WebDAV server:\",\n \"dbItem\": \"Database (all provider configs and data)\",\n \"skillsItem\": \"Skills (all custom skills)\",\n \"targetPath\": \"Target path\",\n \"existingData\": \"Existing cloud data\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"path\": \"Remote path\",\n \"dbCompat\": \"DB compatibility\",\n \"warning\": \"This will overwrite existing sync data on the remote server\",\n \"legacyNotice\": \"Legacy remote data was detected. This upload will write to the new v2/db-v6 path and will not overwrite the legacy path.\",\n \"confirm\": \"Confirm Upload\"\n }\n },\n \"syncType\": {\n \"label\": \"Sync Type\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 Compatible\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"Provider\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"Use IAM Access Key with s3:PutObject/GetObject/HeadObject permissions. Region: us-east-1, ap-northeast-1, etc.\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"Custom endpoint required, e.g. http://minio.local:9000. Region can be 'us-east-1'.\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com. Region: 'auto'.\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com. Region: cn-hangzhou, cn-shanghai, etc.\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com. Region: ap-guangzhou, ap-beijing, etc.\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com. Region: cn-north-4, cn-east-3, etc.\",\n \"custom\": \"S3 Compatible (Custom)\",\n \"customHint\": \"Any S3-compatible service. Custom endpoint required.\"\n },\n \"region\": \"Region\",\n \"regionPlaceholder\": \"e.g. us-east-1\",\n \"bucket\": \"Bucket\",\n \"bucketPlaceholder\": \"e.g. my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"e.g. AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"Leave unchanged to keep the existing secret\",\n \"endpoint\": \"Endpoint (optional for AWS)\",\n \"endpointHint\": \"Required for most S3-compatible services\",\n \"endpointPlaceholder\": \"e.g. https://s3-compatible.example.com\",\n \"remoteRoot\": \"Remote Root Directory\",\n \"remoteRootDefault\": \"Default: OpenSunstar-sync\",\n \"profile\": \"Sync Profile Name\",\n \"profileDefault\": \"Default: default\",\n \"autoSync\": \"Auto Sync\",\n \"autoSyncHint\": \"When enabled, each database change triggers an automatic S3 upload.\",\n \"enabled\": \"Enable S3 Sync\",\n \"enabledHint\": \"Turn on S3 sync for manual and automatic cloud operations.\",\n \"mutualExclusionTitle\": \"Switch Sync Type\",\n \"mutualExclusionMessage\": \"Enabling S3 sync will disable the current WebDAV sync. Continue?\",\n \"mutualExclusionMessageReverse\": \"Enabling WebDAV sync will disable the current S3 sync. Continue?\",\n \"mutualExclusionFailed\": \"Failed to switch sync type: {{error}}\",\n \"testConnection\": \"Test Connection\",\n \"connectionOk\": \"S3 connection successful\",\n \"test\": \"Test Connection\",\n \"testing\": \"Testing...\",\n \"testSuccess\": \"S3 connection successful\",\n \"testFailed\": \"S3 connection failed: {{error}}\",\n \"save\": \"Save Config\",\n \"saving\": \"Saving...\",\n \"saveFailed\": \"Failed to save config: {{error}}\",\n \"saveAndTestSuccess\": \"Config saved, S3 connection OK\",\n \"saveAndTestFailed\": \"Config saved, but S3 connection test failed: {{error}}\",\n \"upload\": \"Upload to Cloud\",\n \"uploading\": \"Uploading...\",\n \"uploadSuccess\": \"Uploaded to S3\",\n \"uploadFailed\": \"S3 upload failed: {{error}}\",\n \"autoSyncFailedToast\": \"S3 auto sync failed: {{error}}\",\n \"download\": \"Download from Cloud\",\n \"downloading\": \"Downloading...\",\n \"downloadSuccess\": \"Downloaded and restored from S3\",\n \"downloadFailed\": \"S3 download failed: {{error}}\",\n \"lastSync\": \"Last sync: {{time}}\",\n \"autoSyncLastErrorTitle\": \"Last S3 auto sync failed\",\n \"autoSyncLastErrorHint\": \"Please check network or S3 settings. Auto sync will retry on future changes.\",\n \"missingBucket\": \"Please enter the S3 bucket\",\n \"noRemoteData\": \"No sync data found in the S3 bucket\",\n \"incompatibleVersion\": \"Remote data is incompatible (version {{version}}). This client supports protocol v2 / db-v6.\",\n \"unsaved\": \"Unsaved\",\n \"saved\": \"Saved\",\n \"unsavedChanges\": \"Please save config first\",\n \"saveBeforeSync\": \"Save configuration first to enable upload/download.\",\n \"fetchingRemote\": \"Fetching remote info...\",\n \"fetchRemoteFailed\": \"Failed to fetch remote info. Please check configuration and network.\",\n \"notConfigured\": \"S3 sync is not configured\",\n \"disabled\": \"S3 sync is disabled\",\n \"confirmDownload\": {\n \"title\": \"Restore from S3\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"artifacts\": \"Contents\",\n \"warning\": \"This will overwrite all local data and skill configurations\",\n \"confirm\": \"Confirm Restore\"\n },\n \"confirmUpload\": {\n \"title\": \"Upload to S3\",\n \"content\": \"The following will be synced to the S3 bucket:\",\n \"dbItem\": \"Database (all provider configs and data)\",\n \"skillsItem\": \"Skills (all custom skills)\",\n \"targetPath\": \"Target object path\",\n \"existingData\": \"Existing cloud data\",\n \"deviceName\": \"Uploaded by\",\n \"createdAt\": \"Uploaded at\",\n \"warning\": \"This will overwrite existing sync data at the S3 path\",\n \"confirm\": \"Confirm Upload\"\n }\n },\n \"autoReload\": \"Data refreshed\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"Window Behavior\",\n \"windowBehaviorHint\": \"Configure window minimize and Claude plugin integration policies.\",\n \"notificationPreferences\": \"Notification Preferences\",\n \"budgetAlertNotifications\": \"Budget Overrun Notifications\",\n \"budgetAlertNotificationsDescription\": \"Send system notifications for Critical / Emergency budget alerts (warnings remain in-app only)\",\n \"failoverAlertNotifications\": \"Failover Notifications\",\n \"failoverAlertNotificationsDescription\": \"Send system notifications when provider auto-failover completes\",\n \"trayBadgeNotifications\": \"Tray Badge Alert\",\n \"trayBadgeNotificationsDescription\": \"Switch tray icon to alert state and show alert item at the top of the menu when unread alerts exist\",\n \"workspaceAlertFirst\": \"Workspace Alerts First\",\n \"workspaceAlertFirstDescription\": \"Show alert cards at the top of Today Workspace when enabled; when disabled, alerts only reach you via tray/system notifications\",\n \"launchOnStartup\": \"Launch on Startup\",\n \"launchOnStartupDescription\": \"Automatically run OpenSunstar when system starts\",\n \"silentStartup\": \"Silent Startup\",\n \"silentStartupDescription\": \"Start in background mode without showing main window\",\n \"autoLaunchFailed\": \"Failed to set auto-launch\",\n \"minimizeToTray\": \"Minimize to tray on close\",\n \"minimizeToTrayDescription\": \"When checked, clicking the close button will hide to system tray, otherwise the app will exit directly.\",\n \"useAppWindowControls\": \"Enable app-level window controls\",\n \"useAppWindowControlsDescription\": \"Use built-in minimize, maximize/restore, and close buttons in the app header.\",\n \"enableClaudePluginIntegration\": \"Apply to Claude Code extension\",\n \"enableClaudePluginIntegrationDescription\": \"When enabled, the VS Code Claude Code extension provider will switch with this app\",\n \"skipClaudeOnboarding\": \"Skip Claude Code first-run confirmation\",\n \"skipClaudeOnboardingDescription\": \"When enabled, Claude Code will skip the first-run confirmation\",\n \"codexAuth\": \"Codex App Enhancements\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Protect official Codex login\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"Always on: provider switching and local proxy routing never overwrite or store official Codex login credentials.\",\n \"appVisibility\": {\n \"title\": \"Homepage Display\",\n \"description\": \"Choose which apps to show on the homepage\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"Skill Storage Location\",\n \"description\": \"Choose where OpenSunstar stores the master copies of your skills\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"Skills are stored in ~/.OpenSunstar/skills/ and synced to each app via symlink or copy.\",\n \"unifiedHint\": \"Skills are stored in ~/.agents/skills/, the Agent Skills open standard. Compatible tools (Claude Code, Codex, Gemini CLI, etc.) discover skills here natively.\",\n \"confirmTitle\": \"Migrate Skill Storage\",\n \"confirmMessage\": \"{{count}} skill(s) will be moved to the new location. Continue?\",\n \"migrationSuccess\": \"Successfully migrated {{count}} skill(s)\",\n \"migrationPartial\": \"Migrated {{migrated}} skill(s), {{errors}} error(s). Check logs for details.\"\n },\n \"skillSync\": {\n \"title\": \"Skill Sync Method\",\n \"description\": \"Choose how to sync Skills files\",\n \"symlink\": \"Symlink\",\n \"copy\": \"Copy Files\",\n \"symlinkHint\": \"Symlinks save disk space and enable real-time sync. Note: May require admin privileges or Developer Mode on Windows\"\n },\n \"terminal\": {\n \"title\": \"Preferred Terminal\",\n \"description\": \"Choose which terminal app to use when clicking the terminal button\",\n \"fallbackHint\": \"If the selected terminal is unavailable, the system default will be used\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"Command Prompt\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"Configuration Directory Override (Advanced)\",\n \"configDirectoryDescription\": \"When using Claude Code or Codex in environments like WSL, you can manually specify the configuration directory to the one in WSL to keep provider data consistent with the main environment.\",\n \"appConfigDir\": \"OpenSunstar Configuration Directory\",\n \"appConfigDirDescription\": \"Customize the storage location for OpenSunstar configuration (point to cloud sync folder to enable config sync)\",\n \"browsePlaceholderApp\": \"e.g., C:\\\\Users\\\\Administrator\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code Configuration Directory\",\n \"claudeConfigDirDescription\": \"Override Claude configuration directory (settings.json) and keep claude.json (MCP) alongside it.\",\n \"codexConfigDir\": \"Codex Configuration Directory\",\n \"codexConfigDirDescription\": \"Override Codex configuration directory.\",\n \"geminiConfigDir\": \"Gemini Configuration Directory\",\n \"geminiConfigDirDescription\": \"Override Gemini configuration directory (.env).\",\n \"opencodeConfigDir\": \"OpenCode Configuration Directory\",\n \"opencodeConfigDirDescription\": \"Override OpenCode configuration directory (opencode.json).\",\n \"openclawConfigDir\": \"OpenClaw Configuration Directory\",\n \"openclawConfigDirDescription\": \"Override OpenClaw configuration directory (openclaw.json).\",\n \"hermesConfigDir\": \"Hermes Configuration Directory\",\n \"hermesConfigDirDescription\": \"Override Hermes configuration directory (config.yaml).\",\n \"browsePlaceholderClaude\": \"e.g., /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"e.g., /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"e.g., /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"e.g., /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"e.g., /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"e.g., /home/<your-username>/.hermes\",\n \"browseDirectory\": \"Browse Directory\",\n \"resetDefault\": \"Reset to default directory (takes effect after saving)\",\n \"checkForUpdates\": \"Check for Updates\",\n \"updateTo\": \"Update to v{{version}}\",\n \"updating\": \"Updating...\",\n \"checking\": \"Checking...\",\n \"upToDate\": \"Up to Date\",\n \"aboutHint\": \"View version information and update status.\",\n \"portableMode\": \"Portable mode: updates require manual download.\",\n \"updateAvailable\": \"New version available: {{version}}\",\n \"updateBadge\": \"Update available\",\n \"updateFailed\": \"Update installation failed, attempted to open download page.\",\n \"checkUpdateFailed\": \"Failed to check for updates, please try again later.\",\n \"openReleaseNotesFailed\": \"Failed to open release notes\",\n \"releaseNotes\": \"Release Notes\",\n \"viewReleaseNotes\": \"View release notes for this version\",\n \"viewCurrentReleaseNotes\": \"View current version release notes\",\n \"officialWebsite\": \"Official Website\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"Manual Install Commands\",\n \"oneClickInstallHint\": \"Install or upgrade Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes\",\n \"localEnvCheck\": \"Local environment check\",\n \"updateAllTools\": \"Update All ({{count}})\",\n \"currentVersion\": \"Current Version\",\n \"latestVersion\": \"Latest Version\",\n \"updateAvailableShort\": \"Update\",\n \"toolInstall\": \"Install\",\n \"toolUpdate\": \"Update\",\n \"toolReady\": \"Ready\",\n \"toolActionDone\": \"{{action}} completed for {{count}} tool(s)\",\n \"toolActionPartial\": \"{{action}} succeeded for {{succeeded}}, failed for {{failed}}\",\n \"toolActionFailed\": \"Install/update command failed\",\n \"toolNotRunnable\": \"Installed but not runnable (no version detected)\",\n \"toolActionVersionUnchangedTitle\": \"Version did not change\",\n \"toolActionVersionUnchanged\": \"Still on {{version}} (latest: {{latest}}). The updater may have reported success without applying the update.\",\n \"toolActionInstalledNotRunnable\": \"Installed, but it can't run in the current environment — please check\",\n \"installedNotRunnable\": \"Installed · can't run\",\n \"toolCheckEnv\": \"Check environment\",\n \"toolDiagnose\": \"Diagnose installs\",\n \"toolDiagnosing\": \"Diagnosing…\",\n \"toolConflictTitle\": \"Multiple installations detected\",\n \"toolConflictHint\": \"The command line uses the one marked Default; an upgrade may have written to another.\",\n \"toolConflictDefault\": \"Default\",\n \"toolConflictNotRunnable\": \"can't run\",\n \"toolDiagnoseNoConflict\": \"No conflicting installations found\",\n \"toolDiagnoseFailed\": \"Diagnosis failed\",\n \"toolUpgradeConfirmTitle\": \"Confirm upgrade target\",\n \"toolUpgradeConfirmHint\": \"Multiple installations detected. This upgrade won't update all of them; refer to each tool below for what it actually targets.\",\n \"toolUpgradeWillRun\": \"Will run:\",\n \"toolUpgradeConfirmBtn\": \"Confirm upgrade\",\n \"toolUpgradeUnanchoredHint\": \"Can't determine which install your command line uses; will run the default upgrade command (may install to the first npm on PATH).\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"Flag\",\n \"installCommandsCopied\": \"Install commands copied\",\n \"installCommandsCopyFailed\": \"Copy failed, please copy manually.\",\n \"importFailedError\": \"Import config failed: {{message}}\",\n \"exportFailedError\": \"Export config failed:\",\n \"restartRequired\": \"Restart Required\",\n \"restartRequiredMessage\": \"Modifying the OpenSunstar configuration directory requires restarting the application to take effect. Restart now?\",\n \"restartNow\": \"Restart Now\",\n \"restartLater\": \"Restart Later\",\n \"restartFailed\": \"Application restart failed, please manually close and reopen.\",\n \"devModeRestartHint\": \"Dev Mode: Automatic restart not supported, please manually restart the application.\",\n \"saving\": \"Saving...\",\n \"globalProxy\": {\n \"label\": \"Global Proxy\",\n \"hint\": \"Proxy all requests (API, Skills download, etc.). When local routing is enabled, app traffic is also routed through this proxy. Leave empty for direct connection.\",\n \"username\": \"Username (optional)\",\n \"password\": \"Password (optional)\",\n \"test\": \"Test Connection\",\n \"scan\": \"Scan Local Proxies\",\n \"clear\": \"Clear\",\n \"scanFailed\": \"Scan failed: {{error}}\",\n \"saved\": \"Proxy settings saved\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"testSuccess\": \"Connected! Latency {{latency}}ms\",\n \"testFailed\": \"Connection failed: {{error}}\",\n \"pricingDefaultsTitle\": \"Pricing Defaults\",\n \"pricingDefaultsDescription\": \"Set the default multiplier and pricing model source per app.\",\n \"pricingAppLabel\": \"App\",\n \"defaultCostMultiplierLabel\": \"Default Multiplier\",\n \"defaultCostMultiplierHint\": \"Multiplier for cost calculation, decimals supported.\",\n \"pricingModelSourceLabel\": \"Pricing Model Source\",\n \"pricingModelSourceRequest\": \"Request model\",\n \"pricingModelSourceResponse\": \"Response model\",\n \"pricingSave\": \"Save Pricing Defaults\",\n \"pricingSaved\": \"Pricing defaults saved\",\n \"pricingSaveFailed\": \"Failed to save pricing defaults: {{error}}\",\n \"pricingLoadFailed\": \"Failed to load pricing defaults: {{error}}\",\n \"defaultCostMultiplierRequired\": \"Default multiplier is required\",\n \"defaultCostMultiplierInvalid\": \"Invalid multiplier format\"\n },\n \"saveFailedGeneric\": \"Save failed, please try again\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokBuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"Session Manager\",\n \"subtitle\": \"Manage Claude Code, Codex, OpenCode, OpenClaw, Hermes and Gemini CLI sessions\",\n \"searchPlaceholder\": \"Search by content, directory, or ID\",\n \"searchSessions\": \"Search sessions\",\n \"providerFilterAll\": \"All\",\n \"sessionList\": \"Sessions\",\n \"manageBatchTooltip\": \"Enter batch management\",\n \"exitBatchModeTooltip\": \"Exit batch management\",\n \"batchModeHint\": \"Select sessions to export or delete\",\n \"exportSelected\": \"Export Selected\",\n \"batchExporting\": \"Exporting...\",\n \"batchExportSuccess\": \"Exported {{count}} sessions\",\n \"batchExportFailed\": \"Batch export failed, please try again\",\n \"selectForBatch\": \"Select session\",\n \"selectedCount\": \"{{count}} selected\",\n \"selectAllFiltered\": \"Select all\",\n \"clearFilteredSelection\": \"Clear selection\",\n \"clearSelection\": \"Clear\",\n \"deleteSelected\": \"Delete\",\n \"batchDeleting\": \"Deleting...\",\n \"loadingSessions\": \"Loading sessions...\",\n \"noSessions\": \"No sessions found\",\n \"selectSession\": \"Select a session to view details\",\n \"noSummary\": \"No summary available\",\n \"lastActive\": \"Last active\",\n \"projectDir\": \"Project directory\",\n \"sourcePath\": \"Source file\",\n \"copyResumeCommand\": \"Copy resume command\",\n \"resumeCommandCopied\": \"Resume command copied\",\n \"openInTerminal\": \"Resume in terminal\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"Copy only\",\n \"terminalLaunched\": \"Terminal launched\",\n \"openFailed\": \"Failed to launch terminal\",\n \"resumeFallbackCopied\": \"Resume command copied for manual use\",\n \"copyProjectDir\": \"Copy directory\",\n \"projectDirCopied\": \"Directory copied\",\n \"copySourcePath\": \"Copy source file\",\n \"sourcePathCopied\": \"Source file copied\",\n \"delete\": \"Delete session\",\n \"deleting\": \"Deleting...\",\n \"deleteTooltip\": \"Permanently delete this local session record\",\n \"deleteConfirmTitle\": \"Delete session\",\n \"deleteConfirmMessage\": \"This will permanently delete the local session \\\"{{title}}\\\"\\nSession ID: {{sessionId}}\\n\\nThis action cannot be undone.\",\n \"deleteConfirmAction\": \"Delete session\",\n \"sessionDeleted\": \"Session deleted\",\n \"deleteFailed\": \"Failed to delete session: {{error}}\",\n \"batchDeleteConfirmTitle\": \"Delete selected sessions\",\n \"batchDeleteConfirmMessage\": \"This will permanently delete {{count}} selected local sessions.\\n\\nThis action cannot be undone.\",\n \"batchDeleteConfirmAction\": \"Delete selected\",\n \"batchDeleteSuccess\": \"Deleted {{count}} sessions\",\n \"batchDeleteFailed\": \"{{failed}} sessions could not be deleted\",\n \"batchDeleteRequestFailed\": \"Batch delete failed. Please try again later.\",\n \"loadingMessages\": \"Loading transcript...\",\n \"emptySession\": \"No messages available\",\n \"clickToCopyPath\": \"Click to copy path\",\n \"tocTitle\": \"Contents\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} days ago\",\n \"roleUser\": \"User\",\n \"roleSystem\": \"System\",\n \"roleTool\": \"Tool\",\n \"resume\": \"Resume Session\",\n \"resumeTooltip\": \"Resume this session in terminal\",\n \"noResumeCommand\": \"This session cannot be resumed\",\n \"copyCommand\": \"Copy Command\",\n \"copyMessage\": \"Copy Message\",\n \"messageCopied\": \"Message copied\",\n \"conversationHistory\": \"Conversation History\",\n \"expandContent\": \"Expand full content\",\n \"collapseContent\": \"Collapse\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"Received provider switch event:\",\n \"setupListenerFailed\": \"Failed to setup provider switch listener:\",\n \"updateProviderFailed\": \"Update provider failed:\",\n \"autoImportFailed\": \"Auto import default configuration failed:\",\n \"openLinkFailed\": \"Failed to open link:\",\n \"getVersionFailed\": \"Failed to get version info:\",\n \"loadSettingsFailed\": \"Failed to load settings:\",\n \"getConfigPathFailed\": \"Failed to get config path:\",\n \"getConfigDirFailed\": \"Failed to get config directory:\",\n \"detectPortableFailed\": \"Failed to detect portable mode:\",\n \"saveSettingsFailed\": \"Failed to save settings:\",\n \"updateFailed\": \"Update failed:\",\n \"checkUpdateFailed\": \"Check for updates failed:\",\n \"openConfigFolderFailed\": \"Failed to open config folder:\",\n \"selectConfigDirFailed\": \"Failed to select config directory:\",\n \"getDefaultConfigDirFailed\": \"Failed to get default config directory:\",\n \"openReleaseNotesFailed\": \"Failed to open release notes:\"\n },\n \"providerForm\": {\n \"supplierName\": \"Provider Name\",\n \"supplierNameRequired\": \"Provider Name *\",\n \"supplierNamePlaceholder\": \"e.g., Anthropic Official\",\n \"websiteUrl\": \"Website URL\",\n \"websiteUrlPlaceholder\": \"https://example.com (optional)\",\n \"apiEndpoint\": \"API Endpoint\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"Manage & Test\",\n \"configContent\": \"Config Content\",\n \"officialNoApiKey\": \"Official login does not require API Key, save directly\",\n \"codexOfficialNoApiKey\": \"Official does not require API Key, save directly\",\n \"codexApiKeyAutoFill\": \"Just fill in here, auth.json below will be auto-filled\",\n \"apiKeyAutoFill\": \"Just fill in here, config below will be auto-filled\",\n \"cnOfficialApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"aggregatorApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"thirdPartyApiKeyHint\": \"💡 Only need to fill in API Key, endpoint is preset\",\n \"customApiKeyHint\": \"💡 Custom configuration requires manually filling all necessary fields\",\n \"omoHint\": \"💡 OMO config manages Agent model assignments and supports both oh-my-openagent.jsonc and oh-my-opencode.jsonc\",\n \"officialHint\": \"💡 Official provider uses browser login, no API Key needed\",\n \"getApiKey\": \"Get API Key\",\n \"apiKey\": \"API Key\",\n \"envKey\": \"Environment variable name (optional)\",\n \"grokBuildHint\": \"Writes to ~/.grok/config.toml and manages only the native Grok Build model configuration.\",\n \"model\": \"Default model\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode is an official partner of OpenSunstar. Register using this link and enter \\\"OpenSunstar\\\" promo code during recharge to get 10% off\",\n \"apikeyfun\": \"APIKEY.FUN offers a special deal for OpenSunstar users. Register through the exclusive link to enjoy up to permanent 5% off top-ups.\",\n \"apinebula\": \"APINEBULA offers OpenSunstar users a special discount: register using the link and enter the \\\"OpenSunstar\\\" promo code during your first top-up to get 10% off.\",\n \"atlascloud\": \"Atlas Cloud is a full-modal AI inference platform that gives developers one API for video generation, image generation, and LLM access. Check out its new Coding Plan promotion for more budget-friendly API access.\",\n \"sudocode\": \"SudoCode is a global AI model aggregation service. One API key works across multiple models, with presets for Claude Code, Codex, Gemini CLI, OpenClaw, and more.\",\n \"patewayai\": \"PatewayAI offers special benefits for OpenSunstar users. Register via this link to receive $3 credit.\",\n \"claudeapi\": \"ClaudeAPI offers special benefits for OpenSunstar users. Register via this link to claim test credits.\",\n \"claudecn\": \"ClaudeCN is an enterprise-grade AI gateway operated by a registered company, supporting enterprise procurement processes with corporate payments, contracts, and compliance guarantees.\",\n \"runapi\": \"RunAPI offers special benefits for OpenSunstar users. Register via this link and contact customer support to claim ¥14 free credit.\",\n \"minimax_cn\": \"MiniMax Coding Plan Special Offer, Starter from ¥9.9\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday, Starter is now $2/mo (80% OFF!)\",\n \"dmxapi\": \"Claude Code exclusive model 66% OFF now!\",\n \"cubence\": \"Cubence is an official partner of OpenSunstar. Register using this link and enter \\\"OPENSUNSTAR\\\" promo code during recharge to get 10% off every top-up\",\n \"aigocode\": \"AIGoCode is an official partner of OpenSunstar. Register using this link and get 10% bonus credit on your first top-up!\",\n \"rightcode\": \"RightCode is an official partner of OpenSunstar. Register using this link and get 5% bonus credit on every top-up!\",\n \"aicodemirror\": \"AICodeMirror is an official partner of OpenSunstar. Register using this link to get 20% off!\",\n \"crazyrouter\": \"CrazyRouter offers an exclusive bonus for OpenSunstar users — 30% extra credit on your first top-up!\",\n \"sssaicode\": \"SSAI Code offers an exclusive bonus for OpenSunstar users — $10 extra credit on every top-up!\",\n \"siliconflow\": \"SiliconFlow is an official partner of OpenSunstar\",\n \"ucloud\": \"Compshare offers an exclusive bonus for OpenSunstar users — register via this link to get ¥5 platform trial credit!\",\n \"micu\": \"Micu is an official partner of OpenSunstar\",\n \"ctok\": \"Join the CTok community on the official website and subscribe to a plan.\",\n \"shengsuanyun\": \"Shengsuanyun offers exclusive benefits for OpenSunstar users. New users who register via this link get ¥10 free credits and 10% bonus on first top-up!\",\n \"lemondata\": \"Lemon Code offers a special promotion for OpenSunstar users. Sign up via this link to receive $1 in free credits.\",\n \"doubaoseed\": \"DouBao offers exclusive benefits for OpenSunstar users: register via this link to get 500K tokens of inference credits for all DouBao text models and 5M tokens of free Seedance 2.0 credits.\",\n \"volcengine_agentplan\": \"Volcengine Ark Agent Plan offers exclusive benefits for OpenSunstar users: subscribe via this link, starting from ¥40/month for new customers.\",\n \"byteplus\": \"Register via this link to get 500,000 tokens of free inference quota per model.\",\n \"ccsub\": \"CCSub is a stable, affordable AI API relay — a drop-in replacement for Claude.ai & OpenAI subscriptions, with one key for all models at ~30% of direct API cost.\",\n \"unity2\": \"Unity2.ai offers exclusive benefits for OpenSunstar users: register via this link to get $2 in credits, plus another $10 for joining the official group — up to $12 in free credits!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"Parameter Config - {{name}} *\",\n \"mainModel\": \"Main Model (optional)\",\n \"mainModelPlaceholder\": \"e.g., GLM-4.6\",\n \"fastModel\": \"Fast Model (optional)\",\n \"fastModelPlaceholder\": \"e.g., GLM-4.5-Air\",\n \"modelHint\": \"💡 Leave blank to use provider's default model\",\n \"apiHint\": \"💡 Fill in Claude API compatible service endpoint, avoid trailing slash\",\n \"apiHintOAI\": \"💡 Fill in OpenAI Chat Completions compatible service endpoint, avoid trailing slash\",\n \"apiHintGeminiNative\": \"💡 Prefer a Gemini Native base URL such as https://generativelanguage.googleapis.com or https://generativelanguage.googleapis.com/v1beta; the proxy will append models/*:generateContent automatically\",\n \"codexApiHint\": \"💡 Fill in service endpoint compatible with OpenAI Response format\",\n \"fillSupplierName\": \"Please fill in provider name\",\n \"fillConfigContent\": \"Please fill in configuration content\",\n \"fillParameter\": \"Please fill in {{label}}\",\n \"fillTemplateValue\": \"Please fill in {{label}}\",\n \"endpointRequired\": \"API endpoint is required for non-official providers\",\n \"apiKeyRequired\": \"API Key is required for non-official providers\",\n \"softValidation\": {\n \"title\": \"Configuration has the following issues\",\n \"hint\": \"Save anyway? Switching to this provider may fail; you can fill these in later.\",\n \"saveAnyway\": \"Save anyway\"\n },\n \"configJsonError\": \"Config JSON format error, please check syntax\",\n \"authJsonRequired\": \"auth.json must be a JSON object\",\n \"authJsonError\": \"auth.json format error, please check JSON syntax\",\n \"fillAuthJson\": \"Please fill in auth.json configuration\",\n \"fillApiKey\": \"Please fill in OPENAI_API_KEY\",\n \"visitWebsite\": \"Visit {{url}}\",\n \"anthropicModel\": \"Main Model\",\n \"anthropicSmallFastModel\": \"Fast Model\",\n \"apiFormat\": \"API Format\",\n \"apiFormatHint\": \"Select the input format for the provider's API\",\n \"customUserAgent\": \"Custom User-Agent\",\n \"customUserAgentHint\": \"Only takes effect when local routing/proxy takeover is enabled; replaces the User-Agent in requests forwarded to the provider API.\",\n \"customUserAgentInvalid\": \"User-Agent must not contain control characters (e.g. line breaks); otherwise it will be ignored.\",\n \"customUserAgentPresets\": \"Presets\",\n \"fullUrlLabel\": \"Full URL\",\n \"fullUrlEnabled\": \"Full URL Mode\",\n \"fullUrlDisabled\": \"Mark as Full URL\",\n \"fullUrlHint\": \"💡 Enter the full request URL. This mode requires routing to be enabled, and routing will use the URL as-is without appending a path\",\n \"fullUrlHintGeminiNative\": \"💡 In Gemini Native full URL mode, two inputs are supported: 1. official/structured Gemini URLs, which will still be normalized to the requested model and streaming method; 2. opaque custom relay URLs, which will be used mostly as-is with only query parameters appended\",\n \"apiFormatAnthropic\": \"Anthropic Messages (Native)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions (Requires routing)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API (Requires routing)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent (Requires routing)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API (Native)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions (Requires routing)\",\n \"codexApiFormatHint\": \"Select the Codex API format actually supported by this provider; the config stays on Responses for newer Codex versions, while Chat Completions is converted through local routing.\",\n \"authField\": \"Auth Field\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN (Default)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"Select the authentication env variable name for the config\",\n \"apiHintResponses\": \"💡 Fill in OpenAI Responses API compatible service endpoint, avoid trailing slash\",\n \"anthropicDefaultHaikuModel\": \"Default Haiku Model\",\n \"anthropicDefaultSonnetModel\": \"Default Sonnet Model\",\n \"anthropicDefaultOpusModel\": \"Default Opus Model\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"Optional: Specify default Claude model to use, leave blank to use system default.\",\n \"modelMappingLabel\": \"Model Mapping\",\n \"modelMappingHint\": \"Display names only affect the /model menu; 1M is only a Claude Code context-capability declaration.\",\n \"modelRoleLabel\": \"Model role\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"Display name\",\n \"modelDisplayNamePlaceholder\": \"e.g. DeepSeek V4 Pro\",\n \"requestModelLabel\": \"Requested model\",\n \"modelOneMHeader\": \"Declare 1M\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"Default fallback model\",\n \"fallbackModelHint\": \"Used only when a Claude Code request does not clearly map to Sonnet, Opus, or Haiku. Usually safe to leave blank.\",\n \"quickSetModels\": \"Quick Set\",\n \"quickSetSuccess\": \"Model name applied to all roles\",\n \"advancedOptionsToggle\": \"Advanced Options\",\n \"advancedOptionsHint\": \"Includes API format, auth field, and model mapping. Defaults work for most use cases.\",\n \"categoryOfficial\": \"Official\",\n \"categoryCnOfficial\": \"Opensource Official\",\n \"categoryAggregation\": \"Aggregation\",\n \"categoryThirdParty\": \"Third Party\",\n \"fetchModels\": \"Fetch Models\",\n \"fetchingModels\": \"Fetching...\",\n \"fetchModelsSuccess\": \"Found {{count}} models\",\n \"fetchModelsFailed\": \"Failed to fetch models\",\n \"fetchModelsEmpty\": \"No models found\",\n \"fetchModelsNeedApiKey\": \"Please fill in API Key first\",\n \"fetchModelsNeedEndpoint\": \"Please fill in API endpoint first\",\n \"fetchModelsNeedConfig\": \"Please fill in API endpoint and API Key first\",\n \"fetchModelsAuthFailed\": \"API Key is invalid or lacks permission\",\n \"fetchModelsNotSupported\": \"This provider does not support fetching model list\",\n \"fetchModelsEndpointNotFound\": \"No reachable models endpoint found. Please check the Base URL or confirm whether the provider exposes this API.\",\n \"fetchModelsTimeout\": \"Request timed out, please check network connection\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot Authentication\",\n \"authStatus\": \"Authentication Status\",\n \"authenticated\": \"Authenticated as {{username}}\",\n \"notAuthenticated\": \"Not authenticated\",\n \"loginWithGitHub\": \"Login with GitHub\",\n \"loginRequired\": \"Please login to GitHub Copilot first\",\n \"waitingForAuth\": \"Waiting for authorization...\",\n \"enterCode\": \"Please enter the code in your browser:\",\n \"logout\": \"Logout\",\n \"authSuccess\": \"GitHub Copilot authentication successful\",\n \"authFailed\": \"Authentication failed: {{error}}\",\n \"authTimeout\": \"Authentication timed out, please try again\",\n \"tokenExpired\": \"Token expired, please re-authenticate\",\n \"accountCount\": \"{{count}} account(s)\",\n \"selectAccount\": \"Select Account\",\n \"selectAccountPlaceholder\": \"Select a GitHub account\",\n \"useDefaultAccount\": \"Use default account\",\n \"loggedInAccounts\": \"Logged in accounts\",\n \"defaultAccount\": \"Default\",\n \"selected\": \"Selected\",\n \"removeAccount\": \"Remove account\",\n \"setAsDefault\": \"Set as default\",\n \"addAnotherAccount\": \"Add another account\",\n \"logoutAll\": \"Logout all accounts\",\n \"retry\": \"Retry\",\n \"copyCode\": \"Copy code\",\n \"migrationFailed\": \"Legacy auth migration failed: {{error}}\",\n \"loadModelsFailed\": \"Failed to load Copilot models\",\n \"deploymentType\": \"GitHub Deployment Type\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"e.g. company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"Auth status\",\n \"notAuthenticated\": \"Not authenticated\",\n \"loginWithChatGPT\": \"Sign in with ChatGPT\",\n \"loginRequired\": \"Please sign in to ChatGPT first\",\n \"waitingForAuth\": \"Waiting for authorization...\",\n \"enterCode\": \"Enter the code in your browser:\",\n \"accountCount\": \"{{count}} account(s)\",\n \"selectAccount\": \"Select account\",\n \"selectAccountPlaceholder\": \"Choose a ChatGPT account\",\n \"useDefaultAccount\": \"Use default account\",\n \"loggedInAccounts\": \"Logged in accounts\",\n \"defaultAccount\": \"Default\",\n \"selected\": \"Selected\",\n \"removeAccount\": \"Remove account\",\n \"setAsDefault\": \"Set as default\",\n \"addAnotherAccount\": \"Add another account\",\n \"logoutAll\": \"Logout all accounts\",\n \"retry\": \"Retry\",\n \"copyCode\": \"Copy code\",\n \"fastMode\": \"FAST mode\",\n \"fastModeDescription\": \"Send service_tier=\\\"priority\\\" for lower latency. Off by default — enabling it consumes your ChatGPT quota at a higher rate.\"\n },\n \"endpointTest\": {\n \"title\": \"API Endpoint Management\",\n \"endpoints\": \"endpoints\",\n \"autoSelect\": \"Auto Select\",\n \"testSpeed\": \"Test\",\n \"testing\": \"Testing\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"Done\",\n \"noEndpoints\": \"No endpoints\",\n \"failed\": \"Failed\",\n \"enterValidUrl\": \"Please enter a valid URL\",\n \"invalidUrlFormat\": \"Invalid URL format\",\n \"onlyHttps\": \"Only HTTP/HTTPS supported\",\n \"urlExists\": \"This URL already exists\",\n \"saveFailed\": \"Save failed, please try again\",\n \"loadEndpointsFailed\": \"Failed to load custom endpoints:\",\n \"addEndpointFailed\": \"Failed to add custom endpoint:\",\n \"removeEndpointFailed\": \"Failed to remove custom endpoint:\",\n \"removeFailed\": \"Remove failed: {{error}}\",\n \"updateLastUsedFailed\": \"Failed to update endpoint last used time\",\n \"pleaseAddEndpoint\": \"Please add an endpoint first\",\n \"testUnavailable\": \"Speed test unavailable\",\n \"noResult\": \"No result returned\",\n \"testFailed\": \"Speed test failed: {{error}}\",\n \"empty\": \"No endpoints\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"Model Test Config\",\n \"useCustomConfig\": \"Use separate config\",\n \"testConfigDesc\": \"Configure separate model testing parameters for this provider. Uses global settings when disabled.\",\n \"testModel\": \"Test Model\",\n \"testModelPlaceholder\": \"Leave empty to use global config\",\n \"timeoutSecs\": \"Timeout (seconds)\",\n \"testPrompt\": \"Test Prompt\",\n \"degradedThreshold\": \"Degraded Threshold (ms)\",\n \"maxRetries\": \"Max Retries\",\n \"pricingConfig\": \"Pricing Config\",\n \"useCustomPricing\": \"Use separate config\",\n \"pricingConfigDesc\": \"Configure separate pricing parameters for this provider. Uses global defaults when disabled.\",\n \"costMultiplier\": \"Cost Multiplier\",\n \"costMultiplierPlaceholder\": \"Leave empty to use global default (1)\",\n \"costMultiplierHint\": \"Actual cost = Base cost × Multiplier, supports decimals like 1.5\",\n \"pricingModelSourceLabel\": \"Pricing Mode\",\n \"pricingModelSourceInherit\": \"Inherit global default\",\n \"pricingModelSourceRequest\": \"Request model\",\n \"pricingModelSourceResponse\": \"Response model\",\n \"pricingModelSourceHint\": \"Choose whether to match pricing by request model or response model\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex auth.json configuration content\",\n \"authJsonStorageHint\": \"Proxy takeover is showing the stored auth, not the live auth.json.\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex config.toml configuration content\",\n \"configTomlStorageHint\": \"Proxy takeover is showing the stored config, not the live config.toml.\",\n \"proxyTakeoverStorageNotice\": \"💡 This app is under proxy takeover. You are editing the stored provider config; the live config is already temporarily managed by the proxy.\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Codex Common Config Snippet\",\n \"commonConfigHint\": \"This snippet will be appended to the end of config.toml when 'Write Common Config' is checked\",\n \"enableGoalMode\": \"Enable Goal mode\",\n \"enableRemoteCompaction\": \"Enable remote compaction\",\n \"remoteCompactionHint\": \"When enabled, the active model_providers entry name is written as OpenAI so Codex can try remote compaction.\",\n \"apiUrlLabel\": \"API Request URL\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"modelNameHint\": \"Specify the model to use, will be auto-updated in config.toml\",\n \"modelName\": \"Model Name\",\n \"localRoutingToggle\": \"Needs Local Routing\",\n \"localRoutingOffHint\": \"If your provider is not native OpenAI Responses API, or the model name is not Codex's default GPT series, please enable this switch.\",\n \"localRoutingOnHint\": \"Codex currently only natively supports OpenAI Responses API and GPT series models. If your provider uses the Chat Completions protocol or non-GPT models (such as DeepSeek or Kimi), enable this switch and keep local routing running while in use.\",\n \"upstreamModelName\": \"Upstream Model Name\",\n \"upstreamModelNameHint\": \"For Chat format, enter the real upstream model here; routing converts Codex Responses requests to Chat Completions while keeping this model.\",\n \"modelNamePlaceholder\": \"e.g., gpt-5-codex\",\n \"contextWindow1M\": \"1M Context Window\",\n \"contextWindow\": \"Context Window\",\n \"contextWindowPlaceholder\": \"e.g., 128000\",\n \"autoCompactLimit\": \"Auto Compact Limit\",\n \"autoCompactLimitPlaceholder\": \"e.g., 90000\",\n \"autoCompactLimitHint\": \"Auto-compacts history when context reaches this token limit\",\n \"modelMetadataAdvanced\": \"Model Metadata Advanced Options\",\n \"modelMetadataAdvancedHint\": \"Overrides Codex metadata for unknown models; clearing a field removes the matching config.toml entry.\",\n \"modelMappingTitle\": \"Model Mapping\",\n \"modelMappingHint\": \"Generates Codex model_catalog_json so /model can show these third-party model names; entries are saved exactly as listed. Codex must be restarted to refresh the model list after changes.\",\n \"addCatalogModel\": \"Add Model\",\n \"catalogDisplayName\": \"Display Name\",\n \"catalogDisplayNamePlaceholder\": \"e.g., DeepSeek V4 Flash\",\n \"catalogModelId\": \"Model ID\",\n \"catalogModelPlaceholder\": \"e.g., deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"Menu Display Name\",\n \"catalogColumnModel\": \"Actual Request Model\",\n \"catalogColumnContext\": \"Context Window\",\n \"reasoningModeToggle\": \"Supports Thinking Mode\",\n \"reasoningModeHint\": \"Enable when the upstream Chat Completions API supports toggling thinking on/off. Providers like Kimi, GLM and Qwen usually fall into this category.\",\n \"reasoningEffortToggle\": \"Supports Reasoning Effort\",\n \"reasoningEffortHint\": \"Enable when the upstream supports thinking-depth control such as low/high/max. Enabling this also turns on thinking mode and converts Codex's reasoning.effort into the upstream Chat parameter.\",\n \"reasoningGroupTitle\": \"Reasoning Capability\",\n \"reasoningSectionHint\": \"Preset providers are configured automatically; custom providers are inferred from name/URL. Override manually only when auto-detection is wrong.\",\n \"advancedSectionHint\": \"Includes local routing, model mapping, reasoning overrides and custom User-Agent. Enable local routing here when your provider uses the Chat Completions protocol or non-GPT models.\"\n },\n \"geminiConfig\": {\n \"envFile\": \"Environment Variables (.env)\",\n \"envFileHint\": \"Configure Gemini environment variables in .env format\",\n \"configJson\": \"Configuration File (config.json)\",\n \"configJsonHint\": \"Configure Gemini extended parameters in JSON format (optional)\",\n \"writeCommonConfig\": \"Write Common Config\",\n \"editCommonConfig\": \"Edit Common Config\",\n \"editCommonConfigTitle\": \"Edit Gemini Common Config Snippet\",\n \"commonConfigHint\": \"This snippet writes to Gemini .env (GOOGLE_GEMINI_BASE_URL and GEMINI_API_KEY are not allowed)\",\n \"extractFromCurrent\": \"Extract from Editor\",\n \"extractNoCommonConfig\": \"No common config available to extract from editor\",\n \"extractFailed\": \"Extract failed: {{error}}\",\n \"saveFailed\": \"Save failed: {{error}}\",\n \"extractedConfigInvalid\": \"Extracted config format is invalid\",\n \"invalidJsonFormat\": \"Common config snippet format error (must be valid JSON)\",\n \"commonConfigInvalidKeys\": \"Common config snippet must not include GOOGLE_GEMINI_BASE_URL or GEMINI_API_KEY (found: {{keys}})\",\n \"commonConfigInvalidValues\": \"Common config snippet values must be strings\",\n \"noCommonConfigToApply\": \"Common config snippet is empty or has no applicable entries\",\n \"configMergeFailed\": \"Config merge failed: {{error}}\",\n \"configReplaceFailed\": \"Config replace failed: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API Format\",\n \"selectPackage\": \"Select API format\",\n \"npmPackageHint\": \"Select the API format for the AI service\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"Custom API endpoint URL\",\n \"models\": \"Models\",\n \"modelsHint\": \"Configure available models and their display names\",\n \"addModel\": \"Add Model\",\n \"modelId\": \"Model ID\",\n \"modelName\": \"Display Name\",\n \"noModels\": \"No models configured\",\n \"modelsRequired\": \"Please add at least one model\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.\",\n \"providerKeyLockedHint\": \"This provider has already been added to the app config, so its key can no longer be changed.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyDuplicate\": \"This key is already in use\",\n \"providerKeyInvalid\": \"Invalid format. Use lowercase letters, numbers, and hyphens only.\",\n \"extraOptions\": \"Extra Options\",\n \"extraOptionsHint\": \"Configure extra SDK options like timeout, setCacheKey, etc. Values are auto-parsed to appropriate types (number, boolean, etc.).\",\n \"addExtraOption\": \"Add\",\n \"extraOptionKey\": \"Key\",\n \"extraOptionValue\": \"Value\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"No extra options configured\",\n \"noModelOptions\": \"Model options, click + to add\",\n \"modelExtraFields\": \"Model Properties\",\n \"noModelExtraFields\": \"Model properties (variants, cost, etc.), click + to add\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK Options\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"Provider Preset\",\n \"custom\": \"Custom Configuration\",\n \"other\": \"Other\",\n \"hint\": \"You can continue to adjust the fields below after selecting a preset.\",\n \"searchTooltip\": \"Search presets\",\n \"searchAriaLabel\": \"Search provider presets\",\n \"searchPlaceholder\": \"Search name, website, or category...\",\n \"sortAriaLabel\": \"Toggle preset sorting\",\n \"sortNameAscTooltip\": \"Sort by name A-Z\",\n \"sortOriginalTooltip\": \"Restore original order\",\n \"noSearchResults\": \"No provider presets match your search.\"\n },\n \"usage\": {\n \"title\": \"Usage Statistics\",\n \"subtitle\": \"View AI model usage and cost statistics\",\n \"today\": \"24 Hours\",\n \"last7days\": \"7 Days\",\n \"last30days\": \"30 Days\",\n \"presetToday\": \"Today\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"Total Requests\",\n \"totalCost\": \"Total Cost\",\n \"cost\": \"Cost\",\n \"perMillion\": \"(per million)\",\n \"trends\": \"Usage Trends\",\n \"rangeToday\": \"Last 24 hours (hourly)\",\n \"rangeLast7Days\": \"Last 7 days\",\n \"rangeLast30Days\": \"Last 30 days\",\n \"totalTokens\": \"New Tokens (Input+Output)\",\n \"cacheTokens\": \"Cache Tokens\",\n \"realTotal\": \"Tokens Processed\",\n \"realTotalHint\": \"Input + Output + Cache Write + Cache Read\",\n \"freshInput\": \"Fresh Input\",\n \"cacheHitRate\": \"Cache Hit Rate\",\n \"requestLogs\": \"Request Logs\",\n \"providerStats\": \"Provider Stats\",\n \"modelStats\": \"Model Stats\",\n \"time\": \"Time\",\n \"provider\": \"Provider\",\n \"billingModel\": \"Billing Model\",\n \"inputTokens\": \"Input\",\n \"outputTokens\": \"Output\",\n \"cacheReadTokens\": \"Cache Hit\",\n \"cacheCreationTokens\": \"Cache Creation\",\n \"timingInfo\": \"Duration/TTFT\",\n \"status\": \"Status\",\n \"multiplier\": \"Multiplier\",\n \"requestModel\": \"Request Model\",\n \"responseModel\": \"Response Model\",\n \"noData\": \"No data\",\n \"unknownProvider\": \"Unknown Provider\",\n \"stream\": \"Stream\",\n \"nonStream\": \"Non-stream\",\n \"source\": \"Source\",\n \"requestsLabel\": \"requests\",\n \"costLabel\": \"total cost\",\n \"appFilter\": {\n \"all\": \"All\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokbuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"Raw\",\n \"dataSources\": \"Data Sources\",\n \"dataSource\": {\n \"proxy\": \"Routing\",\n \"session_log\": \"Session Log\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex Session\",\n \"gemini_session\": \"Gemini Session\",\n \"opencode_session\": \"OpenCode Session\"\n },\n \"sessionSync\": {\n \"trigger\": \"Sync session logs\",\n \"import\": \"Import Sessions\",\n \"resync\": \"Sync\",\n \"imported\": \"Imported {{count}} records from session logs\",\n \"upToDate\": \"Session logs are up to date\",\n \"failed\": \"Session sync failed\"\n },\n \"totalRecords\": \"{{total}} records total\",\n \"goToPage\": \"Go\",\n \"pageInputPlaceholder\": \"Page\",\n \"modelPricing\": \"Model Pricing\",\n \"loadPricingError\": \"Failed to load pricing data\",\n \"modelPricingDesc\": \"Configure token costs for each model\",\n \"noPricingData\": \"No pricing data. Click \\\"Add\\\" to add model pricing configuration.\",\n \"model\": \"Model\",\n \"pricingModel\": \"Pricing Model\",\n \"displayName\": \"Display Name\",\n \"inputCost\": \"Input Cost\",\n \"outputCost\": \"Output Cost\",\n \"cacheReadCost\": \"Cache Hit\",\n \"cacheWriteCost\": \"Cache Creation\",\n \"pricingAudit\": \"Audit\",\n \"pricingBuiltinPublic\": \"Built-in public price\",\n \"pricingUserOverride\": \"User override\",\n \"pricingEffectiveAt\": \"Effective\",\n \"longContextRate\": \"Long context\",\n \"deleteConfirmTitle\": \"Confirm Delete\",\n \"deleteConfirmDesc\": \"Are you sure you want to delete this model pricing? This action cannot be undone.\",\n \"queryFailed\": \"Query failed\",\n \"refreshUsage\": \"Refresh usage\",\n \"planUsage\": \"Plan usage\",\n \"hostConfirm\": {\n \"title\": \"Confirm outbound domain\",\n \"message\": \"This provider's custom usage script wants to send a request (which includes your API key) to:\\n\\n{{host}}\\n\\nOnly continue if you trust this domain. Your choice is remembered for this provider until the target domain changes.\",\n \"pending\": \"Confirmation required before contacting {{host}}\",\n \"reviewButton\": \"Review\",\n \"confirm\": \"Trust & continue\",\n \"cancel\": \"Cancel\"\n },\n \"invalid\": \"Expired\",\n \"total\": \"Total:\",\n \"used\": \"Used:\",\n \"remaining\": \"Remaining:\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} day ago\",\n \"multiplePlans\": \"{{count}} plans\",\n \"expand\": \"Expand\",\n \"collapse\": \"Collapse\",\n \"modelIdPlaceholder\": \"e.g., claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"e.g., Claude 3.5 Sonnet\",\n \"appType\": \"App Type\",\n \"allApps\": \"All Apps\",\n \"statusCode\": \"Status Code\",\n \"searchProviderPlaceholder\": \"Search provider...\",\n \"searchModelPlaceholder\": \"Search model...\",\n \"timeRange\": \"Time Range\",\n \"customRange\": \"Calendar Filter\",\n \"customRangeHint\": \"Supports both date and time\",\n \"startTime\": \"Start Time\",\n \"endTime\": \"End Time\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"Creation\",\n \"cacheWriteNotReported\": \"OpenAI protocol doesn't distinguish cache creation; only cache hits are reported\",\n \"cacheWritePartial\": \"Some protocols (e.g. OpenAI) don't report cache creation; the value may be incomplete\",\n \"cacheRead\": \"Hit\",\n \"baseCost\": \"Base\",\n \"costMultiplier\": \"Cost Multiplier\",\n \"withMultiplier\": \"with multiplier\",\n \"requestDetail\": \"Request Detail\",\n \"requestNotFound\": \"Request not found\",\n \"basicInfo\": \"Basic Info\",\n \"tokenUsage\": \"Token Usage\",\n \"cacheCreationCost\": \"Cache Creation Cost\",\n \"costBreakdown\": \"Cost Breakdown\",\n \"performance\": \"Performance\",\n \"latency\": \"Latency\",\n \"errorMessage\": \"Error Message\",\n \"requests\": \"Requests\",\n \"tokens\": \"Tokens\",\n \"avgCost\": \"Average Cost\",\n \"avgLatency\": \"Average Latency\",\n \"successRate\": \"Success Rate\",\n \"requestId\": \"Request ID\",\n \"never\": \"Never\",\n \"modelId\": \"Model ID\",\n \"modelIdRequired\": \"Model ID is required\",\n \"inputCostPerMillion\": \"Input Cost (per million tokens, USD)\",\n \"outputCostPerMillion\": \"Output Cost (per million tokens, USD)\",\n \"invalidPrice\": \"Price must be non-negative\",\n \"invalidTimeRange\": \"Please select complete start/end time\",\n \"invalidTimeRangeOrder\": \"Start time cannot be later than end time\",\n \"timeRangeTooLarge\": \"Time range is too large, please narrow it down\",\n \"addPricing\": \"Add Pricing\",\n \"editPricing\": \"Edit Pricing\",\n \"pricingAdded\": \"Pricing added\",\n \"pricingUpdated\": \"Pricing updated\",\n \"cacheReadCostPerMillion\": \"Cache Read Cost (per million tokens, USD)\",\n \"cacheCreationCostPerMillion\": \"Cache Write Cost (per million tokens, USD)\"\n },\n \"usageScript\": {\n \"title\": \"Configure Usage Query\",\n \"enableUsageQuery\": \"Enable usage query\",\n \"presetTemplate\": \"Preset template\",\n \"requestUrl\": \"Request URL\",\n \"requestUrlPlaceholder\": \"e.g. https://api.example.com\",\n \"method\": \"HTTP method\",\n \"templateCustom\": \"Custom\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"Official\",\n \"templateOfficialSubscription\": \"Official Subscription\",\n \"copilotAutoAuth\": \"Auto OAuth authentication, no manual credentials needed\",\n \"tokenPlanHint\": \"Automatically uses the provider's API Key and Base URL to query Token Plan quota\",\n \"balanceHint\": \"Automatically uses the provider's API Key to query account balance\",\n \"officialSubscriptionHint\": \"Reads the local CLI OAuth credentials and calls the official API to query subscription quota. Disabled by default and only requests after you enable it.\",\n \"resetDate\": \"Reset date\",\n \"premiumRequests\": \"Premium Requests\",\n \"credentialsConfig\": \"Credentials\",\n \"credentialsHint\": \"Leave empty to use provider config\",\n \"optional\": \"optional\",\n \"apiKeyPlaceholder\": \"Leave empty to use provider's API Key\",\n \"baseUrlPlaceholder\": \"Leave empty to use provider's base URL\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"Generate in 'Security Settings'\",\n \"userId\": \"User ID\",\n \"userIdPlaceholder\": \"e.g., 114514\",\n \"defaultPlan\": \"Default Plan\",\n \"queryFailedMessage\": \"Query failed\",\n \"queryScript\": \"Query script (JavaScript)\",\n \"timeoutSeconds\": \"Timeout (seconds)\",\n \"headers\": \"Headers\",\n \"body\": \"Body\",\n \"timeoutHint\": \"Range: 2-30 seconds\",\n \"timeoutMustBeInteger\": \"Timeout must be an integer, decimal part ignored\",\n \"timeoutCannotBeNegative\": \"Timeout cannot be negative\",\n \"autoIntervalMinutes\": \"Auto query interval (minutes, 0 to disable)\",\n \"autoQueryInterval\": \"Auto Query Interval (minutes)\",\n \"autoQueryIntervalHint\": \"0 to disable; recommend 5-60 minutes\",\n \"intervalMustBeInteger\": \"Interval must be an integer, decimal part ignored\",\n \"intervalCannotBeNegative\": \"Interval cannot be negative\",\n \"intervalAdjusted\": \"Interval adjusted to {{value}} minutes\",\n \"scriptHelp\": \"Script writing instructions:\",\n \"configFormat\": \"Configuration format:\",\n \"commentOptional\": \"optional\",\n \"commentResponseIsJson\": \"response is the JSON data returned by the API\",\n \"extractorFormat\": \"Extractor return format (all fields optional):\",\n \"tips\": \"💡 Tips:\",\n \"testing\": \"Testing...\",\n \"testScript\": \"Test script\",\n \"format\": \"Format\",\n \"saveConfig\": \"Save config\",\n \"scriptEmpty\": \"Script configuration cannot be empty\",\n \"mustHaveReturn\": \"Script must contain return statement\",\n \"testSuccess\": \"Test successful!\",\n \"testFailed\": \"Test failed\",\n \"formatSuccess\": \"Format successful\",\n \"formatFailed\": \"Format failed\",\n \"supportedVariables\": \"Supported Variables\",\n \"variablesHint\": \"Supported variables: {{apiKey}}, {{baseUrl}} | extractor function receives API response JSON object\",\n \"scriptConfig\": \"Request configuration\",\n \"extractorCode\": \"Extractor code\",\n \"extractorHint\": \"Return object should include remaining quota fields\",\n \"fieldIsValid\": \"• isValid: Boolean, whether plan is valid\",\n \"fieldInvalidMessage\": \"• invalidMessage: String, reason for expiration (shown when isValid is false)\",\n \"fieldRemaining\": \"• remaining: Number, remaining quota\",\n \"fieldUnit\": \"• unit: String, unit (e.g., \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String, plan name\",\n \"fieldTotal\": \"• total: Number, total quota\",\n \"fieldUsed\": \"• used: Number, used quota\",\n \"fieldExtra\": \"• extra: String, custom display text\",\n \"tip1\": \"• Variables {{apiKey}} and {{baseUrl}} are automatically replaced\",\n \"tip2\": \"• Extractor function runs in sandbox environment, supports ES2020+ syntax\",\n \"tip3\": \"• Entire config must be wrapped in () to form object literal expression\"\n },\n \"errors\": {\n \"usage_query_failed\": \"Usage query failed\",\n \"configLoadFailedTitle\": \"Configuration Load Failed\",\n \"configLoadFailedMessage\": \"Unable to read configuration file:\\n{{path}}\\n\\nError details:\\n{{detail}}\\n\\nPlease check if the JSON is valid, or restore from a backup file (e.g., config.json.bak) in the same directory.\\n\\nThe app will exit so you can fix this.\",\n \"mcpPageLoadFailed\": \"MCP Discovery page failed to load\",\n \"mcpPageLoadDescription\": \"The MCP registry page encountered a rendering error. This may be caused by data corruption or a network issue.\",\n \"pageLoadFailed\": \"Page failed to load\",\n \"pageLoadFailedDescription\": \"An unexpected error occurred while rendering the current view. Please try switching to another page or refreshing.\"\n },\n \"presetSelector\": {\n \"title\": \"Select Configuration Type\",\n \"custom\": \"Custom\",\n \"customDescription\": \"Manually configure provider, requires complete configuration\",\n \"officialDescription\": \"Official login, no API Key required\",\n \"presetDescription\": \"Use preset configuration, only API Key required\"\n },\n \"mcp\": {\n \"title\": \"MCP Management\",\n \"import\": \"Import\",\n \"importExisting\": \"Import Existing\",\n \"addMcp\": \"Add MCP\",\n \"discover\": \"Discover MCP\",\n \"claudeTitle\": \"Claude Code MCP Management\",\n \"codexTitle\": \"Codex MCP Management\",\n \"geminiTitle\": \"Gemini MCP Management\",\n \"unifiedPanel\": {\n \"title\": \"MCP Server Management\",\n \"addServer\": \"Add Server\",\n \"editServer\": \"Edit Server\",\n \"deleteServer\": \"Delete Server\",\n \"deleteConfirm\": \"Are you sure you want to delete server \\\"{{id}}\\\"? This action cannot be undone.\",\n \"noServers\": \"No servers yet\",\n \"enabledApps\": \"Enabled Apps\",\n \"noImportFound\": \"No MCP servers to import found. All servers are already managed by OpenSunstar.\",\n \"importSuccess\": \"Successfully imported {{count}} MCP servers\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"User-level MCP path\",\n \"serverList\": \"Servers\",\n \"loading\": \"Loading...\",\n \"empty\": \"No MCP servers\",\n \"emptyDescription\": \"Click the button in the top right to add your first MCP server\",\n \"add\": \"Add MCP\",\n \"addServer\": \"Add MCP\",\n \"editServer\": \"Edit MCP\",\n \"addClaudeServer\": \"Add Claude Code MCP\",\n \"editClaudeServer\": \"Edit Claude Code MCP\",\n \"addCodexServer\": \"Add Codex MCP\",\n \"editCodexServer\": \"Edit Codex MCP\",\n \"configPath\": \"Config Path\",\n \"serverCount\": \"{{count}} MCP server(s) configured\",\n \"enabledCount\": \"{{count}} enabled\",\n \"template\": {\n \"fetch\": \"Quick Template: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP Title (Unique)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"Display Name\",\n \"namePlaceholder\": \"e.g. @modelcontextprotocol/server-time\",\n \"enabledApps\": \"Enable to Apps\",\n \"noAppsWarning\": \"At least one app must be selected\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Optional description\",\n \"tags\": \"Tags (comma separated)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"Homepage\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"Docs\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"Additional Info\",\n \"jsonConfig\": \"Full JSON Configuration\",\n \"jsonConfigOrPrefix\": \"Full JSON configuration or use\",\n \"tomlConfigOrPrefix\": \"Full TOML configuration or use\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"Full TOML Configuration\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"Config Wizard\",\n \"syncOtherSide\": \"Mirror to {{target}}\",\n \"syncOtherSideHint\": \"Apply the same settings to {{target}}; existing entries with the same id will be overwritten.\",\n \"willOverwriteWarning\": \"Will overwrite existing config in {{target}}\"\n },\n \"wizard\": {\n \"title\": \"MCP Configuration Wizard\",\n \"hint\": \"Quickly configure MCP server and auto-generate JSON configuration\",\n \"type\": \"Type\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"Command\",\n \"commandPlaceholder\": \"npx or uvx\",\n \"args\": \"Arguments\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"Environment Variables\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"Please enter URL\",\n \"headers\": \"Headers (optional)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"Configuration Preview\",\n \"apply\": \"Apply Configuration\"\n },\n \"id\": \"Identifier (unique)\",\n \"type\": \"Type\",\n \"command\": \"Command\",\n \"validateCommand\": \"Validate Command\",\n \"args\": \"Args\",\n \"argsPlaceholder\": \"e.g., mcp-server-fetch --help\",\n \"env\": \"Environment (one per line, KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"Reset\",\n \"msg\": {\n \"saved\": \"Saved\",\n \"deleted\": \"Deleted\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"Disabled\",\n \"templateAdded\": \"Template added\"\n },\n \"error\": {\n \"idRequired\": \"Please enter identifier\",\n \"idExists\": \"Identifier already exists. Please choose another.\",\n \"jsonInvalid\": \"Invalid JSON format\",\n \"tomlInvalid\": \"Invalid TOML format\",\n \"commandRequired\": \"Please enter command\",\n \"singleServerObjectRequired\": \"Please paste a single MCP server object (do not include top-level mcpServers)\",\n \"saveFailed\": \"Save failed\",\n \"deleteFailed\": \"Delete failed\"\n },\n \"test\": {\n \"testConnection\": \"Test Connection\",\n \"batchTestConnection\": \"Batch test all server connections\",\n \"batchProgress\": \"Testing... ({{completed}}/{{total}})\",\n \"allConnected\": \"All {{count}} servers connected successfully\",\n \"batchSummary\": \"{{connected}} succeeded, {{failed}} failed ({{total}} total)\",\n \"noServersToTest\": \"No servers to test\",\n \"connected\": \"Connected\",\n \"authRequired\": \"Auth Required\",\n \"unreachable\": \"Unreachable\",\n \"timeout\": \"Timeout\",\n \"commandFailed\": \"Start Failed\",\n \"unexpected\": \"Unexpected\"\n },\n \"discovery\": {\n \"title\": \"Discover MCP\",\n \"searchPlaceholder\": \"Search MCP servers by keyword...\",\n \"totalFound\": \"Found {{count}} servers\",\n \"alreadyInstalled\": \"{{count}} installed\",\n \"noResults\": \"No servers found for \\\"{{query}}\\\"\",\n \"noServers\": \"No servers available\",\n \"official\": \"Official\",\n \"installed\": \"Installed\",\n \"install\": \"Install\",\n \"remotes\": \"Remotes\",\n \"website\": \"Website\",\n \"repository\": \"Repository\"\n },\n \"validation\": {\n \"ok\": \"Command available\",\n \"fail\": \"Command not found\"\n },\n \"confirm\": {\n \"deleteTitle\": \"Delete MCP Server\",\n \"deleteMessage\": \"Are you sure you want to delete MCP server \\\"{{id}}\\\"? This action cannot be undone.\"\n },\n \"presets\": {\n \"title\": \"Select MCP Type\",\n \"enable\": \"Enable\",\n \"enabled\": \"Enabled\",\n \"installed\": \"Installed\",\n \"docs\": \"Docs\",\n \"requiresEnv\": \"Requires env\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"Universal HTTP request tool, supports GET/POST and other HTTP methods, suitable for quick API requests and web data scraping\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"Time query tool providing current time, timezone conversion, and date calculation features\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"Knowledge graph memory system supporting entities, relations, and observations to help AI remember important information from conversations\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"Sequential thinking tool helping AI break down complex problems into multiple steps for deeper thinking\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"Context7 documentation search tool providing latest library docs and code examples, with higher limits when configured with a key\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude Prompt Management\",\n \"codexTitle\": \"Codex Prompt Management\",\n \"add\": \"Add Prompt\",\n \"edit\": \"Edit Prompt\",\n \"addTitle\": \"Add {{appName}} Prompt\",\n \"editTitle\": \"Edit {{appName}} Prompt\",\n \"import\": \"Import Existing\",\n \"count\": \"{{count}} prompts\",\n \"enabled\": \"Enabled\",\n \"enable\": \"Enable\",\n \"enabledName\": \"Enabled: {{name}}\",\n \"noneEnabled\": \"No prompt enabled\",\n \"currentFile\": \"Current {{filename}} Content\",\n \"empty\": \"No prompts yet\",\n \"emptyDescription\": \"Click the button above to add or import prompts\",\n \"loading\": \"Loading...\",\n \"name\": \"Name\",\n \"namePlaceholder\": \"e.g., Default Project Prompt\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Optional description\",\n \"content\": \"Content\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nEnter prompt content here...\",\n \"loadFailed\": \"Failed to load prompts\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"enableSuccess\": \"Enabled successfully\",\n \"enableFailed\": \"Failed to enable\",\n \"disableSuccess\": \"Disabled successfully\",\n \"disableFailed\": \"Failed to disable\",\n \"importSuccess\": \"Imported successfully\",\n \"importFailed\": \"Failed to import\",\n \"confirm\": {\n \"deleteTitle\": \"Confirm Delete\",\n \"deleteMessage\": \"Are you sure you want to delete prompt \\\"{{name}}\\\"?\"\n },\n \"fragment\": {\n \"isFragment\": \"Rule fragment\",\n \"parent\": \"Parent prompt\",\n \"selectParent\": \"Select parent prompt\",\n \"priority\": \"Priority (higher merges first)\",\n \"targets\": \"Target tools (comma-separated, * for all)\",\n \"globs\": \"File globs (JSON array)\",\n \"badge\": \"Fragment\"\n }\n },\n \"dryRun\": {\n \"title\": \"Preview mode (Dry Run)\",\n \"description\": \"When enabled, prompt activation shows a diff preview before writing to disk\",\n \"settingsTitle\": \"Preview mode (Dry Run)\",\n \"settingsDescription\": \"Preview diffs before applying writes to disk\",\n \"confirmWrite\": \"Confirm write\",\n \"promptActivationTitle\": \"Prompt activation preview\",\n \"promptActivationDesc\": \"Preview mode is on; confirm to write to the target file\",\n \"current\": \"Current file\",\n \"after\": \"After activation\"\n },\n \"commands\": {\n \"title\": \"Commands\",\n \"manage\": \"Commands\",\n \"empty\": \"No custom commands yet\",\n \"add\": \"Add Command\",\n \"edit\": \"Edit Command\",\n \"count\": \"{{count}} commands\",\n \"loadFailed\": \"Failed to load commands\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Command\",\n \"deleteMessage\": \"Delete command \\\"{{name}}\\\"? Synced files will be removed.\"\n },\n \"form\": {\n \"name\": \"Command name\",\n \"description\": \"Description\",\n \"content\": \"Content (Markdown)\",\n \"arguments\": \"Arguments (JSON)\",\n \"syncTargets\": \"Sync to\"\n },\n \"variableHelp\": {\n \"title\": \"Template variables\",\n \"arguments\": \"User argument placeholder for Claude Code / Gemini\",\n \"codexNote\": \"Codex does not support standalone command files.\"\n }\n },\n \"hooks\": {\n \"title\": \"Hooks\",\n \"empty\": \"No lifecycle hooks yet\",\n \"add\": \"Add Hook\",\n \"edit\": \"Edit Hook\",\n \"count\": \"{{count}} hooks\",\n \"loadFailed\": \"Failed to load hooks\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"syncSuccess\": \"Synced to Claude Code\",\n \"syncFailed\": \"Sync failed\",\n \"syncNow\": \"Sync to Claude\",\n \"claudeOnlyNote\": \"Currently syncs to Claude Code settings.json hooks field only\",\n \"timeoutLabel\": \"Timeout {{seconds}}s\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Hook\",\n \"deleteMessage\": \"Delete this hook? settings.json will be updated.\"\n },\n \"form\": {\n \"eventType\": \"Event type\",\n \"toolPattern\": \"Tool pattern (glob)\",\n \"hookCommand\": \"Shell command\",\n \"timeout\": \"Timeout (seconds, 1-300)\",\n \"description\": \"Description\"\n },\n \"eventType\": {\n \"PreToolUse\": \"Pre tool use\",\n \"PostToolUse\": \"Post tool use\",\n \"Notification\": \"Notification\",\n \"Stop\": \"Stop\"\n }\n },\n \"convert\": {\n \"title\": \"Convert\",\n \"subtitle\": \"Migrate Prompt, MCP, Skill, and Command configs between Claude, Codex, Gemini, and more\",\n \"sourceApp\": \"Source tool\",\n \"targetApp\": \"Target tool\",\n \"contentType\": \"Config type\",\n \"skill\": \"Skills\",\n \"command\": \"Commands\",\n \"selectTarget\": \"Select target tool\",\n \"notFound\": \"File not found\",\n \"loadFailed\": \"Failed to detect source configs\",\n \"previewing\": \"Generating preview…\",\n \"warnings\": \"Conversion notes\",\n \"unmapped\": \"Unmapped section: {{section}}\",\n \"sourcePreview\": \"Source\",\n \"convertedPreview\": \"Converted\",\n \"overwrite\": \"Overwrite existing target file (auto backup as .bak.opensunstar)\",\n \"apply\": \"Apply\",\n \"applySuccess\": \"Config written to target tool\",\n \"applyFailed\": \"Write failed\",\n \"steps\": {\n \"source\": \"Select source\",\n \"previewSource\": \"Preview source\",\n \"previewTarget\": \"Preview conversion\",\n \"confirm\": \"Confirm write\"\n }\n },\n \"ignore\": {\n \"title\": \"Ignore Rules\",\n \"empty\": \"No ignore rules yet\",\n \"emptyHint\": \"Glob rules sync to .claudeignore, .codexignore, and similar files\",\n \"add\": \"Add Rule\",\n \"edit\": \"Edit Ignore Rule\",\n \"count\": \"{{count}} rules\",\n \"loadFailed\": \"Failed to load ignore rules\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"importGitignore\": \"Import from .gitignore\",\n \"importSuccess\": \"Imported {{count}} rules\",\n \"importFailed\": \"Import failed\",\n \"syncNow\": \"Sync to tools\",\n \"syncSuccess\": \"Synced to tool ignore files\",\n \"syncFailed\": \"Sync failed\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Rule\",\n \"deleteMessage\": \"Delete this ignore rule? Ignore files will be updated.\"\n },\n \"form\": {\n \"pattern\": \"Glob pattern\",\n \"description\": \"Description\",\n \"syncTargets\": \"Sync to\"\n }\n },\n \"permissions\": {\n \"title\": \"Tool Permissions\",\n \"empty\": \"No permission rules yet\",\n \"emptyHint\": \"Manage Claude Code allow/deny lists; coexists with hooks in settings.json\",\n \"add\": \"Add Permission\",\n \"edit\": \"Edit Permission\",\n \"count\": \"{{count}} permissions\",\n \"loadFailed\": \"Failed to load permissions\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"syncNow\": \"Sync to Claude\",\n \"syncSuccess\": \"Synced to Claude settings.json\",\n \"syncFailed\": \"Sync failed\",\n \"presets\": \"Presets:\",\n \"presetApplied\": \"Preset applied\",\n \"presetFailed\": \"Failed to apply preset\",\n \"claudeOnlyNote\": \"Currently syncs to Claude Code settings.json permissions field only\",\n \"confirm\": {\n \"deleteTitle\": \"Delete Permission\",\n \"deleteMessage\": \"Delete this permission rule? settings.json will be updated.\"\n },\n \"form\": {\n \"type\": \"Permission type\",\n \"toolPattern\": \"Tool pattern\",\n \"description\": \"Description\"\n },\n \"type\": {\n \"allowedTools\": \"Allow\",\n \"deniedTools\": \"Deny\",\n \"autoApprove\": \"Auto-approve\"\n }\n },\n \"workspace\": {\n \"title\": \"Project Cockpit\",\n \"subtitle\": \"AI config status and recent activity across your projects, so you see what matters first\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI assets\"\n },\n \"tabs\": {\n \"label\": \"Workspace views\",\n \"dashboard\": \"Alerts\",\n \"board\": \"Project board\"\n },\n \"dashboard\": {\n \"title\": \"Alerts\",\n \"subtitle\": \"{{count}} projects · focus on progress and AI asset readiness\",\n \"attentionCount\": \"Needs attention\",\n \"attentionHint\": \"Low readiness or missing assets\",\n \"avgReadiness\": \"Avg. readiness\",\n \"missingMcp\": \"Missing MCP\",\n \"activeProjects\": \"Active ({{days}}d)\",\n \"activeHint\": \"Git commits\",\n \"queueTitle\": \"Priority queue\",\n \"allGood\": \"All projects look healthy — you're good to ship.\",\n \"configureAssets\": \"Configure assets\",\n \"reasonReadiness\": \"Readiness {{score}}/{{max}}\",\n \"reasonDrift\": \"{{count}} config mismatch item(s)\",\n \"reasonUnmanaged\": \"Not yet managed by OpenSunstar\",\n \"reasonMcp\": \"No MCP linked\",\n \"reasonSkills\": \"No Skills\",\n \"reasonPrompts\": \"No Prompts linked\",\n \"reasonProgress\": \"MVP {{progress}}%\",\n \"lastUpdated\": \"Last updated\",\n \"updatedJustNow\": \"Updated just now\",\n \"updatedMinutesAgo\": \"Updated {{count}}m ago\",\n \"updatedHoursAgo\": \"Updated {{count}}h ago\",\n \"updatedAt\": \"Updated {{time}}\",\n \"refreshing\": \"Refreshing…\",\n \"loading\": \"Loading readiness and asset data…\",\n \"mvpBehindHint\": \"{{count}} MVP project(s) below 50% progress — consider prioritizing.\",\n \"activeSub\": \"{{commits}} commits · activity {{tier}}\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI assets\",\n \"subtitle\": \"Per-project MCP / Skills / Prompts links and readiness\",\n \"loading\": \"Summarizing project AI assets…\",\n \"project\": \"Project\",\n \"stage\": \"Stage\",\n \"readiness\": \"Ready\",\n \"progress\": \"Progress\",\n \"refreshing\": \"Updating\",\n \"subtitle8\": \"Per-project counts for 8 asset types (project-enabled subset) and readiness\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"Backup created: {{path}}\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.\",\n \"providerKeyLockedHint\": \"This provider has already been added to the app config, so its key can no longer be changed.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyDuplicate\": \"This key is already in use\",\n \"providerKeyInvalid\": \"Invalid format. Use lowercase letters, numbers, and hyphens only.\",\n \"apiProtocol\": \"API Protocol\",\n \"selectProtocol\": \"Select API Protocol\",\n \"apiProtocolHint\": \"Select the protocol type compatible with the provider's API. Most providers use OpenAI Completions format.\",\n \"baseUrl\": \"API Endpoint\",\n \"baseUrlHint\": \"The provider's API endpoint address.\",\n \"models\": \"Models\",\n \"addModel\": \"Add Model\",\n \"noModels\": \"No models configured. Click Add Model to configure available models.\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"Display Name\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"Context Window\",\n \"maxTokens\": \"Max Output Tokens\",\n \"reasoning\": \"Reasoning Mode\",\n \"reasoningOn\": \"Enabled\",\n \"reasoningOff\": \"Disabled\",\n \"inputTypes\": \"Input Types\",\n \"inputCost\": \"Input Cost ($/M tokens)\",\n \"outputCost\": \"Output Cost ($/M tokens)\",\n \"advancedOptions\": \"Advanced Options\",\n \"cacheReadCost\": \"Cache Read Cost ($/M tokens)\",\n \"cacheWriteCost\": \"Cache Write Cost ($/M tokens)\",\n \"cacheCostHint\": \"Cache costs are used to calculate Prompt Caching costs. Leave empty if not using caching.\",\n \"modelsHint\": \"Configure the models supported by this provider. Model ID is used for API calls, Display Name for the interface.\",\n \"userAgent\": \"Send User-Agent\",\n \"userAgentHint\": \"Some providers require a browser User-Agent header to work properly.\",\n \"env\": {\n \"title\": \"Environment Variables\",\n \"description\": \"Manage environment variables in openclaw.json (API keys, custom variables, etc.)\",\n \"editorHint\": \"Edit the full env section as JSON. Nested objects such as env.vars and env.shellEnv are supported.\",\n \"objectRequired\": \"OpenClaw env must be a JSON object.\",\n \"invalidJson\": \"OpenClaw env must be valid JSON.\",\n \"empty\": \"OpenClaw env cannot be empty. Use {} for an empty object.\",\n \"keyPlaceholder\": \"Variable name\",\n \"valuePlaceholder\": \"Value\",\n \"add\": \"Add Variable\",\n \"saveSuccess\": \"Environment variables saved\",\n \"saveFailed\": \"Failed to save environment variables\",\n \"loadFailed\": \"Failed to load environment variables\",\n \"duplicateKey\": \"Duplicate variable name detected: {{key}}\"\n },\n \"tools\": {\n \"title\": \"Tool Permissions\",\n \"description\": \"Manage tool permissions in openclaw.json (allow/deny lists)\",\n \"profile\": \"Permission Profile\",\n \"profileMinimal\": \"Minimal\",\n \"profileCoding\": \"Coding\",\n \"profileMessaging\": \"Messaging\",\n \"profileFull\": \"Full\",\n \"profileUnset\": \"Not set\",\n \"unsupportedProfileTitle\": \"Unsupported tools profile detected\",\n \"unsupportedProfileDescription\": \"The current tools.profile value '{{value}}' is not in the supported OpenClaw list. It will be preserved until you choose a new value.\",\n \"unsupportedProfileLabel\": \"unsupported\",\n \"allowList\": \"Allow List\",\n \"denyList\": \"Deny List\",\n \"patternPlaceholder\": \"Tool name or pattern\",\n \"addAllow\": \"Add Allow\",\n \"addDeny\": \"Add Deny\",\n \"saveSuccess\": \"Tool permissions saved\",\n \"saveFailed\": \"Failed to save tool permissions\",\n \"loadFailed\": \"Failed to load tool permissions\"\n },\n \"agents\": {\n \"title\": \"Agents Config\",\n \"description\": \"Manage agents.defaults in openclaw.json (default model, runtime parameters, etc.)\",\n \"modelSection\": \"Model Configuration\",\n \"primaryModel\": \"Default Model\",\n \"primaryModelHint\": \"Select from models of configured providers\",\n \"notSet\": \"Not set\",\n \"fallbackModels\": \"Fallback Models\",\n \"fallbackModelsHint\": \"When the primary model is unavailable, fallbacks are tried in order\",\n \"addFallback\": \"Add fallback model\",\n \"noModels\": \"No configured provider models. Please add an OpenClaw provider first.\",\n \"notInList\": \"{{value}} (not configured)\",\n \"runtimeSection\": \"Runtime Parameters\",\n \"workspace\": \"Workspace Path\",\n \"timeout\": \"Timeout (seconds)\",\n \"contextTokens\": \"Context Tokens\",\n \"maxConcurrent\": \"Max Concurrent\",\n \"legacyTimeoutTitle\": \"Legacy timeout detected\",\n \"legacyTimeoutDescription\": \"This config still uses agents.defaults.timeout. Saving here will migrate it to timeoutSeconds.\",\n \"saveSuccess\": \"Agents config saved\",\n \"saveFailed\": \"Failed to save agents config\",\n \"loadFailed\": \"Failed to load agents config\"\n },\n \"health\": {\n \"title\": \"OpenClaw config warnings detected\",\n \"invalidToolsProfile\": \"tools.profile contains an unsupported value. OpenClaw currently expects minimal, coding, messaging, or full.\",\n \"legacyTimeout\": \"agents.defaults.timeout is deprecated. Save the Agents panel to migrate it to timeoutSeconds.\",\n \"stringifiedEnvVars\": \"env.vars should be an object, but the current value looks stringified or malformed.\",\n \"stringifiedShellEnv\": \"env.shellEnv should be an object, but the current value looks stringified or malformed.\",\n \"parseFailed\": \"openclaw.json could not be parsed as valid JSON5. Fix the file before editing it here.\"\n },\n \"primaryModel\": \"Primary Model\",\n \"fallbackModel\": \"Fallback Model\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API Endpoint\",\n \"baseUrlHint\": \"The API endpoint URL for this provider.\",\n \"providerKey\": \"Provider Key\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"Lowercase letters, numbers, and hyphens only. Used as the provider name in config.yaml.\",\n \"providerKeyLockedHint\": \"This provider is in Hermes config; key is locked.\",\n \"providerKeyRequired\": \"Provider key is required\",\n \"providerKeyInvalid\": \"Provider key can only contain lowercase letters, numbers, and hyphens\",\n \"providerKeyDuplicate\": \"This provider key already exists\",\n \"apiMode\": \"API Mode\",\n \"apiModeHint\": \"Provider API protocol. Choose the format that matches your endpoint.\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API endpoint is required\",\n \"baseUrlScheme\": \"Use an http:// or https:// address\",\n \"baseUrlInvalid\": \"API endpoint is not a valid URL\",\n \"models\": \"Models\",\n \"addModel\": \"Add model\",\n \"noModels\": \"No models configured. Switching to this provider won't change the default model.\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"Display name\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"Context length\",\n \"advancedOptions\": \"Advanced options\",\n \"modelsHint\": \"On switch, the first model is written to top-level model.default.\",\n \"primaryModel\": \"Default\",\n \"fallbackModel\": \"Alternate\",\n \"providerAdvanced\": \"Provider advanced options\",\n \"rateLimitDelay\": \"Rate limit delay (seconds)\",\n \"rateLimitDelayHint\": \"Minimum delay in seconds between consecutive requests (optional). Leave empty for no limit.\"\n },\n \"webui\": {\n \"open\": \"Open Hermes Web UI\",\n \"offline\": \"Hermes Web UI is not running. Start it with `hermes dashboard` first.\",\n \"openFailed\": \"Failed to open Hermes Web UI\",\n \"launchConfirmTitle\": \"Hermes Dashboard is not running\",\n \"launchConfirmMessage\": \"Open a terminal and start it now with `hermes dashboard`?\\n\\nThe browser will open automatically once startup completes.\\n\\nIf the terminal reports that `hermes` cannot be found or the web extras are missing, run first:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"Open terminal & launch\",\n \"launching\": \"Started `hermes dashboard` in a terminal.\",\n \"launchFailed\": \"Failed to open terminal\"\n },\n \"memory\": {\n \"title\": \"Memory\",\n \"agentTab\": \"Agent Memory (MEMORY.md)\",\n \"userTab\": \"User Profile (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} characters\",\n \"overLimit\": \"Over budget — Hermes will truncate on next load\",\n \"enableOn\": \"Enabled\",\n \"enableOff\": \"Disabled\",\n \"disabledHint\": \"Hermes will skip this memory until re-enabled\",\n \"toggleFailed\": \"Failed to toggle memory\",\n \"saveSuccess\": \"Memory saved\",\n \"saveFailed\": \"Failed to save memory\",\n \"loadFailed\": \"Failed to read memory file\",\n \"openConfig\": \"Adjust limits in Hermes Web UI\",\n \"runtimeNote\": \"Changes apply on Hermes restart or new session.\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"Environment Variable Conflicts Detected\",\n \"description\": \"Found {{count}} environment variables that may override your configuration\"\n },\n \"actions\": {\n \"expand\": \"View Details\",\n \"collapse\": \"Collapse\",\n \"selectAll\": \"Select All\",\n \"clearSelection\": \"Clear Selection\",\n \"deleteSelected\": \"Delete Selected ({{count}})\",\n \"deleting\": \"Deleting...\"\n },\n \"field\": {\n \"value\": \"Value\",\n \"source\": \"Source\"\n },\n \"source\": {\n \"userRegistry\": \"User Environment Variable (Registry)\",\n \"systemRegistry\": \"System Environment Variable (Registry)\",\n \"systemEnv\": \"System Environment Variable\"\n },\n \"delete\": {\n \"success\": \"Environment variables deleted successfully\",\n \"error\": \"Failed to delete environment variables\"\n },\n \"backup\": {\n \"location\": \"Backup location: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"Confirm Delete Environment Variables\",\n \"message\": \"Are you sure you want to delete {{count}} environment variable(s)?\",\n \"backupNotice\": \"A backup will be created automatically before deletion. You can restore it later. Changes take effect after restarting the application or terminal.\",\n \"confirm\": \"Confirm Delete\"\n },\n \"error\": {\n \"noSelection\": \"Please select environment variables to delete\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills Management\",\n \"description\": \"Discover and install skills from popular repositories to extend Claude Code/Codex/Gemini capabilities\",\n \"refresh\": \"Refresh\",\n \"refreshing\": \"Refreshing...\",\n \"repoManager\": \"Repository Management\",\n \"count\": \"{{count}} skills\",\n \"empty\": \"No skills available\",\n \"emptyDescription\": \"Add skill repositories to discover available skills\",\n \"addRepo\": \"Add Skill Repository\",\n \"loading\": \"Loading...\",\n \"installed\": \"Installed\",\n \"install\": \"Install\",\n \"installing\": \"Installing...\",\n \"uninstall\": \"Uninstall\",\n \"uninstalling\": \"Uninstalling...\",\n \"view\": \"View\",\n \"noDescription\": \"No description\",\n \"loadFailed\": \"Failed to load\",\n \"installSuccess\": \"Skill {{name}} installed\",\n \"installFailed\": \"Failed to install\",\n \"uninstallSuccess\": \"Skill {{name}} uninstalled\",\n \"uninstallFailed\": \"Failed to uninstall\",\n \"update\": \"Update\",\n \"updating\": \"Updating...\",\n \"updateAvailable\": \"Update\",\n \"updateSuccess\": \"Skill {{name}} updated to latest version\",\n \"updateFailed\": \"Failed to update\",\n \"checkUpdates\": \"Check Updates\",\n \"checkingUpdates\": \"Checking...\",\n \"noUpdates\": \"All skills are up to date\",\n \"updatesFound\": \"{{count}} skill(s) have updates available\",\n \"updateAll\": \"Update All ({{count}})\",\n \"updatingAll\": \"Updating...\",\n \"updateAllSuccess\": \"Successfully updated {{count}} skill(s)\",\n \"error\": {\n \"skillNotFound\": \"Skill not found: {{directory}}\",\n \"missingRepoInfo\": \"Missing repository info (owner or name)\",\n \"downloadTimeout\": \"Download repository {{owner}}/{{name}} timeout ({{timeout}}s)\",\n \"downloadTimeoutHint\": \"Please check network connection or retry later\",\n \"skillPathNotFound\": \"Skill path '{{path}}' not found in repository {{owner}}/{{name}}\",\n \"skillDirNotFound\": \"Skill directory not found: {{path}}\",\n \"directoryConflict\": \"Skill directory '{{directory}}' is already occupied by {{existing_repo}}, cannot install from {{new_repo}}\",\n \"emptyArchive\": \"Downloaded archive is empty\",\n \"downloadFailed\": \"Download failed: HTTP {{status}}\",\n \"allBranchesFailed\": \"All branches failed, tried: {{branches}}\",\n \"httpError\": \"HTTP error {{status}}\",\n \"http403\": \"GitHub access restricted, possibly rate limited\",\n \"http404\": \"Repository or branch not found, please check URL\",\n \"http429\": \"Too many requests, please wait and retry\",\n \"parseMetadataFailed\": \"Failed to parse skill metadata\",\n \"getHomeDirFailed\": \"Unable to get user home directory\",\n \"noSkillsInZip\": \"No skills found in ZIP file (requires SKILL.md file)\",\n \"networkError\": \"Network error\",\n \"fsError\": \"File system error\",\n \"unknownError\": \"Unknown error\",\n \"suggestion\": {\n \"checkNetwork\": \"Please check network connection\",\n \"checkProxy\": \"Consider configuring HTTP proxy\",\n \"retryLater\": \"Please retry later\",\n \"checkRepoUrl\": \"Please check repository URL and branch name\",\n \"checkDiskSpace\": \"Please check disk space\",\n \"checkPermission\": \"Please check directory permissions\",\n \"uninstallFirst\": \"Please uninstall the existing skill with the same name first\",\n \"checkZipContent\": \"Please verify the ZIP file contains valid skill directories (with SKILL.md files)\"\n }\n },\n \"repo\": {\n \"title\": \"Manage Skill Repositories\",\n \"description\": \"Add or remove GitHub skill repository sources\",\n \"url\": \"Repository URL\",\n \"urlPlaceholder\": \"owner/name or https://github.com/owner/name\",\n \"branch\": \"Branch\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"Skills Path\",\n \"pathPlaceholder\": \"skills (optional, leave empty for root)\",\n \"add\": \"Add Repository\",\n \"list\": \"Added Repositories\",\n \"empty\": \"No repositories\",\n \"invalidUrl\": \"Invalid repository URL format\",\n \"addSuccess\": \"Repository {{owner}}/{{name}} added, detected {{count}} skills\",\n \"addFailed\": \"Failed to add\",\n \"removeSuccess\": \"Repository {{owner}}/{{name}} removed\",\n \"removeFailed\": \"Failed to remove\",\n \"skillCount\": \"{{count}} skills detected\"\n },\n \"search\": \"Search Skills\",\n \"searchPlaceholder\": \"Search skill name or repo...\",\n \"searchSource\": {\n \"all\": \"All\",\n \"repos\": \"Repos\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"All Time\",\n \"leaderboardTrending\": \"24h Trending\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"All Time Top 50\",\n \"trendingTitle\": \"24h Trending\",\n \"allTimeDesc\": \"Aligned with skills.sh official All Time leaderboard (total installs)\",\n \"trendingDesc\": \"Aligned with skills.sh official Trending (24h) leaderboard\",\n \"syncedAt\": \"Synced {{time}}\",\n \"fromCache\": \"Cached locally\",\n \"registryTotal\": \"{{count}} total installs on skills.sh\",\n \"loading\": \"Syncing skills.sh official leaderboard…\",\n \"error\": \"Failed to sync skills.sh official leaderboard\",\n \"empty\": \"No leaderboard data\",\n \"syncPolicy\": \"Not live · syncs from skills.sh every {{hours}}h by default · click refresh to update now\",\n \"nextSyncAt\": \"Next auto-sync ~{{time}}\",\n \"refreshNow\": \"Sync from skills.sh now\",\n \"pageRange\": \"{{range}} · page {{page}}/{{totalPages}} ({{total}} items)\"\n },\n \"all\": {\n \"searchPlaceholder\": \"Search all sources (Repos / skills.sh / ClawHub)...\",\n \"searching\": \"Searching multiple sources...\",\n \"typeToSearch\": \"Type keywords to search skills.sh and ClawHub\",\n \"typeToSearchMore\": \"Type keywords to search more sources\",\n \"mergedCount\": \"{{total}} results total\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"Search skills.sh (min 2 chars)...\",\n \"installs\": \"{{count}} installs\",\n \"loadMore\": \"Load More\",\n \"loading\": \"Searching skills.sh...\",\n \"noResults\": \"No skills found for \\\"{{query}}\\\"\",\n \"error\": \"Failed to search skills.sh\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"clawhub\": {\n \"searchPlaceholder\": \"Search ClawHub (min 2 chars)...\",\n \"loading\": \"Searching ClawHub...\",\n \"noResults\": \"No skills found for \\\"{{query}}\\\"\",\n \"resultCount\": \"{{count}} results\",\n \"poweredBy\": \"Powered by ClawHub\",\n \"installViaCli\": \"ClawHub skills should be installed via CLI\",\n \"installSuccess\": \"{{slug}} installed successfully\",\n \"installFailed\": \"ClawHub skill installation failed\",\n \"installing\": \"Installing...\"\n },\n \"filter\": {\n \"placeholder\": \"Filter by status\",\n \"all\": \"All\",\n \"installed\": \"Installed\",\n \"uninstalled\": \"Not installed\",\n \"repo\": \"Filter by repo\",\n \"allRepos\": \"All repos\"\n },\n \"noResults\": \"No matching skills found\",\n \"noInstalled\": \"No skills installed\",\n \"noInstalledDescription\": \"Discover and install skills from repositories, or import existing skills\",\n \"discover\": \"Discover Skills\",\n \"import\": \"Import Existing\",\n \"importDescription\": \"Select skills to import into OpenSunstar unified management\",\n \"importSuccess\": \"Successfully imported {{count}} skills\",\n \"importSelected\": \"Import Selected ({{count}})\",\n \"noUnmanagedFound\": \"No skills to import found. All skills are already managed by OpenSunstar.\",\n \"foundIn\": \"Found in\",\n \"local\": \"Local\",\n \"uninstallConfirm\": \"Are you sure you want to uninstall \\\"{{name}}\\\"? This will remove the skill from all apps and create a local backup first.\",\n \"uninstallInMainPanel\": \"Please uninstall skills from the main panel\",\n \"notFound\": \"Skill not found\",\n \"backup\": {\n \"location\": \"Backup location: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"Restore Backup\",\n \"title\": \"Restore From Backup\",\n \"description\": \"Choose a Skills backup to restore its files locally and add it back to the current list.\",\n \"empty\": \"No Skills backups available to restore\",\n \"createdAt\": \"Backed up at\",\n \"path\": \"Backup path\",\n \"restore\": \"Restore\",\n \"restoring\": \"Restoring...\",\n \"delete\": \"Delete\",\n \"deleting\": \"Deleting...\",\n \"deleteSuccess\": \"Deleted backup for {{name}}\",\n \"deleteFailed\": \"Failed to delete skill backup\",\n \"deleteConfirmTitle\": \"Delete Backup\",\n \"deleteConfirmMessage\": \"Are you sure you want to delete the backup for \\\"{{name}}\\\"? This action cannot be undone.\",\n \"success\": \"Skill {{name}} restored from backup\",\n \"failed\": \"Failed to restore from backup\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"Install from ZIP\",\n \"installing\": \"Installing...\",\n \"successSingle\": \"Skill {{name}} installed\",\n \"successMultiple\": \"Successfully installed {{count}} skills\",\n \"noSkillsFound\": \"No skills found in ZIP file (requires SKILL.md file)\"\n },\n \"batchUninstall\": \"Uninstall\",\n \"batchUninstallTitle\": \"Batch Uninstall\",\n \"batchUninstallConfirm\": \"Are you sure you want to uninstall {{count}} skills?\",\n \"batchUninstallSuccess\": \"Successfully uninstalled {{count}} skills\",\n \"batchUninstallPartial\": \"Uninstall complete: {{success}} succeeded, {{fail}} failed\"\n },\n \"deeplink\": {\n \"confirmImport\": \"Confirm Import Provider\",\n \"confirmImportDescription\": \"The following configuration will be imported from deep link into OpenSunstar\",\n \"importPrompt\": \"Import Prompt\",\n \"importPromptDescription\": \"Please confirm whether to import this system prompt\",\n \"importMcp\": \"Import MCP Servers\",\n \"importMcpDescription\": \"Please confirm whether to import these MCP Servers\",\n \"importSkill\": \"Add Skill Repository\",\n \"importSkillDescription\": \"Please confirm whether to add this Skill repository\",\n \"promptImportSuccess\": \"Prompt imported successfully\",\n \"promptImportSuccessDescription\": \"Imported prompt: {{name}}\",\n \"mcpImportSuccess\": \"MCP Servers imported successfully\",\n \"mcpImportSuccessDescription\": \"Successfully imported {{count}} server(s)\",\n \"mcpPartialSuccess\": \"Partial import success\",\n \"mcpPartialSuccessDescription\": \"Success: {{success}}, Failed: {{failed}}\",\n \"skillImportSuccess\": \"Skill repository added successfully\",\n \"skillImportSuccessDescription\": \"Added repository: {{repo}}\",\n \"app\": \"App Type\",\n \"providerName\": \"Provider Name\",\n \"homepage\": \"Homepage\",\n \"endpoint\": \"API Endpoint\",\n \"apiKey\": \"API Key\",\n \"icon\": \"Icon\",\n \"model\": \"Model\",\n \"haikuModel\": \"Haiku Model\",\n \"sonnetModel\": \"Sonnet Model\",\n \"opusModel\": \"Opus Model\",\n \"multiModel\": \"Multi-Modal Model\",\n \"notes\": \"Notes\",\n \"import\": \"Import\",\n \"importing\": \"Importing...\",\n \"warning\": \"Please confirm the information above is correct before importing. You can edit or delete it later in the provider list.\",\n \"parseError\": \"Failed to parse deep link\",\n \"importSuccess\": \"Import successful\",\n \"importSuccessDescription\": \"Provider \\\"{{name}}\\\" has been successfully imported\",\n \"importError\": \"Failed to import\",\n \"configSource\": \"Config Source\",\n \"configEmbedded\": \"Embedded Config\",\n \"configRemote\": \"Remote Config\",\n \"configDetails\": \"Config Details\",\n \"configUrl\": \"Config File URL\",\n \"configMergeError\": \"Failed to merge configuration file\",\n \"primaryEndpoint\": \"Primary\",\n \"mcp\": {\n \"title\": \"Batch Import MCP Servers\",\n \"targetApps\": \"Target Apps\",\n \"serverCount\": \"MCP Servers ({{count}})\",\n \"enabledWarning\": \"After import, configurations will be written to all specified apps immediately\"\n },\n \"prompt\": {\n \"title\": \"Import System Prompt\",\n \"app\": \"App\",\n \"name\": \"Name\",\n \"description\": \"Description\",\n \"contentPreview\": \"Content Preview\",\n \"enabledWarning\": \"After import, this prompt will be enabled immediately and other prompts will be disabled\"\n },\n \"skill\": {\n \"title\": \"Add Claude Skill Repository\",\n \"repo\": \"GitHub Repository\",\n \"directory\": \"Target Directory\",\n \"branch\": \"Branch\",\n \"skillsPath\": \"Skills Path\",\n \"hint\": \"This will add the Skill repository to the list.\",\n \"hintDetail\": \"After adding, you can install specific Skills from the Skills management page.\"\n },\n \"usageScript\": \"Usage Query\",\n \"usageScriptEnabled\": \"Enabled\",\n \"usageScriptDisabled\": \"Disabled\",\n \"usageApiKey\": \"Usage API Key\",\n \"usageBaseUrl\": \"Usage Query URL\",\n \"usageAutoInterval\": \"Auto Query\",\n \"usageAutoIntervalValue\": \"Every {{minutes}} minutes\"\n },\n \"iconPicker\": {\n \"search\": \"Search Icons\",\n \"searchPlaceholder\": \"Enter icon name...\",\n \"noResults\": \"No matching icons found\",\n \"category\": {\n \"aiProvider\": \"AI Providers\",\n \"cloud\": \"Cloud Platforms\",\n \"tool\": \"Dev Tools\",\n \"other\": \"Other\"\n }\n },\n \"providerIcon\": {\n \"label\": \"Icon\",\n \"colorLabel\": \"Icon Color\",\n \"selectIcon\": \"Select Icon\",\n \"preview\": \"Preview\",\n \"clickToChange\": \"Click to change icon\",\n \"clickToSelect\": \"Click to select icon\",\n \"color\": \"Icon Color\"\n },\n \"simpleConnect\": {\n \"nav\": \"Quick Connect\",\n \"pageTitle\": \"Quick Connect\",\n \"tabSimple\": \"Quick Connect\",\n \"tabExpert\": \"Expert Provider\",\n \"title\": \"Quick Connect\",\n \"subtitle\": \"Paste your API key and start using CLI tools in 3 steps\",\n \"step1\": \"Supplier\",\n \"step2\": \"Keys\",\n \"step3\": \"Apply\",\n \"supplier\": \"Supplier\",\n \"customSupplier\": \"Custom OpenAI-compatible\",\n \"cliTool\": \"CLI tool\",\n \"model\": \"Model\",\n \"modelPlaceholder\": \"Fetch models first\",\n \"fetchModels\": \"Fetch models\",\n \"apply\": \"Apply configuration\",\n \"applySuccess\": \"{{tool}} configured\",\n \"applySuccessMulti\": \"{{tools}} configured\",\n \"modelsLoaded\": \"Loaded {{count}} models\",\n \"poolProxy\": \"Local proxy :{{port}} active\",\n \"keyRequired\": \"Save an API key to Keychain first\",\n \"keyRequiredHint\": \"Save the primary key before continuing to apply\",\n \"customBaseRequired\": \"Enter a custom API base URL first\",\n \"modelsFallback\": \"Fetch failed; using preset model {{model}}\",\n \"toolStatusTitle\": \"CLI configuration status\",\n \"toolStatusLoading\": \"Loading CLI status…\",\n \"toolCleared\": \"Cleared Quick Connect config for {{tool}}\",\n \"clearTool\": \"Clear {{tool}}\",\n \"wizardNav\": \"Quick Connect steps\",\n \"summaryStep\": \"Step {{step}}/3\",\n \"step3Hint\": \"Pick a CLI and model, then apply; expand sections below for details\",\n \"step3Sections\": {\n \"statusSection\": \"CLI configuration status\",\n \"runtimeSection\": \"Key pool runtime\",\n \"usageSection\": \"Usage overview (read-only)\"\n },\n \"supplierChangeTitle\": \"Switch supplier?\",\n \"supplierChangeBody\": \"Upstream will change; saved keys stay under the previous supplier namespace. Applying will backup and rewrite CLI configs.\",\n \"supplierChangeConfirm\": \"Continue\",\n \"supplierChangedApply\": \"Supplier switched and CLI updated; previous configs backed up\",\n \"pickSupplier\": \"Choose a supplier\",\n \"pickCli\": \"Choose a CLI to configure\",\n \"customBase\": \"API Base URL\",\n \"customSupplierHint\": \"Any OpenAI-compatible base URL\",\n \"openWebsite\": \"Website\",\n \"keySaved\": \"Key saved\",\n \"keyMissing\": \"No key saved\",\n \"poolBadge\": \"Pool ×{{count}}\",\n \"keySavedToast\": \"API key stored securely in Keychain\",\n \"keyReadyHint\": \"Primary key ready — continue to apply\",\n \"poolKeyAdded\": \"Backup key added\",\n \"applyTo\": \"Apply to {{tool}}\",\n \"modelsLoading\": \"Loading models…\",\n \"toolStatusCount\": \"{{configured}}/{{total}} configured\",\n \"backToSimple\": \"Back to Quick Connect\",\n \"openProxySettings\": \"Proxy & failover settings\",\n \"proxyRunning\": \"Main proxy running\",\n \"cliGeneric\": \"CLI config\",\n \"expertNoticeTitle\": \"Expert Provider (trimmed)\",\n \"expertNoticeBody\": \"Failover, proxy takeover, Universal, etc. Advanced features stay here. Quick Connect is recommended by default.\",\n \"pool\": {\n \"step2Hint\": \"Enter your API key and save — CLI access is secured via local proxy\",\n \"enable\": \"Enable key pool\",\n \"enableHint\": \"Weighted pool + tiered 429 cooldown; CLI always gets local token, secrets in Keychain only\",\n \"securityNote\": \"Secrets are stored in OS Keychain only — never written to config files or logs. CLIs use the local proxy token.\",\n \"required\": \"required\",\n \"primaryKey\": \"API Key\",\n \"keyPlaceholder\": \"sk-...\",\n \"primary\": \"Primary key\",\n \"extra\": \"Backup key\",\n \"extraKey\": \"Add backup key\",\n \"supplierHint\": \"Keys stored in Keychain: simple-connect/{{supplier}}/…\"\n },\n \"poolHealth\": {\n \"title\": \"Pool runtime\",\n \"running\": \"Proxy running\",\n \"stopped\": \"Proxy stopped\",\n \"idleHint\": \"Apply a CLI config to start the local proxy; success/failure and cooldown stats appear here\",\n \"available\": \"Available\",\n \"cooling\": \"Cooling down\",\n \"cooldownSecs\": \"{{secs}}s\"\n },\n \"usage\": {\n \"title\": \"Usage overview (read-only)\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"sessions\": \"Session records\",\n \"proxyPort\": \"Proxy :{{port}}\",\n \"proxySession\": \"This session\",\n \"byTool\": \"By CLI\",\n \"empty\": \"No local session usage data yet\"\n },\n \"import\": {\n \"title\": \"Confirm API Key import\",\n \"description\": \"Keys go to Keychain only — never written to config files. Keys are verified before import.\",\n \"label\": \"Label\",\n \"supplier\": \"Supplier\",\n \"warning\": \"Only import from trusted sources. You can disable URL import in Simple Connect.\",\n \"confirm\": \"Import\",\n \"importing\": \"Importing…\",\n \"success\": \"Imported {{count}} key(s) to Keychain\",\n \"duplicates\": \"Skipped {{count}} duplicate key(s)\",\n \"parseError\": \"Failed to parse import link\"\n },\n \"advanced\": {\n \"title\": \"Advanced\",\n \"verifyKey\": \"Verify key before save\",\n \"verifyKeyHint\": \"Calls /v1/models; disable only for advanced manual import\",\n \"deeplinkImport\": \"Allow URL key import\",\n \"deeplinkImportHint\": \"beeapi:// / OpenSunstar://simple-connect/import\"\n },\n \"backupAudit\": {\n \"title\": \"Backup directory scan\",\n \"files\": \"{{count}} file(s) scanned\",\n \"clean\": \"No plaintext keys found\",\n \"suspicious\": \"{{count}} suspicious item(s)\",\n \"hint\": \"Scans simple-connect/backups for CLI config copies without sk- secrets on disk.\"\n },\n \"privacy\": {\n \"bannerShort\": \"Local-first · keys in OS Keychain · no telemetry\",\n \"viewDetails\": \"Security & privacy\",\n \"title\": \"Security & privacy\",\n \"intro\": \"Quick Connect follows local-first principles: data stays on your machine, secrets never land in config files, and network targets are yours to choose. Details below apply to the Quick Connect flow only.\",\n \"close\": \"Got it\",\n \"sections\": {\n \"localFirst\": {\n \"title\": \"Local-first\",\n \"body\": \"Supplier choice, model cache, CLI status, and usage summaries are stored in the app's local data directory. Before writing CLI configs, originals are backed up under simple-connect/backups; you can scan backups in Step 2 advanced settings.\"\n },\n \"keychain\": {\n \"title\": \"Secrets in OS Keychain\",\n \"body\": \"API keys are stored only in the OS credential store (Windows DPAPI / macOS Keychain / Linux libsecret)—never in JSON, TOML, env files, or app logs. CLIs receive sc-local-* proxy tokens only; real keys are read from Keychain inside the local proxy process.\"\n },\n \"network\": {\n \"title\": \"Direct to your chosen upstream\",\n \"body\": \"Model fetch, optional key verification, and upstream API calls go from your machine to the base URL you select. The local proxy (127.0.0.1:17172) listens on loopback only—for key pooling and CLI routing—not exposed to the public internet.\"\n },\n \"noTelemetry\": {\n \"title\": \"No telemetry or account binding\",\n \"body\": \"Simple Connect does not send API keys, chat content, call logs, or device fingerprints to OpenSunstar or third parties. Usage panels read local CLI session logs and local proxy counters for on-device viewing only.\"\n },\n \"yourControl\": {\n \"title\": \"Risk items you control\",\n \"body\": \"URL key import should stay enabled only for links you trust—disable it in Step 2 advanced settings. With custom suppliers, assess the third-party base URL and privacy policy yourself.\"\n }\n }\n }\n },\n \"quickStart\": {\n \"nav\": \"Quick Start\",\n \"title\": \"Quick Start\",\n \"subtitle\": \"Three steps: pick a provider → enter key → activate\",\n \"tabs\": {\n \"wizard\": \"Quick Start\",\n \"manage\": \"Manage Providers\"\n },\n \"openManage\": \"Manage all providers\",\n \"openProxySettings\": \"Proxy & failover settings\",\n \"searchPlaceholder\": \"Search provider name or URL…\",\n \"noResults\": \"No matching providers\",\n \"official\": \"Official\",\n \"officialDesc\": \"Sign in through the corresponding client.\",\n \"partner\": \"Partner\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"Paste your API key\",\n \"keychainHint\": \"API keys stay in the local secure credential store; setup updates local client configuration.\",\n \"getKey\": \"Get API Key\",\n \"apply\": \"Activate\",\n \"success\": \"Connected! Switched to this provider\",\n \"doneTitle\": \"Connected!\",\n \"doneDesc\": \"Provider configured and activated. You can now use it in Claude Code.\",\n \"doneDescApp\": \"{{app}} is configured and set as the active provider.\",\n \"failedTitle\": \"Connection not completed\",\n \"compensatedDesc\": \"The operation failed and the previous state was restored. Correct the configuration and retry.\",\n \"recoveryRequired\": \"Automatic recovery did not finish. Continue recovery before retrying.\",\n \"operationId\": \"Operation ID\",\n \"retry\": \"Retry connection\",\n \"continueRecovery\": \"Continue recovery\",\n \"changeSelection\": \"Change configuration\",\n \"rollback\": \"Undo this connection\",\n \"rollbackDone\": \"Restored the state from before this connection\",\n \"rollbackFailed\": \"Recovery failed. Retry or inspect Local Routing settings.\",\n \"proxyRunningHint\": \"Claude Code requests are forwarded via the local proxy (127.0.0.1:15721). Keep OpenSunstar running — closing it will break Claude Code connectivity.\",\n \"proxyRunningHintDesktop\": \"Claude Desktop is routed via the local proxy. Keep OpenSunstar running — closing it will break connectivity.\",\n \"addAnother\": \"Add another\",\n \"openSettings\": \"Go to provider management\",\n \"firstProviderHint\": \"This is your first provider. Start the proxy in Settings if needed.\",\n \"verify\": \"Verify Key\",\n \"verifyOk\": \"Key is valid!\",\n \"verifyOkAnthropic\": \"Key is valid (no model list API — preset defaults will be used)\",\n \"verifyOkGemini\": \"The key is valid and the native Gemini endpoint passed verification.\",\n \"verifyOkWithModels\": \"Key is valid — fetched {{count}} models\",\n \"verifyOkNoModelList\": \"Key is valid (model list fetch failed — preset defaults will be used)\",\n \"verifyHint\": \"Verification follows the selected protocol. Anthropic uses about 1 token; OpenAI/Gemini model lists feed Advanced mappings when available.\",\n \"modelsList\": \"Available models ({{count}})\",\n \"myProviders\": \"API Key Access\",\n \"switch\": \"Switch\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"category\": {\n \"custom\": \"Custom\",\n \"aiGlobal\": \"International AI\",\n \"aiChina\": \"China AI\",\n \"relay\": \"Aggregators / Relays\",\n \"customModel\": \"Custom model configuration\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini Quick Connect enables Google and Gemini Native-compatible endpoints. OpenAI Chat gateways are shown as protocol mismatches.\"\n },\n \"custom\": {\n \"cardTitle\": \"Custom setup\",\n \"cardSubtitle\": \"Enter Base URL and model yourself\",\n \"hint\": \"Enter a name, Base URL, and default model. API format, credential field, and model mapping are available under Advanced below.\",\n \"geminiHint\": \"Enter a name, Gemini Native Base URL, and model. The fixed Gemini CLI native protocol is shown under Advanced.\",\n \"agentHint\": \"Enter a name, Base URL, and default model. OpenSunstar writes the native local configuration format for this client.\",\n \"name\": \"Provider name\",\n \"namePlaceholder\": \"e.g. My DeepSeek gateway\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"Default model\",\n \"geminiModel\": \"Model ID\",\n \"defaultName\": \"Custom provider\"\n },\n \"apiKeyOnlyHint\": \"This client connects through API keys. Choose a preset or add a custom gateway to enable it.\",\n \"advanced\": {\n \"title\": \"Advanced\",\n \"subtitle\": \"Defaults work for most cases\",\n \"upstreamModel\": \"Upstream model\",\n \"defaultModel\": \"Default model\",\n \"apiFormat\": \"API format\",\n \"authField\": \"Credential field\",\n \"roleMapping\": \"Model role mapping\",\n \"roleMappingHint\": \"Display names appear in /model; request models are written to the Claude Code environment.\",\n \"role\": \"Role\",\n \"displayName\": \"Display name\",\n \"requestModel\": \"Request model\",\n \"roleRequestModel\": \"{{role}} request model\",\n \"hiddenFromModelMenu\": \"Hidden from the /model menu\",\n \"fallbackModel\": \"Default fallback model\",\n \"desktopRoutes\": \"Claude Desktop route mapping\",\n \"customProtocolHint\": \"Choose the protocol implemented by the upstream endpoint.\",\n \"presetProtocolLocked\": \"The preset protocol is locked to its real endpoint to prevent connection failures.\",\n \"geminiNativeLocked\": \"Gemini CLI currently forwards native generateContent requests. Use a client entry with protocol conversion for OpenAI Chat endpoints.\"\n },\n \"badge\": {\n \"current\": \"Active\",\n \"proxy\": \"Local routing\"\n },\n \"warn\": {\n \"clearFailed\": \"Failed to clear legacy Quick Connect marker. If switching still fails, clear it manually in Settings.\",\n \"takeoverFailed\": \"Provider added, but proxy takeover failed. Enable the app takeover manually in Settings > Local Routing.\"\n },\n \"unavailableForApp\": \"This client protocol is not adapted yet\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex Quick Connect currently supports OpenAI Responses / Chat upstream protocols\",\n \"claudeOauthOnly\": \"This OAuth preset is for Claude clients\",\n \"geminiNativeOnly\": \"Gemini CLI requires Gemini Native or a Gemini-compatible gateway\",\n \"geminiOpenRouter\": \"OpenRouter exposes OpenAI Chat upstream while Gemini CLI currently forwards Gemini Native\"\n },\n \"error\": {\n \"emptyKey\": \"Please enter an API key\",\n \"failed\": \"Connection failed. Check your API key or network and retry.\",\n \"compensated\": \"Connection failed and the previous state was restored.\",\n \"recoveryRequired\": \"Connection failed and automatic recovery is incomplete.\",\n \"noBaseUrl\": \"Please enter a Base URL\",\n \"noModel\": \"Please enter a default model\"\n },\n \"addProvider\": \"Add Provider\",\n \"addProviderHint\": \"Choose a preset or add a compatible endpoint.\",\n \"configureProvider\": \"Configure Provider\",\n \"configureProviderHint\": \"Enter the required fields; setup and verification are automatic.\",\n \"connectAndEnable\": \"Connect & Enable\",\n \"myProvidersHint\": \"API keys stay in the local secure credential store; setup updates local configuration.\",\n \"officialConnection\": \"Subscription Account\",\n \"officialConnectionHint\": \"Sign in through the selected client.\",\n \"workbenchSubtitle\": \"Choose a client, then connect with a subscription account or API key.\",\n \"workbenchTitle\": \"Model Access\",\n \"subscription\": {\n \"loginStatus\": \"Login Status\",\n \"accountManagement\": \"Account Management\",\n \"claude\": {\n \"title\": \"Claude Subscription Login\",\n \"description\": \"Claude Code manages credentials; OpenSunstar reads status and quota.\",\n \"action\": \"Claude Subscription Login\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop Login\",\n \"description\": \"Claude Desktop manages login.\",\n \"action\": \"Get Claude Desktop\"\n },\n \"codex\": {\n \"title\": \"ChatGPT Subscription Login\",\n \"description\": \"OpenSunstar manages this login.\",\n \"action\": \"ChatGPT Subscription Login\",\n \"dialogHint\": \"Connect an account with device authorization.\"\n },\n \"gemini\": {\n \"title\": \"Gemini Account Login\",\n \"description\": \"Gemini CLI manages credentials; OpenSunstar reads status and quota.\",\n \"action\": \"Gemini Login Guide\"\n },\n \"grokbuild\": {\n \"title\": \"Grok subscription sign-in\",\n \"description\": \"Sign-in is managed by OpenSunstar for official xAI / Grok accounts. API Key connections still use the provider settings below.\",\n \"action\": \"Grok sign-in\",\n \"dialogHint\": \"Connect an xAI / Grok account with the device authorization flow.\"\n }\n },\n \"accessModeGrid\": \"Access methods\"\n },\n \"migration\": {\n \"success\": \"Configuration migrated successfully\",\n \"skillsSuccess\": \"Automatically imported {{count}} skill(s) into unified management\",\n \"skillsFailed\": \"Failed to auto import skills\",\n \"skillsFailedDescription\": \"Open the Skills page and click \\\"Import Existing\\\" to import manually (or restart and try again).\"\n },\n \"agents\": {\n \"title\": \"Subagents\",\n \"subtitle\": \"Sync Markdown definitions to Claude / Gemini / OpenCode agents directories\",\n \"empty\": \"No subagents yet\",\n \"emptyHint\": \"Create custom subagents and sync to ~/.claude/agents/ and similar paths\",\n \"add\": \"Add Subagent\",\n \"edit\": \"Edit Subagent\",\n \"count\": \"{{count}} subagents\",\n \"loadFailed\": \"Failed to load subagents\",\n \"saveSuccess\": \"Saved successfully\",\n \"saveFailed\": \"Failed to save\",\n \"deleteSuccess\": \"Deleted successfully\",\n \"deleteFailed\": \"Failed to delete\",\n \"toggleFailed\": \"Failed to toggle sync target\",\n \"geminiHint\": \"Enable experimental.enableSubagents in Gemini settings.json for subagents to load\",\n \"codexHint\": \"Converted to TOML and written to ~/.codex/agents/{name}.toml\",\n \"syncDisabled\": {\n \"hermes\": \"File sync not supported yet\"\n },\n \"confirm\": {\n \"deleteTitle\": \"Delete Subagent\",\n \"deleteMessage\": \"Delete subagent \\\"{{name}}\\\"? Synced files will be removed.\"\n },\n \"form\": {\n \"name\": \"Name\",\n \"description\": \"Description\",\n \"content\": \"Definition (Markdown + YAML frontmatter)\",\n \"syncTargets\": \"Sync to\",\n \"geminiNote\": \"Gemini requires experimental.enableSubagents in settings.json\",\n \"codexNote\": \"Codex auto-converts Markdown to TOML in ~/.codex/agents/\"\n }\n },\n \"modelTest\": {\n \"testProvider\": \"Test model\"\n },\n \"health\": {\n \"operational\": \"Operational\",\n \"degraded\": \"Degraded\",\n \"failed\": \"Failed\",\n \"circuitOpen\": \"Circuit Open\",\n \"consecutiveFailures\": \"{{count}} consecutive failures\",\n \"title\": \"Configuration status\",\n \"allClear\": \"All projects have healthy AI configurations.\",\n \"scan\": \"Duplicate scan\",\n \"subtitle\": \"Detect projects with the same name or duplicate paths\",\n \"noDuplicates\": \"No duplicate projects found\",\n \"level\": {\n \"ok\": \"OK\",\n \"warn\": \"Needs attention\",\n \"alert\": \"Abnormal\",\n \"unconfigured\": \"Not configured\",\n \"unmanaged\": \"Not managed\",\n \"unscanned\": \"Not scanned\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} config item(s) inconsistent with expected state\",\n \"unscanned\": \"AI configuration status scan has not completed\",\n \"unmanaged\": \"Project is not managed by OpenSunstar yet, so nothing can be judged as missing\",\n \"unconfigured\": \"No AI assets linked through OpenSunstar yet\",\n \"gaps\": \"To complete: {{items}}\",\n \"detectedOnly\": \"{{items}} — config files found but not managed\",\n \"globalOnly\": \"{{items}} — using global default config\",\n \"noMcp\": \"No MCP server linked\",\n \"noSkills\": \"No Skills configured\",\n \"noPrompts\": \"No Prompts linked\"\n },\n \"action\": {\n \"repair\": \"Repair drift\",\n \"inspectDetail\": \"View details\",\n \"configure\": \"Configure assets\",\n \"setup\": \"Set up\",\n \"adopt\": \"Start managing\",\n \"inspect\": \"View project\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} failover enabled\",\n \"disabled\": \"{{app}} failover disabled\",\n \"toggleFailed\": \"Operation failed: {{detail}}\",\n \"inQueue\": \"In queue\",\n \"addQueue\": \"Add\",\n \"priority\": {\n \"tooltip\": \"Failover priority {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} failover enabled\\nRequests follow queue priority (P1→P2→...)\",\n \"disabled\": \"Enable {{app}} failover\\nSwitches to queue P1 immediately, then falls back on failures\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"Service Address\",\n \"addressCopied\": \"Address copied\",\n \"currentProvider\": \"Current Provider:\",\n \"waitingFirstRequest\": \"Current Provider: Waiting for first request...\",\n \"stoppedTitle\": \"Routing Service Stopped\",\n \"stoppedDescription\": \"Use the toggle above to start the service\",\n \"openSettings\": \"Configure Routing Service\",\n \"stats\": {\n \"activeConnections\": \"Active Connections\",\n \"totalRequests\": \"Total Requests\",\n \"successRate\": \"Success Rate\",\n \"uptime\": \"Uptime\"\n }\n },\n \"settings\": {\n \"title\": \"Routing Service Settings\",\n \"description\": \"Configure local routing server listening address, port and runtime parameters. Changes take effect immediately after saving.\",\n \"alert\": {\n \"autoApply\": \"Changes will be automatically synced to the running routing service without manual restart.\"\n },\n \"basic\": {\n \"title\": \"Basic Settings\",\n \"description\": \"Configure routing service listening address and port.\"\n },\n \"advanced\": {\n \"title\": \"Advanced Parameters\",\n \"description\": \"Control request stability and logging.\"\n },\n \"timeout\": {\n \"title\": \"Timeout Settings\",\n \"description\": \"Configure timeout for streaming and non-streaming requests.\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"Listen Address\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"IP address the routing server listens on (recommended: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"Listen Port\",\n \"placeholder\": \"15721\",\n \"description\": \"Port number the routing server listens on (1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"Max Retries\",\n \"placeholder\": \"3\",\n \"description\": \"Number of retries on request failure (0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"Request Timeout (sec)\",\n \"placeholder\": \"0 (unlimited) or 300\",\n \"description\": \"Maximum wait time for a single request (0 = unlimited, or 10 ~ 600 seconds)\"\n },\n \"enableLogging\": {\n \"label\": \"Enable Logging\",\n \"description\": \"Log all routing requests for troubleshooting\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"Streaming First Byte Timeout (sec)\",\n \"description\": \"Maximum time to wait for the first data chunk\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"Streaming Idle Timeout (sec)\",\n \"description\": \"Maximum interval between data chunks\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"Non-Streaming Timeout (sec)\",\n \"description\": \"Total timeout for non-streaming requests\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"Please enter a valid IP address\",\n \"portMin\": \"Port must be greater than 1024\",\n \"portMax\": \"Port must be less than 65535\",\n \"retryMin\": \"Retry count cannot be negative\",\n \"retryMax\": \"Retry count cannot exceed 10\",\n \"timeoutNonNegative\": \"Timeout cannot be negative\",\n \"timeoutMax\": \"Timeout cannot exceed 600 seconds\",\n \"timeoutRange\": \"Please enter 0 or a value between 10-600\",\n \"streamingTimeoutMin\": \"Timeout must be at least 5 seconds\",\n \"streamingTimeoutMax\": \"Timeout cannot exceed 300 seconds\"\n },\n \"actions\": {\n \"save\": \"Save Configuration\"\n },\n \"toast\": {\n \"saved\": \"Routing configuration saved\",\n \"saveFailed\": \"Save failed: {{error}}\"\n },\n \"invalidPort\": \"Invalid port, please enter a number between 1024-65535\",\n \"invalidAddress\": \"Invalid address. Enter an IPv4 (e.g. 127.0.0.1), IPv6 (e.g. ::1), or localhost\",\n \"configSaved\": \"Routing configuration saved\",\n \"configSaveFailed\": \"Failed to save configuration\",\n \"restartRequired\": \"Restart routing service for address or port changes to take effect\"\n },\n \"switchFailed\": \"Switch failed: {{error}}\",\n \"takeover\": {\n \"hint\": \"Select apps to route — once enabled, requests from that app will go through local routing\",\n \"enabled\": \"{{app}} routing enabled\",\n \"disabled\": \"{{app}} routing disabled\",\n \"failed\": \"Failed to toggle routing: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} is routing - {{address}}:{{port}}\\nSwitch provider for hot switching\",\n \"broken\": \"{{appLabel}} is routing, but routing service is not running\",\n \"inactive\": \"Route {{appLabel}}'s requests through local routing\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"Routing service must be started to configure failover\",\n \"autoSwitch\": \"Auto Failover\",\n \"autoSwitchDescription\": \"When enabled, switches to queue P1 immediately and automatically tries the next provider in the queue on failures\"\n },\n \"failoverQueue\": {\n \"title\": \"Failover Queue\",\n \"description\": \"Manage failover order for each app's providers\",\n \"info\": \"When auto failover is enabled, requests follow the queue priority order (P1 first). On failures, the system will try the next provider in the queue.\",\n \"selectProvider\": \"Select a provider to add to queue\",\n \"noAvailableProviders\": \"No providers available to add\",\n \"empty\": \"Failover queue is empty. Add providers to enable automatic failover.\",\n \"orderHint\": \"Queue order matches the provider list order on the Home page. Reorder providers on the Home page to change priority.\",\n \"dragHint\": \"Drag providers to adjust failover order. Lower numbers have higher priority.\",\n \"toggleEnabled\": \"Enable/Disable\",\n \"addSuccess\": \"Added to failover queue\",\n \"addFailed\": \"Failed to add\",\n \"removeSuccess\": \"Removed from failover queue\",\n \"removeFailed\": \"Failed to remove\",\n \"reorderSuccess\": \"Queue order updated\",\n \"reorderFailed\": \"Failed to update order\",\n \"toggleFailed\": \"Failed to update status\"\n },\n \"autoFailover\": {\n \"info\": \"When the failover queue has multiple providers, the system will try them in priority order when requests fail. When a provider reaches the consecutive failure threshold, the circuit breaker will open and skip it temporarily.\",\n \"configSaved\": \"Auto failover config saved\",\n \"configSaveFailed\": \"Failed to save\",\n \"validationFailed\": \"The following fields are out of valid range: {{fields}}\",\n \"retrySettings\": \"Retry & Timeout Settings\",\n \"failureThreshold\": \"Failure Threshold\",\n \"failureThresholdHint\": \"Open circuit breaker after this many consecutive failures (recommended: 3-10)\",\n \"timeout\": \"Recovery Wait Time (seconds)\",\n \"timeoutHint\": \"Wait this long before trying to recover after circuit opens (recommended: 30-120)\",\n \"circuitBreakerSettings\": \"Circuit Breaker Settings\",\n \"successThreshold\": \"Recovery Success Threshold\",\n \"successThresholdHint\": \"Close circuit breaker after this many successes in half-open state\",\n \"errorRate\": \"Error Rate Threshold (%)\",\n \"errorRateHint\": \"Open circuit breaker when error rate exceeds this value\",\n \"minRequests\": \"Minimum Requests\",\n \"minRequestsHint\": \"Minimum requests before calculating error rate\",\n \"explanationTitle\": \"How It Works\",\n \"failureThresholdLabel\": \"Failure Threshold\",\n \"failureThresholdExplain\": \"Circuit breaker opens after this many consecutive failures, making the provider temporarily unavailable\",\n \"timeoutLabel\": \"Recovery Wait Time\",\n \"timeoutExplain\": \"After circuit opens, wait this long before trying half-open state\",\n \"successThresholdLabel\": \"Recovery Success Threshold\",\n \"successThresholdExplain\": \"In half-open state, close circuit breaker after this many successes, making provider available again\",\n \"errorRateLabel\": \"Error Rate Threshold\",\n \"errorRateExplain\": \"Open circuit breaker when error rate exceeds this value, even if failure threshold not reached\",\n \"maxRetries\": \"Max Retries\",\n \"timeoutSettings\": \"Timeout Settings\",\n \"streamingFirstByte\": \"Streaming First Byte Timeout\",\n \"streamingIdle\": \"Streaming Idle Timeout\",\n \"nonStreaming\": \"Non-Streaming Timeout\",\n \"maxRetriesHint\": \"Number of retries on request failure (0-10)\",\n \"streamingFirstByteHint\": \"Max time to wait for first data chunk, range 1-120s, default 60s\",\n \"streamingIdleHint\": \"Max interval between data chunks, range 60-600s, 0 to disable (prevents mid-stream stalls)\",\n \"nonStreamingHint\": \"Total timeout for non-streaming requests, range 60-1200s, default 600s (10 min)\"\n },\n \"logging\": {\n \"enabled\": \"Logging enabled\",\n \"disabled\": \"Logging disabled\",\n \"failed\": \"Failed to toggle logging\"\n },\n \"server\": {\n \"started\": \"Routing service started - {{address}}:{{port}}\",\n \"startFailed\": \"Failed to start routing service: {{detail}}\"\n },\n \"stoppedWithRestore\": \"Routing service stopped, all routing configs restored\",\n \"stopWithRestoreFailed\": \"Stop failed: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"Health check config saved\",\n \"configSaveFailed\": \"Save failed\",\n \"testModels\": \"Test Models\",\n \"claudeModel\": \"Claude Model\",\n \"codexModel\": \"Codex Model\",\n \"geminiModel\": \"Gemini Model\",\n \"checkParams\": \"Check Parameters\",\n \"timeout\": \"Timeout (seconds)\",\n \"maxRetries\": \"Max Retries\",\n \"degradedThreshold\": \"Degraded Threshold (ms)\",\n \"testPrompt\": \"Test Prompt\",\n \"operational\": \"{{providerName}} is operational ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} is slow ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} check failed: {{message}}\",\n \"rejected\": \"{{providerName}} check rejected: {{message}}\",\n \"error\": \"{{providerName}} check error: {{error}}\",\n \"modelNotFound\": \"{{providerName}} test model {{model}} does not exist or has been deprecated\",\n \"modelNotFoundHint\": \"This model may have been retired by the provider. Update the default test model in \\\"Model Test Config\\\".\",\n \"quotaExceeded\": \"{{providerName}} Coding Plan quota has been exceeded\",\n \"quotaExceededHint\": \"Baidu Qianfan returned a Coding Plan quota-limit error. Wait for the 5-hour, weekly, or monthly quota refresh, or adjust the plan in the Qianfan console.\",\n \"httpHint\": {\n \"400\": \"Provider rejected request format. Health check probe may differ from actual usage.\",\n \"401\": \"API key may be invalid, or provider uses OAuth auth. Check failure doesn't mean it's unusable.\",\n \"402\": \"Account quota or billing issue.\",\n \"403\": \"Provider blocked this request. Some verify client identity; may work fine in actual use.\",\n \"404\": \"Endpoint not found. Check base URL and API path.\",\n \"429\": \"Too many requests. Try again later.\",\n \"5xx\": \"Provider internal error. Likely temporary.\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"Routing Master Switch\",\n \"appTakeover\": \"Routing Enabled\",\n \"perAppConfig\": \"Per-App Config\",\n \"circuitBreaker\": \"Circuit Breaker\",\n \"circuitBreakerSettings\": \"Circuit Breaker Settings\",\n \"failureThreshold\": \"Failure Threshold\",\n \"successThreshold\": \"Success Threshold\",\n \"recoveryTimeout\": \"Recovery Timeout\",\n \"errorRateThreshold\": \"Error Rate Threshold\",\n \"minRequests\": \"Min Requests\",\n \"timeoutConfig\": \"Timeout Config\",\n \"streamingFirstByte\": \"Streaming First Byte Timeout\",\n \"streamingIdle\": \"Streaming Idle Timeout\",\n \"nonStreaming\": \"Non-Streaming Timeout\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"Failure Threshold\",\n \"successThreshold\": \"Success Threshold\",\n \"timeoutSeconds\": \"Timeout (seconds)\",\n \"errorRateThreshold\": \"Error Rate Threshold (%)\",\n \"minRequests\": \"Minimum Requests\",\n \"validationFailed\": \"The following fields are out of valid range: {{fields}}\",\n \"configSaved\": \"Circuit breaker configuration saved\",\n \"saveFailed\": \"Save failed\",\n \"loading\": \"Loading...\",\n \"title\": \"Circuit Breaker Configuration\",\n \"description\": \"Adjust circuit breaker parameters to control fault detection and recovery behavior\",\n \"failureThresholdHint\": \"How many consecutive failures trigger the circuit breaker\",\n \"timeoutSecondsHint\": \"How long to wait before attempting recovery (half-open state)\",\n \"successThresholdHint\": \"How many successes in half-open state to close the circuit breaker\",\n \"errorRateThresholdHint\": \"Open circuit breaker when error rate exceeds this value\",\n \"minRequestsHint\": \"Minimum requests before calculating error rate\",\n \"saveConfig\": \"Save Configuration\",\n \"instructionsTitle\": \"Configuration Instructions\",\n \"instructions\": {\n \"failureThreshold\": \"Circuit breaker opens when consecutive failures reach this count\",\n \"timeout\": \"After circuit breaker opens, wait this time before attempting half-open\",\n \"successThreshold\": \"In half-open state, close circuit breaker when successes reach this count\",\n \"errorRate\": \"Circuit breaker opens when error rate exceeds this value\",\n \"minRequests\": \"Error rate is only calculated after request count reaches this value\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"Duplicate\",\n \"duplicatedAndSynced\": \"Universal provider duplicated and synced\",\n \"duplicateError\": \"Failed to duplicate universal provider\",\n \"title\": \"Universal Provider\",\n \"description\": \"Universal providers manage Claude, Codex, and Gemini configurations simultaneously. Changes are automatically synced to all enabled apps.\",\n \"add\": \"Add Universal Provider\",\n \"edit\": \"Edit Universal Provider\",\n \"empty\": \"No universal providers yet\",\n \"emptyHint\": \"Click the \\\"Add Universal Provider\\\" button below to create one\",\n \"selectPreset\": \"Select Preset Type\",\n \"name\": \"Name\",\n \"namePlaceholder\": \"e.g., My NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API Key\",\n \"websiteUrl\": \"Website URL\",\n \"websiteUrlPlaceholder\": \"https://example.com (optional, displayed in the list)\",\n \"notes\": \"Notes\",\n \"notesPlaceholder\": \"Optional: Add notes\",\n \"enabledApps\": \"Enabled Apps\",\n \"modelConfig\": \"Model Configuration\",\n \"model\": \"Model\",\n \"sync\": \"Sync to Apps\",\n \"synced\": \"Synced to all apps\",\n \"syncError\": \"Sync failed\",\n \"noAppsEnabled\": \"No apps enabled\",\n \"added\": \"Universal provider added\",\n \"addedAndSynced\": \"Universal provider added and synced\",\n \"updated\": \"Universal provider updated\",\n \"deleted\": \"Universal provider deleted\",\n \"addSuccess\": \"Universal provider added successfully\",\n \"addFailed\": \"Failed to add universal provider\",\n \"hint\": \"Cross-app unified config, auto-sync to Claude/Codex/Gemini\",\n \"manage\": \"Manage\",\n \"loadError\": \"Failed to load universal providers\",\n \"saveError\": \"Failed to save universal provider\",\n \"deleteError\": \"Failed to delete universal provider\",\n \"deleteConfirmTitle\": \"Delete Universal Provider\",\n \"deleteConfirmDescription\": \"Are you sure you want to delete \\\"{{name}}\\\"? This will also delete its generated provider configurations in each app.\",\n \"syncConfirmTitle\": \"Sync Universal Provider\",\n \"syncConfirmDescription\": \"Syncing \\\"{{name}}\\\" will overwrite the associated provider configurations in Claude, Codex, and Gemini. Do you want to continue?\",\n \"syncConfirm\": \"Sync\",\n \"saveAndSync\": \"Save & Sync\",\n \"savedAndSynced\": \"Saved and synced to all apps\",\n \"saveAndSyncError\": \"Failed to save and sync\",\n \"configJsonPreview\": \"Config JSON Preview\",\n \"configJsonPreviewHint\": \"The following configurations will be synced to each app (only the displayed fields will be overwritten, other custom settings will be preserved)\"\n },\n \"omo\": {\n \"editProfile\": \"Edit OMO Config\",\n \"newProfile\": \"New OMO Config\",\n \"profileName\": \"Name\",\n \"mainAgents\": \"Main Agents\",\n \"subAgents\": \"Sub Agents\",\n \"categories\": \"Categories\",\n \"customAgents\": \"Custom Agents\",\n \"noCustomAgents\": \"No custom agents\",\n \"otherFields\": \"Other Config\",\n \"globalConfig\": \"OMO Global Config\",\n \"globalConfigShort\": \"OMO Config\",\n \"globalConfigSaved\": \"Global config saved\",\n \"addProfile\": \"Add OMO Provider\",\n \"disabledItems\": \"Disabled Items\",\n \"advanced\": \"Advanced Settings\",\n \"profileCreated\": \"OMO config created\",\n \"profileUpdated\": \"OMO config updated\",\n \"invalidJson\": \"Other Fields contains invalid JSON\",\n \"confirmDelete\": \"Delete Config\",\n \"confirmDeleteMsg\": \"Delete \\\"{{name}}\\\"?\",\n \"profileDeleted\": \"Config deleted\",\n \"imported\": \"Imported as \\\"{{name}}\\\"\",\n \"import\": \"Import\",\n \"global\": \"Global\",\n \"empty\": \"No OMO configs yet. Click + Add or Import from local.\",\n \"applied\": \"Applied\",\n \"apply\": \"Apply\",\n \"enable\": \"Enable\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"OMO disabled\",\n \"disableFailed\": \"Failed to disable OMO: {{error}}\",\n \"selectPlaceholder\": \"Select...\",\n \"clear\": \"Clear\",\n \"clearWrapped\": \"(Clear)\",\n \"defaultWrapped\": \"(Default)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"Select configured model\",\n \"selectModel\": \"Select configured model\",\n \"recommendedHint\": \"Recommended: {{model}}\",\n \"searchModel\": \"Search model...\",\n \"selectModelFirst\": \"Select model first\",\n \"noEnabledModels\": \"No configured models\",\n \"noVariantsForModel\": \"No variants for model\",\n \"currentValueNotEnabled\": \"{{value}} (current value, not configured)\",\n \"currentValueUnavailable\": \"{{value}} (current value, unavailable)\",\n \"advancedLabel\": \"Advanced\",\n \"advancedJsonInvalid\": \"Advanced JSON is invalid\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults\",\n \"noEnabledModelsWarning\": \"No configured models available. Configure OpenCode models first.\",\n \"modelSourcePartialWarning\": \"Some provider model configs are invalid and were skipped.\",\n \"modelSourceFallbackWarning\": \"Failed to load live provider state. Falling back to configured providers.\",\n \"importLocalReplaceSuccess\": \"Imported local file and replaced Agents/Categories/Other Fields\",\n \"importLocalFailed\": \"Failed to read local file: {{error}}\",\n \"agentKeyPlaceholder\": \"agent key\",\n \"categoryKeyPlaceholder\": \"category key\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"Custom\",\n \"customCategories\": \"Custom Categories\",\n \"modelConfiguration\": \"Model Configuration\",\n \"fillRecommended\": \"Fill Recommended\",\n \"fillRecommendedSuccess\": \"Filled {{count}} recommended models\",\n \"fillRecommendedPartial\": \"Filled {{filled}} recommended models, {{unmatched}} unmatched\",\n \"fillRecommendedMostlyUnmatched\": \"Filled only {{filled}}, {{unmatched}} unmatched (e.g. {{examples}}). Configure providers offering these models or pick a substitute.\",\n \"fillRecommendedAllSet\": \"All slots already have models configured\",\n \"fillRecommendedNoMatch\": \"Recommended models not found in configured providers (e.g. {{examples}})\",\n \"configSummary\": \"{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params\",\n \"enabledModelsCount\": \"{{count}} configured models available\",\n \"source\": \"from:\",\n \"otherFieldsJson\": \"Other Fields (JSON)\",\n \"slimOtherFieldsHint\": \"Use this area for top-level OMO Slim config such as council, fallback, multiplexer, disabled_mcps, and todoContinuation.\",\n \"searchOrType\": \"Search or type custom value...\",\n \"noMatches\": \"No matches\",\n \"jsonMustBeObject\": \"{{field}} must be a JSON object\",\n \"jsonInvalid\": \"{{field}} contains invalid JSON\",\n \"importGlobalSuccess\": \"Imported global config from local file (unsaved)\",\n \"importGlobalFailed\": \"Failed to read local file: {{error}}\",\n \"importLocal\": \"Import Local\",\n \"saveGlobalConfig\": \"Save Global Config\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"Reset\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent Config\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"Disabled Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"Disabled MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"Disabled Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"Disabled Skills\",\n \"advancedLsp\": \"LSP Config\",\n \"advancedExperimental\": \"Experimental Features\",\n \"advancedBackgroundTask\": \"Background Tasks\",\n \"advancedBrowserAutomation\": \"Browser Automation\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"Main orchestrator\",\n \"hephaestus\": \"Autonomous deep worker\",\n \"prometheus\": \"Strategic planner\",\n \"atlas\": \"Task manager\",\n \"oracle\": \"Strategic advisor\",\n \"librarian\": \"Multi-repo researcher\",\n \"explore\": \"Fast code search\",\n \"multimodalLooker\": \"Media analyzer\",\n \"metis\": \"Pre-plan analysis advisor\",\n \"momus\": \"Plan reviewer\",\n \"sisyphusJunior\": \"Delegated task executor\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"Main orchestrator responsible for task planning, delegation and parallel execution. Uses extended thinking (32k budget) and drives workflows through TODO lists to ensure task completion.\",\n \"atlas\": \"Main orchestrator (holds TODO list) responsible for task distribution and coordination during execution phase. Delegates to specialized agents rather than completing all work directly.\",\n \"prometheus\": \"Strategic planner that collects requirements through interview mode and creates detailed work plans. Can only read/write Markdown files in .sisyphus/ directory, never writes code directly.\",\n \"hephaestus\": \"Autonomous deep worker (\\\"legitimate craftsman\\\") inspired by AmpCode deep mode. Goal-oriented execution that launches 2-5 explore/librarian agents in parallel for research before taking action.\",\n \"oracle\": \"Architecture decision and debugging advisor. Read-only consulting agent providing excellent logical reasoning and deep analysis. Cannot write files or delegate tasks.\",\n \"librarian\": \"Multi-repository analysis and documentation retrieval expert. Deeply understands codebases and provides evidence-based answers. Excels at finding official documentation and open-source implementation examples.\",\n \"explore\": \"Fast codebase exploration and context grep expert. Uses lightweight models for high-speed search. The scout for understanding code structure.\",\n \"multimodalLooker\": \"Visual content expert that analyzes PDFs, images, charts and other non-text media, extracting information and insights from them.\",\n \"metis\": \"Plan consultant that performs pre-analysis before planning. Identifies hidden intents, ambiguities and AI failure points to prevent over-engineering.\",\n \"momus\": \"Plan reviewer that validates plan clarity, verifiability and completeness with high precision. Rejects and requests revisions until plans are perfect.\",\n \"sisyphusJunior\": \"Category-generated executor, automatically created via category parameters. Focuses on executing assigned tasks and cannot re-delegate, preventing infinite delegation loops.\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"Visual/frontend engineering\",\n \"ultrabrain\": \"Ultra thinking\",\n \"deep\": \"Deep work\",\n \"artistry\": \"Creative/artistic\",\n \"quick\": \"Quick response\",\n \"unspecifiedLow\": \"General low tier\",\n \"unspecifiedHigh\": \"General high tier\",\n \"writing\": \"Writing\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"Frontend and visual engineering category for UI/UX design, styling, animation and interface implementation. Defaults to Gemini 3.5 Flash model.\",\n \"ultrabrain\": \"Deep logical reasoning category for complex architectural decisions requiring extensive analysis. Defaults to GPT-5.3 Codex ultra-high reasoning variant.\",\n \"deep\": \"Deep autonomous problem-solving category with goal-oriented execution. Conducts thorough research before action, suitable for difficult problems requiring deep understanding.\",\n \"artistry\": \"Highly creative and artistic task category that inspires novel ideas and creative solutions. Defaults to Gemini 3.5 Flash high variant.\",\n \"quick\": \"Lightweight task category for single-file modifications, typo fixes, and simple adjustments. Defaults to Claude Haiku 4.5 fast model.\",\n \"unspecifiedLow\": \"Uncategorized low-effort task category for tasks that don't fit other categories with small workload. Defaults to Claude Sonnet 4.5.\",\n \"unspecifiedHigh\": \"Uncategorized high-effort task category for tasks that don't fit other categories with large workload. Defaults to Claude Opus 4.8 max variant.\",\n \"writing\": \"Writing category for documentation, prose and technical writing. Defaults to Kimi K2.5 model.\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"Orchestrator\",\n \"oracle\": \"Oracle\",\n \"librarian\": \"Librarian\",\n \"explorer\": \"Explorer\",\n \"designer\": \"Designer\",\n \"fixer\": \"Fixer\",\n \"council\": \"Council\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"Writes executable code, orchestrates multi-agent workflow, summons experts\",\n \"oracle\": \"Root cause analysis, architecture review, debugging guidance (read-only)\",\n \"librarian\": \"Documentation lookup, GitHub code search (read-only)\",\n \"explorer\": \"Regex search, AST pattern matching, file discovery (read-only)\",\n \"designer\": \"Modern responsive design, CSS/Tailwind expertise\",\n \"fixer\": \"Code implementation, refactoring, testing, verification\",\n \"council\": \"Multi-model consensus agent. Runs multiple read-only councillors in parallel, then lets the master synthesize the final answer.\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"Default Model\",\n \"description\": \"Configure the default primary model and fallback models for OpenClaw\",\n \"primary\": \"Primary Model\",\n \"primaryPlaceholder\": \"e.g., deepseek/deepseek-chat\",\n \"fallbacks\": \"Fallback Models\",\n \"fallbacksPlaceholder\": \"e.g., openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"Add Fallback Model\",\n \"saved\": \"Default model configuration saved\",\n \"saveFailed\": \"Failed to save default model\"\n },\n \"modelCatalog\": {\n \"title\": \"Model Catalog\",\n \"description\": \"Configure model aliases and allowlist\",\n \"modelId\": \"Model ID\",\n \"modelIdPlaceholder\": \"e.g., deepseek/deepseek-chat\",\n \"alias\": \"Alias\",\n \"aliasPlaceholder\": \"e.g., DeepSeek\",\n \"addEntry\": \"Add Model\",\n \"removeEntry\": \"Remove\",\n \"saved\": \"Model catalog saved\",\n \"saveFailed\": \"Failed to save model catalog\",\n \"empty\": \"No model catalog entries\",\n \"emptyHint\": \"Add models to the catalog to configure aliases\"\n },\n \"suggestedDefaults\": \"Apply Suggested Defaults\",\n \"suggestedDefaultsHint\": \"Use this preset's recommended default model configuration\"\n },\n \"sidebar\": {\n \"kanban\": \"AI Kanban Board\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"Sync Backup\",\n \"agentConfig\": \"Agent Config\",\n \"projectConfig\": \"Project Config\",\n \"planning\": \"Coming Soon\",\n \"section\": {\n \"projects\": \"Projects\",\n \"myProjects\": \"My Projects\",\n \"monitor\": \"Monitoring\",\n \"aiModels\": \"AI Models\",\n \"cloudSync\": \"Cross-device Cloud Sync\",\n \"teamCollab\": \"Team Collaboration\",\n \"syncCollab\": \"Sync & Collaboration\"\n }\n },\n \"kanban\": {\n \"subtitle\": \"AI-driven global multi-perspective project portfolio matrix: full lifecycle management, health assessment, dynamic cost monitoring\",\n \"scanning\": \"Scanning {{done}}/{{total}} projects…\",\n \"refresh\": \"Refresh metrics\",\n \"addProject\": \"Add project\",\n \"searchPlaceholder\": \"Search projects…\",\n \"confirmRemoveTitle\": \"Remove from AI Kanban Board?\",\n \"confirmRemove\": \"「{{name}}」 will be removed from the portfolio. Disk files are not deleted; local board data (stage, progress, etc.) will be cleared.\",\n \"confirmRemoveBtn\": \"Remove\",\n \"removed\": \"Removed 「{{name}}」\",\n \"commits7dHint\": \"{{count}} commits in the last 7 days\",\n \"commitsWindowHint\": \"{{count}} commits in the last {{days}} days\",\n \"noRecentActivity\": \"No commits in the last 7 days\",\n \"noRecentActivityWindow\": \"No commits in the last {{days}} days\",\n \"stageDistribution\": \"Stage distribution\",\n \"activity\": {\n \"veryHigh\": \"Very high\",\n \"high\": \"High\",\n \"medium\": \"Medium\",\n \"low\": \"Low\"\n },\n \"detail\": {\n \"tabs\": \"Project details\",\n \"overview\": \"Overview\",\n \"aiAssets\": \"AI assets\",\n \"projectAssets\": \"Assets enabled for this project\",\n \"projectAssetsHint\": \"Selections apply to this project only; global library is in the sidebar; links are stored locally.\"\n },\n \"score\": {\n \"health\": \"Health score\"\n },\n \"readiness\": {\n \"title\": \"Agent readiness\",\n \"loading\": \"Assessing configuration readiness…\",\n \"hint\": \"Click an item to jump to the right place; link project-level assets under the AI assets tab.\",\n \"configure\": \"Configure\",\n \"configureGlobal\": \"Open global settings\",\n \"manage\": \"Manage\",\n \"openAssetsTab\": \"Open project asset setup\",\n \"compactTitle\": \"Project configuration readiness\",\n \"normalCount\": \"{{count}} ready\",\n \"driftCount\": \"{{count}} inconsistent\",\n \"missingCount\": \"{{count}} missing\",\n \"priorityDrift\": \"Prioritize: {{label}} is inconsistent\",\n \"priorityMissing\": \"Prioritize: configure {{label}}\",\n \"completedSection\": \"{{count}} completed\",\n \"badgeHint\": \"click for details\",\n \"scanEffective\": \"Effective-state scan\",\n \"forApp\": \"Scored for {{app}}\",\n \"status\": {\n \"global_only\": \"Source: global baseline\",\n \"detected_only\": \"Source: repo detected\",\n \"partial\": \"Partial CLI support\",\n \"not_required\": \"Not supported by the current target CLI; excluded from scoring\",\n \"unmanaged\": \"Project is not managed by OpenSunstar yet, so this cannot be judged as missing\",\n \"unknown\": \"Cannot be determined yet\",\n \"unhealthy\": \"Config does not match the expected state\"\n },\n \"effective\": {\n \"configured\": \"Configured\",\n \"effective\": \"In effect\",\n \"drifted\": \"Not in effect\",\n \"unconfigured\": \"Not configured\",\n \"unchecked\": \"Not compared\"\n },\n \"driftBadge\": \"{{count}} config mismatch item(s)\",\n \"driftShort\": \"To fix {{count}}\",\n \"repairDrift\": \"Repair config\",\n \"repairSuccess\": \"Write-back verified\",\n \"repairFailed\": \"Config mismatch remains after repair\",\n \"repairError\": \"Repair request failed — try again\",\n \"repairNoop\": \"No repair needed for this item\"\n },\n \"governance\": {\n \"title\": \"Config effectiveness\",\n \"forApp\": \"Target CLI: {{app}}\",\n \"scannedProjects\": \"Scanned projects\",\n \"ofTotal\": \"{{total}} total\",\n \"driftProjects\": \"Projects with config mismatch\",\n \"driftItems\": \"{{count}} item(s) to fix\",\n \"effectiveRate\": \"Effective rate\",\n \"comparableItems\": \"{{count}} comparable\",\n \"effectiveItems\": \"Effective items\",\n \"portfolioScope\": \"Portfolio aggregate\",\n \"driftBreakdown\": \"Config mismatch by asset type\",\n \"allEffective\": \"All comparable assets are effective.\",\n \"awaitingScan\": \"Governance metrics appear after readiness scan completes.\",\n \"repairConfirmTitle\": \"Confirm write-back repair?\",\n \"repairConfirmProjectTitle\": \"Repair all mismatched items for this project?\",\n \"repairConfirmAssetIntro\": \"OpenSunstar will write the library copy of \\\"{{label}}\\\" to the project-level files for {{app}}. This may overwrite manual edits you made outside OpenSunstar.\",\n \"repairConfirmProjectIntro\": \"Repair all {{count}} mismatched config item(s) for \\\"{{name}}\\\" by writing OpenSunstar library content to {{app}} project files. External manual edits may be overwritten.\",\n \"repairConfirmDetail\": \"Mismatch detail: {{detail}}\",\n \"repairConfirmPath\": \"Target path: {{path}}\",\n \"repairConfirmProceed\": \"Write-back and re-scan run immediately after you confirm. This cannot be undone automatically.\",\n \"repairConfirmAction\": \"Confirm write-back\",\n \"repairConfirmProjectAction\": \"Repair all\",\n \"tooltip\": {\n \"scannedProjects\": \"Number of projects that have completed AI configuration readiness checks\",\n \"driftProjects\": \"Projects with at least 1 AI config item inconsistent with the expected state saved in OpenSunstar, usually because local files were modified or deleted outside OpenSunstar.\",\n \"effectiveRate\": \"Effective rate = effective items ÷ comparable items.\\nEffective = config correctly written to project; comparable = total check items excluding unsupported.\",\n \"effectiveItems\": \"Total number of AI config check items correctly applied across all projects.\"\n }\n },\n \"portfolioDrift\": {\n \"allClear\": \"Portfolio effective-state scan: no config mismatch detected.\",\n \"title\": \"{{projects}} project(s) with config mismatch ({{items}} item(s) total)\",\n \"forApp\": \"Target CLI: {{app}}\",\n \"itemCount\": \"{{count}} to fix\",\n \"repairAll\": \"Repair all items to fix\",\n \"repairAllSuccess\": \"Repaired {{count}} config mismatch item(s) and verified\",\n \"repairPartial\": \"Fixed {{fixed}}, {{remaining}} config mismatch item(s) remain\",\n \"repairNone\": \"No config mismatch items to repair\"\n }\n },\n \"projectConfig\": {\n \"hint\": \"Choose MCP, Skills, and Prompts to enable for this project. Maintain the global library under Agent config in the sidebar.\",\n \"mcpServers\": \"MCP servers\",\n \"skills\": \"Skills\",\n \"prompts\": \"Prompts\",\n \"noMcp\": \"No MCP servers yet\",\n \"noSkills\": \"No installed Skills yet\",\n \"noPrompts\": \"No Prompts yet\",\n \"goToMcp\": \"Go to MCP\",\n \"goToSkills\": \"Go to Skills\",\n \"goToPrompts\": \"Go to Prompts\",\n \"commands\": \"Commands\",\n \"hooks\": \"Hooks\",\n \"ignore\": \"Ignore rules\",\n \"permissions\": \"Permissions\",\n \"subagents\": \"Subagents\",\n \"noCommands\": \"No Commands yet\",\n \"noHooks\": \"No Hooks yet\",\n \"noIgnore\": \"No Ignore rules yet\",\n \"noPermissions\": \"No Permissions yet\",\n \"noSubagents\": \"No Subagents yet\",\n \"goToCommands\": \"Go to Commands\",\n \"goToHooks\": \"Go to Hooks\",\n \"goToIgnore\": \"Go to Ignore\",\n \"goToPermissions\": \"Go to Permissions\",\n \"goToSubagents\": \"Go to Subagents\"\n },\n \"projectAssets\": {\n \"projectLink\": \"Link to this project\",\n \"hint\": \"Choose the AI asset subset to enable for this project. Links are stored in OpenSunstar only and do not modify the repo; syncing to CLIs still uses the global library in the sidebar.\",\n \"partialHint\": \"Some CLIs have limited support — hover chips for details\",\n \"globalBaselineHint\": \"{{count}} global rule(s) act as a safety baseline; you can enable a project subset separately.\",\n \"switchAllUnsupported\": \"This asset type cannot be synced to any target CLI — cannot enable for the project\",\n \"support\": {\n \"claudeDesktop\": \"Claude Desktop does not participate in this asset sync\",\n \"openclawMcp\": \"OpenClaw does not support MCP sync\",\n \"openclawSkills\": \"OpenClaw does not support Skills sync\",\n \"openclawCommands\": \"OpenClaw does not support Commands sync\",\n \"openclawIgnore\": \"OpenClaw does not support Ignore sync\",\n \"openclawSubagents\": \"OpenClaw does not support Subagents sync\",\n \"codexCommands\": \"Codex does not use standalone slash command files\",\n \"codexSubagent\": \"Codex writes agents via TOML to ~/.codex/agents/\",\n \"hooksClaudeOnly\": \"Hooks write-back is Claude Code only\",\n \"permissionsClaudeOnly\": \"Permissions write-back is Claude Code only\",\n \"hermesSubagents\": \"Hermes does not sync Subagent files\"\n }\n },\n \"board\": {\n \"summary\": {\n \"title\": \"Portfolio overview\",\n \"totalProjects\": \"Total projects\",\n \"totalCodeLines\": \"Total lines of code\",\n \"linesUnit\": \"lines\",\n \"avgActivity\": \"Avg. activity ({{days}} days)\",\n \"commitsInWindow\": \"Commits ({{days}} days)\",\n \"thisWeek\": \"Commits (7 days)\",\n \"windowLabel\": \"Git activity window\",\n \"daysUnit\": \"days\",\n \"updatesUnit\": \"commits\"\n },\n \"duplicateCleanup\": \"Duplicate asset detection\"\n },\n \"projectBlueprint\": {\n \"title\": \"Project baseline Blueprint\",\n \"hint\": \"Pick a template to link global library assets. Merge mode only adds links; existing config is kept.\",\n \"loading\": \"Loading blueprints…\",\n \"exportSnapshot\": \"Export snapshot\",\n \"targetCli\": \"Project target CLI\",\n \"targetDefault\": \"Use board default\",\n \"saveTarget\": \"Save\",\n \"previewing\": \"Building preview…\",\n \"previewTitle\": \"Preview: {{count}} new links ({{name}})\",\n \"apply\": \"Apply Blueprint\",\n \"applied\": \"Applied \\\"{{name}}\\\" — linked {{count}} assets\",\n \"targetSaved\": \"Project target CLI saved\",\n \"snapshotExported\": \"Baseline snapshot exported: {{path}}\"\n },\n \"subscription\": {\n \"title\": \"Subscription Quota\",\n \"fiveHour\": \"5-Hour\",\n \"sevenDay\": \"7-Day\",\n \"sevenDayOpus\": \"7-Day (Opus)\",\n \"sevenDaySonnet\": \"7-Day (Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"Weekly\",\n \"copilotPremium\": \"Premium\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"Resets in {{time}}\",\n \"extraUsage\": \"Extra Usage\",\n \"expired\": \"Session expired\",\n \"expiredHint\": \"Run the {{tool}} command to refresh your login\",\n \"queryFailed\": \"Query failed\",\n \"refresh\": \"Refresh\"\n },\n \"methodology\": {\n \"sidebar\": \"Workflow Orchestration\",\n \"title\": \"Workflow Orchestration\",\n \"subtitle\": \"Build executable workflows and governance checks for projects. Methodology detection is optional diagnostics.\",\n \"scanAll\": \"Scan all projects\",\n \"scanAllNoProjects\": \"Add a project first to scan\",\n \"scanComplete\": \"Framework detection complete\",\n \"scanCompleteWithCount\": \"Scanned {{count}} projects\",\n \"tabMarket\": \"Methodology Detection\",\n \"tabOrchestration\": \"Workflow Configuration\",\n \"notScanned\": \"Not scanned\",\n \"verified\": \"Detected\",\n \"inferred\": \"Possibly used\",\n \"absent\": \"Not detected\",\n \"detectedInProjects\": \"{{detected}}/{{total}} projects detected\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} projects possibly used\",\n \"absentInAll\": \"Not detected in {{total}} projects\",\n \"noneDetectedTitle\": \"No methodology framework detected\",\n \"noneDetectedGuidance\": \"Recommend starting with flow-kit (pure Markdown template system) or spec-kit (spec toolchain). The review-only preset suits projects with an existing code review workflow—no framework installation needed.\",\n \"scanPromptTitle\": \"Methodology frameworks not scanned yet\",\n \"scanPromptBody\": \"Click Scan all projects for a read-only probe, or go directly to Preset Orchestration / Custom Orchestration—no framework install or detection required.\",\n \"goToOrchestration\": \"Preset Orchestration\",\n \"goToRecipe\": \"Custom Orchestration\",\n \"recommendedPreset\": \"Recommended tier: {{preset}}\",\n \"recommendedFrameworks\": \"Framework reference catalog\",\n \"recommendedFrameworksHint\": \"Supported open-source methodologies for discovery and selection (not an install wizard)\",\n \"detectedFrameworks\": \"Detected frameworks\",\n \"directOrchestrationTitle\": \"Start orchestration without a framework\",\n \"directOrchestrationHint\": \"Preset and custom orchestration work independently—export workflow.profile.json or Recipe files.\",\n \"presetFull\": \"Full workflow\",\n \"presetStandard\": \"Standard workflow\",\n \"presetMvp\": \"MVP workflow\",\n \"presetReviewOnly\": \"Review only\",\n \"noDescriptors\": \"Framework catalog is empty. Please confirm the database is initialized.\",\n \"detectionMatrix\": \"Detection Matrix\",\n \"detectionMatrixHint\": \"Project × framework detection results (✓ detected / ? possibly used / ✗ not detected / — not scanned)\",\n \"matrixFramework\": \"Framework \\\\ Project\",\n \"orchestrationEntry\": \"Preset Orchestration Configurator\",\n \"orchestrationHint\": \"Independent dimension: Select a project, configure flow preset, modules, and stages, then export workflow.profile.json or flow-config.yaml. No need to scan frameworks first.\",\n \"orchestrationNoProjects\": \"No projects yet. Please add a project in the workspace before configuring flow orchestration.\",\n \"orchestrationSelectProject\": \"Select project\",\n \"orchestrationChooseProject\": \"— Choose a project —\",\n \"orchestrationPickProjectHint\": \"Pick a project from the dropdown above to start configuring SDD flow orchestration.\",\n \"tabRecipe\": \"Change Execution Plan\",\n \"recipeEntry\": \"Change Execution Plan\",\n \"recipeHint\": \"Independent dimension: Visual stage graph + freely combine stages and modules, export YAML+Markdown hybrid Recipe files. Can be used standalone without configuring other dimensions.\",\n \"recipeNoProjects\": \"No projects yet. Please add a project to your workspace first.\",\n \"recipeSelectProject\": \"Select project\",\n \"recipePickPlaceholder\": \"— Choose a project —\",\n \"recipePickProjectHint\": \"Pick a project from the dropdown above to start composing a Recipe.\",\n \"tabDesignContract\": \"Design Contract\",\n \"designContractEntry\": \"Design Contract Configurator\",\n \"designContractHint\": \"Independent dimension: Choose a brand template or custom colors to generate DESIGN.md + DTCG tokens. Unrelated to SDD methodology — any project with frontend/UI can use it independently.\",\n \"designContractNoProjects\": \"No projects yet. Please add a project to your workspace first.\",\n \"designContractSelectProject\": \"Select project\",\n \"designContractPickPlaceholder\": \"— Choose a project —\",\n \"designContractPickProjectHint\": \"Pick a project from the dropdown above to start configuring a design contract.\",\n \"tabRulesContext\": \"Rules & Context\",\n \"rulesContextPickProjectHint\": \"Pick a project from the dropdown above to view linked rules and context files.\"\n },\n \"rulesContext\": {\n \"title\": \"Project Rules\",\n \"hint\": \"Rule fragments linked to this project. Rules with globs only apply when matching files exist.\",\n \"empty\": \"No linked rules yet. Create rule fragments in Agent Config > Prompts, then link them in the project detail.\",\n \"fragment\": \"Fragment\",\n \"allTargets\": \"All tools\",\n \"universal\": \"Universal\",\n \"contextFiles\": \"Context Files\",\n \"contextFilesHint\": \"Context files generated per AI tool during project sync. Only tools with linked prompts will generate files.\",\n \"willSync\": \"Will sync\",\n \"managed\": \"Managed\",\n \"userCreated\": \"User-created\",\n \"pendingSync\": \"Pending sync\",\n \"notLinked\": \"Not linked\"\n },\n \"recipeComposer\": {\n \"title\": \"Recipe Composer\",\n \"hybrid\": \"YAML+Markdown hybrid\",\n \"loading\": \"Loading recipe composer...\",\n \"preset\": \"Preset\",\n \"projectType\": \"Project Type\",\n \"projectTypeBackend\": \"Backend\",\n \"projectTypeFrontend\": \"Frontend\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe Name\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"Description\",\n \"descriptionPlaceholder\": \"Recipe composed from standard preset\",\n \"stageGraph\": \"Stage Graph\",\n \"nodesCount\": \"{{count}} nodes\",\n \"modules\": \"Modules\",\n \"stages\": \"Stages\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} enabled\",\n \"notes\": \"Notes (optional)\",\n \"notesPlaceholder\": \"Custom notes for this recipe...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"e.g. feat-auth, fix-login-bug\",\n \"preview\": \"Preview\",\n \"copy\": \"Copy\",\n \"export\": \"Export Recipe\",\n \"install\": \"Install to Project\",\n \"installedSummary\": \"Installed: {{created}} files created\",\n \"installedSkipped\": \", {{skipped}} skipped (already exist)\",\n \"exists\": \"(exists)\",\n \"previewTitle\": \"Preview (YAML+Markdown hybrid)\",\n \"collapse\": \"Collapse\",\n \"savedRecipes\": \"Saved Recipes\",\n \"fitWidth\": \"Fit width\",\n \"actualSize\": \"Actual size\",\n \"lateral\": \"Lateral (cross-cutting)\",\n \"legendStandalone\": \"Standalone\",\n \"legendSemi\": \"Semi-standalone\",\n \"legendBranch\": \"Branch\",\n \"legendNoArtifacts\": \"No artifacts\",\n \"toastExported\": \"Recipe \\\"{{name}}\\\" exported to .opensunstar/recipe/\",\n \"toastCopied\": \"Recipe content copied to clipboard\",\n \"toastCopyFailed\": \"Failed to copy\",\n \"toastChangeIdRequired\": \"Please enter a Change ID (e.g. feat-auth)\",\n \"toastInstalled\": \"Recipe installed: {{created}} files created\",\n \"toastDeleted\": \"Recipe \\\"{{name}}\\\" deleted\"\n },\n \"designContract\": {\n \"title\": \"Design Contract\",\n \"name\": \"Contract Name\",\n \"description\": \"Description\",\n \"templates\": \"Templates\",\n \"tokens\": \"Tokens\",\n \"preview\": \"Preview\",\n \"import\": \"Import\",\n \"colors\": \"Colors\",\n \"typography\": \"Typography\",\n \"spacing\": \"Spacing Base (px)\",\n \"copy\": \"Copy\",\n \"copied\": \"Copied to clipboard\",\n \"exported\": \"Exported\",\n \"installed\": \"Installed\",\n \"loadingTemplate\": \"Loading template...\",\n \"noPreview\": \"Click Preview to generate DESIGN.md\",\n \"importFile\": \"Import from File\",\n \"pickFile\": \"Pick DESIGN.md file...\",\n \"importUrl\": \"Import from URL\",\n \"previewBtn\": \"Preview\",\n \"copyBtn\": \"Copy\",\n \"exportBtn\": \"Export\",\n \"installBtn\": \"Install to Project\",\n \"installResult\": \"Installed\",\n \"filesCreated\": \"files created\",\n \"filesSkipped\": \"skipped\",\n \"exists\": \"exists\"\n },\n \"installConfirm\": {\n \"title\": \"Confirm Install to Project\",\n \"auditScan\": \"Security Audit Scan\",\n \"filesScanned\": \"files scanned\",\n \"noFindings\": \"No security issues found.\",\n \"auditBlocked\": \"CRITICAL issues found by security audit. Install blocked. Please fix and retry.\",\n \"fileList\": \"File List\",\n \"toCreate\": \"will create\",\n \"toSkip\": \"already exists, skip\",\n \"create\": \"Create\",\n \"skip\": \"Skip\",\n \"existing\": \"Existing Content\",\n \"wouldOverwrite\": \"Would overwrite (currently skipped)\",\n \"newContent\": \"New Content\",\n \"cancel\": \"Cancel\",\n \"confirmInstall\": \"Confirm Install\"\n },\n \"sync\": {\n \"waiting\": \"Waiting for changes\",\n \"syncing\": \"Syncing...\",\n \"synced\": \"Synced\",\n \"failed\": \"Sync failed\",\n \"disabled\": \"Disabled\",\n \"justNow\": \"Just now\",\n \"minutesAgo\": \"{{count}} min ago\",\n \"hoursAgo\": \"{{count}} hr ago\",\n \"daysAgo\": \"{{count}} days ago\"\n },\n \"onboarding\": {\n \"title\": \"Quick Start\",\n \"dismiss\": \"Dismiss guide\",\n \"prev\": \"Previous\",\n \"next\": \"Next\",\n \"done\": \"Got it\",\n \"step1\": {\n \"title\": \"Add a project\",\n \"desc\": \"Everything revolves around projects. Click \\\"My Projects → Add Project\\\" in the sidebar to bring your repo in — OpenSunstar will automatically scan its AI configuration status.\"\n },\n \"step2\": {\n \"title\": \"Project Cockpit — anything today?\",\n \"desc\": \"\\\"Alerts\\\" answers one question: is there anything today. All clear shows \\\"All clear\\\" — no news is the best news. \\\"Project Board\\\" holds aggregate metrics and asset matrix; overview content doesn't occupy the boot-time first glance.\"\n },\n \"step3\": {\n \"title\": \"AI Asset Setup — land assets on a project\",\n \"desc\": \"Under \\\"Project Config → AI Asset Setup\\\", link MCP servers, Skills, Prompts and other assets to a project. The sidebar's \\\"Agent Config\\\" manages the global library; this page manages how those assets attach to a project.\"\n },\n \"step4\": {\n \"title\": \"Workflow Orchestration — build executable workflows\",\n \"desc\": \"Under \\\"Project Config → Workflow Orchestration\\\", configure stages, presets and change-execution plans. Methodology detection, preset orchestration, custom orchestration, design contracts — four independent dimensions, pick as needed, no ordering dependency.\"\n }\n },\n \"repairPreview\": {\n \"title\": \"Config Repair Preview\",\n \"description\": \"Project \\\"{{name}}\\\" has {{count}} config mismatch item(s). Select the ones to repair:\",\n \"loading\": \"Scanning items to fix…\",\n \"empty\": \"No config mismatch found, nothing to repair\",\n \"selectAll\": \"Select all\",\n \"deselectAll\": \"Deselect all\",\n \"safetyHint\": \"{{count}} safety-critical item(s) (Ignore/Permissions/Hooks) — repair will overwrite access control or command execution config\",\n \"safetyCriticalTooltip\": \"Safety-critical: repair will overwrite access control or command execution config\",\n \"safetyBadge\": \"Safety-critical\",\n \"confirmAction\": \"Repair selected ({{count}})\",\n \"repairing\": \"Repairing…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI Config Status\",\n \"subtitle\": \"Each cell shows a short AI config status: effective, mismatch, missing, global, detected, unscanned, or not applicable. Click for details.\",\n \"project\": \"Project\",\n \"stage\": \"Stage\",\n \"score\": \"Score\",\n \"loading\": \"Scanning project configs…\",\n \"refreshing\": \"Refreshing\",\n \"normal\": \"OK\",\n \"attention\": \"Attention\",\n \"abnormal\": \"Abnormal\",\n \"unscanned\": \"Not scanned\",\n \"hasIssue\": \"Needs action\",\n \"showProblemsOnly\": \"Needs action only\",\n \"filterLabel\": \"Project status filter\",\n \"filterAll\": \"All\",\n \"filterNeedsAction\": \"Needs action\",\n \"filterAbnormal\": \"Abnormal\",\n \"filterUnscanned\": \"Unscanned\",\n \"allClear\": \"No projects need action under this filter\",\n \"cellOk\": \"OK\",\n \"cellEffective\": \"Effective\",\n \"cellMismatch\": \"Mismatch\",\n \"cellMissing\": \"Missing\",\n \"cellGlobal\": \"Global\",\n \"cellDetected\": \"Detected\",\n \"cellPartial\": \"Partial\",\n \"cellWarn\": \"Attention\",\n \"cellCrit\": \"Abnormal\",\n \"cellUnscanned\": \"Unscanned\",\n \"cellNA\": \"N/A\",\n \"cellRecent\": \"Recent\",\n \"cellStale\": \"Stale\",\n \"colUpkeep\": \"Upkeep\",\n \"colUpkeepTitle\": \"Project asset changes in the last 90 days\",\n \"linkedCount\": \"Linked in OpenSunstar\",\n \"linkedCountValue\": \"{{value}} item(s)\",\n \"detailRecentUpdates\": \"Tracks whether any project-level AI asset config changed in the last 90 days\",\n \"safetyBadge\": \"Safety-critical\",\n \"noData\": \"No scan data available\",\n \"scanPending\": \"Scan has not completed; this cannot be considered OK yet.\",\n \"detailEffective\": \"Config effective and matches OpenSunstar library\",\n \"detailDrifted\": \"Config differs from expected, may need repair\",\n \"detailUnscanned\": \"Config was found, but target CLI effective-state comparison has not completed\",\n \"detailGlobal\": \"Using global default, not customized at project level\",\n \"detailDetected\": \"Config detected in repo but not managed by OpenSunstar\",\n \"detailMissingSafety\": \"Safety-critical item not configured, set up soon recommended\",\n \"detailMissing\": \"Not configured, can be ignored if not needed\",\n \"detailPartial\": \"Partially configured, recommend completing\",\n \"detailNA\": \"Not supported by current target CLI\",\n \"statusOk\": \"Config OK\",\n \"statusWarn\": \"Needs attention\",\n \"statusCrit\": \"Problem found\",\n \"statusUnscanned\": \"Scan not completed\",\n \"statusNA\": \"Not applicable\",\n \"stateDetail\": \"Status details\",\n \"driftDetail\": \"Status details\",\n \"checkDetail\": \"Check details\",\n \"filePath\": \"Config file path\",\n \"viewProject\": \"View project assets\",\n \"goRepair\": \"Go to repair\"\n },\n \"portfolioNotice\": {\n \"title\": \"Some data failed to load. The \\\"unscanned / unconfigured / missing\\\" states below may not reflect what is actually on disk.\",\n \"readinessFailed\": \"Readiness lookup failed for {{failed}}/{{total}} projects\",\n \"assetFailed\": \"Asset summary failed: {{reason}}\",\n \"retry\": \"Retry\"\n },\n \"scope\": {\n \"globalEnabled\": \"Globally enabled\",\n \"globalNotEnabled\": \"Not enabled globally\",\n \"activeProject\": \"Project: {{name}}\",\n \"backToProject\": \"Back to project: {{name}}\",\n \"globalScope\": \"Global\",\n \"projectScope\": \"Project\",\n \"globalToast\": \"Enabled globally for {{app}}\",\n \"globalDisableToast\": \"Disabled globally for {{app}}\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"Cross-device Cloud Sync\",\n \"subtitle\": \"Keep your config data in sync across devices — consistent dev environment anywhere\",\n \"status\": \"Sync Status\",\n \"backend\": \"Sync Backend\",\n \"notConfigured\": \"Not Configured\",\n \"notConfiguredHint\": \"Configure a cloud sync backend (WebDAV / S3 / GitHub Gist) in Settings first\",\n \"goSettings\": \"Go to Sync Settings\",\n \"lastSync\": \"Last Sync\",\n \"never\": \"Never synced\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3 Object Storage\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"Enabled\",\n \"disabled\": \"Disabled\",\n \"autoSync\": \"Auto Sync\",\n \"on\": \"On\",\n \"off\": \"Off\",\n \"description\": \"Cloud sync addresses the spatial axis — keeping config consistent across devices. Complements project environment snapshots (temporal axis · version rollback). Use as needed.\"\n },\n \"projectAiConfig\": {\n \"title\": \"AI Asset Setup\",\n \"subtitle\": \"Land AI assets on a single project: apply a blueprint, check readiness, and pick which assets take effect. The sidebar's Agent Config manages the global library; this page manages how those assets attach to this project.\",\n \"switcher\": \"Project being configured\",\n \"targetCli\": \"Target CLI\",\n \"tabs\": {\n \"assets\": \"Asset links\",\n \"readiness\": \"Readiness & activation\",\n \"environment\": \"Project environment & Wiki\"\n },\n \"emptyProjects\": \"No projects yet. Add one before configuring AI assets.\",\n \"openWorkflow\": \"Configure project workflow\",\n \"orchestrationLink\": \"Workflow orchestration\",\n \"orchestrationHint\": \"Stages, presets and change-execution plans live under Workflow & Methodology; opening it carries the current project along.\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"{{calls}} analyses\",\n \"cachedFree\": \"¥0 (cached)\",\n \"chartApiCalls\": \"API calls\",\n \"chartCost\": \"Cost\",\n \"chartNlQuery\": \"NL queries\",\n \"colCost\": \"Cost\",\n \"colCount\": \"Count\",\n \"colTokens\": \"Tokens\",\n \"colType\": \"Type\",\n \"disclaimer\": \"Costs are estimates based on public pricing; your provider's invoice is authoritative.\",\n \"disclaimerCliSuffix\": \"For CLI agent usage, see Settings → Usage.\",\n \"disclaimerShort\": \"Estimate · provider invoice is authoritative\",\n \"emptyRoi\": \"No AI calls in the last {{days}} days. Run a summary, a risk analysis or an NL query and the ROI will show up here.\",\n \"estimatedSuffix\": \"est.\",\n \"lastCall\": \"This call\",\n \"loadingRoi\": \"Loading ROI data…\",\n \"monthTotal\": \"This month\",\n \"monthTotalFailed\": \"Could not load this month's total (unknown — not ¥0)\",\n \"monthTotalLoading\": \"This month — calculating…\",\n \"nlQueryCount\": \"{{queries}} queries\",\n \"panelTitle\": \"AI cost & value tracking\",\n \"projectRisks\": \"{{risks}} risks\",\n \"projectScope\": \"{{projects}} projects\",\n \"projectUseful\": \"{{useful}} marked useful\",\n \"rangeDays\": \"{{days}} days\",\n \"roiReport\": \"AI spend report\",\n \"sectionByProject\": \"By project (spend ↔ value)\",\n \"sectionByType\": \"By analysis type\",\n \"statRisks\": \"Risks found\",\n \"statTokens\": \"Tokens\",\n \"statTotalSpend\": \"Total spend\",\n \"statUseful\": \"Marked useful\",\n \"stripTitle\": \"AI cost transparency\",\n \"trendTitle\": \"Daily AI spend trend\",\n \"unknownPricing\": \"Pricing unknown\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI feedback\",\n \"markNotUseful\": \"Mark as not useful\",\n \"markUseful\": \"Mark as useful\",\n \"notUseful\": \"Not useful\",\n \"useful\": \"Useful\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent readiness\",\n \"health\": \"Health score\",\n \"nlQuery\": \"NL query\",\n \"portfolioSummary\": \"Portfolio weekly\",\n \"progress\": \"Progress estimate\",\n \"riskAnalysis\": \"Risk analysis\",\n \"summary\": \"Project summary\",\n \"trendAnalysis\": \"Trend analysis\"\n },\n \"query\": {\n \"answerTitle\": \"AI answer\",\n \"costFailed\": \"Could not load cost stats (unknown — not ¥0)\",\n \"detailToggle\": \"Analysis breakdown, last {{days}} days\",\n \"guarding\": \"AI is watching\",\n \"inputLabel\": \"Ask AI\",\n \"notConfigured\": \"AI queries and cost tracking are off — add an API key under Settings → AI provider and the natural-language input will appear here.\",\n \"placeholder\": \"Ask AI — e.g. which project has gone quiet? Draft this week's summary\",\n \"projectsUnit\": \"projects\",\n \"typeHealth\": \"Health\",\n \"typeNlQuery\": \"Q&A\",\n \"typeRisk\": \"Risk\",\n \"typeSummary\": \"Summary\",\n \"typeTrend\": \"Trend\",\n \"typeWeekly\": \"Weekly\"\n },\n \"risk\": {\n \"analyze\": \"Analyze risks\",\n \"analyzing\": \"Analyzing risks…\",\n \"levelHigh\": \"High risk\",\n \"levelLow\": \"Low risk\",\n \"levelMedium\": \"Medium risk\",\n \"none\": \"Project looks healthy — no risks found\",\n \"sectionTitle\": \"Risk analysis\",\n \"title\": \"AI risk analysis\",\n \"typeActivity\": \"Activity\",\n \"typeConcentration\": \"Concentration\",\n \"typeSchedule\": \"Schedule\",\n \"typeTechDebt\": \"Tech debt\"\n },\n \"weekly\": {\n \"analyzing\": \"Analyzing data from {{projects}} projects…\",\n \"cached\": \"cached\",\n \"copied\": \"Copied\",\n \"copyFailed\": \"Copy failed\",\n \"copySuccess\": \"Weekly report copied to clipboard\",\n \"dialogTitle\": \"AI weekly report\",\n \"errorGenerate\": \"Could not generate the weekly report. Please try again later.\",\n \"errorNoProvider\": \"No AI provider configured. Add an AI key in Settings first.\",\n \"generate\": \"Weekly report\",\n \"windowDays\": \"{{days}}d\",\n \"windowHint\": \"· last {{days}} days\"\n }\n },\n \"alerts\": {\n \"action\": {\n \"budget\": \"Adjust budget\",\n \"configure\": \"Configure\",\n \"hintAssets\": \"→ Project asset configuration · Asset linking\",\n \"hintReadiness\": \"→ Project asset configuration · Readiness & activation\",\n \"repair\": \"Repair\",\n \"setup\": \"Set up\"\n },\n \"dismiss\": \"Got it\",\n \"empty\": {\n \"desc\": \"No failures, no overspending, no pending fixes. Get back to coding.\",\n \"title\": \"Nothing to report today\"\n },\n \"money\": {\n \"critical\": \"Budget limit exceeded\",\n \"emergency\": \"Severely over budget\",\n \"warning\": \"Budget warning\"\n },\n \"onlyTasks\": \"No issues with health or spend — the rest can be scheduled.\",\n \"task\": {\n \"driftDesc\": \"Configuration differs from expectations; preview and repair in one click\",\n \"gapDesc\": \"Readiness is not complete; open Project Asset Configuration to fill the gaps\"\n },\n \"viewAll\": \"View project overview\"\n },\n \"xaiOauth\": {\n \"authStatus\": \"xAI OAuth authentication\",\n \"accountCount\": \"{{count}} usable accounts\",\n \"reauthRequired\": \"Re-authentication required\",\n \"notAuthenticated\": \"Not authenticated\",\n \"selectAccount\": \"Select account\",\n \"selectAccountPlaceholder\": \"Select xAI account\",\n \"useDefaultAccount\": \"Use default account\",\n \"accounts\": \"xAI accounts\",\n \"expired\": \"Credential expired\",\n \"defaultAccount\": \"Default\",\n \"setAsDefault\": \"Set default\",\n \"removeAccount\": \"Remove account\",\n \"addOrReauth\": \"Add account or sign in again\",\n \"login\": \"Sign in with xAI\",\n \"waitingForAuth\": \"Waiting for xAI authorization…\",\n \"enterCode\": \"If the browser does not fill the code automatically, enter:\",\n \"retry\": \"Retry\",\n \"logoutAll\": \"Remove all xAI accounts\",\n \"loginRequired\": \"Sign in to an xAI account first\",\n \"selectedAccountNeedsReauth\": \"The bound account is missing or needs re-authentication\",\n \"selectedAccountUnavailable\": \"The bound account is missing or needs re-authentication. Select another account.\"\n }\n}\n"}}, "src/i18n/locales/ja.json": {"7f658de920ce256b279a9888f7d34df16218d8f9": {"t": 1785674689.7055297, "n": 143967, "h": "8e54dd2909afef0e", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"notificationPreferences\": \"通知設定\",\n \"budgetAlertNotifications\": \"予算超過通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency の予算アラート時にシステム通知を送信します(warning はアプリ内のみ)\",\n \"failoverAlertNotifications\": \"フェイルオーバー通知\",\n \"failoverAlertNotificationsDescription\": \"プロバイダーの自動フェイルオーバー完了時にシステム通知を送信します\",\n \"trayBadgeNotifications\": \"トレイアラート表示\",\n \"trayBadgeNotificationsDescription\": \"未読アラートがある場合、トレイアイコンをアラート状態に切り替え、メニュー上部にアラート項目を表示します\",\n \"workspaceAlertFirst\": \"ワークスペースアラートを最優先\",\n \"workspaceAlertFirstDescription\": \"有効にすると「今日のワークスペース」の上部にアラートカードを表示します。無効時はトレイ/システム通知のみでアラートを通知します\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"プロジェクトコックピット\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"アラート\",\n \"board\": \"プロジェクトボード\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n }\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローオーケストレーション\",\n \"title\": \"ワークフローオーケストレーション\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"projectConfig\": \"プロジェクト設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"myProjects\": \"マイプロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"クイックスタート\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"プロジェクトを追加\",\n \"desc\": \"すべての機能はプロジェクトを中心に展開します。サイドバーの「マイプロジェクト → プロジェクトを追加」からリポジトリを追加すると、OpenSunstar が AI 設定状態を自動スキャンします。\"\n },\n \"step2\": {\n \"title\": \"プロジェクトコックピット — 今日は問題ある?\",\n \"desc\": \"「アラート」は一つの質問に答えます:今日は問題があるか。何もなければ「今日は問題なし」と表示。問題がないのが最高のニュースです。「プロジェクトボード」には集計指標とアセットマトリクスがあり、概要コンテンツは起動時の一目を占領しません。\"\n },\n \"step3\": {\n \"title\": \"AIアセット設定 — プロジェクトにアセットを適用\",\n \"desc\": \"「プロジェクト設定 → AIアセット設定」で MCP サーバー、Skills、Prompts などのアセットをプロジェクトに関連付けます。サイドバーの「Agent 設定」はグローバルライブラリを管理し、ここではそのプロジェクトへの関連付けを管理します。\"\n },\n \"step4\": {\n \"title\": \"ワークフローオーケストレーション — 実行可能なフローを構築\",\n \"desc\": \"「プロジェクト設定 → ワークフローオーケストレーション」でステージ、プリセット、変更実行プランを設定します。方法論検出、プリセット編成、カスタム編成、デザイン契約——4つの独立したディメンション、必要に応じて選択でき、順序依存はありません。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"AIアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "636da7d3bc74f3edff5eca22e9f0e90370cc83ed": {"t": 1785746518.5077684, "n": 143967, "h": "8e54dd2909afef0e", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"notificationPreferences\": \"通知設定\",\n \"budgetAlertNotifications\": \"予算超過通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency の予算アラート時にシステム通知を送信します(warning はアプリ内のみ)\",\n \"failoverAlertNotifications\": \"フェイルオーバー通知\",\n \"failoverAlertNotificationsDescription\": \"プロバイダーの自動フェイルオーバー完了時にシステム通知を送信します\",\n \"trayBadgeNotifications\": \"トレイアラート表示\",\n \"trayBadgeNotificationsDescription\": \"未読アラートがある場合、トレイアイコンをアラート状態に切り替え、メニュー上部にアラート項目を表示します\",\n \"workspaceAlertFirst\": \"ワークスペースアラートを最優先\",\n \"workspaceAlertFirstDescription\": \"有効にすると「今日のワークスペース」の上部にアラートカードを表示します。無効時はトレイ/システム通知のみでアラートを通知します\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"プロジェクトコックピット\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"アラート\",\n \"board\": \"プロジェクトボード\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n }\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローオーケストレーション\",\n \"title\": \"ワークフローオーケストレーション\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"projectConfig\": \"プロジェクト設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"myProjects\": \"マイプロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"クイックスタート\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"プロジェクトを追加\",\n \"desc\": \"すべての機能はプロジェクトを中心に展開します。サイドバーの「マイプロジェクト → プロジェクトを追加」からリポジトリを追加すると、OpenSunstar が AI 設定状態を自動スキャンします。\"\n },\n \"step2\": {\n \"title\": \"プロジェクトコックピット — 今日は問題ある?\",\n \"desc\": \"「アラート」は一つの質問に答えます:今日は問題があるか。何もなければ「今日は問題なし」と表示。問題がないのが最高のニュースです。「プロジェクトボード」には集計指標とアセットマトリクスがあり、概要コンテンツは起動時の一目を占領しません。\"\n },\n \"step3\": {\n \"title\": \"AIアセット設定 — プロジェクトにアセットを適用\",\n \"desc\": \"「プロジェクト設定 → AIアセット設定」で MCP サーバー、Skills、Prompts などのアセットをプロジェクトに関連付けます。サイドバーの「Agent 設定」はグローバルライブラリを管理し、ここではそのプロジェクトへの関連付けを管理します。\"\n },\n \"step4\": {\n \"title\": \"ワークフローオーケストレーション — 実行可能なフローを構築\",\n \"desc\": \"「プロジェクト設定 → ワークフローオーケストレーション」でステージ、プリセット、変更実行プランを設定します。方法論検出、プリセット編成、カスタム編成、デザイン契約——4つの独立したディメンション、必要に応じて選択でき、順序依存はありません。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"AIアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "98907b414ef5b16259df839435887d4c2cac4df4": {"t": 1785761035.3389442, "n": 143967, "h": "8e54dd2909afef0e", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"notificationPreferences\": \"通知設定\",\n \"budgetAlertNotifications\": \"予算超過通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency の予算アラート時にシステム通知を送信します(warning はアプリ内のみ)\",\n \"failoverAlertNotifications\": \"フェイルオーバー通知\",\n \"failoverAlertNotificationsDescription\": \"プロバイダーの自動フェイルオーバー完了時にシステム通知を送信します\",\n \"trayBadgeNotifications\": \"トレイアラート表示\",\n \"trayBadgeNotificationsDescription\": \"未読アラートがある場合、トレイアイコンをアラート状態に切り替え、メニュー上部にアラート項目を表示します\",\n \"workspaceAlertFirst\": \"ワークスペースアラートを最優先\",\n \"workspaceAlertFirstDescription\": \"有効にすると「今日のワークスペース」の上部にアラートカードを表示します。無効時はトレイ/システム通知のみでアラートを通知します\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"プロジェクトコックピット\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"アラート\",\n \"board\": \"プロジェクトボード\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n }\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローオーケストレーション\",\n \"title\": \"ワークフローオーケストレーション\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"projectConfig\": \"プロジェクト設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"myProjects\": \"マイプロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"クイックスタート\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"プロジェクトを追加\",\n \"desc\": \"すべての機能はプロジェクトを中心に展開します。サイドバーの「マイプロジェクト → プロジェクトを追加」からリポジトリを追加すると、OpenSunstar が AI 設定状態を自動スキャンします。\"\n },\n \"step2\": {\n \"title\": \"プロジェクトコックピット — 今日は問題ある?\",\n \"desc\": \"「アラート」は一つの質問に答えます:今日は問題があるか。何もなければ「今日は問題なし」と表示。問題がないのが最高のニュースです。「プロジェクトボード」には集計指標とアセットマトリクスがあり、概要コンテンツは起動時の一目を占領しません。\"\n },\n \"step3\": {\n \"title\": \"AIアセット設定 — プロジェクトにアセットを適用\",\n \"desc\": \"「プロジェクト設定 → AIアセット設定」で MCP サーバー、Skills、Prompts などのアセットをプロジェクトに関連付けます。サイドバーの「Agent 設定」はグローバルライブラリを管理し、ここではそのプロジェクトへの関連付けを管理します。\"\n },\n \"step4\": {\n \"title\": \"ワークフローオーケストレーション — 実行可能なフローを構築\",\n \"desc\": \"「プロジェクト設定 → ワークフローオーケストレーション」でステージ、プリセット、変更実行プランを設定します。方法論検出、プリセット編成、カスタム編成、デザイン契約——4つの独立したディメンション、必要に応じて選択でき、順序依存はありません。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"AIアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "94cc956b71f8071032180d451e1e9bd24d6bbf02": {"t": 1785761037.1099834, "n": 143798, "h": "1dfba2a2850ef0c5", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"notificationPreferences\": \"通知設定\",\n \"budgetAlertNotifications\": \"予算超過通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency の予算アラート時にシステム通知を送信します(warning はアプリ内のみ)\",\n \"failoverAlertNotifications\": \"フェイルオーバー通知\",\n \"failoverAlertNotificationsDescription\": \"プロバイダーの自動フェイルオーバー完了時にシステム通知を送信します\",\n \"trayBadgeNotifications\": \"トレイアラート表示\",\n \"trayBadgeNotificationsDescription\": \"未読アラートがある場合、トレイアイコンをアラート状態に切り替え、メニュー上部にアラート項目を表示します\",\n \"workspaceAlertFirst\": \"ワークスペースアラートを最優先\",\n \"workspaceAlertFirstDescription\": \"有効にすると「今日のワークスペース」の上部にアラートカードを表示します。無効時はトレイ/システム通知のみでアラートを通知します\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"今日のワークスペース\",\n \"board\": \"プロジェクトボード\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n }\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローと方法論\",\n \"title\": \"ワークフローと方法論\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"アラート優先ホーム — 今日やることは?\",\n \"desc\": \"今日ワークスペースは一つの質問に答えます:今日やることはあるか。何もなければ「今日は問題なし」と表示します — 問題がないのが最高のニュース、健康な人に健康診断書は見せません。\"\n },\n \"step2\": {\n \"title\": \"命 / 金 / 事 — 3 種のアラート\",\n \"desc\": \"命(赤)= プロバイダーのフェイルオーバー、コンテキストが失われる; 金(黄)= 予算超過 critical/emergency; 事(青)= 設定のギャップやドリフト。命は常に最優先。\"\n },\n \"step3\": {\n \"title\": \"アクションボタン — ワンクリックで修復ページへ\",\n \"desc\": \"各アラートカードにはアクションボタンがあります:「修復」「設定」「予算調整」。ワンクリックで「プロジェクトアセット設定」の該当セクションに直接移動、タブを探す必要はありません。\"\n },\n \"step4\": {\n \"title\": \"概要コンテンツ — 「プロジェクトボード」へ切替\",\n \"desc\": \"集計指標カード、段階分布、健全性リスト、アセットマトリクスはすべて「プロジェクトボード」タブにあります。今日には手を付けるものだけ残し、概要コンテンツは起動時の一目を占領しません。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"プロジェクトアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "68b15d0a20e4bbb7187e0f98dc803e326dd4c818": {"t": 1785761038.9879625, "n": 142982, "h": "47a4ca4a75473b1c", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"今日のワークスペース\",\n \"board\": \"プロジェクトボード\",\n \"assetsMatrix\": \"AI アセット一覧\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n }\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローと方法論\",\n \"title\": \"ワークフローと方法論\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「ドリフトを修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"設定有効化率 — 「AI アセット一覧」にあります\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データは「AI アセット一覧」タブにあります。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"プロジェクトアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "511c5fd9d7c9d9334567566eb26f5e38634409a4": {"t": 1785761040.8208354, "n": 140315, "h": "c8de64c87ea9d90e", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Claude Code で maintain-repo-wiki Skill を使用して wiki 内容を入力してください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"今日のワークスペース\",\n \"board\": \"プロジェクトボード\",\n \"assetsMatrix\": \"AI アセット一覧\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローと方法論\",\n \"title\": \"ワークフローと方法論\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「ドリフトを修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"設定有効化率 — 「AI アセット一覧」にあります\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データは「AI アセット一覧」タブにあります。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"プロジェクトアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "617cc0762b403a92b13cbf9675c4d7956b214203": {"t": 1785761042.6205635, "n": 139803, "h": "cce5ff6404bff5c9", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Claude Code で maintain-repo-wiki Skill を使用して wiki 内容を入力してください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプトと指示\",\n \"title\": \"プロンプトと指示\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"今日のワークスペース\",\n \"board\": \"プロジェクトボード\",\n \"assetsMatrix\": \"AI アセット一覧\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローと方法論\",\n \"title\": \"ワークフローと方法論\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「ドリフトを修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"設定有効化率 — 「AI アセット一覧」にあります\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データは「AI アセット一覧」タブにあります。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"projectAiConfig\": {\n \"title\": \"プロジェクト · AI 設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n }\n}\n"}, "868faef7584874ecd336fee2a06909c863fe1485": {"t": 1785761044.478493, "n": 135457, "h": "e360b5a737b33a87", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Claude Code で maintain-repo-wiki Skill を使用して wiki 内容を入力してください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプトと指示\",\n \"title\": \"プロンプトと指示\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"クロスプロジェクト ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"プロジェクトのリスク、進捗、AI設定状態を一元管理し、重要な問題に優先的に対応\",\n \"sidebar\": {\n \"section\": \"クロスプロジェクト ワークスペース\",\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"クロスプロジェクト ガバナンス\",\n \"sidebar\": \"プロジェクトガバナンス\",\n \"title\": \"プロジェクトガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"クロスAgent設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n }\n}\n"}, "10f6ed197fd13c08e1b17f58989709eb75bfe28b": {"t": 1785761046.484876, "n": 135132, "h": "91f42d500233b8a6", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"Claude Code で maintain-repo-wiki Skill を使用して wiki 内容を入力してください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプトと指示\",\n \"title\": \"プロンプトと指示\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"クロスプロジェクト ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"プロジェクトのリスク、進捗、AI設定状態を一元管理し、重要な問題に優先的に対応\",\n \"sidebar\": {\n \"section\": \"クロスプロジェクト ワークスペース\",\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"クロスプロジェクト ガバナンス\",\n \"sidebar\": \"プロジェクトガバナンス\",\n \"title\": \"プロジェクトガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"クロスAgent設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n }\n}\n"}, "6478a54d051f981798fde49e0df8f2c516051686": {"t": 1785761048.1781847, "n": 133340, "h": "8b65e41ee317be9c", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプトと指示\",\n \"title\": \"プロンプトと指示\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"クロスプロジェクト ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"プロジェクトのリスク、進捗、AI設定状態を一元管理し、重要な問題に優先的に対応\",\n \"sidebar\": {\n \"section\": \"クロスプロジェクト ワークスペース\",\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"クロスプロジェクト ガバナンス\",\n \"sidebar\": \"プロジェクトガバナンス\",\n \"title\": \"プロジェクトガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"クロスAgent設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n }\n}\n"}, "6f0e83459eeaa036a44cb4538e43a042113521f5": {"t": 1785761050.2297146, "n": 133000, "h": "3563494bea40567c", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプトと指示\",\n \"title\": \"プロンプトと指示\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"クロスプロジェクト ワークスペース\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"プロジェクトのリスク、進捗、AI設定状態を一元管理し、重要な問題に優先的に対応\",\n \"sidebar\": {\n \"section\": \"クロスプロジェクト ワークスペース\",\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"クロスプロジェクト ガバナンス\",\n \"sidebar\": \"プロジェクトガバナンス\",\n \"title\": \"プロジェクトガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"クロスAgent設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n }\n}\n"}, "38ba082d679b4679a1de50149b8e2f1359482d1a": {"t": 1785761052.090184, "n": 131236, "h": "4018c780a8fc4d26", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"ワークフローとガバナンス\",\n \"title\": \"ワークフローとガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n }\n}\n"}, "3258787740822bfaf1a48cde64214b5c91ed0fe8": {"t": 1785761054.8226197, "n": 131256, "h": "eb4739b650f8b388", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"ワークフローとガバナンス\",\n \"title\": \"ワークフローとガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n }\n}\n"}, "d2ef60c6894b12cf8aa9f12d984c2e1dc0db18a8": {"t": 1785761056.5060163, "n": 130581, "h": "a19b24c6d774b11f", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"ワークフローとガバナンス\",\n \"title\": \"ワークフローとガバナンス\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n }\n}\n"}, "54f90b4ee16fd96dc0e9aa296015ce055dd91a91": {"t": 1785761058.4272702, "n": 130162, "h": "bd1a75a43834842f", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\",\n \"lowScore\": \"設定の完全度が低い({{score}} 点)\"\n },\n \"action\": {\n \"repair\": \"確認して修復\",\n \"configure\": \"アセットを設定\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"方法論と編成\",\n \"title\": \"方法論と編成\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論フレームワーク\",\n \"tabOrchestration\": \"プリセット編成\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"カスタム編成\",\n \"recipeEntry\": \"カスタム編成ツール\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"recipeComposer\": {\n \"title\": \"カスタム編成ツール\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"ワークスペースへようこそ\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"設定状態 — 一目で全体像を把握\",\n \"desc\": \"上部のサマリーで、全プロジェクトの AI 設定状態を正常、要確認、異常、未スキャンに分けて表示します。\"\n },\n \"step2\": {\n \"title\": \"対応が必要なプロジェクト — すばやく特定\",\n \"desc\": \"確認が必要なプロジェクトが、分かりやすい理由説明つきで下に表示されます。「確認して修復」または「アセットを設定」をクリックして直接操作できます。\"\n },\n \"step3\": {\n \"title\": \"ガバナンス概要 — 詳細指標\",\n \"desc\": \"設定不一致のプロジェクト、有効化率、有効化アイテムなどの詳細データを表示します。カードにマウスを乗せると説明が表示されます。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n }\n}\n"}, "cfe34bec32d20e4ca61eb30ac638d22be693d539": {"t": 1785761060.3272452, "n": 126583, "h": "3bc1b4c3cc8d767b", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"方法論と編成\",\n \"title\": \"方法論と編成\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論フレームワーク\",\n \"tabOrchestration\": \"プリセット編成\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"カスタム編成\",\n \"recipeEntry\": \"カスタム編成ツール\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"recipeComposer\": {\n \"title\": \"カスタム編成ツール\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n }\n}\n"}, "ce25efac17f62adb9924d2d378a154c347adb96b": {"t": 1785761062.120451, "n": 124942, "h": "686fe7b5424fca58", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"方法論と編成\",\n \"title\": \"方法論と編成\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論フレームワーク\",\n \"tabOrchestration\": \"プリセット編成\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"カスタム編成\",\n \"recipeEntry\": \"カスタム編成ツール\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n }\n}\n"}, "6a1a33d5d10503543bb213892f0c9989181f3c0f": {"t": 1785761064.1507406, "n": 124224, "h": "bcb1c3fec27fc68c", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"方法論と編成\",\n \"title\": \"方法論と編成\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論フレームワーク\",\n \"tabOrchestration\": \"プリセット編成\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"カスタム編成\",\n \"recipeEntry\": \"カスタム編成ツール\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n }\n}\n"}, "06954ff3d8e964440c35ff78cf4ffa1615362bd8": {"t": 1785761066.054767, "n": 124236, "h": "9c11132c9b7d5cd5", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebarSection\": \"プロジェクト設定\",\n \"sidebar\": \"設定ディメンション\",\n \"title\": \"プロジェクト設定ディメンション\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論フレームワーク\",\n \"tabOrchestration\": \"プリセット編成\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"カスタム編成\",\n \"recipeEntry\": \"カスタム編成ツール\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"syncBackup\": \"同期バックアップ\"\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n }\n}\n"}, "bccae335cf5dddbae6a0d8ebc8f19312098c7d32": {"t": 1785761067.8656743, "n": 119754, "h": "b6e53f0cc82092da", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"公式プロバイダーはブラウザログインまたはサブスクリプション認証が必要です。Key のみでは接続できません。プロバイダー管理で OAuth / 公式設定を完了してください。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"Key は OS キーチェーン(Windows Credential Manager / macOS Keychain)に安全に保存され、平文でディスクに書き込まれません\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"Anthropic 検証は約 1 token 消費。OpenAI 互換ゲートウェイは成功後にモデル一覧を展開できます\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"マイプロバイダー\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\"\n },\n \"category\": {\n \"custom\": \"カスタム\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Phase 1 では中国公式プリセットカードはありません。OpenRouter を使うか、「カスタム設定」で国内 Gemini 互換エンドポイントを入力してください。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"カスタムゲートウェイ:最小項目を入力して接続。詳細設定はプロバイダー管理で編集できます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n }\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n }\n}\n"}, "4523364fd77746ea51f75a5c0b355c2c898d71c9": {"t": 1785761073.4692707, "n": 116079, "h": "d7e4d5a3f00335bd", "c": "{\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"OAuth 認証センター\",\n \"description\": \"Claude Code で他のサブスクリプションをご利用いただけます。コンプライアンスリスクにご注意ください。\",\n \"beta\": \"Beta\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"サードパーティ切替時に公式ログインを保持\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"オンにすると、サードパーティ API を使用する際に Codex アプリの公式プラグインやスマホからのリモート操作などの機能を利用できます。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"プロンプト\",\n \"title\": \"{{appName}} プロンプト管理\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"ワークスペースファイル\",\n \"manage\": \"ワークスペース\",\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"エージェント\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\"\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n }\n}\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785846934.4994528, "n": 146574, "h": "7126dfc96745d42f", "c": "{\n \"projectWiki\": {\n \"title\": \"プロジェクト Wiki / ナレッジベースライン\",\n \"subtitle\": \"人間とエージェントが共に消費できるエンジニアリングナレッジベースライン\",\n \"loading\": \"Wiki をスキャン中…\",\n \"notInitialized\": \"wiki/index.md が検出されません\",\n \"pageCount\": \"{{count}} ページ\",\n \"sourceRefs\": \"{{count}} 件のソース参照\",\n \"questions\": \"{{count}} 件の未解決質問\",\n \"lastUpdated\": \"最終更新\",\n \"status\": {\n \"missing\": \"未初期化\",\n \"scaffolded\": \"初期化済み\",\n \"effective\": \"最新\",\n \"drifted\": \"変更あり\",\n \"invalid\": \"Lint 失敗\"\n },\n \"quality\": {\n \"NA\": \"N/A\",\n \"L1\": \"L1 · オリエンテーション\",\n \"L2\": \"L2 · インテグレーション\",\n \"L3\": \"L3 · オペレーション\"\n },\n \"coverage\": {\n \"corePages\": \"コアページ\",\n \"componentPages\": \"コンポーネント\",\n \"flowPages\": \"フロー\",\n \"apiPages\": \"API\",\n \"runbookPages\": \"運用手順書\"\n },\n \"actions\": {\n \"init\": \"Wiki を初期化\",\n \"lint\": \"Lint を実行\",\n \"refresh\": \"更新\",\n \"openInEditor\": \"エディタで開く\",\n \"previewInit\": \"初期化をプレビュー\"\n },\n \"changedFiles\": {\n \"coldStart\": \"Wiki 初期化直後、変更マッピングはまだ有効ではありません\",\n \"coldStartProgress\": \"有効な source_files ページ: {{current}}/{{threshold}}\",\n \"coldStartGuidance\": \"「プロジェクト Wiki を生成」をクリックし、設定済みの AI プロバイダーで生成してレビューしてください\",\n \"affectedPages\": \"{{count}} 件のソース変更が {{pages}} 個の wiki ページに影響\",\n \"unmapped\": \"{{count}} 件の未マップ変更\",\n \"noChanges\": \"ソース変更なし、wiki ページは最新です\"\n },\n \"lint\": {\n \"passed\": \"Lint 合格\",\n \"failed\": \"Lint 失敗: {{errors}} 件のエラー\",\n \"warnings\": \"{{count}} 件の警告\",\n \"qualityLevel\": \"品質レベル: {{level}}\"\n },\n \"init\": {\n \"previewTitle\": \"Wiki 初期化プレビュー\",\n \"willCreate\": \"{{count}} 個のファイルを作成\",\n \"alreadyExists\": \"{{count}} 個のファイルは既存(スキップ)\",\n \"confirm\": \"初期化を確認\",\n \"success\": \"Wiki 初期化完了、{{count}} 個のファイルを作成\",\n \"blocked\": \"安全監査でブロック\"\n },\n \"accept\": {\n \"success\": \"Wiki を承認し、Commit 同期ベースラインを作成しました\"\n },\n \"candidates\": {\n \"importSuccess\": \"{{count}} ファイルをインポートしました。正式 Wiki の承認に進めます\"\n },\n \"generator\": {\n \"success\": \"プロジェクト Wiki を生成・インポートしました({{count}} ページ)。承認を続けてください\"\n }\n },\n \"app\": {\n \"title\": \"OpenSunstar\",\n \"description\": \"Claude Code・Codex・Gemini CLI のためのオールインワンアシスタント\"\n },\n \"common\": {\n \"add\": \"追加\",\n \"edit\": \"編集\",\n \"delete\": \"削除\",\n \"save\": \"保存\",\n \"saving\": \"保存中...\",\n \"cancel\": \"キャンセル\",\n \"confirm\": \"確認\",\n \"close\": \"閉じる\",\n \"done\": \"完了\",\n \"settings\": \"設定\",\n \"about\": \"バージョン情報\",\n \"version\": \"バージョン\",\n \"loading\": \"読み込み中...\",\n \"notInstalled\": \"未インストール\",\n \"success\": \"成功\",\n \"error\": \"エラー\",\n \"unknown\": \"不明\",\n \"enterValidValue\": \"有効な値を入力してください\",\n \"clear\": \"クリア\",\n \"toggleTheme\": \"テーマを切り替え\",\n \"format\": \"フォーマット\",\n \"formatSuccess\": \"整形しました\",\n \"formatError\": \"整形に失敗しました: {{error}}\",\n \"copy\": \"コピー\",\n \"view\": \"表示\",\n \"back\": \"戻る\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"import\": \"インポート\",\n \"all\": \"すべて\",\n \"search\": \"検索\",\n \"reset\": \"リセット\",\n \"actions\": \"操作\",\n \"deleting\": \"削除中...\",\n \"auto\": \"自動\",\n \"enabled\": \"有効\",\n \"notSet\": \"未設定\"\n },\n \"firstRunNotice\": {\n \"title\": \"OpenSunstar へようこそ\",\n \"bodyDefault\": \"OpenSunstar は Claude Code / Codex / Gemini CLI の複数プロバイダーをワンクリックで切り替えられるツールです。すでにこれらのツールを設定済みの場合、OpenSunstar は現在の設定を「default」という名前のプロバイダーとして自動的に保存するので、既存の設定が失われることはありません。\",\n \"bodyOfficial\": \"リストには「Official(公式)」プリセットも用意されており、公式バージョンに戻したくなったらクリックするだけで切り替えられます。切り替える前に現在の設定は自動で default にバックアップされるので、自由に行き来できます。これが OpenSunstar の仕組みです 😊\",\n \"confirm\": \"了解しました\"\n },\n \"apiKeyInput\": {\n \"placeholder\": \"API Key を入力\",\n \"show\": \"API Key を表示\",\n \"hide\": \"API Key を隠す\"\n },\n \"jsonEditor\": {\n \"mustBeObject\": \"設定はオブジェクト形式の JSON で入力してください(配列や他の型は不可)\",\n \"invalidJson\": \"JSON 形式が正しくありません\"\n },\n \"commonConfig\": {\n \"guideTitle\": \"共通設定スニペットとは?\",\n \"guidePurpose\": \"異なるプロバイダー間でプラグインや環境変数などの非機密設定を共有するための機能です。プロバイダーを切り替えてもこれらの設定は失われません。\",\n \"guideUsage\": \"使い方:① 「編集内容から抽出」をクリックして共通部分を保存 ② 新規プロバイダー作成時に「共通設定を書き込む」をチェック\",\n \"guideReExtract\": \"新しいプラグインや Hook をインストールした場合は、共通設定を再抽出して他のプロバイダーに同期してください。\",\n \"guideReassurance\": \"ご安心ください:元の設定はデフォルトプロバイダーに安全に保存されており、失われることはありません。\",\n \"emptyTitle\": \"共通設定スニペットがまだありません\",\n \"emptyHint\": \"下の「編集内容から抽出」ボタンをクリックして、現在の設定から再利用可能な部分を抽出してください\"\n },\n \"claudeConfig\": {\n \"configLabel\": \"Claude Code settings.json (JSON) *\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンのとき settings.json にマージされます\",\n \"fullSettingsHint\": \"Claude Code の settings.json 全文\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"hideAttribution\": \"AI署名を非表示\",\n \"enableTeammates\": \"Teammates モード\",\n \"enableToolSearch\": \"Tool Search を有効化\",\n \"effortMax\": \"最大強度思考\",\n \"disableAutoUpgrade\": \"自動アップグレードを無効化\"\n },\n \"header\": {\n \"viewOnGithub\": \"GitHub で見る\",\n \"toggleDarkMode\": \"ダークモードに切り替え\",\n \"toggleLightMode\": \"ライトモードに切り替え\",\n \"addProvider\": \"プロバイダーを追加\",\n \"switchToChinese\": \"中国語に切り替え\",\n \"switchToEnglish\": \"英語に切り替え\",\n \"enterEditMode\": \"編集モードに入る\",\n \"exitEditMode\": \"編集モードを終了\",\n \"windowMinimize\": \"ウィンドウを最小化\",\n \"windowMaximize\": \"ウィンドウを最大化\",\n \"windowRestore\": \"ウィンドウを元に戻す\",\n \"windowClose\": \"ウィンドウを閉じる\"\n },\n \"provider\": {\n \"tabProvider\": \"プロバイダー\",\n \"tabUniversal\": \"統一プロバイダー\",\n \"noProviders\": \"まだプロバイダーがありません\",\n \"noProvidersDescription\": \"既存の設定がある場合は「現在の設定をインポート」をクリックしてください。すべてのデータが default プロバイダーに安全に保存されます\",\n \"noProvidersDescriptionSnippet\": \"API キーとリクエスト URL 以外のデータ(プラグインなど)は共通設定スニペットに保存され、プロバイダー間で共有できます\",\n \"importCurrent\": \"現在の設定をインポート\",\n \"importFromClaude\": \"Claude Code の既存プロバイダーをインポート\",\n \"importCurrentDescription\": \"現在使用中の設定をデフォルトプロバイダーとしてインポート\",\n \"currentlyUsing\": \"現在使用中\",\n \"enable\": \"有効化\",\n \"inUse\": \"使用中\",\n \"blockedByProxyHint\": \"プロキシ引き継ぎモードでは公式プロバイダーに切り替えできません\",\n \"editProvider\": \"プロバイダーを編集\",\n \"editProviderHint\": \"保存すると現在のプロバイダーにすぐ反映されます。\",\n \"deleteProvider\": \"プロバイダーを削除\",\n \"addNewProvider\": \"新しいプロバイダーを追加\",\n \"addClaudeProvider\": \"Claude Code プロバイダーを追加\",\n \"addCodexProvider\": \"Codex プロバイダーを追加\",\n \"addGeminiProvider\": \"Gemini プロバイダーを追加\",\n \"addOpenCodeProvider\": \"OpenCode プロバイダーを追加\",\n \"addToConfig\": \"追加\",\n \"removeFromConfig\": \"削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"isDefault\": \"現在のデフォルト\",\n \"inConfig\": \"追加済み\",\n \"addProviderHint\": \"一覧にすばやく切り替えられるよう、ここに情報を入力してください。\",\n \"editClaudeProvider\": \"Claude Code プロバイダーを編集\",\n \"editCodexProvider\": \"Codex プロバイダーを編集\",\n \"configError\": \"設定エラー\",\n \"notConfigured\": \"公式サイト用に未設定\",\n \"applyToClaudePlugin\": \"Claude プラグインに適用\",\n \"removeFromClaudePlugin\": \"Claude プラグインから解除\",\n \"dragToReorder\": \"ドラッグで並べ替え\",\n \"dragHandle\": \"ドラッグで並べ替え\",\n \"searchPlaceholder\": \"名前・メモ・URLで検索...\",\n \"searchAriaLabel\": \"プロバイダーを検索\",\n \"searchScopeHint\": \"名前・メモ・URL を対象に検索します。\",\n \"searchCloseHint\": \"Esc で閉じる\",\n \"searchCloseAriaLabel\": \"検索を閉じる\",\n \"noSearchResults\": \"一致するプロバイダーがありません。\",\n \"duplicate\": \"複製\",\n \"sortUpdateFailed\": \"並び順の更新に失敗しました\",\n \"configureUsage\": \"利用状況を設定\",\n \"officialPartner\": \"公式パートナー\",\n \"managedByHermes\": \"Hermes 管理\",\n \"managedByHermesHint\": \"Hermes の providers: dict で定義されています。Hermes Web UI で編集または削除してください。\",\n \"openTerminal\": \"ターミナルを開く\",\n \"terminalOpened\": \"ターミナルを開きました\",\n \"terminalOpenFailed\": \"ターミナルを開けませんでした\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例: Claude Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"例: 会社用アカウント\",\n \"configJson\": \"Config JSON\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfigButton\": \"共通設定を編集\",\n \"configJsonHint\": \"Claude Code の設定をすべて入力してください\",\n \"editCommonConfigTitle\": \"共通設定スニペットを編集\",\n \"editCommonConfigHint\": \"共通設定スニペットは、この機能をオンにしたすべてのプロバイダーへマージされます\",\n \"addProvider\": \"プロバイダーを追加\",\n \"sortUpdated\": \"並び順を更新しました\",\n \"usageSaved\": \"利用状況の設定を保存しました\",\n \"usageSaveFailed\": \"利用状況設定の保存に失敗しました\",\n \"geminiConfig\": \"Gemini 設定\",\n \"geminiConfigHint\": \".env 形式で Gemini を設定してください\",\n \"form\": {\n \"gemini\": {\n \"model\": \"モデル\",\n \"oauthTitle\": \"OAuth 認証モード\",\n \"oauthHint\": \"Google 公式は OAuth 個人認証を使用するため API Key は不要です。初回利用時にブラウザが開きます。\",\n \"apiKeyPlaceholder\": \"Gemini API Key を入力\"\n }\n }\n },\n \"claudeCode\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"codex\": {\n \"needsRouting\": \"ルーティングが必要\",\n \"noRoutingSupport\": \"ルーティング非対応\"\n },\n \"claudeDesktop\": {\n \"officialNotice\": \"Claude Desktop の公式プロバイダーは内蔵の 1P サインインを使用します。API キーやエンドポイントの設定は不要です。\",\n \"mode\": \"モデル処理方式\",\n \"modeDirect\": \"直結\",\n \"modeProxy\": \"ルーティング必要\",\n \"modelMappingToggle\": \"モデルマッピングが必要\",\n \"modelMappingOffHint\": \"プロバイダーが Claude Desktop の三つの役割 ID(claude-sonnet-* / claude-opus-* / claude-haiku-*)を受け付ける場合のみ直結できます。それ以外のモデル名(claude-3-5-sonnet-… などの旧式 ID を含む)はこのスイッチを有効にしてマッピングを使ってください。\",\n \"modelMappingOnHint\": \"Claude Desktop は claude-sonnet-* / claude-opus-* / claude-haiku-* の三つの役割 ID のみ受け付けます。有効にすると OpenSunstar がこの三役割をプロバイダーの実モデルにマッピングし、使用中はローカルルーティングを起動したままにします。\",\n \"routeMapTitle\": \"モデルマッピング\",\n \"routeMapHint\": \"Sonnet・Opus・Haiku の各区分に実際のリクエストモデルを入力してください。DeepSeek や Kimi などのブランド名はメニュー表示名に入れられます。空欄の区分は Sonnet(または最初に入力した区分)のモデルを引き継ぐため、サブ agent が呼び出す Haiku が常に利用可能になります。\",\n \"routeModelLabel\": \"モデル役割\",\n \"routeRoleSonnet\": \"Sonnet\",\n \"routeRoleOpus\": \"Opus\",\n \"routeRoleHaiku\": \"Haiku\",\n \"labelOverrideLabel\": \"メニュー表示名\",\n \"upstreamModelLabel\": \"リクエストモデル\",\n \"supports1mLabel\": \"1M 対応を宣言\",\n \"supports1mShort\": \"1M\",\n \"directModelListTitle\": \"Claude Desktop モデルを手動指定(高度・任意)\",\n \"directModelListCollapsedHint\": \"ネイティブ Claude モデルのプロバイダーでは通常不要です。Claude Desktop が /v1/models を自動取得します。\",\n \"directModelListHint\": \"プロバイダーの /v1/models が使えない、または Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を返さない場合だけ入力してください。1M をオンにすると Claude Desktop に 1M コンテキスト対応を宣言します。\",\n \"directModelInvalid\": \"直結モデルは Claude Desktop が認識できる Sonnet / Opus / Haiku モデル ID を使う必要があります\",\n \"addModel\": \"モデルを追加\",\n \"addRoute\": \"モデルを追加\",\n \"routeInvalid\": \"モデル役割を選択し、リクエストモデルを入力してください\",\n \"routesRequired\": \"少なくとも 1 つのモデルマッピングが必要です\",\n \"statusTitle\": \"Claude Desktop 設定の確認が必要です\",\n \"statusUnsupported\": \"このプラットフォームでは Claude Desktop 3P 設定の書き込みはまだサポートされていません。\",\n \"statusStaleRawModels\": \"Claude Desktop profile に Sonnet / Opus / Haiku の役割ファミリー以外のモデル ID が含まれています。新しい Claude Desktop では拒否される可能性があります。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"statusMissingRouteMappings\": \"現在のプロバイダーはモデルマッピングを有効にしていますが、有効なルートがありません。プロバイダーを編集し、少なくとも 1 つのマッピングを追加してください。\",\n \"statusGatewayTokenMissing\": \"ローカルルーティング token がまだ生成されていません。このプロバイダーへ再度切り替えると新しい token が書き込まれます。\",\n \"statusBaseUrlMismatch\": \"Claude Desktop profile の URL が現在のプロバイダーと一致しません。現在: {{actual}}、期待値: {{expected}}。現在のプロバイダーへ再度切り替えると修復できます。\",\n \"route\": {\n \"tooltip\": {\n \"active\": \"Claude Desktop ローカルルーティングは起動中です - {{address}}:{{port}}\",\n \"inactive\": \"モデルマッピングや形式変換が必要なプロバイダー向けに Claude Desktop ローカルルーティングを起動します。設定アドレス: {{address}}:{{port}}\"\n }\n }\n },\n \"notifications\": {\n \"providerAdded\": \"プロバイダーを追加しました\",\n \"providerSaved\": \"プロバイダー設定を保存しました\",\n \"providerDeleted\": \"プロバイダーを削除しました\",\n \"switchSuccess\": \"切り替え成功!\",\n \"codexRestartRequired\": \"切り替えました。反映するにはクライアントを再起動してください\",\n \"claudeDesktopRestartRequired\": \"切り替えました。反映するには Claude Desktop を再起動してください\",\n \"claudeDesktopProxyRestartRequired\": \"切り替えました。OpenSunstar を起動したまま Claude Desktop を再起動してください\",\n \"addToConfigSuccess\": \"設定に追加しました\",\n \"removeFromConfigSuccess\": \"設定から削除しました\",\n \"switchFailedTitle\": \"切り替えに失敗しました\",\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"autoImported\": \"既存設定からデフォルトプロバイダーを自動作成しました\",\n \"addFailed\": \"プロバイダーの追加に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\",\n \"appliedToClaudePlugin\": \"Claude プラグインに適用しました\",\n \"removedFromClaudePlugin\": \"Claude プラグインから削除しました\",\n \"syncClaudePluginFailed\": \"Claude プラグインとの同期に失敗しました\",\n \"skipClaudeOnboardingFailed\": \"Claude Code の初回確認スキップに失敗しました\",\n \"clearClaudeOnboardingSkipFailed\": \"Claude Code の初回確認の復元に失敗しました\",\n \"updateSuccess\": \"プロバイダーを更新しました\",\n \"updateFailed\": \"プロバイダーの更新に失敗しました: {{error}}\",\n \"deleteSuccess\": \"プロバイダーを削除しました\",\n \"deleteFailed\": \"プロバイダーの削除に失敗しました: {{error}}\",\n \"settingsSaved\": \"設定を保存しました\",\n \"settingsSaveFailed\": \"設定の保存に失敗しました: {{error}}\",\n \"proxyRequiredForSwitch\": \"このプロバイダーは{{reason}}、ルーティングサービスが必要です。先にルーティングを起動してください\",\n \"proxyReasonCopilot\": \"GitHub Copilot を Claude プロバイダーとして使用しており\",\n \"proxyReasonOpenAIChat\": \"OpenAI Chat API フォーマットを使用しており\",\n \"proxyReasonOpenAIResponses\": \"OpenAI Responses API フォーマットを使用しており\",\n \"proxyReasonFullUrl\": \"完全 URL 接続モードが有効になっており\",\n \"openAIFormatHint\": \"このプロバイダーは OpenAI 互換フォーマットを使用しており、ルーティングサービスの有効化が必要です\",\n \"copilotProxyHint\": \"GitHub Copilot を Claude プロバイダーとして使用する場合、ローカルルーティングが常に必要です。ルーティングは現在のモデルに応じて Chat Completions または Responses を自動的に選択します。\",\n \"openLinkFailed\": \"リンクを開けませんでした\",\n \"openclawModelsRegistered\": \"モデルが /model リストに登録されました\",\n \"openclawDefaultModelSet\": \"デフォルトモデルに設定しました\",\n \"openclawDefaultModelSetFailed\": \"デフォルトモデルの設定に失敗しました\",\n \"openclawNoModels\": \"モデルが設定されていません\",\n \"backfillWarning\": \"切り替え成功しましたが、前のプロバイダーへの設定保存に失敗しました\",\n \"windowControlFailed\": \"ウィンドウ操作に失敗しました: {{error}}\",\n \"officialBlockedByProxy\": \"ローカルルーティングモード中は公式プロバイダーに切り替えできません。ルーティング経由で公式 API にアクセスするとアカウントが停止される可能性があります。\",\n \"proxyOfficialWarning\": \"現在のプロバイダー {{name}} は公式です。ローカルルーティングを使用する前にサードパーティプロバイダーに切り替えてください。\"\n },\n \"confirm\": {\n \"deleteProvider\": \"プロバイダーを削除\",\n \"deleteProviderMessage\": \"プロバイダー「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。\",\n \"removeProvider\": \"プロバイダーを解除\",\n \"removeProviderMessage\": \"プロバイダー「{{name}}」を設定から解除してもよろしいですか?\\n\\n解除後、このプロバイダーは無効になりますが、設定データは OpenSunstar に保持されます。いつでも再追加できます。\",\n \"proxy\": {\n \"title\": \"ローカルルーティングの有効化\",\n \"message\": \"ローカルルーティングは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\n適切な設定方法については、関連ドキュメントまたはプロバイダーにご相談ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"failover\": {\n \"title\": \"フェイルオーバーの有効化\",\n \"message\": \"フェイルオーバーは上級機能です。有効にする前に、その仕組みを理解していることをご確認ください。\\n\\nフェイルオーバーキューでプロバイダーの優先順位を先に設定することをお勧めします。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"usage\": {\n \"title\": \"使用量クエリの設定\",\n \"message\": \"使用量クエリにはカスタムスクリプトまたは API パラメータが必要です。プロバイダーから必要な情報を取得していることをご確認ください。\\n\\n設定方法が不明な場合は、プロバイダーのドキュメントを先にご確認ください。\",\n \"confirm\": \"理解しました、設定する\"\n },\n \"streamCheck\": {\n \"title\": \"モデルヘルスチェック\",\n \"message\": \"ヘルスチェックは API リクエストを直接送信してプロバイダーの接続性をテストします。以下の場合、チェックが失敗する可能性があります:\\n\\n• 公式プロバイダー(OAuth ログイン使用、独立した API キーなし)\\n• 一部の中継サービス(リクエストが Claude Code CLI からのものか検証)\\n• AWS Bedrock(IAM 署名認証を使用)\\n\\nチェック失敗はプロバイダーが使用不能であることを意味しません。独立したリクエストでの検証ができないことを示すだけです。アプリ内の実際の動作を基準にしてください。\",\n \"confirm\": \"理解しました、続行する\"\n },\n \"autoSync\": {\n \"title\": \"自動同期を有効にする\",\n \"message\": \"自動同期を有効にすると、データベースの変更ごとに WebDAV サーバーへ自動アップロードされます。\\n\\nネットワークトラフィックが大幅に増加する可能性があります。ネットワーク環境と WebDAV サービスが頻繁なデータ転送に対応できることをご確認ください。\",\n \"confirm\": \"理解しました、有効にする\"\n },\n \"commonConfig\": {\n \"title\": \"共通設定について\",\n \"message\": \"「共通設定スニペット」を使うと、プラグインや環境変数などの設定を異なるプロバイダー間で共有でき、切り替え時に失われることがありません。\\n\\n使い方:\\n① プロバイダーを編集 →「共通設定を編集」→「編集内容から抽出」\\n② 新規プロバイダー作成時に「共通設定を書き込む」をチェック(デフォルトでオン)\\n\\n新しいプラグインや Hook をインストールした場合は、共通設定を再抽出してください。\",\n \"confirm\": \"わかりました\"\n }\n },\n \"settings\": {\n \"title\": \"設定\",\n \"general\": \"一般\",\n \"tabGeneral\": \"一般\",\n \"tabAuth\": \"認証\",\n \"tabAdvanced\": \"詳細\",\n \"tabProxy\": \"ルーティング\",\n \"authCenter\": {\n \"title\": \"認証センター\",\n \"description\": \"サードパーティ Key と公式サブスクリプションのサインインを分離し、各 CLI が実際に使っている認証情報の出所を示します。\",\n \"beta\": \"MVP\",\n \"localCliTitle\": \"ローカル CLI サインイン状態\",\n \"readonlyProbe\": \"読み取り専用プローブ\",\n \"localCliDescription\": \"サードパーティ Key と公式サブスクリプションのサインインを区別します。OpenSunstar はローカル状態シグナルのみを表示し、Claude または Google アカウント認証情報を引き継ぎません。\",\n \"localCliLoading\": \"ローカル CLI の認可状態を読み取っています…\",\n \"managedAccountsTitle\": \"管理対象アカウント\",\n \"managedAccountsDescription\": \"OpenSunstar が管理するアカウントは、対応する Provider またはローカルプロキシ経路に紐づけられます。\",\n \"copilotDescription\": \"GitHub Copilot アカウントを管理します\",\n \"codexOauthDescription\": \"ChatGPT アカウントを管理します\",\n \"xaiOauthDescription\": \"xAI / Grok アカウントを管理します\"\n },\n \"advanced\": {\n \"configDir\": {\n \"title\": \"設定ディレクトリ\",\n \"description\": \"Claude、Codex、Gemini の設定保存パスを管理\"\n },\n \"proxy\": {\n \"title\": \"ローカルルーティング\",\n \"description\": \"ルーティングサービスの切り替え、ステータスとポート情報を表示\",\n \"enableFeature\": \"メインページにルーティング切り替えを表示\",\n \"enableFeatureDescription\": \"有効にすると、メインページ上部にルーティングとフェイルオーバーの切り替えが表示されます\",\n \"enableFailoverToggle\": \"メインページにフェイルオーバー切り替えを表示\",\n \"enableFailoverToggleDescription\": \"有効にすると、メインページ上部にフェイルオーバー切り替えが独立して表示されます\",\n \"running\": \"実行中\",\n \"stopped\": \"停止中\"\n },\n \"modelTest\": {\n \"title\": \"モデルテスト設定\",\n \"description\": \"モデルテストで使用するデフォルトモデルとプロンプトを設定\"\n },\n \"failover\": {\n \"title\": \"自動フェイルオーバー\",\n \"description\": \"フェイルオーバーキューとサーキットブレーカー戦略を設定\"\n },\n \"pricing\": {\n \"title\": \"コスト計算\",\n \"description\": \"各モデルのトークン料金ルールを管理\"\n },\n \"globalProxy\": {\n \"title\": \"グローバル送信プロキシ\",\n \"description\": \"OpenSunstar が外部 API にアクセスする際のプロキシを設定\"\n },\n \"data\": {\n \"title\": \"データ管理\",\n \"description\": \"ローカル設定データのインポートとエクスポート\"\n },\n \"backup\": {\n \"title\": \"バックアップと復元\",\n \"description\": \"自動バックアップの管理、データベーススナップショットの表示と復元\"\n },\n \"cloudSync\": {\n \"title\": \"クラウド同期\",\n \"description\": \"WebDAV でデバイス間のデータを同期\"\n },\n \"rectifier\": {\n \"title\": \"整流器\",\n \"description\": \"API リクエストの互換性問題を自動修正\",\n \"enabled\": \"整流器を有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべての整流機能が無効になります\",\n \"requestGroup\": \"リクエスト整流\",\n \"responseGroup\": \"レスポンス整流\",\n \"thinkingSignature\": \"Thinking 署名整流\",\n \"thinkingSignatureDescription\": \"Anthropic タイプのプロバイダーが thinking 署名の非互換性や不正なリクエストエラーを返した場合、互換性のない thinking 関連ブロックを自動削除し、同じプロバイダーで 1 回リトライします\",\n \"thinkingBudget\": \"Thinking Budget 整流\",\n \"thinkingBudgetDescription\": \"Anthropic タイプのプロバイダーが budget_tokens 制約エラー(例: 1024 以上)を返した場合、thinking を enabled に正規化し、thinking 予算を 32000 に設定し、必要に応じて max_tokens を 64000 に引き上げて 1 回リトライします\",\n \"mediaFallback\": \"非対応画像フォールバック\",\n \"mediaFallbackDescription\": \"プロバイダーが画像入力に対応していない場合(テキストのみの能力が宣言されている、または上流が画像非対応エラーを返した場合)、画像ブロックを [Unsupported Image] マーカーに自動置換し、会話を中断させません\",\n \"mediaHeuristic\": \"ヒューリスティックなテキスト専用モデル判定\",\n \"mediaHeuristicDescription\": \"送信前に内蔵モデル名リストに基づいて画像を予測的に削除します。オフにすると「宣言済みテキスト専用」と「上流エラー時のフォールバック」のみが残り、内蔵リストがマルチモーダルモデルをテキスト専用と誤判定して画像を静かに削除するのを防ぎます\"\n },\n \"optimizer\": {\n \"title\": \"Bedrock リクエストオプティマイザー\",\n \"description\": \"リクエスト送信前に Thinking と Cache の設定を自動最適化(Bedrock プロバイダーのみ有効)\",\n \"enabled\": \"オプティマイザーを有効化\",\n \"thinkingOptimizer\": \"Thinking 最適化\",\n \"thinkingOptimizerDescription\": \"Opus/Sonnet に Adaptive Thinking を自動的に有効化し、レガシーモデルに Extended Thinking を注入\",\n \"cacheInjection\": \"Cache 注入\",\n \"cacheInjectionDescription\": \"リクエストの重要な位置に Cache ブレークポイントを自動注入し、重複トークンの課金を削減\",\n \"cacheTtl\": \"Cache TTL\",\n \"cacheTtl5m\": \"5 分\",\n \"cacheTtl1h\": \"1 時間\"\n },\n \"logConfig\": {\n \"title\": \"ログ管理\",\n \"description\": \"ログ出力レベルを制御\",\n \"enabled\": \"ログを有効化\",\n \"enabledDescription\": \"マスタースイッチ、オフにするとすべてのログが無効になります\",\n \"level\": \"ログレベル\",\n \"levelDescription\": \"出力する最小ログレベルを設定\",\n \"levels\": {\n \"error\": \"エラー\",\n \"warn\": \"警告\",\n \"info\": \"情報\",\n \"debug\": \"デバッグ\",\n \"trace\": \"トレース\"\n },\n \"levelHint\": \"ログレベルの説明:\",\n \"levelDesc\": {\n \"error\": \"重大なエラーのみ\",\n \"warn\": \"エラー + 警告\",\n \"info\": \"一般的な操作情報(デフォルト)\",\n \"debug\": \"SSE ストリームとリクエスト/レスポンスを含む詳細情報\",\n \"trace\": \"すべてのログ、最も詳細\"\n }\n }\n },\n \"language\": \"言語\",\n \"languageHint\": \"切り替えるとすぐにプレビューされ、保存後に永続化されます。\",\n \"theme\": \"テーマ\",\n \"themeHint\": \"アプリのテーマを選択します。すぐに反映されます。\",\n \"themeLight\": \"ライト\",\n \"themeDark\": \"ダーク\",\n \"themeSystem\": \"システム\",\n \"importExport\": \"SQL インポート/エクスポート\",\n \"importExportHint\": \"移行や復元用にデータベースの SQL バックアップをインポート/エクスポートします(インポートは OpenSunstar がエクスポートしたバックアップのみ対応)。\",\n \"exportConfig\": \"SQL バックアップをエクスポート\",\n \"selectConfigFile\": \"SQL ファイルを選択\",\n \"noFileSelected\": \"ファイルが選択されていません。\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"importSuccess\": \"インポート成功!\",\n \"importFailed\": \"インポート失敗\",\n \"syncLiveFailed\": \"インポートしましたが、現在のプロバイダーへの同期に失敗しました。手動で再選択してください。\",\n \"importPartialSuccess\": \"設定はインポートされましたが、現在のプロバイダーへの同期に失敗しました。\",\n \"importPartialHint\": \"ライブ設定を更新するため、もう一度プロバイダーを選択してください。\",\n \"configExported\": \"設定をエクスポートしました:\",\n \"exportFailed\": \"エクスポートに失敗しました\",\n \"selectFileFailed\": \"有効な SQL バックアップファイルを選択してください\",\n \"configCorrupted\": \"SQL ファイルが壊れているか形式が無効な可能性があります\",\n \"backupId\": \"バックアップ ID\",\n \"backupManager\": {\n \"title\": \"データベースバックアップ\",\n \"description\": \"以前の状態に復元するための自動データベーススナップショット\",\n \"empty\": \"バックアップはまだありません\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"confirmTitle\": \"バックアップの復元を確認\",\n \"confirmMessage\": \"このバックアップを復元すると現在のデータベースが上書きされます。安全バックアップが先に作成されます。\",\n \"restoreSuccess\": \"復元成功!安全バックアップが作成されました\",\n \"restoreFailed\": \"復元に失敗しました\",\n \"safetyBackupId\": \"安全バックアップID\",\n \"intervalLabel\": \"自動バックアップ間隔\",\n \"retainLabel\": \"バックアップ保持数\",\n \"intervalDisabled\": \"無効\",\n \"intervalHours\": \"{{hours}} 時間\",\n \"intervalDays\": \"{{days}} 日\",\n \"rename\": \"名前変更\",\n \"renameSuccess\": \"バックアップの名前を変更しました\",\n \"renameFailed\": \"名前変更に失敗しました\",\n \"namePlaceholder\": \"新しい名前を入力\",\n \"createBackup\": \"今すぐバックアップ\",\n \"creating\": \"バックアップ中...\",\n \"createSuccess\": \"バックアップが作成されました\",\n \"createFailed\": \"バックアップに失敗しました\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"バックアップを削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップの削除を確認\",\n \"deleteConfirmMessage\": \"このバックアップは完全に削除されます。この操作は取り消せません。\"\n },\n \"webdavSync\": {\n \"title\": \"WebDAV クラウド同期\",\n \"description\": \"WebDAV を使ってデバイス間でデータベースとスキル設定を同期します。\",\n \"baseUrl\": \"WebDAV サーバー URL\",\n \"baseUrlPlaceholder\": \"https://example.com/remote.php/dav/files/user\",\n \"username\": \"ユーザー名\",\n \"usernamePlaceholder\": \"メールアドレスまたはユーザー名\",\n \"password\": \"パスワード\",\n \"passwordPlaceholder\": \"アプリパスワード\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"profile\": \"同期プロファイル名\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに WebDAV へ自動アップロードします。\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"接続成功\",\n \"testFailed\": \"接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"WebDAV にアップロードしました\",\n \"uploadFailed\": \"アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"WebDAV からダウンロード・復元しました\",\n \"downloadFailed\": \"ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは WebDAV 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingUrl\": \"WebDAV サーバー URL を入力してください\",\n \"presets\": {\n \"label\": \"サービス\",\n \"jianguoyun\": \"坚果云\",\n \"jianguoyunHint\": \"坚果云の「セキュリティ設定」で「サードパーティアプリパスワード」を生成してください。ログインパスワードは使用しないでください。\",\n \"nextcloud\": \"Nextcloud\",\n \"nextcloudHint\": \"your-server を Nextcloud サーバーのアドレスに、USERNAME をユーザー名に置き換えてください。\",\n \"synology\": \"Synology NAS\",\n \"synologyHint\": \"Synology の「パッケージセンター」で WebDAV Server パッケージをインストール・有効化してください。\",\n \"custom\": \"カスタム\"\n },\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profileDefault\": \"デフォルト: default\",\n \"saveAndTestSuccess\": \"設定を保存しました。接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、接続テストに失敗しました:{{error}}\",\n \"noRemoteData\": \"クラウドに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(プロトコル v{{protocolVersion}}、データベース {{dbCompatVersion}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"confirmDownload\": {\n \"title\": \"クラウドから復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"artifacts\": \"内容\",\n \"legacyNotice\": \"旧レイアウトのリモートパスを検出しました。復元後、次回のアップロードは新しい v2/db-v6 パスに書き込まれます。\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"クラウドにアップロード\",\n \"content\": \"以下の内容を WebDAV サーバーに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先パス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"path\": \"リモートパス\",\n \"dbCompat\": \"DB 互換レイヤー\",\n \"warning\": \"リモートの既存同期データが上書きされます\",\n \"legacyNotice\": \"旧レイアウトのリモートデータを検出しました。今回のアップロードは新しい v2/db-v6 パスに書き込み、旧パスは上書きしません。\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"syncType\": {\n \"label\": \"同期方式\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3互換ストレージ\"\n },\n \"s3Sync\": {\n \"presets\": {\n \"label\": \"サービス\",\n \"awsS3\": \"AWS S3\",\n \"awsS3Hint\": \"IAM Access Keyを使用。s3:PutObject/GetObject/HeadObject権限が必要です。Region例: us-east-1, ap-northeast-1\",\n \"minio\": \"MinIO\",\n \"minioHint\": \"カスタムEndpointが必要です(例: http://minio.local:9000)。Regionは us-east-1 に設定可能\",\n \"r2\": \"Cloudflare R2\",\n \"r2Hint\": \"Endpoint: https://<account_id>.r2.cloudflarestorage.com、Regionは auto に設定\",\n \"oss\": \"Alibaba Cloud OSS\",\n \"ossHint\": \"Endpoint: https://oss-<region>.aliyuncs.com、Region例: cn-hangzhou, cn-shanghai\",\n \"cos\": \"Tencent Cloud COS\",\n \"cosHint\": \"Endpoint: https://cos.<region>.myqcloud.com、Region例: ap-guangzhou, ap-beijing\",\n \"obs\": \"Huawei OBS\",\n \"obsHint\": \"Endpoint: https://obs.<region>.myhuaweicloud.com、Region例: cn-north-4, cn-east-3\",\n \"custom\": \"S3互換サービス(カスタム)\",\n \"customHint\": \"任意のS3互換サービス。カスタムEndpointが必要です\"\n },\n \"region\": \"リージョン\",\n \"regionPlaceholder\": \"例: us-east-1\",\n \"bucket\": \"バケット\",\n \"bucketPlaceholder\": \"例: my-OpenSunstar-bucket\",\n \"accessKeyId\": \"Access Key ID\",\n \"accessKeyIdPlaceholder\": \"例: AKIA...\",\n \"secretAccessKey\": \"Secret Access Key\",\n \"secretAccessKeyPlaceholder\": \"既存のシークレットを保持する場合は変更しないでください\",\n \"endpoint\": \"エンドポイント(AWSは空欄可)\",\n \"endpointHint\": \"多くの S3 互換サービスでは必須です\",\n \"endpointPlaceholder\": \"例: https://s3-compatible.example.com\",\n \"remoteRoot\": \"リモートルートディレクトリ\",\n \"remoteRootDefault\": \"デフォルト: OpenSunstar-sync\",\n \"profile\": \"同期プロファイル名\",\n \"profileDefault\": \"デフォルト: default\",\n \"autoSync\": \"自動同期\",\n \"autoSyncHint\": \"有効にすると、データベース変更のたびに S3 へ自動アップロードします。\",\n \"enabled\": \"S3 同期を有効化\",\n \"enabledHint\": \"S3 のアップロード/ダウンロードと自動同期を有効にします。\",\n \"mutualExclusionTitle\": \"同期方式の切り替え\",\n \"mutualExclusionMessage\": \"S3同期を有効にすると、現在のWebDAV同期が無効になります。続行しますか?\",\n \"mutualExclusionMessageReverse\": \"WebDAV同期を有効にすると、現在のS3同期が無効になります。続行しますか?\",\n \"mutualExclusionFailed\": \"同期方式の切り替えに失敗しました:{{error}}\",\n \"testConnection\": \"接続テスト\",\n \"connectionOk\": \"S3接続成功\",\n \"test\": \"接続テスト\",\n \"testing\": \"テスト中...\",\n \"testSuccess\": \"S3 接続成功\",\n \"testFailed\": \"S3 接続失敗:{{error}}\",\n \"save\": \"設定を保存\",\n \"saving\": \"保存中...\",\n \"saveFailed\": \"設定の保存に失敗しました:{{error}}\",\n \"saveAndTestSuccess\": \"設定を保存しました。S3 接続正常です\",\n \"saveAndTestFailed\": \"設定を保存しましたが、S3 接続テストに失敗しました:{{error}}\",\n \"upload\": \"クラウドにアップロード\",\n \"uploading\": \"アップロード中...\",\n \"uploadSuccess\": \"S3 にアップロードしました\",\n \"uploadFailed\": \"S3 アップロードに失敗しました:{{error}}\",\n \"autoSyncFailedToast\": \"S3 自動同期に失敗しました:{{error}}\",\n \"download\": \"クラウドからダウンロード\",\n \"downloading\": \"ダウンロード中...\",\n \"downloadSuccess\": \"S3 からダウンロード・復元しました\",\n \"downloadFailed\": \"S3 ダウンロードに失敗しました:{{error}}\",\n \"lastSync\": \"前回の同期:{{time}}\",\n \"autoSyncLastErrorTitle\": \"前回の S3 自動同期に失敗しました\",\n \"autoSyncLastErrorHint\": \"ネットワークまたは S3 設定を確認してください。次回の変更時に自動再試行されます。\",\n \"missingBucket\": \"S3 バケットを入力してください\",\n \"noRemoteData\": \"S3 バケットに同期データが見つかりません\",\n \"incompatibleVersion\": \"リモートデータに互換性がありません(バージョン {{version}})。このクライアントは protocol v2 / db-v6 をサポートしています。\",\n \"unsaved\": \"未保存\",\n \"saved\": \"保存済み\",\n \"unsavedChanges\": \"先に設定を保存してください\",\n \"saveBeforeSync\": \"アップロード/ダウンロードを有効にするには、先に設定を保存してください。\",\n \"fetchingRemote\": \"リモート情報を取得中...\",\n \"fetchRemoteFailed\": \"リモート情報の取得に失敗しました。設定とネットワークを確認してください。\",\n \"notConfigured\": \"S3同期が設定されていません\",\n \"disabled\": \"S3同期が無効です\",\n \"confirmDownload\": {\n \"title\": \"S3 から復元\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"artifacts\": \"内容\",\n \"warning\": \"ローカルのすべてのデータとスキル設定が上書きされます\",\n \"confirm\": \"復元を実行\"\n },\n \"confirmUpload\": {\n \"title\": \"S3 にアップロード\",\n \"content\": \"以下の内容を S3 バケットに同期します:\",\n \"dbItem\": \"データベース(すべてのプロバイダー設定とデータ)\",\n \"skillsItem\": \"スキル(すべてのカスタムスキル)\",\n \"targetPath\": \"保存先オブジェクトパス\",\n \"existingData\": \"クラウドの既存データ\",\n \"deviceName\": \"アップロード元\",\n \"createdAt\": \"アップロード日時\",\n \"warning\": \"この S3 パスにある既存の同期データが上書きされます\",\n \"confirm\": \"アップロードを実行\"\n }\n },\n \"autoReload\": \"データを更新しました\",\n \"languageOptionChinese\": \"简体中文\",\n \"languageOptionTraditionalChinese\": \"繁體中文\",\n \"languageOptionEnglish\": \"English\",\n \"languageOptionJapanese\": \"日本語\",\n \"windowBehavior\": \"ウィンドウ動作\",\n \"windowBehaviorHint\": \"最小化動作や Claude プラグイン連携を設定します。\",\n \"notificationPreferences\": \"通知設定\",\n \"budgetAlertNotifications\": \"予算超過通知\",\n \"budgetAlertNotificationsDescription\": \"Critical / Emergency の予算アラート時にシステム通知を送信します(warning はアプリ内のみ)\",\n \"failoverAlertNotifications\": \"フェイルオーバー通知\",\n \"failoverAlertNotificationsDescription\": \"プロバイダーの自動フェイルオーバー完了時にシステム通知を送信します\",\n \"trayBadgeNotifications\": \"トレイアラート表示\",\n \"trayBadgeNotificationsDescription\": \"未読アラートがある場合、トレイアイコンをアラート状態に切り替え、メニュー上部にアラート項目を表示します\",\n \"workspaceAlertFirst\": \"ワークスペースアラートを最優先\",\n \"workspaceAlertFirstDescription\": \"有効にすると「今日のワークスペース」の上部にアラートカードを表示します。無効時はトレイ/システム通知のみでアラートを通知します\",\n \"launchOnStartup\": \"起動時に自動実行\",\n \"launchOnStartupDescription\": \"システム起動時に OpenSunstar を自動起動します\",\n \"silentStartup\": \"サイレント起動\",\n \"silentStartupDescription\": \"起動時にメインウィンドウを表示せず、トレイのみで起動\",\n \"autoLaunchFailed\": \"自動起動の設定に失敗しました\",\n \"minimizeToTray\": \"閉じるときトレイへ最小化\",\n \"minimizeToTrayDescription\": \"チェックすると閉じるボタンでトレイに隠し、オフならアプリを終了します。\",\n \"useAppWindowControls\": \"アプリ内ウィンドウボタンを有効化\",\n \"useAppWindowControlsDescription\": \"有効にすると、アプリヘッダーに最小化・最大化/復元・閉じるボタンを表示します。\",\n \"enableClaudePluginIntegration\": \"Claude Code 拡張に適用\",\n \"enableClaudePluginIntegrationDescription\": \"オンにすると VS Code の Claude Code 拡張のプロバイダーも同期します\",\n \"skipClaudeOnboarding\": \"Claude Code の初回確認をスキップ\",\n \"skipClaudeOnboardingDescription\": \"オンにすると Claude Code の初回インストール確認をスキップします\",\n \"codexAuth\": \"Codex アプリ拡張\",\n \"preserveCodexOfficialAuthOnSwitch\": \"Codex 公式ログインを保護\",\n \"preserveCodexOfficialAuthOnSwitchDescription\": \"常に有効:プロバイダー切替とローカルプロキシは Codex の公式ログイン認証情報を上書きまたは保存しません。\",\n \"appVisibility\": {\n \"title\": \"ホームページ表示\",\n \"description\": \"ホームページに表示するアプリを選択\",\n \"claudeDesc\": \"Anthropic Claude Code CLI\",\n \"codexDesc\": \"OpenAI Codex CLI\",\n \"geminiDesc\": \"Google Gemini CLI\",\n \"opencodeDesc\": \"OpenCode CLI\"\n },\n \"skillStorage\": {\n \"title\": \"スキル保存場所\",\n \"description\": \"OpenSunstar がスキルのマスターコピーを保存するディレクトリを選択します\",\n \"OpenSunstar\": \"OpenSunstar\",\n \"unified\": \"~/.agents/skills\",\n \"OpenSunstarHint\": \"スキルは ~/.OpenSunstar/skills/ に保存され、シンボリックリンクまたはコピーで各アプリに同期されます。\",\n \"unifiedHint\": \"スキルは ~/.agents/skills/ に保存されます(Agent Skills オープン標準)。対応ツール(Claude Code、Codex、Gemini CLI など)はこのディレクトリのスキルを直接検出します。\",\n \"confirmTitle\": \"スキル保存場所の移行\",\n \"confirmMessage\": \"{{count}} 個のスキルを新しい場所に移動します。続行しますか?\",\n \"migrationSuccess\": \"{{count}} 個のスキルを移行しました\",\n \"migrationPartial\": \"{{migrated}} 個のスキルを移行、{{errors}} 個のエラー。詳細はログを確認してください。\"\n },\n \"skillSync\": {\n \"title\": \"スキル同期方式\",\n \"description\": \"スキルファイルの同期方法を選択\",\n \"symlink\": \"シンボリックリンク\",\n \"copy\": \"ファイルコピー\",\n \"symlinkHint\": \"シンボリックリンクはディスク容量を節約し、リアルタイム同期を有効にします。注意:Windowsでは管理者権限または開発者モードが必要な場合があります\"\n },\n \"terminal\": {\n \"title\": \"優先ターミナル\",\n \"description\": \"ターミナルボタンをクリックした時に使用するターミナルアプリを選択\",\n \"fallbackHint\": \"選択したターミナルが利用できない場合、システムのデフォルトが使用されます\",\n \"options\": {\n \"macos\": {\n \"terminal\": \"Terminal.app\",\n \"iterm2\": \"iTerm2\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\",\n \"wezterm\": \"WezTerm\",\n \"kaku\": \"Kaku\",\n \"warp\": \"Warp\"\n },\n \"windows\": {\n \"cmd\": \"コマンドプロンプト\",\n \"powershell\": \"PowerShell\",\n \"wt\": \"Windows Terminal\"\n },\n \"linux\": {\n \"gnomeTerminal\": \"GNOME Terminal\",\n \"konsole\": \"Konsole\",\n \"xfce4Terminal\": \"Xfce4 Terminal\",\n \"alacritty\": \"Alacritty\",\n \"kitty\": \"Kitty\",\n \"ghostty\": \"Ghostty\"\n }\n }\n },\n \"configDirectoryOverride\": \"設定ディレクトリの上書き(詳細)\",\n \"configDirectoryDescription\": \"WSL などで Claude Code や Codex を使う場合、ここで設定ディレクトリを WSL 側に合わせるとデータを揃えられます。\",\n \"appConfigDir\": \"OpenSunstar 設定ディレクトリ\",\n \"appConfigDirDescription\": \"OpenSunstar の保存場所をカスタマイズします(クラウド同期フォルダを指定すると設定を同期できます)\",\n \"browsePlaceholderApp\": \"例: C:\\\\\\\\Users\\\\\\\\Administrator\\\\\\\\.OpenSunstar\",\n \"claudeConfigDir\": \"Claude Code 設定ディレクトリ\",\n \"claudeConfigDirDescription\": \"Claude の設定ディレクトリ(settings.json)を上書きし、claude.json(MCP)も同じ場所に置きます。\",\n \"codexConfigDir\": \"Codex 設定ディレクトリ\",\n \"codexConfigDirDescription\": \"Codex の設定ディレクトリを上書きします。\",\n \"geminiConfigDir\": \"Gemini 設定ディレクトリ\",\n \"geminiConfigDirDescription\": \"Gemini の設定ディレクトリ(.env)を上書きします。\",\n \"opencodeConfigDir\": \"OpenCode 設定ディレクトリ\",\n \"opencodeConfigDirDescription\": \"OpenCode の設定ディレクトリ(opencode.json)を上書きします。\",\n \"openclawConfigDir\": \"OpenClaw 設定ディレクトリ\",\n \"openclawConfigDirDescription\": \"OpenClaw の設定ディレクトリ(openclaw.json)を上書きします。\",\n \"hermesConfigDir\": \"Hermes 設定ディレクトリ\",\n \"hermesConfigDirDescription\": \"Hermes の設定ディレクトリ(config.yaml)を上書きします。\",\n \"browsePlaceholderClaude\": \"例: /home/<your-username>/.claude\",\n \"browsePlaceholderCodex\": \"例: /home/<your-username>/.codex\",\n \"browsePlaceholderGemini\": \"例: /home/<your-username>/.gemini\",\n \"browsePlaceholderOpencode\": \"例: /home/<your-username>/.config/opencode\",\n \"browsePlaceholderOpenclaw\": \"例: /home/<your-username>/.openclaw\",\n \"browsePlaceholderHermes\": \"例: /home/<your-username>/.hermes\",\n \"browseDirectory\": \"ディレクトリを選択\",\n \"resetDefault\": \"デフォルトに戻す(保存後に反映)\",\n \"checkForUpdates\": \"アップデートを確認\",\n \"updateTo\": \"v{{version}} に更新\",\n \"updating\": \"更新中...\",\n \"checking\": \"確認中...\",\n \"upToDate\": \"最新バージョンです\",\n \"aboutHint\": \"バージョン情報と更新状況を表示します。\",\n \"portableMode\": \"ポータブルモード: 更新は手動ダウンロードが必要です。\",\n \"updateAvailable\": \"新しいバージョンがあります: {{version}}\",\n \"updateBadge\": \"更新あり\",\n \"updateFailed\": \"更新のインストールに失敗しました。ダウンロードページを開こうとしました。\",\n \"checkUpdateFailed\": \"更新の確認に失敗しました。時間をおいて再試行してください。\",\n \"openReleaseNotesFailed\": \"リリースノートの表示に失敗しました\",\n \"releaseNotes\": \"リリースノート\",\n \"viewReleaseNotes\": \"このバージョンのリリースノートを見る\",\n \"viewCurrentReleaseNotes\": \"現在のバージョンのリリースノートを見る\",\n \"officialWebsite\": \"公式サイト\",\n \"github\": \"GitHub\",\n \"manualInstallCommands\": \"手動インストールコマンド\",\n \"oneClickInstallHint\": \"Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes をインストールまたは更新\",\n \"localEnvCheck\": \"ローカル環境チェック\",\n \"updateAllTools\": \"すべて更新({{count}})\",\n \"currentVersion\": \"現在のバージョン\",\n \"latestVersion\": \"最新バージョン\",\n \"updateAvailableShort\": \"更新あり\",\n \"toolInstall\": \"インストール\",\n \"toolUpdate\": \"更新\",\n \"toolReady\": \"準備完了\",\n \"toolActionDone\": \"{{count}} 個のツールの{{action}}が完了しました\",\n \"toolActionPartial\": \"{{succeeded}} 個成功、{{failed}} 個失敗({{action}})\",\n \"toolActionFailed\": \"インストール/更新コマンドの実行に失敗しました\",\n \"toolNotRunnable\": \"インストール済みですが実行できません(バージョン未検出)\",\n \"toolActionVersionUnchangedTitle\": \"バージョンは変わりませんでした\",\n \"toolActionVersionUnchanged\": \"現在も {{version}}(最新: {{latest}})です。アップデーターが成功を報告しても実際には更新されていない可能性があります。\",\n \"toolActionInstalledNotRunnable\": \"インストールされましたが、現在の環境では実行できません。確認してください\",\n \"installedNotRunnable\": \"インストール済み・実行不可\",\n \"toolCheckEnv\": \"実行環境を確認\",\n \"toolDiagnose\": \"インストールを診断\",\n \"toolDiagnosing\": \"診断中…\",\n \"toolConflictTitle\": \"複数のインストールを検出\",\n \"toolConflictHint\": \"コマンドラインは「既定」のものを使用します。更新が別の場所に適用された可能性があります。\",\n \"toolConflictDefault\": \"既定\",\n \"toolConflictNotRunnable\": \"実行不可\",\n \"toolDiagnoseNoConflict\": \"競合するインストールは見つかりませんでした\",\n \"toolDiagnoseFailed\": \"診断に失敗しました\",\n \"toolUpgradeConfirmTitle\": \"アップグレード先の確認\",\n \"toolUpgradeConfirmHint\": \"複数のインストールを検出しました。今回のアップグレードはすべてを更新するわけではありません。実際に作用する箇所は下記の各項目をご確認ください。\",\n \"toolUpgradeWillRun\": \"実行内容:\",\n \"toolUpgradeConfirmBtn\": \"アップグレードを実行\",\n \"toolUpgradeUnanchoredHint\": \"コマンドラインが実際に使用する箇所を特定できません。既定のアップグレードコマンドを実行します(PATH 上の最初の npm にインストールされる場合があります)。\",\n \"envBadge\": {\n \"wsl\": \"WSL\",\n \"windows\": \"Win\",\n \"macos\": \"macOS\",\n \"linux\": \"Linux\"\n },\n \"wslShell\": \"Shell\",\n \"wslShellFlag\": \"フラグ\",\n \"installCommandsCopied\": \"インストールコマンドをコピーしました\",\n \"installCommandsCopyFailed\": \"コピーに失敗しました。手動でコピーしてください。\",\n \"importFailedError\": \"設定のインポートに失敗しました: {{message}}\",\n \"exportFailedError\": \"設定のエクスポートに失敗しました:\",\n \"restartRequired\": \"再起動が必要です\",\n \"restartRequiredMessage\": \"OpenSunstar の設定ディレクトリを変更すると再起動が必要です。今すぐ再起動しますか?\",\n \"restartNow\": \"今すぐ再起動\",\n \"restartLater\": \"後で再起動\",\n \"restartFailed\": \"アプリの再起動に失敗しました。手動で閉じて再度開いてください。\",\n \"devModeRestartHint\": \"開発モードでは自動再起動をサポートしていません。手動で再起動してください。\",\n \"saving\": \"保存中...\",\n \"globalProxy\": {\n \"label\": \"グローバルプロキシ\",\n \"hint\": \"すべてのリクエスト(API、Skills ダウンロードなど)をプロキシ経由で送信します。ローカルルーティング有効時、アプリのリクエストもこのプロキシを経由します。空欄で直接接続。\",\n \"username\": \"ユーザー名(任意)\",\n \"password\": \"パスワード(任意)\",\n \"test\": \"接続テスト\",\n \"scan\": \"ローカルプロキシをスキャン\",\n \"clear\": \"クリア\",\n \"scanFailed\": \"スキャンに失敗しました: {{error}}\",\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"testSuccess\": \"接続成功!遅延 {{latency}}ms\",\n \"testFailed\": \"接続に失敗しました: {{error}}\",\n \"pricingDefaultsTitle\": \"課金のデフォルト設定\",\n \"pricingDefaultsDescription\": \"アプリごとのデフォルト倍率と課金モードを設定します。\",\n \"pricingAppLabel\": \"アプリ\",\n \"defaultCostMultiplierLabel\": \"デフォルト倍率\",\n \"defaultCostMultiplierHint\": \"コスト計算用の倍率(小数対応)。\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingSave\": \"課金設定を保存\",\n \"pricingSaved\": \"課金設定を保存しました\",\n \"pricingSaveFailed\": \"課金設定の保存に失敗しました: {{error}}\",\n \"pricingLoadFailed\": \"課金設定の読み込みに失敗しました: {{error}}\",\n \"defaultCostMultiplierRequired\": \"デフォルト倍率は必須です\",\n \"defaultCostMultiplierInvalid\": \"デフォルト倍率の形式が正しくありません\"\n },\n \"saveFailedGeneric\": \"保存に失敗しました。もう一度お試しください\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"claudeCode\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokBuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"sessionManager\": {\n \"title\": \"セッション管理\",\n \"subtitle\": \"Claude Code / Codex / OpenCode / OpenClaw / Hermes / Gemini CLI のセッションを管理\",\n \"searchPlaceholder\": \"内容・ディレクトリ・ID で検索\",\n \"searchSessions\": \"セッションを検索\",\n \"providerFilterAll\": \"すべて\",\n \"sessionList\": \"セッション一覧\",\n \"manageBatchTooltip\": \"一括管理に入る\",\n \"exitBatchModeTooltip\": \"一括管理を終了\",\n \"batchModeHint\": \"削除するセッションを選択\",\n \"selectForBatch\": \"セッションを選択\",\n \"selectedCount\": \"{{count}} 件を選択中\",\n \"selectAllFiltered\": \"一覧を全選択\",\n \"clearFilteredSelection\": \"全選択を解除\",\n \"clearSelection\": \"クリア\",\n \"deleteSelected\": \"削除\",\n \"batchDeleting\": \"削除中...\",\n \"loadingSessions\": \"セッションを読み込み中...\",\n \"noSessions\": \"セッションが見つかりません\",\n \"selectSession\": \"セッションを選択してください\",\n \"noSummary\": \"概要なし\",\n \"lastActive\": \"最終アクティブ\",\n \"projectDir\": \"プロジェクトディレクトリ\",\n \"sourcePath\": \"元ファイル\",\n \"copyResumeCommand\": \"再開コマンドをコピー\",\n \"resumeCommandCopied\": \"再開コマンドをコピーしました\",\n \"openInTerminal\": \"ターミナルで再開\",\n \"terminalTargetTerminal\": \"Terminal\",\n \"terminalTargetKitty\": \"kitty\",\n \"terminalTargetCopy\": \"コピーのみ\",\n \"terminalLaunched\": \"ターミナルを起動しました\",\n \"openFailed\": \"ターミナルの起動に失敗しました\",\n \"resumeFallbackCopied\": \"再開コマンドをコピーしました(手動で実行してください)\",\n \"copyProjectDir\": \"ディレクトリをコピー\",\n \"projectDirCopied\": \"ディレクトリをコピーしました\",\n \"copySourcePath\": \"元ファイルをコピー\",\n \"sourcePathCopied\": \"元ファイルをコピーしました\",\n \"delete\": \"セッションを削除\",\n \"deleting\": \"削除中...\",\n \"deleteTooltip\": \"このローカルセッション記録を完全に削除します\",\n \"deleteConfirmTitle\": \"セッションを削除\",\n \"deleteConfirmMessage\": \"ローカルセッション「{{title}}」を完全に削除します\\nSession ID: {{sessionId}}\\n\\nこの操作は元に戻せません。\",\n \"deleteConfirmAction\": \"セッションを削除\",\n \"sessionDeleted\": \"セッションを削除しました\",\n \"deleteFailed\": \"セッションの削除に失敗しました: {{error}}\",\n \"batchDeleteConfirmTitle\": \"選択したセッションを削除\",\n \"batchDeleteConfirmMessage\": \"選択した {{count}} 件のローカルセッションを完全に削除します。\\n\\nこの操作は元に戻せません。\",\n \"batchDeleteConfirmAction\": \"選択した項目を削除\",\n \"batchDeleteSuccess\": \"{{count}} 件のセッションを削除しました\",\n \"batchDeleteFailed\": \"{{failed}} 件のセッションを削除できませんでした\",\n \"batchDeleteRequestFailed\": \"一括削除に失敗しました。しばらくしてから再試行してください。\",\n \"loadingMessages\": \"内容を読み込み中...\",\n \"emptySession\": \"表示できる内容がありません\",\n \"clickToCopyPath\": \"クリックしてパスをコピー\",\n \"tocTitle\": \"目次\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\",\n \"roleUser\": \"ユーザー\",\n \"roleSystem\": \"システム\",\n \"roleTool\": \"ツール\",\n \"resume\": \"セッションを再開\",\n \"resumeTooltip\": \"ターミナルでこのセッションを再開\",\n \"noResumeCommand\": \"このセッションは再開できません\",\n \"copyCommand\": \"コマンドをコピー\",\n \"copyMessage\": \"メッセージをコピー\",\n \"messageCopied\": \"メッセージがコピーされました\",\n \"conversationHistory\": \"会話履歴\",\n \"expandContent\": \"全文を表示\",\n \"collapseContent\": \"折りたたむ\"\n },\n \"console\": {\n \"providerSwitchReceived\": \"プロバイダー切り替えイベントを受信:\",\n \"setupListenerFailed\": \"プロバイダー切り替えリスナーの設定に失敗:\",\n \"updateProviderFailed\": \"プロバイダー更新に失敗:\",\n \"autoImportFailed\": \"デフォルト設定の自動インポートに失敗:\",\n \"openLinkFailed\": \"リンクを開けませんでした:\",\n \"getVersionFailed\": \"バージョン情報の取得に失敗:\",\n \"loadSettingsFailed\": \"設定の読み込みに失敗:\",\n \"getConfigPathFailed\": \"設定パスの取得に失敗:\",\n \"getConfigDirFailed\": \"設定ディレクトリの取得に失敗:\",\n \"detectPortableFailed\": \"ポータブルモードの検出に失敗:\",\n \"saveSettingsFailed\": \"設定の保存に失敗:\",\n \"updateFailed\": \"更新に失敗:\",\n \"checkUpdateFailed\": \"更新確認に失敗:\",\n \"openConfigFolderFailed\": \"設定フォルダを開けませんでした:\",\n \"selectConfigDirFailed\": \"設定ディレクトリの選択に失敗:\",\n \"getDefaultConfigDirFailed\": \"デフォルト設定ディレクトリの取得に失敗:\",\n \"openReleaseNotesFailed\": \"リリースノートを開けませんでした:\"\n },\n \"providerForm\": {\n \"supplierName\": \"プロバイダー名\",\n \"supplierNameRequired\": \"プロバイダー名 *\",\n \"supplierNamePlaceholder\": \"例: Anthropic Official\",\n \"websiteUrl\": \"Web サイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(任意)\",\n \"apiEndpoint\": \"API エンドポイント\",\n \"apiEndpointPlaceholder\": \"https://your-api-endpoint.com\",\n \"codexApiEndpointPlaceholder\": \"https://your-api-endpoint.com/v1\",\n \"manageAndTest\": \"管理・テスト\",\n \"configContent\": \"設定内容\",\n \"officialNoApiKey\": \"公式ログインは API Key 不要です。そのまま保存できます\",\n \"codexOfficialNoApiKey\": \"公式は API Key 不要です。そのまま保存してください\",\n \"codexApiKeyAutoFill\": \"ここに入力すれば auth.json も自動で埋まります\",\n \"apiKeyAutoFill\": \"ここに入力すれば下の設定も自動で埋まります\",\n \"cnOfficialApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"aggregatorApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"thirdPartyApiKeyHint\": \"💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです\",\n \"customApiKeyHint\": \"💡 カスタム設定では必要な項目をすべて手動で入力してください\",\n \"omoHint\": \"💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-openagent.jsonc / oh-my-opencode.jsonc の両方に対応します\",\n \"officialHint\": \"💡 公式プロバイダーはブラウザログインで、API Key は不要です\",\n \"getApiKey\": \"API Key を取得\",\n \"apiKey\": \"API Key\",\n \"envKey\": \"環境変数名(任意)\",\n \"grokBuildHint\": \"~/.grok/config.toml に書き込み、このクライアントのネイティブな Grok Build モデル設定だけを管理します。\",\n \"model\": \"既定モデル\",\n \"partnerPromotion\": {\n \"packycode\": \"PackyCode は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OpenSunstar\\\" を入力すると 10% オフ\",\n \"apikeyfun\": \"APIKEY.FUN は OpenSunstar ユーザー向けに特別優待を提供しています。専用リンクから登録すると、最大でチャージ永久 5% オフを受けられます。\",\n \"apinebula\": \"APINEBULA は OpenSunstar ユーザー向けに特別割引を提供しています。専用リンクから登録し、チャージ時にプロモコード「OpenSunstar」を入力すると、さらに 10% OFF の割引が適用されます。\",\n \"atlascloud\": \"Atlas Cloud は、1 つの API で動画・画像生成や LLM を利用できる全モーダル対応の AI 推論プラットフォームです。より低コストで API を利用できる新しい「コーディングプラン」プロモーションをご確認ください。\",\n \"sudocode\": \"SudoCode は、世界水準の AI モデル集約サービスです。1 つの API Key で複数モデルを利用でき、Claude Code、Codex、Gemini CLI、OpenClaw などのツールに対応しています。\",\n \"patewayai\": \"PatewayAI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録すると $3 のクレジットがもらえます。\",\n \"claudeapi\": \"ClaudeAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録するとテストクレジットを受け取ることができます。\",\n \"claudecn\": \"ClaudeCN は登録企業が運営するエンタープライズグレードの AI ゲートウェイプラットフォームで、企業調達プロセスをサポートし、法人支払い、契約、コンプライアンス保証を提供します。\",\n \"runapi\": \"RunAPI は OpenSunstar ユーザーに特別な特典を提供しています。このリンクから登録しカスタマーサポートにご連絡いただくと、¥14 の無料クレジットを受け取ることができます。\",\n \"minimax_cn\": \"MiniMax Coding Plan 特別価格、Starter ¥9.9 から\",\n \"minimax_en\": \"MiniMax Coding Plan Black Friday、Starter が月額 $2(80% OFF)\",\n \"dmxapi\": \"Claude Code 専用モデル 66% OFF 実施中!\",\n \"cubence\": \"Cubence は OpenSunstar の公式パートナーです。登録後チャージ時に \\\"OPENSUNSTAR\\\" を入力すると、毎回 10% オフ\",\n \"aigocode\": \"AIGoCode は OpenSunstar の公式パートナーです。このリンクから登録すると、初回チャージ時に 10% のボーナスクレジットがもらえます!\",\n \"rightcode\": \"RightCode は OpenSunstar の公式パートナーです。このリンクから登録すると、毎回のチャージに 5% のボーナスクレジットがもらえます!\",\n \"aicodemirror\": \"AICodeMirror は OpenSunstar の公式パートナーです。このリンクから登録すると20%オフ!\",\n \"crazyrouter\": \"CrazyRouter は OpenSunstar ユーザー向けに特別ボーナスを提供しています。初回チャージで 30% の追加クレジットがもらえます!\",\n \"sssaicode\": \"SSAI Code は OpenSunstar ユーザー向けに特別ボーナスを提供しています。チャージごとに $10 の追加クレジットがもらえます!\",\n \"siliconflow\": \"SiliconFlow は OpenSunstar の公式パートナーです\",\n \"ucloud\": \"Compshare は OpenSunstar ユーザー向けに特別ボーナスを提供しています。このリンクから登録すると、5元のプラットフォーム体験クレジットがもらえます!\",\n \"micu\": \"Micu は OpenSunstar の公式パートナーです\",\n \"ctok\": \"公式サイトで CTok コミュニティに参加し、プランを購読してください。\",\n \"shengsuanyun\": \"胜算云はOpenSunstarユーザーに特別特典を提供しています。このリンクから登録すると、10元分の無料クレジットと初回チャージ10%ボーナスがもらえます!\",\n \"lemondata\": \"Lemon Code は OpenSunstar ユーザー向けの特別オファーを提供しています。このリンクから登録すると 1 ドル分の無料クレジットがもらえます。\",\n \"doubaoseed\": \"豆包大モデルは OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると、豆包全テキストモデル50万トークンの推論クレジットおよびSeedance2.0の500万トークン無料クレジットがもらえます。\",\n \"volcengine_agentplan\": \"火山方舟 Agent Plan は OpenSunstar ユーザーに専属特典を提供しています:このリンクから方舟AgentPlanを購読すると、新規のお客様は初月40元から利用できます。\",\n \"byteplus\": \"このリンクから登録すると、各モデルごとに50万トークンの無料推論クォータがもらえます。\",\n \"ccsub\": \"CCSub は安定・低価格の AI API リレーサービスです。Claude Code の公式サブスクリプションの代替として、1つのキーで全モデルを公式比約1/3のコストで利用できます。\",\n \"unity2\": \"Unity2.ai は OpenSunstar ユーザーに専属特典を提供しています:このリンクから登録すると $2 分のクレジット、公式グループ参加でさらに $10、最大 $12 の無料クレジットがもらえます!\"\n },\n \"presets\": {\n \"ucloud\": \"Compshare\",\n \"ucloudCoding\": \"Compshare Coding Plan\",\n \"shengsuanyun\": \"Shengsuanyun\",\n \"openrouter\": \"OpenRouter\",\n \"deepseek\": \"DeepSeek\",\n \"together\": \"Together AI\"\n },\n \"parameterConfig\": \"パラメーター設定 - {{name}} *\",\n \"mainModel\": \"メインモデル(任意)\",\n \"mainModelPlaceholder\": \"例: GLM-4.6\",\n \"fastModel\": \"高速モデル(任意)\",\n \"fastModelPlaceholder\": \"例: GLM-4.5-Air\",\n \"modelHint\": \"💡 空欄ならプロバイダーのデフォルトモデルを使用します\",\n \"apiHint\": \"💡 Claude API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintOAI\": \"💡 OpenAI Chat Completions 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"apiHintGeminiNative\": \"💡 Gemini Native では https://generativelanguage.googleapis.com または https://generativelanguage.googleapis.com/v1beta のような base URL を推奨します。プロキシが models/*:generateContent を自動補完します\",\n \"codexApiHint\": \"💡 OpenAI Response 互換のサービスエンドポイントを入力してください\",\n \"fillSupplierName\": \"プロバイダー名を入力してください\",\n \"fillConfigContent\": \"設定内容を入力してください\",\n \"fillParameter\": \"{{label}} を入力してください\",\n \"fillTemplateValue\": \"{{label}} を入力してください\",\n \"endpointRequired\": \"公式以外は API エンドポイントが必須です\",\n \"apiKeyRequired\": \"公式以外は API Key が必須です\",\n \"softValidation\": {\n \"title\": \"設定に以下の問題があります\",\n \"hint\": \"それでも保存しますか?保存後、このプロバイダーへの切り替えが失敗する可能性がありますが、後から補完できます。\",\n \"saveAnyway\": \"それでも保存\"\n },\n \"configJsonError\": \"Config JSON の形式が正しくありません。構文を確認してください\",\n \"authJsonRequired\": \"auth.json は JSON オブジェクトで入力してください\",\n \"authJsonError\": \"auth.json の形式が正しくありません。JSON を確認してください\",\n \"fillAuthJson\": \"auth.json の設定を入力してください\",\n \"fillApiKey\": \"OPENAI_API_KEY を入力してください\",\n \"visitWebsite\": \"{{url}} を開く\",\n \"anthropicModel\": \"メインモデル\",\n \"anthropicSmallFastModel\": \"高速モデル\",\n \"apiFormat\": \"API フォーマット\",\n \"apiFormatHint\": \"プロバイダー API の入力フォーマットを選択\",\n \"customUserAgent\": \"カスタム User-Agent\",\n \"customUserAgentHint\": \"ローカルルーティング/プロキシ引き継ぎが有効な場合にのみ適用され、プロバイダー API へ転送するリクエストの User-Agent を置き換えます。\",\n \"customUserAgentInvalid\": \"User-Agent に制御文字(改行など)を含めることはできません。含まれている場合は無視されます。\",\n \"customUserAgentPresets\": \"プリセット\",\n \"fullUrlLabel\": \"フル URL\",\n \"fullUrlEnabled\": \"フル URL モード\",\n \"fullUrlDisabled\": \"フル URL として設定\",\n \"fullUrlHint\": \"💡 完全なリクエスト URL を入力してください。このモードはルーティングを有効にして使用する必要があり、ルーティングはこの URL をそのまま使用し、パスを追加しません\",\n \"fullUrlHintGeminiNative\": \"💡 Gemini Native のフル URL モードでは 2 種類の入力を扱えます。1. 公式/構造化された Gemini URL は、要求されたモデルやストリーミング方式に合わせて正規化されます。2. カスタム relay の opaque な完全 URL は、主にそのまま使用され、必要なクエリだけ追加されます\",\n \"apiFormatAnthropic\": \"Anthropic Messages(ネイティブ)\",\n \"apiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"apiFormatOpenAIResponses\": \"OpenAI Responses API(ルーティングが必要)\",\n \"apiFormatGeminiNative\": \"Gemini Native generateContent(ルーティングが必要)\",\n \"codexApiFormatResponses\": \"OpenAI Responses API(ネイティブ)\",\n \"codexApiFormatOpenAIChat\": \"OpenAI Chat Completions(ルーティングが必要)\",\n \"codexApiFormatHint\": \"このプロバイダーが実際に対応している Codex API フォーマットを選択します。新しい Codex との互換性のため設定は Responses のままにし、Chat Completions はローカルルーティングで変換します。\",\n \"authField\": \"認証フィールド\",\n \"authFieldAuthToken\": \"ANTHROPIC_AUTH_TOKEN(デフォルト)\",\n \"authFieldApiKey\": \"ANTHROPIC_API_KEY\",\n \"authFieldHint\": \"設定に書き込む認証環境変数名を選択\",\n \"apiHintResponses\": \"💡 OpenAI Responses API 互換サービスのエンドポイントを入力してください。末尾にスラッシュを付けないでください\",\n \"anthropicDefaultHaikuModel\": \"既定 Haiku モデル\",\n \"anthropicDefaultSonnetModel\": \"既定 Sonnet モデル\",\n \"anthropicDefaultOpusModel\": \"既定 Opus モデル\",\n \"modelPlaceholder\": \"\",\n \"smallModelPlaceholder\": \"\",\n \"haikuModelPlaceholder\": \"\",\n \"modelHelper\": \"任意: 既定で使いたい Claude モデルを指定。空欄ならシステム既定を使用します。\",\n \"modelMappingLabel\": \"モデルマッピング\",\n \"modelMappingHint\": \"表示名は /model メニューだけに影響します。1M は Claude Code へのコンテキスト能力宣言です。\",\n \"modelRoleLabel\": \"モデル役割\",\n \"modelRoleSonnet\": \"Sonnet\",\n \"modelRoleOpus\": \"Opus\",\n \"modelRoleHaiku\": \"Haiku\",\n \"modelDisplayNameLabel\": \"表示名\",\n \"modelDisplayNamePlaceholder\": \"例: DeepSeek V4 Pro\",\n \"requestModelLabel\": \"リクエストモデル\",\n \"modelOneMHeader\": \"1M 対応を宣言\",\n \"modelOneMLabel\": \"1M\",\n \"fallbackModelLabel\": \"既定フォールバックモデル\",\n \"fallbackModelHint\": \"Claude Code のリクエストが Sonnet、Opus、Haiku のいずれにも明確に対応しない場合のみ使われます。通常は空欄で構いません。\",\n \"quickSetModels\": \"一括設定\",\n \"quickSetSuccess\": \"モデル名をすべての役割に適用しました\",\n \"advancedOptionsToggle\": \"高級オプション\",\n \"advancedOptionsHint\": \"API フォーマット、認証フィールド、モデルマッピングの設定を含みます。通常はデフォルトのままで問題ありません。\",\n \"categoryOfficial\": \"公式\",\n \"categoryCnOfficial\": \"オープンソース公式\",\n \"categoryAggregation\": \"アグリゲーター\",\n \"categoryThirdParty\": \"サードパーティ\",\n \"fetchModels\": \"モデル一覧を取得\",\n \"fetchingModels\": \"取得中...\",\n \"fetchModelsSuccess\": \"{{count}}件のモデルを取得\",\n \"fetchModelsFailed\": \"モデル一覧の取得に失敗しました\",\n \"fetchModelsEmpty\": \"モデルが見つかりません\",\n \"fetchModelsNeedApiKey\": \"先に API Key を入力してください\",\n \"fetchModelsNeedEndpoint\": \"先に API エンドポイントを入力してください\",\n \"fetchModelsNeedConfig\": \"先に API エンドポイントと API Key を入力してください\",\n \"fetchModelsAuthFailed\": \"API Key が無効か、権限がありません\",\n \"fetchModelsNotSupported\": \"このプロバイダーはモデル一覧の取得に対応していません\",\n \"fetchModelsEndpointNotFound\": \"利用可能なモデル一覧エンドポイントが見つかりません。Base URL を確認するか、プロバイダーが該当 API を公開しているかご確認ください\",\n \"fetchModelsTimeout\": \"リクエストがタイムアウトしました。ネットワーク接続を確認してください\"\n },\n \"copilot\": {\n \"authSection\": \"GitHub Copilot 認証\",\n \"authStatus\": \"認証状態\",\n \"authenticated\": \"認証済み: {{username}}\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithGitHub\": \"GitHub でログイン\",\n \"loginRequired\": \"先に GitHub Copilot にログインしてください\",\n \"waitingForAuth\": \"認証を待っています...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"logout\": \"ログアウト\",\n \"authSuccess\": \"GitHub Copilot 認証に成功しました\",\n \"authFailed\": \"認証に失敗しました: {{error}}\",\n \"authTimeout\": \"認証がタイムアウトしました。もう一度お試しください\",\n \"tokenExpired\": \"トークンの有効期限が切れました。再認証してください\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"GitHub アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"migrationFailed\": \"旧認証データの移行に失敗しました: {{error}}\",\n \"loadModelsFailed\": \"Copilot モデル一覧の読み込みに失敗しました\",\n \"deploymentType\": \"GitHub デプロイメントタイプ\",\n \"deploymentGitHubCom\": \"GitHub.com\",\n \"deploymentEnterprise\": \"GitHub Enterprise Server\",\n \"enterpriseDomainPlaceholder\": \"例: company.ghe.com\"\n },\n \"codexOauth\": {\n \"authStatus\": \"認証状態\",\n \"notAuthenticated\": \"未認証\",\n \"loginWithChatGPT\": \"ChatGPT でログイン\",\n \"loginRequired\": \"先に ChatGPT にログインしてください\",\n \"waitingForAuth\": \"認証を待機中...\",\n \"enterCode\": \"ブラウザで以下のコードを入力してください:\",\n \"accountCount\": \"{{count}} アカウント\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"ChatGPT アカウントを選択\",\n \"useDefaultAccount\": \"デフォルトアカウントを使用\",\n \"loggedInAccounts\": \"ログイン済みアカウント\",\n \"defaultAccount\": \"デフォルト\",\n \"selected\": \"選択中\",\n \"removeAccount\": \"アカウントを削除\",\n \"setAsDefault\": \"デフォルトに設定\",\n \"addAnotherAccount\": \"別のアカウントを追加\",\n \"logoutAll\": \"すべてのアカウントをログアウト\",\n \"retry\": \"再試行\",\n \"copyCode\": \"コードをコピー\",\n \"fastMode\": \"FAST モード\",\n \"fastModeDescription\": \"低遅延のため service_tier=\\\"priority\\\" を送信します。既定ではオフ——オンにすると ChatGPT のクォータがより速く消費されます。\"\n },\n \"endpointTest\": {\n \"title\": \"API エンドポイント管理\",\n \"endpoints\": \"エンドポイント\",\n \"autoSelect\": \"自動選択\",\n \"testSpeed\": \"テスト\",\n \"testing\": \"テスト中\",\n \"addEndpointPlaceholder\": \"https://api.example.com\",\n \"done\": \"完了\",\n \"noEndpoints\": \"エンドポイントがありません\",\n \"failed\": \"失敗\",\n \"enterValidUrl\": \"有効な URL を入力してください\",\n \"invalidUrlFormat\": \"URL 形式が正しくありません\",\n \"onlyHttps\": \"HTTP/HTTPS のみサポートします\",\n \"urlExists\": \"この URL はすでに存在します\",\n \"saveFailed\": \"保存に失敗しました。もう一度お試しください\",\n \"loadEndpointsFailed\": \"カスタムエンドポイントの読み込みに失敗:\",\n \"addEndpointFailed\": \"カスタムエンドポイントの追加に失敗:\",\n \"removeEndpointFailed\": \"カスタムエンドポイントの削除に失敗:\",\n \"removeFailed\": \"削除に失敗しました: {{error}}\",\n \"updateLastUsedFailed\": \"エンドポイントの最終使用時間の更新に失敗しました\",\n \"pleaseAddEndpoint\": \"まずエンドポイントを追加してください\",\n \"testUnavailable\": \"速度テストを実行できません\",\n \"noResult\": \"結果がありません\",\n \"testFailed\": \"速度テストに失敗しました: {{error}}\",\n \"empty\": \"エンドポイントがありません\"\n },\n \"providerAdvanced\": {\n \"testConfig\": \"モデルテスト設定\",\n \"useCustomConfig\": \"個別設定を使用\",\n \"testConfigDesc\": \"このプロバイダーに個別のモデルテストパラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"testModel\": \"テストモデル\",\n \"testModelPlaceholder\": \"空白の場合はグローバル設定を使用\",\n \"timeoutSecs\": \"タイムアウト(秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"degradedThreshold\": \"低下閾値(ミリ秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"pricingConfig\": \"課金設定\",\n \"useCustomPricing\": \"個別設定を使用\",\n \"pricingConfigDesc\": \"このプロバイダーに個別の課金パラメータを設定します。無効の場合はグローバル設定を使用します。\",\n \"costMultiplier\": \"コスト倍率\",\n \"costMultiplierPlaceholder\": \"空白の場合はグローバル設定を使用(1)\",\n \"costMultiplierHint\": \"実際のコスト = 基本コスト × 倍率、1.5 などの小数をサポート\",\n \"pricingModelSourceLabel\": \"課金モード\",\n \"pricingModelSourceInherit\": \"グローバル設定を継承\",\n \"pricingModelSourceRequest\": \"リクエストモデル\",\n \"pricingModelSourceResponse\": \"レスポンスモデル\",\n \"pricingModelSourceHint\": \"リクエストモデルまたはレスポンスモデルで価格を照合するかを選択\"\n },\n \"codexConfig\": {\n \"authJson\": \"auth.json (JSON) *\",\n \"authJsonPlaceholder\": \"{\\n \\\"OPENAI_API_KEY\\\": \\\"sk-your-api-key-here\\\"\\n}\",\n \"authJsonHint\": \"Codex の auth.json 設定内容\",\n \"authJsonStorageHint\": \"プロキシ引き継ぎ中は保存済みの auth を表示しており、実際の auth.json ではありません。\",\n \"configToml\": \"config.toml (TOML)\",\n \"configTomlHint\": \"Codex の config.toml 設定内容\",\n \"configTomlStorageHint\": \"プロキシ引き継ぎ中は保存済みの config を表示しており、実際の config.toml ではありません。\",\n \"proxyTakeoverStorageNotice\": \"💡 このアプリはプロキシ引き継ぎ中です。ここで編集しているのは保存済みのプロバイダー設定で、実際の live 設定はすでにプロキシが一時的に引き継いでいます。\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Codex 共通設定スニペットを編集\",\n \"commonConfigHint\": \"「共通設定を書き込む」がオンの場合、config.toml の末尾に追記されます\",\n \"enableGoalMode\": \"Goal mode を有効化\",\n \"enableRemoteCompaction\": \"リモート圧縮を有効化\",\n \"remoteCompactionHint\": \"有効にすると、現在の model_providers エントリの name を OpenAI に設定し、Codex がリモート圧縮を試行できるようにします。\",\n \"apiUrlLabel\": \"API リクエスト URL\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"modelNameHint\": \"使用するモデルを指定します。config.toml に自動更新されます\",\n \"modelName\": \"モデル名\",\n \"localRoutingToggle\": \"ローカルルーティングが必要\",\n \"localRoutingOffHint\": \"プロバイダーがネイティブの OpenAI Responses API でない場合、またはモデル名が Codex デフォルトの GPT 系列でない場合は、このスイッチを有効にしてください。\",\n \"localRoutingOnHint\": \"Codex は現在、OpenAI Responses API と GPT 系列モデルのみをネイティブにサポートしています。プロバイダーが Chat Completions プロトコルや非 GPT モデル(DeepSeek、Kimi など)を使用する場合は、このスイッチを有効にし、使用中はローカルルーティングを起動したままにしてください。\",\n \"upstreamModelName\": \"上流モデル名\",\n \"upstreamModelNameHint\": \"Chat 形式ではここに実際の上流モデルを入力します。ルーティングで Codex の Responses リクエストを Chat Completions に変換し、このモデルを維持します。\",\n \"modelNamePlaceholder\": \"例: gpt-5-codex\",\n \"contextWindow1M\": \"1M コンテキストウィンドウ\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"contextWindowPlaceholder\": \"例: 128000\",\n \"autoCompactLimit\": \"自動圧縮しきい値\",\n \"autoCompactLimitPlaceholder\": \"例: 90000\",\n \"autoCompactLimitHint\": \"コンテキストトークン数がこのしきい値に達すると履歴を自動圧縮\",\n \"modelMetadataAdvanced\": \"モデルメタデータ詳細オプション\",\n \"modelMetadataAdvancedHint\": \"未知のモデル向けに Codex メタデータを上書きします。空にすると対応する config.toml 設定を削除します。\",\n \"modelMappingTitle\": \"モデルマッピング\",\n \"modelMappingHint\": \"Codex model_catalog_json を生成し、/model コマンドでこれらの第三者モデル名を表示できるようにします。リストの内容はそのまま保存されます。変更後、モデルリストを更新するには Codex の再起動が必要です。\",\n \"addCatalogModel\": \"モデルを追加\",\n \"catalogDisplayName\": \"表示名\",\n \"catalogDisplayNamePlaceholder\": \"例: DeepSeek V4 Flash\",\n \"catalogModelId\": \"モデル ID\",\n \"catalogModelPlaceholder\": \"例: deepseek-v4-flash\",\n \"catalogColumnDisplay\": \"メニュー表示名\",\n \"catalogColumnModel\": \"実際のリクエストモデル\",\n \"catalogColumnContext\": \"コンテキストウィンドウ\",\n \"reasoningModeToggle\": \"思考モードに対応\",\n \"reasoningModeHint\": \"上流の Chat Completions API が思考(thinking)のオン/オフ切り替えに対応している場合に有効化します。Kimi、GLM、Qwen などが通常このタイプに該当します。\",\n \"reasoningEffortToggle\": \"思考レベルに対応\",\n \"reasoningEffortHint\": \"上流が low/high/max などの思考の深さの制御に対応している場合に有効化します。有効にすると思考モードも自動的にオンになり、Codex の reasoning.effort を上流の Chat パラメータに変換します。\",\n \"reasoningGroupTitle\": \"思考能力\",\n \"reasoningSectionHint\": \"プリセットの供給元は自動的に設定され、カスタム供給元は名前/URL から自動推論されます。自動識別が正しくない場合のみ手動で上書きしてください。\",\n \"advancedSectionHint\": \"ローカルルーティング、モデルマッピング、思考能力、カスタム User-Agent の設定を含みます。供給元が Chat Completions プロトコルまたは GPT 以外のモデルを使用する場合は、ここでローカルルーティングを有効にしてください。\"\n },\n \"geminiConfig\": {\n \"envFile\": \"環境変数 (.env)\",\n \"envFileHint\": \".env 形式で Gemini の環境変数を設定\",\n \"configJson\": \"設定ファイル (config.json)\",\n \"configJsonHint\": \"Gemini 拡張パラメーターを JSON 形式で設定(任意)\",\n \"writeCommonConfig\": \"共通設定を書き込む\",\n \"editCommonConfig\": \"共通設定を編集\",\n \"editCommonConfigTitle\": \"Gemini 共通設定スニペットを編集\",\n \"commonConfigHint\": \"このスニペットは Gemini の .env に書き込みます(GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY は使用できません)\",\n \"extractFromCurrent\": \"編集内容から抽出\",\n \"extractNoCommonConfig\": \"編集内容から抽出できる共通設定がありません\",\n \"extractFailed\": \"抽出に失敗しました: {{error}}\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\",\n \"extractedConfigInvalid\": \"抽出した設定のフォーマットが不正です\",\n \"invalidJsonFormat\": \"共通設定スニペットの形式が不正です(有効な JSON でなければなりません)\",\n \"commonConfigInvalidKeys\": \"共通設定スニペットに GOOGLE_GEMINI_BASE_URL または GEMINI_API_KEY を含めることはできません(検出: {{keys}})\",\n \"commonConfigInvalidValues\": \"共通設定スニペットの値は文字列である必要があります\",\n \"noCommonConfigToApply\": \"共通設定スニペットが空、または適用できる項目がありません\",\n \"configMergeFailed\": \"設定のマージに失敗しました: {{error}}\",\n \"configReplaceFailed\": \"設定の置換に失敗しました: {{error}}\"\n },\n \"opencode\": {\n \"npmPackage\": \"API フォーマット\",\n \"selectPackage\": \"API フォーマットを選択\",\n \"npmPackageHint\": \"AI サービスの API フォーマットを選択\",\n \"baseUrl\": \"Base URL\",\n \"baseUrlHint\": \"カスタム API エンドポイント URL\",\n \"models\": \"モデル設定\",\n \"modelsHint\": \"利用可能なモデルとその表示名を設定\",\n \"addModel\": \"モデルを追加\",\n \"modelId\": \"モデル ID\",\n \"modelName\": \"表示名\",\n \"noModels\": \"モデルが設定されていません\",\n \"modelsRequired\": \"モデルを少なくとも1つ追加してください\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイルの一意の識別子です。小文字、数字、ハイフンのみ使用できます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用できます。\",\n \"extraOptions\": \"追加オプション\",\n \"extraOptionsHint\": \"timeout、setCacheKey などの SDK オプションを設定。値は自動的に適切な型(数値、真偽値など)に変換されます。\",\n \"addExtraOption\": \"追加\",\n \"extraOptionKey\": \"キー名\",\n \"extraOptionValue\": \"値\",\n \"extraOptionKeyPlaceholder\": \"timeout\",\n \"extraOptionValuePlaceholder\": \"600000\",\n \"noExtraOptions\": \"追加オプションはありません\",\n \"noModelOptions\": \"モデルオプション、+ をクリックして追加\",\n \"modelExtraFields\": \"モデルプロパティ\",\n \"noModelExtraFields\": \"モデルプロパティ(variants、cost など)、+ をクリックして追加\",\n \"modelExtraFieldKeyPlaceholder\": \"variants\",\n \"sdkOptions\": \"SDK オプション\",\n \"modelOptionKeyPlaceholder\": \"provider\",\n \"modelOptionValuePlaceholder\": \"{\\\"order\\\": [\\\"baseten\\\"]}\"\n },\n \"providerPreset\": {\n \"label\": \"プロバイダータイプ\",\n \"custom\": \"カスタム設定\",\n \"other\": \"その他\",\n \"hint\": \"プリセットを選んだ後でも、下のフィールドで調整できます。\",\n \"searchTooltip\": \"プリセットを検索\",\n \"searchAriaLabel\": \"プロバイダープリセットを検索\",\n \"searchPlaceholder\": \"名前、サイト、カテゴリで検索...\",\n \"sortAriaLabel\": \"プリセットの並び順を切り替え\",\n \"sortNameAscTooltip\": \"名前順 A-Z で並び替え\",\n \"sortOriginalTooltip\": \"元の順序に戻す\",\n \"noSearchResults\": \"一致するプロバイダープリセットがありません。\"\n },\n \"usage\": {\n \"title\": \"利用統計\",\n \"subtitle\": \"AI モデルの利用状況とコスト統計を表示\",\n \"today\": \"24時間\",\n \"last7days\": \"7日間\",\n \"last30days\": \"30日間\",\n \"presetToday\": \"当日\",\n \"preset1d\": \"1d\",\n \"preset7d\": \"7d\",\n \"preset14d\": \"14d\",\n \"preset30d\": \"30d\",\n \"totalRequests\": \"総リクエスト数\",\n \"totalCost\": \"総コスト\",\n \"cost\": \"コスト\",\n \"perMillion\": \"(100万あたり)\",\n \"trends\": \"利用トレンド\",\n \"rangeToday\": \"直近24時間 (時間別)\",\n \"rangeLast7Days\": \"過去7日間\",\n \"rangeLast30Days\": \"過去30日間\",\n \"totalTokens\": \"新規トークン (Input+Output)\",\n \"cacheTokens\": \"キャッシュトークン\",\n \"realTotal\": \"実消費トークン\",\n \"realTotalHint\": \"Input + Output + キャッシュ書込 + キャッシュ命中\",\n \"freshInput\": \"新規入力\",\n \"cacheHitRate\": \"キャッシュヒット率\",\n \"requestLogs\": \"リクエストログ\",\n \"providerStats\": \"プロバイダー統計\",\n \"modelStats\": \"モデル統計\",\n \"time\": \"時間\",\n \"provider\": \"プロバイダー\",\n \"billingModel\": \"課金モデル\",\n \"inputTokens\": \"入力\",\n \"outputTokens\": \"出力\",\n \"cacheReadTokens\": \"キャッシュヒット\",\n \"cacheCreationTokens\": \"キャッシュ作成\",\n \"timingInfo\": \"応答時間/TTFT\",\n \"status\": \"ステータス\",\n \"multiplier\": \"倍率\",\n \"requestModel\": \"リクエストモデル\",\n \"responseModel\": \"レスポンスモデル\",\n \"noData\": \"データなし\",\n \"unknownProvider\": \"不明なプロバイダー\",\n \"stream\": \"ストリーム\",\n \"nonStream\": \"非ストリーム\",\n \"source\": \"ソース\",\n \"requestsLabel\": \"リクエスト\",\n \"costLabel\": \"合計コスト\",\n \"appFilter\": {\n \"all\": \"すべて\",\n \"claude\": \"Claude Code\",\n \"claude-desktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"grokbuild\": \"Grok Build\",\n \"opencode\": \"OpenCode\"\n },\n \"rawInputLabel\": \"原始\",\n \"dataSources\": \"データソース\",\n \"dataSource\": {\n \"proxy\": \"ルーティング\",\n \"session_log\": \"セッションログ\",\n \"codex_db\": \"Codex DB\",\n \"codex_session\": \"Codex セッション\",\n \"gemini_session\": \"Gemini セッション\",\n \"opencode_session\": \"OpenCode セッション\"\n },\n \"sessionSync\": {\n \"trigger\": \"セッションログを同期\",\n \"import\": \"セッションをインポート\",\n \"resync\": \"同期\",\n \"imported\": \"セッションログから {{count}} 件のレコードをインポートしました\",\n \"upToDate\": \"セッションログは最新です\",\n \"failed\": \"セッション同期に失敗しました\"\n },\n \"totalRecords\": \"全 {{total}} 件\",\n \"goToPage\": \"移動\",\n \"pageInputPlaceholder\": \"ページ\",\n \"modelPricing\": \"モデル料金\",\n \"loadPricingError\": \"料金データの読み込みに失敗しました\",\n \"modelPricingDesc\": \"各モデルのトークンコストを設定\",\n \"noPricingData\": \"料金データがありません。「追加」をクリックしてモデル料金を設定してください。\",\n \"model\": \"モデル\",\n \"pricingModel\": \"課金モデル\",\n \"displayName\": \"表示名\",\n \"inputCost\": \"入力コスト\",\n \"outputCost\": \"出力コスト\",\n \"cacheReadCost\": \"キャッシュヒット\",\n \"cacheWriteCost\": \"キャッシュ作成\",\n \"pricingAudit\": \"監査\",\n \"pricingBuiltinPublic\": \"組み込み公開価格\",\n \"pricingUserOverride\": \"ユーザー設定\",\n \"pricingEffectiveAt\": \"適用日\",\n \"longContextRate\": \"長文コンテキスト\",\n \"deleteConfirmTitle\": \"削除の確認\",\n \"deleteConfirmDesc\": \"このモデル料金を削除しますか?この操作は元に戻せません。\",\n \"queryFailed\": \"照会に失敗しました\",\n \"refreshUsage\": \"利用状況を更新\",\n \"planUsage\": \"プラン利用状況\",\n \"hostConfirm\": {\n \"title\": \"送信先ドメインの確認\",\n \"message\": \"このプロバイダーのカスタム使用量スクリプトが、次のドメインにリクエスト(API キーを含む)を送信しようとしています:\\n\\n{{host}}\\n\\nこのドメインを信頼できる場合のみ続行してください。確認後は、送信先ドメインが変わるまでこのプロバイダーに対して選択が記憶されます。\",\n \"pending\": \"{{host}} への接続には確認が必要です\",\n \"reviewButton\": \"確認\",\n \"confirm\": \"信頼して続行\",\n \"cancel\": \"キャンセル\"\n },\n \"invalid\": \"期限切れ\",\n \"total\": \"合計:\",\n \"used\": \"使用:\",\n \"remaining\": \"残り:\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}} 分前\",\n \"hoursAgo\": \"{{count}} 時間前\",\n \"daysAgo\": \"{{count}} 日前\",\n \"multiplePlans\": \"{{count}} プラン\",\n \"expand\": \"展開\",\n \"collapse\": \"折りたたむ\",\n \"modelIdPlaceholder\": \"例: claude-3-5-sonnet-20241022\",\n \"displayNamePlaceholder\": \"例: Claude 3.5 Sonnet\",\n \"appType\": \"アプリ種別\",\n \"allApps\": \"すべてのアプリ\",\n \"statusCode\": \"ステータスコード\",\n \"searchProviderPlaceholder\": \"プロバイダーを検索...\",\n \"searchModelPlaceholder\": \"モデルを検索...\",\n \"timeRange\": \"期間\",\n \"customRange\": \"カレンダーフィルター\",\n \"customRangeHint\": \"日付と時刻の両方に対応\",\n \"startTime\": \"開始時刻\",\n \"endTime\": \"終了時刻\",\n \"input\": \"Input\",\n \"output\": \"Output\",\n \"cacheWrite\": \"作成\",\n \"cacheWriteNotReported\": \"OpenAI プロトコルはキャッシュ作成を区別せず、キャッシュヒットのみ報告します\",\n \"cacheWritePartial\": \"一部のプロトコル(OpenAIなど)はキャッシュ作成を報告しないため、値は不完全な可能性があります\",\n \"cacheRead\": \"ヒット\",\n \"baseCost\": \"基本\",\n \"costMultiplier\": \"コスト倍率\",\n \"withMultiplier\": \"倍率込み\",\n \"requestDetail\": \"リクエスト詳細\",\n \"requestNotFound\": \"リクエストが見つかりません\",\n \"basicInfo\": \"基本情報\",\n \"tokenUsage\": \"Token 使用量\",\n \"cacheCreationCost\": \"キャッシュ作成コスト\",\n \"costBreakdown\": \"コスト明細\",\n \"performance\": \"パフォーマンス\",\n \"latency\": \"レイテンシー\",\n \"errorMessage\": \"エラーメッセージ\",\n \"requests\": \"リクエスト数\",\n \"tokens\": \"トークン\",\n \"avgCost\": \"平均コスト\",\n \"avgLatency\": \"平均レイテンシ\",\n \"successRate\": \"成功率\",\n \"requestId\": \"リクエスト ID\",\n \"never\": \"なし\",\n \"modelId\": \"モデル ID\",\n \"modelIdRequired\": \"モデル ID は必須です\",\n \"inputCostPerMillion\": \"入力コスト(100万トークンあたり、USD)\",\n \"outputCostPerMillion\": \"出力コスト(100万トークンあたり、USD)\",\n \"invalidPrice\": \"価格は負でない数値である必要があります\",\n \"invalidTimeRange\": \"開始/終了時刻を完全に選択してください\",\n \"invalidTimeRangeOrder\": \"開始時刻は終了時刻より前である必要があります\",\n \"timeRangeTooLarge\": \"時間範囲が大きすぎます。範囲を縮小してください\",\n \"addPricing\": \"価格設定を追加\",\n \"editPricing\": \"価格設定を編集\",\n \"pricingAdded\": \"価格設定が追加されました\",\n \"pricingUpdated\": \"価格設定が更新されました\",\n \"cacheReadCostPerMillion\": \"キャッシュ読み取りコスト(100万トークンあたり、USD)\",\n \"cacheCreationCostPerMillion\": \"キャッシュ書き込みコスト(100万トークンあたり、USD)\"\n },\n \"usageScript\": {\n \"title\": \"利用状況を設定\",\n \"enableUsageQuery\": \"利用状況照会を有効にする\",\n \"presetTemplate\": \"プリセットテンプレート\",\n \"requestUrl\": \"リクエスト URL\",\n \"requestUrlPlaceholder\": \"例: https://api.example.com\",\n \"method\": \"HTTP メソッド\",\n \"templateCustom\": \"カスタム\",\n \"templateGeneral\": \"General\",\n \"templateNewAPI\": \"NewAPI\",\n \"templateCopilot\": \"GitHub Copilot\",\n \"templateTokenPlan\": \"Token Plan\",\n \"templateBalance\": \"公式\",\n \"templateOfficialSubscription\": \"公式サブスクリプション\",\n \"copilotAutoAuth\": \"OAuth 認証を自動使用、手動設定不要\",\n \"tokenPlanHint\": \"プロバイダーのAPI KeyとBase URLを使用してToken Planクォータを自動クエリ\",\n \"balanceHint\": \"プロバイダーのAPI Keyを使用してアカウント残高を自動クエリ\",\n \"officialSubscriptionHint\": \"ローカル CLI の OAuth 認証情報を読み取り、公式 API でサブスクリプション枠を照会します。既定では無効で、有効化した後のみリクエストします。\",\n \"resetDate\": \"リセット日\",\n \"premiumRequests\": \"Premium リクエスト\",\n \"credentialsConfig\": \"認証情報\",\n \"credentialsHint\": \"空欄の場合はプロバイダー設定を使用\",\n \"optional\": \"オプション\",\n \"apiKeyPlaceholder\": \"空欄の場合はプロバイダーの API Key を使用\",\n \"baseUrlPlaceholder\": \"空欄の場合はプロバイダーの Base URL を使用\",\n \"baseUrl\": \"Base URL\",\n \"accessToken\": \"Access Token\",\n \"accessTokenPlaceholder\": \"「Security Settings」で生成\",\n \"userId\": \"ユーザー ID\",\n \"userIdPlaceholder\": \"例: 114514\",\n \"defaultPlan\": \"デフォルトプラン\",\n \"queryFailedMessage\": \"照会に失敗しました\",\n \"queryScript\": \"照会スクリプト (JavaScript)\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"headers\": \"ヘッダー\",\n \"body\": \"ボディ\",\n \"timeoutHint\": \"範囲: 2〜30 秒\",\n \"timeoutMustBeInteger\": \"タイムアウトは整数で入力してください(小数は切り捨て)\",\n \"timeoutCannotBeNegative\": \"タイムアウトは負の値にできません\",\n \"autoIntervalMinutes\": \"自動照会間隔(分、0 で無効)\",\n \"autoQueryInterval\": \"自動照会間隔(分)\",\n \"autoQueryIntervalHint\": \"0 で無効。推奨 5〜60 分\",\n \"intervalMustBeInteger\": \"間隔は整数で入力してください(小数は切り捨て)\",\n \"intervalCannotBeNegative\": \"間隔は負の値にできません\",\n \"intervalAdjusted\": \"間隔を {{value}} 分に調整しました\",\n \"scriptHelp\": \"スクリプトの書き方:\",\n \"configFormat\": \"設定の形式:\",\n \"commentOptional\": \"任意\",\n \"commentResponseIsJson\": \"response は API から返る JSON データです\",\n \"extractorFormat\": \"抽出関数の返却形式(すべて任意):\",\n \"tips\": \"💡 ヒント:\",\n \"testing\": \"テスト中...\",\n \"testScript\": \"スクリプトをテスト\",\n \"format\": \"整形\",\n \"saveConfig\": \"設定を保存\",\n \"scriptEmpty\": \"スクリプト設定は空にできません\",\n \"mustHaveReturn\": \"スクリプトには return 文が必要です\",\n \"testSuccess\": \"テスト成功!\",\n \"testFailed\": \"テストに失敗しました\",\n \"formatSuccess\": \"整形に成功しました\",\n \"formatFailed\": \"整形に失敗しました\",\n \"supportedVariables\": \"使用可能な変数\",\n \"variablesHint\": \"使用可能な変数: {{apiKey}}, {{baseUrl}} | extractor 関数には API 応答の JSON オブジェクトが渡されます\",\n \"scriptConfig\": \"リクエスト設定\",\n \"extractorCode\": \"抽出コード\",\n \"extractorHint\": \"戻り値のオブジェクトに残り枠の項目を含めてください\",\n \"fieldIsValid\": \"• isValid: Boolean。プランが有効かどうか\",\n \"fieldInvalidMessage\": \"• invalidMessage: String。無効時の理由(isValid が false のとき表示)\",\n \"fieldRemaining\": \"• remaining: Number。残り枠\",\n \"fieldUnit\": \"• unit: String。単位(例: \\\"USD\\\")\",\n \"fieldPlanName\": \"• planName: String。プラン名\",\n \"fieldTotal\": \"• total: Number。総枠\",\n \"fieldUsed\": \"• used: Number。使用量\",\n \"fieldExtra\": \"• extra: String。自由記述の追加テキスト\",\n \"tip1\": \"• 変数 {{apiKey}} と {{baseUrl}} は自動で置換されます\",\n \"tip2\": \"• 抽出関数はサンドボックスで実行され、ES2020+ の構文を使えます\",\n \"tip3\": \"• 全体を () で囲み、オブジェクトリテラル式にしてください\"\n },\n \"errors\": {\n \"usage_query_failed\": \"利用状況の取得に失敗しました\",\n \"configLoadFailedTitle\": \"設定の読み込みに失敗しました\",\n \"configLoadFailedMessage\": \"設定ファイルを読み込めません:\\n{{path}}\\n\\nエラー詳細:\\n{{detail}}\\n\\nJSON が正しいか確認するか、同じディレクトリのバックアップファイル(config.json.bak など)から復元してください。\\n\\nアプリを終了して修正してください。\",\n \"mcpPageLoadFailed\": \"MCP検出ページの読み込みに失敗しました\",\n \"mcpPageLoadDescription\": \"MCPレジストリページのレンダリングでエラーが発生しました。データの異常またはネットワークの問題が原因の可能性があります。\",\n \"pageLoadFailed\": \"ページの読み込みに失敗しました\",\n \"pageLoadFailedDescription\": \"現在のビューのレンダリング中に予期しないエラーが発生しました。他のページに切り替えるか、ページを更新してください。\"\n },\n \"presetSelector\": {\n \"title\": \"設定タイプを選択\",\n \"custom\": \"カスタム\",\n \"customDescription\": \"手動で設定。完全な構成が必要\",\n \"officialDescription\": \"公式ログイン。API Key 不要\",\n \"presetDescription\": \"プリセットを使用。API Key だけ入力すれば OK\"\n },\n \"mcp\": {\n \"title\": \"MCP 管理\",\n \"import\": \"インポート\",\n \"importExisting\": \"既存をインポート\",\n \"addMcp\": \"MCPを追加\",\n \"discover\": \"MCPを発見\",\n \"claudeTitle\": \"Claude Code MCP 管理\",\n \"codexTitle\": \"Codex MCP 管理\",\n \"geminiTitle\": \"Gemini MCP 管理\",\n \"unifiedPanel\": {\n \"title\": \"MCP サーバー管理\",\n \"addServer\": \"サーバーを追加\",\n \"editServer\": \"サーバーを編集\",\n \"deleteServer\": \"サーバーを削除\",\n \"deleteConfirm\": \"サーバー「{{id}}」を削除しますか?この操作は元に戻せません。\",\n \"noServers\": \"まだサーバーがありません\",\n \"enabledApps\": \"有効なアプリ\",\n \"noImportFound\": \"インポートする MCP サーバーが見つかりませんでした。すべてのサーバーは OpenSunstar で管理されています。\",\n \"importSuccess\": \"{{count}} 個の MCP サーバーをインポートしました\",\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n }\n },\n \"userLevelPath\": \"ユーザーレベルの MCP パス\",\n \"serverList\": \"サーバー一覧\",\n \"loading\": \"読み込み中...\",\n \"empty\": \"MCP サーバーがありません\",\n \"emptyDescription\": \"右上のボタンから最初の MCP サーバーを追加してください\",\n \"add\": \"MCP を追加\",\n \"addServer\": \"MCP を追加\",\n \"editServer\": \"MCP を編集\",\n \"addClaudeServer\": \"Claude Code MCP を追加\",\n \"editClaudeServer\": \"Claude Code MCP を編集\",\n \"addCodexServer\": \"Codex MCP を追加\",\n \"editCodexServer\": \"Codex MCP を編集\",\n \"configPath\": \"設定パス\",\n \"serverCount\": \"MCP サーバー: {{count}} 件\",\n \"enabledCount\": \"{{count}} 件が有効\",\n \"template\": {\n \"fetch\": \"クイックテンプレート: mcp-fetch\"\n },\n \"form\": {\n \"title\": \"MCP ID(ユニーク)\",\n \"titlePlaceholder\": \"my-mcp-server\",\n \"name\": \"表示名\",\n \"namePlaceholder\": \"例: @modelcontextprotocol/server-time\",\n \"enabledApps\": \"適用するアプリ\",\n \"noAppsWarning\": \"少なくとも 1 つ選択してください\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"tags\": \"タグ(カンマ区切り)\",\n \"tagsPlaceholder\": \"stdio, time, utility\",\n \"homepage\": \"ホームページ\",\n \"homepagePlaceholder\": \"https://example.com\",\n \"docs\": \"ドキュメント\",\n \"docsPlaceholder\": \"https://example.com/docs\",\n \"additionalInfo\": \"追加情報\",\n \"jsonConfig\": \"JSON 全設定\",\n \"jsonConfigOrPrefix\": \"JSON 全設定、または\",\n \"tomlConfigOrPrefix\": \"TOML 全設定、または\",\n \"jsonPlaceholder\": \"{\\n \\\"type\\\": \\\"stdio\\\",\\n \\\"command\\\": \\\"uvx\\\",\\n \\\"args\\\": [\\\"mcp-server-fetch\\\"]\\n}\",\n \"tomlConfig\": \"TOML 全設定\",\n \"tomlPlaceholder\": \"type = \\\"stdio\\\"\\ncommand = \\\"uvx\\\"\\nargs = [\\\"mcp-server-fetch\\\"]\",\n \"useWizard\": \"設定ウィザード\",\n \"syncOtherSide\": \"{{target}} にも反映\",\n \"syncOtherSideHint\": \"{{target}} に同じ設定を書き込みます。既存の同一 ID は上書きされます。\",\n \"willOverwriteWarning\": \"{{target}} の既存設定を上書きします\"\n },\n \"wizard\": {\n \"title\": \"MCP 設定ウィザード\",\n \"hint\": \"MCP サーバーを素早く設定し JSON を自動生成します\",\n \"type\": \"タイプ\",\n \"typeStdio\": \"stdio\",\n \"typeHttp\": \"http\",\n \"typeSse\": \"sse\",\n \"command\": \"コマンド\",\n \"commandPlaceholder\": \"npx または uvx\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"arg1\\narg2\",\n \"env\": \"環境変数\",\n \"envPlaceholder\": \"KEY1=value1\\nKEY2=value2\",\n \"url\": \"URL\",\n \"urlPlaceholder\": \"https://api.example.com/mcp\",\n \"urlRequired\": \"URL を入力してください\",\n \"headers\": \"ヘッダー(任意)\",\n \"headersPlaceholder\": \"Authorization: Bearer your_token_here\\nContent-Type: application/json\",\n \"preview\": \"設定プレビュー\",\n \"apply\": \"設定を反映\"\n },\n \"id\": \"識別子(ユニーク)\",\n \"type\": \"タイプ\",\n \"command\": \"コマンド\",\n \"validateCommand\": \"コマンドを検証\",\n \"args\": \"引数\",\n \"argsPlaceholder\": \"例: mcp-server-fetch --help\",\n \"env\": \"環境変数(1 行に 1 件、KEY=VALUE)\",\n \"envPlaceholder\": \"FOO=bar\\nHELLO=world\",\n \"reset\": \"リセット\",\n \"msg\": {\n \"saved\": \"保存しました\",\n \"deleted\": \"削除しました\",\n \"enabled\": \"有効化しました\",\n \"disabled\": \"無効化しました\",\n \"templateAdded\": \"テンプレートを追加しました\"\n },\n \"error\": {\n \"idRequired\": \"識別子を入力してください\",\n \"idExists\": \"この識別子は既に存在します。別のものを選んでください。\",\n \"jsonInvalid\": \"JSON 形式が無効です\",\n \"tomlInvalid\": \"TOML 形式が無効です\",\n \"commandRequired\": \"コマンドを入力してください\",\n \"singleServerObjectRequired\": \"単一の MCP サーバーオブジェクトを貼り付けてください(トップレベルの mcpServers は不要)\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteFailed\": \"削除に失敗しました\"\n },\n \"test\": {\n \"testConnection\": \"接続テスト\",\n \"batchTestConnection\": \"全サーバーの接続を一括テスト\",\n \"batchProgress\": \"テスト中... ({{completed}}/{{total}})\",\n \"allConnected\": \"全 {{count}} サーバーが正常に接続しました\",\n \"batchSummary\": \"{{connected}} 成功、{{failed}} 失敗(全 {{total}} 件)\",\n \"noServersToTest\": \"テストするサーバーがありません\",\n \"connected\": \"接続済み\",\n \"authRequired\": \"認証が必要\",\n \"unreachable\": \"接続できません\",\n \"timeout\": \"タイムアウト\",\n \"commandFailed\": \"起動失敗\",\n \"unexpected\": \"予期しない応答\"\n },\n \"validation\": {\n \"ok\": \"コマンドが見つかりました\",\n \"fail\": \"コマンドが見つかりません\"\n },\n \"confirm\": {\n \"deleteTitle\": \"MCP サーバーを削除\",\n \"deleteMessage\": \"MCP サーバー「{{id}}」を削除してもよろしいですか?この操作は元に戻せません。\"\n },\n \"presets\": {\n \"title\": \"MCP タイプを選択\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効\",\n \"installed\": \"インストール済み\",\n \"docs\": \"ドキュメント\",\n \"requiresEnv\": \"環境変数が必要\",\n \"fetch\": {\n \"name\": \"mcp-server-fetch\",\n \"description\": \"汎用 HTTP リクエストツール。GET/POST などに対応し、API テストや Web データ取得に最適です\"\n },\n \"time\": {\n \"name\": \"@modelcontextprotocol/server-time\",\n \"description\": \"現在時刻、タイムゾーン変換、日付計算を提供する時間クエリツール\"\n },\n \"memory\": {\n \"name\": \"@modelcontextprotocol/server-memory\",\n \"description\": \"エンティティ・関係・観測を扱うナレッジグラフ型メモリ。会話の重要情報を AI に記憶させます\"\n },\n \"sequential-thinking\": {\n \"name\": \"@modelcontextprotocol/server-sequential-thinking\",\n \"description\": \"複雑な問題をステップに分解して深く考えるためのシーケンシャル思考ツール\"\n },\n \"context7\": {\n \"name\": \"@upstash/context7-mcp\",\n \"description\": \"最新のライブラリドキュメントとコード例を提供する Context7 ドキュメント検索ツール。キー設定で上限が拡張されます\"\n }\n }\n },\n \"prompts\": {\n \"manage\": \"Prompt & Rules\",\n \"title\": \"Prompt & Rules\",\n \"claudeTitle\": \"Claude プロンプト管理\",\n \"codexTitle\": \"Codex プロンプト管理\",\n \"add\": \"プロンプトを追加\",\n \"edit\": \"プロンプトを編集\",\n \"addTitle\": \"{{appName}} プロンプトを追加\",\n \"editTitle\": \"{{appName}} プロンプトを編集\",\n \"import\": \"既存をインポート\",\n \"count\": \"{{count}} 件のプロンプト\",\n \"enabled\": \"有効\",\n \"enable\": \"有効化\",\n \"enabledName\": \"有効: {{name}}\",\n \"noneEnabled\": \"有効なプロンプトがありません\",\n \"currentFile\": \"現在の {{filename}} の内容\",\n \"empty\": \"まだプロンプトがありません\",\n \"emptyDescription\": \"上のボタンからプロンプトを追加またはインポートしてください\",\n \"loading\": \"読み込み中...\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例: デフォルトプロジェクトプロンプト\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"任意の説明\",\n \"content\": \"内容\",\n \"contentPlaceholder\": \"# {{filename}}\\n\\nここにプロンプト内容を入力...\",\n \"loadFailed\": \"プロンプトの読み込みに失敗しました\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"deleteSuccess\": \"削除しました\",\n \"deleteFailed\": \"削除に失敗しました\",\n \"enableSuccess\": \"有効化しました\",\n \"enableFailed\": \"有効化に失敗しました\",\n \"disableSuccess\": \"無効化しました\",\n \"disableFailed\": \"無効化に失敗しました\",\n \"importSuccess\": \"インポートしました\",\n \"importFailed\": \"インポートに失敗しました\",\n \"confirm\": {\n \"deleteTitle\": \"削除の確認\",\n \"deleteMessage\": \"プロンプト「{{name}}」を削除してもよろしいですか?\"\n }\n },\n \"workspace\": {\n \"title\": \"プロジェクトコックピット\",\n \"manage\": \"ワークスペース\",\n \"dashboard\": {\n \"activeSub\": \"コミット {{commits}} 件 · 活動度 {{tier}}\"\n },\n \"files\": {\n \"agents\": \"エージェントの操作指示とルール\",\n \"soul\": \"エージェントの人格とコミュニケーションスタイル\",\n \"user\": \"ユーザープロファイルと設定\",\n \"identity\": \"エージェントの名前とアバター\",\n \"tools\": \"ローカルツールドキュメント\",\n \"memory\": \"長期記憶と意思決定記録\",\n \"heartbeat\": \"ハートビート実行チェックリスト\",\n \"bootstrap\": \"初回実行ブートストラップ\",\n \"boot\": \"ゲートウェイ再起動チェックリスト\"\n },\n \"editing\": \"{{filename}} を編集\",\n \"saveSuccess\": \"保存しました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"openDirectory\": \"ファイルマネージャーで開く\",\n \"dailyMemory\": {\n \"title\": \"デイリーメモリー\",\n \"sectionTitle\": \"デイリーメモリー\",\n \"cardTitle\": \"デイリーメモリーファイル\",\n \"cardDescription\": \"デイリーメモリーの閲覧・管理\",\n \"createToday\": \"メモリーを追加\",\n \"empty\": \"デイリーメモリーファイルはまだありません\",\n \"loadFailed\": \"デイリーメモリーファイルの読み込みに失敗しました\",\n \"createFailed\": \"デイリーメモリーファイルの作成に失敗しました\",\n \"deleteSuccess\": \"デイリーメモリーファイルを削除しました\",\n \"deleteFailed\": \"デイリーメモリーファイルの削除に失敗しました\",\n \"confirmDeleteTitle\": \"デイリーメモリーを削除\",\n \"confirmDeleteMessage\": \"{{date}} のデイリーメモリーを削除しますか?この操作は取り消せません。\",\n \"searchPlaceholder\": \"全文検索...\",\n \"searchScopeHint\": \"すべてのデイリーメモリーを全文検索 ⌘F\",\n \"searchCloseHint\": \"Escで閉じる\",\n \"noSearchResults\": \"検索に一致するデイリーメモリーはありません。\",\n \"searching\": \"検索中...\",\n \"searchFailed\": \"検索に失敗しました\",\n \"matchCount\": \"{{count}}件一致\"\n },\n \"subtitle\": \"各プロジェクトの AI 設定状態と最近の活動状況をまとめ、見るべきものから見せます\",\n \"sidebar\": {\n \"currentProjectAssets\": \"{{name}} · AI 設定\"\n },\n \"tabs\": {\n \"label\": \"ワークスペースビュー\",\n \"dashboard\": \"アラート\",\n \"board\": \"プロジェクトボード\"\n }\n },\n \"openclaw\": {\n \"backupCreated\": \"バックアップを作成しました: {{path}}\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"設定ファイル内のユニーク識別子。小文字、数字、ハイフンのみ使用可能。\",\n \"providerKeyLockedHint\": \"このプロバイダーは既にアプリ設定へ追加されているため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーを入力してください\",\n \"providerKeyDuplicate\": \"このキーは既に使用されています\",\n \"providerKeyInvalid\": \"無効な形式です。小文字、数字、ハイフンのみ使用可能。\",\n \"apiProtocol\": \"API プロトコル\",\n \"selectProtocol\": \"API プロトコルを選択\",\n \"apiProtocolHint\": \"プロバイダーの API と互換性のあるプロトコルタイプを選択してください。ほとんどのプロバイダーは OpenAI Completions 形式を使用します。\",\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイントアドレス。\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデルが設定されていません。「モデルを追加」をクリックして利用可能なモデルを設定してください。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"claude-3-sonnet\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude 3 Sonnet\",\n \"contextWindow\": \"コンテキストウィンドウ\",\n \"maxTokens\": \"最大出力トークン数\",\n \"reasoning\": \"推論モード\",\n \"reasoningOn\": \"有効\",\n \"reasoningOff\": \"無効\",\n \"inputTypes\": \"入力タイプ\",\n \"inputCost\": \"入力コスト ($/M トークン)\",\n \"outputCost\": \"出力コスト ($/M トークン)\",\n \"advancedOptions\": \"詳細オプション\",\n \"cacheReadCost\": \"キャッシュ読取コスト ($/M トークン)\",\n \"cacheWriteCost\": \"キャッシュ書込コスト ($/M トークン)\",\n \"cacheCostHint\": \"キャッシュコストは Prompt Caching のコスト計算に使用されます。キャッシュを使用しない場合は空欄のままにしてください。\",\n \"modelsHint\": \"このプロバイダーがサポートするモデルを設定します。モデル ID は API 呼び出しに、表示名はインターフェースに使用されます。\",\n \"userAgent\": \"User-Agent を送信\",\n \"userAgentHint\": \"一部のプロバイダーはブラウザの User-Agent ヘッダーが必要です。\",\n \"env\": {\n \"title\": \"環境変数\",\n \"description\": \"openclaw.json の環境変数設定を管理(APIキー、カスタム変数など)\",\n \"editorHint\": \"env セクション全体を JSON として編集します。env.vars や env.shellEnv などのネストしたオブジェクトにも対応しています。\",\n \"objectRequired\": \"OpenClaw の env は JSON オブジェクトである必要があります。\",\n \"invalidJson\": \"OpenClaw の env は有効な JSON である必要があります。\",\n \"empty\": \"OpenClaw の env は空にできません。空オブジェクトの場合は {} を使用してください。\",\n \"keyPlaceholder\": \"変数名\",\n \"valuePlaceholder\": \"値\",\n \"add\": \"変数を追加\",\n \"saveSuccess\": \"環境変数を保存しました\",\n \"saveFailed\": \"環境変数の保存に失敗しました\",\n \"loadFailed\": \"環境変数の読み込みに失敗しました\",\n \"duplicateKey\": \"重複する変数名が検出されました: {{key}}\"\n },\n \"tools\": {\n \"title\": \"ツール権限\",\n \"description\": \"openclaw.json のツール権限設定を管理(許可/拒否リスト)\",\n \"profile\": \"権限プロファイル\",\n \"profileMinimal\": \"最小\",\n \"profileCoding\": \"コーディング\",\n \"profileMessaging\": \"メッセージ\",\n \"profileFull\": \"フルアクセス\",\n \"profileUnset\": \"未設定\",\n \"unsupportedProfileTitle\": \"未対応のツールプロファイルを検出しました\",\n \"unsupportedProfileDescription\": \"現在の tools.profile の値 '{{value}}' は OpenClaw の対応リストにありません。新しい値を選択するまでこの値を保持します。\",\n \"unsupportedProfileLabel\": \"未対応\",\n \"allowList\": \"許可リスト\",\n \"denyList\": \"拒否リスト\",\n \"patternPlaceholder\": \"ツール名またはパターン\",\n \"addAllow\": \"許可を追加\",\n \"addDeny\": \"拒否を追加\",\n \"saveSuccess\": \"ツール権限を保存しました\",\n \"saveFailed\": \"ツール権限の保存に失敗しました\",\n \"loadFailed\": \"ツール権限の読み込みに失敗しました\"\n },\n \"agents\": {\n \"title\": \"Agents 設定\",\n \"description\": \"openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)\",\n \"modelSection\": \"モデル設定\",\n \"primaryModel\": \"デフォルトモデル\",\n \"primaryModelHint\": \"設定済みプロバイダのモデルから選択してください\",\n \"notSet\": \"未設定\",\n \"fallbackModels\": \"フォールバックモデル\",\n \"fallbackModelsHint\": \"プライマリモデルが利用不可の場合、優先度順にフォールバックが試行されます\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"noModels\": \"設定済みのプロバイダモデルがありません。先に OpenClaw プロバイダを追加してください。\",\n \"notInList\": \"{{value}} (未設定)\",\n \"runtimeSection\": \"ランタイムパラメータ\",\n \"workspace\": \"ワークスペースパス\",\n \"timeout\": \"タイムアウト(秒)\",\n \"contextTokens\": \"コンテキストトークン数\",\n \"maxConcurrent\": \"最大同時実行数\",\n \"legacyTimeoutTitle\": \"旧タイムアウト設定を検出しました\",\n \"legacyTimeoutDescription\": \"この設定ではまだ agents.defaults.timeout を使用しています。ここで保存すると timeoutSeconds に移行されます。\",\n \"saveSuccess\": \"Agents 設定を保存しました\",\n \"saveFailed\": \"Agents 設定の保存に失敗しました\",\n \"loadFailed\": \"Agents 設定の読み込みに失敗しました\"\n },\n \"health\": {\n \"title\": \"OpenClaw 設定の警告を検出しました\",\n \"invalidToolsProfile\": \"tools.profile に未対応の値が設定されています。OpenClaw が現在サポートしているのは minimal、coding、messaging、full です。\",\n \"legacyTimeout\": \"agents.defaults.timeout は非推奨です。Agents パネルを保存すると timeoutSeconds に移行されます。\",\n \"stringifiedEnvVars\": \"env.vars はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"stringifiedShellEnv\": \"env.shellEnv はオブジェクトである必要がありますが、現在の値は文字列化または破損しているようです。\",\n \"parseFailed\": \"openclaw.json を有効な JSON5 として解析できませんでした。ここで編集する前にファイルを修正してください。\"\n },\n \"primaryModel\": \"プライマリモデル\",\n \"fallbackModel\": \"フォールバックモデル\"\n },\n \"hermes\": {\n \"form\": {\n \"baseUrl\": \"API エンドポイント\",\n \"baseUrlHint\": \"プロバイダーの API エンドポイント URL。\",\n \"providerKey\": \"プロバイダーキー\",\n \"providerKeyPlaceholder\": \"my-provider\",\n \"providerKeyHint\": \"小文字、数字、ハイフンのみ。config.yaml のプロバイダー名として使用されます。\",\n \"providerKeyLockedHint\": \"このプロバイダーは Hermes 設定に追加済みのため、キーは変更できません。\",\n \"providerKeyRequired\": \"プロバイダーキーは必須です\",\n \"providerKeyInvalid\": \"プロバイダーキーは小文字、数字、ハイフンのみ使用できます\",\n \"providerKeyDuplicate\": \"このプロバイダーキーは既に存在します\",\n \"apiMode\": \"API モード\",\n \"apiModeHint\": \"プロバイダーの API プロトコル。エンドポイントに合わせて正しい形式を選択してください。\",\n \"apiModeChatCompletions\": \"OpenAI Chat Completions\",\n \"apiModeAnthropicMessages\": \"Anthropic Messages\",\n \"apiModeCodexResponses\": \"OpenAI Responses\",\n \"apiModeBedrockConverse\": \"AWS Bedrock Converse\",\n \"baseUrlRequired\": \"API エンドポイントは必須です\",\n \"baseUrlScheme\": \"http:// または https:// で始まるアドレスを指定してください\",\n \"baseUrlInvalid\": \"API エンドポイントは有効な URL ではありません\",\n \"models\": \"モデル一覧\",\n \"addModel\": \"モデルを追加\",\n \"noModels\": \"モデル未設定。このプロバイダーに切り替えてもデフォルトモデルは更新されません。\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"anthropic/claude-opus-4-8\",\n \"modelName\": \"表示名\",\n \"modelNamePlaceholder\": \"Claude Opus 4.8\",\n \"contextLength\": \"コンテキスト長\",\n \"advancedOptions\": \"詳細オプション\",\n \"modelsHint\": \"切り替え時、最初のモデルが model.default に書き込まれます。\",\n \"primaryModel\": \"デフォルト\",\n \"fallbackModel\": \"予備\",\n \"providerAdvanced\": \"プロバイダー詳細オプション\",\n \"rateLimitDelay\": \"リクエスト間隔(秒)\",\n \"rateLimitDelayHint\": \"連続したリクエスト間の最小待機秒数(任意)。空欄の場合は制限なし。\"\n },\n \"webui\": {\n \"open\": \"Hermes Web UI を開く\",\n \"offline\": \"Hermes Web UI が起動していません。まず `hermes dashboard` を実行してください。\",\n \"openFailed\": \"Hermes Web UI を開けませんでした\",\n \"launchConfirmTitle\": \"Hermes Dashboard が起動していません\",\n \"launchConfirmMessage\": \"ターミナルを開いて `hermes dashboard` を実行しますか?\\n\\n起動完了後、ブラウザが自動的に開きます。\\n\\nターミナルに `hermes` が見つからない、または web 依存が不足するというエラーが表示される場合は、まず次を実行してください:\\npip install hermes-agent[web]\",\n \"launchConfirmAction\": \"ターミナルを開いて起動\",\n \"launching\": \"ターミナルで hermes dashboard を起動しました。\",\n \"launchFailed\": \"ターミナルを開けませんでした\"\n },\n \"memory\": {\n \"title\": \"メモリ\",\n \"agentTab\": \"エージェント記憶 (MEMORY.md)\",\n \"userTab\": \"ユーザープロファイル (USER.md)\",\n \"usage\": \"{{current}} / {{limit}} 文字\",\n \"overLimit\": \"上限を超えました。Hermes は次回読み込み時に切り詰めます\",\n \"enableOn\": \"有効\",\n \"enableOff\": \"無効\",\n \"disabledHint\": \"再度有効化するまで Hermes はこの記憶をスキップします\",\n \"toggleFailed\": \"メモリの切り替えに失敗しました\",\n \"saveSuccess\": \"記憶を保存しました\",\n \"saveFailed\": \"記憶の保存に失敗しました\",\n \"loadFailed\": \"記憶ファイルの読み込みに失敗しました\",\n \"openConfig\": \"Hermes Web UI で上限を調整\",\n \"runtimeNote\": \"変更は Hermes の再起動または新規セッション時に反映されます。\"\n }\n },\n \"env\": {\n \"warning\": {\n \"title\": \"競合する環境変数を検出しました\",\n \"description\": \"設定を上書きする可能性のある環境変数を {{count}} 件見つけました\"\n },\n \"actions\": {\n \"expand\": \"詳細を表示\",\n \"collapse\": \"折りたたむ\",\n \"selectAll\": \"すべて選択\",\n \"clearSelection\": \"選択を解除\",\n \"deleteSelected\": \"選択 {{count}} 件を削除\",\n \"deleting\": \"削除中...\"\n },\n \"field\": {\n \"value\": \"値\",\n \"source\": \"ソース\"\n },\n \"source\": {\n \"userRegistry\": \"ユーザー環境変数(レジストリ)\",\n \"systemRegistry\": \"システム環境変数(レジストリ)\",\n \"systemEnv\": \"システム環境変数\"\n },\n \"delete\": {\n \"success\": \"環境変数を削除しました\",\n \"error\": \"環境変数の削除に失敗しました\"\n },\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"confirm\": {\n \"title\": \"環境変数を削除しますか?\",\n \"message\": \"{{count}} 件の環境変数を削除してもよろしいですか?\",\n \"backupNotice\": \"削除前に自動バックアップを作成します。後で復元できます。再起動またはターミナル再起動後に反映されます。\",\n \"confirm\": \"削除を確認\"\n },\n \"error\": {\n \"noSelection\": \"削除する環境変数を選択してください\"\n }\n },\n \"skills\": {\n \"manage\": \"Skills\",\n \"title\": \"Skills 管理\",\n \"description\": \"人気リポジトリからスキルを探してインストールし、Claude Code/Codex/Gemini を拡張\",\n \"refresh\": \"更新\",\n \"refreshing\": \"更新中...\",\n \"repoManager\": \"リポジトリ管理\",\n \"count\": \"{{count}} 個のスキル\",\n \"empty\": \"スキルがありません\",\n \"emptyDescription\": \"スキルリポジトリを追加して探索してください\",\n \"addRepo\": \"スキルリポジトリを追加\",\n \"loading\": \"読み込み中...\",\n \"installed\": \"インストール済み\",\n \"install\": \"インストール\",\n \"installing\": \"インストール中...\",\n \"uninstall\": \"アンインストール\",\n \"uninstalling\": \"アンインストール中...\",\n \"view\": \"表示\",\n \"noDescription\": \"説明なし\",\n \"loadFailed\": \"読み込みに失敗しました\",\n \"installSuccess\": \"スキル {{name}} をインストールしました\",\n \"installFailed\": \"インストールに失敗しました\",\n \"uninstallSuccess\": \"スキル {{name}} をアンインストールしました\",\n \"uninstallFailed\": \"アンインストールに失敗しました\",\n \"update\": \"更新\",\n \"updating\": \"更新中...\",\n \"updateAvailable\": \"更新あり\",\n \"updateSuccess\": \"スキル {{name}} を最新バージョンに更新しました\",\n \"updateFailed\": \"更新に失敗しました\",\n \"checkUpdates\": \"更新を確認\",\n \"checkingUpdates\": \"確認中...\",\n \"noUpdates\": \"すべてのスキルは最新です\",\n \"updatesFound\": \"{{count}} 個のスキルに更新があります\",\n \"updateAll\": \"すべて更新 ({{count}})\",\n \"updatingAll\": \"更新中...\",\n \"updateAllSuccess\": \"{{count}} 個のスキルを更新しました\",\n \"error\": {\n \"skillNotFound\": \"スキルが見つかりません: {{directory}}\",\n \"missingRepoInfo\": \"リポジトリ情報(owner または name)が不足しています\",\n \"downloadTimeout\": \"リポジトリ {{owner}}/{{name}} のダウンロードがタイムアウトしました({{timeout}} 秒)\",\n \"downloadTimeoutHint\": \"ネットワークを確認するか、時間をおいて再試行してください\",\n \"skillPathNotFound\": \"リポジトリ {{owner}}/{{name}} にスキルパス '{{path}}' がありません\",\n \"skillDirNotFound\": \"スキルディレクトリが見つかりません: {{path}}\",\n \"directoryConflict\": \"スキルディレクトリ '{{directory}}' は既に {{existing_repo}} で使用されています。{{new_repo}} からインストールできません\",\n \"emptyArchive\": \"ダウンロードしたアーカイブが空です\",\n \"downloadFailed\": \"ダウンロードに失敗しました: HTTP {{status}}\",\n \"allBranchesFailed\": \"すべてのブランチで失敗しました。試行: {{branches}}\",\n \"httpError\": \"HTTP エラー {{status}}\",\n \"http403\": \"GitHub へのアクセスが制限されています(レート制限の可能性)\",\n \"http404\": \"リポジトリまたはブランチが見つかりません。URL を確認してください\",\n \"http429\": \"リクエストが多すぎます。時間をおいて再試行してください\",\n \"parseMetadataFailed\": \"スキルメタデータの解析に失敗しました\",\n \"getHomeDirFailed\": \"ユーザーのホームディレクトリを取得できません\",\n \"noSkillsInZip\": \"ZIP ファイルにスキルが見つかりません(SKILL.md ファイルが必要です)\",\n \"networkError\": \"ネットワークエラー\",\n \"fsError\": \"ファイルシステムエラー\",\n \"unknownError\": \"不明なエラー\",\n \"suggestion\": {\n \"checkNetwork\": \"ネットワーク接続を確認してください\",\n \"checkProxy\": \"HTTP プロキシの設定を検討してください\",\n \"retryLater\": \"時間をおいて再試行してください\",\n \"checkRepoUrl\": \"リポジトリ URL とブランチ名を確認してください\",\n \"checkDiskSpace\": \"ディスク容量を確認してください\",\n \"checkPermission\": \"ディレクトリの権限を確認してください\",\n \"uninstallFirst\": \"同名のスキルを先にアンインストールしてください\",\n \"checkZipContent\": \"ZIP ファイルに有効なスキルディレクトリ(SKILL.md を含む)が含まれていることを確認してください\"\n }\n },\n \"repo\": {\n \"title\": \"スキルリポジトリを管理\",\n \"description\": \"GitHub のスキルリポジトリソースを追加または削除します\",\n \"url\": \"リポジトリ URL\",\n \"urlPlaceholder\": \"owner/name または https://github.com/owner/name\",\n \"branch\": \"ブランチ\",\n \"branchPlaceholder\": \"main\",\n \"path\": \"スキルパス\",\n \"pathPlaceholder\": \"skills(任意。空欄はルート)\",\n \"add\": \"リポジトリを追加\",\n \"list\": \"追加済みリポジトリ\",\n \"empty\": \"リポジトリがありません\",\n \"invalidUrl\": \"リポジトリ URL の形式が無効です\",\n \"addSuccess\": \"リポジトリ {{owner}}/{{name}} を追加しました。検出スキル: {{count}} 件\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"リポジトリ {{owner}}/{{name}} を削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"skillCount\": \"{{count}} 件のスキルを検出\"\n },\n \"search\": \"スキルを検索\",\n \"searchPlaceholder\": \"スキル名またはリポジトリで検索...\",\n \"searchSource\": {\n \"repos\": \"リポジトリ\",\n \"skillssh\": \"skills.sh\",\n \"leaderboardAllTime\": \"全期間\",\n \"leaderboardTrending\": \"24h トレンド\"\n },\n \"leaderboard\": {\n \"allTimeTitle\": \"全期間 TOP50\",\n \"trendingTitle\": \"24h トレンド\",\n \"allTimeDesc\": \"skills.sh 公式 All Time ランキング TOP50 と同期\",\n \"trendingDesc\": \"skills.sh 公式 Trending (24h) ランキング TOP50 と同期\",\n \"syncedAt\": \"同期 {{time}}\",\n \"fromCache\": \"ローカルキャッシュ\",\n \"registryTotal\": \"skills.sh 累計 {{count}} インストール\",\n \"loading\": \"skills.sh 公式ランキングを同期中…\",\n \"error\": \"skills.sh 公式ランキングの同期に失敗しました\",\n \"empty\": \"ランキングデータがありません\",\n \"syncPolicy\": \"非リアルタイム · 既定 {{hours}} 時間ごとに skills.sh から同期 · 更新ボタンで即時取得\",\n \"nextSyncAt\": \"次回自動同期 約 {{time}}\",\n \"refreshNow\": \"skills.sh から今すぐ同期\",\n \"pageRange\": \"{{range}} · {{page}}/{{totalPages}} ページ(全 {{total}} 件)\"\n },\n \"skillssh\": {\n \"searchPlaceholder\": \"skills.sh を検索(2文字以上)...\",\n \"installs\": \"{{count}} インストール\",\n \"loadMore\": \"さらに読み込む\",\n \"loading\": \"skills.sh を検索中...\",\n \"noResults\": \"\\\"{{query}}\\\" に該当するスキルがありません\",\n \"error\": \"skills.sh の検索に失敗しました\",\n \"poweredBy\": \"Powered by skills.sh\"\n },\n \"filter\": {\n \"placeholder\": \"状態で絞り込み\",\n \"all\": \"すべて\",\n \"installed\": \"インストール済み\",\n \"uninstalled\": \"未インストール\",\n \"repo\": \"リポジトリで絞り込み\",\n \"allRepos\": \"すべてのリポジトリ\"\n },\n \"noResults\": \"一致するスキルが見つかりませんでした\",\n \"noInstalled\": \"インストールされたスキルがありません\",\n \"noInstalledDescription\": \"リポジトリからスキルを発見してインストールするか、既存のスキルをインポートしてください\",\n \"discover\": \"スキルを発見\",\n \"import\": \"既存をインポート\",\n \"importDescription\": \"OpenSunstar 統合管理にインポートするスキルを選択してください\",\n \"importSuccess\": \"{{count}} 件のスキルをインポートしました\",\n \"importSelected\": \"選択をインポート ({{count}})\",\n \"noUnmanagedFound\": \"インポートするスキルが見つかりませんでした。すべてのスキルは OpenSunstar で管理されています。\",\n \"foundIn\": \"発見場所\",\n \"local\": \"ローカル\",\n \"uninstallConfirm\": \"「{{name}}」をアンインストールしますか?すべてのアプリからこのスキルが削除され、削除前にローカルバックアップが自動作成されます。\",\n \"uninstallInMainPanel\": \"メインパネルからスキルをアンインストールしてください\",\n \"notFound\": \"スキルが見つかりません\",\n \"backup\": {\n \"location\": \"バックアップ場所: {{path}}\"\n },\n \"restoreFromBackup\": {\n \"button\": \"バックアップから復元\",\n \"title\": \"バックアップから復元\",\n \"description\": \"Skills バックアップを選択して、ローカルにファイルを復元し、現在の一覧へ戻します。\",\n \"empty\": \"復元できる Skills バックアップはありません\",\n \"createdAt\": \"バックアップ日時\",\n \"path\": \"バックアップパス\",\n \"restore\": \"復元\",\n \"restoring\": \"復元中...\",\n \"delete\": \"削除\",\n \"deleting\": \"削除中...\",\n \"deleteSuccess\": \"スキルバックアップ {{name}} を削除しました\",\n \"deleteFailed\": \"スキルバックアップの削除に失敗しました\",\n \"deleteConfirmTitle\": \"バックアップを削除\",\n \"deleteConfirmMessage\": \"スキルバックアップ「{{name}}」を削除しますか?この操作は元に戻せません。\",\n \"success\": \"スキル {{name}} をバックアップから復元しました\",\n \"failed\": \"バックアップからの復元に失敗しました\"\n },\n \"apps\": {\n \"claude\": \"Claude\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\"\n },\n \"installFromZip\": {\n \"button\": \"ZIP からインストール\",\n \"installing\": \"インストール中...\",\n \"successSingle\": \"スキル {{name}} をインストールしました\",\n \"successMultiple\": \"{{count}} 件のスキルをインストールしました\",\n \"noSkillsFound\": \"ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)\"\n }\n },\n \"deeplink\": {\n \"confirmImport\": \"プロバイダーのインポートを確認\",\n \"confirmImportDescription\": \"次の設定をディープリンクから OpenSunstar へインポートします\",\n \"importPrompt\": \"プロンプトをインポート\",\n \"importPromptDescription\": \"このシステムプロンプトをインポートするか確認してください\",\n \"importMcp\": \"MCP サーバーをインポート\",\n \"importMcpDescription\": \"これらの MCP サーバーをインポートするか確認してください\",\n \"importSkill\": \"スキルリポジトリを追加\",\n \"importSkillDescription\": \"このスキルリポジトリを追加するか確認してください\",\n \"promptImportSuccess\": \"プロンプトをインポートしました\",\n \"promptImportSuccessDescription\": \"インポートされたプロンプト: {{name}}\",\n \"mcpImportSuccess\": \"MCP サーバーをインポートしました\",\n \"mcpImportSuccessDescription\": \"{{count}} 件のサーバーをインポートしました\",\n \"mcpPartialSuccess\": \"一部のみインポート成功\",\n \"mcpPartialSuccessDescription\": \"成功: {{success}}、失敗: {{failed}}\",\n \"skillImportSuccess\": \"スキルリポジトリを追加しました\",\n \"skillImportSuccessDescription\": \"追加したリポジトリ: {{repo}}\",\n \"app\": \"アプリ種別\",\n \"providerName\": \"プロバイダー名\",\n \"homepage\": \"ホームページ\",\n \"endpoint\": \"API エンドポイント\",\n \"apiKey\": \"API Key\",\n \"icon\": \"アイコン\",\n \"model\": \"モデル\",\n \"haikuModel\": \"Haiku モデル\",\n \"sonnetModel\": \"Sonnet モデル\",\n \"opusModel\": \"Opus モデル\",\n \"multiModel\": \"マルチモーダルモデル\",\n \"notes\": \"メモ\",\n \"import\": \"インポート\",\n \"importing\": \"インポート中...\",\n \"warning\": \"インポート前に内容を確認してください。後から一覧で編集・削除できます。\",\n \"parseError\": \"ディープリンクの解析に失敗しました\",\n \"importSuccess\": \"インポート成功\",\n \"importSuccessDescription\": \"プロバイダー「{{name}}」をインポートしました\",\n \"importError\": \"インポートに失敗しました\",\n \"configSource\": \"設定ソース\",\n \"configEmbedded\": \"埋め込み設定\",\n \"configRemote\": \"リモート設定\",\n \"configDetails\": \"設定の詳細\",\n \"configUrl\": \"設定ファイル URL\",\n \"configMergeError\": \"設定ファイルのマージに失敗しました\",\n \"primaryEndpoint\": \"メイン\",\n \"mcp\": {\n \"title\": \"MCP サーバーを一括インポート\",\n \"targetApps\": \"ターゲットアプリ\",\n \"serverCount\": \"MCP サーバー({{count}} 件)\",\n \"enabledWarning\": \"インポート後、指定したすべてのアプリに即座に書き込まれます\"\n },\n \"prompt\": {\n \"title\": \"システムプロンプトをインポート\",\n \"app\": \"アプリ\",\n \"name\": \"名前\",\n \"description\": \"説明\",\n \"contentPreview\": \"内容プレビュー\",\n \"enabledWarning\": \"インポート後すぐにこのプロンプトが有効になり、他は無効になります\"\n },\n \"skill\": {\n \"title\": \"Claude スキルリポジトリを追加\",\n \"repo\": \"GitHub リポジトリ\",\n \"directory\": \"対象ディレクトリ\",\n \"branch\": \"ブランチ\",\n \"skillsPath\": \"スキルパス\",\n \"hint\": \"この操作でスキルリポジトリが一覧に追加されます。\",\n \"hintDetail\": \"追加後、スキル管理ページから個別のスキルをインストールできます。\"\n },\n \"usageScript\": \"使用量クエリ\",\n \"usageScriptEnabled\": \"有効\",\n \"usageScriptDisabled\": \"無効\",\n \"usageApiKey\": \"使用量 API キー\",\n \"usageBaseUrl\": \"使用量クエリ URL\",\n \"usageAutoInterval\": \"自動クエリ\",\n \"usageAutoIntervalValue\": \"{{minutes}} 分ごと\"\n },\n \"iconPicker\": {\n \"search\": \"アイコンを検索\",\n \"searchPlaceholder\": \"アイコン名を入力...\",\n \"noResults\": \"一致するアイコンが見つかりません\",\n \"category\": {\n \"aiProvider\": \"AI プロバイダー\",\n \"cloud\": \"クラウドプラットフォーム\",\n \"tool\": \"開発ツール\",\n \"other\": \"その他\"\n }\n },\n \"providerIcon\": {\n \"label\": \"アイコン\",\n \"colorLabel\": \"アイコンカラー\",\n \"selectIcon\": \"アイコンを選択\",\n \"preview\": \"プレビュー\",\n \"clickToChange\": \"クリックでアイコンを変更\",\n \"clickToSelect\": \"クリックでアイコンを選択\",\n \"color\": \"アイコンカラー\"\n },\n \"quickStart\": {\n \"nav\": \"クイック接続\",\n \"title\": \"クイック接続\",\n \"subtitle\": \"3ステップで接続:プロバイダー選択 → Key 入力 → 有効化\",\n \"searchPlaceholder\": \"プロバイダー名または URL を検索…\",\n \"noResults\": \"一致するプロバイダーが見つかりません\",\n \"official\": \"公式\",\n \"officialDesc\": \"各クライアントからログインします。\",\n \"partner\": \"パートナー\",\n \"apiKeyLabel\": \"API Key\",\n \"apiKeyPlaceholder\": \"API Key を貼り付け\",\n \"keychainHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"getKey\": \"API Key を取得\",\n \"apply\": \"有効化\",\n \"success\": \"接続成功!このプロバイダーに切り替えました\",\n \"doneTitle\": \"接続成功!\",\n \"doneDesc\": \"プロバイダーが設定され、有効化されました。Claude Code で今すぐ利用できます。\",\n \"doneDescApp\": \"{{app}} が設定され、現在のプロバイダーに切り替わりました。\",\n \"failedTitle\": \"接続は完了していません\",\n \"compensatedDesc\": \"操作に失敗したため、接続前の状態に復元しました。設定を修正して再試行できます。\",\n \"recoveryRequired\": \"自動復元が完了していません。再試行する前に復元を続行してください。\",\n \"operationId\": \"操作 ID\",\n \"retry\": \"接続を再試行\",\n \"continueRecovery\": \"復元を続行\",\n \"changeSelection\": \"設定を変更\",\n \"rollback\": \"この接続を取り消す\",\n \"rollbackDone\": \"接続前の状態に復元しました\",\n \"rollbackFailed\": \"復元に失敗しました。再試行するかローカルルーティング設定を確認してください。\",\n \"proxyRunningHint\": \"Claude Code のリクエストはローカルプロキシ(127.0.0.1:15721)経由で転送されます。OpenSunstar を実行し続けてください。アプリを閉じると Claude Code は接続できなくなります。\",\n \"proxyRunningHintDesktop\": \"Claude Desktop はローカルプロキシ経由で転送されます。OpenSunstar を実行し続けてください。\",\n \"addAnother\": \"別のを追加\",\n \"openSettings\": \"プロバイダー管理へ\",\n \"firstProviderHint\": \"最初のプロバイダーです。必要に応じて設定でプロキシを起動してください。\",\n \"verify\": \"Key を検証\",\n \"verifyOk\": \"Key は有効です!\",\n \"verifyOkAnthropic\": \"Key は有効です(モデル一覧 API なし — プリセット既定モデルを使用)\",\n \"verifyOkGemini\": \"Key は有効です。Gemini ネイティブ API の検証に成功しました。\",\n \"verifyOkWithModels\": \"Key は有効 — {{count}} 件のモデルを取得\",\n \"verifyOkNoModelList\": \"Key は有効(モデル一覧の取得に失敗 — プリセット既定モデルを使用)\",\n \"verifyHint\": \"選択したプロトコルで検証します。Anthropic は約 1 token を使用し、OpenAI/Gemini のモデル一覧は取得できた場合に詳細マッピングで利用できます。\",\n \"modelsList\": \"利用可能なモデル({{count}})\",\n \"myProviders\": \"API Key 接続\",\n \"switch\": \"切り替え\",\n \"apps\": {\n \"claude\": \"Claude Code\",\n \"claudeDesktop\": \"Claude Desktop\",\n \"codex\": \"Codex\",\n \"gemini\": \"Gemini\",\n \"opencode\": \"OpenCode\",\n \"openclaw\": \"OpenClaw\",\n \"hermes\": \"Hermes\"\n },\n \"category\": {\n \"custom\": \"カスタム\",\n \"aiGlobal\": \"海外 AI\",\n \"aiChina\": \"中国 AI\",\n \"relay\": \"アグリゲーター / 中継\",\n \"customModel\": \"カスタムモデル設定\"\n },\n \"gemini\": {\n \"cnOfficialHint\": \"Gemini クイック接続では Google と Gemini Native 互換エンドポイントを有効にします。OpenAI Chat ゲートウェイはプロトコル不一致として表示されます。\"\n },\n \"custom\": {\n \"cardTitle\": \"カスタム設定\",\n \"cardSubtitle\": \"Base URL とモデルを自分で入力\",\n \"hint\": \"名前、Base URL、既定モデルを入力します。API 形式、認証フィールド、モデルマッピングは下の詳細オプションで調整できます。\",\n \"geminiHint\": \"名前、Gemini Native Base URL、モデルを入力します。Gemini CLI の固定ネイティブプロトコルは詳細オプションに表示されます。\",\n \"agentHint\": \"名前、Base URL、既定モデルを入力します。OpenSunstar がこのクライアントのネイティブなローカル設定形式で書き込みます。\",\n \"name\": \"プロバイダー名\",\n \"namePlaceholder\": \"例:My DeepSeek ゲートウェイ\",\n \"baseUrl\": \"Base URL\",\n \"defaultModel\": \"既定モデル\",\n \"geminiModel\": \"モデル ID\",\n \"defaultName\": \"カスタムプロバイダー\"\n },\n \"apiKeyOnlyHint\": \"このクライアントは API Key で接続します。プリセットを選ぶかカスタムゲートウェイを追加して有効化してください。\",\n \"advanced\": {\n \"title\": \"詳細オプション\",\n \"subtitle\": \"多くの場合は既定値のままで問題ありません\",\n \"upstreamModel\": \"アップストリームモデル\",\n \"defaultModel\": \"既定モデル\",\n \"apiFormat\": \"API 形式\",\n \"authField\": \"認証フィールド\",\n \"roleMapping\": \"モデルロールマッピング\",\n \"roleMappingHint\": \"表示名は /model メニューに使われ、実際のリクエストモデルは Claude Code の環境変数に書き込まれます。\",\n \"role\": \"ロール\",\n \"displayName\": \"表示名\",\n \"requestModel\": \"リクエストモデル\",\n \"roleRequestModel\": \"{{role}} リクエストモデル\",\n \"hiddenFromModelMenu\": \"/model メニューには表示しません\",\n \"fallbackModel\": \"既定のフォールバックモデル\",\n \"desktopRoutes\": \"Claude Desktop ルートマッピング\",\n \"customProtocolHint\": \"アップストリームの実際のインターフェースに合わせてプロトコルを選択します。\",\n \"presetProtocolLocked\": \"接続エラーを防ぐため、プリセットのプロトコルは実際のエンドポイントに固定されています。\",\n \"geminiNativeLocked\": \"Gemini CLI は現在ネイティブ generateContent を転送します。OpenAI Chat エンドポイントにはプロトコル変換対応のクライアント入口を使用します。\"\n },\n \"badge\": {\n \"current\": \"現在\",\n \"proxy\": \"ローカルルート\"\n },\n \"warn\": {\n \"clearFailed\": \"旧クイック接続マーカーのクリアに失敗しました。切り替えで引き続きエラーになる場合は設定で手動クリアしてください\",\n \"takeoverFailed\": \"プロバイダーは追加されましたが、プロキシ接管の有効化に失敗しました。設定-ローカルルートで該当アプリの接管を手動で有効にしてください\"\n },\n \"unavailableForApp\": \"このクライアントプロトコルは現在準備中です\",\n \"unavailable\": {\n \"codexOpenAiOnly\": \"Codex クイック接続は現在 OpenAI Responses / Chat アップストリームを使用します\",\n \"claudeOauthOnly\": \"この OAuth プリセットは Claude クライアント向けです\",\n \"geminiNativeOnly\": \"Gemini CLI には Gemini Native または Gemini 互換ゲートウェイが必要です\",\n \"geminiOpenRouter\": \"OpenRouter は OpenAI Chat を提供し、Gemini CLI は現在 Gemini Native を転送します\"\n },\n \"error\": {\n \"emptyKey\": \"API Key を入力してください\",\n \"failed\": \"接続に失敗しました。API Key またはネットワークを確認して再試行してください。\",\n \"compensated\": \"接続に失敗し、操作前の状態に復元しました。\",\n \"recoveryRequired\": \"接続に失敗し、自動復元が完了していません。\",\n \"noBaseUrl\": \"Base URL を入力してください\",\n \"noModel\": \"既定モデルを入力してください\"\n },\n \"addProvider\": \"プロバイダーを追加\",\n \"addProviderHint\": \"プリセットまたは互換エンドポイントを追加します。\",\n \"configureProvider\": \"プロバイダー設定\",\n \"configureProviderHint\": \"必須項目のみ入力します。接続と検証は自動です。\",\n \"connectAndEnable\": \"接続して有効化\",\n \"myProvidersHint\": \"API Key はローカルの安全な資格情報ストアに保存され、接続時にローカル設定を更新します。\",\n \"officialConnection\": \"サブスクリプションアカウント\",\n \"officialConnectionHint\": \"選択したクライアントからログインします。\",\n \"workbenchSubtitle\": \"クライアントを選び、サブスクリプションまたは API Key で接続します。\",\n \"workbenchTitle\": \"モデル接続\",\n \"subscription\": {\n \"loginStatus\": \"ログイン状態\",\n \"accountManagement\": \"アカウント管理\",\n \"claude\": {\n \"title\": \"Claude サブスクリプションログイン\",\n \"description\": \"資格情報は Claude Code が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Claude にログイン\"\n },\n \"claudeDesktop\": {\n \"title\": \"Claude Desktop ログイン\",\n \"description\": \"ログインは Claude Desktop が管理します。\",\n \"action\": \"Claude Desktop を入手\"\n },\n \"codex\": {\n \"title\": \"ChatGPT サブスクリプションログイン\",\n \"description\": \"ログインは OpenSunstar が管理します。\",\n \"action\": \"ChatGPT にログイン\",\n \"dialogHint\": \"デバイス認証でアカウントを接続します。\"\n },\n \"gemini\": {\n \"title\": \"Gemini アカウントログイン\",\n \"description\": \"資格情報は Gemini CLI が管理し、OpenSunstar は状態と使用量を読み取ります。\",\n \"action\": \"Gemini ログインガイド\"\n },\n \"grokbuild\": {\n \"title\": \"Grok サブスクリプションログイン\",\n \"description\": \"公式 xAI / Grok アカウントのログインは OpenSunstar が管理します。API Key 接続は下のプロバイダー設定を使います。\",\n \"action\": \"Grok ログイン\",\n \"dialogHint\": \"デバイス認証フローで xAI / Grok アカウントを接続します。\"\n }\n },\n \"accessModeGrid\": \"接続方法\"\n },\n \"migration\": {\n \"success\": \"設定の移行が完了しました\",\n \"skillsSuccess\": \"スキルを {{count}} 件、自動的に統合管理へインポートしました\",\n \"skillsFailed\": \"スキルの自動インポートに失敗しました\",\n \"skillsFailedDescription\": \"Skills 画面で「既存をインポート」をクリックして手動でインポートしてください(または再起動して再試行)。\"\n },\n \"agents\": {\n \"title\": \"Subagents\"\n },\n \"modelTest\": {\n \"testProvider\": \"モデルテスト\"\n },\n \"health\": {\n \"operational\": \"正常\",\n \"degraded\": \"低下\",\n \"failed\": \"失敗\",\n \"circuitOpen\": \"サーキットオープン\",\n \"consecutiveFailures\": \"{{count}} 回連続失敗\",\n \"title\": \"設定状態\",\n \"allClear\": \"すべてのプロジェクトの AI 設定は正常です。\",\n \"scan\": \"重複チェック\",\n \"subtitle\": \"同名プロジェクトや重複パスを検出し、冗長な追加を識別します\",\n \"noDuplicates\": \"重複プロジェクトは見つかりませんでした\",\n \"level\": {\n \"ok\": \"正常\",\n \"warn\": \"要確認\",\n \"alert\": \"異常\",\n \"unconfigured\": \"未設定\",\n \"unmanaged\": \"管理対象外\",\n \"unscanned\": \"未スキャン\"\n },\n \"reason\": {\n \"drifted\": \"{{count}} 件の設定が期待状態と不一致\",\n \"unscanned\": \"AI 設定状態のスキャンがまだ完了していません\",\n \"unmanaged\": \"プロジェクトが OpenSunstar の管理対象ではないため、欠落とは判断できません\",\n \"unconfigured\": \"OpenSunstar 経由で AI アセットがまだ連携されていません\",\n \"gaps\": \"未完了:{{items}}\",\n \"detectedOnly\": \"{{items}} — 設定ファイルが検出されましたが管理されていません\",\n \"globalOnly\": \"{{items}} — グローバルデフォルト設定を使用\",\n \"noMcp\": \"MCP サーバーが未連携\",\n \"noSkills\": \"Skills が未設定\",\n \"noPrompts\": \"Prompts が未連携\"\n },\n \"action\": {\n \"repair\": \"ドリフトを修復\",\n \"inspectDetail\": \"詳細を表示\",\n \"configure\": \"アセットを設定\",\n \"setup\": \"設定する\",\n \"adopt\": \"管理を開始\",\n \"inspect\": \"プロジェクトを表示\"\n }\n },\n \"failover\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効になりました\",\n \"disabled\": \"{{app}} フェイルオーバーが無効になりました\",\n \"toggleFailed\": \"操作に失敗しました: {{detail}}\",\n \"inQueue\": \"キュー内\",\n \"addQueue\": \"追加\",\n \"priority\": {\n \"tooltip\": \"フェイルオーバー優先度 {{priority}}\"\n },\n \"tooltip\": {\n \"enabled\": \"{{app}} フェイルオーバーが有効\\nキューの優先度(P1→P2→...)で使用します\",\n \"disabled\": \"{{app}} フェイルオーバーを有効にする\\nキューの P1 に即時切替し、失敗時は次を順に試行します\"\n }\n },\n \"proxy\": {\n \"panel\": {\n \"serviceAddress\": \"サービスアドレス\",\n \"addressCopied\": \"アドレスをコピーしました\",\n \"currentProvider\": \"現在のプロバイダー:\",\n \"waitingFirstRequest\": \"現在のプロバイダー: 最初のリクエスト待ち...\",\n \"stoppedTitle\": \"ルーティングサービス停止中\",\n \"stoppedDescription\": \"上のトグルでサービスを開始できます\",\n \"openSettings\": \"ルーティングサービスを設定\",\n \"stats\": {\n \"activeConnections\": \"アクティブ接続\",\n \"totalRequests\": \"総リクエスト数\",\n \"successRate\": \"成功率\",\n \"uptime\": \"稼働時間\"\n }\n },\n \"settings\": {\n \"title\": \"ルーティングサービス設定\",\n \"description\": \"ローカルルーティングサーバーのリッスンアドレス、ポート、実行パラメータを設定します。保存後すぐに反映されます。\",\n \"alert\": {\n \"autoApply\": \"変更は実行中のルーティングサービスに自動的に同期され、手動での再起動は不要です。\"\n },\n \"basic\": {\n \"title\": \"基本設定\",\n \"description\": \"ルーティングサービスのリッスンアドレスとポートを設定します。\"\n },\n \"advanced\": {\n \"title\": \"詳細パラメータ\",\n \"description\": \"リクエストの安定性とログ記録を制御します。\"\n },\n \"timeout\": {\n \"title\": \"タイムアウト設定\",\n \"description\": \"ストリーミングと非ストリーミングリクエストのタイムアウトを設定します。\"\n },\n \"fields\": {\n \"listenAddress\": {\n \"label\": \"リッスンアドレス\",\n \"placeholder\": \"127.0.0.1\",\n \"description\": \"ルーティングサーバーがリッスンするIPアドレス(推奨: 127.0.0.1)\"\n },\n \"listenPort\": {\n \"label\": \"リッスンポート\",\n \"placeholder\": \"15721\",\n \"description\": \"ルーティングサーバーがリッスンするポート番号(1024 ~ 65535)\"\n },\n \"maxRetries\": {\n \"label\": \"最大リトライ回数\",\n \"placeholder\": \"3\",\n \"description\": \"リクエスト失敗時のリトライ回数(0 ~ 10)\"\n },\n \"requestTimeout\": {\n \"label\": \"リクエストタイムアウト(秒)\",\n \"placeholder\": \"0(無制限)または 300\",\n \"description\": \"単一リクエストの最大待機時間(0 = 無制限、または 10 ~ 600 秒)\"\n },\n \"enableLogging\": {\n \"label\": \"ログ記録を有効化\",\n \"description\": \"トラブルシューティングのためにすべてのルーティングリクエストを記録\"\n },\n \"streamingFirstByteTimeout\": {\n \"label\": \"ストリーミング初回バイトタイムアウト(秒)\",\n \"description\": \"最初のデータチャンクを待つ最大時間\"\n },\n \"streamingIdleTimeout\": {\n \"label\": \"ストリーミングアイドルタイムアウト(秒)\",\n \"description\": \"データチャンク間の最大間隔\"\n },\n \"nonStreamingTimeout\": {\n \"label\": \"非ストリーミングタイムアウト(秒)\",\n \"description\": \"非ストリーミングリクエストの総タイムアウト\"\n }\n },\n \"validation\": {\n \"addressInvalid\": \"有効なIPアドレスを入力してください\",\n \"portMin\": \"ポートは1024より大きい必要があります\",\n \"portMax\": \"ポートは65535より小さい必要があります\",\n \"retryMin\": \"リトライ回数は負の値にできません\",\n \"retryMax\": \"リトライ回数は10を超えることはできません\",\n \"timeoutNonNegative\": \"タイムアウトは負の値にできません\",\n \"timeoutMax\": \"タイムアウトは600秒を超えることはできません\",\n \"timeoutRange\": \"0または10-600の間の値を入力してください\",\n \"streamingTimeoutMin\": \"タイムアウトは少なくとも5秒必要です\",\n \"streamingTimeoutMax\": \"タイムアウトは300秒を超えることはできません\"\n },\n \"actions\": {\n \"save\": \"設定を保存\"\n },\n \"toast\": {\n \"saved\": \"ルーティング設定を保存しました\",\n \"saveFailed\": \"保存に失敗しました: {{error}}\"\n },\n \"invalidPort\": \"無効なポートです。1024〜65535 の数値を入力してください\",\n \"invalidAddress\": \"無効なアドレスです。IPv4(例: 127.0.0.1)、IPv6(例: ::1)、または localhost を入力してください\",\n \"configSaved\": \"ルーティング設定を保存しました\",\n \"configSaveFailed\": \"設定の保存に失敗しました\",\n \"restartRequired\": \"アドレスまたはポートの変更を反映するにはルーティングサービスの再起動が必要です\"\n },\n \"switchFailed\": \"切り替えに失敗しました: {{error}}\",\n \"takeover\": {\n \"hint\": \"ルーティングするアプリを選択します。有効にすると、そのアプリのリクエストはローカルルーティング経由で転送されます\",\n \"enabled\": \"{{app}} ルーティング有効\",\n \"disabled\": \"{{app}} ルーティング無効\",\n \"failed\": \"ルーティングの切り替えに失敗しました: {{detail}}\",\n \"tooltip\": {\n \"active\": \"{{appLabel}} がルーティング中 - {{address}}:{{port}}\\nホットスイッチングのためプロバイダを切り替え\",\n \"broken\": \"{{appLabel}} がルーティング中ですが、ルーティングサービスが実行されていません\",\n \"inactive\": \"{{appLabel}} のリクエストをローカルルーティング経由でルーティング\"\n }\n },\n \"failover\": {\n \"proxyRequired\": \"フェイルオーバーを設定するには、ルーティングサービスを先に起動する必要があります\",\n \"autoSwitch\": \"自動フェイルオーバー\",\n \"autoSwitchDescription\": \"有効にするとキューの P1 に即時切り替え、リクエスト失敗時はキュー内の次のプロバイダーを自動で試行します\"\n },\n \"failoverQueue\": {\n \"title\": \"フェイルオーバーキュー\",\n \"description\": \"各アプリのプロバイダーのフェイルオーバー順序を管理します\",\n \"info\": \"自動フェイルオーバーを有効にすると、キューの優先度順(P1 優先)でプロバイダーを使用します。失敗時はキュー内の次のプロバイダーを順に試行します。\",\n \"selectProvider\": \"キューに追加するプロバイダーを選択\",\n \"noAvailableProviders\": \"追加できるプロバイダーがありません\",\n \"empty\": \"フェイルオーバーキューが空です。自動フェイルオーバーを有効にするにはプロバイダーを追加してください。\",\n \"orderHint\": \"キューの順序はホームのプロバイダー一覧の順序と一致します。ホームでドラッグして順序を変更できます。\",\n \"dragHint\": \"ドラッグでフェイルオーバー順序を調整します。番号が小さいほど優先度が高くなります。\",\n \"toggleEnabled\": \"有効/無効\",\n \"addSuccess\": \"フェイルオーバーキューに追加しました\",\n \"addFailed\": \"追加に失敗しました\",\n \"removeSuccess\": \"フェイルオーバーキューから削除しました\",\n \"removeFailed\": \"削除に失敗しました\",\n \"reorderSuccess\": \"キュー順序を更新しました\",\n \"reorderFailed\": \"順序の更新に失敗しました\",\n \"toggleFailed\": \"状態の更新に失敗しました\"\n },\n \"autoFailover\": {\n \"info\": \"フェイルオーバーキューに複数のプロバイダーが設定されている場合、リクエストが失敗すると優先度順に試行します。プロバイダーが連続失敗のしきい値に達すると、サーキットブレーカーが開き、一時的にスキップされます。\",\n \"configSaved\": \"自動フェイルオーバー設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"retrySettings\": \"リトライとタイムアウト設定\",\n \"failureThreshold\": \"失敗しきい値\",\n \"failureThresholdHint\": \"この回数連続で失敗するとサーキットブレーカーが開きます(推奨: 3-10)\",\n \"timeout\": \"回復待ち時間(秒)\",\n \"timeoutHint\": \"サーキットが開いた後、回復を試みるまでの待ち時間(推奨: 30-120)\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"successThreshold\": \"回復成功しきい値\",\n \"successThresholdHint\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じます\",\n \"errorRate\": \"エラー率しきい値 (%)\",\n \"errorRateHint\": \"この値を超えるとサーキットブレーカーが開きます\",\n \"minRequests\": \"最小リクエスト数\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"explanationTitle\": \"仕組み\",\n \"failureThresholdLabel\": \"失敗しきい値\",\n \"failureThresholdExplain\": \"この回数連続で失敗すると、サーキットブレーカーが開き、プロバイダーは一時的に利用不可になります\",\n \"timeoutLabel\": \"回復待ち時間\",\n \"timeoutExplain\": \"サーキットが開いた後、半開状態を試みるまでの待ち時間\",\n \"successThresholdLabel\": \"回復成功しきい値\",\n \"successThresholdExplain\": \"半開状態でこの回数成功するとサーキットブレーカーが閉じ、プロバイダーが再び利用可能になります\",\n \"errorRateLabel\": \"エラー率しきい値\",\n \"errorRateExplain\": \"失敗しきい値に達していなくても、エラー率がこの値を超えるとサーキットブレーカーが開きます\",\n \"maxRetries\": \"最大リトライ回数\",\n \"timeoutSettings\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング最初のバイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\",\n \"maxRetriesHint\": \"リクエスト失敗時のリトライ回数(0-10)\",\n \"streamingFirstByteHint\": \"最初のデータチャンクを待つ最大時間、範囲 1-120 秒、デフォルト 60 秒\",\n \"streamingIdleHint\": \"データチャンク間の最大間隔、範囲 60-600 秒、0 で無効化(途中停止を防止)\",\n \"nonStreamingHint\": \"非ストリーミングリクエストの合計タイムアウト、範囲 60-1200 秒、デフォルト 600 秒(10 分)\"\n },\n \"logging\": {\n \"enabled\": \"ログ記録が有効になりました\",\n \"disabled\": \"ログ記録が無効になりました\",\n \"failed\": \"ログ状態の切り替えに失敗しました\"\n },\n \"server\": {\n \"started\": \"ルーティングサービスが開始されました - {{address}}:{{port}}\",\n \"startFailed\": \"ルーティングサービスの開始に失敗しました: {{detail}}\"\n },\n \"stoppedWithRestore\": \"ルーティングサービスが停止し、すべてのルーティング設定が復元されました\",\n \"stopWithRestoreFailed\": \"停止に失敗しました: {{detail}}\"\n },\n \"streamCheck\": {\n \"configSaved\": \"ヘルスチェック設定を保存しました\",\n \"configSaveFailed\": \"保存に失敗しました\",\n \"testModels\": \"テストモデル\",\n \"claudeModel\": \"Claude モデル\",\n \"codexModel\": \"Codex モデル\",\n \"geminiModel\": \"Gemini モデル\",\n \"checkParams\": \"チェックパラメーター\",\n \"timeout\": \"タイムアウト(秒)\",\n \"maxRetries\": \"最大リトライ回数\",\n \"degradedThreshold\": \"劣化しきい値(ミリ秒)\",\n \"testPrompt\": \"テストプロンプト\",\n \"operational\": \"{{providerName}} は正常に動作しています ({{responseTimeMs}}ms)\",\n \"degraded\": \"{{providerName}} の応答が遅いです ({{responseTimeMs}}ms)\",\n \"failed\": \"{{providerName}} のチェックに失敗しました: {{message}}\",\n \"rejected\": \"{{providerName}} のチェックが拒否されました: {{message}}\",\n \"error\": \"{{providerName}} のチェックでエラーが発生しました: {{error}}\",\n \"modelNotFound\": \"{{providerName}} のテストモデル {{model}} は存在しないか廃止されています\",\n \"modelNotFoundHint\": \"このモデルはプロバイダーにより廃止された可能性があります。「モデルテスト設定」でデフォルトのテストモデルを更新してください。\",\n \"quotaExceeded\": \"{{providerName}} の Coding Plan 利用枠を超過しました\",\n \"quotaExceededHint\": \"Baidu Qianfan が Coding Plan の利用枠超過エラーを返しました。5時間・週次・月次の利用枠更新を待つか、Qianfan コンソールでプランを確認してください。\",\n \"httpHint\": {\n \"400\": \"リクエスト形式が拒否されました。ヘルスチェックの形式は実際の使用と異なる場合があります。\",\n \"401\": \"APIキーが無効か、OAuthなどの認証方式を使用しています。チェック失敗は実際に使えないことを意味しません。\",\n \"402\": \"アカウントの利用枠または請求の問題です。\",\n \"403\": \"プロバイダーがリクエストを拒否しました。実際の使用では正常に動作する場合があります。\",\n \"404\": \"エンドポイントが見つかりません。Base URLとAPIパスを確認してください。\",\n \"429\": \"リクエストが多すぎます。しばらくしてからお試しください。\",\n \"5xx\": \"プロバイダーの内部エラーです。一時的な問題の可能性が高いです。\"\n }\n },\n \"proxyConfig\": {\n \"proxyEnabled\": \"ルーティング総スイッチ\",\n \"appTakeover\": \"ルーティング有効\",\n \"perAppConfig\": \"アプリ別設定\",\n \"circuitBreaker\": \"サーキットブレーカー\",\n \"circuitBreakerSettings\": \"サーキットブレーカー設定\",\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"回復閾値\",\n \"recoveryTimeout\": \"回復待機時間\",\n \"errorRateThreshold\": \"エラー率閾値\",\n \"minRequests\": \"最小リクエスト数\",\n \"timeoutConfig\": \"タイムアウト設定\",\n \"streamingFirstByte\": \"ストリーミング初回バイトタイムアウト\",\n \"streamingIdle\": \"ストリーミングアイドルタイムアウト\",\n \"nonStreaming\": \"非ストリーミングタイムアウト\"\n },\n \"circuitBreaker\": {\n \"failureThreshold\": \"失敗閾値\",\n \"successThreshold\": \"成功閾値\",\n \"timeoutSeconds\": \"タイムアウト(秒)\",\n \"errorRateThreshold\": \"エラー率閾値 (%)\",\n \"minRequests\": \"最小リクエスト数\",\n \"validationFailed\": \"以下のフィールドが有効範囲外です: {{fields}}\",\n \"configSaved\": \"サーキットブレーカー設定が保存されました\",\n \"saveFailed\": \"保存に失敗しました\",\n \"loading\": \"読み込み中...\",\n \"title\": \"サーキットブレーカー設定\",\n \"description\": \"サーキットブレーカーパラメータを調整して、障害検出と復旧動作を制御します\",\n \"failureThresholdHint\": \"連続失敗後にサーキットブレーカーを開く回数\",\n \"timeoutSecondsHint\": \"サーキットブレーカーを開いた後、復旧を試みるまでの時間(半開状態)\",\n \"successThresholdHint\": \"半開状態で成功してサーキットブレーカーを閉じる回数\",\n \"errorRateThresholdHint\": \"エラー率がこの値を超えるとサーキットブレーカーを開く\",\n \"minRequestsHint\": \"エラー率を計算する前の最小リクエスト数\",\n \"saveConfig\": \"設定を保存\",\n \"instructionsTitle\": \"設定説明\",\n \"instructions\": {\n \"failureThreshold\": \"連続失敗がこの回数に達するとサーキットブレーカーが開く\",\n \"timeout\": \"サーキットブレーカーを開いた後、この時間待機してから半開を試みる\",\n \"successThreshold\": \"半開状態で成功がこの回数に達するとサーキットブレーカーを閉じる\",\n \"errorRate\": \"エラー率がこの値を超えるとサーキットブレーカーが開く\",\n \"minRequests\": \"リクエスト数がこの値に達した後にのみエラー率が計算される\"\n }\n },\n \"universalProvider\": {\n \"duplicate\": \"複製\",\n \"duplicatedAndSynced\": \"統合プロバイダーを複製して同期しました\",\n \"duplicateError\": \"統合プロバイダーの複製に失敗しました\",\n \"title\": \"統合プロバイダー\",\n \"description\": \"統合プロバイダーは Claude、Codex、Gemini の設定を同時に管理します。変更は有効なすべてのアプリに自動的に同期されます。\",\n \"add\": \"統合プロバイダーを追加\",\n \"edit\": \"統合プロバイダーを編集\",\n \"empty\": \"統合プロバイダーがありません\",\n \"emptyHint\": \"下の「統合プロバイダーを追加」ボタンをクリックして作成してください\",\n \"selectPreset\": \"プリセットタイプを選択\",\n \"name\": \"名前\",\n \"namePlaceholder\": \"例:私の NewAPI\",\n \"baseUrl\": \"API URL\",\n \"apiKey\": \"API キー\",\n \"websiteUrl\": \"ウェブサイト URL\",\n \"websiteUrlPlaceholder\": \"https://example.com(オプション、リストに表示されます)\",\n \"notes\": \"メモ\",\n \"notesPlaceholder\": \"オプション:メモを追加\",\n \"enabledApps\": \"有効なアプリ\",\n \"modelConfig\": \"モデル設定\",\n \"model\": \"モデル\",\n \"sync\": \"アプリに同期\",\n \"synced\": \"すべてのアプリに同期しました\",\n \"syncError\": \"同期に失敗しました\",\n \"noAppsEnabled\": \"有効なアプリがありません\",\n \"added\": \"統合プロバイダーを追加しました\",\n \"addedAndSynced\": \"統合プロバイダーを追加して同期しました\",\n \"updated\": \"統合プロバイダーを更新しました\",\n \"deleted\": \"統合プロバイダーを削除しました\",\n \"addSuccess\": \"統合プロバイダーを追加しました\",\n \"addFailed\": \"統合プロバイダーの追加に失敗しました\",\n \"hint\": \"クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します\",\n \"manage\": \"管理\",\n \"loadError\": \"統合プロバイダーの読み込みに失敗しました\",\n \"saveError\": \"統合プロバイダーの保存に失敗しました\",\n \"deleteError\": \"統合プロバイダーの削除に失敗しました\",\n \"deleteConfirmTitle\": \"統合プロバイダーを削除\",\n \"deleteConfirmDescription\": \"「{{name}}」を削除してもよろしいですか?各アプリで生成されたプロバイダー設定も削除されます。\",\n \"syncConfirmTitle\": \"統合プロバイダーを同期\",\n \"syncConfirmDescription\": \"「{{name}}」を同期すると、Claude、Codex、Gemini の関連プロバイダー設定が上書きされます。続行しますか?\",\n \"syncConfirm\": \"同期\",\n \"saveAndSync\": \"保存して同期\",\n \"savedAndSynced\": \"すべてのアプリに保存・同期されました\",\n \"saveAndSyncError\": \"保存と同期に失敗しました\",\n \"configJsonPreview\": \"設定 JSON プレビュー\",\n \"configJsonPreviewHint\": \"以下は各アプリに同期される設定内容です(表示されているフィールドのみ上書きされ、他のカスタム設定は保持されます)\"\n },\n \"omo\": {\n \"editProfile\": \"OMO 設定を編集\",\n \"newProfile\": \"新規 OMO 設定\",\n \"profileName\": \"名前\",\n \"mainAgents\": \"メインエージェント\",\n \"subAgents\": \"サブエージェント\",\n \"categories\": \"カテゴリ\",\n \"customAgents\": \"カスタムエージェント\",\n \"noCustomAgents\": \"カスタムエージェントなし\",\n \"otherFields\": \"その他の設定\",\n \"globalConfig\": \"OMO グローバル設定\",\n \"globalConfigShort\": \"OMO 設定\",\n \"globalConfigSaved\": \"グローバル設定を保存しました\",\n \"addProfile\": \"OMO プロバイダーを追加\",\n \"disabledItems\": \"無効項目設定\",\n \"advanced\": \"詳細設定\",\n \"profileCreated\": \"OMO 設定を作成しました\",\n \"profileUpdated\": \"OMO 設定を更新しました\",\n \"invalidJson\": \"その他のフィールドに無効なJSONが含まれています\",\n \"confirmDelete\": \"設定を削除\",\n \"confirmDeleteMsg\": \"「{{name}}」を削除しますか?\",\n \"profileDeleted\": \"設定を削除しました\",\n \"imported\": \"「{{name}}」としてインポートしました\",\n \"import\": \"インポート\",\n \"global\": \"グローバル\",\n \"empty\": \"OMO 設定がありません。+ 追加またはローカルからインポートしてください。\",\n \"applied\": \"適用済み\",\n \"apply\": \"適用\",\n \"enable\": \"有効化\",\n \"enabled\": \"有効中\",\n \"disabled\": \"OMO を無効化しました\",\n \"disableFailed\": \"OMO の無効化に失敗しました: {{error}}\",\n \"selectPlaceholder\": \"選択してください...\",\n \"clear\": \"クリア\",\n \"clearWrapped\": \"(クリア)\",\n \"defaultWrapped\": \"(デフォルト)\",\n \"variantPlaceholder\": \"variant\",\n \"selectEnabledModel\": \"設定済みモデルを選択\",\n \"selectModel\": \"設定済みモデルを選択\",\n \"recommendedHint\": \"推奨: {{model}}\",\n \"searchModel\": \"モデルを検索...\",\n \"selectModelFirst\": \"先にモデルを選択\",\n \"noEnabledModels\": \"設定済みモデルがありません\",\n \"noVariantsForModel\": \"このモデルには思考レベルがありません\",\n \"currentValueNotEnabled\": \"{{value}} (現在値・未設定)\",\n \"currentValueUnavailable\": \"{{value}} (現在値・利用不可)\",\n \"advancedLabel\": \"詳細\",\n \"advancedJsonInvalid\": \"詳細 JSON が不正です\",\n \"advancedJsonHint\": \"temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します\",\n \"noEnabledModelsWarning\": \"利用可能な設定済みモデルがありません。先に OpenCode モデルを設定してください。\",\n \"modelSourcePartialWarning\": \"一部プロバイダーのモデル設定が不正なため、候補から除外しました。\",\n \"modelSourceFallbackWarning\": \"live プロバイダー状態の取得に失敗したため、設定済みプロバイダーへフォールバックしました。\",\n \"importLocalReplaceSuccess\": \"ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました\",\n \"importLocalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"agentKeyPlaceholder\": \"agent キー\",\n \"categoryKeyPlaceholder\": \"カテゴリキー\",\n \"modelNamePlaceholder\": \"model-name\",\n \"custom\": \"カスタム\",\n \"customCategories\": \"カスタムカテゴリ\",\n \"modelConfiguration\": \"モデル設定\",\n \"fillRecommended\": \"推奨を入力\",\n \"fillRecommendedSuccess\": \"推奨モデル {{count}} 件を設定しました\",\n \"fillRecommendedPartial\": \"推奨モデル {{filled}} 件を設定、{{unmatched}} 件は未一致\",\n \"fillRecommendedMostlyUnmatched\": \"{{filled}} 件のみ設定、{{unmatched}} 件は未一致(例: {{examples}})。これらのモデルを提供するプロバイダーを設定するか、代替を選択してください。\",\n \"fillRecommendedAllSet\": \"すべてのスロットにモデルが設定済みです\",\n \"fillRecommendedNoMatch\": \"推奨モデルが設定済みプロバイダーに見つかりませんでした(例: {{examples}})\",\n \"configSummary\": \"{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開\",\n \"enabledModelsCount\": \"設定済みモデル {{count}} 件\",\n \"source\": \"出典:\",\n \"otherFieldsJson\": \"その他のフィールド (JSON)\",\n \"slimOtherFieldsHint\": \"council、fallback、multiplexer、disabled_mcps、todoContinuation など、OMO Slim のトップレベル設定はここに記述します。\",\n \"searchOrType\": \"検索またはカスタム値を入力...\",\n \"noMatches\": \"一致する項目がありません\",\n \"jsonMustBeObject\": \"{{field}} は JSON オブジェクトである必要があります\",\n \"jsonInvalid\": \"{{field}} に無効な JSON が含まれています\",\n \"importGlobalSuccess\": \"ローカルファイルからグローバル設定を読み込みました(未保存)\",\n \"importGlobalFailed\": \"ローカルファイルの読み込みに失敗しました: {{error}}\",\n \"importLocal\": \"ローカルからインポート\",\n \"saveGlobalConfig\": \"グローバル設定を保存\",\n \"schemaUrl\": \"$schema\",\n \"resetDefault\": \"デフォルトに戻す\",\n \"sisyphusAgentConfig\": \"Sisyphus Agent 設定\",\n \"disabledAgents\": \"Agents\",\n \"disabledAgentsPlaceholder\": \"無効化する Agents\",\n \"disabledMcps\": \"MCPs\",\n \"disabledMcpsPlaceholder\": \"無効化する MCPs\",\n \"disabledHooks\": \"Hooks\",\n \"disabledHooksPlaceholder\": \"無効化する Hooks\",\n \"disabledSkills\": \"Skills\",\n \"disabledSkillsPlaceholder\": \"無効化する Skills\",\n \"advancedLsp\": \"LSP 設定\",\n \"advancedExperimental\": \"実験的機能\",\n \"advancedBackgroundTask\": \"バックグラウンドタスク\",\n \"advancedBrowserAutomation\": \"ブラウザ自動化\",\n \"advancedClaudeCode\": \"Claude Code\",\n \"agentDesc\": {\n \"sisyphus\": \"メインオーケストレーター\",\n \"hephaestus\": \"自律型ディープワーカー\",\n \"prometheus\": \"戦略プランナー\",\n \"atlas\": \"タスクマネージャー\",\n \"oracle\": \"戦略アドバイザー\",\n \"librarian\": \"マルチリポジトリ研究員\",\n \"explore\": \"高速コード検索\",\n \"multimodalLooker\": \"メディアアナライザー\",\n \"metis\": \"計画前分析アドバイザー\",\n \"momus\": \"プランレビュアー\",\n \"sisyphusJunior\": \"委任タスクエグゼキューター\"\n },\n \"agentTooltip\": {\n \"sisyphus\": \"メインオーケストレーター。タスクの計画、委任、並列実行を担当。拡張思考(32k バジェット)を使用し、TODO リストでワークフローを駆動してタスク完了を確保します。\",\n \"atlas\": \"メインオーケストレーター(TODO リスト保持)。実行フェーズでのタスク配分と調整を担当。すべての作業を直接行うのではなく、専門エージェントに委任します。\",\n \"prometheus\": \"戦略プランナー。インタビューモードで要件を収集し、詳細な作業計画を策定。.sisyphus/ ディレクトリ内の Markdown ファイルの読み書きのみ可能で、直接コードを書くことはありません。\",\n \"hephaestus\": \"自律型ディープワーカー(「正当な職人」)。AmpCode ディープモードに着想を得た目標指向の実行を行い、行動前に 2-5 個の探索/ライブラリアンエージェントを並列起動して調査します。\",\n \"oracle\": \"アーキテクチャ決定とデバッグのアドバイザー。読み取り専用のコンサルティングエージェントで、優れた論理的推論と深い分析を提供。ファイルの書き込みやタスクの委任はできません。\",\n \"librarian\": \"マルチリポジトリ分析とドキュメント検索の専門家。コードベースを深く理解し、エビデンスに基づく回答を提供。公式ドキュメントやオープンソース実装例の検索に長けています。\",\n \"explore\": \"高速コードベース探索とコンテキスト grep の専門家。軽量モデルを使用した高速検索で、コード構造を理解するための先鋒です。\",\n \"multimodalLooker\": \"ビジュアルコンテンツの専門家。PDF、画像、グラフなどの非テキストメディアを分析し、情報とインサイトを抽出します。\",\n \"metis\": \"プランコンサルタント。計画前に事前分析を行い、隠れた意図、曖昧な点、AI の失敗ポイントを特定して、過剰エンジニアリングを防止します。\",\n \"momus\": \"プランレビュアー。計画の明確さ、検証可能性、完全性を高精度で検証。計画が完璧になるまで却下と修正を要求します。\",\n \"sisyphusJunior\": \"カテゴリ生成のエグゼキューター。category パラメータにより自動生成され、割り当てられたタスクの実行に専念し、再委任はできません。無限委任ループを防止します。\"\n },\n \"categoryDesc\": {\n \"visualEngineering\": \"ビジュアル/フロントエンド工学\",\n \"ultrabrain\": \"超深度思考\",\n \"deep\": \"ディープワーク\",\n \"artistry\": \"クリエイティブ/芸術\",\n \"quick\": \"クイックレスポンス\",\n \"unspecifiedLow\": \"汎用ロースペック\",\n \"unspecifiedHigh\": \"汎用ハイスペック\",\n \"writing\": \"ライティング\"\n },\n \"categoryTooltip\": {\n \"visualEngineering\": \"フロントエンドとビジュアルエンジニアリングカテゴリ。UI/UX デザイン、スタイリング、アニメーション、インターフェース実装に特化。デフォルトで Gemini 3.5 Flash モデルを使用。\",\n \"ultrabrain\": \"ディープロジック推論カテゴリ。広範な分析が必要な複雑なアーキテクチャ決定に使用。デフォルトで GPT-5.3 Codex の超高推論バリアントを使用。\",\n \"deep\": \"ディープ自律問題解決カテゴリ。目標指向の実行で、行動前に徹底的な調査を実施。深い理解が必要な難問に適しています。\",\n \"artistry\": \"高度にクリエイティブで芸術的なタスクカテゴリ。斬新なアイデアとクリエイティブなソリューションを促進。デフォルトで Gemini 3.5 Flash の高推論バリアントを使用。\",\n \"quick\": \"軽量タスクカテゴリ。単一ファイルの修正、タイポ修正、簡単な調整などの些細な作業に使用。デフォルトで Claude Haiku 4.5 高速モデルを使用。\",\n \"unspecifiedLow\": \"未分類の低作業量タスクカテゴリ。他のカテゴリに該当せず作業量が小さいタスクに適用。デフォルトで Claude Sonnet 4.5 を使用。\",\n \"unspecifiedHigh\": \"未分類の高作業量タスクカテゴリ。他のカテゴリに該当せず作業量が大きいタスクに適用。デフォルトで Claude Opus 4.8 の max バリアントを使用。\",\n \"writing\": \"ライティングカテゴリ。ドキュメント、散文、技術文書に特化。デフォルトで Kimi K2.5 モデルを使用。\"\n },\n \"slimAgentDesc\": {\n \"orchestrator\": \"オーケストレーター\",\n \"oracle\": \"オラクル\",\n \"librarian\": \"ライブラリアン\",\n \"explorer\": \"エクスプローラー\",\n \"designer\": \"デザイナー\",\n \"fixer\": \"フィクサー\",\n \"council\": \"カウンシル\"\n },\n \"slimAgentTooltip\": {\n \"orchestrator\": \"実行コードの作成、マルチエージェントワークフローの調整、エキスパートの召喚\",\n \"oracle\": \"根本原因分析、アーキテクチャレビュー、デバッグガイダンス(読み取り専用)\",\n \"librarian\": \"ドキュメント検索、GitHubコード検索(読み取り専用)\",\n \"explorer\": \"正規表現検索、ASTパターンマッチング、ファイル検出(読み取り専用)\",\n \"designer\": \"モダンなレスポンシブデザイン、CSS/Tailwindの専門知識\",\n \"fixer\": \"コード実装、リファクタリング、テスト、検証\",\n \"council\": \"複数モデルの合議エージェント。複数の読み取り専用 councillor を並列実行し、master が最終回答を統合します。\"\n }\n },\n \"openclawConfig\": {\n \"defaultModel\": {\n \"title\": \"デフォルトモデル\",\n \"description\": \"OpenClaw のデフォルトのプライマリモデルとフォールバックモデルを設定します\",\n \"primary\": \"プライマリモデル\",\n \"primaryPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"fallbacks\": \"フォールバックモデル\",\n \"fallbacksPlaceholder\": \"例: openrouter/anthropic/claude-sonnet-4.5\",\n \"addFallback\": \"フォールバックモデルを追加\",\n \"saved\": \"デフォルトモデル設定を保存しました\",\n \"saveFailed\": \"デフォルトモデルの保存に失敗しました\"\n },\n \"modelCatalog\": {\n \"title\": \"モデルカタログ\",\n \"description\": \"モデルのエイリアスと許可リストを設定します\",\n \"modelId\": \"モデル ID\",\n \"modelIdPlaceholder\": \"例: deepseek/deepseek-chat\",\n \"alias\": \"エイリアス\",\n \"aliasPlaceholder\": \"例: DeepSeek\",\n \"addEntry\": \"モデルを追加\",\n \"removeEntry\": \"削除\",\n \"saved\": \"モデルカタログを保存しました\",\n \"saveFailed\": \"モデルカタログの保存に失敗しました\",\n \"empty\": \"モデルカタログエントリがありません\",\n \"emptyHint\": \"エイリアスを設定するにはカタログにモデルを追加してください\"\n },\n \"suggestedDefaults\": \"推奨デフォルト設定を適用\",\n \"suggestedDefaultsHint\": \"このプリセットの推奨デフォルトモデル設定を使用します\"\n },\n \"subscription\": {\n \"title\": \"サブスクリプションクォータ\",\n \"fiveHour\": \"5時間\",\n \"sevenDay\": \"7日間\",\n \"sevenDayOpus\": \"7日間(Opus)\",\n \"sevenDaySonnet\": \"7日間(Sonnet)\",\n \"geminiPro\": \"Pro\",\n \"geminiFlash\": \"Flash\",\n \"geminiFlashLite\": \"Flash Lite\",\n \"weeklyLimit\": \"週間\",\n \"copilotPremium\": \"プレミアム\",\n \"utilization\": \"{{value}}%\",\n \"resetsIn\": \"{{time}}後にリセット\",\n \"extraUsage\": \"超過使用量\",\n \"expired\": \"セッション期限切れ\",\n \"expiredHint\": \"{{tool}}コマンドを実行してログインを更新してください\",\n \"queryFailed\": \"クエリに失敗しました\",\n \"refresh\": \"更新\"\n },\n \"methodology\": {\n \"sidebar\": \"ワークフローオーケストレーション\",\n \"title\": \"ワークフローオーケストレーション\",\n \"subtitle\": \"方法論、プリセット編成、カスタム編成、デザイン契約——4つの独立した設定ディメンション。必要に応じて選択でき、順序依存はありません。フレームワーク検出は読み取り専用で、プロジェクトファイルを変更しません。\",\n \"scanAll\": \"全プロジェクトをスキャン\",\n \"scanAllNoProjects\": \"スキャンする前にプロジェクトを追加してください\",\n \"scanComplete\": \"フレームワーク検出が完了しました\",\n \"scanCompleteWithCount\": \"{{count}} 個のプロジェクトをスキャンしました\",\n \"tabMarket\": \"方法論の検出\",\n \"tabOrchestration\": \"ワークフロー設定\",\n \"notScanned\": \"未スキャン\",\n \"verified\": \"検出済み\",\n \"inferred\": \"使用の可能性\",\n \"absent\": \"未検出\",\n \"detectedInProjects\": \"{{detected}}/{{total}} プロジェクトで検出\",\n \"inferredInProjects\": \"{{inferred}}/{{total}} プロジェクトで使用の可能性\",\n \"absentInAll\": \"{{total}} プロジェクトすべてで未検出\",\n \"noneDetectedTitle\": \"方法論フレームワークが検出されませんでした\",\n \"noneDetectedGuidance\": \"flow-kit(純 Markdown テンプレート体系)または spec-kit(スペックツールチェーン)から始めることをお勧めします。review-only プリセットは、既存のコードレビューフローがあるプロジェクトに適しています。フレームワークのインストールは不要です。\",\n \"scanPromptTitle\": \"プロジェクトの方法論フレームワークは未スキャンです\",\n \"scanPromptBody\": \"「全プロジェクトをスキャン」で読み取り専用検出を行うか、プリセット編成 / カスタム編成に直接進めます。フレームワークのインストールや検出は不要です。\",\n \"goToOrchestration\": \"プリセット編成へ\",\n \"goToRecipe\": \"カスタム編成\",\n \"recommendedPreset\": \"推奨ティア:{{preset}}\",\n \"recommendedFrameworks\": \"フレームワーク参考カタログ\",\n \"recommendedFrameworksHint\": \"サポート対象のオープンソース方法論一覧(インストールウィザードではありません)\",\n \"detectedFrameworks\": \"検出されたフレームワーク\",\n \"directOrchestrationTitle\": \"フレームワークなしでも編成を開始できます\",\n \"directOrchestrationHint\": \"プリセット編成とカスタム編成は独立して利用でき、workflow.profile.json や Recipe ファイルをエクスポートできます。\",\n \"presetFull\": \"フルワークフロー\",\n \"presetStandard\": \"標準ワークフロー\",\n \"presetMvp\": \"MVP ワークフロー\",\n \"presetReviewOnly\": \"レビューのみ\",\n \"noDescriptors\": \"フレームワークカタログが空です。データベースが初期化されているか確認してください。\",\n \"detectionMatrix\": \"検出マトリックス\",\n \"detectionMatrixHint\": \"プロジェクト × フレームワーク検出結果(✓ 検出済み / ? 使用の可能性 / ✗ 未検出 / — 未スキャン)\",\n \"matrixFramework\": \"フレームワーク \\\\ プロジェクト\",\n \"orchestrationEntry\": \"プリセット編成ツール\",\n \"orchestrationHint\": \"独立ディメンション:プロジェクトを選択し、フロー プリセット、モジュール、ステージを設定して、workflow.profile.json または flow-config.yaml をエクスポートします。方法論フレームワークのスキャンは不要です。\",\n \"orchestrationNoProjects\": \"プロジェクトがありません。ワークスペースでプロジェクトを追加してから、フロー編成を設定してください。\",\n \"orchestrationSelectProject\": \"プロジェクトを選択\",\n \"orchestrationChooseProject\": \"— プロジェクトを選択 —\",\n \"orchestrationPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、SDD フロー編成の設定を開始してください。\",\n \"tabRecipe\": \"変更実行プラン\",\n \"recipeEntry\": \"変更実行プラン\",\n \"recipeHint\": \"独立ディメンション:ビジュアルステージグラフ + ステージとモジュールを自由に組み合わせ、YAML+Markdown ハイブリッド形式の Recipe ファイルをエクスポート。他のディメンションの設定なしで単独使用可能です。\",\n \"recipeNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"recipeSelectProject\": \"プロジェクトを選択\",\n \"recipePickPlaceholder\": \"— プロジェクトを選択 —\",\n \"recipePickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、Recipe の編成を開始してください。\",\n \"tabDesignContract\": \"デザイン契約\",\n \"designContractEntry\": \"デザイン契約コンフィギュレーター\",\n \"designContractHint\": \"独立ディメンション:ブランドテンプレートまたはカスタム配色を選択し、DESIGN.md + DTCG tokens を生成します。SDD 方法論とは無関係で、フロントエンド/UI を持つあらゆるプロジェクトで独立使用できます。\",\n \"designContractNoProjects\": \"プロジェクトがありません。まずワークスペースにプロジェクトを追加してください。\",\n \"designContractSelectProject\": \"プロジェクトを選択\",\n \"designContractPickPlaceholder\": \"— プロジェクトを選択 —\",\n \"designContractPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、デザイン契約の設定を開始してください。\",\n \"tabRulesContext\": \"ルールとコンテキスト\",\n \"rulesContextPickProjectHint\": \"上のドロップダウンからプロジェクトを選択して、リンク済みのルールとコンテキスト ファイルを表示します。\"\n },\n \"rulesContext\": {\n \"title\": \"プロジェクト ルール\",\n \"hint\": \"このプロジェクトにリンク済みのルール フラグメント。Glob 付きのルールは、一致するファイルが存在する場合にのみ適用されます。\",\n \"empty\": \"リンク済みのルールがありません。エージェント設定 > プロンプトでルール フラグメントを作成し、プロジェクト詳細でリンクしてください。\",\n \"fragment\": \"フラグメント\",\n \"allTargets\": \"全ツール\",\n \"universal\": \"グローバル\",\n \"contextFiles\": \"コンテキスト ファイル\",\n \"contextFilesHint\": \"プロジェクト同期時に各 AI ツール向けに生成されるコンテキスト ファイル。プロンプトがリンクされているツールのみがファイルを生成します。\",\n \"willSync\": \"同期予定\",\n \"managed\": \"管理中\",\n \"userCreated\": \"ユーザー作成\",\n \"pendingSync\": \"同期待ち\",\n \"notLinked\": \"未リンク\"\n },\n \"recipeComposer\": {\n \"title\": \"変更実行プラン\",\n \"hybrid\": \"YAML+Markdown ハイブリッド\",\n \"loading\": \"編成ツールを読み込み中...\",\n \"preset\": \"プリセット\",\n \"projectType\": \"プロジェクトタイプ\",\n \"projectTypeBackend\": \"バックエンド\",\n \"projectTypeFrontend\": \"フロントエンド\",\n \"projectTypeCli\": \"CLI\",\n \"recipeName\": \"Recipe 名\",\n \"recipeNamePlaceholder\": \"My Recipe\",\n \"description\": \"説明\",\n \"descriptionPlaceholder\": \"標準プリセットから編成した Recipe\",\n \"stageGraph\": \"ステージグラフ\",\n \"nodesCount\": \"{{count}} ノード\",\n \"modules\": \"モジュール\",\n \"stages\": \"ステージ\",\n \"stagesEnabled\": \"{{enabled}}/{{total}} 有効\",\n \"notes\": \"メモ(任意)\",\n \"notesPlaceholder\": \"この Recipe のカスタムメモ...\",\n \"changeId\": \"Change ID\",\n \"changeIdPlaceholder\": \"例: feat-auth、fix-login-bug\",\n \"preview\": \"プレビュー\",\n \"copy\": \"コピー\",\n \"export\": \"Recipe をエクスポート\",\n \"install\": \"プロジェクトにインストール\",\n \"installedSummary\": \"インストール完了:{{created}} 個のファイルを作成\",\n \"installedSkipped\": \"、{{skipped}} 個の既存ファイルをスキップ\",\n \"exists\": \"(既存)\",\n \"previewTitle\": \"プレビュー(YAML+Markdown ハイブリッド)\",\n \"collapse\": \"折りたたむ\",\n \"savedRecipes\": \"保存済み Recipe\",\n \"fitWidth\": \"幅に合わせる\",\n \"actualSize\": \"実際のサイズ\",\n \"lateral\": \"横断(クロスカット)\",\n \"legendStandalone\": \"独立\",\n \"legendSemi\": \"準独立\",\n \"legendBranch\": \"分岐\",\n \"legendNoArtifacts\": \"成果物なし\",\n \"toastExported\": \"Recipe「{{name}}」を .opensunstar/recipe/ にエクスポートしました\",\n \"toastCopied\": \"Recipe の内容をクリップボードにコピーしました\",\n \"toastCopyFailed\": \"コピーに失敗しました\",\n \"toastChangeIdRequired\": \"Change ID を入力してください(例: feat-auth)\",\n \"toastInstalled\": \"Recipe をプロジェクトにインストール:{{created}} 個のファイルを作成\",\n \"toastDeleted\": \"Recipe「{{name}}」を削除しました\"\n },\n \"designContract\": {\n \"title\": \"デザイン契約\",\n \"name\": \"契約名\",\n \"description\": \"説明\",\n \"templates\": \"テンプレート\",\n \"tokens\": \"トークン\",\n \"preview\": \"プレビュー\",\n \"import\": \"インポート\",\n \"colors\": \"カラー\",\n \"typography\": \"タイポグラフィ\",\n \"spacing\": \"スペーシング基数 (px)\",\n \"copy\": \"コピー\",\n \"copied\": \"クリップボードにコピーしました\",\n \"exported\": \"エクスポートしました\",\n \"installed\": \"インストールしました\",\n \"loadingTemplate\": \"テンプレートを読み込み中...\",\n \"noPreview\": \"プレビューをクリックして DESIGN.md を生成\",\n \"importFile\": \"ファイルからインポート\",\n \"pickFile\": \"DESIGN.md ファイルを選択...\",\n \"importUrl\": \"URL からインポート\",\n \"previewBtn\": \"プレビュー\",\n \"copyBtn\": \"コピー\",\n \"exportBtn\": \"エクスポート\",\n \"installBtn\": \"プロジェクトにインストール\",\n \"installResult\": \"インストール完了\",\n \"filesCreated\": \"ファイル作成\",\n \"filesSkipped\": \"スキップ\",\n \"exists\": \"既存\"\n },\n \"installConfirm\": {\n \"title\": \"プロジェクトへのインストールを確認\",\n \"auditScan\": \"セキュリティ監査スキャン\",\n \"filesScanned\": \"ファイルスキャン済み\",\n \"noFindings\": \"セキュリティ問題は検出されませんでした。\",\n \"auditBlocked\": \"CRITICAL レベルの問題が検出されました。インストールはブロックされています。修正後に再試行してください。\",\n \"fileList\": \"ファイルリスト\",\n \"toCreate\": \"作成予定\",\n \"toSkip\": \"既存のためスキップ\",\n \"create\": \"作成\",\n \"skip\": \"スキップ\",\n \"existing\": \"既存の内容\",\n \"wouldOverwrite\": \"上書き予定 (現在はスキップ)\",\n \"newContent\": \"新しい内容\",\n \"cancel\": \"キャンセル\",\n \"confirmInstall\": \"インストール確認\"\n },\n \"sidebar\": {\n \"kanban\": \"プロジェクトAIカンバン\",\n \"tokenStats\": \"AI Tokens\",\n \"syncBackup\": \"同期バックアップ\",\n \"agentConfig\": \"Agent 設定\",\n \"projectConfig\": \"プロジェクト設定\",\n \"planning\": \"計画中\",\n \"section\": {\n \"projects\": \"プロジェクト\",\n \"myProjects\": \"マイプロジェクト\",\n \"monitor\": \"モニタリング\",\n \"aiModels\": \"AIモデル\",\n \"cloudSync\": \"クロスデバイス クラウド同期\",\n \"teamCollab\": \"チームコラボ設定\",\n \"syncCollab\": \"同期とコラボレーション\"\n }\n },\n \"sync\": {\n \"waiting\": \"変更を待っています\",\n \"syncing\": \"同期中...\",\n \"synced\": \"同期済み\",\n \"failed\": \"同期に失敗しました\",\n \"disabled\": \"無効\",\n \"justNow\": \"たった今\",\n \"minutesAgo\": \"{{count}}分前\",\n \"hoursAgo\": \"{{count}}時間前\",\n \"daysAgo\": \"{{count}}日前\"\n },\n \"onboarding\": {\n \"title\": \"クイックスタート\",\n \"dismiss\": \"ガイドを閉じる\",\n \"prev\": \"前へ\",\n \"next\": \"次へ\",\n \"done\": \"了解\",\n \"step1\": {\n \"title\": \"プロジェクトを追加\",\n \"desc\": \"すべての機能はプロジェクトを中心に展開します。サイドバーの「マイプロジェクト → プロジェクトを追加」からリポジトリを追加すると、OpenSunstar が AI 設定状態を自動スキャンします。\"\n },\n \"step2\": {\n \"title\": \"プロジェクトコックピット — 今日は問題ある?\",\n \"desc\": \"「アラート」は一つの質問に答えます:今日は問題があるか。何もなければ「今日は問題なし」と表示。問題がないのが最高のニュースです。「プロジェクトボード」には集計指標とアセットマトリクスがあり、概要コンテンツは起動時の一目を占領しません。\"\n },\n \"step3\": {\n \"title\": \"AIアセット設定 — プロジェクトにアセットを適用\",\n \"desc\": \"「プロジェクト設定 → AIアセット設定」で MCP サーバー、Skills、Prompts などのアセットをプロジェクトに関連付けます。サイドバーの「Agent 設定」はグローバルライブラリを管理し、ここではそのプロジェクトへの関連付けを管理します。\"\n },\n \"step4\": {\n \"title\": \"ワークフローオーケストレーション — 実行可能なフローを構築\",\n \"desc\": \"「プロジェクト設定 → ワークフローオーケストレーション」でステージ、プリセット、変更実行プランを設定します。方法論検出、プリセット編成、カスタム編成、デザイン契約——4つの独立したディメンション、必要に応じて選択でき、順序依存はありません。\"\n }\n },\n \"repairPreview\": {\n \"title\": \"設定修復プレビュー\",\n \"description\": \"プロジェクト「{{name}}」に {{count}} 件の設定不一致があります。修復する項目を選択してください:\",\n \"loading\": \"対応が必要な項目をスキャン中…\",\n \"empty\": \"設定不一致は見つかりませんでした。修復の必要はありません\",\n \"selectAll\": \"全選択\",\n \"deselectAll\": \"全解除\",\n \"safetyHint\": \"{{count}} 件のセキュリティ重要項目(Ignore/Permissions/Hooks)— 修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyCriticalTooltip\": \"セキュリティ重要項目:修復によりアクセス制御またはコマンド実行設定が上書きされます\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"confirmAction\": \"選択項目を修復({{count}})\",\n \"repairing\": \"修復中…\"\n },\n \"assetsMatrix\": {\n \"title\": \"AI 設定状態\",\n \"subtitle\": \"各セルに AI 設定の短い状態を表示します:有効、不一致、欠落、グローバル、検出、未スキャン、対象外。クリックで詳細を表示します。\",\n \"project\": \"プロジェクト\",\n \"stage\": \"段階\",\n \"score\": \"スコア\",\n \"loading\": \"プロジェクト設定をスキャン中…\",\n \"refreshing\": \"更新中\",\n \"normal\": \"正常\",\n \"attention\": \"要確認\",\n \"abnormal\": \"異常\",\n \"unscanned\": \"未スキャン\",\n \"hasIssue\": \"対応が必要\",\n \"showProblemsOnly\": \"対応が必要な項目のみ\",\n \"filterLabel\": \"プロジェクト状態フィルター\",\n \"filterAll\": \"すべて\",\n \"filterNeedsAction\": \"対応が必要\",\n \"filterAbnormal\": \"異常\",\n \"filterUnscanned\": \"未スキャン\",\n \"allClear\": \"このフィルターで対応が必要なプロジェクトはありません\",\n \"cellOk\": \"正常\",\n \"cellEffective\": \"有効\",\n \"cellMismatch\": \"不一致\",\n \"cellMissing\": \"欠落\",\n \"cellGlobal\": \"グローバル\",\n \"cellDetected\": \"検出\",\n \"cellPartial\": \"一部\",\n \"cellWarn\": \"要確認\",\n \"cellCrit\": \"異常\",\n \"cellUnscanned\": \"未スキャン\",\n \"cellNA\": \"対象外\",\n \"cellRecent\": \"更新あり\",\n \"cellStale\": \"更新なし\",\n \"colUpkeep\": \"メンテナンス\",\n \"colUpkeepTitle\": \"直近 90 日間のプロジェクトアセット更新\",\n \"linkedCount\": \"OpenSunstar で連携済み\",\n \"linkedCountValue\": \"{{value}} 件\",\n \"detailRecentUpdates\": \"直近 90 日間にプロジェクト単位の AI アセット設定変更があったかを判定\",\n \"safetyBadge\": \"セキュリティ重要\",\n \"noData\": \"スキャンデータなし\",\n \"scanPending\": \"スキャンが完了していないため、正常とは判断できません。\",\n \"detailEffective\": \"設定が有効で、OpenSunstar ライブラリと一致\",\n \"detailDrifted\": \"設定が期待値と異なる、修復の必要あり\",\n \"detailUnscanned\": \"設定は検出されましたが、対象 CLI の有効状態比較はまだ完了していません\",\n \"detailGlobal\": \"グローバルデフォルト設定を使用中、プロジェクト固有のカスタマイズなし\",\n \"detailDetected\": \"リポジトリに設定を検出したが、OpenSunstar で管理されていない\",\n \"detailMissingSafety\": \"セキュリティ重要項目が未設定、早急な設定を推奨\",\n \"detailMissing\": \"未設定、不要な場合は無視可能\",\n \"detailPartial\": \"一部のみ設定済み、完成を推奨\",\n \"detailNA\": \"現在の対象 CLI では未対応\",\n \"statusOk\": \"設定正常\",\n \"statusWarn\": \"要確認\",\n \"statusCrit\": \"異常あり\",\n \"statusUnscanned\": \"未スキャン\",\n \"statusNA\": \"対象外\",\n \"stateDetail\": \"状態詳細\",\n \"driftDetail\": \"状態詳細\",\n \"checkDetail\": \"チェック詳細\",\n \"filePath\": \"設定ファイルパス\",\n \"viewProject\": \"プロジェクトアセットを表示\",\n \"goRepair\": \"修復へ\"\n },\n \"scope\": {\n \"globalEnabled\": \"グローバルで有効\",\n \"globalNotEnabled\": \"グローバルでは無効\",\n \"activeProject\": \"プロジェクト:{{name}}\",\n \"backToProject\": \"プロジェクトに戻る:{{name}}\",\n \"globalScope\": \"グローバル\",\n \"projectScope\": \"プロジェクト\",\n \"globalToast\": \"{{app}} をグローバルで有効にしました\",\n \"globalDisableToast\": \"{{app}} をグローバルで無効にしました\"\n },\n \"cloudSyncDashboard\": {\n \"title\": \"クロスデバイス クラウド同期\",\n \"subtitle\": \"複数デバイス間で設定データを同期し、どこでも一貫した開発環境を維持\",\n \"status\": \"同期状態\",\n \"backend\": \"同期バックエンド\",\n \"notConfigured\": \"未設定\",\n \"notConfiguredHint\": \"先に設定でクラウド同期バックエンド(WebDAV / S3 / GitHub Gist)を設定してください\",\n \"goSettings\": \"同期設定へ\",\n \"lastSync\": \"最終同期\",\n \"never\": \"未同期\",\n \"webdav\": \"WebDAV\",\n \"s3\": \"S3オブジェクトストレージ\",\n \"gist\": \"GitHub Gist\",\n \"enabled\": \"有効\",\n \"disabled\": \"無効\",\n \"autoSync\": \"自動同期\",\n \"on\": \"オン\",\n \"off\": \"オフ\",\n \"description\": \"クラウド同期は空間軸(デバイス間の一貫性)を解決します。プロジェクト環境スナップショット(時間軸・バージョンロールバック)と相互補完、必要に応じて使用。\"\n },\n \"kanban\": {\n \"readiness\": {\n \"compactTitle\": \"プロジェクト設定の準備状況\",\n \"normalCount\": \"正常 {{count}} 件\",\n \"driftCount\": \"不一致 {{count}} 件\",\n \"missingCount\": \"未設定 {{count}} 件\",\n \"priorityDrift\": \"優先対応:{{label}} の設定が不一致です\",\n \"priorityMissing\": \"優先対応:{{label}} を設定してください\"\n }\n },\n \"projectAssets\": {\n \"projectLink\": \"このプロジェクトに関連付け\"\n },\n \"projectAiConfig\": {\n \"title\": \"AIアセット設定\",\n \"subtitle\": \"単一プロジェクトに AI アセットを適用します:ブループリントの適用、準備状況の確認、有効にするアセットの選択。サイドバーの「Agent 設定」はグローバルライブラリを管理し、このページはそれらを本プロジェクトへ関連付けます。\",\n \"switcher\": \"設定対象のプロジェクト\",\n \"targetCli\": \"対象 CLI\",\n \"tabs\": {\n \"assets\": \"アセット関連付け\",\n \"readiness\": \"準備と反映\",\n \"environment\": \"プロジェクト環境 & Wiki\"\n },\n \"emptyProjects\": \"プロジェクトがまだありません。追加してから AI アセットを設定してください。\",\n \"openWorkflow\": \"プロジェクトワークフローを設定\",\n \"orchestrationLink\": \"ワークフロー編成\",\n \"orchestrationHint\": \"ステージ・プリセット・変更実行プランは「ワークフローと方法論」で設定します。現在のプロジェクトを引き継いで移動します。\"\n },\n \"ai\": {\n \"cost\": {\n \"analysisCount\": \"分析 {{calls}} 件\",\n \"cachedFree\": \"¥0(キャッシュ)\",\n \"chartApiCalls\": \"API 呼び出し\",\n \"chartCost\": \"費用\",\n \"chartNlQuery\": \"NL 質問応答\",\n \"colCost\": \"費用\",\n \"colCount\": \"回数\",\n \"colTokens\": \"トークン\",\n \"colType\": \"種類\",\n \"disclaimer\": \"費用は公開価格に基づく概算です。プロバイダーの請求書が正となります。\",\n \"disclaimerCliSuffix\": \"CLI エージェントの使用量は「設定 → 使用量」を参照してください。\",\n \"disclaimerShort\": \"概算 · 請求書が正\",\n \"emptyRoi\": \"過去 {{days}} 日間に AI 呼び出しの記録がありません。要約・リスク分析・NL 質問応答を実行すると ROI がここに表示されます。\",\n \"estimatedSuffix\": \"概算\",\n \"lastCall\": \"今回\",\n \"loadingRoi\": \"ROI データを読み込み中…\",\n \"monthTotal\": \"今月累計\",\n \"monthTotalFailed\": \"今月累計の取得に失敗(不明であり ¥0 ではありません)\",\n \"monthTotalLoading\": \"今月累計 集計中…\",\n \"nlQueryCount\": \"質問応答 {{queries}} 件\",\n \"panelTitle\": \"AI コスト・価値トラッキング\",\n \"projectRisks\": \"リスク {{risks}} 件\",\n \"projectScope\": \"{{projects}} プロジェクト\",\n \"projectUseful\": \"有用 {{useful}} 件\",\n \"rangeDays\": \"{{days}} 日\",\n \"roiReport\": \"AI 投入レポート\",\n \"sectionByProject\": \"プロジェクト別(コスト ↔ 価値)\",\n \"sectionByType\": \"分析種類別\",\n \"statRisks\": \"検出リスク\",\n \"statTokens\": \"トークン\",\n \"statTotalSpend\": \"総投入\",\n \"statUseful\": \"有用マーク\",\n \"stripTitle\": \"AI コスト可視化\",\n \"trendTitle\": \"日次 AI 投入トレンド\",\n \"unknownPricing\": \"単価不明\"\n },\n \"feedback\": {\n \"groupLabel\": \"AI フィードバック\",\n \"markNotUseful\": \"役に立たないとマーク\",\n \"markUseful\": \"役に立つとマーク\",\n \"notUseful\": \"役に立たない\",\n \"useful\": \"役に立つ\"\n },\n \"insightType\": {\n \"agentReadiness\": \"Agent 準備度\",\n \"health\": \"ヘルススコア\",\n \"nlQuery\": \"自然言語クエリ\",\n \"portfolioSummary\": \"ポートフォリオ週報\",\n \"progress\": \"進捗見積り\",\n \"riskAnalysis\": \"リスク分析\",\n \"summary\": \"プロジェクト要約\",\n \"trendAnalysis\": \"トレンド分析\"\n },\n \"query\": {\n \"answerTitle\": \"AI の回答\",\n \"costFailed\": \"コスト集計の取得に失敗(不明であり ¥0 ではありません)\",\n \"detailToggle\": \"過去 {{days}} 日の分析内訳\",\n \"guarding\": \"AI が見守り中\",\n \"inputLabel\": \"AI に質問\",\n \"notConfigured\": \"AI 質問応答とコスト集計は未有効です —— 「設定 → AI プロバイダー」に API キーを入力すると、ここに自然言語での質問入力欄が表示されます。\",\n \"placeholder\": \"AI に質問 — 例:最近動きのないプロジェクトは?今週のまとめを作って\",\n \"projectsUnit\": \"プロジェクト\",\n \"typeHealth\": \"健康\",\n \"typeNlQuery\": \"質問\",\n \"typeRisk\": \"リスク\",\n \"typeSummary\": \"要約\",\n \"typeTrend\": \"トレンド\",\n \"typeWeekly\": \"週報\"\n },\n \"risk\": {\n \"analyze\": \"リスクを分析\",\n \"analyzing\": \"リスクを分析中…\",\n \"levelHigh\": \"高リスク\",\n \"levelLow\": \"低リスク\",\n \"levelMedium\": \"中リスク\",\n \"none\": \"プロジェクトは健全です。リスクは検出されていません\",\n \"sectionTitle\": \"リスク分析\",\n \"title\": \"AI リスク分析\",\n \"typeActivity\": \"活動度\",\n \"typeConcentration\": \"集中度\",\n \"typeSchedule\": \"スケジュール\",\n \"typeTechDebt\": \"技術的負債\"\n },\n \"weekly\": {\n \"analyzing\": \"{{projects}} 件のプロジェクトデータを分析中…\",\n \"cached\": \"キャッシュ\",\n \"copied\": \"コピー済み\",\n \"copyFailed\": \"コピーに失敗しました\",\n \"copySuccess\": \"週報をクリップボードにコピーしました\",\n \"dialogTitle\": \"AI 週次レポート\",\n \"errorGenerate\": \"週報の生成に失敗しました。しばらくしてから再試行してください。\",\n \"errorNoProvider\": \"AI プロバイダーが未設定です。先に設定で AI キーを登録してください。\",\n \"generate\": \"週報を生成\",\n \"windowDays\": \"{{days}}日\",\n \"windowHint\": \"· 過去 {{days}} 日のデータ\"\n }\n },\n \"alerts\": {\n \"action\": {\n \"budget\": \"予算を調整\",\n \"configure\": \"設定する\",\n \"hintAssets\": \"→ プロジェクトアセット設定 · アセット関連付け\",\n \"hintReadiness\": \"→ プロジェクトアセット設定 · 準備状況と有効化\",\n \"repair\": \"修復する\",\n \"setup\": \"設定する\"\n },\n \"dismiss\": \"了解\",\n \"empty\": {\n \"desc\": \"障害、予算超過、保留中の修復はありません。コーディングに戻りましょう。\",\n \"title\": \"今日は問題ありません\"\n },\n \"money\": {\n \"critical\": \"予算超過\",\n \"emergency\": \"大幅な予算超過\",\n \"warning\": \"予算アラート\"\n },\n \"onlyTasks\": \"状態と支出に問題はありません。残りはスケジュールできます。\",\n \"task\": {\n \"driftDesc\": \"設定が期待値と異なります。プレビュー後にワンクリックで修復できます\",\n \"gapDesc\": \"準備状況が未完了です。プロジェクトアセット設定で不足を補ってください\"\n },\n \"viewAll\": \"プロジェクト全体を見る\"\n },\n \"xaiOauth\": {\n \"authStatus\": \"xAI OAuth 認証\",\n \"accountCount\": \"{{count}} 件の利用可能なアカウント\",\n \"reauthRequired\": \"再ログインが必要\",\n \"notAuthenticated\": \"未認証\",\n \"selectAccount\": \"アカウントを選択\",\n \"selectAccountPlaceholder\": \"xAI アカウントを選択\",\n \"useDefaultAccount\": \"既定アカウントを使用\",\n \"accounts\": \"xAI アカウント\",\n \"expired\": \"認証情報の期限切れ\",\n \"defaultAccount\": \"既定\",\n \"setAsDefault\": \"既定に設定\",\n \"removeAccount\": \"アカウントを削除\",\n \"addOrReauth\": \"アカウントを追加または再ログイン\",\n \"login\": \"xAI でログイン\",\n \"waitingForAuth\": \"xAI 認証待機中…\",\n \"enterCode\": \"ブラウザに自動入力されない場合は入力:\",\n \"retry\": \"再試行\",\n \"logoutAll\": \"すべての xAI アカウントを削除\",\n \"loginRequired\": \"先に xAI アカウントでログインしてください\",\n \"selectedAccountNeedsReauth\": \"紐づけたアカウントが見つからないか再ログインが必要です\",\n \"selectedAccountUnavailable\": \"紐づけたアカウントが見つからないか再ログインが必要です。別のアカウントを選択してください。\"\n }\n}\n"}}, "src-tauri/src/services/provider/mod.rs": {"636da7d3bc74f3edff5eca22e9f0e90370cc83ed": {"t": 1785746245.2316935, "n": 110247, "h": "fb974806f0d42284", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, capture_live_snapshot,\n normalize_provider_common_config_for_storage, provider_exists_in_live_config,\n strip_common_config_from_live_settings, sync_current_provider_for_app_to_live,\n write_live_with_common_config, LiveSnapshot,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test(flavor = \"multi_thread\", worker_threads = 2)]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let backup_value: Value =\n serde_json::from_str(&backup.original_config).expect(\"parse live backup\");\n assert_eq!(\n backup_value\n .pointer(\"/env/ANTHROPIC_API_KEY\")\n .and_then(Value::as_str),\n Some(\"token-updated\"),\n \"加密 Live 备份应保存可恢复的令牌值,而不是数据库中的 keychain 引用\"\n );\n assert_eq!(\n backup_value.get(\"permissions\"),\n updated.settings_config.get(\"permissions\")\n );\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n let expected_takeover_token = db\n .get_or_create_proxy_takeover_token()\n .expect(\"resolve per-install takeover token\");\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(expected_takeover_token.as_str()),\n \"takeover 占位符应改写为本安装随机令牌(历史裸 PROXY_MANAGED 视为过期)\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(&mut provider, &app_type)?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Claude/Gemini 官方 API 仍保持原限制;Codex 官方订阅使用本地请求级透传。\n if should_hot_switch\n && _provider.category.as_deref() == Some(\"official\")\n && !matches!(app_type, AppType::Codex)\n {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n pub(crate) fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "6478a54d051f981798fde49e0df8f2c516051686": {"t": 1785761035.3279922, "n": 110247, "h": "fb974806f0d42284", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, capture_live_snapshot,\n normalize_provider_common_config_for_storage, provider_exists_in_live_config,\n strip_common_config_from_live_settings, sync_current_provider_for_app_to_live,\n write_live_with_common_config, LiveSnapshot,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test(flavor = \"multi_thread\", worker_threads = 2)]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let backup_value: Value =\n serde_json::from_str(&backup.original_config).expect(\"parse live backup\");\n assert_eq!(\n backup_value\n .pointer(\"/env/ANTHROPIC_API_KEY\")\n .and_then(Value::as_str),\n Some(\"token-updated\"),\n \"加密 Live 备份应保存可恢复的令牌值,而不是数据库中的 keychain 引用\"\n );\n assert_eq!(\n backup_value.get(\"permissions\"),\n updated.settings_config.get(\"permissions\")\n );\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n let expected_takeover_token = db\n .get_or_create_proxy_takeover_token()\n .expect(\"resolve per-install takeover token\");\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(expected_takeover_token.as_str()),\n \"takeover 占位符应改写为本安装随机令牌(历史裸 PROXY_MANAGED 视为过期)\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(&mut provider, &app_type)?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Claude/Gemini 官方 API 仍保持原限制;Codex 官方订阅使用本地请求级透传。\n if should_hot_switch\n && _provider.category.as_deref() == Some(\"official\")\n && !matches!(app_type, AppType::Codex)\n {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n pub(crate) fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "38ba082d679b4679a1de50149b8e2f1359482d1a": {"t": 1785761037.0037785, "n": 110072, "h": "e4c593a2347461d7", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, capture_live_snapshot,\n normalize_provider_common_config_for_storage, provider_exists_in_live_config,\n strip_common_config_from_live_settings, sync_current_provider_for_app_to_live,\n write_live_with_common_config, LiveSnapshot,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test(flavor = \"multi_thread\", worker_threads = 2)]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let backup_value: Value =\n serde_json::from_str(&backup.original_config).expect(\"parse live backup\");\n assert_eq!(\n backup_value\n .pointer(\"/env/ANTHROPIC_API_KEY\")\n .and_then(Value::as_str),\n Some(\"token-updated\"),\n \"加密 Live 备份应保存可恢复的令牌值,而不是数据库中的 keychain 引用\"\n );\n assert_eq!(\n backup_value.get(\"permissions\"),\n updated.settings_config.get(\"permissions\")\n );\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(\"PROXY_MANAGED\"),\n \"takeover placeholder should stay intact\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(&mut provider, &app_type)?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Claude/Gemini 官方 API 仍保持原限制;Codex 官方订阅使用本地请求级透传。\n if should_hot_switch\n && _provider.category.as_deref() == Some(\"official\")\n && !matches!(app_type, AppType::Codex)\n {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n pub(crate) fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "3258787740822bfaf1a48cde64214b5c91ed0fe8": {"t": 1785761038.6574893, "n": 109929, "h": "accee8a5f1060f2e", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, capture_live_snapshot,\n normalize_provider_common_config_for_storage, provider_exists_in_live_config,\n strip_common_config_from_live_settings, sync_current_provider_for_app_to_live,\n write_live_with_common_config, LiveSnapshot,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let stored_provider = db\n .get_provider_by_id(\"p1\", \"claude\")\n .expect(\"get stored provider\")\n .expect(\"stored provider exists\");\n let expected_backup =\n serde_json::to_string(&stored_provider.settings_config).expect(\"serialize\");\n assert_eq!(backup.original_config, expected_backup);\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(\"PROXY_MANAGED\"),\n \"takeover placeholder should stay intact\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(&mut provider, &app_type)?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Block switching to official providers when proxy takeover is active.\n // Using a proxy with official APIs (Anthropic/OpenAI/Google) may cause account bans.\n if should_hot_switch && _provider.category.as_deref() == Some(\"official\") {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n pub(crate) fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "d2ef60c6894b12cf8aa9f12d984c2e1dc0db18a8": {"t": 1785761040.333129, "n": 109901, "h": "ff26be6951c33ef4", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, normalize_provider_common_config_for_storage,\n provider_exists_in_live_config, strip_common_config_from_live_settings,\n sync_current_provider_for_app_to_live, write_live_with_common_config,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let stored_provider = db\n .get_provider_by_id(\"p1\", \"claude\")\n .expect(\"get stored provider\")\n .expect(\"stored provider exists\");\n let expected_backup =\n serde_json::to_string(&stored_provider.settings_config).expect(\"serialize\");\n assert_eq!(backup.original_config, expected_backup);\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(\"PROXY_MANAGED\"),\n \"takeover placeholder should stay intact\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(&mut provider, &app_type)?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Block switching to official providers when proxy takeover is active.\n // Using a proxy with official APIs (Anthropic/OpenAI/Google) may cause account bans.\n if should_hot_switch && _provider.category.as_deref() == Some(\"official\") {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n #[allow(dead_code)]\n fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "bccae335cf5dddbae6a0d8ebc8f19312098c7d32": {"t": 1785761041.9055614, "n": 109936, "h": "770fd7a0fe63c2f6", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\nmod verify;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\npub use verify::{verify_key, VerifyKeyResult, VerifyProtocol};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, normalize_provider_common_config_for_storage,\n provider_exists_in_live_config, strip_common_config_from_live_settings,\n sync_current_provider_for_app_to_live, write_live_with_common_config,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let stored_provider = db\n .get_provider_by_id(\"p1\", \"claude\")\n .expect(\"get stored provider\")\n .expect(\"stored provider exists\");\n let expected_backup =\n serde_json::to_string(&stored_provider.settings_config).expect(\"serialize\");\n assert_eq!(backup.original_config, expected_backup);\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(\"PROXY_MANAGED\"),\n \"takeover placeholder should stay intact\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Migrate plaintext API keys to OS keychain before persisting to DB.\n // DB only stores keychain://ref/ placeholders; the real secrets live in\n // the platform keychain (Windows Credential Manager / macOS Keychain /\n // libsecret). See `provider_keychain` module docs for details.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n // Migrate plaintext API keys to OS keychain before any save_provider call\n // below. Covers the OMO, additive-mode, and normal update paths uniformly.\n // (The provider_id_changed branch does its own migrate after computing the\n // new id, so it skips this one — see below.)\n if !provider_id_changed {\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n }\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n // Migrate plaintext keys for the new provider id before saving.\n crate::provider_keychain::migrate_provider_settings_to_keychain(\n &mut provider,\n &app_type,\n )?;\n state.db.save_provider(app_type.as_str(), &provider)?;\n // Clean up keychain entries tied to the old id.\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = existing.as_ref() {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n // Clean up keychain entries before deleting from DB.\n if let Some(existing_provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n crate::provider_keychain::delete_provider_keys_from_keychain(\n &existing_provider,\n &app_type,\n )?;\n }\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Block switching to official providers when proxy takeover is active.\n // Using a proxy with official APIs (Anthropic/OpenAI/Google) may cause account bans.\n if should_hot_switch && _provider.category.as_deref() == Some(\"official\") {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n #[allow(dead_code)]\n fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}, "4523364fd77746ea51f75a5c0b355c2c898d71c9": {"t": 1785761043.7818255, "n": 107468, "h": "1a3698dd42065b2f", "c": "//! Provider service module\n//!\n//! Handles provider CRUD operations, switching, and configuration management.\n\nmod endpoints;\nmod gemini_auth;\nmod live;\nmod usage;\n\nuse indexmap::IndexMap;\nuse regex::Regex;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::app_config::AppType;\nuse crate::database::{validate_cost_multiplier, validate_pricing_source};\nuse crate::error::AppError;\nuse crate::provider::{Provider, UsageResult};\nuse crate::services::mcp::McpService;\nuse crate::settings::CustomEndpoint;\nuse crate::store::AppState;\n\n// Re-export sub-module functions for external access\npub use live::{\n import_default_config, import_hermes_providers_from_live, import_openclaw_providers_from_live,\n import_opencode_providers_from_live, read_live_settings,\n should_import_default_config_on_startup, sync_current_to_live,\n};\n\n// Internal re-exports (pub(crate))\npub(crate) use live::sanitize_claude_settings_for_live;\npub(crate) use live::{\n build_effective_settings_with_common_config, normalize_provider_common_config_for_storage,\n provider_exists_in_live_config, strip_common_config_from_live_settings,\n sync_current_provider_for_app_to_live, write_live_with_common_config,\n};\n\n// Internal re-exports\nuse live::{\n remove_hermes_provider_from_live, remove_openclaw_provider_from_live,\n remove_opencode_provider_from_live, write_gemini_live,\n};\nuse usage::validate_usage_script;\n\n/// Provider business logic service\npub struct ProviderService;\n\n/// Result of a provider switch operation, including any non-fatal warnings\n#[derive(Debug, serde::Serialize, Default)]\n#[serde(rename_all = \"camelCase\")]\npub struct SwitchResult {\n pub warnings: Vec<String>,\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::claude_desktop_config::PROFILE_ID;\n use crate::config::{get_claude_settings_path, read_json_file, write_json_file};\n use crate::database::Database;\n use crate::provider::ProviderMeta;\n #[cfg(any(target_os = \"macos\", windows))]\n use crate::provider::{ClaudeDesktopMode, ClaudeDesktopModelRoute};\n use crate::proxy::types::ProxyConfig;\n use crate::store::AppState;\n use serde_json::json;\n use serial_test::serial;\n use std::env;\n use std::fs;\n use std::path::{Path, PathBuf};\n use std::sync::{Arc, Mutex, OnceLock};\n use tempfile::TempDir;\n\n struct TempHome {\n #[allow(dead_code)]\n dir: TempDir,\n original_home: Option<String>,\n #[cfg(windows)]\n original_local_app_data: Option<String>,\n original_userprofile: Option<String>,\n original_test_home: Option<String>,\n }\n\n impl TempHome {\n fn new() -> Self {\n let dir = TempDir::new().expect(\"failed to create temp home\");\n let original_home = env::var(\"HOME\").ok();\n #[cfg(windows)]\n let original_local_app_data = env::var(\"LOCALAPPDATA\").ok();\n let original_userprofile = env::var(\"USERPROFILE\").ok();\n let original_test_home = env::var(\"OPEN_SUNSTAR_TEST_HOME\").ok();\n\n env::set_var(\"HOME\", dir.path());\n #[cfg(windows)]\n env::set_var(\"LOCALAPPDATA\", dir.path().join(\"AppData\").join(\"Local\"));\n env::set_var(\"USERPROFILE\", dir.path());\n env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", dir.path());\n\n Self {\n dir,\n original_home,\n #[cfg(windows)]\n original_local_app_data,\n original_userprofile,\n original_test_home,\n }\n }\n }\n\n impl Drop for TempHome {\n fn drop(&mut self) {\n match &self.original_home {\n Some(value) => env::set_var(\"HOME\", value),\n None => env::remove_var(\"HOME\"),\n }\n\n #[cfg(windows)]\n {\n match &self.original_local_app_data {\n Some(value) => env::set_var(\"LOCALAPPDATA\", value),\n None => env::remove_var(\"LOCALAPPDATA\"),\n }\n }\n\n match &self.original_userprofile {\n Some(value) => env::set_var(\"USERPROFILE\", value),\n None => env::remove_var(\"USERPROFILE\"),\n }\n\n match &self.original_test_home {\n Some(value) => env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n }\n }\n\n #[cfg(windows)]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"AppData\")\n .join(\"Local\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n #[cfg(target_os = \"macos\")]\n fn claude_desktop_profile_path(home: &Path) -> PathBuf {\n home.join(\"Library\")\n .join(\"Application Support\")\n .join(\"Claude-3p\")\n .join(\"configLibrary\")\n .join(format!(\"{PROFILE_ID}.json\"))\n }\n\n fn test_guard() -> std::sync::MutexGuard<'static, ()> {\n static LOCK: OnceLock<Mutex<()>> = OnceLock::new();\n LOCK.get_or_init(|| Mutex::new(()))\n .lock()\n .unwrap_or_else(|err| err.into_inner())\n }\n\n fn with_test_home<T>(test: impl FnOnce(&AppState, &Path) -> T) -> T {\n let _guard = test_guard();\n let temp = tempfile::tempdir().expect(\"tempdir\");\n let old_test_home = std::env::var_os(\"OPEN_SUNSTAR_TEST_HOME\");\n let old_home = std::env::var_os(\"HOME\");\n std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", temp.path());\n std::env::set_var(\"HOME\", temp.path());\n\n let db = Arc::new(Database::memory().expect(\"in-memory database\"));\n let state = AppState::new(db);\n let result = test(&state, temp.path());\n\n match old_test_home {\n Some(value) => std::env::set_var(\"OPEN_SUNSTAR_TEST_HOME\", value),\n None => std::env::remove_var(\"OPEN_SUNSTAR_TEST_HOME\"),\n }\n match old_home {\n Some(value) => std::env::set_var(\"HOME\", value),\n None => std::env::remove_var(\"HOME\"),\n }\n\n result\n }\n\n fn openclaw_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"baseUrl\": \"https://api.deepseek.com\",\n \"apiKey\": \"test-key\",\n \"api\": \"openai-completions\",\n \"models\": [],\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_provider(id: &str) -> Provider {\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"name\": format!(\"Provider {id}\"),\n \"options\": {\n \"baseURL\": \"https://api.example.com/v1\",\n \"apiKey\": \"test-key\"\n },\n \"models\": {\n \"gpt-4o\": {\n \"name\": \"GPT-4o\"\n }\n }\n }),\n website_url: None,\n category: Some(\"custom\".to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn opencode_omo_provider(id: &str, category: &str) -> Provider {\n let mut settings = serde_json::Map::new();\n settings.insert(\n \"agents\".to_string(),\n json!({\n \"writer\": {\n \"model\": \"gpt-4o-mini\"\n }\n }),\n );\n if category == \"omo\" {\n settings.insert(\n \"categories\".to_string(),\n json!({\n \"default\": [\"writer\"]\n }),\n );\n }\n settings.insert(\n \"otherFields\".to_string(),\n json!({\n \"theme\": \"dark\"\n }),\n );\n\n Provider {\n id: id.to_string(),\n name: format!(\"Provider {id}\"),\n settings_config: Value::Object(settings),\n website_url: None,\n category: Some(category.to_string()),\n created_at: Some(1),\n sort_index: Some(0),\n notes: None,\n meta: None,\n icon: None,\n icon_color: None,\n in_failover_queue: false,\n }\n }\n\n fn omo_config_path(home: &Path, category: &str) -> PathBuf {\n home.join(\".config\").join(\"opencode\").join(match category {\n \"omo\" => crate::services::omo::STANDARD.preferred_filename,\n \"omo-slim\" => crate::services::omo::SLIM.preferred_filename,\n other => panic!(\"unexpected OMO category in test: {other}\"),\n })\n }\n\n #[test]\n fn validate_provider_settings_rejects_missing_auth() {\n let provider = Provider::with_id(\n \"codex\".into(),\n \"Codex\".into(),\n json!({ \"config\": \"base_url = \\\"https://example.com\\\"\" }),\n None,\n );\n let err = ProviderService::validate_provider_settings(&AppType::Codex, &provider)\n .expect_err(\"missing auth should be rejected\");\n assert!(\n err.to_string().contains(\"auth\"),\n \"expected auth error, got {err:?}\"\n );\n }\n\n #[test]\n fn validate_provider_settings_rejects_negative_cost_multiplier() {\n let mut provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n provider.meta = Some(ProviderMeta {\n cost_multiplier: Some(\"-1\".to_string()),\n ..ProviderMeta::default()\n });\n\n let err = ProviderService::validate_provider_settings(&AppType::Claude, &provider)\n .expect_err(\"negative multiplier should be rejected\");\n assert!(matches!(\n err,\n AppError::Localized {\n key: \"error.invalidMultiplier\",\n ..\n }\n ));\n }\n\n #[test]\n fn extract_credentials_returns_expected_values() {\n let provider = Provider::with_id(\n \"claude\".into(),\n \"Claude\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token\",\n \"ANTHROPIC_BASE_URL\": \"https://claude.example\"\n }\n }),\n None,\n );\n let (api_key, base_url) =\n ProviderService::extract_credentials(&provider, &AppType::Claude).unwrap();\n assert_eq!(api_key, \"token\");\n assert_eq!(base_url, \"https://claude.example\");\n }\n\n #[test]\n fn extract_codex_common_config_preserves_mcp_servers_base_url() {\n let config_toml = r#\"model_provider = \"azure\"\nmodel = \"gpt-4\"\ndisable_response_storage = true\n\n[model_providers.azure]\nname = \"Azure OpenAI\"\nbase_url = \"https://azure.example/v1\"\nwire_api = \"responses\"\n\n[mcp_servers.my_server]\nbase_url = \"http://localhost:8080\"\n\"#;\n\n let settings = json!({ \"config\": config_toml });\n let extracted = ProviderService::extract_codex_common_config(&settings)\n .expect(\"extract_codex_common_config should succeed\");\n\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model_provider\")),\n \"should remove top-level model_provider\"\n );\n assert!(\n !extracted\n .lines()\n .any(|line| line.trim_start().starts_with(\"model =\")),\n \"should remove top-level model\"\n );\n assert!(\n !extracted.contains(\"[model_providers\"),\n \"should remove entire model_providers table\"\n );\n assert!(\n extracted.contains(\"http://localhost:8080\"),\n \"should keep mcp_servers.* base_url\"\n );\n }\n\n #[tokio::test]\n #[serial]\n async fn update_current_claude_provider_syncs_live_when_proxy_takeover_detected_without_backup()\n {\n let _home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let original = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://api.a.example\",\n \"ANTHROPIC_MODEL\": \"model-a\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n None,\n );\n db.save_provider(\"claude\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::Claude, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n db.update_proxy_config(ProxyConfig {\n live_takeover_active: true,\n ..Default::default()\n })\n .await\n .expect(\"update proxy config\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n write_json_file(\n &get_claude_settings_path(),\n &json!({\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"http://127.0.0.1:15721\",\n \"ANTHROPIC_API_KEY\": \"PROXY_MANAGED\",\n \"ANTHROPIC_MODEL\": \"stale-model\"\n },\n \"permissions\": { \"allow\": [\"Bash\"] }\n }),\n )\n .expect(\"seed taken-over live file\");\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let updated = Provider::with_id(\n \"p1\".into(),\n \"Claude A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_API_KEY\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://api.updated.example\",\n \"ANTHROPIC_MODEL\": \"model-updated\"\n },\n \"permissions\": { \"allow\": [\"Read\"] }\n }),\n None,\n );\n\n ProviderService::update(&state, AppType::Claude, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n let stored_provider = db\n .get_provider_by_id(\"p1\", \"claude\")\n .expect(\"get stored provider\")\n .expect(\"stored provider exists\");\n let expected_backup =\n serde_json::to_string(&stored_provider.settings_config).expect(\"serialize\");\n assert_eq!(backup.original_config, expected_backup);\n\n let live: Value = read_json_file(&get_claude_settings_path()).expect(\"read live\");\n assert_eq!(\n live.get(\"permissions\"),\n updated.settings_config.get(\"permissions\"),\n \"provider edits should propagate into Claude live config during takeover\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str()),\n Some(\"PROXY_MANAGED\"),\n \"takeover placeholder should stay intact\"\n );\n assert_eq!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_BASE_URL\"))\n .and_then(|v| v.as_str()),\n Some(\"http://127.0.0.1:15721\"),\n \"proxy base URL should stay intact\"\n );\n assert!(\n live.get(\"env\")\n .and_then(|env| env.get(\"ANTHROPIC_MODEL\"))\n .is_none(),\n \"model override should be removed in takeover live config\"\n );\n }\n\n #[cfg(any(target_os = \"macos\", windows))]\n #[tokio::test]\n #[serial]\n async fn update_current_claude_desktop_provider_syncs_profile_when_proxy_takeover_is_active() {\n let home = TempHome::new();\n crate::settings::reload_settings().expect(\"reload settings\");\n\n let db = Arc::new(Database::memory().expect(\"init db\"));\n let state = AppState::new(db.clone());\n\n let mut original = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-a\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n original.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash\".into()),\n supports_1m: None,\n },\n )]),\n ..Default::default()\n });\n db.save_provider(\"claude-desktop\", &original)\n .expect(\"save provider\");\n db.set_current_provider(\"claude-desktop\", \"p1\")\n .expect(\"set current provider\");\n crate::settings::set_current_provider(&AppType::ClaudeDesktop, Some(\"p1\"))\n .expect(\"set local current provider\");\n\n // Claude Desktop keeps backup state from takeover startup; this sentinel only\n // marks takeover as active so provider updates rewrite the 3P profile.\n db.save_live_backup(\"claude-desktop\", \"{}\")\n .await\n .expect(\"seed live backup\");\n {\n let mut config = db\n .get_proxy_config_for_app(\"claude-desktop\")\n .await\n .expect(\"get app proxy config\");\n config.enabled = true;\n db.update_proxy_config_for_app(config)\n .await\n .expect(\"update app proxy config\");\n }\n\n state\n .proxy_service\n .start()\n .await\n .expect(\"start proxy service\");\n\n let mut updated = Provider::with_id(\n \"p1\".into(),\n \"Desktop A\".into(),\n json!({\n \"env\": {\n \"ANTHROPIC_AUTH_TOKEN\": \"token-updated\",\n \"ANTHROPIC_BASE_URL\": \"https://opencode.ai/zen/go\"\n }\n }),\n None,\n );\n updated.meta = Some(ProviderMeta {\n api_format: Some(\"openai_chat\".into()),\n claude_desktop_mode: Some(ClaudeDesktopMode::Proxy),\n claude_desktop_model_routes: std::collections::HashMap::from([(\n \"claude-sonnet-4-6\".into(),\n ClaudeDesktopModelRoute {\n model: \"deepseek-v4-flash\".into(),\n label_override: Some(\"DeepSeek V4 Flash Updated\".into()),\n supports_1m: Some(true),\n },\n )]),\n ..Default::default()\n });\n\n ProviderService::update(&state, AppType::ClaudeDesktop, None, updated.clone())\n .expect(\"update current provider\");\n\n let backup = db\n .get_live_backup(\"claude-desktop\")\n .await\n .expect(\"get live backup\")\n .expect(\"backup exists\");\n assert_eq!(\n backup.original_config, \"{}\",\n \"Claude Desktop provider edits should not rewrite takeover backup\"\n );\n\n let profile_path = claude_desktop_profile_path(home.dir.path());\n let profile: Value = read_json_file(&profile_path).expect(\"read desktop profile\");\n assert_eq!(\n profile[\"inferenceGatewayBaseUrl\"],\n json!(\"http://127.0.0.1:15721/claude-desktop\"),\n \"desktop profile should stay pointed at the local gateway during takeover\"\n );\n assert_eq!(profile[\"inferenceGatewayAuthScheme\"], json!(\"bearer\"));\n assert_eq!(\n profile[\"inferenceModels\"],\n json!([{ \"name\": \"claude-sonnet-4-6\", \"labelOverride\": \"DeepSeek V4 Flash Updated\", \"supports1m\": true }]),\n \"provider edits should propagate into the Claude Desktop 3P profile during takeover\"\n );\n }\n\n #[test]\n #[serial]\n fn rename_rejects_missing_original_provider() {\n with_test_home(|state, _| {\n let original = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, original.clone(), false)\n .expect(\"seed db-only provider\");\n\n let mut renamed = original.clone();\n renamed.id = \"deepseek-copy\".to_string();\n\n let err = ProviderService::update(\n state,\n AppType::OpenClaw,\n Some(\"missing-provider\"),\n renamed,\n )\n .expect_err(\"stale originalId should be rejected\");\n\n assert!(\n err.to_string().contains(\"Original provider\"),\n \"expected missing original provider error, got {err:?}\"\n );\n assert!(\n state\n .db\n .get_provider_by_id(\"deepseek-copy\", AppType::OpenClaw.as_str())\n .expect(\"query renamed provider\")\n .is_none(),\n \"rename must not create a new row when originalId is stale\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn db_only_additive_update_survives_live_config_parse_errors() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"deepseek\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only provider\");\n\n let stored = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query stored provider\")\n .expect(\"provider should exist\");\n assert_eq!(\n stored\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(false),\n \"db-only provider should be marked as not live-managed\"\n );\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = stored.clone();\n updated.name = \"DeepSeek Edited\".to_string();\n updated.meta.get_or_insert_with(ProviderMeta::default);\n\n ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect(\"db-only update should ignore live parse errors\");\n\n let saved = state\n .db\n .get_provider_by_id(\"deepseek\", AppType::OpenClaw.as_str())\n .expect(\"query updated provider\")\n .expect(\"updated provider should exist\");\n assert_eq!(saved.name, \"DeepSeek Edited\");\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"db-only-opencode\");\n ProviderService::add(state, AppType::OpenCode, provider.clone(), false)\n .expect(\"seed db-only opencode provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync additive opencode providers\");\n\n let live_providers = crate::opencode_config::get_providers()\n .expect(\"read opencode providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only opencode provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_skips_db_only_openclaw_provider() {\n with_test_home(|state, _| {\n let provider = openclaw_provider(\"db-only-openclaw\");\n ProviderService::add(state, AppType::OpenClaw, provider.clone(), false)\n .expect(\"seed db-only openclaw provider\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync additive openclaw providers\");\n\n let live_providers = crate::openclaw_config::get_providers()\n .expect(\"read openclaw providers after sync\");\n assert!(\n !live_providers.contains_key(&provider.id),\n \"db-only openclaw provider should not be written to live during sync\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_preserves_legacy_live_opencode_provider() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n let mut updated = provider.clone();\n updated.settings_config[\"options\"][\"apiKey\"] = Value::String(\"updated-key\".to_string());\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &updated)\n .expect(\"update legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert_eq!(\n live_providers\n .get(&provider.id)\n .and_then(|config| config.get(\"options\"))\n .and_then(|options| options.get(\"apiKey\")),\n Some(&Value::String(\"updated-key\".to_string())),\n \"legacy provider that already exists in live should still be synced\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_opencode_provider_after_live_reset() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"legacy-opencode-reset\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .expect(\"seed legacy opencode provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenCode)\n .expect(\"sync legacy opencode provider after reset\");\n\n let live_providers =\n crate::opencode_config::get_providers().expect(\"read opencode providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy opencode provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn sync_current_provider_for_app_restores_legacy_openclaw_provider_after_live_reset() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"legacy-openclaw-reset\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy openclaw provider in db\");\n\n ProviderService::sync_current_provider_for_app(state, AppType::OpenClaw)\n .expect(\"sync legacy openclaw provider after reset\");\n\n let live_providers =\n crate::openclaw_config::get_providers().expect(\"read openclaw providers\");\n assert!(\n live_providers.contains_key(&provider.id),\n \"legacy openclaw provider should be restored when live config is reset\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_opencode_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let provider = opencode_provider(\"imported-opencode\");\n crate::opencode_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed opencode live provider\");\n\n let imported = import_opencode_providers_from_live(state)\n .expect(\"import opencode providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .expect(\"query imported opencode provider\")\n .expect(\"imported opencode provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn import_openclaw_providers_from_live_marks_provider_as_live_managed() {\n with_test_home(|state, _| {\n let mut provider = openclaw_provider(\"imported-openclaw\");\n provider.settings_config[\"models\"] = json!([\n {\n \"id\": \"claude-sonnet-4\",\n \"name\": \"Claude Sonnet 4\"\n }\n ]);\n crate::openclaw_config::set_provider(&provider.id, provider.settings_config.clone())\n .expect(\"seed openclaw live provider\");\n\n let imported = import_openclaw_providers_from_live(state)\n .expect(\"import openclaw providers from live\");\n assert_eq!(imported, 1);\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenClaw.as_str())\n .expect(\"query imported openclaw provider\")\n .expect(\"imported openclaw provider should exist\");\n assert_eq!(\n saved\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed),\n Some(true),\n \"providers imported from live should be treated as live-managed\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn legacy_additive_provider_still_errors_on_live_config_parse_failure() {\n with_test_home(|state, home| {\n let provider = openclaw_provider(\"legacy-provider\");\n state\n .db\n .save_provider(AppType::OpenClaw.as_str(), &provider)\n .expect(\"seed legacy provider without live_config_managed marker\");\n\n let openclaw_dir = home.join(\".openclaw\");\n fs::create_dir_all(&openclaw_dir).expect(\"create openclaw dir\");\n fs::write(openclaw_dir.join(\"openclaw.json\"), \"{ invalid json5\")\n .expect(\"write malformed config\");\n\n let mut updated = provider.clone();\n updated.name = \"Legacy Edited\".to_string();\n\n let err = ProviderService::update(state, AppType::OpenClaw, None, updated)\n .expect_err(\"legacy providers should still surface live parse errors\");\n assert!(\n err.to_string().contains(\"Failed to parse OpenClaw config\"),\n \"expected parse error, got {err:?}\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_persists_non_current_omo_variants_in_database() {\n with_test_home(|state, _| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-provider\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Updated {category}\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-next-model\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query updated {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"{category} provider should exist\"));\n\n assert_eq!(saved.name, format!(\"Updated {category}\"));\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-next-model\")),\n \"{category} updates should persist in the database\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rewrites_config_from_saved_provider() {\n with_test_home(|state, home| {\n for category in [\"omo\", \"omo-slim\"] {\n let provider = opencode_omo_provider(&format!(\"{category}-current\"), category);\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current {category} provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, category)\n .unwrap_or_else(|err| panic!(\"set current {category} provider: {err}\"));\n\n let mut updated = provider.clone();\n updated.name = format!(\"Current {category} updated\");\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(format!(\"{category}-saved-model\"));\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(format!(\"{category}-light\"));\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .unwrap_or_else(|err| panic!(\"update current {category} provider: {err}\"));\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current {category} provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current {category} provider should exist\"));\n assert_eq!(saved.name, format!(\"Current {category} updated\"));\n\n let written = fs::read_to_string(omo_config_path(home, category))\n .unwrap_or_else(|err| panic!(\"read written {category} config: {err}\"));\n let written_json: Value = serde_json::from_str(&written)\n .unwrap_or_else(|err| panic!(\"parse written {category} config: {err}\"));\n\n assert_eq!(\n written_json[\"agents\"][\"writer\"][\"model\"],\n Value::String(format!(\"{category}-saved-model\")),\n \"{category} config should be written from the saved provider state\"\n );\n assert_eq!(\n written_json[\"theme\"],\n Value::String(format!(\"{category}-light\")),\n \"{category} top-level config should reflect updated otherFields\"\n );\n }\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_does_not_persist_database_when_file_write_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_dir = home.join(\".config\").join(\"opencode\");\n fs::create_dir_all(config_dir.parent().expect(\"config dir parent\"))\n .expect(\"create .config dir\");\n fs::write(&config_dir, \"not a directory\").expect(\"block opencode config dir\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when current omo file write fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when file write fails\"\n );\n });\n }\n\n #[test]\n #[serial]\n fn update_current_omo_variant_rolls_back_file_when_plugin_sync_fails() {\n with_test_home(|state, home| {\n let provider = opencode_omo_provider(\"omo-current\", \"omo\");\n state\n .db\n .save_provider(AppType::OpenCode.as_str(), &provider)\n .unwrap_or_else(|err| panic!(\"seed current omo provider: {err}\"));\n state\n .db\n .set_omo_provider_current(AppType::OpenCode.as_str(), &provider.id, \"omo\")\n .unwrap_or_else(|err| panic!(\"set current omo provider: {err}\"));\n\n let config_path = omo_config_path(home, \"omo\");\n fs::create_dir_all(config_path.parent().expect(\"omo config parent\"))\n .expect(\"create omo config dir\");\n let previous_content = serde_json::to_string_pretty(&json!({\n \"theme\": \"legacy-live-theme\",\n \"agents\": {\n \"writer\": {\n \"model\": \"legacy-live-model\"\n }\n },\n \"categories\": {\n \"default\": [\"writer\"]\n }\n }))\n .expect(\"serialize previous config\");\n fs::write(&config_path, &previous_content).expect(\"seed previous omo config\");\n\n let opencode_config_path = home.join(\".config\").join(\"opencode\").join(\"opencode.json\");\n fs::write(&opencode_config_path, \"{ invalid json\").expect(\"seed malformed opencode\");\n\n let mut updated = provider.clone();\n updated.name = \"Current omo updated\".to_string();\n updated.settings_config[\"agents\"][\"writer\"][\"model\"] =\n Value::String(\"omo-saved-model\".to_string());\n updated.settings_config[\"otherFields\"][\"theme\"] =\n Value::String(\"omo-light\".to_string());\n\n ProviderService::update(state, AppType::OpenCode, None, updated)\n .expect_err(\"update should fail when plugin sync fails\");\n\n let saved = state\n .db\n .get_provider_by_id(&provider.id, AppType::OpenCode.as_str())\n .unwrap_or_else(|err| panic!(\"query current omo provider: {err}\"))\n .unwrap_or_else(|| panic!(\"current omo provider should exist\"));\n\n assert_eq!(saved.name, provider.name);\n assert_eq!(\n saved.settings_config[\"agents\"][\"writer\"][\"model\"],\n provider.settings_config[\"agents\"][\"writer\"][\"model\"],\n \"database should remain unchanged when plugin sync fails\"\n );\n\n let written =\n fs::read_to_string(&config_path).expect(\"read rolled back omo config content\");\n assert_eq!(\n written, previous_content,\n \"OMO config should roll back to its previous on-disk contents\"\n );\n });\n }\n}\n\nimpl ProviderService {\n fn normalize_provider_if_claude(app_type: &AppType, provider: &mut Provider) {\n if matches!(app_type, AppType::Claude) {\n let mut v = provider.settings_config.clone();\n if normalize_claude_models_in_value(&mut v) {\n provider.settings_config = v;\n }\n }\n }\n\n /// Check whether a provider exists in live config, tolerating parse errors\n /// only for providers that are explicitly marked as DB-only.\n fn check_live_config_exists(\n app_type: &AppType,\n provider_id: &str,\n live_config_managed: Option<bool>,\n ) -> Result<bool, AppError> {\n if live_config_managed == Some(false) {\n Ok(provider_exists_in_live_config(app_type, provider_id).unwrap_or(false))\n } else {\n provider_exists_in_live_config(app_type, provider_id)\n }\n }\n\n fn provider_live_config_managed(provider: &Provider) -> Option<bool> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.live_config_managed)\n }\n\n fn set_provider_live_config_managed(provider: &mut Provider, managed: bool) {\n provider\n .meta\n .get_or_insert_with(Default::default)\n .live_config_managed = Some(managed);\n }\n\n /// List all providers for an app type\n pub fn list(\n state: &AppState,\n app_type: AppType,\n ) -> Result<IndexMap<String, Provider>, AppError> {\n state.db.get_all_providers(app_type.as_str())\n }\n\n /// Get current provider ID\n ///\n /// 使用有效的当前供应商 ID(验证过存在性)。\n /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。\n /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。\n ///\n /// 对于累加模式应用(OpenCode, OpenClaw),不存在\"当前供应商\"概念,直接返回空字符串。\n pub fn current(state: &AppState, app_type: AppType) -> Result<String, AppError> {\n // Additive mode apps have no \"current\" provider concept\n if app_type.is_additive_mode() {\n return Ok(String::new());\n }\n crate::settings::get_effective_current_provider(&state.db, &app_type)\n .map(|opt| opt.unwrap_or_default())\n }\n\n /// Add a new provider\n pub fn add(\n state: &AppState,\n app_type: AppType,\n provider: Provider,\n add_to_live: bool,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n if app_type.is_additive_mode() {\n Self::set_provider_live_config_managed(&mut provider, add_to_live);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // Additive mode apps (OpenCode, OpenClaw): optionally write to live config.\n if app_type.is_additive_mode() {\n // OMO / OMO Slim providers use exclusive mode and write to dedicated config file.\n if matches!(app_type, AppType::OpenCode)\n && matches!(provider.category.as_deref(), Some(\"omo\") | Some(\"omo-slim\"))\n {\n // Do not auto-enable newly added OMO / OMO Slim providers.\n // Users must explicitly switch/apply an OMO provider to activate it.\n return Ok(true);\n }\n if !add_to_live {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // For other apps: Check if sync is needed (if this is current provider, or no current provider)\n let current = state.db.get_current_provider(app_type.as_str())?;\n if current.is_none() {\n // No current provider, set as current and sync\n state\n .db\n .set_current_provider(app_type.as_str(), &provider.id)?;\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n }\n\n Ok(true)\n }\n\n /// Update a provider\n pub fn update(\n state: &AppState,\n app_type: AppType,\n original_id: Option<&str>,\n provider: Provider,\n ) -> Result<bool, AppError> {\n let mut provider = provider;\n let original_id = original_id.unwrap_or(provider.id.as_str()).to_string();\n let provider_id_changed = original_id != provider.id;\n let existing_provider = state\n .db\n .get_provider_by_id(&original_id, app_type.as_str())?;\n // Normalize Claude model keys\n Self::normalize_provider_if_claude(&app_type, &mut provider);\n Self::validate_provider_settings(&app_type, &provider)?;\n normalize_provider_common_config_for_storage(state.db.as_ref(), &app_type, &mut provider)?;\n\n if provider_id_changed {\n if !app_type.is_additive_mode() {\n return Err(AppError::Message(\n \"Only additive-mode providers support changing provider key\".to_string(),\n ));\n }\n\n let Some(existing_provider) = existing_provider else {\n return Err(AppError::Message(format!(\n \"Original provider '{}' does not exist in app '{}'\",\n original_id,\n app_type.as_str()\n )));\n };\n\n // OMO / OMO Slim providers are activated via a dedicated current-state mechanism\n // (set_omo_provider_current) that is NOT captured by provider_exists_in_live_config,\n // which only checks opencode.json. A rename would orphan that current-state marker\n // and silently break subsequent OMO file syncs. Block it unconditionally.\n if matches!(app_type, AppType::OpenCode)\n && matches!(\n existing_provider.category.as_deref(),\n Some(\"omo\") | Some(\"omo-slim\")\n )\n {\n return Err(AppError::Message(\n \"Provider key cannot be changed for OMO/OMO Slim providers\".to_string(),\n ));\n }\n\n let original_in_live = Self::check_live_config_exists(\n &app_type,\n &original_id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if original_in_live {\n return Err(AppError::Message(\n \"Provider key cannot be changed after the provider has been added to the app config\"\n .to_string(),\n ));\n }\n\n let next_id_in_live = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&existing_provider),\n )?;\n if state\n .db\n .get_provider_by_id(&provider.id, app_type.as_str())?\n .is_some()\n || next_id_in_live\n {\n return Err(AppError::Message(format!(\n \"Provider '{}' already exists in app '{}'\",\n provider.id,\n app_type.as_str()\n )));\n }\n\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n state.db.delete_provider(app_type.as_str(), &original_id)?;\n\n if crate::settings::get_current_provider(&app_type).as_deref() == Some(&original_id) {\n crate::settings::set_current_provider(&app_type, Some(provider.id.as_str()))?;\n }\n\n return Ok(true);\n }\n\n // Additive mode apps (OpenCode, OpenClaw): only sync to live when the provider\n // already exists in live config. Editing a DB-only provider must not auto-add it.\n if app_type.is_additive_mode() {\n let omo_variant = if matches!(app_type, AppType::OpenCode) {\n match provider.category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n }\n } else {\n None\n };\n if let Some(variant) = omo_variant {\n let is_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n &provider.id,\n variant.category,\n )?;\n if is_current {\n crate::services::OmoService::write_provider_config_to_file(&provider, variant)?;\n }\n if let Err(err) = state.db.save_provider(app_type.as_str(), &provider) {\n if is_current {\n if let Err(rollback_err) =\n crate::services::OmoService::write_config_to_file(state, variant)\n {\n log::warn!(\n \"Failed to roll back {} config after DB save error: {}\",\n variant.label,\n rollback_err\n );\n }\n }\n return Err(err);\n }\n return Ok(true);\n }\n let live_config_managed = Self::check_live_config_exists(\n &app_type,\n &provider.id,\n Self::provider_live_config_managed(&provider).or_else(|| {\n existing_provider\n .as_ref()\n .and_then(Self::provider_live_config_managed)\n }),\n )?;\n Self::set_provider_live_config_managed(&mut provider, live_config_managed);\n\n // Save to database after live-config presence is resolved so parse errors\n // do not report failure after already mutating DB state.\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n if !live_config_managed {\n return Ok(true);\n }\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n return Ok(true);\n }\n\n // Save to database\n state.db.save_provider(app_type.as_str(), &provider)?;\n\n // For other apps: Check if this is current provider (use effective current, not just DB)\n let effective_current =\n crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n let is_current = effective_current.as_deref() == Some(provider.id.as_str());\n\n if is_current {\n // 如果 Claude 代理接管处于激活状态,并且代理服务正在运行:\n // - 不直接走普通 Live 写入逻辑\n // - 改为更新 Live 备份,并在 Claude 下同步代理安全的 Live 配置\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n // Backup or live placeholders mean the live file is currently owned\n // by proxy takeover, including the short activation window before\n // proxy_config.enabled is committed.\n let should_sync_via_proxy = has_live_backup || live_taken_over;\n\n if should_sync_via_proxy {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n } else {\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), &provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n }\n\n if matches!(app_type, AppType::Claude)\n && futures::executor::block_on(state.proxy_service.is_running())\n {\n futures::executor::block_on(\n state\n .proxy_service\n .sync_claude_live_from_provider_while_proxy_active(&provider),\n )\n .map_err(|e| AppError::Message(format!(\"同步 Claude Live 配置失败: {e}\")))?;\n }\n } else {\n write_live_with_common_config(state.db.as_ref(), &app_type, &provider)?;\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n }\n }\n\n Ok(true)\n }\n\n /// Delete a provider\n ///\n /// 同时检查本地 settings 和数据库的当前供应商,防止删除任一端正在使用的供应商。\n /// 对于累加模式应用(OpenCode, OpenClaw),可以随时删除任意供应商,同时从 live 配置中移除。\n pub fn delete(state: &AppState, app_type: AppType, id: &str) -> Result<(), AppError> {\n // Additive mode apps - no current provider concept\n if app_type.is_additive_mode() {\n // Single DB read shared across all additive-mode sub-paths below.\n let existing = state.db.get_provider_by_id(id, app_type.as_str())?;\n\n if matches!(app_type, AppType::OpenCode) {\n let provider_category = existing.as_ref().and_then(|p| p.category.clone());\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n let was_current = state.db.is_omo_provider_current(\n app_type.as_str(),\n id,\n variant.category,\n )?;\n state.db.delete_provider(app_type.as_str(), id)?;\n if was_current {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n return Ok(());\n }\n }\n\n // Non-OMO path for both OpenCode and OpenClaw:\n // remove from live first (atomicity), then DB.\n //\n // Use check_live_config_exists rather than trusting the flag alone: the flag\n // can be stale (Some(false) for a provider that was written to live before the\n // live_config_managed flip was introduced). check_live_config_exists reads the\n // actual file when the flag is Some(false), so it handles historical data correctly.\n let live_managed = existing\n .as_ref()\n .and_then(Self::provider_live_config_managed);\n if Self::check_live_config_exists(&app_type, id, live_managed)? {\n match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(id)?,\n AppType::OpenClaw => remove_openclaw_provider_from_live(id)?,\n AppType::Hermes => remove_hermes_provider_from_live(id)?,\n _ => {}\n }\n }\n state.db.delete_provider(app_type.as_str(), id)?;\n return Ok(());\n }\n\n // For other apps: Check both local settings and database\n let local_current = crate::settings::get_current_provider(&app_type);\n let db_current = state.db.get_current_provider(app_type.as_str())?;\n\n if local_current.as_deref() == Some(id) || db_current.as_deref() == Some(id) {\n return Err(AppError::Message(\n \"无法删除当前正在使用的供应商\".to_string(),\n ));\n }\n\n state.db.delete_provider(app_type.as_str(), id)\n }\n\n /// Remove provider from live config only (for additive mode apps like OpenCode, OpenClaw)\n ///\n /// Does NOT delete from database - provider remains in the list.\n /// This is used when user wants to \"remove\" a provider from active config\n /// but keep it available for future use.\n pub fn remove_from_live_config(\n state: &AppState,\n app_type: AppType,\n id: &str,\n ) -> Result<(), AppError> {\n match app_type {\n AppType::OpenCode => {\n let provider_category = state\n .db\n .get_provider_by_id(id, app_type.as_str())?\n .and_then(|p| p.category);\n\n let omo_variant = match provider_category.as_deref() {\n Some(\"omo\") => Some(&crate::services::omo::STANDARD),\n Some(\"omo-slim\") => Some(&crate::services::omo::SLIM),\n _ => None,\n };\n if let Some(variant) = omo_variant {\n state\n .db\n .clear_omo_provider_current(app_type.as_str(), id, variant.category)?;\n let still_has_current = state\n .db\n .get_current_omo_provider(\"opencode\", variant.category)?\n .is_some();\n if still_has_current {\n crate::services::OmoService::write_config_to_file(state, variant)?;\n } else {\n crate::services::OmoService::delete_config_file(variant)?;\n }\n } else {\n remove_opencode_provider_from_live(id)?;\n }\n }\n AppType::OpenClaw => {\n remove_openclaw_provider_from_live(id)?;\n }\n AppType::Hermes => {\n remove_hermes_provider_from_live(id)?;\n }\n _ => {\n return Err(AppError::Message(format!(\n \"App {} does not support remove from live config\",\n app_type.as_str()\n )));\n }\n }\n\n if let Some(mut provider) = state.db.get_provider_by_id(id, app_type.as_str())? {\n Self::set_provider_live_config_managed(&mut provider, false);\n state.db.save_provider(app_type.as_str(), &provider)?;\n }\n\n Ok(())\n }\n\n /// Switch to a provider\n ///\n /// Switch flow:\n /// 1. Validate target provider exists\n /// 2. Check if proxy takeover mode is active AND proxy server is running\n /// 3. If takeover mode active: hot-switch proxy target and refresh proxy-safe Live labels\n /// 4. If normal mode:\n /// a. **Backfill mechanism**: Backfill current live config to current provider\n /// b. Update local settings current_provider_xxx (device-level)\n /// c. Update database is_current (as default for new devices)\n /// d. Write target provider config to live files\n /// e. Sync MCP configuration\n pub fn switch(state: &AppState, app_type: AppType, id: &str) -> Result<SwitchResult, AppError> {\n // Check if provider exists\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let _provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode) && _provider.category.as_deref() == Some(\"omo\") {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // OMO Slim providers are switched through their own exclusive path.\n if matches!(app_type, AppType::OpenCode)\n && _provider.category.as_deref() == Some(\"omo-slim\")\n {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n if matches!(app_type, AppType::ClaudeDesktop) {\n return Self::switch_normal(state, app_type, id, &providers);\n }\n\n // Provider switches and takeover toggles both mutate live config and the\n // restore backup. Serialize them per app, then decide from the locked\n // current state so a just-started takeover cannot be overwritten by a\n // normal live write.\n let _switch_guard =\n if matches!(app_type, AppType::Claude | AppType::Codex | AppType::Gemini) {\n Some(futures::executor::block_on(\n state.proxy_service.lock_switch_for_app(app_type.as_str()),\n ))\n } else {\n None\n };\n\n // Backup or live placeholders mean the live file is owned by proxy\n // takeover, even if the proxy server is temporarily stopped or is in the\n // activation window before enabled=true is committed.\n let is_app_taken_over =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n let should_hot_switch = is_app_taken_over || live_taken_over;\n\n // Block switching to official providers when proxy takeover is active.\n // Using a proxy with official APIs (Anthropic/OpenAI/Google) may cause account bans.\n if should_hot_switch && _provider.category.as_deref() == Some(\"official\") {\n return Err(AppError::localized(\n \"switch.official_blocked_by_proxy\",\n \"代理接管模式下不能切换到官方供应商,使用代理访问官方 API 可能导致账号被封禁。请先关闭代理接管,或选择第三方供应商。\",\n \"Cannot switch to official provider while proxy takeover is active. Using proxy with official APIs may cause account bans.\",\n ));\n }\n\n if should_hot_switch {\n // Proxy takeover mode: hot-switch without restoring upstream Live config.\n // The proxy layer may still refresh proxy-safe Live fields so client labels\n // follow the selected provider while endpoints remain local.\n log::info!(\n \"代理接管模式:热切换 {} 的目标供应商为 {}\",\n app_type.as_str(),\n id\n );\n\n futures::executor::block_on(\n state\n .proxy_service\n .hot_switch_provider_inner(app_type.as_str(), id),\n )\n .map_err(|e| AppError::Message(format!(\"热切换失败: {e}\")))?;\n\n // The proxy server will route requests to the new provider via is_current.\n // MCP sync is intentionally skipped while Live config is owned by takeover.\n return Ok(SwitchResult::default());\n }\n\n // Normal mode: full switch with Live config write\n Self::switch_normal(state, app_type, id, &providers)\n }\n\n /// Normal switch flow (non-proxy mode)\n fn switch_normal(\n state: &AppState,\n app_type: AppType,\n id: &str,\n providers: &indexmap::IndexMap<String, Provider>,\n ) -> Result<SwitchResult, AppError> {\n let provider = providers\n .get(id)\n .ok_or_else(|| AppError::Message(format!(\"供应商 {id} 不存在\")))?;\n\n // OMO ↔ OMO Slim are mutually exclusive; activating one removes the other's config file.\n if matches!(app_type, AppType::OpenCode) {\n let omo_pair = match provider.category.as_deref() {\n Some(\"omo\") => Some((&crate::services::omo::STANDARD, &crate::services::omo::SLIM)),\n Some(\"omo-slim\") => {\n Some((&crate::services::omo::SLIM, &crate::services::omo::STANDARD))\n }\n _ => None,\n };\n if let Some((enable, disable)) = omo_pair {\n state\n .db\n .set_omo_provider_current(app_type.as_str(), id, enable.category)?;\n crate::services::OmoService::write_config_to_file(state, enable)?;\n let _ = crate::services::OmoService::delete_config_file(disable);\n return Ok(SwitchResult::default());\n }\n }\n\n let mut result = SwitchResult::default();\n\n // Backfill: Backfill current live config to current provider\n // Use effective current provider (validated existence) to ensure backfill targets valid provider\n let current_id = crate::settings::get_effective_current_provider(&state.db, &app_type)?;\n\n if let Some(current_id) = current_id {\n if current_id != id {\n // Additive mode apps - all providers coexist in the same file,\n // no backfill needed (backfill is for exclusive mode apps like Claude/Codex/Gemini)\n if !app_type.is_additive_mode() {\n // Only backfill when switching to a different provider\n if let Ok(live_config) = read_live_settings(app_type.clone()) {\n if let Some(mut current_provider) = providers.get(&current_id).cloned() {\n current_provider.settings_config =\n strip_common_config_from_live_settings(\n state.db.as_ref(),\n &app_type,\n &current_provider,\n live_config,\n );\n if let Err(e) =\n state.db.save_provider(app_type.as_str(), &current_provider)\n {\n log::warn!(\"Backfill failed: {e}\");\n result\n .warnings\n .push(format!(\"backfill_failed:{current_id}\"));\n }\n }\n }\n }\n }\n }\n\n // Additive mode apps skip setting is_current (no such concept)\n if !app_type.is_additive_mode() {\n // Update local settings (device-level, takes priority)\n crate::settings::set_current_provider(&app_type, Some(id))?;\n\n // Update database is_current (as default for new devices)\n state.db.set_current_provider(app_type.as_str(), id)?;\n }\n\n // Sync to live (write_gemini_live handles security flag internally for Gemini)\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n\n // Hermes is additive, so \"switching\" doesn't overwrite a live config file\n // — we instead update the top-level `model:` section to point at this\n // provider's first declared model. Without this, clicking \"switch\" would\n // only shuffle entries in custom_providers[] while Hermes keeps using\n // whatever `model.provider` was set before.\n if matches!(app_type, AppType::Hermes) {\n if let Err(e) =\n crate::hermes_config::apply_switch_defaults(&provider.id, &provider.settings_config)\n {\n log::warn!(\n \"Failed to update Hermes model defaults after switching to '{}': {e}\",\n provider.id\n );\n result\n .warnings\n .push(format!(\"hermes_model_defaults_failed:{}\", provider.id));\n }\n }\n\n // For additive-mode providers that were DB-only (live_config_managed == Some(false)),\n // flip the flag to true now that the provider has been successfully written to the live\n // file. This ensures sync_all_providers_to_live() will include it on future syncs.\n //\n // If persisting the marker fails, roll back the just-written live config so we don't leave\n // the provider in a silent inconsistent state (present in live, but still marked DB-only).\n if app_type.is_additive_mode() && Self::provider_live_config_managed(provider) != Some(true)\n {\n let mut updated = provider.clone();\n Self::set_provider_live_config_managed(&mut updated, true);\n if let Err(e) = state.db.save_provider(app_type.as_str(), &updated) {\n let rollback_result = match app_type {\n AppType::OpenCode => remove_opencode_provider_from_live(&provider.id),\n AppType::OpenClaw => remove_openclaw_provider_from_live(&provider.id),\n AppType::Hermes => remove_hermes_provider_from_live(&provider.id),\n _ => Ok(()),\n };\n\n match rollback_result {\n Ok(()) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config; live changes were rolled back: {e}\",\n provider.id\n )));\n }\n Err(rollback_err) => {\n return Err(AppError::Message(format!(\n \"Failed to persist live_config_managed for '{}' after writing live config: {e}; additionally failed to roll back live config: {rollback_err}\",\n provider.id\n )));\n }\n }\n }\n }\n\n // Sync MCP\n McpService::sync_all_enabled(state)?;\n\n Ok(result)\n }\n\n /// Sync current provider to live configuration (re-export)\n pub fn sync_current_to_live(state: &AppState) -> Result<(), AppError> {\n sync_current_to_live(state)\n }\n\n pub fn sync_current_provider_for_app(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return sync_current_provider_for_app_to_live(state, &app_type);\n }\n\n let current_id =\n match crate::settings::get_effective_current_provider(&state.db, &app_type)? {\n Some(id) => id,\n None => return Ok(()),\n };\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let Some(provider) = providers.get(&current_id) else {\n return Ok(());\n };\n\n let has_live_backup =\n futures::executor::block_on(state.db.get_live_backup(app_type.as_str()))\n .ok()\n .flatten()\n .is_some();\n\n let live_taken_over = state\n .proxy_service\n .detect_takeover_in_live_config_for_app(&app_type);\n\n // See the save path above: backup/placeholders are the ownership signal\n // here, not just proxy_config.enabled.\n if has_live_backup || live_taken_over {\n if matches!(app_type, AppType::ClaudeDesktop) {\n write_live_with_common_config(state.db.as_ref(), &app_type, provider)?;\n return Ok(());\n }\n\n futures::executor::block_on(\n state\n .proxy_service\n .update_live_backup_from_provider(app_type.as_str(), provider),\n )\n .map_err(|e| AppError::Message(format!(\"更新 Live 备份失败: {e}\")))?;\n return Ok(());\n }\n\n sync_current_provider_for_app_to_live(state, &app_type)\n }\n\n pub fn migrate_legacy_common_config_usage(\n state: &AppState,\n app_type: AppType,\n legacy_snippet: &str,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() || legacy_snippet.trim().is_empty() {\n return Ok(());\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n\n for provider in providers.values() {\n if provider\n .meta\n .as_ref()\n .and_then(|meta| meta.common_config_enabled)\n .is_some()\n {\n continue;\n }\n\n if !live::provider_uses_common_config(&app_type, provider, Some(legacy_snippet)) {\n continue;\n }\n\n let mut updated_provider = provider.clone();\n updated_provider\n .meta\n .get_or_insert_with(Default::default)\n .common_config_enabled = Some(true);\n\n match live::remove_common_config_from_settings(\n &app_type,\n &updated_provider.settings_config,\n legacy_snippet,\n ) {\n Ok(settings) => updated_provider.settings_config = settings,\n Err(err) => {\n log::warn!(\n \"Failed to normalize legacy common config for {} provider '{}': {err}\",\n app_type.as_str(),\n updated_provider.id\n );\n }\n }\n\n state\n .db\n .save_provider(app_type.as_str(), &updated_provider)?;\n }\n\n Ok(())\n }\n\n pub fn migrate_legacy_common_config_usage_if_needed(\n state: &AppState,\n app_type: AppType,\n ) -> Result<(), AppError> {\n if app_type.is_additive_mode() {\n return Ok(());\n }\n\n let Some(snippet) = state.db.get_config_snippet(app_type.as_str())? else {\n return Ok(());\n };\n\n if snippet.trim().is_empty() {\n return Ok(());\n }\n\n Self::migrate_legacy_common_config_usage(state, app_type, &snippet)\n }\n\n /// Extract common config snippet from current provider\n ///\n /// Extracts the current provider's configuration and removes provider-specific fields\n /// (API keys, model settings, endpoints) to create a reusable common config snippet.\n pub fn extract_common_config_snippet(\n state: &AppState,\n app_type: AppType,\n ) -> Result<String, AppError> {\n // Get current provider\n let current_id = Self::current(state, app_type.clone())?;\n if current_id.is_empty() {\n return Err(AppError::Message(\"No current provider\".to_string()));\n }\n\n let providers = state.db.get_all_providers(app_type.as_str())?;\n let provider = providers\n .get(&current_id)\n .ok_or_else(|| AppError::Message(format!(\"Provider {current_id} not found\")))?;\n\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(&provider.settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(&provider.settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(&provider.settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(&provider.settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(&provider.settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config snippet from a config value (e.g. editor content).\n pub fn extract_common_config_snippet_from_settings(\n app_type: AppType,\n settings_config: &Value,\n ) -> Result<String, AppError> {\n match app_type {\n AppType::Claude => Self::extract_claude_common_config(settings_config),\n AppType::ClaudeDesktop => Ok(String::new()),\n AppType::Codex => Self::extract_codex_common_config(settings_config),\n AppType::Gemini => Self::extract_gemini_common_config(settings_config),\n AppType::OpenCode => Self::extract_opencode_common_config(settings_config),\n AppType::OpenClaw => Self::extract_openclaw_common_config(settings_config),\n AppType::Hermes => Ok(String::new()), // Hermes doesn't use common config snippets\n }\n }\n\n /// Extract common config for Claude (JSON format)\n fn extract_claude_common_config(settings: &Value) -> Result<String, AppError> {\n let mut config = settings.clone();\n\n // Fields to exclude from common config\n const ENV_EXCLUDES: &[&str] = &[\n // Auth\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n // Models and Claude Code model-menu display names\n \"ANTHROPIC_MODEL\",\n \"ANTHROPIC_REASONING_MODEL\", // legacy: 已废弃,但旧配置可能残留\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME\",\n // Endpoint\n \"ANTHROPIC_BASE_URL\",\n ];\n\n const TOP_LEVEL_EXCLUDES: &[&str] = &[\n \"apiBaseUrl\",\n // Legacy model fields\n \"primaryModel\",\n \"smallFastModel\",\n ];\n\n // Remove env fields\n if let Some(env) = config.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n for key in ENV_EXCLUDES {\n env.remove(*key);\n }\n // If env is empty after removal, remove the env object itself\n if env.is_empty() {\n config.as_object_mut().map(|obj| obj.remove(\"env\"));\n }\n }\n\n // Remove top-level fields\n if let Some(obj) = config.as_object_mut() {\n for key in TOP_LEVEL_EXCLUDES {\n obj.remove(*key);\n }\n }\n\n // Check if result is empty\n if config.as_object().is_none_or(|obj| obj.is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for Codex (TOML format)\n fn extract_codex_common_config(settings: &Value) -> Result<String, AppError> {\n // Codex config is stored as { \"auth\": {...}, \"config\": \"toml string\" }\n let config_toml = settings\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n if config_toml.is_empty() {\n return Ok(String::new());\n }\n\n let mut doc = config_toml\n .parse::<toml_edit::DocumentMut>()\n .map_err(|e| AppError::Message(format!(\"TOML parse error: {e}\")))?;\n\n // Remove provider-specific fields.\n let root = doc.as_table_mut();\n root.remove(\"model\");\n root.remove(\"model_provider\");\n // Legacy/alt formats might use a top-level base_url.\n root.remove(\"base_url\");\n\n // Remove entire model_providers table (provider-specific configuration)\n root.remove(\"model_providers\");\n\n // Clean up multiple empty lines (keep at most one blank line).\n let mut cleaned = String::new();\n let mut blank_run = 0usize;\n for line in doc.to_string().lines() {\n if line.trim().is_empty() {\n blank_run += 1;\n if blank_run <= 1 {\n cleaned.push('\\n');\n }\n continue;\n }\n blank_run = 0;\n cleaned.push_str(line);\n cleaned.push('\\n');\n }\n\n Ok(cleaned.trim().to_string())\n }\n\n /// Extract common config for Gemini (JSON format)\n ///\n /// Extracts `.env` values while excluding provider-specific credentials:\n /// - GOOGLE_GEMINI_BASE_URL\n /// - GEMINI_API_KEY\n fn extract_gemini_common_config(settings: &Value) -> Result<String, AppError> {\n let env = settings.get(\"env\").and_then(|v| v.as_object());\n\n let mut snippet = serde_json::Map::new();\n if let Some(env) = env {\n for (key, value) in env {\n if key == \"GOOGLE_GEMINI_BASE_URL\" || key == \"GEMINI_API_KEY\" {\n continue;\n }\n let Value::String(v) = value else {\n continue;\n };\n let trimmed = v.trim();\n if !trimmed.is_empty() {\n snippet.insert(key.to_string(), Value::String(trimmed.to_string()));\n }\n }\n }\n\n if snippet.is_empty() {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&Value::Object(snippet))\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenCode (JSON format)\n fn extract_opencode_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenCode uses a different config structure with npm, options, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n if let Some(options) = obj.get_mut(\"options\").and_then(|v| v.as_object_mut()) {\n options.remove(\"apiKey\");\n options.remove(\"baseURL\");\n }\n // Keep npm and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Extract common config for OpenClaw (JSON format)\n fn extract_openclaw_common_config(settings: &Value) -> Result<String, AppError> {\n // OpenClaw uses a different config structure with baseUrl, apiKey, api, models\n // For common config, we exclude provider-specific fields like apiKey\n let mut config = settings.clone();\n\n // Remove provider-specific fields\n if let Some(obj) = config.as_object_mut() {\n obj.remove(\"apiKey\");\n obj.remove(\"baseUrl\");\n // Keep api and models as they might be common\n }\n\n if config.is_null() || (config.is_object() && config.as_object().unwrap().is_empty()) {\n return Ok(\"{}\".to_string());\n }\n\n serde_json::to_string_pretty(&config)\n .map_err(|e| AppError::Message(format!(\"Serialization failed: {e}\")))\n }\n\n /// Import default configuration from live files (re-export)\n ///\n /// Returns `Ok(true)` if imported, `Ok(false)` if skipped.\n pub fn import_default_config(state: &AppState, app_type: AppType) -> Result<bool, AppError> {\n import_default_config(state, app_type)\n }\n\n pub fn should_import_default_config_on_startup(\n state: &AppState,\n app_type: &AppType,\n ) -> Result<bool, AppError> {\n should_import_default_config_on_startup(state, app_type)\n }\n\n /// Read current live settings (re-export)\n pub fn read_live_settings(app_type: AppType) -> Result<Value, AppError> {\n read_live_settings(app_type)\n }\n\n /// Get custom endpoints list (re-export)\n pub fn get_custom_endpoints(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<Vec<CustomEndpoint>, AppError> {\n endpoints::get_custom_endpoints(state, app_type, provider_id)\n }\n\n /// Add custom endpoint (re-export)\n pub fn add_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::add_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Remove custom endpoint (re-export)\n pub fn remove_custom_endpoint(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::remove_custom_endpoint(state, app_type, provider_id, url)\n }\n\n /// Update endpoint last used timestamp (re-export)\n pub fn update_endpoint_last_used(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n url: String,\n ) -> Result<(), AppError> {\n endpoints::update_endpoint_last_used(state, app_type, provider_id, url)\n }\n\n /// Update provider sort order\n pub fn update_sort_order(\n state: &AppState,\n app_type: AppType,\n updates: Vec<ProviderSortUpdate>,\n ) -> Result<bool, AppError> {\n let mut providers = state.db.get_all_providers(app_type.as_str())?;\n\n for update in updates {\n if let Some(provider) = providers.get_mut(&update.id) {\n provider.sort_index = Some(update.sort_index);\n state.db.save_provider(app_type.as_str(), provider)?;\n }\n }\n\n Ok(true)\n }\n\n /// Query provider usage (re-export)\n pub async fn query_usage(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n ) -> Result<UsageResult, AppError> {\n usage::query_usage(state, app_type, provider_id).await\n }\n\n /// Test usage script (re-export)\n #[allow(clippy::too_many_arguments)]\n pub async fn test_usage_script(\n state: &AppState,\n app_type: AppType,\n provider_id: &str,\n script_code: &str,\n timeout: u64,\n api_key: Option<&str>,\n base_url: Option<&str>,\n access_token: Option<&str>,\n user_id: Option<&str>,\n template_type: Option<&str>,\n ) -> Result<UsageResult, AppError> {\n usage::test_usage_script(\n state,\n app_type,\n provider_id,\n script_code,\n timeout,\n api_key,\n base_url,\n access_token,\n user_id,\n template_type,\n )\n .await\n }\n\n pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> {\n write_gemini_live(provider)\n }\n\n fn validate_provider_settings(app_type: &AppType, provider: &Provider) -> Result<(), AppError> {\n match app_type {\n AppType::Claude => {\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.claude.settings.not_object\",\n \"Claude 配置必须是 JSON 对象\",\n \"Claude configuration must be a JSON object\",\n ));\n }\n }\n AppType::ClaudeDesktop => {\n crate::claude_desktop_config::validate_provider(provider)?;\n }\n AppType::Codex => {\n let settings = provider.settings_config.as_object().ok_or_else(|| {\n AppError::localized(\n \"provider.codex.settings.not_object\",\n \"Codex 配置必须是 JSON 对象\",\n \"Codex configuration must be a JSON object\",\n )\n })?;\n\n let auth = settings.get(\"auth\").ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n format!(\"供应商 {} 缺少 auth 配置\", provider.id),\n format!(\"Provider {} is missing auth configuration\", provider.id),\n )\n })?;\n if !auth.is_object() {\n return Err(AppError::localized(\n \"provider.codex.auth.not_object\",\n format!(\"供应商 {} 的 auth 配置必须是 JSON 对象\", provider.id),\n format!(\n \"Provider {} auth configuration must be a JSON object\",\n provider.id\n ),\n ));\n }\n\n if let Some(config_value) = settings.get(\"config\") {\n if !(config_value.is_string() || config_value.is_null()) {\n return Err(AppError::localized(\n \"provider.codex.config.invalid_type\",\n \"Codex config 字段必须是字符串\",\n \"Codex config field must be a string\",\n ));\n }\n if let Some(cfg_text) = config_value.as_str() {\n crate::codex_config::validate_config_toml(cfg_text)?;\n }\n }\n }\n AppType::Gemini => {\n use crate::gemini_config::validate_gemini_settings;\n validate_gemini_settings(&provider.settings_config)?\n }\n AppType::OpenCode => {\n // OpenCode uses a different config structure: { npm, options, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.opencode.settings.not_object\",\n \"OpenCode 配置必须是 JSON 对象\",\n \"OpenCode configuration must be a JSON object\",\n ));\n }\n }\n AppType::OpenClaw => {\n // OpenClaw uses config structure: { baseUrl, apiKey, api, models }\n // Basic validation - must be an object\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.openclaw.settings.not_object\",\n \"OpenClaw 配置必须是 JSON 对象\",\n \"OpenClaw configuration must be a JSON object\",\n ));\n }\n }\n AppType::Hermes => {\n // Hermes: accept any JSON object for now\n if !provider.settings_config.is_object() {\n return Err(AppError::localized(\n \"provider.hermes.settings.not_object\",\n \"Hermes 配置必须是 JSON 对象\",\n \"Hermes configuration must be a JSON object\",\n ));\n }\n }\n }\n\n // Validate and clean UsageScript configuration (common for all app types)\n if let Some(meta) = &provider.meta {\n if let Some(multiplier) = meta.cost_multiplier.as_deref() {\n validate_cost_multiplier(multiplier)?;\n }\n if let Some(source) = meta.pricing_model_source.as_deref() {\n validate_pricing_source(source)?;\n }\n if let Some(usage_script) = &meta.usage_script {\n validate_usage_script(usage_script)?;\n }\n }\n\n Ok(())\n }\n\n #[allow(dead_code)]\n fn extract_credentials(\n provider: &Provider,\n app_type: &AppType,\n ) -> Result<(String, String), AppError> {\n match app_type {\n AppType::Claude => {\n let env = provider\n .settings_config\n .get(\"env\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.env.missing\",\n \"配置格式错误: 缺少 env\",\n \"Invalid configuration: missing env section\",\n )\n })?;\n\n let api_key = env\n .get(\"ANTHROPIC_AUTH_TOKEN\")\n .or_else(|| env.get(\"ANTHROPIC_API_KEY\"))\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = env\n .get(\"ANTHROPIC_BASE_URL\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.claude.base_url.missing\",\n \"缺少 ANTHROPIC_BASE_URL 配置\",\n \"Missing ANTHROPIC_BASE_URL configuration\",\n )\n })?\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::ClaudeDesktop => {\n let credentials =\n crate::claude_desktop_config::direct_gateway_credentials(provider)?;\n Ok((credentials.api_key, credentials.base_url))\n }\n AppType::Codex => {\n let _auth = provider\n .settings_config\n .get(\"auth\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.auth.missing\",\n \"配置格式错误: 缺少 auth\",\n \"Invalid configuration: missing auth section\",\n )\n })?;\n\n let config_toml = provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\");\n\n let api_key = crate::codex_config::extract_codex_api_key(\n provider.settings_config.get(\"auth\"),\n Some(config_toml),\n )\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?;\n\n let base_url = if config_toml.contains(\"base_url\") {\n let re = Regex::new(r#\"base_url\\s*=\\s*[\"']([^\"']+)[\"']\"#).map_err(|e| {\n AppError::localized(\n \"provider.regex_init_failed\",\n format!(\"正则初始化失败: {e}\"),\n format!(\"Failed to initialize regex: {e}\"),\n )\n })?;\n re.captures(config_toml)\n .and_then(|caps| caps.get(1))\n .map(|m| m.as_str().to_string())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.codex.base_url.invalid\",\n \"config.toml 中 base_url 格式错误\",\n \"base_url in config.toml has invalid format\",\n )\n })?\n } else {\n return Err(AppError::localized(\n \"provider.codex.base_url.missing\",\n \"config.toml 中缺少 base_url 配置\",\n \"base_url is missing from config.toml\",\n ));\n };\n\n Ok((api_key, base_url))\n }\n AppType::Gemini => {\n use crate::gemini_config::json_to_env;\n\n let env_map = json_to_env(&provider.settings_config)?;\n\n let api_key = env_map.get(\"GEMINI_API_KEY\").cloned().ok_or_else(|| {\n AppError::localized(\n \"gemini.missing_api_key\",\n \"缺少 GEMINI_API_KEY\",\n \"Missing GEMINI_API_KEY\",\n )\n })?;\n\n let base_url = env_map\n .get(\"GOOGLE_GEMINI_BASE_URL\")\n .cloned()\n .unwrap_or_else(|| \"https://generativelanguage.googleapis.com\".to_string());\n\n Ok((api_key, base_url))\n }\n AppType::OpenCode => {\n // OpenCode uses options.apiKey and options.baseURL\n let options = provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.as_object())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.options.missing\",\n \"配置格式错误: 缺少 options\",\n \"Invalid configuration: missing options section\",\n )\n })?;\n\n let api_key = options\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.opencode.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = options\n .get(\"baseURL\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use apiKey and baseUrl directly on the object\n let api_key = provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .ok_or_else(|| {\n AppError::localized(\n \"provider.openclaw.api_key.missing\",\n \"缺少 API Key\",\n \"API key is missing\",\n )\n })?\n .to_string();\n\n let base_url = provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\")\n .to_string();\n\n Ok((api_key, base_url))\n }\n }\n }\n}\n\n/// Normalize Claude model keys in a JSON value\n///\n/// Reads old key (ANTHROPIC_SMALL_FAST_MODEL), writes new keys (DEFAULT_*), and deletes old key.\npub(crate) fn normalize_claude_models_in_value(settings: &mut Value) -> bool {\n let mut changed = false;\n let env = match settings.get_mut(\"env\").and_then(|v| v.as_object_mut()) {\n Some(obj) => obj,\n None => return changed,\n };\n\n let model = env\n .get(\"ANTHROPIC_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let small_fast = env\n .get(\"ANTHROPIC_SMALL_FAST_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let current_haiku = env\n .get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_sonnet = env\n .get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n let current_opus = env\n .get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\")\n .and_then(|v| v.as_str())\n .map(|s| s.to_string());\n\n let target_haiku = current_haiku\n .or_else(|| small_fast.clone())\n .or_else(|| model.clone());\n let target_sonnet = current_sonnet\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n let target_opus = current_opus\n .or_else(|| model.clone())\n .or_else(|| small_fast.clone());\n\n if env.get(\"ANTHROPIC_DEFAULT_HAIKU_MODEL\").is_none() {\n if let Some(v) = target_haiku {\n env.insert(\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_SONNET_MODEL\").is_none() {\n if let Some(v) = target_sonnet {\n env.insert(\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\".to_string(),\n Value::String(v),\n );\n changed = true;\n }\n }\n if env.get(\"ANTHROPIC_DEFAULT_OPUS_MODEL\").is_none() {\n if let Some(v) = target_opus {\n env.insert(\"ANTHROPIC_DEFAULT_OPUS_MODEL\".to_string(), Value::String(v));\n changed = true;\n }\n }\n\n if env.remove(\"ANTHROPIC_SMALL_FAST_MODEL\").is_some() {\n changed = true;\n }\n\n changed\n}\n\n#[derive(Debug, Clone, Deserialize)]\npub struct ProviderSortUpdate {\n pub id: String,\n #[serde(rename = \"sortIndex\")]\n pub sort_index: usize,\n}\n\n// ============================================================================\n// 统一供应商(Universal Provider)服务方法\n// ============================================================================\n\nuse crate::provider::UniversalProvider;\nuse std::collections::HashMap;\n\nimpl ProviderService {\n /// 获取所有统一供应商\n pub fn list_universal(\n state: &AppState,\n ) -> Result<HashMap<String, UniversalProvider>, AppError> {\n state.db.get_all_universal_providers()\n }\n\n /// 获取单个统一供应商\n pub fn get_universal(\n state: &AppState,\n id: &str,\n ) -> Result<Option<UniversalProvider>, AppError> {\n state.db.get_universal_provider(id)\n }\n\n /// 添加或更新统一供应商(不自动同步,需手动调用 sync_universal_to_apps)\n pub fn upsert_universal(\n state: &AppState,\n provider: UniversalProvider,\n ) -> Result<bool, AppError> {\n // 保存统一供应商\n state.db.save_universal_provider(&provider)?;\n\n Ok(true)\n }\n\n /// 删除统一供应商\n pub fn delete_universal(state: &AppState, id: &str) -> Result<bool, AppError> {\n // 获取统一供应商(用于删除生成的子供应商)\n let provider = state.db.get_universal_provider(id)?;\n\n // 删除统一供应商\n state.db.delete_universal_provider(id)?;\n\n // 删除生成的子供应商\n if let Some(p) = provider {\n if p.apps.claude {\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n if p.apps.codex {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n if p.apps.gemini {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n }\n\n Ok(true)\n }\n\n /// 同步统一供应商到各应用\n pub fn sync_universal_to_apps(state: &AppState, id: &str) -> Result<bool, AppError> {\n let provider = state\n .db\n .get_universal_provider(id)?\n .ok_or_else(|| AppError::Message(format!(\"统一供应商 {id} 不存在\")))?;\n\n // 同步到 Claude\n if let Some(mut claude_provider) = provider.to_claude_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&claude_provider.id, \"claude\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &claude_provider.settings_config);\n claude_provider.settings_config = merged;\n }\n state.db.save_provider(\"claude\", &claude_provider)?;\n } else {\n // 如果禁用了 Claude,删除对应的子供应商\n let claude_id = format!(\"universal-claude-{id}\");\n let _ = state.db.delete_provider(\"claude\", &claude_id);\n }\n\n // 同步到 Codex\n if let Some(mut codex_provider) = provider.to_codex_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&codex_provider.id, \"codex\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &codex_provider.settings_config);\n codex_provider.settings_config = merged;\n }\n state.db.save_provider(\"codex\", &codex_provider)?;\n } else {\n let codex_id = format!(\"universal-codex-{id}\");\n let _ = state.db.delete_provider(\"codex\", &codex_id);\n }\n\n // 同步到 Gemini\n if let Some(mut gemini_provider) = provider.to_gemini_provider() {\n // 合并已有配置\n if let Some(existing) = state.db.get_provider_by_id(&gemini_provider.id, \"gemini\")? {\n let mut merged = existing.settings_config.clone();\n Self::merge_json(&mut merged, &gemini_provider.settings_config);\n gemini_provider.settings_config = merged;\n }\n state.db.save_provider(\"gemini\", &gemini_provider)?;\n } else {\n let gemini_id = format!(\"universal-gemini-{id}\");\n let _ = state.db.delete_provider(\"gemini\", &gemini_id);\n }\n\n Ok(true)\n }\n\n /// 递归合并 JSON:base 为底,patch 覆盖同名字段\n fn merge_json(base: &mut serde_json::Value, patch: &serde_json::Value) {\n use serde_json::Value;\n\n match (base, patch) {\n (Value::Object(base_map), Value::Object(patch_map)) => {\n for (k, v_patch) in patch_map {\n match base_map.get_mut(k) {\n Some(v_base) => Self::merge_json(v_base, v_patch),\n None => {\n base_map.insert(k.clone(), v_patch.clone());\n }\n }\n }\n }\n // 其它类型:直接覆盖\n (base_val, patch_val) => {\n *base_val = patch_val.clone();\n }\n }\n }\n}\n"}}, "src-tauri/src/services/simple_connect/mod.rs": {"636da7d3bc74f3edff5eca22e9f0e90370cc83ed": {"t": 1785746252.2895384, "n": 8589, "h": "45582d4540745b91", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use key_store::{delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_protocol, resolve_supplier, ApiProtocol,\n SupplierProfile,\n};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::MANAGED_MARKER;\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use verify::{verify_api_key, VerifyKeyResult};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{\n delete_api_key, entry_key, store_primary_key,\n };\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\")));\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}, "d2ef60c6894b12cf8aa9f12d984c2e1dc0db18a8": {"t": 1785761033.7778857, "n": 8589, "h": "45582d4540745b91", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use key_store::{delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_protocol, resolve_supplier, ApiProtocol,\n SupplierProfile,\n};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::MANAGED_MARKER;\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use verify::{verify_api_key, VerifyKeyResult};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{\n delete_api_key, entry_key, store_primary_key,\n };\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\")));\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}, "bccae335cf5dddbae6a0d8ebc8f19312098c7d32": {"t": 1785761035.2682426, "n": 8611, "h": "9afb2c30f7b3dcd2", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use tools::MANAGED_MARKER;\npub use key_store::{\n delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_protocol, resolve_supplier, ApiProtocol,\n SupplierProfile,\n};\npub use verify::{verify_api_key, VerifyKeyResult};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{delete_api_key, entry_key, store_primary_key};\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(\n list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\"))\n );\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}, "f6dc6234e9108cb09b79239bcfb5da1caa3160f5": {"t": 1785761036.4934435, "n": 8576, "h": "21131d68835717be", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use tools::MANAGED_MARKER;\npub use key_store::{\n delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_supplier, SupplierProfile,\n};\npub use verify::{verify_api_key, VerifyKeyResult};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{delete_api_key, entry_key, store_primary_key};\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(\n list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\"))\n );\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}, "6f0e83459eeaa036a44cb4538e43a042113521f5": {"t": 1786067656.4155583, "n": 8589, "h": "45582d4540745b91", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use key_store::{delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_protocol, resolve_supplier, ApiProtocol,\n SupplierProfile,\n};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::MANAGED_MARKER;\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use verify::{verify_api_key, VerifyKeyResult};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{\n delete_api_key, entry_key, store_primary_key,\n };\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\")));\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1786068398.0922933, "n": 8589, "h": "45582d4540745b91", "c": "//! Simple Connect — 双模配置器共享内核(Phase 0 Spike + Phase 1 MVP)\n\npub mod apply;\npub mod backup;\npub mod backup_audit;\npub mod cli_claude;\npub mod deeplink;\npub mod key_store;\npub mod pool;\npub mod proxy_poc;\npub mod security;\npub mod state;\npub mod suppliers;\npub mod token_usage;\npub mod tools;\npub mod usage;\npub mod verify;\n\npub use apply::{\n apply_tool, clear_tool, get_state, is_managed_marker, list_tool_status, save_pool_state,\n ApplyResult, ToolConfigStatus,\n};\npub use backup::backup_file;\npub use backup_audit::{run_backup_audit, BackupAuditItem, BackupAuditReport};\npub use cli_claude::{apply_claude_code, is_managed_settings, ClaudeApplyResult};\npub use deeplink::{\n import_keys, is_simple_connect_import_url, try_parse_url, SimpleConnectImportPayload,\n SimpleConnectImportResult,\n};\npub use key_store::{delete_api_key, get_primary_key, key_hint, store_api_key, store_primary_key};\npub use pool::{build_runtime_pool, KeyPool, PoolKey, PoolKeyStat, PoolSimulationStep};\npub use proxy_poc::{\n fetch_models_via_proxy, pool_runtime_stats, spike_proxy_info, start_spike_proxy,\n stop_spike_proxy, SimpleConnectRuntimeStats, SpikeProxyInfo, SPIKE_PROXY_PORT,\n};\npub use security::{run_p0_security_audit, P0CheckItem, P0SecurityReport};\npub use state::{load_state, save_state, set_supplier, PoolKeyMeta, SimpleConnectState};\npub use suppliers::{\n get_supplier, list_builtin_suppliers, resolve_protocol, resolve_supplier, ApiProtocol,\n SupplierProfile,\n};\npub use token_usage::{snapshot as token_usage_snapshot, ScTokenUsage};\npub use tools::MANAGED_MARKER;\npub use tools::{ALL_TOOLS, PHASE1_TOOLS};\npub use usage::{build_usage_summary, SimpleConnectUsageSummary};\npub use verify::{verify_api_key, VerifyKeyResult};\n\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub struct SpikeReport {\n pub s1_keychain: SpikeStepResult,\n pub s2_claude_apply: SpikeStepResult,\n pub s3_proxy: SpikeStepResult,\n pub s4_pool: SpikeStepResult,\n pub all_passed: bool,\n}\n\n#[derive(Debug, Serialize)]\npub struct SpikeStepResult {\n pub id: String,\n pub ok: bool,\n pub detail: String,\n}\n\npub fn run_pool_demo() -> Vec<PoolSimulationStep> {\n KeyPool::simulate_failover_demo()\n}\n\n/// Phase 0 Spike 自检(S1–S4)。S3 需有效 Key + 网络;S2 会写入真实 Claude settings。\npub async fn run_spike_report(\n supplier_id: &str,\n test_api_key: Option<&str>,\n) -> Result<SpikeReport, crate::error::AppError> {\n let mut s1 = SpikeStepResult {\n id: \"S1\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s2 = SpikeStepResult {\n id: \"S2\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s3 = SpikeStepResult {\n id: \"S3\".into(),\n ok: false,\n detail: String::new(),\n };\n let mut s4 = SpikeStepResult {\n id: \"S4\".into(),\n ok: false,\n detail: String::new(),\n };\n\n if let Some(key) = test_api_key.map(str::trim).filter(|k| !k.is_empty()) {\n match store_primary_key(supplier_id, key) {\n Ok(()) => match get_primary_key(supplier_id) {\n Ok(Some(roundtrip)) if roundtrip == key => {\n s1.ok = true;\n s1.detail = format!(\"Keychain 读写 OK,hint={}\", key_hint(&roundtrip));\n }\n Ok(_) => s1.detail = \"Keychain 读回不匹配\".into(),\n Err(e) => s1.detail = format!(\"Keychain 读取失败: {e}\"),\n },\n Err(e) => s1.detail = format!(\"Keychain 写入失败: {e}\"),\n }\n } else if get_primary_key(supplier_id)?.is_some() {\n s1.ok = true;\n s1.detail = \"使用已存在的 Keychain 条目\".into();\n } else {\n s1.detail = \"跳过:未提供 test_api_key 且 Keychain 无条目\".into();\n }\n\n if let Some(key) = get_primary_key(supplier_id)? {\n if let Some(supplier) = get_supplier(supplier_id) {\n let base = supplier\n .anthropic_base\n .as_deref()\n .unwrap_or(supplier.openai_base.as_str());\n let model = if supplier.default_model.is_empty() {\n \"deepseek-chat\".to_string()\n } else {\n supplier.default_model.clone()\n };\n match apply_claude_code(&key, &model, base) {\n Ok(r) => {\n s2.ok = true;\n s2.detail = format!(\"已写入 {} (base={})\", r.settings_path, r.base_url);\n }\n Err(e) => s2.detail = format!(\"Claude 写入失败: {e}\"),\n }\n } else {\n s2.detail = \"供应商预设未找到\".into();\n }\n } else {\n s2.detail = \"跳过:无 Keychain Key\".into();\n }\n\n if s1.ok {\n if let Some(supplier) = get_supplier(supplier_id) {\n match fetch_models_via_proxy(supplier_id, &supplier.openai_base).await {\n Ok(models) => {\n s3.ok = !models.is_empty();\n s3.detail = format!(\n \"代理已启动 (:{SPIKE_PROXY_PORT}),模型数={},示例={}\",\n models.len(),\n models.first().cloned().unwrap_or_default()\n );\n }\n Err(e) => s3.detail = format!(\"模型拉取失败(可能 Key/网络): {e}\"),\n }\n }\n } else {\n s3.detail = \"跳过:S1 未通过\".into();\n }\n\n let steps = run_pool_demo();\n s4.ok = steps.iter().any(|s| s.key_id == \"k2\" && s.action == \"pick\");\n s4.detail = format!(\"模拟 {} 步,含 429 failover\", steps.len());\n\n let all_passed = s1.ok && s2.ok && s3.ok && s4.ok;\n\n Ok(SpikeReport {\n s1_keychain: s1,\n s2_claude_apply: s2,\n s3_proxy: s3,\n s4_pool: s4,\n all_passed,\n })\n}\n\n#[cfg(test)]\nmod spike_tests {\n use super::*;\n use crate::services::simple_connect::key_store::{\n delete_api_key, entry_key, store_primary_key,\n };\n use serial_test::serial;\n\n fn unique_supplier() -> String {\n format!(\"phase0spike{}\", uuid::Uuid::new_v4().simple())\n }\n\n #[test]\n fn offline_kernel_suppliers_and_pool() {\n assert!(list_builtin_suppliers()\n .iter()\n .all(|s| s.id != \"beeapi\" && !s.openai_base.contains(\"beeapi.ai\")));\n let steps = run_pool_demo();\n assert!(steps.iter().any(|s| s.action == \"fail\" && s.key_id == \"k1\"));\n assert!(steps.iter().any(|s| s.action == \"pick\" && s.key_id == \"k2\"));\n }\n\n #[test]\n fn key_store_entry_shape_and_empty_rejected() {\n assert_eq!(\n entry_key(\"deepseek\", \"primary\"),\n \"simple-connect/deepseek/primary\"\n );\n assert!(store_primary_key(\"deepseek\", \" \").is_err());\n assert_eq!(key_hint(\"sk-abcd1234wxyz\"), \"sk-a****wxyz\");\n }\n\n #[test]\n #[serial]\n #[ignore = \"manual or local: OS keychain roundtrip\"]\n fn offline_keychain_roundtrip() {\n let supplier = unique_supplier();\n let key = format!(\"sk-phase0-test-{}\", uuid::Uuid::new_v4());\n store_primary_key(&supplier, &key).expect(\"store\");\n let read = get_primary_key(&supplier)\n .expect(\"read\")\n .unwrap_or_else(|| {\n panic!(\n \"Keychain roundtrip failed for entry {}\",\n entry_key(&supplier, \"primary\")\n )\n });\n assert_eq!(read, key);\n delete_api_key(&supplier, \"primary\").expect(\"cleanup\");\n }\n\n #[test]\n fn backup_creates_timestamped_copy() {\n let dir = tempfile::TempDir::new().unwrap();\n let src = dir.path().join(\"settings.json\");\n std::fs::write(&src, r#\"{\"env\":{}}\"#).unwrap();\n let backup = backup_file(\"claude-code\", &src)\n .expect(\"backup\")\n .expect(\"path\");\n assert!(backup.exists());\n let content = std::fs::read_to_string(&backup).unwrap();\n assert!(content.contains(\"env\"));\n }\n\n #[tokio::test]\n #[serial]\n #[ignore = \"requires OS keychain to bootstrap proxy pool\"]\n async fn spike_proxy_health_responds_ok() {\n let supplier = unique_supplier();\n store_primary_key(&supplier, \"sk-test-health-only-proxy\")\n .expect(\"store test key for proxy bind\");\n let info = start_spike_proxy(&supplier, \"https://api.deepseek.com\")\n .await\n .expect(\"start proxy\");\n let url = format!(\"{}/__simple_connect/health\", info.local_base);\n let resp = reqwest::get(&url).await.expect(\"health request\");\n assert_eq!(resp.status(), 200);\n assert_eq!(resp.text().await.unwrap(), \"ok\");\n stop_spike_proxy().await;\n let _ = delete_api_key(&supplier, \"primary\");\n }\n}\n"}}, "src/config/openclawProviderPresets.ts": {"636da7d3bc74f3edff5eca22e9f0e90370cc83ed": {"t": 1785809871.9930747, "n": 59940, "h": "7ff50afebd98a28d", "c": "/**\n * OpenClaw provider presets configuration\n * OpenClaw uses models.providers structure with custom provider configs\n */\nimport type {\n ProviderCategory,\n OpenClawProviderConfig,\n OpenClawDefaultModel,\n} from \"../types\";\nimport type { PresetTheme, TemplateValueConfig } from \"./claudeProviderPresets\";\n\n/** Suggested default model configuration for a preset */\nexport interface OpenClawSuggestedDefaults {\n /** Default model config to apply (agents.defaults.model) */\n model?: OpenClawDefaultModel;\n /** Model catalog entries to add (agents.defaults.models) */\n modelCatalog?: Record<string, { alias?: string }>;\n}\n\nexport interface OpenClawProviderPreset {\n name: string;\n nameKey?: string; // i18n key for localized display name\n websiteUrl: string;\n apiKeyUrl?: string;\n /** OpenClaw settings_config structure */\n settingsConfig: OpenClawProviderConfig;\n isOfficial?: boolean;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n category?: ProviderCategory;\n /** Template variable definitions */\n templateValues?: Record<string, TemplateValueConfig>;\n /** Visual theme config */\n theme?: PresetTheme;\n /** Icon name */\n icon?: string;\n /** Icon color */\n iconColor?: string;\n /** Mark as custom template (for UI distinction) */\n isCustomTemplate?: boolean;\n /** Suggested default model configuration */\n suggestedDefaults?: OpenClawSuggestedDefaults;\n}\n\nfunction rebaseOpenClawModelRef(modelRef: string, providerKey: string): string {\n const slashIndex = modelRef.indexOf(\"/\");\n return slashIndex === -1\n ? `${providerKey}/${modelRef}`\n : `${providerKey}${modelRef.slice(slashIndex)}`;\n}\n\n/**\n * OpenClaw default model refs are stored as \"<provider-key>/<model-id>\".\n * Presets carry stable built-in keys for display/tests, but the real key is\n * chosen in the add-provider form, so rewrite refs right before submission.\n */\nexport function rebaseOpenClawSuggestedDefaults(\n defaults: OpenClawSuggestedDefaults,\n providerKey: string,\n): OpenClawSuggestedDefaults {\n const key = providerKey.trim();\n if (!key) return defaults;\n\n return {\n model: defaults.model\n ? {\n ...defaults.model,\n primary: rebaseOpenClawModelRef(defaults.model.primary, key),\n fallbacks: defaults.model.fallbacks?.map((modelRef) =>\n rebaseOpenClawModelRef(modelRef, key),\n ),\n }\n : undefined,\n modelCatalog: defaults.modelCatalog\n ? Object.fromEntries(\n Object.entries(defaults.modelCatalog).map(([modelRef, entry]) => [\n rebaseOpenClawModelRef(modelRef, key),\n entry,\n ]),\n )\n : undefined,\n };\n}\n\n/**\n * OpenClaw API protocol options\n * @see https://github.com/openclaw/openclaw/blob/main/docs/gateway/configuration.md\n */\nexport const openclawApiProtocols = [\n { value: \"openai-completions\", label: \"OpenAI Completions\" },\n { value: \"openai-responses\", label: \"OpenAI Responses\" },\n { value: \"anthropic-messages\", label: \"Anthropic Messages\" },\n { value: \"google-generative-ai\", label: \"Google Generative AI\" },\n { value: \"bedrock-converse-stream\", label: \"AWS Bedrock\" },\n] as const;\n\n/**\n * OpenClaw provider presets list\n */\nexport const openclawProviderPresets: OpenClawProviderPreset[] = [\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n settingsConfig: {\n baseUrl: \"https://router.shengsuanyun.com/api\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"shengsuanyun/anthropic/claude-opus-4.8\",\n fallbacks: [\"shengsuanyun/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"shengsuanyun/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"shengsuanyun/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.cn-beijing.volces.com/api/coding/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ark-code-latest\",\n name: \"Ark Code Latest\",\n contextWindow: 256000,\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"ark_agentplan/ark-code-latest\" },\n modelCatalog: {\n \"ark_agentplan/ark-code-latest\": { alias: \"Ark Code\" },\n },\n },\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.ap-southeast.bytepluses.com/api/coding/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ark-code-latest\",\n name: \"Ark Code Latest\",\n contextWindow: 256000,\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"byteplus/ark-code-latest\" },\n modelCatalog: {\n \"byteplus/ark-code-latest\": { alias: \"Ark Code\" },\n },\n },\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.cn-beijing.volces.com/api/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"doubao-seed-2-0-code-preview-latest\",\n name: \"DouBao Seed Code Preview\",\n contextWindow: 128000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"doubaoseed/doubao-seed-2-0-code-preview-latest\" },\n modelCatalog: {\n \"doubaoseed/doubao-seed-2-0-code-preview-latest\": { alias: \"DouBao\" },\n },\n },\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n settingsConfig: {\n baseUrl: \"https://www.ccsub.net/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n cost: { input: 5, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"ccsub/gpt-5.5\",\n },\n modelCatalog: {\n \"ccsub/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n settingsConfig: {\n baseUrl: \"https://api.unity2.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n cost: { input: 5, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"unity2/gpt-5.5\",\n },\n modelCatalog: {\n \"unity2/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n // ========== Chinese Officials ==========\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n settingsConfig: {\n baseUrl: \"https://api.deepseek.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"deepseek-v4-pro\",\n name: \"DeepSeek V4 Pro\",\n contextWindow: 1000000,\n cost: { input: 1.68, output: 3.36 },\n },\n {\n id: \"deepseek-v4-flash\",\n name: \"DeepSeek V4 Flash\",\n contextWindow: 1000000,\n cost: { input: 0.14, output: 0.28 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"deepseek/deepseek-v4-flash\",\n fallbacks: [\"deepseek/deepseek-v4-pro\"],\n },\n modelCatalog: {\n \"deepseek/deepseek-v4-flash\": { alias: \"Flash\" },\n \"deepseek/deepseek-v4-pro\": { alias: \"Pro\" },\n },\n },\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n settingsConfig: {\n baseUrl: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n defaultValue: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"zhipu/glm-5.1\" },\n modelCatalog: { \"zhipu/glm-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n settingsConfig: {\n baseUrl: \"https://api.z.ai/api/coding/paas/v4\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.z.ai/api/coding/paas/v4\",\n defaultValue: \"https://api.z.ai/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"zhipu-en/glm-5.1\" },\n modelCatalog: { \"zhipu-en/glm-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"Qwen Coder\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/#/api-key\",\n settingsConfig: {\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"qwen3.5-plus\",\n name: \"Qwen3.5 Plus\",\n contextWindow: 32000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"qwen\",\n iconColor: \"#FF6A00\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n defaultValue: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"qwen/qwen3.5-plus\" },\n modelCatalog: { \"qwen/qwen3.5-plus\": { alias: \"Qwen\" } },\n },\n },\n {\n name: \"Kimi k2.6\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.moonshot.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"kimi-k2.6\",\n name: \"Kimi K2.6\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.moonshot.cn/v1\",\n defaultValue: \"https://api.moonshot.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"kimi/kimi-k2.6\" },\n modelCatalog: { \"kimi/kimi-k2.6\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.kimi.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"kimi-for-coding\",\n name: \"Kimi For Coding\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.kimi.com/v1\",\n defaultValue: \"https://api.kimi.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"kimi-coding/kimi-for-coding\" },\n modelCatalog: { \"kimi-coding/kimi-for-coding\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n baseUrl: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextWindow: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextWindow: 262144,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.com/step_plan/v1\",\n defaultValue: \"https://api.stepfun.com/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"stepfun/step-3.5-flash-2603\" },\n modelCatalog: {\n \"stepfun/step-3.5-flash-2603\": { alias: \"StepFun\" },\n \"stepfun/step-3.5-flash\": { alias: \"StepFun Flash\" },\n },\n },\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n settingsConfig: {\n baseUrl: \"https://api.stepfun.ai/step_plan/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextWindow: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextWindow: 262144,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.ai/step_plan/v1\",\n defaultValue: \"https://api.stepfun.ai/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"stepfun-en/step-3.5-flash-2603\" },\n modelCatalog: {\n \"stepfun-en/step-3.5-flash-2603\": { alias: \"StepFun\" },\n \"stepfun-en/step-3.5-flash\": { alias: \"StepFun Flash\" },\n },\n },\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.minimaxi.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"minimax/MiniMax-M2.7\" },\n modelCatalog: { \"minimax/MiniMax-M2.7\": { alias: \"MiniMax\" } },\n },\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.minimax.io/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"minimax-en/MiniMax-M2.7\" },\n modelCatalog: { \"minimax-en/MiniMax-M2.7\": { alias: \"MiniMax\" } },\n },\n },\n {\n name: \"KAT-Coder\",\n websiteUrl: \"https://console.streamlake.ai\",\n apiKeyUrl: \"https://console.streamlake.ai/console/api-key\",\n settingsConfig: {\n baseUrl:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"KAT-Coder-Pro\",\n name: \"KAT-Coder Pro\",\n contextWindow: 128000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"catcoder\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n defaultValue:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n editorValue: \"\",\n },\n ENDPOINT_ID: {\n label: \"Endpoint ID\",\n placeholder: \"\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"katcoder/KAT-Coder-Pro\" },\n modelCatalog: { \"katcoder/KAT-Coder-Pro\": { alias: \"KAT-Coder\" } },\n },\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n settingsConfig: {\n baseUrl: \"https://api.longcat.chat/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n authHeader: true,\n models: [\n {\n id: \"LongCat-Flash-Chat\",\n name: \"LongCat Flash Chat\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"longcat\",\n iconColor: \"#29E154\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.longcat.chat/v1\",\n defaultValue: \"https://api.longcat.chat/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"longcat/LongCat-Flash-Chat\" },\n modelCatalog: { \"longcat/LongCat-Flash-Chat\": { alias: \"LongCat\" } },\n },\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n settingsConfig: {\n baseUrl: \"https://api.tbox.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"Ling-2.5-1T\",\n name: \"Ling 2.5 1T\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"bailing/Ling-2.5-1T\" },\n modelCatalog: { \"bailing/Ling-2.5-1T\": { alias: \"BaiLing\" } },\n },\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.xiaomimimo.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"mimo-v2.5-pro\",\n name: \"MiMo V2.5 Pro\",\n reasoning: true,\n input: [\"text\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n cost: { input: 1, output: 3, cacheRead: 0.2, cacheWrite: 0 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"xiaomimimo/mimo-v2.5-pro\" },\n modelCatalog: { \"xiaomimimo/mimo-v2.5-pro\": { alias: \"MiMo\" } },\n },\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n settingsConfig: {\n baseUrl: \"https://token-plan-cn.xiaomimimo.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"mimo-v2.5-pro\",\n name: \"MiMo V2.5 Pro\",\n reasoning: true,\n input: [\"text\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n },\n {\n id: \"mimo-v2.5\",\n name: \"MiMo V2.5\",\n reasoning: true,\n input: [\"text\", \"image\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"Token Plan API Key\",\n placeholder: \"tp-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"xiaomi-mimo-token-plan/mimo-v2.5-pro\" },\n modelCatalog: {\n \"xiaomi-mimo-token-plan/mimo-v2.5-pro\": {\n alias: \"MiMo Token Plan (China)\",\n },\n \"xiaomi-mimo-token-plan/mimo-v2.5\": {\n alias: \"MiMo Token Plan (China) Multimodal\",\n },\n },\n },\n },\n\n // ========== Aggregators ==========\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n settingsConfig: {\n baseUrl: \"https://aihubmix.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aihubmix/claude-opus-4-8\",\n fallbacks: [\"aihubmix/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aihubmix/claude-opus-4-8\": { alias: \"Opus\" },\n \"aihubmix/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n settingsConfig: {\n baseUrl: \"https://open.cherryin.net\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n ],\n },\n category: \"aggregator\",\n icon: \"cherryin\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"cherryin/anthropic/claude-opus-4.8\",\n fallbacks: [\"cherryin/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"cherryin/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"cherryin/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n settingsConfig: {\n baseUrl: \"https://www.dmxapi.cn\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"dmxapi/claude-opus-4-8\",\n fallbacks: [\"dmxapi/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"dmxapi/claude-opus-4-8\": { alias: \"Opus\" },\n \"dmxapi/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://claudecn.top\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"claudecn/claude-sonnet-4-6\",\n },\n modelCatalog: {\n \"claudecn/claude-opus-4-8\": { alias: \"Opus\" },\n \"claudecn/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"claudecn/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n settingsConfig: {\n baseUrl: \"https://runapi.co\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"runapi/claude-sonnet-4-6\",\n },\n modelCatalog: {\n \"runapi/claude-opus-4-8\": { alias: \"Opus\" },\n \"runapi/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"runapi/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n settingsConfig: {\n baseUrl: \"https://openrouter.ai/api/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-or-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"openrouter/anthropic/claude-opus-4.8\",\n fallbacks: [\"openrouter/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"openrouter/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"openrouter/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n settingsConfig: {\n baseUrl: \"https://api.therouter.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },\n },\n {\n id: \"openai/gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n contextWindow: 400000,\n cost: { input: 5, output: 40, cacheRead: 0.5 },\n },\n {\n id: \"openai/gpt-5.2\",\n name: \"GPT-5.2\",\n contextWindow: 400000,\n cost: { input: 1.75, output: 14, cacheRead: 0.175 },\n },\n {\n id: \"google/gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n contextWindow: 1000000,\n cost: { input: 1.5, output: 9, cacheRead: 0.15 },\n },\n {\n id: \"qwen/qwen3-coder-480b\",\n name: \"Qwen3 Coder 480B\",\n contextWindow: 262144,\n cost: { input: 0.6, output: 2.35 },\n },\n ],\n },\n category: \"aggregator\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"therouter/anthropic/claude-sonnet-4.6\",\n fallbacks: [\n \"therouter/openai/gpt-5.2\",\n \"therouter/google/gemini-3.5-flash\",\n ],\n },\n modelCatalog: {\n \"therouter/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n \"therouter/openai/gpt-5.2\": { alias: \"GPT-5.2\" },\n \"therouter/google/gemini-3.5-flash\": { alias: \"Gemini Flash\" },\n \"therouter/openai/gpt-5.3-codex\": { alias: \"Codex\" },\n \"therouter/qwen/qwen3-coder-480b\": { alias: \"Qwen Coder\" },\n },\n },\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n apiKeyUrl: \"https://modelscope.cn/my/myaccesstoken\",\n settingsConfig: {\n baseUrl: \"https://api-inference.modelscope.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ZhipuAI/GLM-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api-inference.modelscope.cn/v1\",\n defaultValue: \"https://api-inference.modelscope.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"modelscope/ZhipuAI/GLM-5.1\" },\n modelCatalog: { \"modelscope/ZhipuAI/GLM-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"SiliconFlow\",\n websiteUrl: \"https://siliconflow.cn\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n settingsConfig: {\n baseUrl: \"https://api.siliconflow.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"Pro/MiniMaxAI/MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#6E29F6\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"siliconflow/Pro/MiniMaxAI/MiniMax-M2.7\" },\n modelCatalog: {\n \"siliconflow/Pro/MiniMaxAI/MiniMax-M2.7\": { alias: \"MiniMax\" },\n },\n },\n },\n {\n name: \"SiliconFlow en\",\n websiteUrl: \"https://siliconflow.com\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n settingsConfig: {\n baseUrl: \"https://api.siliconflow.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMaxAI/MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"siliconflow-en/MiniMaxAI/MiniMax-M2.7\" },\n modelCatalog: {\n \"siliconflow-en/MiniMaxAI/MiniMax-M2.7\": { alias: \"MiniMax\" },\n },\n },\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n settingsConfig: {\n baseUrl: \"https://api.novita.ai/openai\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"zai-org/glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 202800,\n cost: { input: 1, output: 3.2, cacheRead: 0.2 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"novita\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"novita/zai-org/glm-5.1\" },\n modelCatalog: {\n \"novita/zai-org/glm-5.1\": { alias: \"GLM-5.1\" },\n },\n },\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n settingsConfig: {\n baseUrl: \"https://integrate.api.nvidia.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"moonshotai/kimi-k2.5\",\n name: \"Kimi K2.5\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"nvidia\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"nvapi-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"nvidia/moonshotai/kimi-k2.5\" },\n modelCatalog: { \"nvidia/moonshotai/kimi-k2.5\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n settingsConfig: {\n baseUrl: \"https://cc-api.pipellm.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"claude-opus-4-8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"claude-sonnet-4-6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"claude-haiku-4-5-20251001\",\n contextWindow: 200000,\n cost: { input: 0.8, output: 4 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"pipellm\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"pipe-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"pipellm/claude-opus-4-8\",\n fallbacks: [\"pipellm/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"pipellm/claude-opus-4-8\": { alias: \"Opus\" },\n \"pipellm/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"pipellm/claude-haiku-4-5-20251001\": { alias: \"Haiku\" },\n },\n },\n },\n\n // ========== Third Party Partners ==========\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://www.packyapi.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"packycode/claude-opus-4-8\",\n fallbacks: [\"packycode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"packycode/claude-opus-4-8\": { alias: \"Opus\" },\n \"packycode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.apikey.fun\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"apikeyfun/claude-opus-4-8\",\n fallbacks: [\"apikeyfun/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"apikeyfun/claude-opus-4-8\": { alias: \"Opus\" },\n \"apikeyfun/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"apikeyfun/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n settingsConfig: {\n baseUrl: \"https://apinebula.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"apinebula/gpt-5.5\",\n },\n },\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.atlascloud.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"zai-org/glm-5.1\",\n name: \"GLM 5.1\",\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"atlascloud/zai-org/glm-5.1\",\n },\n },\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n settingsConfig: {\n baseUrl: \"https://sudocode.us/v1\",\n apiKey: \"\",\n api: \"openai-responses\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"sudocode/gpt-5.5\",\n },\n },\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n settingsConfig: {\n baseUrl: \"https://api.cubence.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"cubence/claude-opus-4-8\",\n fallbacks: [\"cubence/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"cubence/claude-opus-4-8\": { alias: \"Opus\" },\n \"cubence/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.aigocode.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aigocode/claude-opus-4-8\",\n fallbacks: [\"aigocode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aigocode/claude-opus-4-8\": { alias: \"Opus\" },\n \"aigocode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://www.right.codes/claude\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"rightcode/claude-opus-4-8\",\n fallbacks: [\"rightcode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"rightcode/claude-opus-4-8\": { alias: \"Opus\" },\n \"rightcode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n settingsConfig: {\n baseUrl: \"https://api.aicodemirror.com/api/claudecode\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aicodemirror/claude-opus-4-8\",\n fallbacks: [\"aicodemirror/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aicodemirror/claude-opus-4-8\": { alias: \"Opus\" },\n \"aicodemirror/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://cn.crazyrouter.com/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"crazyrouter/claude-opus-4-8\",\n fallbacks: [\"crazyrouter/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"crazyrouter/claude-opus-4-8\": { alias: \"Opus\" },\n \"crazyrouter/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n settingsConfig: {\n baseUrl: \"https://node-hk.sssaicodeapi.com/api\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"sssaicode/claude-opus-4-8\",\n fallbacks: [\"sssaicode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"sssaicode/claude-opus-4-8\": { alias: \"Opus\" },\n \"sssaicode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"Compshare\",\n nameKey: \"providerForm.presets.ucloud\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.modelverse.cn/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true, // 合作伙伴\n partnerPromotionKey: \"ucloud\", // 促销信息 i18n key\n icon: \"ucloud\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"compshare/claude-opus-4-8\",\n },\n modelCatalog: {\n \"compshare/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"Compshare Coding Plan\",\n nameKey: \"providerForm.presets.ucloudCoding\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://cp.compshare.cn/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true, // 合作伙伴\n partnerPromotionKey: \"ucloud\", // 促销信息 i18n key(复用)\n icon: \"ucloud\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"compshare-coding/claude-opus-4-8\",\n },\n modelCatalog: {\n \"compshare-coding/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n settingsConfig: {\n baseUrl: \"https://www.micuapi.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"micu/claude-opus-4-8\",\n },\n modelCatalog: {\n \"micu/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n settingsConfig: {\n baseUrl: \"https://api.ctok.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"ctok/claude-opus-4-8\",\n },\n modelCatalog: {\n \"ctok/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n settingsConfig: {\n api: \"openai-responses\",\n apiKey: \"\",\n baseUrl: \"https://e-flowcode.cc/v1\",\n headers: {\n \"User-Agent\":\n \"codex_cli_rs/0.77.0 (Windows 10.0.26100; x86_64) WindowsTerminal\",\n },\n models: [\n {\n contextWindow: 200000,\n cost: {\n cacheRead: 0,\n cacheWrite: 0,\n input: 0,\n output: 0,\n },\n id: \"gpt-5.3-codex\",\n maxTokens: 32000,\n name: \"gpt-5.3-codex\",\n },\n {\n id: \"gpt-5.5\",\n name: \"gpt-5.5\",\n },\n {\n id: \"gpt-5.2-codex\",\n name: \"gpt-5.2-codex\",\n },\n {\n id: \"gpt-5.2\",\n name: \"gpt-5.2\",\n },\n ],\n },\n category: \"third_party\",\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"eflowcode/gpt-5.3-codex\",\n fallbacks: [\"eflowcode/gpt-5.5\", \"eflowcode/gpt-5.2-codex\"],\n },\n modelCatalog: {\n \"eflowcode/gpt-5.3-codex\": { alias: \"gpt-5.3-codex\" },\n \"eflowcode/gpt-5.5\": { alias: \"gpt-5.5\" },\n \"eflowcode/gpt-5.2-codex\": { alias: \"gpt-5.2-codex\" },\n \"eflowcode/gpt-5.2\": { alias: \"gpt-5.2\" },\n },\n },\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n settingsConfig: {\n baseUrl: \"https://api.lemondata.cc/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"lemondata/gpt-5.5\",\n },\n modelCatalog: {\n \"lemondata/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n // ========== Cloud Providers ==========\n {\n name: \"AWS Bedrock\",\n websiteUrl: \"https://aws.amazon.com/bedrock/\",\n settingsConfig: {\n // 请将 us-west-2 替换为你的 AWS Region\n baseUrl: \"https://bedrock-runtime.us-west-2.amazonaws.com\",\n apiKey: \"\",\n api: \"bedrock-converse-stream\",\n models: [\n {\n id: \"anthropic.claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },\n },\n {\n id: \"anthropic.claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },\n },\n {\n id: \"anthropic.claude-haiku-4-5-20251022-v1:0\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n cost: { input: 0.8, output: 4, cacheRead: 0.08, cacheWrite: 1 },\n },\n ],\n },\n category: \"cloud_provider\",\n icon: \"aws\",\n iconColor: \"#FF9900\",\n },\n\n // ========== Custom Template ==========\n {\n name: \"OpenAI Compatible\",\n websiteUrl: \"\",\n settingsConfig: {\n baseUrl: \"\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [],\n },\n category: \"custom\",\n isCustomTemplate: true,\n icon: \"generic\",\n iconColor: \"#6B7280\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.example.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n];\n"}, "bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1785809908.1403182, "n": 59940, "h": "7ff50afebd98a28d", "c": "/**\n * OpenClaw provider presets configuration\n * OpenClaw uses models.providers structure with custom provider configs\n */\nimport type {\n ProviderCategory,\n OpenClawProviderConfig,\n OpenClawDefaultModel,\n} from \"../types\";\nimport type { PresetTheme, TemplateValueConfig } from \"./claudeProviderPresets\";\n\n/** Suggested default model configuration for a preset */\nexport interface OpenClawSuggestedDefaults {\n /** Default model config to apply (agents.defaults.model) */\n model?: OpenClawDefaultModel;\n /** Model catalog entries to add (agents.defaults.models) */\n modelCatalog?: Record<string, { alias?: string }>;\n}\n\nexport interface OpenClawProviderPreset {\n name: string;\n nameKey?: string; // i18n key for localized display name\n websiteUrl: string;\n apiKeyUrl?: string;\n /** OpenClaw settings_config structure */\n settingsConfig: OpenClawProviderConfig;\n isOfficial?: boolean;\n isPartner?: boolean;\n partnerPromotionKey?: string;\n category?: ProviderCategory;\n /** Template variable definitions */\n templateValues?: Record<string, TemplateValueConfig>;\n /** Visual theme config */\n theme?: PresetTheme;\n /** Icon name */\n icon?: string;\n /** Icon color */\n iconColor?: string;\n /** Mark as custom template (for UI distinction) */\n isCustomTemplate?: boolean;\n /** Suggested default model configuration */\n suggestedDefaults?: OpenClawSuggestedDefaults;\n}\n\nfunction rebaseOpenClawModelRef(modelRef: string, providerKey: string): string {\n const slashIndex = modelRef.indexOf(\"/\");\n return slashIndex === -1\n ? `${providerKey}/${modelRef}`\n : `${providerKey}${modelRef.slice(slashIndex)}`;\n}\n\n/**\n * OpenClaw default model refs are stored as \"<provider-key>/<model-id>\".\n * Presets carry stable built-in keys for display/tests, but the real key is\n * chosen in the add-provider form, so rewrite refs right before submission.\n */\nexport function rebaseOpenClawSuggestedDefaults(\n defaults: OpenClawSuggestedDefaults,\n providerKey: string,\n): OpenClawSuggestedDefaults {\n const key = providerKey.trim();\n if (!key) return defaults;\n\n return {\n model: defaults.model\n ? {\n ...defaults.model,\n primary: rebaseOpenClawModelRef(defaults.model.primary, key),\n fallbacks: defaults.model.fallbacks?.map((modelRef) =>\n rebaseOpenClawModelRef(modelRef, key),\n ),\n }\n : undefined,\n modelCatalog: defaults.modelCatalog\n ? Object.fromEntries(\n Object.entries(defaults.modelCatalog).map(([modelRef, entry]) => [\n rebaseOpenClawModelRef(modelRef, key),\n entry,\n ]),\n )\n : undefined,\n };\n}\n\n/**\n * OpenClaw API protocol options\n * @see https://github.com/openclaw/openclaw/blob/main/docs/gateway/configuration.md\n */\nexport const openclawApiProtocols = [\n { value: \"openai-completions\", label: \"OpenAI Completions\" },\n { value: \"openai-responses\", label: \"OpenAI Responses\" },\n { value: \"anthropic-messages\", label: \"Anthropic Messages\" },\n { value: \"google-generative-ai\", label: \"Google Generative AI\" },\n { value: \"bedrock-converse-stream\", label: \"AWS Bedrock\" },\n] as const;\n\n/**\n * OpenClaw provider presets list\n */\nexport const openclawProviderPresets: OpenClawProviderPreset[] = [\n {\n name: \"Shengsuanyun\",\n nameKey: \"providerForm.presets.shengsuanyun\",\n websiteUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n apiKeyUrl: \"https://www.shengsuanyun.com/?from=CH_4HHXMRYF\",\n settingsConfig: {\n baseUrl: \"https://router.shengsuanyun.com/api\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"shengsuanyun\",\n icon: \"shengsuanyun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"shengsuanyun/anthropic/claude-opus-4.8\",\n fallbacks: [\"shengsuanyun/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"shengsuanyun/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"shengsuanyun/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"火山Agentplan\",\n websiteUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.volcengine.com/activity/agentplan?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.cn-beijing.volces.com/api/coding/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ark-code-latest\",\n name: \"Ark Code Latest\",\n contextWindow: 256000,\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"volcengine_agentplan\",\n icon: \"huoshan\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"ark_agentplan/ark-code-latest\" },\n modelCatalog: {\n \"ark_agentplan/ark-code-latest\": { alias: \"Ark Code\" },\n },\n },\n },\n {\n name: \"BytePlus\",\n websiteUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://www.byteplus.com/en/product/modelark?utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.ap-southeast.bytepluses.com/api/coding/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ark-code-latest\",\n name: \"Ark Code Latest\",\n contextWindow: 256000,\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"byteplus\",\n icon: \"byteplus\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"byteplus/ark-code-latest\" },\n modelCatalog: {\n \"byteplus/ark-code-latest\": { alias: \"Ark Code\" },\n },\n },\n },\n {\n name: \"DouBaoSeed\",\n websiteUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n apiKeyUrl:\n \"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D&utm_campaign=hw&utm_content=OpenSunstar&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://ark.cn-beijing.volces.com/api/v3\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"doubao-seed-2-0-code-preview-latest\",\n name: \"DouBao Seed Code Preview\",\n contextWindow: 128000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"doubaoseed\",\n icon: \"doubao\",\n iconColor: \"#3370FF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"doubaoseed/doubao-seed-2-0-code-preview-latest\" },\n modelCatalog: {\n \"doubaoseed/doubao-seed-2-0-code-preview-latest\": { alias: \"DouBao\" },\n },\n },\n },\n {\n name: \"CCSub\",\n websiteUrl: \"https://www.ccsub.net\",\n apiKeyUrl: \"https://www.ccsub.net/register?ref=Y6Z8DXEA\",\n settingsConfig: {\n baseUrl: \"https://www.ccsub.net/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n cost: { input: 5, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"ccsub\",\n icon: \"ccsub\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"ccsub/gpt-5.5\",\n },\n modelCatalog: {\n \"ccsub/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n {\n name: \"Unity2.ai\",\n websiteUrl: \"https://unity2.ai\",\n apiKeyUrl: \"https://unity2.ai/register?source=ccs\",\n settingsConfig: {\n baseUrl: \"https://api.unity2.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n cost: { input: 5, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"unity2\",\n icon: \"unity2\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"unity2/gpt-5.5\",\n },\n modelCatalog: {\n \"unity2/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n // ========== Chinese Officials ==========\n {\n name: \"DeepSeek\",\n websiteUrl: \"https://platform.deepseek.com\",\n apiKeyUrl: \"https://platform.deepseek.com/api_keys\",\n settingsConfig: {\n baseUrl: \"https://api.deepseek.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"deepseek-v4-pro\",\n name: \"DeepSeek V4 Pro\",\n contextWindow: 1000000,\n cost: { input: 1.68, output: 3.36 },\n },\n {\n id: \"deepseek-v4-flash\",\n name: \"DeepSeek V4 Flash\",\n contextWindow: 1000000,\n cost: { input: 0.14, output: 0.28 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"deepseek\",\n iconColor: \"#1E88E5\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"deepseek/deepseek-v4-flash\",\n fallbacks: [\"deepseek/deepseek-v4-pro\"],\n },\n modelCatalog: {\n \"deepseek/deepseek-v4-flash\": { alias: \"Flash\" },\n \"deepseek/deepseek-v4-pro\": { alias: \"Pro\" },\n },\n },\n },\n {\n name: \"Zhipu GLM\",\n websiteUrl: \"https://open.bigmodel.cn\",\n apiKeyUrl: \"https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII\",\n settingsConfig: {\n baseUrl: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n defaultValue: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"zhipu/glm-5.1\" },\n modelCatalog: { \"zhipu/glm-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"Zhipu GLM en\",\n websiteUrl: \"https://z.ai\",\n apiKeyUrl: \"https://z.ai/subscribe?ic=8JVLJQFSKB\",\n settingsConfig: {\n baseUrl: \"https://api.z.ai/api/coding/paas/v4\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"zhipu\",\n iconColor: \"#0F62FE\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.z.ai/api/coding/paas/v4\",\n defaultValue: \"https://api.z.ai/api/coding/paas/v4\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"zhipu-en/glm-5.1\" },\n modelCatalog: { \"zhipu-en/glm-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"Qwen Coder\",\n websiteUrl: \"https://bailian.console.aliyun.com\",\n apiKeyUrl: \"https://bailian.console.aliyun.com/#/api-key\",\n settingsConfig: {\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"qwen3.5-plus\",\n name: \"Qwen3.5 Plus\",\n contextWindow: 32000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"qwen\",\n iconColor: \"#FF6A00\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n defaultValue: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"qwen/qwen3.5-plus\" },\n modelCatalog: { \"qwen/qwen3.5-plus\": { alias: \"Qwen\" } },\n },\n },\n {\n name: \"Kimi k2.6\",\n websiteUrl: \"https://platform.moonshot.cn/console?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.moonshot.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"kimi-k2.6\",\n name: \"Kimi K2.6\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.moonshot.cn/v1\",\n defaultValue: \"https://api.moonshot.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"kimi/kimi-k2.6\" },\n modelCatalog: { \"kimi/kimi-k2.6\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"Kimi For Coding\",\n websiteUrl: \"https://www.kimi.com/code/docs/?aff=OpenSunstar\",\n apiKeyUrl: \"https://platform.moonshot.cn/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.kimi.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"kimi-for-coding\",\n name: \"Kimi For Coding\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"kimi\",\n iconColor: \"#6366F1\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.kimi.com/v1\",\n defaultValue: \"https://api.kimi.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"kimi-coding/kimi-for-coding\" },\n modelCatalog: { \"kimi-coding/kimi-for-coding\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"StepFun\",\n websiteUrl: \"https://platform.stepfun.com/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.com/interface-key\",\n settingsConfig: {\n baseUrl: \"https://api.stepfun.com/step_plan/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextWindow: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextWindow: 262144,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.com/step_plan/v1\",\n defaultValue: \"https://api.stepfun.com/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"stepfun/step-3.5-flash-2603\" },\n modelCatalog: {\n \"stepfun/step-3.5-flash-2603\": { alias: \"StepFun\" },\n \"stepfun/step-3.5-flash\": { alias: \"StepFun Flash\" },\n },\n },\n },\n {\n name: \"StepFun en\",\n websiteUrl: \"https://platform.stepfun.ai/step-plan\",\n apiKeyUrl: \"https://platform.stepfun.ai/interface-key\",\n settingsConfig: {\n baseUrl: \"https://api.stepfun.ai/step_plan/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"step-3.5-flash-2603\",\n name: \"Step 3.5 Flash 2603\",\n contextWindow: 262144,\n },\n {\n id: \"step-3.5-flash\",\n name: \"Step 3.5 Flash\",\n contextWindow: 262144,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"stepfun\",\n iconColor: \"#16D6D2\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.stepfun.ai/step_plan/v1\",\n defaultValue: \"https://api.stepfun.ai/step_plan/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"step-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"stepfun-en/step-3.5-flash-2603\" },\n modelCatalog: {\n \"stepfun-en/step-3.5-flash-2603\": { alias: \"StepFun\" },\n \"stepfun-en/step-3.5-flash\": { alias: \"StepFun Flash\" },\n },\n },\n },\n {\n name: \"MiniMax\",\n websiteUrl: \"https://platform.minimaxi.com\",\n apiKeyUrl: \"https://platform.minimaxi.com/subscribe/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.minimaxi.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_cn\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"minimax/MiniMax-M2.7\" },\n modelCatalog: { \"minimax/MiniMax-M2.7\": { alias: \"MiniMax\" } },\n },\n },\n {\n name: \"MiniMax en\",\n websiteUrl: \"https://platform.minimax.io\",\n apiKeyUrl: \"https://platform.minimax.io/subscribe/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.minimax.io/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n isPartner: true,\n partnerPromotionKey: \"minimax_en\",\n theme: {\n backgroundColor: \"#f64551\",\n textColor: \"#FFFFFF\",\n },\n icon: \"minimax\",\n iconColor: \"#FF6B6B\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"minimax-en/MiniMax-M2.7\" },\n modelCatalog: { \"minimax-en/MiniMax-M2.7\": { alias: \"MiniMax\" } },\n },\n },\n {\n name: \"KAT-Coder\",\n websiteUrl: \"https://console.streamlake.ai\",\n apiKeyUrl: \"https://console.streamlake.ai/console/api-key\",\n settingsConfig: {\n baseUrl:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"KAT-Coder-Pro\",\n name: \"KAT-Coder Pro\",\n contextWindow: 128000,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"catcoder\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n defaultValue:\n \"https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai\",\n editorValue: \"\",\n },\n ENDPOINT_ID: {\n label: \"Endpoint ID\",\n placeholder: \"\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"katcoder/KAT-Coder-Pro\" },\n modelCatalog: { \"katcoder/KAT-Coder-Pro\": { alias: \"KAT-Coder\" } },\n },\n },\n {\n name: \"Longcat\",\n websiteUrl: \"https://longcat.chat/platform\",\n apiKeyUrl: \"https://longcat.chat/platform/api_keys\",\n settingsConfig: {\n baseUrl: \"https://api.longcat.chat/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n authHeader: true,\n models: [\n {\n id: \"LongCat-Flash-Chat\",\n name: \"LongCat Flash Chat\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"longcat\",\n iconColor: \"#29E154\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.longcat.chat/v1\",\n defaultValue: \"https://api.longcat.chat/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"longcat/LongCat-Flash-Chat\" },\n modelCatalog: { \"longcat/LongCat-Flash-Chat\": { alias: \"LongCat\" } },\n },\n },\n {\n name: \"BaiLing\",\n websiteUrl: \"https://alipaytbox.yuque.com/sxs0ba/ling/get_started\",\n settingsConfig: {\n baseUrl: \"https://api.tbox.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"Ling-2.5-1T\",\n name: \"Ling 2.5 1T\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"cn_official\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"bailing/Ling-2.5-1T\" },\n modelCatalog: { \"bailing/Ling-2.5-1T\": { alias: \"BaiLing\" } },\n },\n },\n {\n name: \"Xiaomi MiMo\",\n websiteUrl: \"https://platform.xiaomimimo.com\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/api-keys\",\n settingsConfig: {\n baseUrl: \"https://api.xiaomimimo.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"mimo-v2.5-pro\",\n name: \"MiMo V2.5 Pro\",\n reasoning: true,\n input: [\"text\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n cost: { input: 1, output: 3, cacheRead: 0.2, cacheWrite: 0 },\n },\n ],\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"xiaomimimo/mimo-v2.5-pro\" },\n modelCatalog: { \"xiaomimimo/mimo-v2.5-pro\": { alias: \"MiMo\" } },\n },\n },\n {\n name: \"Xiaomi MiMo Token Plan (China)\",\n websiteUrl: \"https://platform.xiaomimimo.com/#/token-plan\",\n apiKeyUrl: \"https://platform.xiaomimimo.com/#/console/plan-manage\",\n settingsConfig: {\n baseUrl: \"https://token-plan-cn.xiaomimimo.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"mimo-v2.5-pro\",\n name: \"MiMo V2.5 Pro\",\n reasoning: true,\n input: [\"text\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n },\n {\n id: \"mimo-v2.5\",\n name: \"MiMo V2.5\",\n reasoning: true,\n input: [\"text\", \"image\"],\n contextWindow: 1048576,\n maxTokens: 131072,\n },\n ],\n },\n category: \"cn_official\",\n icon: \"xiaomimimo\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"Token Plan API Key\",\n placeholder: \"tp-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"xiaomi-mimo-token-plan/mimo-v2.5-pro\" },\n modelCatalog: {\n \"xiaomi-mimo-token-plan/mimo-v2.5-pro\": {\n alias: \"MiMo Token Plan (China)\",\n },\n \"xiaomi-mimo-token-plan/mimo-v2.5\": {\n alias: \"MiMo Token Plan (China) Multimodal\",\n },\n },\n },\n },\n\n // ========== Aggregators ==========\n {\n name: \"AiHubMix\",\n websiteUrl: \"https://aihubmix.com\",\n apiKeyUrl: \"https://aihubmix.com\",\n settingsConfig: {\n baseUrl: \"https://aihubmix.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"aihubmix\",\n iconColor: \"#006FFB\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aihubmix/claude-opus-4-8\",\n fallbacks: [\"aihubmix/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aihubmix/claude-opus-4-8\": { alias: \"Opus\" },\n \"aihubmix/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"CherryIN\",\n websiteUrl: \"https://open.cherryin.ai\",\n apiKeyUrl: \"https://open.cherryin.ai/console/token\",\n settingsConfig: {\n baseUrl: \"https://open.cherryin.net\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n ],\n },\n category: \"aggregator\",\n icon: \"cherryin\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"cherryin/anthropic/claude-opus-4.8\",\n fallbacks: [\"cherryin/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"cherryin/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"cherryin/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"DMXAPI\",\n websiteUrl: \"https://www.dmxapi.cn\",\n apiKeyUrl: \"https://www.dmxapi.cn\",\n settingsConfig: {\n baseUrl: \"https://www.dmxapi.cn\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"dmxapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"dmxapi/claude-opus-4-8\",\n fallbacks: [\"dmxapi/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"dmxapi/claude-opus-4-8\": { alias: \"Opus\" },\n \"dmxapi/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"ClaudeCN\",\n websiteUrl: \"https://claudecn.top\",\n apiKeyUrl: \"https://claudecn.top/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://claudecn.top\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"claudecn\",\n icon: \"claudecn\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"claudecn/claude-sonnet-4-6\",\n },\n modelCatalog: {\n \"claudecn/claude-opus-4-8\": { alias: \"Opus\" },\n \"claudecn/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"claudecn/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"RunAPI\",\n websiteUrl: \"https://runapi.co\",\n apiKeyUrl: \"https://runapi.co\",\n settingsConfig: {\n baseUrl: \"https://runapi.co\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"runapi\",\n icon: \"runapi\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"runapi/claude-sonnet-4-6\",\n },\n modelCatalog: {\n \"runapi/claude-opus-4-8\": { alias: \"Opus\" },\n \"runapi/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"runapi/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"OpenRouter\",\n websiteUrl: \"https://openrouter.ai\",\n apiKeyUrl: \"https://openrouter.ai/keys\",\n settingsConfig: {\n baseUrl: \"https://openrouter.ai/api/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"anthropic/claude-opus-4.8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"openrouter\",\n iconColor: \"#6566F1\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-or-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"openrouter/anthropic/claude-opus-4.8\",\n fallbacks: [\"openrouter/anthropic/claude-sonnet-4.6\"],\n },\n modelCatalog: {\n \"openrouter/anthropic/claude-opus-4.8\": { alias: \"Opus\" },\n \"openrouter/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"TheRouter\",\n websiteUrl: \"https://therouter.ai\",\n apiKeyUrl: \"https://dashboard.therouter.ai\",\n settingsConfig: {\n baseUrl: \"https://api.therouter.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"anthropic/claude-sonnet-4.6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },\n },\n {\n id: \"openai/gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n contextWindow: 400000,\n cost: { input: 5, output: 40, cacheRead: 0.5 },\n },\n {\n id: \"openai/gpt-5.2\",\n name: \"GPT-5.2\",\n contextWindow: 400000,\n cost: { input: 1.75, output: 14, cacheRead: 0.175 },\n },\n {\n id: \"google/gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n contextWindow: 1000000,\n cost: { input: 1.5, output: 9, cacheRead: 0.15 },\n },\n {\n id: \"qwen/qwen3-coder-480b\",\n name: \"Qwen3 Coder 480B\",\n contextWindow: 262144,\n cost: { input: 0.6, output: 2.35 },\n },\n ],\n },\n category: \"aggregator\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"therouter/anthropic/claude-sonnet-4.6\",\n fallbacks: [\n \"therouter/openai/gpt-5.2\",\n \"therouter/google/gemini-3.5-flash\",\n ],\n },\n modelCatalog: {\n \"therouter/anthropic/claude-sonnet-4.6\": { alias: \"Sonnet\" },\n \"therouter/openai/gpt-5.2\": { alias: \"GPT-5.2\" },\n \"therouter/google/gemini-3.5-flash\": { alias: \"Gemini Flash\" },\n \"therouter/openai/gpt-5.3-codex\": { alias: \"Codex\" },\n \"therouter/qwen/qwen3-coder-480b\": { alias: \"Qwen Coder\" },\n },\n },\n },\n {\n name: \"ModelScope\",\n websiteUrl: \"https://modelscope.cn\",\n apiKeyUrl: \"https://modelscope.cn/my/myaccesstoken\",\n settingsConfig: {\n baseUrl: \"https://api-inference.modelscope.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"ZhipuAI/GLM-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 128000,\n cost: { input: 0.001, output: 0.001 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"modelscope\",\n iconColor: \"#624AFF\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api-inference.modelscope.cn/v1\",\n defaultValue: \"https://api-inference.modelscope.cn/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"modelscope/ZhipuAI/GLM-5.1\" },\n modelCatalog: { \"modelscope/ZhipuAI/GLM-5.1\": { alias: \"GLM\" } },\n },\n },\n {\n name: \"SiliconFlow\",\n websiteUrl: \"https://siliconflow.cn\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n settingsConfig: {\n baseUrl: \"https://api.siliconflow.cn/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"Pro/MiniMaxAI/MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#6E29F6\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"siliconflow/Pro/MiniMaxAI/MiniMax-M2.7\" },\n modelCatalog: {\n \"siliconflow/Pro/MiniMaxAI/MiniMax-M2.7\": { alias: \"MiniMax\" },\n },\n },\n },\n {\n name: \"SiliconFlow en\",\n websiteUrl: \"https://siliconflow.com\",\n apiKeyUrl: \"https://cloud.siliconflow.cn/i/drGuwc9k\",\n settingsConfig: {\n baseUrl: \"https://api.siliconflow.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"MiniMaxAI/MiniMax-M2.7\",\n name: \"MiniMax M2.7\",\n contextWindow: 200000,\n cost: { input: 0.001, output: 0.004 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"siliconflow\",\n icon: \"siliconflow\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"siliconflow-en/MiniMaxAI/MiniMax-M2.7\" },\n modelCatalog: {\n \"siliconflow-en/MiniMaxAI/MiniMax-M2.7\": { alias: \"MiniMax\" },\n },\n },\n },\n {\n name: \"Novita AI\",\n websiteUrl: \"https://novita.ai\",\n apiKeyUrl: \"https://novita.ai\",\n settingsConfig: {\n baseUrl: \"https://api.novita.ai/openai\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"zai-org/glm-5.1\",\n name: \"GLM-5.1\",\n contextWindow: 202800,\n cost: { input: 1, output: 3.2, cacheRead: 0.2 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"novita\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"novita/zai-org/glm-5.1\" },\n modelCatalog: {\n \"novita/zai-org/glm-5.1\": { alias: \"GLM-5.1\" },\n },\n },\n },\n {\n name: \"Nvidia\",\n websiteUrl: \"https://build.nvidia.com\",\n apiKeyUrl: \"https://build.nvidia.com/settings/api-keys\",\n settingsConfig: {\n baseUrl: \"https://integrate.api.nvidia.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"moonshotai/kimi-k2.5\",\n name: \"Kimi K2.5\",\n contextWindow: 131072,\n cost: { input: 0.002, output: 0.006 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"nvidia\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"nvapi-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: { primary: \"nvidia/moonshotai/kimi-k2.5\" },\n modelCatalog: { \"nvidia/moonshotai/kimi-k2.5\": { alias: \"Kimi\" } },\n },\n },\n {\n name: \"PIPELLM\",\n websiteUrl: \"https://code.pipellm.ai\",\n apiKeyUrl: \"https://code.pipellm.ai/login?ref=uvw650za\",\n settingsConfig: {\n baseUrl: \"https://cc-api.pipellm.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"claude-opus-4-8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"claude-sonnet-4-6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n name: \"claude-haiku-4-5-20251001\",\n contextWindow: 200000,\n cost: { input: 0.8, output: 4 },\n },\n ],\n },\n category: \"aggregator\",\n icon: \"pipellm\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"pipe-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"pipellm/claude-opus-4-8\",\n fallbacks: [\"pipellm/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"pipellm/claude-opus-4-8\": { alias: \"Opus\" },\n \"pipellm/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"pipellm/claude-haiku-4-5-20251001\": { alias: \"Haiku\" },\n },\n },\n },\n\n // ========== Third Party Partners ==========\n {\n name: \"PackyCode\",\n websiteUrl: \"https://www.packyapi.com\",\n apiKeyUrl: \"https://www.packyapi.com/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://www.packyapi.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"packycode\",\n icon: \"packycode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"packycode/claude-opus-4-8\",\n fallbacks: [\"packycode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"packycode/claude-opus-4-8\": { alias: \"Opus\" },\n \"packycode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"APIKEY.FUN\",\n websiteUrl: \"https://apikey.fun\",\n apiKeyUrl: \"https://apikey.fun/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.apikey.fun\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n },\n {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apikeyfun\",\n icon: \"apikeyfun\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"apikeyfun/claude-opus-4-8\",\n fallbacks: [\"apikeyfun/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"apikeyfun/claude-opus-4-8\": { alias: \"Opus\" },\n \"apikeyfun/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n \"apikeyfun/claude-haiku-4-5\": { alias: \"Haiku\" },\n },\n },\n },\n {\n name: \"APINebula\",\n websiteUrl: \"https://apinebula.com\",\n apiKeyUrl: \"https://apinebula.com/02rw5X\",\n settingsConfig: {\n baseUrl: \"https://apinebula.com/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"apinebula\",\n icon: \"apinebula\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"apinebula/gpt-5.5\",\n },\n },\n },\n {\n name: \"AtlasCloud\",\n websiteUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n apiKeyUrl: \"https://www.atlascloud.ai/console/coding-plan\",\n settingsConfig: {\n baseUrl: \"https://api.atlascloud.ai/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"zai-org/glm-5.1\",\n name: \"GLM 5.1\",\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true,\n partnerPromotionKey: \"atlascloud\",\n icon: \"atlascloud\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"atlascloud/zai-org/glm-5.1\",\n },\n },\n },\n {\n name: \"SudoCode\",\n websiteUrl: \"https://sudocode.us\",\n apiKeyUrl: \"https://sudocode.us\",\n settingsConfig: {\n baseUrl: \"https://sudocode.us/v1\",\n apiKey: \"\",\n api: \"openai-responses\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sudocode\",\n icon: \"sudocode\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"sudocode/gpt-5.5\",\n },\n },\n },\n {\n name: \"Cubence\",\n websiteUrl: \"https://cubence.com\",\n apiKeyUrl: \"https://cubence.com/signup?code=OpenSunstar&source=ccs\",\n settingsConfig: {\n baseUrl: \"https://api.cubence.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"cubence\",\n icon: \"cubence\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"cubence/claude-opus-4-8\",\n fallbacks: [\"cubence/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"cubence/claude-opus-4-8\": { alias: \"Opus\" },\n \"cubence/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"AIGoCode\",\n websiteUrl: \"https://aigocode.com\",\n apiKeyUrl: \"https://aigocode.com/invite/OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.aigocode.com\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aigocode\",\n icon: \"aigocode\",\n iconColor: \"#5B7FFF\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aigocode/claude-opus-4-8\",\n fallbacks: [\"aigocode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aigocode/claude-opus-4-8\": { alias: \"Opus\" },\n \"aigocode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"RightCode\",\n websiteUrl: \"https://www.right.codes\",\n apiKeyUrl: \"https://www.right.codes/register?aff=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://www.right.codes/claude\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"rightcode\",\n icon: \"rc\",\n iconColor: \"#E96B2C\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"rightcode/claude-opus-4-8\",\n fallbacks: [\"rightcode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"rightcode/claude-opus-4-8\": { alias: \"Opus\" },\n \"rightcode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"AICodeMirror\",\n websiteUrl: \"https://www.aicodemirror.com\",\n apiKeyUrl: \"https://www.aicodemirror.com/register?invitecode=9915W3\",\n settingsConfig: {\n baseUrl: \"https://api.aicodemirror.com/api/claudecode\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"aicodemirror\",\n icon: \"aicodemirror\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"aicodemirror/claude-opus-4-8\",\n fallbacks: [\"aicodemirror/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"aicodemirror/claude-opus-4-8\": { alias: \"Opus\" },\n \"aicodemirror/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"CrazyRouter\",\n websiteUrl: \"https://www.crazyrouter.com\",\n apiKeyUrl: \"https://www.crazyrouter.com/register?aff=OZcm&ref=OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://cn.crazyrouter.com/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"crazyrouter\",\n icon: \"crazyrouter\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"crazyrouter/claude-opus-4-8\",\n fallbacks: [\"crazyrouter/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"crazyrouter/claude-opus-4-8\": { alias: \"Opus\" },\n \"crazyrouter/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"SSSAiCode\",\n websiteUrl: \"https://sssaicodeapi.com\",\n apiKeyUrl: \"https://sssaicodeapi.com/register?ref=DCP0SM\",\n settingsConfig: {\n baseUrl: \"https://node-hk.sssaicodeapi.com/api\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"sssaicode\",\n icon: \"sssaicode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"sssaicode/claude-opus-4-8\",\n fallbacks: [\"sssaicode/claude-sonnet-4-6\"],\n },\n modelCatalog: {\n \"sssaicode/claude-opus-4-8\": { alias: \"Opus\" },\n \"sssaicode/claude-sonnet-4-6\": { alias: \"Sonnet\" },\n },\n },\n },\n {\n name: \"Compshare\",\n nameKey: \"providerForm.presets.ucloud\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://api.modelverse.cn/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true, // 合作伙伴\n partnerPromotionKey: \"ucloud\", // 促销信息 i18n key\n icon: \"ucloud\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"compshare/claude-opus-4-8\",\n },\n modelCatalog: {\n \"compshare/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"Compshare Coding Plan\",\n nameKey: \"providerForm.presets.ucloudCoding\",\n websiteUrl: \"https://www.compshare.cn\",\n apiKeyUrl:\n \"https://www.compshare.cn/coding-plan?ytag=GPU_YY_YX_git_OpenSunstar\",\n settingsConfig: {\n baseUrl: \"https://cp.compshare.cn/v1\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"aggregator\",\n isPartner: true, // 合作伙伴\n partnerPromotionKey: \"ucloud\", // 促销信息 i18n key(复用)\n icon: \"ucloud\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"compshare-coding/claude-opus-4-8\",\n },\n modelCatalog: {\n \"compshare-coding/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"Micu\",\n websiteUrl: \"https://www.micuapi.ai\",\n apiKeyUrl: \"https://www.micuapi.ai/register?aff=aOYQ\",\n settingsConfig: {\n baseUrl: \"https://www.micuapi.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"micu\",\n icon: \"micu\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"micu/claude-opus-4-8\",\n },\n modelCatalog: {\n \"micu/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"CTok.ai\",\n websiteUrl: \"https://ctok.ai\",\n apiKeyUrl: \"https://ctok.ai\",\n settingsConfig: {\n baseUrl: \"https://api.ctok.ai\",\n apiKey: \"\",\n api: \"anthropic-messages\",\n models: [\n {\n id: \"claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25 },\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"ctok\",\n icon: \"ctok\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"ctok/claude-opus-4-8\",\n },\n modelCatalog: {\n \"ctok/claude-opus-4-8\": { alias: \"Opus\" },\n },\n },\n },\n {\n name: \"E-FlowCode\",\n websiteUrl: \"https://e-flowcode.cc\",\n apiKeyUrl: \"https://e-flowcode.cc\",\n settingsConfig: {\n api: \"openai-responses\",\n apiKey: \"\",\n baseUrl: \"https://e-flowcode.cc/v1\",\n headers: {\n \"User-Agent\":\n \"codex_cli_rs/0.77.0 (Windows 10.0.26100; x86_64) WindowsTerminal\",\n },\n models: [\n {\n contextWindow: 200000,\n cost: {\n cacheRead: 0,\n cacheWrite: 0,\n input: 0,\n output: 0,\n },\n id: \"gpt-5.3-codex\",\n maxTokens: 32000,\n name: \"gpt-5.3-codex\",\n },\n {\n id: \"gpt-5.5\",\n name: \"gpt-5.5\",\n },\n {\n id: \"gpt-5.2-codex\",\n name: \"gpt-5.2-codex\",\n },\n {\n id: \"gpt-5.2\",\n name: \"gpt-5.2\",\n },\n ],\n },\n category: \"third_party\",\n icon: \"eflowcode\",\n iconColor: \"#000000\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"sk-...\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"eflowcode/gpt-5.3-codex\",\n fallbacks: [\"eflowcode/gpt-5.5\", \"eflowcode/gpt-5.2-codex\"],\n },\n modelCatalog: {\n \"eflowcode/gpt-5.3-codex\": { alias: \"gpt-5.3-codex\" },\n \"eflowcode/gpt-5.5\": { alias: \"gpt-5.5\" },\n \"eflowcode/gpt-5.2-codex\": { alias: \"gpt-5.2-codex\" },\n \"eflowcode/gpt-5.2\": { alias: \"gpt-5.2\" },\n },\n },\n },\n {\n name: \"LemonData\",\n websiteUrl: \"https://lemondata.cc\",\n apiKeyUrl: \"https://lemondata.cc/r/FFX1ZDUP\",\n settingsConfig: {\n baseUrl: \"https://api.lemondata.cc/v1\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [\n {\n id: \"gpt-5.5\",\n name: \"GPT-5.5\",\n contextWindow: 400000,\n },\n ],\n },\n category: \"third_party\",\n isPartner: true,\n partnerPromotionKey: \"lemondata\",\n icon: \"lemondata\",\n templateValues: {\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n suggestedDefaults: {\n model: {\n primary: \"lemondata/gpt-5.5\",\n },\n modelCatalog: {\n \"lemondata/gpt-5.5\": { alias: \"GPT-5.5\" },\n },\n },\n },\n // ========== Cloud Providers ==========\n {\n name: \"AWS Bedrock\",\n websiteUrl: \"https://aws.amazon.com/bedrock/\",\n settingsConfig: {\n // 请将 us-west-2 替换为你的 AWS Region\n baseUrl: \"https://bedrock-runtime.us-west-2.amazonaws.com\",\n apiKey: \"\",\n api: \"bedrock-converse-stream\",\n models: [\n {\n id: \"anthropic.claude-opus-4-8\",\n name: \"Claude Opus 4.8\",\n contextWindow: 1000000,\n cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },\n },\n {\n id: \"anthropic.claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n contextWindow: 1000000,\n cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },\n },\n {\n id: \"anthropic.claude-haiku-4-5-20251022-v1:0\",\n name: \"Claude Haiku 4.5\",\n contextWindow: 200000,\n cost: { input: 0.8, output: 4, cacheRead: 0.08, cacheWrite: 1 },\n },\n ],\n },\n category: \"cloud_provider\",\n icon: \"aws\",\n iconColor: \"#FF9900\",\n },\n\n // ========== Custom Template ==========\n {\n name: \"OpenAI Compatible\",\n websiteUrl: \"\",\n settingsConfig: {\n baseUrl: \"\",\n apiKey: \"\",\n api: \"openai-completions\",\n models: [],\n },\n category: \"custom\",\n isCustomTemplate: true,\n icon: \"generic\",\n iconColor: \"#6B7280\",\n templateValues: {\n baseUrl: {\n label: \"Base URL\",\n placeholder: \"https://api.example.com/v1\",\n editorValue: \"\",\n },\n apiKey: {\n label: \"API Key\",\n placeholder: \"\",\n editorValue: \"\",\n },\n },\n },\n];\n"}}, "src-tauri/src/services/stream_check.rs": {"bdce254c7fea9f5b4c6dd495ef89f78205283847": {"t": 1786068398.2461996, "n": 82426, "h": "dc3c754b7eef40b1", "c": "//! 流式健康检查服务\n//!\n//! 使用流式 API 进行快速健康检查,只需接收首个 chunk 即判定成功。\n\nuse futures::StreamExt;\nuse reqwest::Client;\nuse serde::{Deserialize, Serialize};\nuse serde_json::json;\nuse std::time::Instant;\n\nuse crate::app_config::AppType;\nuse crate::error::AppError;\nuse crate::provider::Provider;\nuse crate::proxy::gemini_url::{normalize_gemini_model_id, resolve_gemini_native_url};\nuse crate::proxy::providers::copilot_auth;\nuse crate::proxy::providers::transform::anthropic_to_openai;\nuse crate::proxy::providers::transform_gemini::anthropic_to_gemini;\nuse crate::proxy::providers::transform_responses::anthropic_to_responses;\nuse crate::proxy::providers::{\n get_adapter, AuthInfo, AuthStrategy, ClaudeAdapter, ProviderAdapter,\n};\n\n/// 健康状态枚举\n#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]\n#[serde(rename_all = \"lowercase\")]\npub enum HealthStatus {\n Operational,\n Degraded,\n Failed,\n}\n\n/// 流式检查配置\n#[derive(Debug, Clone, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct StreamCheckConfig {\n pub timeout_secs: u64,\n pub max_retries: u32,\n pub degraded_threshold_ms: u64,\n /// Claude 测试模型\n pub claude_model: String,\n /// Codex 测试模型\n pub codex_model: String,\n /// Gemini 测试模型\n pub gemini_model: String,\n /// 检查提示词\n #[serde(default = \"default_test_prompt\")]\n pub test_prompt: String,\n}\n\nfn default_test_prompt() -> String {\n \"Who are you?\".to_string()\n}\n\nimpl Default for StreamCheckConfig {\n fn default() -> Self {\n Self {\n timeout_secs: 45,\n max_retries: 2,\n degraded_threshold_ms: 6000,\n claude_model: \"claude-haiku-4-5-20251001\".to_string(),\n codex_model: \"gpt-5.6-sol@low\".to_string(),\n gemini_model: \"gemini-3.5-flash\".to_string(),\n test_prompt: default_test_prompt(),\n }\n }\n}\n\n/// 流式检查结果\n#[derive(Debug, Clone, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct StreamCheckResult {\n pub status: HealthStatus,\n pub success: bool,\n pub message: String,\n pub response_time_ms: Option<u64>,\n pub http_status: Option<u16>,\n pub model_used: String,\n pub tested_at: i64,\n pub retry_count: u32,\n /// 细粒度错误分类(如 \"modelNotFound\"),前端据此渲染专门的文案\n #[serde(skip_serializing_if = \"Option::is_none\")]\n pub error_category: Option<String>,\n}\n\n/// 流式健康检查服务\npub struct StreamCheckService;\n\nimpl StreamCheckService {\n /// 执行流式健康检查(带重试)\n ///\n /// 如果 Provider 配置了单独的测试配置(meta.testConfig),则使用该配置覆盖全局配置\n pub async fn check_with_retry(\n app_type: &AppType,\n provider: &Provider,\n config: &StreamCheckConfig,\n auth_override: Option<AuthInfo>,\n base_url_override: Option<String>,\n claude_api_format_override: Option<String>,\n ) -> Result<StreamCheckResult, AppError> {\n // 合并供应商单独配置和全局配置\n let effective_config = Self::merge_provider_config(provider, config);\n let mut last_result = None;\n\n for attempt in 0..=effective_config.max_retries {\n let result = Self::check_once(\n app_type,\n provider,\n &effective_config,\n auth_override.clone(),\n base_url_override.clone(),\n claude_api_format_override.clone(),\n )\n .await;\n\n match &result {\n Ok(r) if r.success => {\n return Ok(StreamCheckResult {\n retry_count: attempt,\n ..r.clone()\n });\n }\n Ok(r) => {\n // 失败但非异常,判断是否重试\n if Self::should_retry(&r.message) && attempt < effective_config.max_retries {\n last_result = Some(r.clone());\n continue;\n }\n return Ok(StreamCheckResult {\n retry_count: attempt,\n ..r.clone()\n });\n }\n Err(e) => {\n if Self::should_retry(&e.to_string()) && attempt < effective_config.max_retries\n {\n continue;\n }\n return Err(AppError::Message(e.to_string()));\n }\n }\n }\n\n Ok(last_result.unwrap_or_else(|| StreamCheckResult {\n status: HealthStatus::Failed,\n success: false,\n message: \"Check failed\".to_string(),\n response_time_ms: None,\n http_status: None,\n model_used: String::new(),\n tested_at: chrono::Utc::now().timestamp(),\n retry_count: effective_config.max_retries,\n error_category: None,\n }))\n }\n\n /// 合并供应商单独配置和全局配置\n ///\n /// 如果供应商配置了 meta.testConfig 且 enabled 为 true,则使用供应商配置覆盖全局配置\n fn merge_provider_config(\n provider: &Provider,\n global_config: &StreamCheckConfig,\n ) -> StreamCheckConfig {\n let test_config = provider\n .meta\n .as_ref()\n .and_then(|m| m.test_config.as_ref())\n .filter(|tc| tc.enabled);\n\n match test_config {\n Some(tc) => StreamCheckConfig {\n timeout_secs: tc.timeout_secs.unwrap_or(global_config.timeout_secs),\n max_retries: tc.max_retries.unwrap_or(global_config.max_retries),\n degraded_threshold_ms: tc\n .degraded_threshold_ms\n .unwrap_or(global_config.degraded_threshold_ms),\n claude_model: tc\n .test_model\n .clone()\n .unwrap_or_else(|| global_config.claude_model.clone()),\n codex_model: tc\n .test_model\n .clone()\n .unwrap_or_else(|| global_config.codex_model.clone()),\n gemini_model: tc\n .test_model\n .clone()\n .unwrap_or_else(|| global_config.gemini_model.clone()),\n test_prompt: tc\n .test_prompt\n .clone()\n .unwrap_or_else(|| global_config.test_prompt.clone()),\n },\n None => global_config.clone(),\n }\n }\n\n /// 单次流式检查\n async fn check_once(\n app_type: &AppType,\n provider: &Provider,\n config: &StreamCheckConfig,\n auth_override: Option<AuthInfo>,\n base_url_override: Option<String>,\n claude_api_format_override: Option<String>,\n ) -> Result<StreamCheckResult, AppError> {\n let start = Instant::now();\n\n // OpenCode / OpenClaw 的 settings_config 结构与 Claude/Codex/Gemini 不同\n // (baseUrl / apiKey 直接作为根字段而非嵌套在 env),并且协议由 `api`\n // 或 `npm` 字段显式指定。它们不走 get_adapter 路径,而是直接分发。\n if matches!(\n app_type,\n AppType::OpenCode | AppType::OpenClaw | AppType::Hermes\n ) {\n return Self::check_once_without_adapter(app_type, provider, config, start).await;\n }\n\n let adapter: Box<dyn ProviderAdapter> = if matches!(app_type, AppType::ClaudeDesktop) {\n Box::new(ClaudeAdapter::new())\n } else {\n get_adapter(app_type)\n };\n\n let base_url = match base_url_override {\n Some(base_url) => base_url,\n None => adapter\n .extract_base_url(provider)\n .map_err(|e| AppError::Message(format!(\"Failed to extract base_url: {e}\")))?,\n };\n\n let auth = auth_override\n .or_else(|| adapter.extract_auth(provider))\n .ok_or_else(|| AppError::Message(\"API Key not found\".to_string()))?;\n\n // 获取 HTTP 客户端\n let client = crate::proxy::http_client::get();\n let request_timeout = std::time::Duration::from_secs(config.timeout_secs);\n\n let model_to_test = Self::resolve_test_model(app_type, provider, config);\n let test_prompt = &config.test_prompt;\n\n let result = match app_type {\n AppType::Claude | AppType::ClaudeDesktop => {\n Self::check_claude_stream(\n &client,\n &base_url,\n &auth,\n &model_to_test,\n test_prompt,\n request_timeout,\n provider,\n claude_api_format_override.as_deref(),\n None,\n )\n .await\n }\n AppType::Codex | AppType::GrokBuild => {\n Self::check_codex_stream(\n &client,\n &base_url,\n &auth,\n &model_to_test,\n test_prompt,\n request_timeout,\n provider,\n )\n .await\n }\n AppType::Gemini => {\n Self::check_gemini_stream(\n &client,\n &base_url,\n &auth,\n &model_to_test,\n test_prompt,\n request_timeout,\n None,\n )\n .await\n }\n AppType::OpenCode | AppType::OpenClaw | AppType::Hermes => {\n // Already handled via early dispatch above\n unreachable!(\"OpenCode/OpenClaw/Hermes 已通过 check_once_without_adapter 处理\")\n }\n };\n\n let response_time = start.elapsed().as_millis() as u64;\n Ok(Self::build_stream_check_result(\n result,\n response_time,\n config.degraded_threshold_ms,\n &model_to_test,\n ))\n }\n\n /// Provider 级自定义 User-Agent(`meta.customUserAgent`),经 `parse_custom_user_agent` 校验。\n ///\n /// 与 forwarder 转发路径(`RequestForwarder::forward`)、model_fetch 共用单一口径:trim、\n /// 空串视为未设置、**非法值静默忽略**(返回 `None`,不报错)。Stream Check 必须复用同一个\n /// UA 去探测,否则会与真实流量用不同的 User-Agent(例如 Kimi Coding Plan 的 UA 白名单),\n /// 导致\"检测失败但代理可用\"或反之的分歧——非法 UA 时尤甚(转发静默丢弃、检测却会因\n /// reqwest 非法头在 `.send()` 报错)。\n fn custom_user_agent(provider: &Provider) -> Option<reqwest::header::HeaderValue> {\n provider\n .meta\n .as_ref()\n .and_then(|meta| meta.custom_user_agent_header().ok().flatten())\n }\n\n /// Claude 流式检查\n ///\n /// 根据供应商的 api_format 选择请求格式:\n /// - \"anthropic\" (默认): Anthropic Messages API (/v1/messages)\n /// - \"openai_chat\": OpenAI Chat Completions API (/v1/chat/completions)\n /// - \"openai_responses\": OpenAI Responses API (/v1/responses)\n /// - \"gemini_native\": Gemini Native streamGenerateContent\n ///\n /// `extra_headers` 是一个可选的供应商级自定义 header 集合(从 OpenClaw\n /// 的 `settings_config.headers` 或 OpenCode 的 `settings_config.options.headers`\n /// 读取),在所有内置 header 之后追加,用于覆盖或补充(例如自定义 User-Agent)。\n #[allow(clippy::too_many_arguments)]\n async fn check_claude_stream(\n client: &Client,\n base_url: &str,\n auth: &AuthInfo,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n provider: &Provider,\n claude_api_format_override: Option<&str>,\n extra_headers: Option<&serde_json::Map<String, serde_json::Value>>,\n ) -> Result<(u16, String), AppError> {\n let base = base_url.trim_end_matches('/');\n let is_github_copilot = auth.strategy == AuthStrategy::GitHubCopilot;\n\n // Detect api_format: meta.api_format > settings_config.api_format > default \"anthropic\"\n let api_format = provider\n .meta\n .as_ref()\n .and_then(|m| m.api_format.as_deref())\n .or_else(|| {\n provider\n .settings_config\n .get(\"api_format\")\n .and_then(|v| v.as_str())\n })\n .unwrap_or(\"anthropic\");\n\n let effective_api_format = claude_api_format_override.unwrap_or(api_format);\n\n let is_full_url = provider\n .meta\n .as_ref()\n .and_then(|meta| meta.is_full_url)\n .unwrap_or(false);\n let is_openai_chat = effective_api_format == \"openai_chat\";\n let is_openai_responses = effective_api_format == \"openai_responses\";\n let is_gemini_native = effective_api_format == \"gemini_native\";\n let url = Self::resolve_claude_stream_url(\n base,\n auth.strategy,\n effective_api_format,\n is_full_url,\n model,\n );\n\n let max_tokens = if is_openai_responses { 16 } else { 1 };\n\n // Build from Anthropic-native shape first, then convert for configured targets.\n let anthropic_body = json!({\n \"model\": model,\n \"max_tokens\": max_tokens,\n \"messages\": [{ \"role\": \"user\", \"content\": test_prompt }],\n \"stream\": true\n });\n // Codex OAuth (ChatGPT Plus/Pro 反代) 需要 store:false + include 标记,\n // 否则 Stream Check 会和生产路径一样被服务端 400 拒绝。\n let is_codex_oauth = provider.is_codex_oauth();\n let codex_fast_mode = provider.codex_fast_mode_enabled();\n\n let body = if is_openai_responses {\n anthropic_to_responses(\n anthropic_body,\n Some(&provider.id),\n is_codex_oauth,\n codex_fast_mode,\n )\n .map_err(|e| AppError::Message(format!(\"Failed to build test request: {e}\")))?\n } else if is_gemini_native {\n anthropic_to_gemini(anthropic_body)\n .map_err(|e| AppError::Message(format!(\"Failed to build test request: {e}\")))?\n } else if is_openai_chat {\n anthropic_to_openai(anthropic_body)\n .map_err(|e| AppError::Message(format!(\"Failed to build test request: {e}\")))?\n } else {\n anthropic_body\n };\n\n let mut request_builder = client.post(&url);\n\n if is_github_copilot {\n // 生成请求追踪 ID\n let request_id = uuid::Uuid::new_v4().to_string();\n request_builder = request_builder\n .header(\"authorization\", format!(\"Bearer {}\", auth.api_key))\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"text/event-stream\")\n .header(\"accept-encoding\", \"identity\")\n .header(\"user-agent\", copilot_auth::COPILOT_USER_AGENT)\n .header(\"editor-version\", copilot_auth::COPILOT_EDITOR_VERSION)\n .header(\n \"editor-plugin-version\",\n copilot_auth::COPILOT_PLUGIN_VERSION,\n )\n .header(\n \"copilot-integration-id\",\n copilot_auth::COPILOT_INTEGRATION_ID,\n )\n .header(\"x-github-api-version\", copilot_auth::COPILOT_API_VERSION)\n // 260401 新增copilot 的关键 headers\n .header(\"openai-intent\", \"conversation-agent\")\n .header(\"x-initiator\", \"user\")\n .header(\"x-interaction-type\", \"conversation-agent\")\n .header(\"x-vscode-user-agent-library-version\", \"electron-fetch\")\n .header(\"x-request-id\", &request_id)\n .header(\"x-agent-task-id\", &request_id);\n } else if is_gemini_native {\n request_builder = match auth.strategy {\n AuthStrategy::GoogleOAuth => {\n let token = auth.access_token.as_ref().unwrap_or(&auth.api_key);\n request_builder\n .header(\"authorization\", format!(\"Bearer {token}\"))\n .header(\"x-goog-api-client\", \"GeminiCLI/1.0\")\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"text/event-stream\")\n .header(\"accept-encoding\", \"identity\")\n }\n _ => request_builder\n .header(\"x-goog-api-key\", &auth.api_key)\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"text/event-stream\")\n .header(\"accept-encoding\", \"identity\"),\n };\n } else if is_openai_chat || is_openai_responses {\n // OpenAI-compatible targets: Bearer auth + SSE headers only\n request_builder = request_builder\n .header(\"authorization\", format!(\"Bearer {}\", auth.api_key))\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"text/event-stream\")\n .header(\"accept-encoding\", \"identity\");\n } else {\n // Anthropic native: full Claude CLI headers\n let os_name = Self::get_os_name();\n let arch_name = Self::get_arch_name();\n\n // 鉴权头复用 ClaudeAdapter::get_auth_headers,与代理路径(forwarder)保持单一真理来源。\n // - AuthStrategy::Anthropic → x-api-key\n // - AuthStrategy::ClaudeAuth → Authorization: Bearer\n // - AuthStrategy::Bearer → Authorization: Bearer\n // 避免之前\"无条件 Bearer + 条件 x-api-key 双发\"导致的假阴性 / auth conflict。\n let auth_headers = ClaudeAdapter::new()\n .get_auth_headers(auth)\n .map_err(|e| AppError::Message(format!(\"stream check 构造鉴权头失败: {e}\")))?;\n for (name, value) in auth_headers {\n request_builder = request_builder.header(name, value);\n }\n\n request_builder = request_builder\n // Anthropic required headers\n .header(\"anthropic-version\", \"2023-06-01\")\n .header(\n \"anthropic-beta\",\n \"claude-code-20250219,interleaved-thinking-2025-05-14\",\n )\n .header(\"anthropic-dangerous-direct-browser-access\", \"true\")\n // Content type headers\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"application/json\")\n .header(\"accept-encoding\", \"identity\")\n .header(\"accept-language\", \"*\")\n // Client identification headers\n .header(\"user-agent\", \"claude-cli/2.1.2 (external, cli)\")\n .header(\"x-app\", \"cli\")\n // x-stainless SDK headers (dynamic local system info)\n .header(\"x-stainless-lang\", \"js\")\n .header(\"x-stainless-package-version\", \"0.70.0\")\n .header(\"x-stainless-os\", os_name)\n .header(\"x-stainless-arch\", arch_name)\n .header(\"x-stainless-runtime\", \"node\")\n .header(\"x-stainless-runtime-version\", \"v22.20.0\")\n .header(\"x-stainless-retry-count\", \"0\")\n .header(\"x-stainless-timeout\", \"600\")\n // Other headers\n .header(\"sec-fetch-mode\", \"cors\");\n }\n\n // 供应商自定义 headers 最后追加,允许覆盖内置默认值(例如 user-agent)\n if let Some(headers) = extra_headers {\n for (key, value) in headers {\n if let Some(v) = value.as_str() {\n request_builder = request_builder.header(key.as_str(), v);\n }\n }\n }\n\n // Provider 级自定义 User-Agent(meta.customUserAgent)覆盖默认 UA,与 forwarder\n // 转发路径口径一致;Copilot 指纹 UA 不可被覆盖。\n if !is_github_copilot {\n if let Some(ua) = Self::custom_user_agent(provider) {\n request_builder = request_builder.header(\"user-agent\", ua);\n }\n }\n\n let response = request_builder\n .timeout(timeout)\n .json(&body)\n .send()\n .await\n .map_err(Self::map_request_error)?;\n\n let status = response.status().as_u16();\n\n if !response.status().is_success() {\n let error_text = response.text().await.unwrap_or_default();\n return Err(Self::http_status_error(status, error_text));\n }\n\n // 流式读取:只需首个 chunk\n let mut stream = response.bytes_stream();\n if let Some(chunk) = stream.next().await {\n match chunk {\n Ok(_) => Ok((status, model.to_string())),\n Err(e) => Err(AppError::Message(format!(\"Stream read failed: {e}\"))),\n }\n } else {\n Err(AppError::Message(\"No response data received\".to_string()))\n }\n }\n\n /// Codex 流式检查\n ///\n /// 严格按照 Codex CLI 真实请求格式构建请求 (Responses API)\n async fn check_codex_stream(\n client: &Client,\n base_url: &str,\n auth: &AuthInfo,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n provider: &Provider,\n ) -> Result<(u16, String), AppError> {\n let is_full_url = provider\n .meta\n .as_ref()\n .and_then(|meta| meta.is_full_url)\n .unwrap_or(false);\n // 当 provider 的 api_format 标记为 openai_chat 时,上游不接受 Responses API;\n // 必须改打 /chat/completions 并发送 Chat 格式 body,否则 Stream Check 与代理路径不一致,\n // 会把\"实际可用\"的供应商误报为不可用(典型如 DeepSeek、MiniMax、Kimi 等 Chat 兼容厂商)。\n let uses_chat = crate::proxy::providers::codex_provider_uses_chat_completions(provider);\n let urls = if uses_chat {\n Self::resolve_codex_chat_stream_urls(base_url, is_full_url)\n } else {\n Self::resolve_codex_stream_urls(base_url, is_full_url)\n };\n\n // 解析模型名和推理等级 (支持 model@level 或 model#level 格式)\n let (actual_model, reasoning_effort) = Self::parse_model_with_effort(model);\n\n // 获取本地系统信息\n let os_name = Self::get_os_name();\n let arch_name = Self::get_arch_name();\n\n // Provider 级自定义 User-Agent(meta.customUserAgent)覆盖默认 codex UA,与 forwarder\n // 转发路径口径一致——否则 Stream Check 会用与真实流量不同的 UA 探测(如 Kimi UA 白名单)。\n let user_agent = if auth.strategy == AuthStrategy::CodexOAuth {\n crate::proxy::providers::codex_official_client_identity_headers()\n .into_iter()\n .find(|(name, _)| name == reqwest::header::USER_AGENT)\n .map(|(_, value)| value)\n } else {\n Self::custom_user_agent(provider)\n }\n .unwrap_or_else(|| {\n reqwest::header::HeaderValue::from_str(&format!(\n \"{}/{} ({os_name}; {arch_name}) terminal-agent\",\n crate::proxy::providers::CODEX_CLIENT_ORIGINATOR,\n crate::proxy::providers::CODEX_COMPAT_CLIENT_VERSION\n ))\n .unwrap_or_else(|_| {\n reqwest::header::HeaderValue::from_static(\"codex_cli_rs/0.144.5 terminal-agent\")\n })\n });\n\n let mut body = if uses_chat {\n // Chat Completions 请求体(与 transform_codex_chat::responses_to_chat_completions 对齐)\n json!({\n \"model\": actual_model,\n \"messages\": [{ \"role\": \"user\", \"content\": test_prompt }],\n \"max_tokens\": 1,\n \"stream\": true\n })\n } else {\n // Responses API 请求体格式 (input 必须是数组)\n json!({\n \"model\": actual_model,\n \"input\": [{ \"role\": \"user\", \"content\": test_prompt }],\n \"stream\": true\n })\n };\n\n // Chat 路径只对 OpenAI o-series 透传 reasoning_effort,与 transform_codex_chat\n // 一致;非 o-series(DeepSeek、Kimi 等)收到未知字段会 400。\n if let Some(effort) = reasoning_effort {\n if uses_chat\n && crate::proxy::providers::transform::supports_reasoning_effort(&actual_model)\n {\n body[\"reasoning_effort\"] = json!(effort);\n } else if !uses_chat {\n body[\"reasoning\"] = json!({ \"effort\": effort });\n }\n }\n\n for (i, url) in urls.iter().enumerate() {\n // 严格按照 Codex CLI 请求格式设置 headers\n let response = client\n .post(url)\n .header(\"authorization\", format!(\"Bearer {}\", auth.api_key))\n .header(\"content-type\", \"application/json\")\n .header(\"accept\", \"text/event-stream\")\n .header(\"accept-encoding\", \"identity\")\n .header(\"user-agent\", user_agent.clone())\n .header(\n \"originator\",\n crate::proxy::providers::CODEX_CLIENT_ORIGINATOR,\n )\n .header(\n \"version\",\n crate::proxy::providers::CODEX_COMPAT_CLIENT_VERSION,\n )\n .timeout(timeout)\n .json(&body)\n .send()\n .await\n .map_err(Self::map_request_error)?;\n\n let status = response.status().as_u16();\n\n if !response.status().is_success() {\n let error_text = response.text().await.unwrap_or_default();\n // 回退策略:仅当首选 URL 返回 404 时尝试下一个\n if i == 0 && status == 404 && urls.len() > 1 {\n continue;\n }\n return Err(Self::http_status_error(status, error_text));\n }\n\n let mut stream = response.bytes_stream();\n if let Some(chunk) = stream.next().await {\n match chunk {\n Ok(_) => return Ok((status, actual_model)),\n Err(e) => return Err(AppError::Message(format!(\"Stream read failed: {e}\"))),\n }\n }\n\n return Err(AppError::Message(\"No response data received\".to_string()));\n }\n\n Err(AppError::Message(\n \"No valid Codex responses endpoint found\".to_string(),\n ))\n }\n\n /// Gemini 流式检查\n ///\n /// 使用 Gemini 原生 API 格式 (streamGenerateContent)\n async fn check_gemini_stream(\n client: &Client,\n base_url: &str,\n auth: &AuthInfo,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n extra_headers: Option<&serde_json::Map<String, serde_json::Value>>,\n ) -> Result<(u16, String), AppError> {\n let base = base_url.trim_end_matches('/');\n // Strip `models/` resource-name prefix from the model id — see\n // `normalize_gemini_model_id` for rationale.\n let normalized_model = normalize_gemini_model_id(model);\n // Gemini 原生 API: /v1beta/models/{model}:streamGenerateContent?alt=sse\n // 智能处理 /v1beta 路径:如果 base_url 不包含版本路径,则添加 /v1beta\n // alt=sse 参数使 API 返回 SSE 格式(text/event-stream)而非 JSON 数组\n let url = if base.contains(\"/v1beta\") || base.contains(\"/v1/\") {\n format!(\"{base}/models/{normalized_model}:streamGenerateContent?alt=sse\")\n } else {\n format!(\"{base}/v1beta/models/{normalized_model}:streamGenerateContent?alt=sse\")\n };\n\n // Gemini 原生请求体格式\n let body = json!({\n \"contents\": [{\n \"role\": \"user\",\n \"parts\": [{ \"text\": test_prompt }]\n }]\n });\n\n let mut request_builder = client\n .post(&url)\n .header(\"x-goog-api-key\", &auth.api_key)\n .header(\"Content-Type\", \"application/json\")\n .header(\"Accept\", \"text/event-stream\");\n\n // 供应商自定义 headers 最后追加\n if let Some(headers) = extra_headers {\n for (key, value) in headers {\n if let Some(v) = value.as_str() {\n request_builder = request_builder.header(key.as_str(), v);\n }\n }\n }\n\n let response = request_builder\n .timeout(timeout)\n .json(&body)\n .send()\n .await\n .map_err(Self::map_request_error)?;\n\n let status = response.status().as_u16();\n\n if !response.status().is_success() {\n let error_text = response.text().await.unwrap_or_default();\n return Err(Self::http_status_error(status, error_text));\n }\n\n let mut stream = response.bytes_stream();\n if let Some(chunk) = stream.next().await {\n match chunk {\n Ok(_) => Ok((status, model.to_string())),\n Err(e) => Err(AppError::Message(format!(\"Stream read failed: {e}\"))),\n }\n } else {\n Err(AppError::Message(\"No response data received\".to_string()))\n }\n }\n\n /// OpenCode / OpenClaw 的独立分发入口(绕过 `get_adapter`)\n ///\n /// 这两个应用的 `settings_config` 与 Claude/Codex/Gemini 完全不同:\n /// - OpenClaw: `{ baseUrl, apiKey, api, models: [...] }`,`api` 字段标识协议\n /// - OpenCode: `{ npm, options: { baseURL, apiKey }, models: {...} }`,`npm` 字段标识协议\n ///\n /// 因此不能复用 `get_adapter`(会 fallback 到 CodexAdapter 而提取失败),\n /// 改为独立解析 base_url/api_key/协议,再分发到现有的 check_*_stream 函数。\n async fn check_once_without_adapter(\n app_type: &AppType,\n provider: &Provider,\n config: &StreamCheckConfig,\n start: Instant,\n ) -> Result<StreamCheckResult, AppError> {\n // 获取 HTTP 客户端\n let client = crate::proxy::http_client::get();\n let request_timeout = std::time::Duration::from_secs(config.timeout_secs);\n\n let model_to_test = Self::resolve_test_model(app_type, provider, config);\n let test_prompt = &config.test_prompt;\n\n let result = match app_type {\n AppType::OpenClaw => {\n Self::check_additive_app_stream(\n &client,\n provider,\n &model_to_test,\n test_prompt,\n request_timeout,\n )\n .await\n }\n AppType::OpenCode => {\n Self::check_opencode_stream(\n &client,\n provider,\n &model_to_test,\n test_prompt,\n request_timeout,\n )\n .await\n }\n AppType::Hermes => {\n Self::check_hermes_stream(\n &client,\n provider,\n &model_to_test,\n test_prompt,\n request_timeout,\n )\n .await\n }\n _ => unreachable!(\"check_once_without_adapter 只处理 OpenCode/OpenClaw/Hermes\"),\n };\n\n let response_time = start.elapsed().as_millis() as u64;\n Ok(Self::build_stream_check_result(\n result,\n response_time,\n config.degraded_threshold_ms,\n &model_to_test,\n ))\n }\n\n /// 将 check_*_stream 的原始结果包装成 StreamCheckResult\n ///\n /// 抽取自 check_once 的末尾逻辑,以便 OpenCode/OpenClaw 的独立分支复用。\n ///\n /// `model_tested` 是本次探测使用的模型名,用于在失败场景下仍能把模型信息透传给前端,\n /// 方便针对\"模型不存在 / 已下架\"这类错误渲染专门的提示。\n fn build_stream_check_result(\n result: Result<(u16, String), AppError>,\n response_time: u64,\n degraded_threshold_ms: u64,\n model_tested: &str,\n ) -> StreamCheckResult {\n let tested_at = chrono::Utc::now().timestamp();\n match result {\n Ok((status_code, model)) => StreamCheckResult {\n status: Self::determine_status(response_time, degraded_threshold_ms),\n success: true,\n message: \"Check succeeded\".to_string(),\n response_time_ms: Some(response_time),\n http_status: Some(status_code),\n model_used: model,\n tested_at,\n retry_count: 0,\n error_category: None,\n },\n Err(e) => {\n let (http_status, message, error_category) = match &e {\n AppError::HttpStatus { status, body } => {\n let category = Self::detect_error_category(*status, body);\n (\n Some(*status),\n Self::classify_http_status(*status).to_string(),\n category.map(|s| s.to_string()),\n )\n }\n _ => (None, e.to_string(), None),\n };\n StreamCheckResult {\n status: HealthStatus::Failed,\n success: false,\n message,\n response_time_ms: Some(response_time),\n http_status,\n model_used: model_tested.to_string(),\n tested_at,\n retry_count: 0,\n error_category,\n }\n }\n }\n }\n\n /// 基于 HTTP 状态码和响应体识别细粒度错误分类。\n ///\n /// 目前仅识别\"模型不存在 / 已下架\":各厂商该类错误通常返回 4xx,body 中会包含\n /// 如 `model_not_found`(OpenAI)、`does not exist`、`invalid model`、`not_found_error`\n /// + `model` 字样(Anthropic)等标记。\n pub(crate) fn detect_error_category(status: u16, body: &str) -> Option<&'static str> {\n // 只检查 4xx;5xx 的错误信息里可能巧合出现\"model\"之类的词,容易误判\n if !(400..500).contains(&status) {\n return None;\n }\n let lower = body.to_lowercase();\n let qianfan_quota_indicators = [\n \"coding_plan_hour_quota_exceeded\",\n \"coding_plan_week_quota_exceeded\",\n \"coding_plan_month_quota_exceeded\",\n ];\n if qianfan_quota_indicators.iter().any(|s| lower.contains(s)) {\n return Some(\"quotaExceeded\");\n }\n\n // 必须提到 \"model\",避免通用 404 / 400 被误判\n if !lower.contains(\"model\") {\n return None;\n }\n let indicators = [\n \"model_not_found\",\n \"model not found\",\n \"does not exist\",\n \"invalid_model\",\n \"invalid model\",\n \"unknown_model\",\n \"unknown model\",\n \"is not a valid model\",\n \"not_found_error\", // Anthropic 的 type 字段\n ];\n if indicators.iter().any(|s| lower.contains(s)) {\n return Some(\"modelNotFound\");\n }\n None\n }\n\n /// OpenClaw 流式检查分发器\n ///\n /// 根据 `settings_config.api` 字段分发到对应协议的检查器。\n /// 取值参见 `openclawApiProtocols` (前端 openclawProviderPresets.ts):\n /// - `openai-completions` → check_claude_stream + api_format=\"openai_chat\"\n /// - `openai-responses` → check_claude_stream + api_format=\"openai_responses\"\n /// - `anthropic-messages` → check_claude_stream + api_format=\"anthropic\" (ClaudeAuth 策略)\n /// - `google-generative-ai` → check_gemini_stream (Google API Key 策略)\n /// - `bedrock-converse-stream` → 不支持(需要 AWS SigV4 签名)\n async fn check_additive_app_stream(\n client: &Client,\n provider: &Provider,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n ) -> Result<(u16, String), AppError> {\n // 自定义认证头(如 Longcat 的 `apikey` 头)不走标准 Bearer,\n // 具体头名由 OpenClaw 网关内部决定,OpenSunstar 无法准确构造,\n // 因此直接返回友好错误而不是让用户看到一个误导性的 401。\n if Self::additive_app_uses_auth_header(provider) {\n return Err(AppError::localized(\n \"openclaw_auth_header_not_supported\",\n \"该供应商使用自定义认证头,暂不支持流式健康检查。建议直接通过 OpenClaw 测试。\",\n \"This provider uses a custom auth header; stream health check is not supported. Please test it directly via OpenClaw.\",\n ));\n }\n\n let base_url = Self::extract_openclaw_base_url(provider)?;\n let api_key = Self::extract_openclaw_api_key(provider)?;\n let api = Self::extract_openclaw_protocol(provider);\n let extra_headers = Self::extract_openclaw_headers(provider);\n\n match api.as_deref() {\n Some(\"openai-completions\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Bearer);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"openai_chat\"),\n extra_headers,\n )\n .await\n }\n Some(\"openai-responses\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Bearer);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"openai_responses\"),\n extra_headers,\n )\n .await\n }\n Some(\"anthropic-messages\") => {\n // 使用 ClaudeAuth(Bearer-only)以兼容 Claude 中转服务。\n // 某些中转同时收到 Authorization 和 x-api-key 会报错,ClaudeAuth\n // 策略保证只下发 Bearer。官方 Anthropic 也接受纯 Bearer。\n let auth = AuthInfo::new(api_key, AuthStrategy::ClaudeAuth);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"anthropic\"),\n extra_headers,\n )\n .await\n }\n Some(\"google-generative-ai\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Google);\n Self::check_gemini_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n extra_headers,\n )\n .await\n }\n Some(\"bedrock-converse-stream\") => Err(AppError::localized(\n \"openclaw_bedrock_not_supported\",\n \"AWS Bedrock 需要 SigV4 签名,当前不支持健康检查。请通过 AWS 控制台或 OpenClaw 验证连通性。\",\n \"AWS Bedrock requires SigV4 signing and is not supported by stream health check. Please verify connectivity via AWS console or OpenClaw.\",\n )),\n Some(other) => Err(AppError::localized(\n \"openclaw_protocol_not_yet_supported\",\n format!(\"OpenClaw 暂不支持协议: {other}\"),\n format!(\"OpenClaw protocol not yet supported: {other}\"),\n )),\n None => Err(AppError::localized(\n \"openclaw_protocol_missing\",\n \"OpenClaw 供应商缺少 api 字段\",\n \"OpenClaw provider is missing the `api` field\",\n )),\n }\n }\n\n /// 判断 additive-mode 供应商是否使用自定义认证头(`authHeader: true`)\n fn additive_app_uses_auth_header(provider: &Provider) -> bool {\n provider\n .settings_config\n .get(\"authHeader\")\n .and_then(|v| v.as_bool())\n .unwrap_or(false)\n }\n\n /// 提取 OpenClaw 供应商的自定义 headers(来自 `settings_config.headers`)\n fn extract_openclaw_headers(\n provider: &Provider,\n ) -> Option<&serde_json::Map<String, serde_json::Value>> {\n provider\n .settings_config\n .get(\"headers\")\n .and_then(|v| v.as_object())\n .filter(|m| !m.is_empty())\n }\n\n fn extract_openclaw_base_url(provider: &Provider) -> Result<String, AppError> {\n provider\n .settings_config\n .get(\"baseUrl\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n .ok_or_else(|| {\n AppError::localized(\n \"openclaw_base_url_missing\",\n \"OpenClaw 供应商缺少 baseUrl\",\n \"OpenClaw provider is missing `baseUrl`\",\n )\n })\n }\n\n fn extract_openclaw_api_key(provider: &Provider) -> Result<String, AppError> {\n provider\n .settings_config\n .get(\"apiKey\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n .ok_or_else(|| {\n AppError::localized(\n \"openclaw_api_key_missing\",\n \"OpenClaw 供应商缺少 apiKey\",\n \"OpenClaw provider is missing `apiKey`\",\n )\n })\n }\n\n fn extract_openclaw_protocol(provider: &Provider) -> Option<String> {\n provider\n .settings_config\n .get(\"api\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n }\n\n // Hermes 的 settings_config 用 snake_case(base_url / api_key / api_mode),\n // 与 OpenClaw 的 camelCase(baseUrl / apiKey / api)是两套独立命名。\n // 见 src/config/hermesProviderPresets.ts 的 HermesProviderSettingsConfig。\n fn extract_hermes_base_url(provider: &Provider) -> Result<String, AppError> {\n provider\n .settings_config\n .get(\"base_url\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n .ok_or_else(|| {\n AppError::localized(\n \"hermes_base_url_missing\",\n \"Hermes 供应商缺少 base_url\",\n \"Hermes provider is missing `base_url`\",\n )\n })\n }\n\n fn extract_hermes_api_key(provider: &Provider) -> Result<String, AppError> {\n provider\n .settings_config\n .get(\"api_key\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n .ok_or_else(|| {\n AppError::localized(\n \"hermes_api_key_missing\",\n \"Hermes 供应商缺少 api_key\",\n \"Hermes provider is missing `api_key`\",\n )\n })\n }\n\n fn extract_hermes_api_mode(provider: &Provider) -> Option<String> {\n provider\n .settings_config\n .get(\"api_mode\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n }\n\n /// Hermes 流式检查分发器\n ///\n /// Hermes 以 `api_mode` 字段显式指定协议,取值来自\n /// `HermesApiMode`(hermesProviderPresets.ts):\n /// - `chat_completions` → check_claude_stream + api_format=\"openai_chat\"(Bearer)\n /// - `anthropic_messages` → check_claude_stream + api_format=\"anthropic\"(ClaudeAuth,与 OpenClaw 的 anthropic-messages 同策略)\n /// - `codex_responses` → check_claude_stream + api_format=\"openai_responses\"(Bearer)\n /// - `bedrock_converse` → 不支持(需要 AWS SigV4 签名)\n async fn check_hermes_stream(\n client: &Client,\n provider: &Provider,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n ) -> Result<(u16, String), AppError> {\n // 先把 api_mode 路由出协议格式与认证策略。\n // 纯错误路径(bedrock / 未知 / 缺失)直接 return,避免在用户\n // 选了 bedrock_converse 时被\"缺 base_url\"的二级错误盖住真正原因。\n let (api_format, auth_strategy) = match Self::extract_hermes_api_mode(provider).as_deref() {\n Some(\"chat_completions\") => (\"openai_chat\", AuthStrategy::Bearer),\n Some(\"anthropic_messages\") => (\"anthropic\", AuthStrategy::ClaudeAuth),\n Some(\"codex_responses\") => (\"openai_responses\", AuthStrategy::Bearer),\n Some(\"bedrock_converse\") => {\n return Err(AppError::localized(\n \"hermes_bedrock_not_supported\",\n \"AWS Bedrock 需要 SigV4 签名,当前不支持健康检查。\",\n \"AWS Bedrock requires SigV4 signing and is not supported by stream health check.\",\n ));\n }\n Some(other) => {\n return Err(AppError::localized(\n \"hermes_protocol_not_yet_supported\",\n format!(\"Hermes 暂不支持协议: {other}\"),\n format!(\"Hermes protocol not yet supported: {other}\"),\n ));\n }\n None => {\n return Err(AppError::localized(\n \"hermes_api_mode_missing\",\n \"Hermes 供应商缺少 api_mode 字段\",\n \"Hermes provider is missing the `api_mode` field\",\n ));\n }\n };\n\n let base_url = Self::extract_hermes_base_url(provider)?;\n let api_key = Self::extract_hermes_api_key(provider)?;\n let auth = AuthInfo::new(api_key, auth_strategy);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(api_format),\n None,\n )\n .await\n }\n\n /// OpenCode 流式检查分发器\n ///\n /// OpenCode 用 `npm` 字段(AI SDK 包名)隐式指定协议。映射关系参见\n /// `opencodeNpmPackages` (前端 opencodeProviderPresets.ts):\n /// - `@ai-sdk/openai-compatible` → check_claude_stream + api_format=\"openai_chat\"\n /// - `@ai-sdk/openai` → check_claude_stream + api_format=\"openai_responses\"\n /// - `@ai-sdk/anthropic` → check_claude_stream + api_format=\"anthropic\"\n /// - `@ai-sdk/google` → check_gemini_stream (Google API Key 策略)\n /// - `@ai-sdk/amazon-bedrock` → 不支持(需要 AWS SigV4 签名)\n ///\n /// URL/API Key 存放在 `settings_config.options.{baseURL,apiKey}`,注意\n /// `baseURL` 大写 L(与 OpenClaw 的 `baseUrl` 首字母小写 u 不同)。\n async fn check_opencode_stream(\n client: &Client,\n provider: &Provider,\n model: &str,\n test_prompt: &str,\n timeout: std::time::Duration,\n ) -> Result<(u16, String), AppError> {\n let npm = Self::extract_opencode_npm(provider);\n // 若用户未显式填 baseURL,则根据 npm 回退到 AI SDK 包自带的默认端点\n let base_url = Self::resolve_opencode_base_url(provider, npm.as_deref())?;\n let api_key = Self::extract_opencode_api_key(provider)?;\n let extra_headers = Self::extract_opencode_headers(provider);\n\n match npm.as_deref() {\n Some(\"@ai-sdk/openai-compatible\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Bearer);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"openai_chat\"),\n extra_headers,\n )\n .await\n }\n Some(\"@ai-sdk/openai\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Bearer);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"openai_responses\"),\n extra_headers,\n )\n .await\n }\n Some(\"@ai-sdk/anthropic\") => {\n // 见 check_additive_app_stream 对 anthropic-messages 的处理:\n // 用 ClaudeAuth(Bearer-only)兼容中转服务。\n let auth = AuthInfo::new(api_key, AuthStrategy::ClaudeAuth);\n Self::check_claude_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n provider,\n Some(\"anthropic\"),\n extra_headers,\n )\n .await\n }\n Some(\"@ai-sdk/google\") => {\n let auth = AuthInfo::new(api_key, AuthStrategy::Google);\n Self::check_gemini_stream(\n client,\n &base_url,\n &auth,\n model,\n test_prompt,\n timeout,\n extra_headers,\n )\n .await\n }\n Some(\"@ai-sdk/amazon-bedrock\") => Err(AppError::localized(\n \"opencode_bedrock_not_supported\",\n \"AWS Bedrock 需要 SigV4 签名,当前不支持健康检查。请通过 AWS 控制台或 OpenCode 验证连通性。\",\n \"AWS Bedrock requires SigV4 signing and is not supported by stream health check. Please verify connectivity via AWS console or OpenCode.\",\n )),\n Some(other) => Err(AppError::localized(\n \"opencode_npm_not_yet_supported\",\n format!(\"OpenCode 暂不支持 SDK 包: {other}\"),\n format!(\"OpenCode SDK package not yet supported: {other}\"),\n )),\n None => Err(AppError::localized(\n \"opencode_npm_missing\",\n \"OpenCode 供应商缺少 npm 字段\",\n \"OpenCode provider is missing the `npm` field\",\n )),\n }\n }\n\n /// 按 OpenCode 的实际 SDK 包特性确定 baseURL:\n /// - 用户显式填写的 `options.baseURL` 总是优先\n /// - 否则根据 `npm` 返回 AI SDK 包自带的默认端点\n /// - `@ai-sdk/openai-compatible` 没有默认端点,必须显式填\n ///\n /// 注意:这里的默认端点对应 AI SDK 包的行为(例如 `@ai-sdk/openai`\n /// 自带 `/v1` 路径后缀),与 `proxy/providers/mod.rs` 里的\n /// `ProviderType::default_endpoint()` 语义不同——后者是代理层的上游\n /// 默认值,不带 `/v1`。两者维护的是不同系统的默认值,不能简单共享。\n fn resolve_opencode_base_url(\n provider: &Provider,\n npm: Option<&str>,\n ) -> Result<String, AppError> {\n if let Some(explicit) = Self::extract_opencode_base_url(provider) {\n return Ok(explicit);\n }\n\n let fallback = match npm {\n Some(\"@ai-sdk/openai\") => Some(\"https://api.openai.com/v1\"),\n Some(\"@ai-sdk/anthropic\") => Some(\"https://api.anthropic.com\"),\n Some(\"@ai-sdk/google\") => Some(\"https://generativelanguage.googleapis.com\"),\n _ => None,\n };\n\n fallback.map(|s| s.to_string()).ok_or_else(|| {\n AppError::localized(\n \"opencode_base_url_missing\",\n \"OpenCode 供应商缺少 options.baseURL,且当前 SDK 包没有默认端点\",\n \"OpenCode provider is missing `options.baseURL` and the SDK package has no default endpoint\",\n )\n })\n }\n\n fn extract_opencode_base_url(provider: &Provider) -> Option<String> {\n provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.get(\"baseURL\"))\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n }\n\n /// 提取 OpenCode 供应商的自定义 headers(来自 `settings_config.options.headers`)\n fn extract_opencode_headers(\n provider: &Provider,\n ) -> Option<&serde_json::Map<String, serde_json::Value>> {\n provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.get(\"headers\"))\n .and_then(|v| v.as_object())\n .filter(|m| !m.is_empty())\n }\n\n fn extract_opencode_api_key(provider: &Provider) -> Result<String, AppError> {\n provider\n .settings_config\n .get(\"options\")\n .and_then(|v| v.get(\"apiKey\"))\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n .ok_or_else(|| {\n AppError::localized(\n \"opencode_api_key_missing\",\n \"OpenCode 供应商缺少 options.apiKey\",\n \"OpenCode provider is missing `options.apiKey`\",\n )\n })\n }\n\n fn extract_opencode_npm(provider: &Provider) -> Option<String> {\n provider\n .settings_config\n .get(\"npm\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|s| !s.is_empty())\n }\n\n fn determine_status(latency_ms: u64, threshold: u64) -> HealthStatus {\n if latency_ms <= threshold {\n HealthStatus::Operational\n } else {\n HealthStatus::Degraded\n }\n }\n\n /// 解析模型名和推理等级 (支持 model@level 或 model#level 格式)\n /// 返回 (实际模型名, Option<推理等级>)\n fn parse_model_with_effort(model: &str) -> (String, Option<String>) {\n if let Some(pos) = model.find('@').or_else(|| model.find('#')) {\n let actual_model = model[..pos].to_string();\n let effort = model[pos + 1..].to_string();\n if !effort.is_empty() {\n return (actual_model, Some(effort));\n }\n }\n (model.to_string(), None)\n }\n\n fn should_retry(msg: &str) -> bool {\n let lower = msg.to_lowercase();\n lower.contains(\"timeout\") || lower.contains(\"abort\") || lower.contains(\"timed out\")\n }\n\n fn map_request_error(e: reqwest::Error) -> AppError {\n if e.is_timeout() {\n AppError::Message(\"Request timeout\".to_string())\n } else if e.is_connect() {\n AppError::Message(format!(\"Connection failed: {e}\"))\n } else {\n AppError::Message(e.to_string())\n }\n }\n\n /// 构造 HTTP 状态码错误,截断过长的响应体\n fn http_status_error(status: u16, body: String) -> AppError {\n let body = if body.len() > 200 {\n // 安全截断:找到 200 字节内最近的 char 边界\n let mut end = 200;\n while end > 0 && !body.is_char_boundary(end) {\n end -= 1;\n }\n format!(\"{}…\", &body[..end])\n } else {\n body\n };\n AppError::HttpStatus { status, body }\n }\n\n /// 将 HTTP 状态码映射为简短的分类标签\n pub(crate) fn classify_http_status(status: u16) -> &'static str {\n match status {\n 400 => \"Bad request (400)\",\n 401 => \"Auth rejected (401)\",\n 402 => \"Payment required (402)\",\n 403 => \"Access denied (403)\",\n 404 => \"Not found (404)\",\n 429 => \"Rate limited (429)\",\n 500 => \"Internal server error (500)\",\n 502 => \"Bad gateway (502)\",\n 503 => \"Service unavailable (503)\",\n 504 => \"Gateway timeout (504)\",\n s if (500..600).contains(&s) => \"Server error\",\n _ => \"HTTP error\",\n }\n }\n\n fn resolve_test_model(\n app_type: &AppType,\n provider: &Provider,\n config: &StreamCheckConfig,\n ) -> String {\n match app_type {\n AppType::Claude | AppType::ClaudeDesktop => {\n Self::extract_env_model(provider, \"ANTHROPIC_MODEL\")\n .unwrap_or_else(|| config.claude_model.clone())\n }\n AppType::Codex => {\n Self::extract_codex_model(provider).unwrap_or_else(|| config.codex_model.clone())\n }\n AppType::Gemini => Self::extract_env_model(provider, \"GEMINI_MODEL\")\n .unwrap_or_else(|| config.gemini_model.clone()),\n AppType::GrokBuild => crate::grok_config::extract_model_config(\n provider\n .settings_config\n .get(\"config\")\n .and_then(|v| v.as_str())\n .unwrap_or(\"\"),\n )\n .map(|model| model.model)\n .unwrap_or_else(|| \"grok-4.5\".to_string()),\n AppType::OpenCode => {\n // OpenCode uses models map in settings_config\n // Try to extract first model from the models object\n Self::extract_opencode_model(provider).unwrap_or_else(|| \"gpt-4o\".to_string())\n }\n AppType::OpenClaw | AppType::Hermes => {\n // OpenClaw/Hermes use models array in settings_config\n // Try to extract first model from the models array\n Self::extract_openclaw_model(provider).unwrap_or_else(|| \"gpt-4o\".to_string())\n }\n }\n }\n\n fn extract_opencode_model(provider: &Provider) -> Option<String> {\n let models = provider\n .settings_config\n .get(\"models\")\n .and_then(|m| m.as_object())?;\n\n // Return the first model ID from the models map\n models.keys().next().map(|s| s.to_string())\n }\n\n fn extract_openclaw_model(provider: &Provider) -> Option<String> {\n // OpenClaw uses models array: [{ \"id\": \"model-id\", \"name\": \"Model Name\" }]\n let models = provider\n .settings_config\n .get(\"models\")\n .and_then(|m| m.as_array())?;\n\n // Return the first model ID from the models array\n models\n .first()\n .and_then(|m| m.get(\"id\"))\n .and_then(|id| id.as_str())\n .map(|s| s.to_string())\n }\n\n fn extract_env_model(provider: &Provider, key: &str) -> Option<String> {\n provider\n .settings_config\n .get(\"env\")\n .and_then(|env| env.get(key))\n .and_then(|value| value.as_str())\n .map(|value| value.trim().to_string())\n .filter(|value| !value.is_empty())\n }\n\n fn extract_codex_model(provider: &Provider) -> Option<String> {\n let config_text = provider\n .settings_config\n .get(\"config\")\n .and_then(|value| value.as_str())?;\n if config_text.trim().is_empty() {\n return None;\n }\n\n let table = toml::from_str::<toml::Table>(config_text).ok()?;\n table\n .get(\"model\")\n .and_then(|v| v.as_str())\n .map(|s| s.trim().to_string())\n .filter(|value| !value.is_empty())\n }\n\n /// 获取操作系统名称(映射为 Claude CLI 使用的格式)\n fn get_os_name() -> &'static str {\n match std::env::consts::OS {\n \"macos\" => \"MacOS\",\n \"linux\" => \"Linux\",\n \"windows\" => \"Windows\",\n other => other,\n }\n }\n\n /// 获取 CPU 架构名称(映射为 Claude CLI 使用的格式)\n fn get_arch_name() -> &'static str {\n match std::env::consts::ARCH {\n \"aarch64\" => \"arm64\",\n \"x86_64\" => \"x86_64\",\n \"x86\" => \"x86\",\n other => other,\n }\n }\n\n fn resolve_claude_stream_url(\n base_url: &str,\n auth_strategy: AuthStrategy,\n api_format: &str,\n is_full_url: bool,\n model: &str,\n ) -> String {\n if api_format == \"gemini_native\" {\n // Strip an optional `models/` resource-name prefix so that model\n // identifiers copied from Gemini SDK outputs (e.g.\n // `models/gemini-2.5-pro`) don't produce a doubled\n // `/v1beta/models/models/...` URL.\n let normalized_model = normalize_gemini_model_id(model);\n let endpoint =\n format!(\"/v1beta/models/{normalized_model}:streamGenerateContent?alt=sse\");\n return resolve_gemini_native_url(base_url, &endpoint, is_full_url);\n }\n\n if is_full_url {\n return base_url.to_string();\n }\n\n let base = base_url.trim_end_matches('/');\n let is_github_copilot = auth_strategy == AuthStrategy::GitHubCopilot;\n\n if is_github_copilot && api_format == \"openai_responses\" {\n format!(\"{base}/v1/responses\")\n } else if is_github_copilot {\n format!(\"{base}/chat/completions\")\n } else if api_format == \"openai_responses\" {\n if base.ends_with(\"/v1\") {\n format!(\"{base}/responses\")\n } else {\n format!(\"{base}/v1/responses\")\n }\n } else if api_format == \"openai_chat\" {\n if base.ends_with(\"/v1\") {\n format!(\"{base}/chat/completions\")\n } else {\n format!(\"{base}/v1/chat/completions\")\n }\n } else if base.ends_with(\"/v1\") {\n format!(\"{base}/messages\")\n } else {\n format!(\"{base}/v1/messages\")\n }\n }\n\n /// Codex Responses 流式 URL 构造(薄包装,详见 `resolve_codex_endpoint_urls`)。\n fn resolve_codex_stream_urls(base_url: &str, is_full_url: bool) -> Vec<String> {\n Self::resolve_codex_endpoint_urls(base_url, is_full_url, \"responses\")\n }\n\n /// Codex Chat Completions 流式 URL 构造(薄包装,详见 `resolve_codex_endpoint_urls`)。\n fn resolve_codex_chat_stream_urls(base_url: &str, is_full_url: bool) -> Vec<String> {\n Self::resolve_codex_endpoint_urls(base_url, is_full_url, \"chat/completions\")\n }\n\n /// 与 `CodexAdapter::build_url` 优先级对齐的 stream check URL 列表构造。\n ///\n /// 纯 origin 在生产路径上会自动补 `/v1`,所以 Stream Check 必须优先走\n /// `<base>/v1/<endpoint>`。否则上游对 bare 路径返回 401/400/405(非 404)\n /// 时不会触发循环里的 fallback,会把可用供应商误判为不可用。\n fn resolve_codex_endpoint_urls(\n base_url: &str,\n is_full_url: bool,\n endpoint: &str,\n ) -> Vec<String> {\n if is_full_url {\n return vec![base_url.to_string()];\n }\n\n let base = base_url.trim_end_matches('/');\n let lower = base.to_ascii_lowercase();\n let endpoint_suffix = format!(\"/{endpoint}\");\n let endpoint_lower = endpoint_suffix.to_ascii_lowercase();\n\n // 用户在 base_url 里写了完整 endpoint 但忘开 is_full_url 的兜底\n if lower.ends_with(&endpoint_lower) {\n return vec![base.to_string()];\n }\n\n if base.ends_with(\"/v1\") {\n return vec![format!(\"{base}{endpoint_suffix}\")];\n }\n\n if crate::proxy::providers::is_origin_only_url(base) {\n vec![\n format!(\"{base}/v1{endpoint_suffix}\"),\n format!(\"{base}{endpoint_suffix}\"),\n ]\n } else {\n vec![\n format!(\"{base}{endpoint_suffix}\"),\n format!(\"{base}/v1{endpoint_suffix}\"),\n ]\n }\n }\n\n pub(crate) fn resolve_effective_test_model(\n app_type: &AppType,\n provider: &Provider,\n config: &StreamCheckConfig,\n ) -> String {\n let effective_config = Self::merge_provider_config(provider, config);\n Self::resolve_test_model(app_type, provider, &effective_config)\n }\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n fn make_provider(settings_config: serde_json::Value) -> Provider {\n Provider::with_id(\n \"test\".to_string(),\n \"Test\".to_string(),\n settings_config,\n None,\n )\n }\n\n #[test]\n fn test_additive_app_uses_auth_header_true() {\n let p = make_provider(serde_json::json!({\n \"baseUrl\": \"https://api.longcat.chat/v1\",\n \"apiKey\": \"k\",\n \"api\": \"openai-completions\",\n \"authHeader\": true,\n }));\n assert!(StreamCheckService::additive_app_uses_auth_header(&p));\n }\n\n #[test]\n fn test_additive_app_uses_auth_header_default_false() {\n let p = make_provider(serde_json::json!({\n \"baseUrl\": \"https://api.deepseek.com/v1\",\n \"apiKey\": \"k\",\n \"api\": \"openai-completions\",\n }));\n assert!(!StreamCheckService::additive_app_uses_auth_header(&p));\n }\n\n #[test]\n fn test_custom_user_agent_trims_and_filters_empty() {\n use crate::provider::ProviderMeta;\n\n let mut p = make_provider(serde_json::json!({\n \"baseUrl\": \"https://api.kimi.com/coding\",\n \"apiKey\": \"k\",\n }));\n\n // 未设置 meta → None\n assert!(StreamCheckService::custom_user_agent(&p).is_none());\n\n // 带首尾空格的 UA → 去空格后返回合法 HeaderValue\n p.meta = Some(ProviderMeta {\n custom_user_agent: Some(\" claude-cli/2.1.161 \".to_string()),\n ..Default::default()\n });\n assert_eq!(\n StreamCheckService::custom_user_agent(&p)\n .unwrap()\n .to_str()\n .unwrap(),\n \"claude-cli/2.1.161\"\n );\n\n // 纯空白 → 视为未设置(与 forwarder 路径口径一致)\n p.meta = Some(ProviderMeta {\n custom_user_agent: Some(\" \".to_string()),\n ..Default::default()\n });\n assert!(StreamCheckService::custom_user_agent(&p).is_none());\n\n // 非 ASCII 字符其实合法(UTF-8 字节均 ≥ 0x80,HeaderValue 按字节放行)→ 应返回 Some\n p.meta = Some(ProviderMeta {\n custom_user_agent: Some(\"claude-cli/2.1.161 \\u{4e2d}\".to_string()),\n ..Default::default()\n });\n assert!(StreamCheckService::custom_user_agent(&p).is_some());\n\n // 含控制字符(内嵌换行)才非法 → None(静默忽略,与 forwarder 一致,不让 Stream Check 报错)\n p.meta = Some(ProviderMeta {\n custom_user_agent: Some(\"claude-cli/2.1.161\\nX\".to_string()),\n ..Default::default()\n });\n assert!(StreamCheckService::custom_user_agent(&p).is_none());\n }\n\n #[test]\n fn test_resolve_opencode_base_url_explicit_wins() {\n let p = make_provider(serde_json::json!({\n \"npm\": \"@ai-sdk/openai\",\n \"options\": { \"baseURL\": \"https://proxy.local/v1\", \"apiKey\": \"k\" },\n \"models\": {},\n }));\n let resolved =\n StreamCheckService::resolve_opencode_base_url(&p, Some(\"@ai-sdk/openai\")).unwrap();\n assert_eq!(resolved, \"https://proxy.local/v1\");\n }\n\n #[test]\n fn test_resolve_opencode_base_url_falls_back_for_known_npm() {\n let p = make_provider(serde_json::json!({\n \"npm\": \"@ai-sdk/openai\",\n \"options\": { \"apiKey\": \"k\" },\n \"models\": {},\n }));\n let resolved =\n StreamCheckService::resolve_opencode_base_url(&p, Some(\"@ai-sdk/openai\")).unwrap();\n assert_eq!(resolved, \"https://api.openai.com/v1\");\n\n let p2 = make_provider(serde_json::json!({\n \"npm\": \"@ai-sdk/anthropic\",\n \"options\": { \"apiKey\": \"k\" },\n \"models\": {},\n }));\n let resolved2 =\n StreamCheckService::resolve_opencode_base_url(&p2, Some(\"@ai-sdk/anthropic\")).unwrap();\n assert_eq!(resolved2, \"https://api.anthropic.com\");\n }\n\n #[test]\n fn test_resolve_opencode_base_url_errors_for_openai_compatible_without_url() {\n // @ai-sdk/openai-compatible 没有默认端点,必须显式填\n let p = make_provider(serde_json::json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"options\": { \"apiKey\": \"k\" },\n \"models\": {},\n }));\n let result =\n StreamCheckService::resolve_opencode_base_url(&p, Some(\"@ai-sdk/openai-compatible\"));\n assert!(result.is_err());\n }\n\n #[test]\n fn test_extract_openclaw_headers_preserves_map() {\n let p = make_provider(serde_json::json!({\n \"baseUrl\": \"https://example.com/v1\",\n \"apiKey\": \"k\",\n \"api\": \"openai-completions\",\n \"headers\": { \"User-Agent\": \"MyBot/1.0\", \"X-Trace\": \"abc\" },\n }));\n let headers = StreamCheckService::extract_openclaw_headers(&p).unwrap();\n assert_eq!(\n headers.get(\"User-Agent\").and_then(|v| v.as_str()),\n Some(\"MyBot/1.0\")\n );\n assert_eq!(headers.get(\"X-Trace\").and_then(|v| v.as_str()), Some(\"abc\"));\n }\n\n #[test]\n fn test_extract_openclaw_headers_ignores_empty_map() {\n let p = make_provider(serde_json::json!({\n \"baseUrl\": \"https://example.com/v1\",\n \"apiKey\": \"k\",\n \"api\": \"openai-completions\",\n \"headers\": {},\n }));\n assert!(StreamCheckService::extract_openclaw_headers(&p).is_none());\n }\n\n #[test]\n fn test_extract_opencode_headers_from_options() {\n let p = make_provider(serde_json::json!({\n \"npm\": \"@ai-sdk/openai-compatible\",\n \"options\": {\n \"baseURL\": \"https://example.com/v1\",\n \"apiKey\": \"k\",\n \"headers\": { \"X-Custom\": \"yes\" },\n },\n \"models\": {},\n }));\n let headers = StreamCheckService::extract_opencode_headers(&p).unwrap();\n assert_eq!(\n headers.get(\"X-Custom\").and_then(|v| v.as_str()),\n Some(\"yes\")\n );\n }\n\n #[test]\n fn test_determine_status() {\n assert_eq!(\n StreamCheckService::determine_status(3000, 6000),\n HealthStatus::Operational\n );\n assert_eq!(\n StreamCheckService::determine_status(6000, 6000),\n HealthStatus::Operational\n );\n assert_eq!(\n StreamCheckService::determine_status(6001, 6000),\n HealthStatus::Degraded\n );\n }\n\n #[test]\n fn test_should_retry() {\n assert!(StreamCheckService::should_retry(\"Request timeout\"));\n assert!(StreamCheckService::should_retry(\"request timed out\"));\n assert!(StreamCheckService::should_retry(\"connection abort\"));\n assert!(!StreamCheckService::should_retry(\"API Key invalid\"));\n }\n\n #[test]\n fn test_default_config() {\n let config = StreamCheckConfig::default();\n assert_eq!(config.timeout_secs, 45);\n assert_eq!(config.max_retries, 2);\n assert_eq!(config.degraded_threshold_ms, 6000);\n }\n\n #[test]\n fn test_parse_model_with_effort() {\n // 带 @ 分隔符\n let (model, effort) = StreamCheckService::parse_model_with_effort(\"gpt-5.1-codex@low\");\n assert_eq!(model, \"gpt-5.1-codex\");\n assert_eq!(effort, Some(\"low\".to_string()));\n\n // 带 # 分隔符\n let (model, effort) = StreamCheckService::parse_model_with_effort(\"o1-preview#high\");\n assert_eq!(model, \"o1-preview\");\n assert_eq!(effort, Some(\"high\".to_string()));\n\n // 无分隔符\n let (model, effort) = StreamCheckService::parse_model_with_effort(\"gpt-4o-mini\");\n assert_eq!(model, \"gpt-4o-mini\");\n assert_eq!(effort, None);\n }\n\n #[test]\n fn test_detect_model_not_found() {\n // OpenAI 典型响应:404 + model_not_found 错误码\n let openai_404 = r#\"{\"error\":{\"message\":\"The model `gpt-5.1-codex` does not exist or you do not have access to it\",\"type\":\"invalid_request_error\",\"param\":null,\"code\":\"model_not_found\"}}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(404, openai_404),\n Some(\"modelNotFound\")\n );\n\n // Anthropic 典型响应:404 + not_found_error + 提到 model\n let anthropic_404 = r#\"{\"type\":\"error\",\"error\":{\"type\":\"not_found_error\",\"message\":\"model: claude-deprecated\"}}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(404, anthropic_404),\n Some(\"modelNotFound\")\n );\n\n // 400 + invalid model 也算\n let bad_req = r#\"{\"error\":{\"message\":\"invalid model specified\"}}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(400, bad_req),\n Some(\"modelNotFound\")\n );\n\n // 通用 404(比如 Base URL 错误),body 里没有 model 字样 → 不应误判\n let generic_404 = r#\"{\"error\":\"Not Found\"}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(404, generic_404),\n None\n );\n\n // 5xx 就算 body 里有 \"model does not exist\" 也不分类(避免误判)\n let server_error = r#\"{\"error\":\"model does not exist\"}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(500, server_error),\n None\n );\n\n // 401 鉴权错误(body 里没有 model 字样)\n let auth_err = r#\"{\"error\":\"Invalid API key\"}\"#;\n assert_eq!(\n StreamCheckService::detect_error_category(401, auth_err),\n None\n );\n }\n\n #[test]\n fn test_detect_qianfan_coding_plan_quota_errors() {\n let cases = [\n r#\"{\"error\":{\"code\":\"coding_plan_hour_quota_exceeded\",\"message\":\"hour quota exceeded\"}}\"#,\n r#\"{\"error\":{\"code\":\"coding_plan_week_quota_exceeded\",\"message\":\"week quota exceeded\"}}\"#,\n r#\"{\"error\":{\"code\":\"coding_plan_month_quota_exceeded\",\"message\":\"month quota exceeded\"}}\"#,\n ];\n\n for body in cases {\n assert_eq!(\n StreamCheckService::detect_error_category(429, body),\n Some(\"quotaExceeded\")\n );\n }\n }\n\n #[test]\n fn test_get_os_name() {\n let os_name = StreamCheckService::get_os_name();\n // 确保返回非空字符串\n assert!(!os_name.is_empty());\n // 在 macOS 上应该返回 \"MacOS\"\n #[cfg(target_os = \"macos\")]\n assert_eq!(os_name, \"MacOS\");\n // 在 Linux 上应该返回 \"Linux\"\n #[cfg(target_os = \"linux\")]\n assert_eq!(os_name, \"Linux\");\n // 在 Windows 上应该返回 \"Windows\"\n #[cfg(target_os = \"windows\")]\n assert_eq!(os_name, \"Windows\");\n }\n\n #[test]\n fn test_get_arch_name() {\n let arch_name = StreamCheckService::get_arch_name();\n // 确保返回非空字符串\n assert!(!arch_name.is_empty());\n // 在 ARM64 上应该返回 \"arm64\"\n #[cfg(target_arch = \"aarch64\")]\n assert_eq!(arch_name, \"arm64\");\n // 在 x86_64 上应该返回 \"x86_64\"\n #[cfg(target_arch = \"x86_64\")]\n assert_eq!(arch_name, \"x86_64\");\n }\n\n #[test]\n fn test_auth_strategy_imports() {\n // 验证 AuthStrategy 枚举可以正常使用\n let anthropic = AuthStrategy::Anthropic;\n let claude_auth = AuthStrategy::ClaudeAuth;\n let bearer = AuthStrategy::Bearer;\n\n // 验证不同的策略是不相等的\n assert_ne!(anthropic, claude_auth);\n assert_ne!(anthropic, bearer);\n assert_ne!(claude_auth, bearer);\n\n // 验证相同策略是相等的\n assert_eq!(anthropic, AuthStrategy::Anthropic);\n assert_eq!(claude_auth, AuthStrategy::ClaudeAuth);\n assert_eq!(bearer, AuthStrategy::Bearer);\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_full_url_mode() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://relay.example/v1/chat/completions\",\n AuthStrategy::Bearer,\n \"openai_chat\",\n true,\n \"gpt-5.5\",\n );\n\n assert_eq!(url, \"https://relay.example/v1/chat/completions\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_github_copilot() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://api.githubcopilot.com\",\n AuthStrategy::GitHubCopilot,\n \"openai_chat\",\n false,\n \"gpt-5.5\",\n );\n\n assert_eq!(url, \"https://api.githubcopilot.com/chat/completions\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_github_copilot_responses() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://api.githubcopilot.com\",\n AuthStrategy::GitHubCopilot,\n \"openai_responses\",\n false,\n \"gpt-5.5\",\n );\n\n assert_eq!(url, \"https://api.githubcopilot.com/v1/responses\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_openai_chat() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://example.com/v1\",\n AuthStrategy::Bearer,\n \"openai_chat\",\n false,\n \"gpt-5.5\",\n );\n\n assert_eq!(url, \"https://example.com/v1/chat/completions\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_openai_responses() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://example.com/v1\",\n AuthStrategy::Bearer,\n \"openai_responses\",\n false,\n \"gpt-5.5\",\n );\n\n assert_eq!(url, \"https://example.com/v1/responses\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_anthropic() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://api.anthropic.com\",\n AuthStrategy::Anthropic,\n \"anthropic\",\n false,\n \"claude-sonnet-4-6\",\n );\n\n assert_eq!(url, \"https://api.anthropic.com/v1/messages\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_gemini_native() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://generativelanguage.googleapis.com\",\n AuthStrategy::Google,\n \"gemini_native\",\n false,\n \"gemini-2.5-flash\",\n );\n\n assert_eq!(\n url,\n \"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse\"\n );\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_gemini_native_full_url_openai_compat_base() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\",\n AuthStrategy::Google,\n \"gemini_native\",\n true,\n \"gemini-2.5-flash\",\n );\n\n assert_eq!(\n url,\n \"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse\"\n );\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_gemini_native_opaque_full_url() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://relay.example/custom/generate-content\",\n AuthStrategy::Google,\n \"gemini_native\",\n true,\n \"gemini-2.5-flash\",\n );\n\n assert_eq!(url, \"https://relay.example/custom/generate-content?alt=sse\");\n }\n\n #[test]\n fn test_resolve_claude_stream_url_for_gemini_native_cloudflare_vertex_full_url() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://gateway.ai.cloudflare.com/v1/account/gateway/google-vertex-ai/v1/projects/project/locations/us-central1/publishers/google/models/gemini-3.5-flash:streamGenerateContent\",\n AuthStrategy::Google,\n \"gemini_native\",\n true,\n \"gemini-2.5-flash\",\n );\n\n assert_eq!(\n url,\n \"https://gateway.ai.cloudflare.com/v1/account/gateway/google-vertex-ai/v1/projects/project/locations/us-central1/publishers/google/models/gemini-3.5-flash:streamGenerateContent?alt=sse\"\n );\n }\n\n /// Regression: Gemini SDK outputs commonly surface model ids as the\n /// resource-name form `models/gemini-2.5-pro`. Interpolating that raw\n /// value used to produce `/v1beta/models/models/gemini-2.5-pro:...`\n /// which the upstream rejects and the health check records as a\n /// false-negative for an otherwise valid provider.\n #[test]\n fn test_resolve_claude_stream_url_for_gemini_native_strips_models_prefix() {\n let url = StreamCheckService::resolve_claude_stream_url(\n \"https://generativelanguage.googleapis.com\",\n AuthStrategy::Google,\n \"gemini_native\",\n false,\n \"models/gemini-2.5-pro\",\n );\n\n assert_eq!(\n url,\n \"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:streamGenerateContent?alt=sse\"\n );\n }\n\n #[test]\n fn test_resolve_codex_stream_urls_for_full_url_mode() {\n let urls = StreamCheckService::resolve_codex_stream_urls(\n \"https://relay.example/custom/responses\",\n true,\n );\n\n assert_eq!(urls, vec![\"https://relay.example/custom/responses\"]);\n }\n\n #[test]\n fn test_resolve_codex_stream_urls_for_v1_base() {\n let urls =\n StreamCheckService::resolve_codex_stream_urls(\"https://api.openai.com/v1\", false);\n\n assert_eq!(urls, vec![\"https://api.openai.com/v1/responses\"]);\n }\n\n /// 纯 origin 必须优先 /v1/responses(与 CodexAdapter::build_url 一致)。\n /// OpenAI 官方 /responses 实际挂在 /v1 下,bare 路径只在用户配置错误的\n /// 反代上才可能命中,作为 fallback 保留即可。\n #[test]\n fn test_resolve_codex_stream_urls_for_origin_base_prioritizes_v1() {\n let urls = StreamCheckService::resolve_codex_stream_urls(\"https://api.openai.com\", false);\n\n assert_eq!(\n urls,\n vec![\n \"https://api.openai.com/v1/responses\",\n \"https://api.openai.com/responses\",\n ]\n );\n }\n\n /// 自定义前缀(如 /openai)生产路径不会自动补 /v1,Stream Check 应先打\n /// 不带 /v1 的版本与之对齐;/v1 作为 misconfigured 兜底。\n #[test]\n fn test_resolve_codex_stream_urls_for_custom_prefix() {\n let urls =\n StreamCheckService::resolve_codex_stream_urls(\"https://relay.example/openai\", false);\n\n assert_eq!(\n urls,\n vec![\n \"https://relay.example/openai/responses\",\n \"https://relay.example/openai/v1/responses\",\n ]\n );\n }\n\n #[test]\n fn test_resolve_codex_stream_urls_recognizes_full_endpoint_without_flag() {\n let urls = StreamCheckService::resolve_codex_stream_urls(\n \"https://api.openai.com/v1/responses\",\n false,\n );\n\n assert_eq!(urls, vec![\"https://api.openai.com/v1/responses\"]);\n }\n\n #[test]\n fn test_resolve_codex_chat_stream_urls_for_v1_base() {\n let urls = StreamCheckService::resolve_codex_chat_stream_urls(\n \"https://api.deepseek.com/v1\",\n false,\n );\n\n assert_eq!(urls, vec![\"https://api.deepseek.com/v1/chat/completions\"]);\n }\n\n /// 纯 origin 必须优先 /v1/chat/completions,与 CodexAdapter::build_url 一致;\n /// bare /chat/completions 仅作为 fallback。如果颠倒了优先级,上游对 bare\n /// 路径返回 401/400/405 时(非 404)fallback 不会触发,会误判为不可用。\n #[test]\n fn test_resolve_codex_chat_stream_urls_for_origin_base_prioritizes_v1() {\n let urls =\n StreamCheckService::resolve_codex_chat_stream_urls(\"https://api.deepseek.com\", false);\n\n assert_eq!(\n urls,\n vec![\n \"https://api.deepseek.com/v1/chat/completions\",\n \"https://api.deepseek.com/chat/completions\",\n ]\n );\n }\n\n /// 自定义前缀(路径中已经包含段如 `/openai`)生产路径不会自动补 /v1。\n /// Stream Check 应先打不带 /v1 的版本,与 build_url 行为一致。\n #[test]\n fn test_resolve_codex_chat_stream_urls_for_custom_prefix() {\n let urls =\n StreamCheckService::resolve_codex_chat_stream_urls(\"https://example.com/openai\", false);\n\n assert_eq!(\n urls,\n vec![\n \"https://example.com/openai/chat/completions\",\n \"https://example.com/openai/v1/chat/completions\",\n ]\n );\n }\n\n #[test]\n fn test_resolve_codex_chat_stream_urls_for_full_url_mode() {\n let urls = StreamCheckService::resolve_codex_chat_stream_urls(\n \"https://relay.example/custom/chat/completions\",\n true,\n );\n\n assert_eq!(urls, vec![\"https://relay.example/custom/chat/completions\"]);\n }\n\n /// 用户在 base_url 里直接写完整 chat/completions endpoint 但忘开 is_full_url 时,\n /// 不应该再追加 `/chat/completions` 后缀。\n #[test]\n fn test_resolve_codex_chat_stream_urls_recognizes_full_endpoint_without_flag() {\n let urls = StreamCheckService::resolve_codex_chat_stream_urls(\n \"https://api.deepseek.com/v1/chat/completions\",\n false,\n );\n\n assert_eq!(urls, vec![\"https://api.deepseek.com/v1/chat/completions\"]);\n }\n}\n"}}}}