@nac3/forge-cli 1.0.77 → 1.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,527 +1,531 @@
1
- {
2
- "panel.brand": "Yujin Forge",
3
- "panel.brand.kanji": "侑",
4
- "panel.tagline": "Voice-first development assistant",
5
- "panel.input.placeholder": "Ask Yujin",
6
- "panel.button.send": "Send",
7
- "panel.button.mic": "Speak (press and hold)",
8
- "panel.button.mic.recording": "Press to stop recording",
9
- "panel.button.tts": "Voice on",
10
- "panel.button.keys": "Keys",
11
- "panel.button.minimise": "Minimise",
12
- "panel.button.maximise": "Maximise",
13
- "panel.button.close": "Close",
14
- "panel.button.language": "Language",
15
- "panel.trace.title": "Action trace",
16
- "panel.trace.count.one": "{n} tool call",
17
- "panel.trace.count.other": "{n} tool calls",
18
- "panel.trace.empty.kanji": "空",
19
- "panel.trace.empty.body": "Yujin Forge shows every tool it invokes to answer you here: manifest reads, SPEC searches, component edits, document reads. Ask something that requires consulting them.",
20
- "panel.trace.badge.tool": "TOOL",
21
- "panel.trace.badge.voice": "VOICE",
22
- "panel.trace.badge.error": "ERROR",
23
- "panel.stream.empty.kanji": "侑仁",
24
- "panel.stream.empty.body": "Yujin Forge online. Ask for changes to the project.",
25
- "panel.status.no_audio": "No audio captured. The microphone probably did not pick up anything.",
26
- "panel.status.did_not_catch": "Did not catch that. Try again.",
27
- "panel.status.mic_denied": "Microphone permission denied or unavailable: {error}",
28
- "panel.status.voice_failed": "Voice failed: {error}",
29
- "panel.status.voice_reply_failed": "Could not play the reply: {error}",
30
- "panel.status.audio_play_error": "Could not play the audio: {error}",
31
- "panel.status.reading": "Reading {filename}...",
32
- "panel.status.ingest_failed": "Ingest failed: {error}",
33
- "panel.status.read_failed": "Could not read the specification: {error}",
34
- "panel.drop.title": "Drop the specification here",
35
- "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
- "panel.ingest.spec_attached": "Spec attached: {filename}, {kb} KB",
37
- "panel.ingest.read_label": "Read.",
38
- "panel.ingest.title_label": "Title: {title}",
39
- "panel.ingest.no_title": "(no title)",
40
- "panel.ingest.format_label": "Format: {format} / {sections} section(s) / {kb} KB",
41
- "panel.ingest.first_lines": "First lines:",
42
- "panel.ingest.action_done": "Action {tool} completed.",
43
- "vault.modal.aria.close": "Close credentials modal",
44
- "vault.modal.title": "Credentials (vault)",
45
- "vault.tab.list": "Loaded slots",
46
- "vault.tab.add": "Add",
47
- "vault.list.loading": "Loading...",
48
- "vault.list.empty": "You have not loaded any key yet. Click \"Add\" to start.",
49
- "vault.add.slot_label": "Slot name",
50
- "vault.add.slot_hint": "Lowercase letters, digits, underscore, hyphen. Must start with a letter.",
51
- "vault.add.value_label": "Plaintext value (masked)",
52
- "vault.add.value_hint": "Shown only once at save. After that you can replace it but not read it back.",
53
- "vault.add.button_save": "Save",
54
- "vault.add.button_cancel": "Cancel",
55
- "vault.add.success": "Slot {slot} saved.",
56
- "vault.add.overwrite": "Slot {slot} overwritten.",
57
- "manual.intro": "Yujin Forge -- user manual",
58
- "manual.section.welcome": "Welcome",
59
- "manual.section.install": "Installation",
60
- "manual.section.first_run": "First run",
61
- "manual.section.voice": "Voice commands",
62
- "manual.section.spec_ingest": "Specification ingest",
63
- "manual.section.troubleshooting": "Troubleshooting",
64
- "manual.section.support": "Support",
65
- "lang.name.es": "Spanish",
66
- "lang.name.en": "English",
67
- "lang.name.pt": "Portuguese",
68
- "lang.name.fr": "French",
69
- "lang.name.ja": "Japanese",
70
- "lang.name.zh": "Chinese",
71
- "lang.name.hi": "Hindi",
72
- "lang.name.ar": "Arabic",
73
- "lang.name.de": "German",
74
- "lang.name.it": "Italian",
75
- "recap.fallback_period": ".",
76
- "recap.empty": "There is nothing to recap yet.",
77
- "error_ui.severity.info": "INFO",
78
- "error_ui.severity.warning": "WARNING",
79
- "error_ui.severity.error": "ERROR",
80
- "error_ui.severity.fatal": "FATAL",
81
- "error_ui.label.what": "What happened",
82
- "error_ui.label.why": "Why",
83
- "error_ui.label.fix": "How to fix",
84
- "error_ui.label.cmd": "Command",
85
- "error_ui.label.docs": "Local docs",
86
- "error_ui.label.retry": "Retry in",
87
- "error_ui.copy_btn": "Copy command",
88
- "error_ui.unknown.what": "Forge encountered an internal error (unknown code).",
89
- "error_ui.unknown.why": "The code {code} is not in the catalog. This is a bug.",
90
- "error_ui.unknown.fix": "Open an issue at https://github.com/yujinapp/yujin-forge/issues with the code + the traceback.",
91
- "error.cap_frontier_exhausted.what": "Monthly frontier tier token cap reached (large model).",
92
- "error.cap_frontier_exhausted.why": "Your plan {plan} allows up to {cap} tokens/month on frontier. You used {used}. Resets at the start of the next UTC month.",
93
- "error.cap_frontier_exhausted.fix": "Switch to direct Anthropic BYOK: bypasses the worker monthly cap. Your cost becomes whatever Anthropic charges directly.",
94
- "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
- "error.cap_eco_exhausted.what": "Monthly eco tier token cap reached (small model).",
96
- "error.cap_eco_exhausted.why": "Your plan {plan} allows up to {cap} tokens/month on eco. You used {used}. Resets at the start of the next UTC month.",
97
- "error.cap_eco_exhausted.fix": "Switch to direct BYOK or upgrade your plan. BYOK bypasses the worker cap.",
98
- "error.cap_eco_exhausted.cmd": "yf brain config --eco-provider google_ai --eco-model gemini-2.5-flash-lite",
99
- "error.tier_not_in_plan.what": "Tier {tier} is not enabled on your plan.",
100
- "error.tier_not_in_plan.why": "Your plan {plan} does not include the {tier} tier. You are probably on free-public or your license expired.",
101
- "error.tier_not_in_plan.fix": "Activate a paid license, or switch to direct BYOK (your cost, no worker cap).",
102
- "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
- "error.response_truncated.what": "The model response was cut off before finishing.",
104
- "error.response_truncated.why": "The managed_max_tokens_per_turn = {limit} tokens limit was reached mid-turn. The model stopped generating.",
105
- "error.response_truncated.fix": "Raise the limit via yf limits. Applies to the next turn without restarting the chat.",
106
- "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
- "error.response_truncated.banner": "[Response truncated by max_tokens={max}. Raise the limit with: yf limits set managed_max_tokens_per_turn {suggested}]",
108
- "error.modal_trace_stale.what": "The approval modal expired or is orphaned.",
109
- "error.modal_trace_stale.why": "Trace_id {trace_id} has no pending approval in the dispatcher. Likely race condition between invoke and panel state, or a previous cancel left the trace zombie.",
110
- "error.modal_trace_stale.fix": "Retry the verb from chat: starts a fresh trace. If it persists, run yf doctor to check the panel.",
111
- "error.modal_trace_stale.cmd": "yf doctor",
112
- "error.byok_key_missing.what": "Missing API key for provider {provider}.",
113
- "error.byok_key_missing.why": "You configured {provider} as the {tier} tier provider but the byok_{slot} slot is not in the encrypted Vault.",
114
- "error.byok_key_missing.fix": "Configure the key with yf keys set (atomic, mode 0600, never logged).",
115
- "error.byok_key_missing.cmd": "yf keys set {slot}",
116
- "error.worker_unreachable.what": "Could not reach the yujin.app worker.",
117
- "error.worker_unreachable.why": "Network timeout or worker down (HTTP {status}). Retried {attempts} times.",
118
- "error.worker_unreachable.fix": "Check your internet. If it is OK, switch temporarily to direct BYOK to avoid the worker dependency.",
119
- "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
- "error.vault_decrypt_failed.what": "Could not decrypt a key from the Vault.",
121
- "error.vault_decrypt_failed.why": "The master key is incorrect or the Vault file is corrupted. Can happen if you moved config between machines without migrating the master, or due to disk error.",
122
- "error.vault_decrypt_failed.fix": "Pull the server copy (re-encrypts with your local master) if you have server backup active.",
123
- "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
- "error.shell_exec_rejected.what": "You rejected the R8 modal for yujin.shell.exec.",
125
- "error.shell_exec_rejected.why": "Command {command} was classified as {classification}. shell.exec always asks for approval for safety, even if the command is read-only.",
126
- "error.shell_exec_rejected.fix": "If the command was read-only (yf projects active, git status, ls), use the equivalent native verb. If it was needed and you rejected by mistake, re-invoke.",
127
- "error.project_not_registered.what": "No adopter project registered.",
128
- "error.project_not_registered.why": "The verb you invoked needs an active project root but ~/.yujin-forge/projects.json has no entries.",
129
- "error.project_not_registered.fix": "Create one with yujin.project.init or register an existing one with yf projects add.",
130
- "error.project_not_registered.cmd": "yf projects scan",
131
- "panel.button.agents": "Agents",
132
- "panel.agents.title": "Agents",
133
- "panel.agents.subtitle": "Director and sub-agents registered in this project",
134
- "panel.agents.empty.title": "No agents yet",
135
- "panel.agents.empty.body": "Run `yf agent install --defaults` to register the Director and its 4 sub-agents (Analyst, Coder, Tester, Scaffolder).",
136
- "panel.agents.legend.eco": "Eco",
137
- "panel.agents.legend.managed": "Managed",
138
- "panel.agents.legend.frontier": "Frontier",
139
- "panel.agents.status.disabled": "Agent runtime not started",
140
- "panel.agents.event.running": "Running",
141
- "panel.agents.event.idle": "Idle",
142
- "panel.agents.tick.live": "Connected",
143
- "panel.agents.tick.lost": "Connection lost",
144
- "workflow.phase.i": "Triage and intent",
145
- "workflow.phase.ii": "Clarification (functional + 4 NFR + blocks)",
146
- "workflow.phase.iii": "Specs (RFP + Arch + Design + approvals)",
147
- "workflow.phase.iv": "Bootstrap",
148
- "workflow.phase.v": "Block development",
149
- "workflow.phase.vi": "Deploy + post-launch",
150
- "wizard.title": "Welcome to Yujin Forge",
151
- "wizard.close": "Close",
152
- "wizard.intro": "To get started, choose how Forge connects to your AI model. You can change this later from Settings.",
153
- "wizard.back": "Back",
154
- "wizard.start": "Get started",
155
- "wizard.plan.badge": "Recommended",
156
- "wizard.plan.title": "Claude Plan",
157
- "wizard.plan.desc": "Monthly Claude subscription. Cheapest option for steady use. Forge uses your claude -p session.",
158
- "wizard.plan.price": "Flat monthly fee (Plan)",
159
- "wizard.plan.step.title": "Connect your Claude Plan",
160
- "wizard.plan.step.1": "Open a new terminal.",
161
- "wizard.plan.step.2": "Run the command claude (no args) and complete the browser login.",
162
- "wizard.plan.step.3": "Come back here and click I am logged in to verify.",
163
- "wizard.plan.done": "I am logged in",
164
- "wizard.byok.title": "Your own API key (BYOK)",
165
- "wizard.byok.desc": "Your own key from any provider (Anthropic, OpenAI, Google, DeepSeek...). Pay per use on your account.",
166
- "wizard.byok.price": "Pay-per-use (Console)",
167
- "wizard.byok.step.title": "Pick your provider and paste your API key",
168
- "wizard.byok.step.intro": "Pick the provider from the menu and paste its API key. Forge stores it encrypted in the local Vault; it never leaves your machine.",
169
- "wizard.byok.test": "Validate and save",
170
- "wizard.skip.title": "I am already set up",
171
- "wizard.skip.desc": "Skip the wizard. You can open it again later from Settings.",
172
- "wizard.done.kanji": "Done",
173
- "wizard.done.title": "Done",
174
- "wizard.done.msg": "Forge is set up. Start chatting.",
175
- "pizarron.button.read": "Read aloud",
176
- "pizarron.button.copy": "Copy",
177
- "pizarron.button.edit": "Edit",
178
- "pizarron.graph.refresh": "Refresh",
179
- "pizarron.graph.regenerating": "Regenerating...",
180
- "pizarron.graph.detail.hint": "Tap a node to see its detail.",
181
- "pizarron.graph.detail.empty": "No detail for this node.",
1
+ {
2
+ "panel.brand": "Yujin Forge",
3
+ "panel.brand.kanji": "侑",
4
+ "panel.tagline": "Voice-first development assistant",
5
+ "panel.input.placeholder": "Ask Yujin",
6
+ "panel.button.send": "Send",
7
+ "panel.button.mic": "Speak (press and hold)",
8
+ "panel.button.mic.recording": "Press to stop recording",
9
+ "panel.button.tts": "Voice on",
10
+ "panel.button.keys": "Keys",
11
+ "panel.button.minimise": "Minimise",
12
+ "panel.button.maximise": "Maximise",
13
+ "panel.button.close": "Close",
14
+ "panel.button.language": "Language",
15
+ "panel.trace.title": "Action trace",
16
+ "panel.trace.count.one": "{n} tool call",
17
+ "panel.trace.count.other": "{n} tool calls",
18
+ "panel.trace.empty.kanji": "空",
19
+ "panel.trace.empty.body": "Yujin Forge shows every tool it invokes to answer you here: manifest reads, SPEC searches, component edits, document reads. Ask something that requires consulting them.",
20
+ "panel.trace.badge.tool": "TOOL",
21
+ "panel.trace.badge.voice": "VOICE",
22
+ "panel.trace.badge.error": "ERROR",
23
+ "panel.stream.empty.kanji": "侑仁",
24
+ "panel.stream.empty.body": "Yujin Forge online. Ask for changes to the project.",
25
+ "panel.status.no_audio": "No audio captured. The microphone probably did not pick up anything.",
26
+ "panel.status.did_not_catch": "Did not catch that. Try again.",
27
+ "panel.status.mic_denied": "Microphone permission denied or unavailable: {error}",
28
+ "panel.status.voice_failed": "Voice failed: {error}",
29
+ "panel.status.voice_reply_failed": "Could not play the reply: {error}",
30
+ "panel.status.audio_play_error": "Could not play the audio: {error}",
31
+ "panel.status.reading": "Reading {filename}...",
32
+ "panel.status.ingest_failed": "Ingest failed: {error}",
33
+ "panel.status.read_failed": "Could not read the specification: {error}",
34
+ "panel.drop.title": "Drop the specification here",
35
+ "panel.drop.hint": "PDF, DOCX, HTML, MD, RTF, EPUB, CSV, XLSX, TXT",
36
+ "panel.ingest.spec_attached": "Spec attached: {filename}, {kb} KB",
37
+ "panel.ingest.read_label": "Read.",
38
+ "panel.ingest.title_label": "Title: {title}",
39
+ "panel.ingest.no_title": "(no title)",
40
+ "panel.ingest.format_label": "Format: {format} / {sections} section(s) / {kb} KB",
41
+ "panel.ingest.first_lines": "First lines:",
42
+ "panel.ingest.action_done": "Action {tool} completed.",
43
+ "vault.modal.aria.close": "Close credentials modal",
44
+ "vault.modal.title": "Credentials (vault)",
45
+ "vault.tab.list": "Loaded slots",
46
+ "vault.tab.add": "Add",
47
+ "vault.list.loading": "Loading...",
48
+ "vault.list.empty": "You have not loaded any key yet. Click \"Add\" to start.",
49
+ "vault.add.slot_label": "Slot name",
50
+ "vault.add.slot_hint": "Lowercase letters, digits, underscore, hyphen. Must start with a letter.",
51
+ "vault.add.value_label": "Plaintext value (masked)",
52
+ "vault.add.value_hint": "Shown only once at save. After that you can replace it but not read it back.",
53
+ "vault.add.button_save": "Save",
54
+ "vault.add.button_cancel": "Cancel",
55
+ "vault.add.success": "Slot {slot} saved.",
56
+ "vault.add.overwrite": "Slot {slot} overwritten.",
57
+ "manual.intro": "Yujin Forge -- user manual",
58
+ "manual.section.welcome": "Welcome",
59
+ "manual.section.install": "Installation",
60
+ "manual.section.first_run": "First run",
61
+ "manual.section.voice": "Voice commands",
62
+ "manual.section.spec_ingest": "Specification ingest",
63
+ "manual.section.troubleshooting": "Troubleshooting",
64
+ "manual.section.support": "Support",
65
+ "lang.name.es": "Spanish",
66
+ "lang.name.en": "English",
67
+ "lang.name.pt": "Portuguese",
68
+ "lang.name.fr": "French",
69
+ "lang.name.ja": "Japanese",
70
+ "lang.name.zh": "Chinese",
71
+ "lang.name.hi": "Hindi",
72
+ "lang.name.ar": "Arabic",
73
+ "lang.name.de": "German",
74
+ "lang.name.it": "Italian",
75
+ "recap.fallback_period": ".",
76
+ "recap.empty": "There is nothing to recap yet.",
77
+ "error_ui.severity.info": "INFO",
78
+ "error_ui.severity.warning": "WARNING",
79
+ "error_ui.severity.error": "ERROR",
80
+ "error_ui.severity.fatal": "FATAL",
81
+ "error_ui.label.what": "What happened",
82
+ "error_ui.label.why": "Why",
83
+ "error_ui.label.fix": "How to fix",
84
+ "error_ui.label.cmd": "Command",
85
+ "error_ui.label.docs": "Local docs",
86
+ "error_ui.label.retry": "Retry in",
87
+ "error_ui.copy_btn": "Copy command",
88
+ "error_ui.unknown.what": "Forge encountered an internal error (unknown code).",
89
+ "error_ui.unknown.why": "The code {code} is not in the catalog. This is a bug.",
90
+ "error_ui.unknown.fix": "Open an issue at https://github.com/yujinapp/yujin-forge/issues with the code + the traceback.",
91
+ "error.cap_frontier_exhausted.what": "Monthly frontier tier token cap reached (large model).",
92
+ "error.cap_frontier_exhausted.why": "Your plan {plan} allows up to {cap} tokens/month on frontier. You used {used}. Resets at the start of the next UTC month.",
93
+ "error.cap_frontier_exhausted.fix": "Switch to direct Anthropic BYOK: bypasses the worker monthly cap. Your cost becomes whatever Anthropic charges directly.",
94
+ "error.cap_frontier_exhausted.cmd": "yf brain config --frontier-provider anthropic --frontier-model claude-opus-4-7",
95
+ "error.cap_eco_exhausted.what": "Monthly eco tier token cap reached (small model).",
96
+ "error.cap_eco_exhausted.why": "Your plan {plan} allows up to {cap} tokens/month on eco. You used {used}. Resets at the start of the next UTC month.",
97
+ "error.cap_eco_exhausted.fix": "Switch to direct BYOK or upgrade your plan. BYOK bypasses the worker cap.",
98
+ "error.cap_eco_exhausted.cmd": "yf brain config --eco-provider google_ai --eco-model gemini-2.5-flash-lite",
99
+ "error.tier_not_in_plan.what": "Tier {tier} is not enabled on your plan.",
100
+ "error.tier_not_in_plan.why": "Your plan {plan} does not include the {tier} tier. You are probably on free-public or your license expired.",
101
+ "error.tier_not_in_plan.fix": "Activate a paid license, or switch to direct BYOK (your cost, no worker cap).",
102
+ "error.tier_not_in_plan.cmd": "yf license activate --key <jwt>",
103
+ "error.response_truncated.what": "The model response was cut off before finishing.",
104
+ "error.response_truncated.why": "The managed_max_tokens_per_turn = {limit} tokens limit was reached mid-turn. The model stopped generating.",
105
+ "error.response_truncated.fix": "Raise the limit via yf limits. Applies to the next turn without restarting the chat.",
106
+ "error.response_truncated.cmd": "yf limits set managed_max_tokens_per_turn 16384",
107
+ "error.response_truncated.banner": "[Response truncated by max_tokens={max}. Raise the limit with: yf limits set managed_max_tokens_per_turn {suggested}]",
108
+ "error.modal_trace_stale.what": "The approval modal expired or is orphaned.",
109
+ "error.modal_trace_stale.why": "Trace_id {trace_id} has no pending approval in the dispatcher. Likely race condition between invoke and panel state, or a previous cancel left the trace zombie.",
110
+ "error.modal_trace_stale.fix": "Retry the verb from chat: starts a fresh trace. If it persists, run yf doctor to check the panel.",
111
+ "error.modal_trace_stale.cmd": "yf doctor",
112
+ "error.byok_key_missing.what": "Missing API key for provider {provider}.",
113
+ "error.byok_key_missing.why": "You configured {provider} as the {tier} tier provider but the byok_{slot} slot is not in the encrypted Vault.",
114
+ "error.byok_key_missing.fix": "Configure the key with yf keys set (atomic, mode 0600, never logged).",
115
+ "error.byok_key_missing.cmd": "yf keys set {slot}",
116
+ "error.worker_unreachable.what": "Could not reach the yujin.app worker.",
117
+ "error.worker_unreachable.why": "Network timeout or worker down (HTTP {status}). Retried {attempts} times.",
118
+ "error.worker_unreachable.fix": "Check your internet. If it is OK, switch temporarily to direct BYOK to avoid the worker dependency.",
119
+ "error.worker_unreachable.cmd": "yf brain config --frontier-provider anthropic",
120
+ "error.vault_decrypt_failed.what": "Could not decrypt a key from the Vault.",
121
+ "error.vault_decrypt_failed.why": "The master key is incorrect or the Vault file is corrupted. Can happen if you moved config between machines without migrating the master, or due to disk error.",
122
+ "error.vault_decrypt_failed.fix": "Pull the server copy (re-encrypts with your local master) if you have server backup active.",
123
+ "error.vault_decrypt_failed.cmd": "yf keys setup --pull",
124
+ "error.shell_exec_rejected.what": "You rejected the R8 modal for yujin.shell.exec.",
125
+ "error.shell_exec_rejected.why": "Command {command} was classified as {classification}. shell.exec always asks for approval for safety, even if the command is read-only.",
126
+ "error.shell_exec_rejected.fix": "If the command was read-only (yf projects active, git status, ls), use the equivalent native verb. If it was needed and you rejected by mistake, re-invoke.",
127
+ "error.project_not_registered.what": "No adopter project registered.",
128
+ "error.project_not_registered.why": "The verb you invoked needs an active project root but ~/.yujin-forge/projects.json has no entries.",
129
+ "error.project_not_registered.fix": "Create one with yujin.project.init or register an existing one with yf projects add.",
130
+ "error.project_not_registered.cmd": "yf projects scan",
131
+ "panel.button.agents": "Agents",
132
+ "panel.agents.title": "Agents",
133
+ "panel.agents.subtitle": "Director and sub-agents registered in this project",
134
+ "panel.agents.empty.title": "No agents yet",
135
+ "panel.agents.empty.body": "Run `yf agent install --defaults` to register the Director and its 4 sub-agents (Analyst, Coder, Tester, Scaffolder).",
136
+ "panel.agents.legend.eco": "Eco",
137
+ "panel.agents.legend.managed": "Managed",
138
+ "panel.agents.legend.frontier": "Frontier",
139
+ "panel.agents.status.disabled": "Agent runtime not started",
140
+ "panel.agents.event.running": "Running",
141
+ "panel.agents.event.idle": "Idle",
142
+ "panel.agents.tick.live": "Connected",
143
+ "panel.agents.tick.lost": "Connection lost",
144
+ "workflow.phase.i": "Triage and intent",
145
+ "workflow.phase.ii": "Clarification (functional + 4 NFR + blocks)",
146
+ "workflow.phase.iii": "Specs (RFP + Arch + Design + approvals)",
147
+ "workflow.phase.iv": "Bootstrap",
148
+ "workflow.phase.v": "Block development",
149
+ "workflow.phase.vi": "Deploy + post-launch",
150
+ "wizard.title": "Welcome to Yujin Forge",
151
+ "wizard.close": "Close",
152
+ "wizard.intro": "To get started, choose how Forge connects to your AI model. You can change this later from Settings.",
153
+ "wizard.back": "Back",
154
+ "wizard.start": "Get started",
155
+ "wizard.plan.badge": "Recommended",
156
+ "wizard.plan.title": "Claude Plan",
157
+ "wizard.plan.desc": "Monthly Claude subscription. Cheapest option for steady use. Forge uses your claude -p session.",
158
+ "wizard.plan.price": "Flat monthly fee (Plan)",
159
+ "wizard.plan.step.title": "Connect your Claude Plan",
160
+ "wizard.plan.step.1": "Open a new terminal.",
161
+ "wizard.plan.step.2": "Run the command claude (no args) and complete the browser login.",
162
+ "wizard.plan.step.3": "Come back here and click I am logged in to verify.",
163
+ "wizard.plan.done": "I am logged in",
164
+ "wizard.byok.title": "Your own API key (BYOK)",
165
+ "wizard.byok.desc": "Your own key from any provider (Anthropic, OpenAI, Google, DeepSeek...). Pay per use on your account.",
166
+ "wizard.byok.price": "Pay-per-use (Console)",
167
+ "wizard.byok.step.title": "Pick your provider and paste your API key",
168
+ "wizard.byok.step.intro": "Pick the provider from the menu and paste its API key. Forge stores it encrypted in the local Vault; it never leaves your machine.",
169
+ "wizard.byok.test": "Validate and save",
170
+ "wizard.skip.title": "I am already set up",
171
+ "wizard.skip.desc": "Skip the wizard. You can open it again later from Settings.",
172
+ "wizard.done.kanji": "Done",
173
+ "wizard.done.title": "Done",
174
+ "wizard.done.msg": "Forge is set up. Start chatting.",
175
+ "pizarron.button.read": "Read aloud",
176
+ "pizarron.button.copy": "Copy",
177
+ "pizarron.button.edit": "Edit",
178
+ "pizarron.graph.refresh": "Refresh",
179
+ "pizarron.graph.regenerating": "Regenerating...",
180
+ "pizarron.graph.detail.hint": "Tap a node to see its detail.",
181
+ "pizarron.graph.detail.empty": "No detail for this node.",
182
182
  "pizarron.graph.detail.weight": "weight",
183
183
  "pizarron.graph.orbit": "Orbit",
184
- "pizarron.graph.orbit.speed": "Orbital speed",
185
- "startup.tab.graph": "Visual graph",
186
- "startup.tab.graphSem": "Semantic graph",
187
- "startup.tab.pendings": "Pendings",
188
- "startup.tab.workflow": "Workflow",
189
- "settings.startupTabs": "Tabs on open (graph, pendings, workflow)",
190
- "graph.term.nodes": "nodes",
191
- "graph.term.edges": "edges",
192
- "coding.read": "Reading {x}",
193
- "coding.read_bare": "Reading a file",
194
- "coding.edit": "Editing {x}",
195
- "coding.edit_bare": "Editing a file",
196
- "coding.write": "Writing {x}",
197
- "coding.write_bare": "Writing a file",
198
- "coding.notebook_bare": "Editing notebook",
199
- "coding.bash": "Running: {x}",
200
- "coding.bash_bare": "Running a command",
201
- "coding.grep": "Searching \"{x}\"",
202
- "coding.grep_bare": "Searching the code",
203
- "coding.glob": "Listing {x}",
204
- "coding.glob_bare": "Listing files",
205
- "coding.web_bare": "Reading the web",
206
- "coding.websearch": "Searching the web: {x}",
207
- "coding.websearch_bare": "Searching the web",
208
- "coding.task": "Sub-agent: {x}",
209
- "coding.task_bare": "Launching a sub-agent",
210
- "coding.todo": "Updating its task list",
211
- "coding.verb_bare": "Running a yujin verb",
212
- "panel.button.stop": "Stop",
213
- "panel.status.stopping": "Stopping...",
214
- "panel.status.noActiveTurn": "There was no turn in progress.",
215
- "panel.status.interruptFailed": "Could not send the interruption.",
216
- "panel.status.turnInterrupted": "Turn interrupted.",
217
- "panel.label.interrupted": "(interrupted)",
218
- "panel.queue.label": "Queued",
219
- "panel.queue.remove": "Remove from queue",
220
- "panel.project.switchHint": "Switch project",
221
- "panel.project.title": "Projects",
222
- "panel.project.add": "Add project...",
223
- "panel.project.addPrompt": "Absolute path of the project to add:",
224
- "panel.project.switching": "Switching project...",
225
- "startup.tab.files": "Files",
226
- "panel.project.remove": "Remove from list",
227
- "panel.project.removeConfirm": "Remove this project from the list? (does not delete files on disk)",
228
- "panel.project.removed": "Project removed from the list",
229
- "panel.files.refresh": "Refresh",
230
- "panel.files.loading": "Loading...",
231
- "panel.files.error": "Could not read the files.",
232
- "panel.files.empty": "(no files)",
233
- "panel.files.truncated": "(list truncated)",
234
- "panel.files.opened": "Opened",
235
- "panel.files.openFailed": "Could not open the file.",
236
- "startup.tab.tasks": "Tasks",
237
- "settings.bridge.title": "Coordination between instances",
238
- "settings.bridge.accept": "Accept directed messages from other instances (injected as chat)",
239
- "settings.bridge.composePlaceholder": "Message to the other instances...",
240
- "settings.voice.title": "Voice",
241
- "settings.voice.mode": "Mode",
242
- "settings.voice.modeMic": "mic mode",
243
- "settings.voice.stt": "STT",
244
- "settings.voice.sttBrowser": "STT browser",
245
- "settings.voice.ttsEngine": "TTS engine",
246
- "settings.voice.ttsBrowser": "TTS browser",
247
- "settings.voice.ttsVoice": "TTS voice (Google only)",
248
- "settings.vad.title": "VAD (silence detection)",
249
- "settings.vad.resetDefaults": "Reset defaults",
250
- "settings.vad.engine": "Engine",
251
- "settings.vad.engineAmplitude": "Amplitude (RMS)",
252
- "settings.vad.engineBand": "Band 80-400Hz",
253
- "settings.vad.baselineWindow": "Baseline window",
254
- "settings.vad.thresholdMult": "Threshold mult (baseline x N)",
255
- "settings.vad.thresholdMin": "Minimum threshold",
256
- "settings.vad.thresholdMax": "Maximum threshold",
257
- "settings.vad.silence": "Silence to close",
258
- "settings.vad.minVoiced": "Minimum voiced (anti-blip)",
259
- "settings.vad.tick": "VAD tick",
260
- "settings.vad.bandLow": "Voice band: low (Hz)",
261
- "settings.vad.bandHigh": "Voice band: high (Hz)",
262
- "settings.vad.showOverlay": "Show live overlay",
263
- "settings.vad.logStats": "Log stats per session",
264
- "settings.brain.anthropicMode": "Anthropic: mode",
265
- "settings.brain.modePlan": "Plan (Claude subscription)",
266
- "settings.brain.modeConsole": "Console (API key)",
267
- "settings.brain.modeNote": "Applies when you reopen the panel.",
268
- "settings.brain.ecoEnabled": "Eco mode enabled",
269
- "settings.brain.ecoHint": "off = always frontier",
270
- "settings.brain.modelEco": "Eco model",
271
- "settings.brain.modelFrontier": "Frontier model",
272
- "settings.brain.modelMultimodal": "Multimodal model",
273
- "settings.brain.multimodalClearTitle": "Remove the dedicated multimodal brain (revert to automatic vision routing)",
274
- "settings.brain.auto": "Auto",
275
- "settings.brain.multimodalHint": "Dedicated brain for turns with images. Auto = automatic vision routing (the frontier if it sees, or a notice if not).",
276
- "settings.brain.geminiCache": "Gemini explicit cache (CachedContent)",
277
- "settings.brain.geminiCacheHint": "Opt-in. Useful for long sessions with Gemini Pro; for short sessions the free implicit cache of 2.5 is enough.",
278
- "settings.federation.title": "Brain federation",
279
- "settings.federation.intro": "Use another Forge's brain (its key never leaves its machine) or lend yours. Your code runs locally; only the inference travels.",
280
- "settings.federation.connectedTo": "Connected to",
281
- "settings.federation.disconnect": "Disconnect",
282
- "settings.federation.connectMe": "Connect me",
283
- "settings.federation.tokenPlaceholder": "Paste the federation code",
284
- "settings.federation.connect": "Connect",
285
- "settings.federation.lendBrain": "Lend my brain",
286
- "settings.federation.generateCode": "Generate code",
287
- "settings.federation.host": "Host (respond to children)",
288
- "settings.federation.fedBrain": "Federation brain",
289
- "settings.federation.fedBrainNote": "The one that responds to children. Direct API (DeepSeek by default). Claude Plan cannot host; it needs a key with credit.",
290
- "settings.federation.codeOnce": "Code (single use)",
291
- "settings.federation.copy": "Copy",
292
- "settings.keys.title": "API keys (BYOK)",
293
- "settings.keys.configure": "Configure",
294
- "settings.keys.remove": "Remove",
295
- "settings.keys.brainAnthropic": "Brain (Anthropic)",
296
- "settings.keys.brainOpenai": "Brain (OpenAI)",
297
- "settings.keys.brainGoogle": "Brain (Google AI)",
298
- "settings.keys.brainDeepseek": "Brain (DeepSeek)",
299
- "settings.keys.brainXai": "Brain (xAI / Grok)",
300
- "settings.keys.brainMistral": "Brain (Mistral)",
301
- "settings.keys.brainCohere": "Brain (Cohere)",
302
- "settings.keys.sttGoogle": "STT Google",
303
- "settings.keys.ttsGoogle": "TTS Google",
304
- "settings.keys.ttsElevenlabs": "TTS ElevenLabs",
305
- "settings.keys.sttWhisper": "STT Whisper",
306
- "settings.lang.title": "Language",
307
- "settings.lang.panelVoice": "Panel + voice",
308
- "settings.lang.changeButton": "Change language",
309
- "settings.vault.title": "Vault (encrypted)",
310
- "settings.vault.slots": "Slots",
311
- "settings.vault.open": "Open vault",
312
- "settings.license.email": "Email",
313
- "settings.license.validated": "Validated",
314
- "settings.license.connectHint": "Connect your Polar account. Enter the email you paid with and we sync your plan automatically.",
315
- "settings.license.emailPlaceholder": "email@example.com",
316
- "settings.license.connect": "Connect",
317
- "settings.license.sync": "Sync with Polar",
318
- "settings.license.buy": "Buy / activate plan",
319
- "settings.budget.title": "Budget this month",
320
- "settings.budget.renews": "Renews",
321
- "settings.budget.tokensEco": "Eco tokens",
322
- "settings.budget.tokensFrontier": "Frontier tokens",
323
- "settings.budget.buyExtension": "Buy token extension",
324
- "settings.limits.title": "Limits (advanced)",
325
- "settings.limits.editHint": "Edit any value + tab/blur saves.",
326
- "settings.limits.reset": "Reset to defaults",
327
- "settings.bookmarks.title": "Reader bookmarks",
328
- "settings.graph.title": "Project knowledge graph",
329
- "settings.pair.title": "Link phone",
330
- "settings.pair.hint": "Open Forge Mobile, tap \"Link\" and scan this QR. Done.",
331
- "settings.pair.generateQr": "Generate QR",
332
- "settings.pair.cantRead": "Camera can't read the QR? Copy this code and paste it into Forge Mobile:",
333
- "settings.audit.viewFull": "View full",
334
- "settings.audit.close": "Close",
335
- "settings.audit.allKinds": "All kinds",
336
- "settings.audit.allModes": "All modes",
337
- "settings.audit.copyJson": "Copy JSON",
338
- "settings.audit.closeDetail": "Close detail",
339
- "settings.about.title": "About",
340
- "settings.danger.title": "Danger Zone",
341
- "settings.danger.warning": "When ON, Yujin runs EVERY action without asking for confirmation (including shell.exec, rm, git push --force, etc). Speed over safety. Everything is recorded in the audit log.",
342
- "settings.keyEditor.placeholder": "Paste your API key here",
343
- "settings.license.title": "License",
344
- "settings.plan": "Plan",
345
- "settings.audit.title": "Audit log",
346
- "settings.legal.title": "Legal",
347
- "panel.status.projectSwitchFail": "Could not switch project.",
348
- "panel.status.projectRemoveFail": "Could not remove the project.",
349
- "panel.status.projectAddFail": "Could not add the project.",
350
- "panel.status.cancelFail": "Could not cancel: {reason}",
351
- "panel.status.cancelNetError": "Network error while cancelling shell.",
352
- "panel.status.notEditable": "This type of content is not editable.",
353
- "panel.status.savedAsPicker": "Saved as: {name} (at the path you chose in the dialog).",
354
- "panel.status.saveAsFail": "Save As error: {error} -- using fallback.",
355
- "panel.status.saveFail": "Error saving: {error}",
356
- "panel.status.savedAs": "Saved as: {path} ({bytes} bytes)",
357
- "panel.status.netError": "Network error: {error}",
358
- "panel.status.savedTabOnly": "Changes saved in the tab (not on disk -- no file_path).",
359
- "panel.status.saved": "Saved: {path} ({bytes} bytes)",
360
- "panel.status.copied": "Copied to clipboard.",
361
- "panel.status.copyFail": "Could not copy.",
362
- "panel.status.modeAvailable": "Available modes: didactico, tecnico. Usage: /modo tecnico",
363
- "panel.status.modeChangeFail": "Could not change the mode: {error}",
364
- "panel.status.modeChanged": "Mode changed to {target}. The next turn already uses this mode.",
365
- "panel.status.genericError": "Error: {error}",
366
- "panel.status.brainTierAuto": "Brain tier back to auto (router decides by verb / phase).",
367
- "panel.status.brainTierForced": "Brain tier forced to \"{target}\" for this session. /auto returns to the router.",
368
- "panel.confirm.tabUnsaved": "The tab \"{title}\" has unsaved changes. Close anyway?",
369
- "panel.confirm.tabsUnsaved": "There are tabs with unsaved changes. Close everything anyway?",
370
- "panel.confirm.discardChanges": "Discard the unsaved changes?",
371
- "panel.confirm.removeSlot": "Remove slot \"{slot}\"? This cannot be undone.",
372
- "panel.confirm.removeKey": "Remove the key for {slot}?",
373
- "panel.prompt.saveAs": "Save as (path relative to the project):",
374
- "panel.voice.sttFallback": "Browser STT unavailable; using server-side fallback.",
375
- "panel.voice.noMicSupport": "Your browser does not support microphone access.",
376
- "panel.voice.recordingCountdown": "Recording... auto-stop in {n}s",
377
- "panel.voice.autoStopped": "Recording auto-stopped at 55s (Google STT 1-min limit). Try shorter.",
378
- "panel.voice.noAudio": "No audio captured. Try again.",
379
- "panel.voice.audioTooLong": "Audio too long (>1 min). Google STT sync limit. Try shorter.",
380
- "panel.voice.ttsUnavailable": "Browser TTS not available; switch back to Google in settings.",
381
- "panel.voice.micClosedHalfDuplex": "Mic closed while Yujin speaks (half-duplex).",
382
- "panel.voice.micBlocked": "Microphone blocked. Allow the microphone for this app in your browser settings and try again.",
383
- "panel.voice.noMicDevice": "No microphone detected on this device.",
384
- "panel.voice.micOpenFail": "Could not open the microphone: {error}",
385
- "panel.voice.micOpenListening": "Mic open, listening...",
386
- "panel.voice.listening": "I'm listening...",
387
- "panel.voice.listeningInterim": "I'm listening... {text}",
388
- "panel.voice.micBlockedBrowser": "Microphone blocked by the browser. Click the lock icon in the URL bar and allow microphone, then reload the page. Or switch STT to \"google\" / \"whisper\" in settings if you have the API key.",
389
- "panel.voice.noMicPhysical": "No physical microphone detected. Connect one or switch STT to \"google\" / \"whisper\" in settings.",
390
- "panel.voice.networkRequired": "Web Speech requires an internet connection (Chrome uses Google behind the scenes). Try without an intermittent connection or switch STT to \"whisper\" if you have the API key.",
391
- "panel.voice.langNotSupported": "Your browser does not support this language for STT. Change the panel language to a supported one (en, es, pt) or switch STT to \"google\" / \"whisper\".",
392
- "panel.voice.micError": "Mic error: {error}",
393
- "panel.voice.noAudioToRecognizer": "No audio reached the recognizer: the browser's dictation is not capturing in this app.",
394
- "panel.voice.micOpenNoVoice": "Mic open but no voice detected. Move closer to the microphone and speak louder; if it continues, free dictation does not work in this PWA.",
395
- "panel.voice.voiceNoText": "Voice detected but the browser returned no text (free STT not available in this PWA).",
396
- "panel.voice.startingDictation": "Starting dictation...",
397
- "panel.voice.couldNotStartMic": "Could not start mic: {error}",
398
- "panel.status.imageTooLarge": "Image too large (>6MB): {name}",
399
- "panel.status.imageReady": "Image ready to send: {name}",
400
- "panel.status.imageReadFail": "Could not read the image: {error}",
401
- "panel.tip.attachFile": "Attach file",
402
- "panel.tip.refreshDiscovery": "Refresh discovery",
403
- "panel.tip.refreshNow": "Refresh now",
404
- "panel.tip.filterByProject": "Filter by project",
405
- "panel.tip.concurrentRuns": "Concurrent runs: global / per-project caps",
406
- "panel.tip.mcpBridges": "MCP Bridges (F101)",
407
- "panel.tip.activity": "Agent activity + bridge inspector + chat-per-agent",
408
- "panel.tip.settings": "Settings (voice mode, STT, TTS, keys, language)",
409
- "panel.tip.zoomOut": "Zoom out (Ctrl -)",
410
- "panel.tip.zoomReset": "Reset zoom (Ctrl 0)",
411
- "panel.tip.zoomIn": "Zoom in (Ctrl +)",
412
- "panel.tip.maximize": "Maximize / restore (full screen)",
413
- "panel.tip.closeBoard": "Close the whole board",
414
- "panel.tip.openInEditor": "Open in my editor",
415
- "panel.tip.open": "Open",
416
- "panel.tip.saveAs": "Save as -- choose a new path (relative to the project)",
417
- "panel.tip.codeModeDetail": "Detailed: files, diffs and commands live",
418
- "panel.tip.codeModeZen": "Sumi-e: art with occasional text",
419
- "panel.tip.cancelShell": "Cancel shell command",
420
- "panel.tip.closeTab": "Close tab",
421
- "panel.tip.reopenNativeTabs": "Reopen closed native tabs",
422
- "panel.tip.notTestedYet": "not tested yet",
423
- "panel.aria.activity": "Activity",
424
- "panel.aria.settings": "Settings",
425
- "panel.aria.zoomOut": "Zoom out",
426
- "panel.aria.zoomIn": "Zoom in",
427
- "panel.aria.maximize": "Maximize",
428
- "panel.aria.closeBoard": "close all",
429
- "panel.aria.thinking": "thinking",
430
- "panel.hint.boardEmpty": "Structured content shows here: code, tables, documents. Ask Yujin to write or edit something.",
431
- "panel.hint.planMode": "You are in Plan mode (subscription). The board draws when the brain runs in API mode: change it in <strong>Settings &gt; Brain &gt; Anthropic: mode &gt; Console</strong> and reopen the panel.",
432
- "panel.hint.bookmarksEmpty": "No bookmarks. Ask Yujin \"mark this point as ...\" while reading a doc.",
433
- "panel.voice.replyFailed": "Voice reply failed: {err}",
434
- "panel.voice.replyError": "Voice reply error: {err}",
435
- "panel.status.languageSwitchFailed": "Language switch failed: {err}",
436
- "panel.status.languageListFailed": "Could not load language list",
437
- "panel.legal.loading": "Loading...",
438
- "panel.legal.loadError": "Error {status} loading the document.",
439
- "panel.legal.networkError": "Network error: {err}",
440
- "panel.legal.defaultTitle": "Legal",
441
- "panel.feedback.copied": "Copied",
442
- "panel.feedback.copyFailed": "Copy failed",
443
- "panel.feedback.clipboardUnavailable": "Clipboard unavailable",
444
- "panel.feedback.saving": "Saving...",
445
- "panel.feedback.saved": "Saved.",
446
- "panel.feedback.saveError": "error saving",
447
- "panel.feedback.netError": "network error",
448
- "panel.feedback.netErrorSaving": "network error saving",
449
- "panel.feedback.errorPrefix": "Error: {detail}",
450
- "panel.pair.generating": "Generating...",
451
- "panel.pair.generateQr": "Generate QR",
452
- "panel.pair.copy": "Copy",
453
- "panel.pair.expiry": "Expires in ~{mins} min. Generate it again if it lapses.",
454
- "panel.pair.qrNetError": "Network error generating the QR.",
455
- "panel.audit.copyJson": "Copy JSON",
456
- "panel.limits.resetApplied": "Reset to defaults applied",
457
- "panel.nac3.effects": "Effects: {list}",
458
- "panel.nac3.effectsUnknown": "unknown",
459
- "panel.nac3.cancel": "Cancel",
460
- "panel.nac3.reject": "Reject",
461
- "panel.nac3.approve": "Approve",
462
- "panel.nac3.approveDestructive": "Approve (destructive)",
463
- "panel.nac3.executing": "Executing...",
464
- "panel.tts.providerBrowser": "TTS browser",
465
- "panel.tts.providerGoogle": "TTS Google",
466
- "panel.tts.providerTitle": "Click to switch between browser (native SpeechSynthesis, OS voices) and Google Cloud TTS (server-side).",
467
- "panel.stt.providerBrowser": "STT browser",
468
- "panel.stt.providerGoogle": "STT Google",
469
- "panel.stt.providerWhisper": "STT Whisper",
470
- "panel.stt.providerTitle": "Click to switch between browser (fast + native es-AR + free), Google Cloud STT (server-side, BYOK) or Whisper (server-side, BYOK).",
471
- "panel.tts.voiceTitle": "Current voice: {id} / {persona} ({gender}) -- {style}. Click to cycle. Studio = articulates s clearly; Neural2 = natural Spanish (aspirates final s).",
472
- "panel.license.lendNeedsLicense": "activate your license to lend your brain",
473
- "panel.license.emailInvalid": "Enter a valid email (with @).",
474
- "panel.license.connecting": "Connecting...",
475
- "panel.license.savingEmail": "Saving email + syncing with Polar...",
476
- "panel.license.syncFailedRetry": "Email saved, but sync failed: {err}{http}. If you just paid, wait 1-2 min and hit \"Sync with Polar\".",
477
- "panel.license.planOk": "OK -- plan: {plan}.",
478
- "panel.license.netError": "Network error: {err}",
479
- "panel.license.syncing": "Syncing...",
480
- "panel.license.querying": "Querying server...",
481
- "panel.license.syncError": "Sync error: {err}{http}",
482
- "panel.license.planUnchanged": "Plan unchanged: {plan}",
483
- "panel.license.planUpdated": "Plan updated: {before} -> {after}",
484
- "panel.license.syncWithPolar": "Sync with Polar",
485
- "panel.license.errorWithCode": "error: {code}",
486
- "panel.keyEditor.keyTooShort": "Key too short (min 8 chars).",
487
- "panel.bridge.coordUnavailable": "Coordination unavailable.",
488
- "panel.bridge.statusUnavailable": "unavailable",
489
- "panel.mcp.loadingBridges": "Loading bridges...",
490
- "panel.tools.loading": "Loading tools...",
491
- "panel.agentsChat.backPairs": "< Pairs",
492
- "panel.agentsChat.noMessages": "No messages in this pair.",
493
- "panel.agentsChat.noAgents": "no agents",
494
- "panel.agentsChat.pickAgent": "Pick an agent + type text before sending.",
495
- "panel.agentsChat.sending": "Sending...",
496
- "panel.agentsChat.errorGeneric": "Error: {err}",
497
- "panel.whatsNew.dismiss": "Close",
498
- "panel.alert.noEditor": "No editor in PATH. Copy the path: {path}",
499
- "panel.alert.pathRelative": "The path must be relative to the project (no leading \"/\" or \"..\").",
500
- "panel.tip.saveTo": "Save to {path}",
501
- "panel.tip.saveToMemory": "(memory)",
502
- "panel.button.saveAs": "Save as...",
503
- "panel.aria.concurrentRuns": "Concurrent runs",
504
- "panel.activity.allProjects": "All projects",
505
- "panel.activity.loadingFeed": "Loading feed...",
506
- "panel.feedback.savedShort": "saved",
507
- "panel.pair.qrFailed": "Could not generate the QR.",
508
- "panel.brain.modePlan": "Plan (subscription)",
509
- "panel.brain.modeConsole": "Console (API key)",
510
- "panel.brain.applying": "applying {mode}...",
511
- "panel.brain.applied": "{mode} applied. The next turn already uses this mode.",
512
- "panel.brain.reopenHint": "Applies when you reopen the panel.",
513
- "panel.brain.active": "{mode} active",
514
- "panel.bridge.roleHost": "host",
515
- "panel.bridge.roleClient": "client",
516
- "panel.bridge.instanceOne": "instance",
517
- "panel.bridge.instanceMany": "instances",
518
- "panel.bridge.you": "you",
519
- "panel.tip.deleteTask": "Delete task",
520
- "panel.tasks.cmdPlaceholder": "command (e.g. pnpm install)...",
521
- "panel.readAloud.code": "Code",
522
- "panel.readAloud.codeLang": "Code in {lang}",
523
- "panel.readAloud.file": "File {file}",
524
- "panel.readAloud.content": "Content: {content}",
525
- "panel.pizarron.tabOne": "tab",
526
- "panel.pizarron.tabMany": "tabs"
527
- }
184
+ "pizarron.graph.orbit.speed": "Orbital speed",
185
+ "startup.tab.graph": "Visual graph",
186
+ "startup.tab.graphSem": "Semantic graph",
187
+ "startup.tab.pendings": "Pendings",
188
+ "startup.tab.workflow": "Workflow",
189
+ "settings.startupTabs": "Tabs on open (graph, pendings, workflow)",
190
+ "graph.term.nodes": "nodes",
191
+ "graph.term.edges": "edges",
192
+ "coding.read": "Reading {x}",
193
+ "coding.read_bare": "Reading a file",
194
+ "coding.edit": "Editing {x}",
195
+ "coding.edit_bare": "Editing a file",
196
+ "coding.write": "Writing {x}",
197
+ "coding.write_bare": "Writing a file",
198
+ "coding.notebook_bare": "Editing notebook",
199
+ "coding.bash": "Running: {x}",
200
+ "coding.bash_bare": "Running a command",
201
+ "coding.grep": "Searching \"{x}\"",
202
+ "coding.grep_bare": "Searching the code",
203
+ "coding.glob": "Listing {x}",
204
+ "coding.glob_bare": "Listing files",
205
+ "coding.web_bare": "Reading the web",
206
+ "coding.websearch": "Searching the web: {x}",
207
+ "coding.websearch_bare": "Searching the web",
208
+ "coding.task": "Sub-agent: {x}",
209
+ "coding.task_bare": "Launching a sub-agent",
210
+ "coding.todo": "Updating its task list",
211
+ "coding.verb_bare": "Running a yujin verb",
212
+ "panel.button.stop": "Stop",
213
+ "panel.status.stopping": "Stopping...",
214
+ "panel.status.noActiveTurn": "There was no turn in progress.",
215
+ "panel.status.interruptFailed": "Could not send the interruption.",
216
+ "panel.status.turnInterrupted": "Turn interrupted.",
217
+ "panel.label.interrupted": "(interrupted)",
218
+ "panel.queue.label": "Queued",
219
+ "panel.queue.remove": "Remove from queue",
220
+ "panel.project.switchHint": "Switch project",
221
+ "panel.project.title": "Projects",
222
+ "panel.project.add": "Add project...",
223
+ "panel.project.addPrompt": "Absolute path of the project to add:",
224
+ "panel.project.switching": "Switching project...",
225
+ "startup.tab.files": "Files",
226
+ "panel.project.remove": "Remove from list",
227
+ "panel.project.removeConfirm": "Remove this project from the list? (does not delete files on disk)",
228
+ "panel.project.removed": "Project removed from the list",
229
+ "panel.files.refresh": "Refresh",
230
+ "panel.files.loading": "Loading...",
231
+ "panel.files.error": "Could not read the files.",
232
+ "panel.files.empty": "(no files)",
233
+ "panel.files.truncated": "(list truncated)",
234
+ "panel.files.opened": "Opened",
235
+ "panel.files.openFailed": "Could not open the file.",
236
+ "panel.files.searchName": "Filter by name",
237
+ "panel.files.searchType": "Type (e.g. ts, png)",
238
+ "panel.files.matches": "{n} matches",
239
+ "panel.files.noMatches": "No matches",
240
+ "startup.tab.tasks": "Tasks",
241
+ "settings.bridge.title": "Coordination between instances",
242
+ "settings.bridge.accept": "Accept directed messages from other instances (injected as chat)",
243
+ "settings.bridge.composePlaceholder": "Message to the other instances...",
244
+ "settings.voice.title": "Voice",
245
+ "settings.voice.mode": "Mode",
246
+ "settings.voice.modeMic": "mic mode",
247
+ "settings.voice.stt": "STT",
248
+ "settings.voice.sttBrowser": "STT browser",
249
+ "settings.voice.ttsEngine": "TTS engine",
250
+ "settings.voice.ttsBrowser": "TTS browser",
251
+ "settings.voice.ttsVoice": "TTS voice (Google only)",
252
+ "settings.vad.title": "VAD (silence detection)",
253
+ "settings.vad.resetDefaults": "Reset defaults",
254
+ "settings.vad.engine": "Engine",
255
+ "settings.vad.engineAmplitude": "Amplitude (RMS)",
256
+ "settings.vad.engineBand": "Band 80-400Hz",
257
+ "settings.vad.baselineWindow": "Baseline window",
258
+ "settings.vad.thresholdMult": "Threshold mult (baseline x N)",
259
+ "settings.vad.thresholdMin": "Minimum threshold",
260
+ "settings.vad.thresholdMax": "Maximum threshold",
261
+ "settings.vad.silence": "Silence to close",
262
+ "settings.vad.minVoiced": "Minimum voiced (anti-blip)",
263
+ "settings.vad.tick": "VAD tick",
264
+ "settings.vad.bandLow": "Voice band: low (Hz)",
265
+ "settings.vad.bandHigh": "Voice band: high (Hz)",
266
+ "settings.vad.showOverlay": "Show live overlay",
267
+ "settings.vad.logStats": "Log stats per session",
268
+ "settings.brain.anthropicMode": "Anthropic: mode",
269
+ "settings.brain.modePlan": "Plan (Claude subscription)",
270
+ "settings.brain.modeConsole": "Console (API key)",
271
+ "settings.brain.modeNote": "Applies when you reopen the panel.",
272
+ "settings.brain.ecoEnabled": "Eco mode enabled",
273
+ "settings.brain.ecoHint": "off = always frontier",
274
+ "settings.brain.modelEco": "Eco model",
275
+ "settings.brain.modelFrontier": "Frontier model",
276
+ "settings.brain.modelMultimodal": "Multimodal model",
277
+ "settings.brain.multimodalClearTitle": "Remove the dedicated multimodal brain (revert to automatic vision routing)",
278
+ "settings.brain.auto": "Auto",
279
+ "settings.brain.multimodalHint": "Dedicated brain for turns with images. Auto = automatic vision routing (the frontier if it sees, or a notice if not).",
280
+ "settings.brain.geminiCache": "Gemini explicit cache (CachedContent)",
281
+ "settings.brain.geminiCacheHint": "Opt-in. Useful for long sessions with Gemini Pro; for short sessions the free implicit cache of 2.5 is enough.",
282
+ "settings.federation.title": "Brain federation",
283
+ "settings.federation.intro": "Use another Forge's brain (its key never leaves its machine) or lend yours. Your code runs locally; only the inference travels.",
284
+ "settings.federation.connectedTo": "Connected to",
285
+ "settings.federation.disconnect": "Disconnect",
286
+ "settings.federation.connectMe": "Connect me",
287
+ "settings.federation.tokenPlaceholder": "Paste the federation code",
288
+ "settings.federation.connect": "Connect",
289
+ "settings.federation.lendBrain": "Lend my brain",
290
+ "settings.federation.generateCode": "Generate code",
291
+ "settings.federation.host": "Host (respond to children)",
292
+ "settings.federation.fedBrain": "Federation brain",
293
+ "settings.federation.fedBrainNote": "The one that responds to children. Direct API (DeepSeek by default). Claude Plan cannot host; it needs a key with credit.",
294
+ "settings.federation.codeOnce": "Code (single use)",
295
+ "settings.federation.copy": "Copy",
296
+ "settings.keys.title": "API keys (BYOK)",
297
+ "settings.keys.configure": "Configure",
298
+ "settings.keys.remove": "Remove",
299
+ "settings.keys.brainAnthropic": "Brain (Anthropic)",
300
+ "settings.keys.brainOpenai": "Brain (OpenAI)",
301
+ "settings.keys.brainGoogle": "Brain (Google AI)",
302
+ "settings.keys.brainDeepseek": "Brain (DeepSeek)",
303
+ "settings.keys.brainXai": "Brain (xAI / Grok)",
304
+ "settings.keys.brainMistral": "Brain (Mistral)",
305
+ "settings.keys.brainCohere": "Brain (Cohere)",
306
+ "settings.keys.sttGoogle": "STT Google",
307
+ "settings.keys.ttsGoogle": "TTS Google",
308
+ "settings.keys.ttsElevenlabs": "TTS ElevenLabs",
309
+ "settings.keys.sttWhisper": "STT Whisper",
310
+ "settings.lang.title": "Language",
311
+ "settings.lang.panelVoice": "Panel + voice",
312
+ "settings.lang.changeButton": "Change language",
313
+ "settings.vault.title": "Vault (encrypted)",
314
+ "settings.vault.slots": "Slots",
315
+ "settings.vault.open": "Open vault",
316
+ "settings.license.email": "Email",
317
+ "settings.license.validated": "Validated",
318
+ "settings.license.connectHint": "Connect your Polar account. Enter the email you paid with and we sync your plan automatically.",
319
+ "settings.license.emailPlaceholder": "email@example.com",
320
+ "settings.license.connect": "Connect",
321
+ "settings.license.sync": "Sync with Polar",
322
+ "settings.license.buy": "Buy / activate plan",
323
+ "settings.budget.title": "Budget this month",
324
+ "settings.budget.renews": "Renews",
325
+ "settings.budget.tokensEco": "Eco tokens",
326
+ "settings.budget.tokensFrontier": "Frontier tokens",
327
+ "settings.budget.buyExtension": "Buy token extension",
328
+ "settings.limits.title": "Limits (advanced)",
329
+ "settings.limits.editHint": "Edit any value + tab/blur saves.",
330
+ "settings.limits.reset": "Reset to defaults",
331
+ "settings.bookmarks.title": "Reader bookmarks",
332
+ "settings.graph.title": "Project knowledge graph",
333
+ "settings.pair.title": "Link phone",
334
+ "settings.pair.hint": "Open Forge Mobile, tap \"Link\" and scan this QR. Done.",
335
+ "settings.pair.generateQr": "Generate QR",
336
+ "settings.pair.cantRead": "Camera can't read the QR? Copy this code and paste it into Forge Mobile:",
337
+ "settings.audit.viewFull": "View full",
338
+ "settings.audit.close": "Close",
339
+ "settings.audit.allKinds": "All kinds",
340
+ "settings.audit.allModes": "All modes",
341
+ "settings.audit.copyJson": "Copy JSON",
342
+ "settings.audit.closeDetail": "Close detail",
343
+ "settings.about.title": "About",
344
+ "settings.danger.title": "Danger Zone",
345
+ "settings.danger.warning": "When ON, Yujin runs EVERY action without asking for confirmation (including shell.exec, rm, git push --force, etc). Speed over safety. Everything is recorded in the audit log.",
346
+ "settings.keyEditor.placeholder": "Paste your API key here",
347
+ "settings.license.title": "License",
348
+ "settings.plan": "Plan",
349
+ "settings.audit.title": "Audit log",
350
+ "settings.legal.title": "Legal",
351
+ "panel.status.projectSwitchFail": "Could not switch project.",
352
+ "panel.status.projectRemoveFail": "Could not remove the project.",
353
+ "panel.status.projectAddFail": "Could not add the project.",
354
+ "panel.status.cancelFail": "Could not cancel: {reason}",
355
+ "panel.status.cancelNetError": "Network error while cancelling shell.",
356
+ "panel.status.notEditable": "This type of content is not editable.",
357
+ "panel.status.savedAsPicker": "Saved as: {name} (at the path you chose in the dialog).",
358
+ "panel.status.saveAsFail": "Save As error: {error} -- using fallback.",
359
+ "panel.status.saveFail": "Error saving: {error}",
360
+ "panel.status.savedAs": "Saved as: {path} ({bytes} bytes)",
361
+ "panel.status.netError": "Network error: {error}",
362
+ "panel.status.savedTabOnly": "Changes saved in the tab (not on disk -- no file_path).",
363
+ "panel.status.saved": "Saved: {path} ({bytes} bytes)",
364
+ "panel.status.copied": "Copied to clipboard.",
365
+ "panel.status.copyFail": "Could not copy.",
366
+ "panel.status.modeAvailable": "Available modes: didactico, tecnico. Usage: /modo tecnico",
367
+ "panel.status.modeChangeFail": "Could not change the mode: {error}",
368
+ "panel.status.modeChanged": "Mode changed to {target}. The next turn already uses this mode.",
369
+ "panel.status.genericError": "Error: {error}",
370
+ "panel.status.brainTierAuto": "Brain tier back to auto (router decides by verb / phase).",
371
+ "panel.status.brainTierForced": "Brain tier forced to \"{target}\" for this session. /auto returns to the router.",
372
+ "panel.confirm.tabUnsaved": "The tab \"{title}\" has unsaved changes. Close anyway?",
373
+ "panel.confirm.tabsUnsaved": "There are tabs with unsaved changes. Close everything anyway?",
374
+ "panel.confirm.discardChanges": "Discard the unsaved changes?",
375
+ "panel.confirm.removeSlot": "Remove slot \"{slot}\"? This cannot be undone.",
376
+ "panel.confirm.removeKey": "Remove the key for {slot}?",
377
+ "panel.prompt.saveAs": "Save as (path relative to the project):",
378
+ "panel.voice.sttFallback": "Browser STT unavailable; using server-side fallback.",
379
+ "panel.voice.noMicSupport": "Your browser does not support microphone access.",
380
+ "panel.voice.recordingCountdown": "Recording... auto-stop in {n}s",
381
+ "panel.voice.autoStopped": "Recording auto-stopped at 55s (Google STT 1-min limit). Try shorter.",
382
+ "panel.voice.noAudio": "No audio captured. Try again.",
383
+ "panel.voice.audioTooLong": "Audio too long (>1 min). Google STT sync limit. Try shorter.",
384
+ "panel.voice.ttsUnavailable": "Browser TTS not available; switch back to Google in settings.",
385
+ "panel.voice.micClosedHalfDuplex": "Mic closed while Yujin speaks (half-duplex).",
386
+ "panel.voice.micBlocked": "Microphone blocked. Allow the microphone for this app in your browser settings and try again.",
387
+ "panel.voice.noMicDevice": "No microphone detected on this device.",
388
+ "panel.voice.micOpenFail": "Could not open the microphone: {error}",
389
+ "panel.voice.micOpenListening": "Mic open, listening...",
390
+ "panel.voice.listening": "I'm listening...",
391
+ "panel.voice.listeningInterim": "I'm listening... {text}",
392
+ "panel.voice.micBlockedBrowser": "Microphone blocked by the browser. Click the lock icon in the URL bar and allow microphone, then reload the page. Or switch STT to \"google\" / \"whisper\" in settings if you have the API key.",
393
+ "panel.voice.noMicPhysical": "No physical microphone detected. Connect one or switch STT to \"google\" / \"whisper\" in settings.",
394
+ "panel.voice.networkRequired": "Web Speech requires an internet connection (Chrome uses Google behind the scenes). Try without an intermittent connection or switch STT to \"whisper\" if you have the API key.",
395
+ "panel.voice.langNotSupported": "Your browser does not support this language for STT. Change the panel language to a supported one (en, es, pt) or switch STT to \"google\" / \"whisper\".",
396
+ "panel.voice.micError": "Mic error: {error}",
397
+ "panel.voice.noAudioToRecognizer": "No audio reached the recognizer: the browser's dictation is not capturing in this app.",
398
+ "panel.voice.micOpenNoVoice": "Mic open but no voice detected. Move closer to the microphone and speak louder; if it continues, free dictation does not work in this PWA.",
399
+ "panel.voice.voiceNoText": "Voice detected but the browser returned no text (free STT not available in this PWA).",
400
+ "panel.voice.startingDictation": "Starting dictation...",
401
+ "panel.voice.couldNotStartMic": "Could not start mic: {error}",
402
+ "panel.status.imageTooLarge": "Image too large (>6MB): {name}",
403
+ "panel.status.imageReady": "Image ready to send: {name}",
404
+ "panel.status.imageReadFail": "Could not read the image: {error}",
405
+ "panel.tip.attachFile": "Attach file",
406
+ "panel.tip.refreshDiscovery": "Refresh discovery",
407
+ "panel.tip.refreshNow": "Refresh now",
408
+ "panel.tip.filterByProject": "Filter by project",
409
+ "panel.tip.concurrentRuns": "Concurrent runs: global / per-project caps",
410
+ "panel.tip.mcpBridges": "MCP Bridges (F101)",
411
+ "panel.tip.activity": "Agent activity + bridge inspector + chat-per-agent",
412
+ "panel.tip.settings": "Settings (voice mode, STT, TTS, keys, language)",
413
+ "panel.tip.zoomOut": "Zoom out (Ctrl -)",
414
+ "panel.tip.zoomReset": "Reset zoom (Ctrl 0)",
415
+ "panel.tip.zoomIn": "Zoom in (Ctrl +)",
416
+ "panel.tip.maximize": "Maximize / restore (full screen)",
417
+ "panel.tip.closeBoard": "Close the whole board",
418
+ "panel.tip.openInEditor": "Open in my editor",
419
+ "panel.tip.open": "Open",
420
+ "panel.tip.saveAs": "Save as -- choose a new path (relative to the project)",
421
+ "panel.tip.codeModeDetail": "Detailed: files, diffs and commands live",
422
+ "panel.tip.codeModeZen": "Sumi-e: art with occasional text",
423
+ "panel.tip.cancelShell": "Cancel shell command",
424
+ "panel.tip.closeTab": "Close tab",
425
+ "panel.tip.reopenNativeTabs": "Reopen closed native tabs",
426
+ "panel.tip.notTestedYet": "not tested yet",
427
+ "panel.aria.activity": "Activity",
428
+ "panel.aria.settings": "Settings",
429
+ "panel.aria.zoomOut": "Zoom out",
430
+ "panel.aria.zoomIn": "Zoom in",
431
+ "panel.aria.maximize": "Maximize",
432
+ "panel.aria.closeBoard": "close all",
433
+ "panel.aria.thinking": "thinking",
434
+ "panel.hint.boardEmpty": "Structured content shows here: code, tables, documents. Ask Yujin to write or edit something.",
435
+ "panel.hint.planMode": "You are in Plan mode (subscription). The board draws when the brain runs in API mode: change it in <strong>Settings &gt; Brain &gt; Anthropic: mode &gt; Console</strong> and reopen the panel.",
436
+ "panel.hint.bookmarksEmpty": "No bookmarks. Ask Yujin \"mark this point as ...\" while reading a doc.",
437
+ "panel.voice.replyFailed": "Voice reply failed: {err}",
438
+ "panel.voice.replyError": "Voice reply error: {err}",
439
+ "panel.status.languageSwitchFailed": "Language switch failed: {err}",
440
+ "panel.status.languageListFailed": "Could not load language list",
441
+ "panel.legal.loading": "Loading...",
442
+ "panel.legal.loadError": "Error {status} loading the document.",
443
+ "panel.legal.networkError": "Network error: {err}",
444
+ "panel.legal.defaultTitle": "Legal",
445
+ "panel.feedback.copied": "Copied",
446
+ "panel.feedback.copyFailed": "Copy failed",
447
+ "panel.feedback.clipboardUnavailable": "Clipboard unavailable",
448
+ "panel.feedback.saving": "Saving...",
449
+ "panel.feedback.saved": "Saved.",
450
+ "panel.feedback.saveError": "error saving",
451
+ "panel.feedback.netError": "network error",
452
+ "panel.feedback.netErrorSaving": "network error saving",
453
+ "panel.feedback.errorPrefix": "Error: {detail}",
454
+ "panel.pair.generating": "Generating...",
455
+ "panel.pair.generateQr": "Generate QR",
456
+ "panel.pair.copy": "Copy",
457
+ "panel.pair.expiry": "Expires in ~{mins} min. Generate it again if it lapses.",
458
+ "panel.pair.qrNetError": "Network error generating the QR.",
459
+ "panel.audit.copyJson": "Copy JSON",
460
+ "panel.limits.resetApplied": "Reset to defaults applied",
461
+ "panel.nac3.effects": "Effects: {list}",
462
+ "panel.nac3.effectsUnknown": "unknown",
463
+ "panel.nac3.cancel": "Cancel",
464
+ "panel.nac3.reject": "Reject",
465
+ "panel.nac3.approve": "Approve",
466
+ "panel.nac3.approveDestructive": "Approve (destructive)",
467
+ "panel.nac3.executing": "Executing...",
468
+ "panel.tts.providerBrowser": "TTS browser",
469
+ "panel.tts.providerGoogle": "TTS Google",
470
+ "panel.tts.providerTitle": "Click to switch between browser (native SpeechSynthesis, OS voices) and Google Cloud TTS (server-side).",
471
+ "panel.stt.providerBrowser": "STT browser",
472
+ "panel.stt.providerGoogle": "STT Google",
473
+ "panel.stt.providerWhisper": "STT Whisper",
474
+ "panel.stt.providerTitle": "Click to switch between browser (fast + native es-AR + free), Google Cloud STT (server-side, BYOK) or Whisper (server-side, BYOK).",
475
+ "panel.tts.voiceTitle": "Current voice: {id} / {persona} ({gender}) -- {style}. Click to cycle. Studio = articulates s clearly; Neural2 = natural Spanish (aspirates final s).",
476
+ "panel.license.lendNeedsLicense": "activate your license to lend your brain",
477
+ "panel.license.emailInvalid": "Enter a valid email (with @).",
478
+ "panel.license.connecting": "Connecting...",
479
+ "panel.license.savingEmail": "Saving email + syncing with Polar...",
480
+ "panel.license.syncFailedRetry": "Email saved, but sync failed: {err}{http}. If you just paid, wait 1-2 min and hit \"Sync with Polar\".",
481
+ "panel.license.planOk": "OK -- plan: {plan}.",
482
+ "panel.license.netError": "Network error: {err}",
483
+ "panel.license.syncing": "Syncing...",
484
+ "panel.license.querying": "Querying server...",
485
+ "panel.license.syncError": "Sync error: {err}{http}",
486
+ "panel.license.planUnchanged": "Plan unchanged: {plan}",
487
+ "panel.license.planUpdated": "Plan updated: {before} -> {after}",
488
+ "panel.license.syncWithPolar": "Sync with Polar",
489
+ "panel.license.errorWithCode": "error: {code}",
490
+ "panel.keyEditor.keyTooShort": "Key too short (min 8 chars).",
491
+ "panel.bridge.coordUnavailable": "Coordination unavailable.",
492
+ "panel.bridge.statusUnavailable": "unavailable",
493
+ "panel.mcp.loadingBridges": "Loading bridges...",
494
+ "panel.tools.loading": "Loading tools...",
495
+ "panel.agentsChat.backPairs": "< Pairs",
496
+ "panel.agentsChat.noMessages": "No messages in this pair.",
497
+ "panel.agentsChat.noAgents": "no agents",
498
+ "panel.agentsChat.pickAgent": "Pick an agent + type text before sending.",
499
+ "panel.agentsChat.sending": "Sending...",
500
+ "panel.agentsChat.errorGeneric": "Error: {err}",
501
+ "panel.whatsNew.dismiss": "Close",
502
+ "panel.alert.noEditor": "No editor in PATH. Copy the path: {path}",
503
+ "panel.alert.pathRelative": "The path must be relative to the project (no leading \"/\" or \"..\").",
504
+ "panel.tip.saveTo": "Save to {path}",
505
+ "panel.tip.saveToMemory": "(memory)",
506
+ "panel.button.saveAs": "Save as...",
507
+ "panel.aria.concurrentRuns": "Concurrent runs",
508
+ "panel.activity.allProjects": "All projects",
509
+ "panel.activity.loadingFeed": "Loading feed...",
510
+ "panel.feedback.savedShort": "saved",
511
+ "panel.pair.qrFailed": "Could not generate the QR.",
512
+ "panel.brain.modePlan": "Plan (subscription)",
513
+ "panel.brain.modeConsole": "Console (API key)",
514
+ "panel.brain.applying": "applying {mode}...",
515
+ "panel.brain.applied": "{mode} applied. The next turn already uses this mode.",
516
+ "panel.brain.reopenHint": "Applies when you reopen the panel.",
517
+ "panel.brain.active": "{mode} active",
518
+ "panel.bridge.roleHost": "host",
519
+ "panel.bridge.roleClient": "client",
520
+ "panel.bridge.instanceOne": "instance",
521
+ "panel.bridge.instanceMany": "instances",
522
+ "panel.bridge.you": "you",
523
+ "panel.tip.deleteTask": "Delete task",
524
+ "panel.tasks.cmdPlaceholder": "command (e.g. pnpm install)...",
525
+ "panel.readAloud.code": "Code",
526
+ "panel.readAloud.codeLang": "Code in {lang}",
527
+ "panel.readAloud.file": "File {file}",
528
+ "panel.readAloud.content": "Content: {content}",
529
+ "panel.pizarron.tabOne": "tab",
530
+ "panel.pizarron.tabMany": "tabs"
531
+ }