diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d464510a8..9a5c76f37b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,14 @@ This changelog was generated from the repository Git history and release tags. V - New tab page: WebBrain now provides a new tab with a clock, quick links, bundled backgrounds and a WebBrain box (Ask, Act or Search). Ask and Act both run in the side panel straight away (Act shows a warning that it starts working immediately; Plan before Act still applies). Based on Mue (BSD-3-Clause), with all of Mue's network calls and telemetry removed. Adds the `search` permission. See `docs/newtab.md`. The new tab is opt-in: the last onboarding step has a "Use WebBrain as my new tab page" checkbox (ticked by default, next to Help Improve WebBrain) and Settings → General has the same switch; when it is off, new tabs go to the browser's own new tab page. On Firefox the new tab stays on and has no switch in WebBrain, because Firefox cannot hand a tab to its own new tab page; change it in Firefox's settings. ### Changed +- Settings is reorganized. Its tabs are now General, Budgets, Memory, Skills, CAPTCHA, Bridge and Advanced. The providers and the assistive models moved to a new Providers page with LLM, Vision, Speech, Generative, Decision and SafeSocial tabs; open it from **More…** in the side panel's model menu or from the Providers link at the top of Settings. Site permissions moved to their own page, opened with **Manage site permissions** in the ⚠ menu next to the microphone. Advanced is now a tab instead of a drawer inside General, and the CAPTCHA solvers have a tab of their own. The new Budgets tab holds the cloud cost allowances, the question timeout and what happens when it runs out, Max Agent Steps, the LLM request timeout and the image budget. Screenshot redaction moved to Advanced. Language and UI zoom are chosen in the side panel only. The search box looks through General, Budgets, CAPTCHA and Advanced at once. Old links to the moved tabs open the new pages. +- Auto-screenshot now defaults to On navigation instead of On state change. A value already saved is kept, including one restored from an older configuration export, which records the old default. +- Record traces and Record full request details are now one switch: traces are recorded with their full request details, or not at all. An install that recorded traces without full details starts recording them after the update. - The side panel layout is rearranged. The language, text size, Settings and pop-out buttons moved to the top left, and History and New chat to the top right, where History opens its list downward. The model picker moved into the message box, next to the attach button below your text, and its list opens upward. - Selecting text on a page now shows a small bar, **Translate | Explain | Proofread | More…**, instead of the single `?` button. Translate, Explain and Proofread answer in a card next to the selection: Translate shows the detected source language, the original text and a target-language picker, and every card has an "Ask a follow-up" box that, once the answer is there, continues in the side panel with the card's answer as context. **More…** opens the same popup the `?` button opened (Summarize, Quiz me, Humanize, a question box and Hide this; Translate, Explain and Proofread are on the bar, so they are not repeated there). A card sends the selected text to your configured model provider, like any other selection action; selections over 4,000 characters go to the side panel instead of a card. A card answer that reaches the model's output limit says it was cut off and offers to continue in the side panel, which picks up from the unfinished text instead of starting over (a side-panel reply that is cut off again says so, including when an OpenAI Responses model reports the limit as an error, in which case the text it wrote is kept and the call still counts toward your cloud-cost allowance), and closing or redoing a card, or reloading or leaving the page, cancels the request it no longer needs. Chrome and Firefox. ### Fixed +- WhatsApp: sending something to a contact no longer stalls at the chat. Asked to download a video from X and send it to a contact on WhatsApp, WebBrain clicked the contact's chat in the list and nothing happened: WhatsApp's chat rows are grid cells that ignore a click sent by a script, and Chrome's automatic real-mouse retry left grid cells out. A row like that now gets the retry, like any other list row. Once the chat was open, WebBrain blocked every message action until it had confirmed who the chat is with, but it only told the model to read the page again and retry, so the model clicked Attach and the chat row over and over, then gave up. The block now names the exact control to click: the contact name in the chat header, then the Close button of the Contact info panel it opens. Clicking another chat in the list was blocked too, which left no way to reach the right chat. A chat-list row now always opens its chat, and in a request that names the person, the contact check follows the chat WebBrain opens until the check starts, so it confirms that person rather than whichever chat was open; a request for the open chat itself keeps its check on that chat, and one run still confirms one chat. With Lean mode on, WhatsApp Web and Telegram Web also offer `chat_observe` and `chat_send`, which these checks and the plan rely on. Chrome and Firefox; the real-mouse retry is Chrome's. - Automatic mode: correcting or adding to a request while WebBrain is still reading no longer keeps the task stuck in Ask. When you wrote “download this” and then “and then send it to Defne on WhatsApp!”, WebBrain asked for Act quoting both messages, and the check accepted only words from the latest message, and refused any hand-off after a correction anyway. It answered that you should switch to Act, which the side panel no longer offers. Your corrections now count as your own words, and they carry into the Act run, which applies them before it does anything. - Chrome: sending a follow-up or a selection action to WebBrain while the side panel is already open no longer closes it. Each side panel now tells the background whether it is on screen, and the background skips re-opening a panel that is already showing and hands it the prompt directly A panel that was open while the background restarted tells the new worker about itself at once instead of after a delay, so a request in that moment does not close it. The same holds for actions chosen on a selection in WebBrain's PDF viewer, where a panel that was closed is opened once rather than twice. A side panel that the browser moves to another window (its tab dragged out) now reports its new window, so an action in that window no longer closes it and an action in the old window opens a panel again. The PDF viewer keeps its own window up to date the same way, so a viewer tab dragged to another window reports where it is now, taking the new window from the tab-attached event rather than from a lookup a quick click could outrun. A card answer whose request is the one to reach the cloud cost allowance now says so under the answer instead of showing it as an ordinary success. The room a card leaves for the prompt in a small context window is now estimated as a worst case (a token per ASCII character, four for anything else), so dense text such as minified code or hashes on a 4k local model is reported as too long for the model instead of being sent a request the backend rejects. Continuing a cut-off Proofread in the side panel no longer asks for the whole corrected version again alongside the request for only the remainder. Continuing a cut-off card answer, or asking a follow-up, in the side panel now sizes the reply to what the model's context window leaves, so a small local model is not sent a request it rejects; when nothing fits it says the selection is too long for the model instead of failing. A card answer is now held to a fixed 64,000-character limit that is enforced when it is produced and when the card receives it, so a follow-up or a continuation carries exactly what the card shows instead of an answer silently shortened by a token-ratio estimate; a longer one is cut and offered to the side panel. A selection too long for the model's context window is reported as an error in the card instead of being offered as a continuation the side panel would refuse as well. Continuing a long cut-off answer on a small-context model now sends the side panel only the end of it, and a follow-up question about a long card answer only the start of it, trimmed to what the model's window leaves beside the selection and the question, instead of the whole text, which left no room to reply and was refused as too long. WebBrain's own system prompt is now counted at the pace of prose rather than the worst case when this is estimated, so a 4k local model can continue or ask a follow-up about a moderately long answer from a short selection. A side-panel reply that reaches the cloud cost allowance (including a cut-off OpenAI Responses reply that is recovered) now says so under the reply instead of leaving the next continuation to fail unexplained. - Stopping a task while WebBrain was waiting for page navigation to settle now stops it immediately. The pending settle step previously kept waiting and could let the run continue after you chose Stop. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc48be9997..8fabbecd96 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -143,10 +143,10 @@ the Pull Requests link). 1. Load the unpacked extension (Chrome → `chrome://extensions/` → Developer mode → Load unpacked → pick `src/chrome/`). 2. Open the WebBrain side panel on the target site. -3. **Settings → Display → Site adapters** must be on (it is by default). +3. **Settings → Advanced → Site adapters** must be on (it is by default). 4. Run a representative task in Act mode — for sahibinden, something like _"find me 5 listings under 35,000 TL for X"_. Watch what the agent does. -5. Toggle **Settings → Display → Record traces** before the run. After +5. Toggle **Settings → Advanced → Record traces** before the run. After the run, open the Traces page and inspect the timeline. Did the agent hit any of the dead-ends your adapter is meant to prevent? Did it follow the patterns you described? diff --git a/README.md b/README.md index dd52a27329..b3a54a6f2c 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ exact tokenizer; see the [context guidance](docs/providers-and-models.md#local-p WebBrain auto-detects the real window for llama.cpp, Ollama, and LM Studio, and auto-compacts the conversation as it fills up. For Ollama, llama.cpp, LM Studio, and LocalAI, it also reads native server metadata before -adding screenshots; Settings provides Auto, Force on, and Off overrides. When +adding screenshots; the Providers page provides Auto, Force on, and Off overrides. When the optional Model field is blank, the loaded-model capability is rechecked on every user turn so a server-side hot swap takes effect. There is also a preview `ollama launch webbrain --model ` handoff. Details: @@ -120,7 +120,7 @@ preview `ollama launch webbrain --model ` handoff. Details: **Cloud APIs** — OpenAI, Anthropic Claude, Google Gemini, Azure OpenAI, AWS Bedrock, Mistral, DeepSeek, xAI Grok, MiniMax, Kimi, Qwen, z.ai GLM, Groq, Together, Cloudflare, Nvidia NIM, Hugging Face, Fireworks, OpenRouter, and more. -Settings ships **112 built-in provider cards on Chromium** (111 on Firefox), +The Providers page ships **112 built-in provider cards on Chromium** (111 on Firefox), including an endpoint-free local WebGPU option with the tested LFM2.5 2.6B preset and an experimental custom Hugging Face ONNX repository option — see the [full catalog](docs/providers-and-models.md#extended-provider-catalog). diff --git a/docs/agent-tools.md b/docs/agent-tools.md index 6075a4aca8..92caebac2b 100644 --- a/docs/agent-tools.md +++ b/docs/agent-tools.md @@ -22,9 +22,10 @@ WebBrain separates **model tier** from **conversation mode**. Tier defaults and resolution rules are documented in [providers and models](providers-and-models.md#prompttool-tiers-and-modes). -In **lean mode** (Settings → General → Lean mode), an Act run gets 17 of these +In **lean mode** (Settings → Advanced → Lean mode), an Act run gets 17 of these tools instead of its tier's set, with the same schemas, and a short prompt; see -[lean mode](lean-mode.md). +[lean mode](lean-mode.md). On WhatsApp Web and Telegram Web it also gets +`chat_observe` and `chat_send`, which the recipient guard there relies on. ## Accessibility read budgets @@ -198,7 +199,7 @@ loaded. See [skills](skills.md). **WebMCP (experimental, on by default).** The `list_webmcp_tools` / `execute_webmcp_tool` rows apply when **Experimental WebMCP** is enabled -under Settings → General → Advanced. The setting is on by default; while off, +under Settings → Bridge. The setting is on by default; while off, the tools and their prompt guidance are omitted from model requests. WebMCP annotations such as `readOnly` are page-authored hints, not a security boundary. Every invocation requires Act or Dev, fresh per-call confirmation, and the diff --git a/docs/apocalypse-mode.md b/docs/apocalypse-mode.md index e5649d1040..fb63affbdd 100644 --- a/docs/apocalypse-mode.md +++ b/docs/apocalypse-mode.md @@ -14,15 +14,15 @@ opt in. On supported Chromium browsers, local vision is optional and has two in-browser models: WebBrain VL 2 450M and Ternary Bonsai 2 2B Vision. The -**Vision Model** card here and **Settings → Assistive Models → Vision** share +**Vision Model** card here and **Providers → Vision** share one choice: **Auto** (the default), either model, or **Off**. Auto uses Ternary Bonsai 2 2B Vision once it is downloaded and is off until then. When the selected Text Model is Ternary Bonsai 2 2B Vision, the card says so: that model already reads images, so there is nothing more to download. Apocalypse Mode never enables or downloads a vision model. A Bonsai download is the chat -preset's own transfer and starts only from a click on **Download** (here or in -Settings). WebBrain VL 2 450M first needs the explicit consent step in Settings -→ Assistive Models → Vision, which checks WebGPU support, records consent and +preset's own transfer and starts only from a click on **Download** (here or on +the Providers page). WebBrain VL 2 450M first needs the explicit consent step in +Providers → Vision, which checks WebGPU support, records consent and starts caching the approximately 810 MB model from Hugging Face. Downloads continue in the background, but screenshot operations report their status and never wait for them. Wikipedia archives still require their own confirmation. @@ -32,7 +32,7 @@ context window); the picker also offers Ternary Bonsai 2 2B Vision. The other Bonsai 2 presets ship but are hidden from the pickers for now. The selected model's download starts automatically when Apocalypse Mode is enabled. Once downloaded, Compass works without Apocalypse Mode enabled: it is selectable as a chat -provider under Settings → Providers and through the standalone chat control. +provider on the Providers page and through the standalone chat control. Turning local vision off (or leaving WebBrain VL 2 450M for another choice) preserves its cache and any configured remote vision provider. diff --git a/docs/architecture.md b/docs/architecture.md index c6dd93c18f..df42eb3deb 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1215,7 +1215,7 @@ locally; v1 does not use embeddings or retrieval calls. Explicit `/memory --add ` writes immediately through `add_user_memory` and enables memory if needed. `/memory` and `/memory --forget ` expose the -same local store from the side panel. Settings -> Profile provides enable, +same local store from the side panel. Settings → Memory provides enable, auto-learn, edit, delete, clear, export, and import controls for Chrome and Firefox. @@ -1365,7 +1365,7 @@ Jobs are stored in `chrome.storage.local` under the key `wb_scheduled_jobs` as a 110+ adapters inject site-specific guidance into the first user message (and re-inject on navigation to a different matched site). Only ONE adapter fires at a time (`getActiveAdapter(url)` returns the first match). See `docs/site-adapters.md` for how to write one. Each matched adapter emits a content-free `adapter_match` trace note with its identity, revision, and whether notes were injected. High-evidence repeated tasks may additionally expose validated V2 workflow jobs; the planner selects an app-owned ID semantically, the binding is revalidated on the live pre-execution URL, and the executor receives its trusted stages/evidence contract. Required submissions need dispatch plus post-submit observation, while jobs with a trusted complete inventory may require an explicit job-bound complete-coverage marker whose count matches terminal current-task ledger rows. -Adapters may also expose narrowly scoped runtime policy. Douyin `/chat` is the first `messaging.verifyActiveRecipient` route. The structured planner resolves an anaphoric recipient to `named` only when authentic prior-user context identifies exactly one target; unresolved pronouns clarify, and words that refer back to someone named earlier never mean the open thread. `active_conversation` is reserved for a request that points at the conversation on screen itself instead of naming it ("reply here", "this one", "this user", in any language): the planner never sees the page, so it does not ask who that is. An `active_conversation` planner target must first be pinned to exactly one strong visible header identity, while planning or, where the identity needs the page's own preparation first (Gmail's collapsed reply composer, a native WhatsApp contact drawer), at the first send in the thread open when the run was authorized; ambiguous or missing evidence stops for clarification. Its `recipients` are only the people the same request also names. On a route where a conversation reaches one person, the pinned conversation is the target and stays authorized for the whole task, while each named person is kept as requested (`requestedMessaging`, shown in the reviewed plan) and confirmed on WebBrain's recipient card before the first send to them. Native WhatsApp checks a contact through its drawer once per run, for the first chat the run looks at; once that check is invalidated, as by a change of the chat selection, the observer and the recipient probe report `native_whatsapp_contact_check_spent`, and the agent is told that the chat needs a new request instead of being sent to retry. A chat only hidden for a moment, as behind a modal, is not a spent check. On a recipient-set route such as mail the named people are not added to the pin, since a planner copies names as the user wrote them while a mail composer shows addresses. The pin is the thread's recipients as before: one taken while planning sends a differing set to the card, while one taken at the first send from Gmail's collapsed reply composer is whatever that composer holds then, an existing limit. The first user message's screenshot note is dropped from the planner's copy of the task with the image the planner never receives. Immediately before a send-like click, submitted field, or Enter press, the content script resolves the exact target and a lower-page layout composer, then collects only unique header evidence from the narrow, non-scrollable region above it. Enter or submitted field input in a different editable is conclusively non-message only when structural semantics positively identify a search or navigation field; an alternate reply/forward/split-pane composer remains inconclusive and therefore cannot bypass recipient verification. A distant general control likewise remains inconclusive rather than being declared safe. A semantic conversation row in a separate left rail is conclusively navigation-only, allowing recovery to the requested thread whether or not the short rail currently overflows; nested row buttons, links, and their leaf descendants plus controls outside that structure remain inconclusive. The agent requires exact normalized identity equality and returns a no-dispatch blocker on missing, inconclusive, ambiguous, or mismatched evidence, and protected Enter dispatch permits exactly one keypress per verification. Every authorized `click`, `click_ax`, `set_field({submit:true})`, and composer Enter receives a one-use binding to the exact action target, composer, URL, and identity set. Direct content dispatches and Chrome's trusted CDP mouse/key paths consume and revalidate it immediately before `el.click()`, `mousePressed`, or Enter, after any field reconciliation and combobox delays; protected `click_ax` never issues a second no-progress fallback click. Search-result text, message content, input values, generic page text, failed probes, and edited plans with stale hidden metadata cannot authorize a send. Dispatch-capable tools whose effects cannot be bound to the probed recipient (`iframe_click`, `execute_js`, WebMCP execution, and `upload_file`, whose change event may auto-send) are unavailable on this protected route. Deterministic saved-workflow replay has no planner-owned recipient target, so a workflow with any potentially dispatching step scoped to a protected messaging route stops before page actions and directs the user to run a normal Act task with a named recipient; a per-step check also covers legacy workflows whose scope metadata is incomplete. +Adapters may also expose narrowly scoped runtime policy. Douyin `/chat` is the first `messaging.verifyActiveRecipient` route. The structured planner resolves an anaphoric recipient to `named` only when authentic prior-user context identifies exactly one target; unresolved pronouns clarify, and words that refer back to someone named earlier never mean the open thread. `active_conversation` is reserved for a request that points at the conversation on screen itself instead of naming it ("reply here", "this one", "this user", in any language): the planner never sees the page, so it does not ask who that is. An `active_conversation` planner target must first be pinned to exactly one strong visible header identity, while planning or, where the identity needs the page's own preparation first (Gmail's collapsed reply composer, a native WhatsApp contact drawer), at the first send in the thread open when the run was authorized; ambiguous or missing evidence stops for clarification. Its `recipients` are only the people the same request also names. On a route where a conversation reaches one person, the pinned conversation is the target and stays authorized for the whole task, while each named person is kept as requested (`requestedMessaging`, shown in the reviewed plan) and confirmed on WebBrain's recipient card before the first send to them. Native WhatsApp checks a contact through its drawer once per run, for the first chat the run looks at, except that a request naming its recipient may first open that person's chat from the chat list: its anchor follows the chat selection until the run arms its check with the guarded contact-name click. Once that check is invalidated, as by a change of the chat selection after it was armed (or at all, in a request for the open chat), the observer and the recipient probe report `native_whatsapp_contact_check_spent`, and the agent is told that the chat needs a new request instead of being sent to retry. Before the check, a blocked message action names the exact contact-name or Close control to click (`nativeWhatsappRepairTarget`). A chat only hidden for a moment, as behind a modal, is not a spent check. On a recipient-set route such as mail the named people are not added to the pin, since a planner copies names as the user wrote them while a mail composer shows addresses. The pin is the thread's recipients as before: one taken while planning sends a differing set to the card, while one taken at the first send from Gmail's collapsed reply composer is whatever that composer holds then, an existing limit. The first user message's screenshot note is dropped from the planner's copy of the task with the image the planner never receives. Immediately before a send-like click, submitted field, or Enter press, the content script resolves the exact target and a lower-page layout composer, then collects only unique header evidence from the narrow, non-scrollable region above it. Enter or submitted field input in a different editable is conclusively non-message only when structural semantics positively identify a search or navigation field; an alternate reply/forward/split-pane composer remains inconclusive and therefore cannot bypass recipient verification. A distant general control likewise remains inconclusive rather than being declared safe. A semantic conversation row in a separate left rail is conclusively navigation-only, allowing recovery to the requested thread whether or not the short rail currently overflows, and a row of WhatsApp's native chat list is navigation-only even while the open chat's contact is unconfirmed; nested row buttons, links, and their leaf descendants plus controls outside that structure remain inconclusive. The agent requires exact normalized identity equality and returns a no-dispatch blocker on missing, inconclusive, ambiguous, or mismatched evidence, and protected Enter dispatch permits exactly one keypress per verification. Every authorized `click`, `click_ax`, `set_field({submit:true})`, and composer Enter receives a one-use binding to the exact action target, composer, URL, and identity set. Direct content dispatches and Chrome's trusted CDP mouse/key paths consume and revalidate it immediately before `el.click()`, `mousePressed`, or Enter, after any field reconciliation and combobox delays; protected `click_ax` never issues a second no-progress fallback click. Search-result text, message content, input values, generic page text, failed probes, and edited plans with stale hidden metadata cannot authorize a send. Dispatch-capable tools whose effects cannot be bound to the probed recipient (`iframe_click`, `execute_js`, WebMCP execution, and `upload_file`, whose change event may auto-send) are unavailable on this protected route. Deterministic saved-workflow replay has no planner-owned recipient target, so a workflow with any potentially dispatching step scoped to a protected messaging route stops before page actions and directs the user to run a normal Act task with a named recipient; a per-step check also covers legacy workflows whose scope metadata is incomplete. ### Accessibility Tree (`accessibility-tree.js`) @@ -1576,7 +1576,7 @@ Key points: - No additional auth: the agent IS the user's browser session - Ask is read-only; Act and Dev are action modes. Dev adds source/style/page-debugging tools and is blocked for Compact-tier providers. - Plan before Act can require human approval before any action-mode tool call -- An unanswered `clarify` question follows Settings → General → "When a question times out": finish the task (default) or play it safe. Questions about deletion, money, credentials, the recipient, or an unrequested publication always time out to the safe answer (see `docs/security-model.md`). +- An unanswered `clarify` question follows Settings → Budgets → "When a question times out": finish the task (default) or play it safe. Questions about deletion, money, credentials, the recipient, or an unrequested publication always time out to the safe answer (see `docs/security-model.md`). - The persistent **Always allow API mutations** setting (on by default) or the conversation's `/allow-api` override waives permission prompts for write-method `fetch_url` / `research_url` calls - Tool results capped at 8 KB to limit prompt-injection surface - `strictSecretMode` instructs the model not to quote credentials in summaries, redacts known credential values (including short numeric PIN/CVV values) out of everything a cloud run publishes, and fails closed to scalar redaction if its bounded secret registry fills @@ -1594,10 +1594,10 @@ from before modes with `systemOneEnabled` reads as On) to a configuration whose one thing Auto needs at run time, whether Ternary Bonsai 2 2B Vision is downloaded (Chrome only; Firefox's copy never finds it). -The static decision-models card lives in Settings → Assistive Models, after Vision and -Speech to text, outside the dynamic provider list. It never participates in -chat model selection. The tab retains its internal `multimodal` identifier for -existing links and remembered selections. `systemone-judge.js` owns the pinned HTTP contract, +The static decision-models card lives on the Decision tab of the Providers page +(`ui/providers.html#decision`), outside the dynamic provider list on the LLM tab. +It never participates in chat model selection. Old `settings.html#multimodal` +links open the Vision tab of the Providers page. `systemone-judge.js` owns the pinned HTTP contract, strict typed responses and a shared deadline for retries. `systemone-evidence.js` collects bounded allowlisted observations and invalidates them on page changes. Scheduler evaluation returns keep/downgrade/skip plus metadata, revalidates the diff --git a/docs/captcha-provider-coverage.md b/docs/captcha-provider-coverage.md index c51ec283f8..d488cc5c2f 100644 --- a/docs/captcha-provider-coverage.md +++ b/docs/captcha-provider-coverage.md @@ -23,7 +23,7 @@ This integration exposes **seven providers and 198 catalog method variants**. A ## Setup and consent -Open **Settings → General → Advanced → CAPTCHA solvers**. Each provider has its own API key, enabled checkbox, Save/Test/Clear controls, supported-family list, and official documentation link. +Open **Settings → CAPTCHA**. Each provider has its own API key, enabled checkbox, Save/Test/Clear controls, supported-family list, and official documentation link. Typing an API key checks that provider's enabled box unless the user has manually disabled it while editing. Save persists the checkbox state. A saved key can remain present while its provider is disabled. Testing a balance does not enable solving or save consent. Clearing a key disables that provider. @@ -233,7 +233,7 @@ Automatic widget solves save the selected widget and a paid-attempt gate before The CAPTCHA gate permits `done` with `outcome: "failed"` or `"partial"` in every gate state. Cancelling or reporting blocked work must not require a solve. This exception does not authorize page mutations or bypass verification for successful completion. -**Managed Cloud is separate.** Managed browsers continue using the server-side CapSolver broker and ignore personal keys and weights. Native catalog discovery/submission is excluded for that route. This change does not expand or deploy the server-side broker's allowlist, quotas, or billing. +**Managed Cloud is separate.** Managed browsers continue using the server-side CapSolver broker and ignore personal keys and weights. Settings hides its CAPTCHA tab there, since there is nothing to configure. Native catalog discovery/submission is excluded for that route. This change does not expand or deploy the server-side broker's allowlist, quotas, or billing. ## Troubleshooting diff --git a/docs/fr/providers-and-models.md b/docs/fr/providers-and-models.md index 6144da9a55..5455ad7e77 100644 --- a/docs/fr/providers-and-models.md +++ b/docs/fr/providers-and-models.md @@ -126,7 +126,7 @@ Settings accepte aussi un dépôt Hugging Face personnalisé. Les autres préréglages Bonsai 2 sont livrés mais masqués des sélecteurs pour l’instant. Le modèle choisi est téléchargé à l’activation d’Apocalypse ; une fois en cache, il fonctionne sans qu’Apocalypse soit activé. Sur les GPU limités, -réduisez la fenêtre de contexte dans Settings → Providers si nécessaire. +réduisez la fenêtre de contexte dans la page Providers si nécessaire. Firefox n’expose pas cette carte. Les modèles dans le navigateur répondent seulement aux questions. Dans le @@ -332,7 +332,7 @@ Les entrées de fournisseur obsolètes (`webbrain`, `openai_subscription`, ### Plafonds de Coût -Les paramètres exposent des plafonds de coût cloud pour la session et le total. L'agent préfère une valeur `usage.cost`/`usage.cost_usd` rapportée par le fournisseur lorsqu'elle est présente (OpenRouter la rapporte directement). Pour les fournisseurs cloud directs qui ne retournent que des compteurs de tokens, WebBrain estime les dépenses à partir des champs de configuration du fournisseur : +L'onglet Budgets des paramètres expose des plafonds de coût cloud pour la session et le total. L'agent préfère une valeur `usage.cost`/`usage.cost_usd` rapportée par le fournisseur lorsqu'elle est présente (OpenRouter la rapporte directement). Pour les fournisseurs cloud directs qui ne retournent que des compteurs de tokens, WebBrain estime les dépenses à partir des champs de configuration du fournisseur : - `inputCostPerMillionUsd` - `cacheReadCostPerMillionUsd` diff --git a/docs/guards.md b/docs/guards.md index 58c26e7b3e..e3d50b5546 100644 --- a/docs/guards.md +++ b/docs/guards.md @@ -62,7 +62,7 @@ the action is wrong (`onDecided`) and when it cannot tell (`onCannotDecide`): run as given (`infra`), such as a coordinate click whose own `expected_name` or `expected_role` no longer matches the point; and Stop, corrections and cancelled cards (`user_control`). -- **Strict checks.** Settings → General → "Strict checks" (`strictGuards`) +- **Strict checks.** Settings → Advanced → "Strict checks" (`strictGuards`) makes every quality guard block again, with the old forced verification turns and the failure-only `done`. - **Unregistered ids** keep blocking, so a refusal that was never registered @@ -88,7 +88,7 @@ When a guard cannot verify a consequential step and its `onCannotDecide` is step is refused there and the next attempt asks. When the checks after a "Go ahead" reach another guard's question about the same action, that card is asked in turn and the first answer stands. -- **Timeout.** A quality guard's card follows Settings → General: the clarify +- **Timeout.** A quality guard's card follows Settings → Budgets: the clarify timeout (Off waits, Instant answers at once) and "When a question times out" (`finish` goes ahead, `safe` does not). A hard-class card never times out and never goes ahead on its own, like the recipient and deletion cards. diff --git a/docs/lean-mode.md b/docs/lean-mode.md index a3592a3c07..0c521f1fc2 100644 --- a/docs/lean-mode.md +++ b/docs/lean-mode.md @@ -8,7 +8,7 @@ Lean mode follows the Claude in Chrome model ([claude-chrome-comparison.md](clau ## The setting -Settings → General → **Lean mode** (storage key `leanMode`): +Settings → Advanced → **Lean mode** (storage key `leanMode`): - **Auto** (default): on for strong cloud models, off for local and small models (rules below). - **On**: always, for every provider and tier. @@ -42,9 +42,9 @@ The list is `LEAN_STRONG_MODEL_RULES` in `lean-mode.js`. That file is identical ## What a lean run gets -**Tools.** 17 of WebBrain's existing tools, with the same schemas as at the Full tier: `get_accessibility_tree`, `read_page`, `inspect_viewport`, `click_ax`, `click`, `set_field`, `type_ax`, `set_checked`, `type_text`, `press_keys`, `scroll`, `navigate`, `wait_for_stable`, `upload_file`, `calculate`, `clarify` and `done` (`LEAN_TOOL_NAMES` in `tools.js`). `generate_image`, `carousel_navigate`, `gmail_count_results` and the tools of enabled skills are added when they apply, as in a full run; a Compact provider set to On keeps its own `upload_file` contract. +**Tools.** 17 of WebBrain's existing tools, with the same schemas as at the Full tier: `get_accessibility_tree`, `read_page`, `inspect_viewport`, `click_ax`, `click`, `set_field`, `type_ax`, `set_checked`, `type_text`, `press_keys`, `scroll`, `navigate`, `wait_for_stable`, `upload_file`, `calculate`, `clarify` and `done` (`LEAN_TOOL_NAMES` in `tools.js`). `generate_image`, `carousel_navigate`, `gmail_count_results` and the tools of enabled skills are added when they apply, as in a full run; a Compact provider set to On keeps its own `upload_file` contract. On a native chat client (WhatsApp Web, Telegram Web; `isNativeChatClientUrl` in `adapters.js`) `chat_observe` and `chat_send` are added too (`LEAN_NATIVE_CHAT_TOOL_NAMES`): the recipient guard, which lean mode keeps, confirms a contact and reads the latest messages there through them, and without them its repairs pointed at tools the run did not have. -Not offered: `browser_batch`, the scratchpad and progress ledger, `fetch_url` and the other fetch, research and download tools, iframe and shadow-DOM tools, `hover` and `drag_drop`, `verify_form`, the chat-workflow tools, scheduling, WebMCP and the CAPTCHA tools. Tabs are not model-callable in WebBrain in any mode. A call to a tool a run does not offer is refused, as in every mode. +Not offered: `browser_batch`, the scratchpad and progress ledger, `fetch_url` and the other fetch, research and download tools, iframe and shadow-DOM tools, `hover` and `drag_drop`, `verify_form`, the chat-workflow tools (apart from `chat_observe` and `chat_send` on a native chat client), scheduling, WebMCP and the CAPTCHA tools. Tabs are not model-callable in WebBrain in any mode. A call to a tool a run does not offer is refused, as in every mode. **Prompt.** `SYSTEM_PROMPT_ACT_LEAN`, about 5,900 characters against about 49,000 for the Full Act prompt. It keeps the untrusted-page-content boundary and the prompt-injection rules in full, the hard limits (deleting, paying, sending, publishing, recipients, credentials and one-time codes, CAPTCHAs and other human checks), the sensitive-data guidance and the plan-to-execution rules. It tells the model that WebBrain will not check its typing or its result, so it must read the page again before `done`. The notes for batching, WebMCP, research escalation and the CAPTCHA solver are left out because their tools are. diff --git a/docs/localization.md b/docs/localization.md index a1651b0b93..2c93fd9adc 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -37,8 +37,9 @@ src/chrome/src/ui/ └── zh.js # Chinese ``` -Settings → Language lists all **23** locales from `LANGUAGES` in `i18n.js` -(English and Chinese pinned first; the rest sorted by English name). +The side panel's language picker lists all **23** locales from `LANGUAGES` in +`i18n.js` (English and Chinese pinned first; the rest sorted by English name). +The settings pages follow the chosen language through `wb-locale-changed`. ### Key Functions ```js @@ -148,8 +149,8 @@ Copy the locale file to `src/firefox/src/ui/locales/.js` and update `src/f ### Step 4: Test -1. Open the extension settings -2. Switch to the new language in the Language dropdown +1. Open the side panel +2. Pick the new language from its language menu (top left) 3. Verify the side panel, settings, and traces pages render correctly 4. Check that missing keys fall back to English gracefully 5. Test RTL layouts for Arabic and Hebrew; `RTL_LOCALES` in `i18n.js` controls document direction @@ -169,7 +170,7 @@ Copy the locale file to `src/firefox/src/ui/locales/.js` and update `src/f | Prefix | Section | |---|---| | `sp.` | Side panel UI | -| `st.` | Settings page | +| `st.` | Settings, Providers and Permissions pages | | `tr.` | Traces page | | `tool.` | Tool labels | | `ob.` | Onboarding flow | diff --git a/docs/native-chat-observation.md b/docs/native-chat-observation.md index 88615f5660..44dffbe379 100644 --- a/docs/native-chat-observation.md +++ b/docs/native-chat-observation.md @@ -215,6 +215,20 @@ remain the exact original nodes throughout. Pre-existing drawers, stale drawer responses, same-name row recycling, selection changes and ambiguous phone fields cannot bind a recipient. Contact names or opaque message IDs alone cannot do so. +A message action that the recipient probe blocks in a chat whose contact is not +confirmed yet carries the same exact reference (`nativeWhatsappRepairTarget`, +`open_contact` or `close_contact`), and the Agent names that control to the +model instead of telling it to re-read the page and retry. A row of WhatsApp's +own chat list, clicked on the row itself, opens another chat whatever the open +chat's state; the row's menu and other nested controls stay guarded. A run +checks one contact, for its anchor chat: the first chat it looks at, or, in a +request that names its recipient, the chat that is selected when the run arms +its check with the guarded contact-name click, so such a request can first open +the right chat. The probe reports that kind of request +(`namedRecipientSelection`); a request for the open chat itself, or a target +already pinned to a verified chat identity, never moves its anchor. Once a check +is armed, a later selection change spends it. + The drawer's close control is its header's one named plain button, whatever language names it ("Close", "Kapat"); a header with two controls offers none, and the control must keep the name it had when the guarded click armed it. @@ -259,6 +273,9 @@ are outside this reader's proved contract. `test/native-whatsapp-contact.mjs`, `test/whatsapp-chat-completion.mjs` and `test/whatsapp-chat-restart.mjs` exercise these boundaries in both browser builds. +`test/whatsapp-chat-selection.mjs` covers the repair reference on a blocked +message action, chat-list navigation away from an unconfirmed chat, and which +requests may move the contact check, in both builds. `test/whatsapp-native-bootstrap.mjs` adds 34 actual-Agent/browser checks for the generic native composer, precise repair references and wrong or stale targets. `test/whatsapp-drawer-identity.mjs` adds 56 paired production-reader/browser diff --git a/docs/privacy-and-data-flow.md b/docs/privacy-and-data-flow.md index a458bdcbe0..435c6ccc7a 100644 --- a/docs/privacy-and-data-flow.md +++ b/docs/privacy-and-data-flow.md @@ -46,7 +46,7 @@ inference stay on-device. ### Which provider receives the data? -The user chooses their provider in Settings. Options include: +The user chooses their provider on the Providers page (side panel provider picker → More…). Options include: - **WebBrain Compass**: requests go through `api.webbrain.one`; selected interactions may be retained and used for evaluation, improvement, fine-tuning, and training while Help Improve WebBrain is enabled - **Bring-your-own cloud providers**: OpenAI, Anthropic, Google Gemini, Mistral, DeepSeek, xAI, Groq, OpenRouter, etc. — requests go directly to the provider using the user's credentials; WebBrain receives a separate research copy only if the user enables that provider's **Share queries for research** switch @@ -107,7 +107,7 @@ requests. ### Decision models and completion verification -Settings → Assistive Models → Decision models has three modes. **Auto** (the +Providers → Decision has three decision-model modes. **Auto** (the default) sends nothing anywhere new: in Chrome it uses Ternary Bonsai 2 2B Vision on the device once it is downloaded, for completion and scheduled checks only, and while Compass is the conversation provider Compass's managed Cloud @@ -245,7 +245,7 @@ Strict Secret Mode disables judging; offline loopback decisions remain available ### WebBrain Compass improvement data -Help Improve WebBrain is available under Settings -> General and is +Help Improve WebBrain is available under Settings → Advanced and is on by default. When it is on, WebBrain may retain eligible Compass prompts, model responses, relevant page text, tool calls, browser-agent actions, feedback, and task outcome information for evaluation, development, improvement, fine-tuning, @@ -273,7 +273,7 @@ the raw device and prompt-derived fingerprint are not stored or sent upstream. Repeated identical opening messages can be grouped together, and compaction can split a legacy conversation, so current clients' explicit conversation ids are authoritative. Users of older clients must install the latest client to disable -future collection under Settings -> General. +future collection under Settings → Advanced. An explicit `0` is always opted out. Once any explicit opt-out reaches a derived or client-provided session, the Compass service permanently marks that @@ -326,7 +326,7 @@ switch for content they do not want to share. The extension records a local trace for an opted-in run even if the separate Record traces switch is off. The upload projects only metadata from that trace, -including when the user independently selected local lossless tracing. Research +even when Record traces also keeps its full request details locally. Research shares use a durable, revocable local outbox and are retried after temporary delivery failures; the provider's live sharing consent is checked before each send. The Compass service admits these records only under explicit @@ -352,7 +352,7 @@ the stored copies are not separately synced to WebBrain. ### Trace Recorder -**Local feedback diagnostics** is enabled by default under Settings → Display. +**Local feedback diagnostics** is enabled by default under Settings → Advanced. When ordinary trace recording is off, it retains metadata-only diagnostics for up to ten completed runs, seven days, and 2 MiB (with a 128 KiB per-run cap). These automatic records never inherit lossless tracing and contain no raw @@ -360,13 +360,15 @@ conversation/tool text or screenshot bytes. Turning the setting off stops this recording and removes its automatic history; explicitly recorded traces remain. Retention and event-budget omissions are identified in feedback exports. -When enabled (Settings → Display → "Record traces"), every agent run is written -to the local `webbrain_traces` IndexedDB database in one of two privacy tiers. -An external/local provider with **Share queries for research** enabled also -records its run locally for the bounded diagnostic upload, even when this -separate Record traces setting is off: +When enabled (Settings → Advanced → "Record traces"), every agent run is written +to the local `webbrain_traces` IndexedDB database with its full request details +(the lossless tier below); one switch turns both on or off. An external/local +provider with **Share queries for research** enabled also records its run +locally for the bounded diagnostic upload, even when Record traces is off; such +runs use the metadata-only tier: -- **Default metadata-only tier.** The `runs` store keeps run identifiers and +- **Metadata-only tier.** This is the default tier for runs recorded while + Record traces is off. The `runs` store keeps run identifiers and lineage, model/provider identifiers, token and event totals, timestamps, status, and the allowlisted runtime snapshot. It omits the user's message, final assistant text, full tab URL/title, and attachment filenames. The @@ -374,15 +376,17 @@ separate Record traces setting is off: counts, timings, usage, finish/status/error codes, called tool name and outcome status, and screenshot marker/caption. It omits raw LLM request/response text, tool schemas, tool arguments/results, and error - messages. Default traces do not write screenshot blobs or data URLs to the - `shots` store. -- **Lossless debug tier (explicit opt-in).** Enabling lossless tracing under - Settings → Display adds user/final text, bounded request messages and tool - schemas, model responses and tool calls, tool arguments/results, detailed - errors, screenshot bytes, tab URL/title, and attachment filename metadata. - Lossless payloads have per-request, per-result, per-run, and aggregate - storage bounds; old completed lossless runs may be evicted to remain within - the aggregate limit. These runs are visibly marked in the Traces UI. + messages. Metadata-only traces do not write screenshot blobs or data URLs to + the `shots` store. +- **Lossless debug tier (opt-in, through Record traces).** Record traces adds user/final + text, bounded request messages and tool schemas, model responses and tool + calls, tool arguments/results, detailed errors, screenshot bytes, tab + URL/title, and attachment filename metadata. Lossless payloads have + per-request, per-result, per-run, and aggregate storage bounds; old completed + lossless runs may be evicted to remain within the aggregate limit. These runs + are visibly marked in the Traces UI. Full request details used to have a + switch of their own; on update, an install that recorded traces without them + has them turned on once, so the single switch matches what is recorded. `click_ax_timing` trace notes retain only bounded stage durations, input-event counts, outcome categories, and safety-status booleans. URL, target labels, @@ -510,7 +514,7 @@ but users should not store passwords, API keys, tokens, recovery codes, or other sensitive secrets as memory. When user memory is enabled, active records are appended to the agent system -prompt as a bounded block. Settings -> Profile controls whether memory is +prompt as a bounded block. Settings → Memory controls whether memory is enabled, whether optional auto-learning runs after completed turns, and the maximum prompt characters injected. `/memory --add ` writes an explicit memory immediately without an extractor call. Export/import JSON is local-only and is @@ -540,7 +544,7 @@ WebBrain Compass or to the configured LLM provider. ### Optional Encrypted Cloud Sync Active WebBrain Compass subscribers may explicitly enable encrypted profile sync in -Settings. The extension combines user memory, profile autofill, and provider +Settings → Memory. The extension combines user memory, profile autofill, and provider configuration (including API keys, but excluding legacy OAuth access/refresh token stores) into one vault. Chromium-only WebGPU provider configuration and selection remain device-local so a Firefox sync cannot replace that local choice. @@ -573,7 +577,7 @@ the URL + method to the active LLM conversation. ### Experimental WebMCP WebMCP is on by default. A user can disable **Experimental WebMCP** under -Settings → General → Advanced to prevent WebBrain from sending its tool schemas +Settings → Bridge to prevent WebBrain from sending its tool schemas or prompt guidance to the configured LLM. On supporting Chrome pages, WebBrain can enable the experimental CDP `WebMCP` domain. Chrome reports the structured tools registered by the current page, including their page-supplied name, description, input schema, annotations, and diff --git a/docs/prompt-injection-defense.md b/docs/prompt-injection-defense.md index 57337cac32..a52454771c 100644 --- a/docs/prompt-injection-defense.md +++ b/docs/prompt-injection-defense.md @@ -37,7 +37,7 @@ them in sync — the test suite asserts the pure modules are byte-identical. the human is the trust anchor. - Code: `permission-gate.js` (`capabilityFor`, `requiredHosts`, `PermissionManager`); the gate loop in `agent.js _executeToolBatch`. - - User control: Settings → Permissions (review/revoke grants + the master + - User control: the Permissions page (review/revoke grants + the master switch "Ask before consequential actions"). The warning button in the side panel's composer toolbar toggles the same master switch; it never answers a pending permission card. @@ -168,7 +168,7 @@ booleans (verified, failed, credential field) beside the child's tool name and `ref_N` target, never result text. ### Don't weaken the boundary for "trusted sites" -The master switch (Settings → Permissions) disables **Layer 3 only** (the +The master switch (Permissions page) disables **Layer 3 only** (the prompts). Layers 1, 2, and 4 stay on always — they cost nothing and are what protect the user on the trusted sites where injected content actually lives (a reputable domain is *anti-correlated* with safe content). Never gate Layers @@ -187,7 +187,7 @@ protect the user on the trusted sites where injected content actually lives grant storage / `hydrateFrom`, content-wrap breakout-stripping. - planner prompt parity / boundary checks in `test/security/injection-corpus.mjs`. - `test/manual-permissions.md` — the in-browser checklist (the 3-option - permission card and the Settings → Permissions tab) that the unit suite can't + permission card and the Permissions page) that the unit suite can't cover. **The guard checks that tools are *listed*, not that they're listed diff --git a/docs/providers-and-models.md b/docs/providers-and-models.md index 01af2a5632..78f2abdb0c 100644 --- a/docs/providers-and-models.md +++ b/docs/providers-and-models.md @@ -4,11 +4,13 @@ ## Main provider and assistive models -**Settings → Providers** selects the main model for conversation, planning and -final replies. **Settings → Assistive Models** groups Vision (including screenshot -limits and redaction), Speech to text, Generative Media (powering the -`generate_image` agent tool), Decision models, and SafeSocial. Configuring an assistive -model does not replace the active provider. Decision models share one provider/model +The **Providers** page (`ui/providers.html`, opened from **More…** in the side +panel's model menu or from the Settings header) selects the main model for +conversation, planning and final replies on its **LLM** tab. Its other tabs hold +the assistive models: Vision, Speech (speech to text), Generative (powering the +`generate_image` agent tool), Decision models, and SafeSocial. Screenshot limits +are in Settings → Budgets and screenshot redaction in Settings → Advanced. +Configuring an assistive model does not replace the active provider. Decision models share one provider/model selection with separate completion, watch, scheduled-check, classification and browser decision switches. See [the settings guide](https://webbrain.one/docs/settings/#multimodal) and [data flow](privacy-and-data-flow.md#decision-models-and-completion-verification) @@ -23,7 +25,7 @@ and private inference-profile ARNs are omitted from this identity context. ### Gemini 4 Argon and new Muse models -Settings suggests `gemini-4-argon` on Google Gemini and +The Providers page suggests `gemini-4-argon` on Google Gemini and `google/gemini-4-argon`, `meta/muse-wonder`, and `meta/muse-spark-open` on OpenRouter. These models support native tools and screenshot input. WebBrain infers their 1,048,576-token context unless a user or local runtime overrides it. @@ -60,7 +62,8 @@ cannot establish live account access or upstream availability. A decision model answers the agent's fixed-choice questions (is the task finished, did a watch find what it waited for, what does a request say about an -action) so the chat model does not have to. Settings asks one question first: +action) so the chat model does not have to. The Decision tab of the Providers +page asks one question first: - **Auto** (default) needs no setup. In Chrome it uses Ternary Bonsai 2 2B Vision once that preset is downloaded (Providers → WebGPU, the install page or @@ -138,7 +141,7 @@ shape operators are permitted and explicitly disclosed; it is not a pure-GPU claim. **Unload** or disabling outsourcing releases the Worker/GPU resources and retains the cache; **Remove cached model** requires the model to be unloaded. After **Download and load** or **Load**, D1 stays loaded until -it is unloaded, removed or switched off in Settings: a decision that finds it +it is unloaded, removed or switched off on the Providers page: a decision that finds it unloaded (a browser restart, a discarded stalled session, a lost GPU device) starts one reload from the verified cache in the background and uses the fallback chain meanwhile. A reload never downloads. A decision whose caller @@ -215,7 +218,7 @@ An older Cloud deployment falls through to the active LLM and existing checks. ### Generative Media -Configure **Settings → Assistive Models → Generative Media** for the +Configure **Providers → Generative** for the `generate_image` agent tool. Select one provider and save its settings: | Provider | Required settings | Generation | @@ -260,7 +263,7 @@ Inline bytes are shown in chat and excluded from model context. ### SafeSocial image classifier (experimental) -**Settings → Assistive Models → SafeSocial** optionally filters Instagram images +**Providers → SafeSocial** optionally filters Instagram images and video posters using the local, multilabel [EfficientNet-Lite0 classifier](https://huggingface.co/webbrain-one/safesocial-trigger-classifier-efficientnet-lite0). It is off by default and does not replace the chat or screenshot vision model. @@ -362,8 +365,8 @@ class BaseLLMProvider { | `z_ai` | `openai` | cloud | `glm-5.2` | Model-name regex | The sidepanel also exposes `webbrain_cloud_max` as **WebBrain Compass XL**. -It is a managed, sidepanel-only runtime profile rather than a second Settings -provider card. It uses the same endpoint and sends `model: max`; the hosted +It is a managed, sidepanel-only runtime profile rather than a second provider +card on the Providers page. It uses the same endpoint and sends `model: max`; the hosted backend returns `WebBrain Compass XL 1.0` and consumes usage credits at five times the standard rate. @@ -372,8 +375,8 @@ times the standard rate. WebBrain also ships 80 disabled-by-default provider cards. Most are sourced from the OpenCode provider catalog snapshot at commit `62e4641235d7847dadc60da37cca8a023dd54fc1`; provider-specific additions use -their official API documentation. Together with the original cards, Settings -contains **113 built-in providers on Chromium** and **112 on Firefox**; the +their official API documentation. Together with the original cards, the +Providers page lists **113 built-in providers on Chromium** and **112 on Firefox**; the difference is the Chromium-only in-browser WebGPU runtime. | IDs | @@ -411,7 +414,7 @@ the proxy server and are never entered into WebBrain. [IO.NET](https://io.net/docs/guides/intelligence/io-intelligence) and [Synthetic](https://synthetic.new/) are built-in OpenAI-compatible cloud -providers. Add each service's bearer API key in its Settings card, choose a +providers. Add each service's bearer API key in its card on the Providers page, choose a model, save, and select the provider. #### NEAR AI Cloud @@ -426,7 +429,7 @@ same API and billing but do not inherit the TEE privacy guarantees. See the [OpenAI compatibility](https://docs.near.ai/cloud/guides/openai-compatibility) guides. -In WebBrain, open **Settings -> Providers -> NEAR AI Cloud**. Generate an API +In WebBrain, open **Providers -> LLM -> NEAR AI Cloud**. Generate an API key from the [NEAR AI Cloud dashboard](https://cloud.near.ai/), paste it into the card, keep the default `z-ai/glm-5.3-flash` model, then click **Test Connection**. If selecting a model with a smaller context window, such as @@ -485,8 +488,8 @@ duplicate request. ### Local Providers On Chromium, **WebGPU (In-browser)** is an endpoint-free local provider. -Settings and Apocalypse Mode offer the same two presets, in this order, and -Settings also accepts a custom Hugging Face repository: +The Providers page and Apocalypse Mode offer the same two presets, in this +order, and the Providers page also accepts a custom Hugging Face repository: | Model | Download | Images | Browser context | | --- | --- | --- | --- | @@ -495,7 +498,7 @@ Settings also accepts a custom Hugging Face repository: These presets ship but are hidden from the pickers for now (`WEBGPU_HIDDEN_MODEL_IDS` in `src/chrome/src/providers/webgpu.js`). A saved -selection still loads: Settings shows it as a custom model, and Apocalypse Mode +selection still loads: the Providers page shows it as a custom model, and Apocalypse Mode switches to an offered preset. | Model | Download | Images | Browser context | @@ -572,11 +575,11 @@ validates the template after loading and rejects incompatible repositories. The provider defaults to the Compact prompt tier. For Compass, budget roughly 4 GB of GPU headroom (about 1.87 GB of weights plus KV cache that grows with context length); on constrained GPUs, -lower the context window on the WebGPU card in Settings → Providers (16384 is +lower the context window on the WebGPU card on the Providers page (16384 is a safe fallback) and retry with a short prompt. Each repository is cached separately in Chrome. -After downloading a preset in Apocalypse Mode, the WebGPU card in -**Settings -> Providers** can be configured, tested, and selected as the normal +After downloading a preset in Apocalypse Mode, the WebGPU card on the +**Providers** page can be configured, tested, and selected as the normal chat provider. The nuclear standalone-chat control remains available as a per-run override that does not change the global selection. Once its files are cached, the selected model works without Apocalypse Mode enabled. @@ -609,7 +612,7 @@ proxy card require their configured client keys: #### ODS -Open **Settings → Providers → ODS (Local)**, set the server URL to the local +Open **Providers → LLM → ODS (Local)**, set the server URL to the local inference port in ODS's `.env`, click **Load Models**, select the running model, and click **Test Connection**. ODS exposes OpenAI-compatible `/v1/models` and `/v1/chat/completions`; WebBrain reads `/props` for the live context window and @@ -620,7 +623,7 @@ model in WebBrain unless your ODS installation exposes a stable alias. See the #### Osaurus -Start the Osaurus server on your Mac, then open **Settings → Providers → +Start the Osaurus server on your Mac, then open **Providers → LLM → Osaurus (Local)**. Keep `http://127.0.0.1:1337/v1` as the server URL, click **Load Models**, select a model, and click **Test Connection**. A model ID is required; discovery uses Osaurus's OpenAI-compatible `/v1/models` endpoint. @@ -643,7 +646,7 @@ then start Studio and load a chat model. In Studio, open the avatar menu, choose **Settings → API Access**, and create an API key. Keys currently use the `sk-unsloth-` prefix; keep the full value private. -In WebBrain, open **Settings → Providers → Unsloth Studio (Local)**. Enter the +In WebBrain, open **Providers → LLM → Unsloth Studio (Local)**. Enter the Studio API address as `http://127.0.0.1:8888/v1`, replacing `8888` when the running Studio instance shows a different port. Enter the generated API key, click **Load Models**, select the loaded model, then click **Test Connection**. @@ -695,7 +698,7 @@ Ollama, llama.cpp, ODS, LM Studio, and LocalAI default to `visionMode: auto`. We the selected server for model capability metadata before enrichment and sends screenshots only when the response explicitly reports image input. A failed or malformed metadata request is text-only for that turn and is retried later; -Settings can override Auto with Force on or Off. For providers whose Model +The Providers page can override Auto with Force on or Off. For providers whose Model field may be blank, WebBrain coalesces concurrent checks but rechecks once per user turn, so changing the model loaded by the server cannot reuse a stale answer. Other local providers retain @@ -757,7 +760,7 @@ Provider tier and conversation mode are separate knobs: Ask mode ignores provider tier and stays read-only. Act mode uses the selected tier's normal tools. Dev mode requires Mid or Full, uses the selected Act prompt, appends `SYSTEM_PROMPT_DEV_APPENDIX`, and adds Dev-only source/style tools plus Dev-extended shadow/frame inspection for Mid-tier debugging. Compact Dev is blocked before an LLM request is sent. -**Lean mode** (Settings → General → Lean mode; Auto by default) replaces the tier's Act tools and prompt with a 17-tool set and a short prompt, and skips WebBrain's quality checks. Under Auto it applies only to a strong model on a cloud or router provider whose tier is Full; Compact and Mid tiers and local providers keep their tier. See [lean-mode.md](lean-mode.md). +**Lean mode** (Settings → Advanced → Lean mode; Auto by default) replaces the tier's Act tools and prompt with a 17-tool set and a short prompt, and skips WebBrain's quality checks. Under Auto it applies only to a strong model on a cloud or router provider whose tier is Full; Compact and Mid tiers and local providers keep their tier. See [lean-mode.md](lean-mode.md). ### Vision Detection @@ -833,7 +836,7 @@ await pm.setActive("openai"); // Switch active provider await pm.updateProvider("openai", { model: "gpt-5" }); // Update config await pm.duplicateProvider("openai"); // Create openai__duplicate await pm.removeDuplicateProvider("openai__duplicate"); // Remove it -pm.getAll(); // All provider configs (for Settings UI) +pm.getAll(); // All provider configs (for the Providers page) await pm.testProvider("openai"); // Test connection ``` @@ -844,11 +847,11 @@ state and is separate from `activeProvider`, which is the provider currently configured. Connection tests report reachability but do not control the Active flag. -Settings can rename configurable providers using **Provider title** and Save. -The persisted `label` appears in Settings and the chat provider picker without +The Providers page can rename configurable providers using **Provider title** +and Save. The persisted `label` appears there and in the chat provider picker without changing the provider's ID, implementation, or model. -Settings can create any number of independent duplicates of each configurable +The Providers page can create any number of independent duplicates of each configurable endpoint provider, including from a saved duplicate. The first duplicate keeps the existing ID `__duplicate`; subsequent instances use `__duplicate_2`, `__duplicate_3`, and so on. Each stores a @@ -864,9 +867,9 @@ Chromium-only WebGPU runtime are not duplicable because they do not represent independent user-managed API credentials or endpoints; their cards keep the Duplicate affordance disabled with an explanatory tooltip. -### Settings Search +### Provider Search -The Settings search index includes provider IDs, labels, type/category, model, +The search on the Providers page's LLM tab indexes provider IDs, labels, type/category, model, base URL, field labels/placeholders, suggestions, and compatibility options. Matching cards are ordered by exact provider name/ID, then name/ID prefix, then name/ID substring, then field-only matches. Original provider order breaks @@ -881,7 +884,7 @@ Deprecated provider entries (`webbrain`, `openai_subscription`, ### Cost Allowances -Settings exposes session and total cloud cost allowances. The agent prefers a provider-reported `usage.cost`/`usage.cost_usd` value when present (OpenRouter reports this directly). For direct cloud providers that only return token counts, WebBrain estimates spend from the provider config fields: +Settings → Budgets exposes session and total cloud cost allowances. The agent prefers a provider-reported `usage.cost`/`usage.cost_usd` value when present (OpenRouter reports this directly). For direct cloud providers that only return token counts, WebBrain estimates spend from the provider config fields: - `inputCostPerMillionUsd` - `cacheReadCostPerMillionUsd` @@ -918,7 +921,7 @@ const vision = await providerManager.getVisionProvider(); // active-provider vision and the explicitly enabled, ready local fallback. ``` -On Chromium, **Settings -> Assistive Models -> Vision** also offers an +On Chromium, **Providers -> Vision** also offers an in-browser vision model, chosen from **Auto** (default), **Ternary Bonsai 2 2B Vision**, **WebBrain VL 2 450M** or **Off**. The choice is stored in the Chrome-only `webgpuVisionChoice` key (`storedWebgpuVisionChoice()` and @@ -949,10 +952,10 @@ Firefox, whose build has no MV3 offscreen document and no local option. Neither local model is in the general provider catalog as a vision sidecar or ever receives agent tools or planning turns. No choice, Apocalypse Mode or screenshot operation starts a download. Downloads run in Chrome's offscreen -extension worker, so the user may switch tabs or close Settings while they +extension worker, so the user may switch tabs or close the Providers page while they continue, but must keep Chrome running. Screenshots stay on-device and only the -generated description is passed to the active provider. Only Settings and -Apocalypse Mode may change the choice (`set_webgpu_vision_choice`). +generated description is passed to the active provider. Only the Providers +page and Apocalypse Mode may change the choice (`set_webgpu_vision_choice`). Screenshot routing is deterministic: an explicit dedicated vision endpoint, then a vision-capable active provider receiving raw pixels, then the in-browser diff --git a/docs/remote-downloads.md b/docs/remote-downloads.md index 69a3679577..3662b8c827 100644 --- a/docs/remote-downloads.md +++ b/docs/remote-downloads.md @@ -94,9 +94,9 @@ flowchart TD download caches that repository. - Local vision never downloads on its own. Ternary Bonsai 2 2B Vision (1.45 GB) is the chat preset's download, started by a click on its - Download button here, in Settings or in the Text Model picker; the separate + Download button here, on the Providers page or in the Text Model picker; the separate 810 MB WebBrain VL 2 450M is downloaded only after the user consents to it - in **Settings -> Assistive Models -> Vision**. + in **Providers -> Vision**. --- diff --git a/docs/rich-text-input.md b/docs/rich-text-input.md index 36cfe90430..a91d6d6d38 100644 --- a/docs/rich-text-input.md +++ b/docs/rich-text-input.md @@ -92,7 +92,7 @@ continues. Editor proofs are still dropped, so a commit or publication gate neve treats the write as verified; the agent keeps a non-blocking record for those gates (`_unverifiedTextWriteRecord`). `set_field({submit: true})` still withholds its Enter for an unverified value and says so (`submitSkipped: 'value_unverified'`). -Settings → General → Strict checks restores the failure result, the text-write +Settings → Advanced → Strict checks restores the failure result, the text-write debt and its readback-only recovery lock (see `test/guard-advisory-writes.mjs`). When context verification or repeated page changes prevent the next action, diff --git a/docs/security-model.md b/docs/security-model.md index 095641a31e..76f8d2a66b 100644 --- a/docs/security-model.md +++ b/docs/security-model.md @@ -67,8 +67,8 @@ This is a feature (it makes the agent useful with zero setup) but also the most ### Experimental Local D1 Decisions D1 is an optional finite-decision provider, not a chat generator or browser -executor. Explicit Settings consent controls download/load; the control handler -accepts only the extension's Settings sender. Chrome uses its shared offscreen +executor. Explicit consent on the Providers page controls download/load; the +control handler accepts only that extension page as the sender. Chrome uses its shared offscreen document and a separate Worker; Firefox attempts its background-page Worker only when hardware WebGPU and OPFS are available. Software adapters and inadequate buffer limits are rejected, but other capable devices are not declared validated. @@ -80,8 +80,8 @@ Page text/pixels stay untrusted and existing redaction/wrapping remains in place Disabling outsourcing or Strict Secret Mode discards the Worker and its GPU sessions; cached weights remain until explicitly removed. A caller that stops waiting cancels only its own request; the Worker's deadline discards a stalled -inference session. Neither invents an answer. While the user's Settings Load -stands, a reload after a restart reads only the verified cache and never +inference session. Neither invents an answer. While the user's Load on the +Providers page stands, a reload after a restart reads only the verified cache and never downloads. CPU/WASM control/shape fallback is disclosed, not represented as pure GPU. A positive experimental D1 judgment alone cannot establish completion: independent LLM or existing checks @@ -173,7 +173,7 @@ When disabled (the default — this is a personal-computer tool, not a third-par ### Profile Auto-Fill -Users can store a short profile (name, email, throwaway password) in Settings → Profile. This text is appended to the system prompt when enabled. Warnings in the UI: +Users can store a short profile (name, email, throwaway password) in Settings → Memory. This text is appended to the system prompt when enabled. Warnings in the UI: - Stored in plaintext in `chrome.storage.local` - Sent to the LLM provider on every turn as part of the system prompt @@ -211,7 +211,7 @@ The primary threat: a malicious page crafts content that, when read by the agent | **Plan before Act** | When enabled, action-mode runs first produce a structured plan and wait for side-panel approval before any browser tool executes. In Try mode, planner JSON that remains invalid after repair degrades that turn to Ask/read-only; Strict stops. Scheduled runs can auto-approve the plan only through scheduler policy. | | **Skill import boundary** | Skills can expose read-only HTTP tools and download-job tools through a `webbrain-tools` manifest. Importing or keeping the skill enabled is the trust decision for the declared HTTPS endpoint; declared skill tools use `credentials: "omit"` and should mark third-party results `resultPolicy: "untrusted"`. Download-job skill tools still require an action mode and the normal Downloads permission gate before saving files. | | **WebMCP boundary** | Experimental WebMCP is on by default, so its tools and prompt guidance enter ordinary model requests unless the user opts out under Settings → Bridge. Chrome page-registered names, descriptions, schemas, frame URLs, annotations, outputs, and errors are page-controlled and always use the untrusted-content wrapper. Calls use opaque IDs. Ask may list tools but cannot invoke them. Because a callback can run arbitrary page logic, every invocation requires Act/Dev, fresh per-call confirmation, and a permission grant for the actual registration-frame origin; a page-authored `readOnly` hint never bypasses those gates. Missing/opaque frame identity fails closed, and the frame plus effective HTTP(S) security origin are revalidated immediately before dispatch to prevent navigation races from borrowing an old grant. | -| **API mutation override** | A per-conversation `/allow-api` flag, or the default-on persistent setting under General → Advanced, *waives* the permission prompt for write-method network egress (`fetch_url`/`research_url` with POST/PUT/PATCH/DELETE). Neither option waives GET egress or any other capability. Conversation reset clears only the slash-command override. | +| **API mutation override** | A per-conversation `/allow-api` flag, or the default-on persistent setting under Settings → Advanced, *waives* the permission prompt for write-method network egress (`fetch_url`/`research_url` with POST/PUT/PATCH/DELETE). Neither option waives GET egress or any other capability. Conversation reset clears only the slash-command override. | | **Decision models** | Auto (default) uses the downloaded in-browser model for completion and scheduled checks, or Compass's managed route while Compass is the chat provider; Off uses none. In On, OpenRouter, direct TypeSafe and local/custom System One endpoints share independent per-feature switches. Keys are optional for local servers. Compass completion uses its managed decision route unless D1 or the in-browser chat model is chosen. Bounded/redacted task and fresh page evidence are untrusted data. Judges have no browser executor; ordinary tool calls still pass policy, permission and completion layers. Strict Secret Mode, cancellation, quota and cost limits apply. Unavailable or malformed judgments fall through to the active LLM and existing checks. | | **`done()` verification** | Decision and tool-free LLM checks prefer vision, then AX. Confident pending/failed outcomes require read-only recovery before another submission. Accepted task-bound proof can satisfy generic evidence despite an unrelated comment form, while explicit recipient, payment, download, authorization and workflow contracts remain required. Existing dialog/form checks are the final fallback. | | **Grouped search approval** | A same-site GET form with no credential, payment or hidden token field, and no side-effect action address, shares one task-scoped approval for its navigation, typing and submit when the page's structure marks it as a search: a search landmark, a search-typed field or one whose keyboard says search, code names such as `q` or `query`, a search address, or a submit control a model read, in any language, as only searching or filtering. Words in a field's visible label decide nothing. Every other form keeps its fresh confirmation. | @@ -235,7 +235,7 @@ The primary threat: a malicious page crafts content that, when read by the agent ## Unanswered Questions When the agent asks a `clarify` question and nobody answers before the clarify -timeout (Settings → General, default 60 s), the setting **When a question times +timeout (Settings → Budgets, default 60 s), the setting **When a question times out** decides the answer: - **Finish the task** (default) keeps the run moving. The option the model named @@ -279,7 +279,7 @@ loop budgets are not guards and keep their behavior. Settings → General → ## `/allow-api` Flag Set per-conversation via the `/allow-api` slash command in the side panel, or -persistently with **Always allow API mutations** under **Settings → General → +persistently with **Always allow API mutations** under **Settings → Advanced**. The persistent setting is on by default when absent. Read failures and non-boolean stored values grant no authorization. When either option is active, it waives the permission prompt for **write-method network egress only**: @@ -335,7 +335,7 @@ arbitrary conversation/page content. The trace recorder (`trace/recorder.js`) writes to IndexedDB on the user's machine for bounded automatic feedback diagnostics, when explicitly enabled -(Settings → Display → "Record traces"), or when a local/bring-your-own provider's +(Settings → Advanced → "Record traces"), or when a local/bring-your-own provider's separate **Share queries for research** switch is enabled for that run. The latter forces a local record so a bounded, content-free diagnostic timeline can be uploaded under that explicit consent. @@ -346,8 +346,9 @@ messages, tool schemas, tool arguments/results, and detailed error text. Default run records also omit full tab URLs/titles and attachment filenames, and default traces do not write screenshot blobs or data URLs to the `shots` store. -The separate lossless debug tier is off by default and requires explicit user -opt-in. A lossless run may retain bounded user/final text, request and response +The lossless debug tier is off by default and is an opt-in: Record traces +records it, and an update turns it on once for an install that recorded traces +without it. A lossless run may retain bounded user/final text, request and response payloads, tool schemas/calls/arguments/results, error details, screenshot bytes, tab URL/title, and attachment filename metadata. It is visibly marked, subject to per-payload, per-run, and aggregate storage bounds, and should be diff --git a/docs/slash-commands.md b/docs/slash-commands.md index f29c9e54f0..8b08ead31a 100644 --- a/docs/slash-commands.md +++ b/docs/slash-commands.md @@ -36,7 +36,7 @@ for its available flags. | `/teach --end` | Stop teaching and compile the captured actions into a value-free saved workflow | | `/allow-api` | **Per-conversation API mutation override.** See [below](#allow-api). | | `/foreground [prompt]` | Run one local task in the foreground for visual compatibility | -| `/dangerously-skip-permissions` | **Global permission-prompt bypass.** Turns off `Ask before consequential actions` without opening Settings. WebBrain will act without per-site prompts until you re-enable the setting (Settings → Permissions, or the warning button next to the microphone in the side panel composer). | +| `/dangerously-skip-permissions` | **Global permission-prompt bypass.** Turns off `Ask before consequential actions` without opening Settings. WebBrain will act without per-site prompts until you re-enable the setting (the Permissions page, or the warning button next to the microphone in the side panel composer). | | `/compact` | Force context compaction for the current conversation | | `/verbose` | Toggle verbose/compact tool display | | `/reset` | Clear the conversation and all per-conversation flags | @@ -94,7 +94,7 @@ agent may use POST/PUT/PATCH/DELETE via `fetch_url` or `research_url` when the U is failing. A badge appears while it is active, and it clears on `/reset`. To keep the same policy active across conversations and browser restarts, turn -on **Always allow API mutations** under **Settings → General → Advanced**. The +on **Always allow API mutations** under **Settings → Advanced**. The setting is on by default and remains active until you turn it off. `/reset` still clears the conversation-only `/allow-api` override, but does not change the persistent setting. diff --git a/docs/test-scenarios.md b/docs/test-scenarios.md index 1451574a2f..2e0d5dae77 100644 --- a/docs/test-scenarios.md +++ b/docs/test-scenarios.md @@ -75,7 +75,7 @@ A dozen end-to-end tasks for evaluating the WebBrain browser agent across a spre Ranked from easiest to most ambitious. ### 1. Tracing you already have (lowest-effort baseline) -Tracing is already built in. Turn it on in Settings → "Record traces", run each scenario by hand once per model you want to compare, then open the Traces page and diff side by side. This is what we've been doing in this session. Cheap to start, but scoring is manual. +Tracing is already built in. Turn it on in Settings → Advanced → "Record traces", run each scenario by hand once per model you want to compare, then open the Traces page and diff side by side. This is what we've been doing in this session. Cheap to start, but scoring is manual. ### 2. Scenario runner from the side panel Add a `tests.json` containing `{ url, prompt, check }` rows. Build a small Test Runner tab (mirror Traces) that loops through entries: for each one, open the URL, stuff the prompt into the side panel's input, wait for the agent to finish, then evaluate `check`. Three useful flavors of `check`: diff --git a/docs/webgpu-models.md b/docs/webgpu-models.md index 23bb0259bb..dcd50f1e71 100644 --- a/docs/webgpu-models.md +++ b/docs/webgpu-models.md @@ -253,7 +253,7 @@ Use the tools in `scripts/models/bonsai/`: - Apply the same pattern to any new model that serves long prompts on shared GPUs. - **Cache-only inference.** Chat never downloads. Only explicit download or - preload flows fetch model files: Settings → Providers → WebGPU, Apocalypse + preload flows fetch model files: Providers → WebGPU, Apocalypse Mode, and the first-install page (Chrome), which offers Ternary Bonsai 2 2B Vision behind its optional "Download a local model" button. The install page checks for hardware WebGPU before fetching anything, never changes the @@ -349,7 +349,8 @@ Results on the held-out test, RTX 5090, through the extension: (Hugging Face commit `b9895bc`, `decision-validation.json`). On the CPU its logits and caches are bit-identical to the previous graph (`scripts/models/bonsai/check_decision_hidden.py`). Installs that cached - the previous graph keep it until the model is downloaded again in Settings; + the previous graph keep it until the model is downloaded again on the + Providers page; until then the provider reports that it needs the updated decoder. ## Updating a published graph diff --git a/docs/zh-CN/agent-tools.md b/docs/zh-CN/agent-tools.md index 906ad3fc85..3b72214960 100644 --- a/docs/zh-CN/agent-tools.md +++ b/docs/zh-CN/agent-tools.md @@ -112,7 +112,7 @@ FreeSkillz.xyz 技能可暴露 `read_youtube_transcript` 以及 `resolve_public_ 即使所属技能已加载,Ask 模式仍会过滤变更类和下载类工具。参见[技能](skills.md)。 **WebMCP(实验性,默认启用)。** 上表中的 `list_webmcp_tools` / -`execute_webmcp_tool` 行仅在设置 → 常规 → 高级中启用**实验性 WebMCP** 时适用。 +`execute_webmcp_tool` 行仅在设置 → Bridge 中启用**实验性 WebMCP** 时适用。 该设置默认开启;关闭时,这些工具及其提示引导不会包含在模型请求中。诸如 `readOnly` 之类的 WebMCP 注解是页面自行声明的提示,而非安全边界。每次调用都需要 Act 或 Dev 模式、逐次的新确认,以及常规的「能力 × 注册帧来源」权限。WebMCP 目前 diff --git a/docs/zh-CN/localization.md b/docs/zh-CN/localization.md index b4aa169d36..a9c2273efa 100644 --- a/docs/zh-CN/localization.md +++ b/docs/zh-CN/localization.md @@ -37,7 +37,7 @@ src/chrome/src/ui/ └── zh.js # 中文 ``` -设置 → 语言会列出 `i18n.js` 中 `LANGUAGES` 的全部 **23** 种语言(英语和中文置顶; +侧边栏的语言菜单会列出 `i18n.js` 中 `LANGUAGES` 的全部 **23** 种语言(英语和中文置顶; 其余按英文名排序)。 ### 关键函数 @@ -126,8 +126,8 @@ export const LANGUAGES = [ ### 步骤 4:测试 -1. 打开扩展设置 -2. 在语言下拉菜单中选择新语言 +1. 打开侧边栏 +2. 在左上角的语言菜单中选择新语言 3. 验证侧面板、设置和追踪页面是否正确渲染 4. 检查缺失的键是否优雅地回退到英语 5. 如果添加阿拉伯语或希伯来语,测试 RTL 布局 @@ -147,7 +147,7 @@ export const LANGUAGES = [ | 前缀 | 区域 | |---|---| | `sp.` | 侧面板 UI | -| `st.` | 设置页面 | +| `st.` | 设置、提供商和权限页面 | | `tr.` | 追踪页面 | | `tool.` | 工具标签 | | `ob.` | 引导流程 | diff --git a/docs/zh-CN/privacy-and-data-flow.md b/docs/zh-CN/privacy-and-data-flow.md index d7a4519664..ec26f9cead 100644 --- a/docs/zh-CN/privacy-and-data-flow.md +++ b/docs/zh-CN/privacy-and-data-flow.md @@ -24,7 +24,7 @@ ### 哪个提供商接收数据? -用户在设置中选择他们的提供商。选项包括: +用户在提供商页面中选择他们的提供商。选项包括: - **WebBrain Compass**:请求会经过 `api.webbrain.one`;“帮助改进 WebBrain”默认启用,在其保持启用期间,部分交互可能会被保留并用于评估、改进、微调和训练 - **用户自带的云提供商**:OpenAI、Anthropic、Google Gemini、Mistral、DeepSeek、xAI、Groq、OpenRouter 等——请求使用用户凭据直接发送给提供商,WebBrain 不会收集这些请求 @@ -46,7 +46,7 @@ ### 追踪记录器 -启用时(设置 → 显示 → "记录追踪"),每次代理运行都会写入一个 IndexedDB 数据库(`webbrain_traces`): +启用时(设置 → 高级 → "记录轨迹"),每次代理运行都会写入一个 IndexedDB 数据库(`webbrain_traces`): - **`runs` 存储**:模型、提供商、令牌总数、时间戳、用户消息、最终内容 - **`events` 存储**:每一步的 LLM 请求/响应、工具调用及其参数和结果 diff --git a/docs/zh-CN/prompt-injection-defense.md b/docs/zh-CN/prompt-injection-defense.md index 7c0db17958..74d96ec66e 100644 --- a/docs/zh-CN/prompt-injection-defense.md +++ b/docs/zh-CN/prompt-injection-defense.md @@ -16,7 +16,7 @@ WebBrain 的智能体在**用户已认证的浏览器会话内**运行:它可 - 代码:`tools.js` 中的 `SYSTEM_PROMPT_ASK`、`SYSTEM_PROMPT_ACT`、`SYSTEM_PROMPT_ACT_MID`、`SYSTEM_PROMPT_ACT_COMPACT` 和 `SYSTEM_PROMPT_DEV_APPENDIX`,以及 `planner.js` 中的 `PLANNER_SYSTEM_PROMPT`(用于行动前规划的循环前调用)。 3. **能力 × 来源权限门(第 3 层)。** 在后果性工具运行之前,智能体检查 `(capability, host)` 授权,如果没有则提示用户(允许一次 / 始终允许 / 拒绝)。无文本检查,无 LLM — 人类是信任锚点。 - 代码:`permission-gate.js`(`capabilityFor`、`requiredHosts`、`PermissionManager`);`agent.js` 中的门循环 `_executeToolBatch`。 - - 用户控制:设置 → 权限(审查/撤销授权 + 主开关"在后果性操作前询问")。 + - 用户控制:权限页面(审查/撤销授权 + 主开关"在后果性操作前询问")。 4. **输出清理器(第 4 层)。** 模型输出经过 HTML 转义,只有 `[label](url)` 格式的 markdown 会变成允许列表中的(http/https/mailto)链接 — 不自动加载图像,不将裸 URL 转换为链接。 - 代码:`ui/markdown-link.js`。 @@ -67,7 +67,7 @@ messages.push({ role: 'user', content: `[…]\n${wrapped}` }); - `done` 工具结果推送(在正常包装前特殊处理)。 ### 不要为"可信站点"削弱边界 -主开关(设置 → 权限)**仅禁用第 3 层**(提示)。第 1、2、4 层始终保持开启 — 它们不消耗任何成本,并且正是保护用户在真正存在注入内容的可信站点上安全的部分(知名域名与安全内容*负相关*)。绝不要将第 1/2/4 层置于某个设置开关之后。 +主开关(权限页面)**仅禁用第 3 层**(提示)。第 1、2、4 层始终保持开启 — 它们不消耗任何成本,并且正是保护用户在真正存在注入内容的可信站点上安全的部分(知名域名与安全内容*负相关*)。绝不要将第 1/2/4 层置于某个设置开关之后。 --- @@ -77,7 +77,7 @@ messages.push({ role: 'user', content: `[…]\n${wrapped}` }); - **穷举守卫**:来自 `getToolsForMode('act')` 和 `getToolsForMode('dev')` 的每个模型暴露的行动工具必须被门控(`capabilityFor`)、不可信读取(`UNTRUSTED_CONTENT_TOOLS`)或在 `KNOWN_SAFE_TOOLS` 允许列表中(定义于 `test/run.js`)— 否则 CI 失败。 - 能力映射、主机解析、`requiredHosts`、`frameHostMatches`、授权存储 / `hydrateFrom`、内容包装的越狱剥离。 - `test/security/injection-corpus.mjs` 中的规划器提示对等性/边界检查。 -- `test/manual-permissions.md` — 浏览器内检查清单(3 选项权限卡片和设置 → 权限标签页),单元套件无法覆盖这些内容。 +- `test/manual-permissions.md` — 浏览器内检查清单(3 选项权限卡片和权限页面),单元套件无法覆盖这些内容。 **守卫检查工具是否被*列出*,而不是它们是否被*正确列出*。** 如果工具的结果携带页面派生字节,它属于 `UNTRUSTED_CONTENT_TOOLS`,即使它"只是一个状态工具"(参见 `done`)。如有疑问,请包装它 — 包装可信字段是无害的;留下未包装的页面派生字段则是一个漏洞。 diff --git a/docs/zh-CN/providers-and-models.md b/docs/zh-CN/providers-and-models.md index c7908aa3a0..7a50c16c24 100644 --- a/docs/zh-CN/providers-and-models.md +++ b/docs/zh-CN/providers-and-models.md @@ -71,7 +71,7 @@ class BaseLLMProvider { WebBrain 从 OpenCode 提供商目录提交 `62e4641235d7847dadc60da37cca8a023dd54fc1` 的快照中新增了 76 张默认禁用的 -提供商卡片。设置中在 **Chromium 上共有 106 个内置提供商**,在 **Firefox +提供商卡片。提供商页面在 **Chromium 上共有 106 个内置提供商**,在 **Firefox 上共有 105 个**;两者的差异是仅 Chromium 提供的本地 WebGPU 运行时。完整 ID 列表如下: @@ -111,7 +111,7 @@ WebBrain 会直接记录;若服务省略用量,则记录基于字符数的 ### 本地提供商 -在 Chromium 上,**WebGPU(浏览器内)** 是无端点的本地提供商。Settings 和末日模式选择器提供两个预设:**Compass Tiny v2.1**(默认,`q4f16`,约 1.87 GB,仅文本,32k 上下文)和 **Ternary Bonsai 2 2B Vision**(约 1.45 GB,支持图片,16k 上下文),走 Transformers.js / ONNX;Settings 还接受自定义 Hugging Face 仓库。其他 Bonsai 2 预设随扩展提供,但暂时不在选择器中显示。启用末日模式时会自动下载所选模型;缓存完成后,即使未启用末日模式也可正常使用。在显存受限的 GPU 上,可在 Settings → Providers 中调低上下文窗口。Firefox 不提供该卡片。 +在 Chromium 上,**WebGPU(浏览器内)** 是无端点的本地提供商。提供商页面和末日模式选择器提供两个预设:**Compass Tiny v2.1**(默认,`q4f16`,约 1.87 GB,仅文本,32k 上下文)和 **Ternary Bonsai 2 2B Vision**(约 1.45 GB,支持图片,16k 上下文),走 Transformers.js / ONNX;提供商页面还接受自定义 Hugging Face 仓库。其他 Bonsai 2 预设随扩展提供,但暂时不在选择器中显示。启用末日模式时会自动下载所选模型;缓存完成后,即使未启用末日模式也可正常使用。在显存受限的 GPU 上,可在提供商页面的 WebGPU 卡片中调低上下文窗口。Firefox 不提供该卡片。 浏览器内模型只回答问题。在侧边栏中,每个 Ask 回合只进行一次不带工具的调用:WebBrain 先读取当前页面、选中文本、PDF 标签页以及问题中链接的页面,再把这些文本和一个简短提示一起发送(tiny Ask,见 `docs/webgpu-models.md`)。该提供商不支持 Act 和 Dev 模式;如需在浏览器中执行操作,请选择其他提供商。 @@ -155,7 +155,7 @@ CLIProxyAPI 官方插件商店安装 `gemini-cli`,重启代理,再使用 `-- Ollama、llama.cpp、LM Studio 和 LocalAI 默认使用 `visionMode: auto`。WebBrain 在 页面上下文增强前读取所选模型的原生服务器元数据,只有服务器明确报告支持图像输入时才 -发送截图。元数据请求失败或格式错误时,本回合按纯文本处理,之后会重试。设置中 +发送截图。元数据请求失败或格式错误时,本回合按纯文本处理,之后会重试。提供商页面中 可选择自动、强制开启或关闭。模型字段为空时,每个用户回合都会重新检测当前加载 模型的能力,以便服务端热切换立即生效;其他本地提供商保持现有的显式开关行为。 @@ -268,13 +268,13 @@ await pm.save(); // 持久化到 chrome.storage.local pm.getActive(); // 获取当前激活的提供商实例 await pm.setActive('openai'); // 切换激活的提供商 await pm.updateProvider('openai', { model: 'gpt-5' }); // 更新配置 -pm.getAll(); // 所有提供商配置(用于设置界面) +pm.getAll(); // 所有提供商配置(用于提供商页面) await pm.testProvider('openai'); // 测试连接 ``` -### 设置搜索 +### 提供商搜索 -设置搜索索引包括提供商 ID、标签、类型/类别、模型、Base URL、字段标签与占位符、建议项和兼容性选项。匹配卡片依次按提供商名称/ID 完全匹配、前缀匹配、子串匹配和仅字段匹配排序;同级结果保持原始提供商顺序,当前选中的提供商在类别筛选时始终可见。 +提供商页面 LLM 标签页的搜索索引包括提供商 ID、标签、类型/类别、模型、Base URL、字段标签与占位符、建议项和兼容性选项。匹配卡片依次按提供商名称/ID 完全匹配、前缀匹配、子串匹配和仅字段匹配排序;同级结果保持原始提供商顺序,当前选中的提供商在类别筛选时始终可见。 ### 配置持久化 @@ -284,7 +284,7 @@ await pm.testProvider('openai'); // 测试连接 ### 费用限额 -设置界面暴露会话和总云端费用限额。智能体优先使用提供商报告的 `usage.cost`/`usage.cost_usd` 值(OpenRouter 直接报告此值)。对于仅返回令牌计数的直接云端提供商,WebBrain 根据提供商配置字段估算费用: +“设置 → 预算”提供会话和总云端费用限额。智能体优先使用提供商报告的 `usage.cost`/`usage.cost_usd` 值(OpenRouter 直接报告此值)。对于仅返回令牌计数的直接云端提供商,WebBrain 根据提供商配置字段估算费用: - `inputCostPerMillionUsd` - `cacheReadCostPerMillionUsd` diff --git a/docs/zh-CN/security-model.md b/docs/zh-CN/security-model.md index b665ab50a0..a1f2419c9e 100644 --- a/docs/zh-CN/security-model.md +++ b/docs/zh-CN/security-model.md @@ -73,7 +73,7 @@ ### 个人资料自动填充 -用户可以在设置 → 个人资料中存储简短的个人资料(姓名、电子邮件、一次性密码)。此文本在启用时附加到系统提示中。界面中的警告: +用户可以在设置 → 记忆中存储简短的个人资料(姓名、电子邮件、一次性密码)。此文本在启用时附加到系统提示中。界面中的警告: - 以明文存储在 `chrome.storage.local` 中 - 每次轮次都作为系统提示的一部分发送给 LLM 提供商 @@ -96,7 +96,7 @@ | **分层工具暴露** | 提供商层级(`compact | mid | full`)限制较小模型的普通浏览器智能体操作面。Compact 获得最小的操作面;Mid 添加常见任务工具;Full 添加高级 UI/DOM 回退。Compact Dev 被阻止。 | | **行动前规划** | 启用时,行动模式的运行首先生成结构化计划,并等待侧面板批准后才执行任何浏览器工具。定时运行仅通过调度器策略可自动批准计划。 | | **技能导入边界** | 技能可通过 `webbrain-tools` 清单暴露只读 HTTP 工具和下载任务工具。导入或保持技能启用是对声明的 HTTPS 端点的信任决策;声明的技能工具使用 `credentials: "omit"` 并应将第三方结果标记为 `resultPolicy: "untrusted"`。下载任务技能工具在保存文件前仍需行动模式和正常的下载权限门。 | -| **API 变更覆盖** | 每个对话的 `/allow-api` 标记,或“常规 → 高级”中默认关闭的持久设置,都会*免除*写方法网络出口(`fetch_url`/`research_url` 的 POST/PUT/PATCH/DELETE)的权限提示。两者都不免除 GET 出口或任何其他能力。对话重置仅清除斜杠命令覆盖。 | +| **API 变更覆盖** | 每个对话的 `/allow-api` 标记,或“设置 → 高级”中默认关闭的持久设置,都会*免除*写方法网络出口(`fetch_url`/`research_url` 的 POST/PUT/PATCH/DELETE)的权限提示。两者都不免除 GET 出口或任何其他能力。对话重置仅清除斜杠命令覆盖。 | | **`done()` 阻塞** | 在接受完成前,智能体探测是否有打开的对话框/表单。如果摘要声称"已创建"/"已保存"但模态框仍打开,则强制智能体继续。 | | **重复提交防护** | 在 45 秒窗口内,每个标签页+URL 阻止对类似提交文本(create/save/submit/add/post/publish/send/confirm/sign up/log in/pay/checkout/order 等)的点击(Chrome)。 | | **CLICK 遮挡测试** | 在点击前,解析器调用 `elementFromPoint()`。如果另一个元素视觉上位于上方,则拒绝点击。 | @@ -117,7 +117,7 @@ ## `/allow-api` 标记 -可通过侧面板中的 `/allow-api` 斜杠命令为每个对话设置,也可在**设置 → 常规 → 高级**中 +可通过侧面板中的 `/allow-api` 斜杠命令为每个对话设置,也可在**设置 → 高级**中 开启**始终允许 API 变更**使其持久生效。持久设置默认关闭。任一选项激活时,都仅免除 **写方法网络出口**的权限提示: @@ -137,7 +137,7 @@ ## 追踪数据隔离 -追踪记录器(`trace/recorder.js`)在用户显式启用时(设置 → 显示 →"记录追踪")写入用户机器上的 IndexedDB。数据从不离开浏览器: +追踪记录器(`trace/recorder.js`)在用户显式启用时(设置 → 高级 →"记录轨迹")写入用户机器上的 IndexedDB。数据从不离开浏览器: - `runs` 存储:模型、提供商、令牌总数、时间戳 - `events` 存储:LLM 请求/响应、工具调用、截图元数据 diff --git a/docs/zh-CN/slash-commands.md b/docs/zh-CN/slash-commands.md index 731ae0d5d8..2350de04dc 100644 --- a/docs/zh-CN/slash-commands.md +++ b/docs/zh-CN/slash-commands.md @@ -76,7 +76,7 @@ CDP 截图,并仅在该次运行期间模拟焦点;Firefox 使用 `tabs.capt `/allow-api` 会为当前对话解除 UI 优先限制,使智能体在 UI 失败时可通过 `fetch_url` 或 `research_url` 使用 POST/PUT/PATCH/DELETE。激活期间会显示徽章,并在 `/reset` 时清除。 -若要让相同策略在不同对话和浏览器重启后继续生效,请在**设置 → 常规 → 高级**中开启 +若要让相同策略在不同对话和浏览器重启后继续生效,请在**设置 → 高级**中开启 **始终允许 API 变更**。该设置默认关闭,并会一直生效到你手动关闭。`/reset` 仍会清除 当前对话的 `/allow-api` 覆盖,但不会更改此持久设置。 diff --git a/docs/zh-CN/test-scenarios.md b/docs/zh-CN/test-scenarios.md index 9614f5b4e3..a80f38c7a5 100644 --- a/docs/zh-CN/test-scenarios.md +++ b/docs/zh-CN/test-scenarios.md @@ -75,7 +75,7 @@ 按从最简单到最宏大的顺序排列。 ### 1. 你已经拥有的追踪(最低成本基线) -追踪已经内置。在设置中打开"录制追踪",为每个要比较的模型手动运行每个场景一次,然后打开追踪页面并排对比。这就是我们本轮一直在做的。启动成本低,但评分是手动的。 +追踪已经内置。在设置 → 高级中打开"记录轨迹",为每个要比较的模型手动运行每个场景一次,然后打开追踪页面并排对比。这就是我们本轮一直在做的。启动成本低,但评分是手动的。 ### 2. 从侧面板运行场景运行器 添加一个 `tests.json`,包含 `{ url, prompt, check }` 行。构建一个小型测试运行器标签页(镜像追踪),循环遍历条目:对于每个条目,打开 URL,将提示填入侧面板的输入框,等待代理完成,然后评估 `check`。三种有用的 `check` 类型: diff --git a/firefox-companion/README.md b/firefox-companion/README.md index bb3d35f4c8..a690925467 100644 --- a/firefox-companion/README.md +++ b/firefox-companion/README.md @@ -14,7 +14,7 @@ Requires Node.js 22 or newer with the built-in WebSocket API, and a current Fire Use a separate profile if desired. An already running Firefox process may ignore startup flags. Keep the debugging endpoint on loopback; it grants browser control to local clients. 3. Load this branch's `src/firefox/manifest.json` from `about:debugging` → This Firefox → Load Temporary Add-on (or install a build containing these changes). -4. In WebBrain Settings → General → Advanced, enable **Firefox trusted automation**, keep the port at 9222 (or match your startup port), and select **Test connection**. +4. In WebBrain Settings → Advanced, enable **Firefox trusted automation**, keep the port at 9222 (or match your startup port), and select **Test connection**. 5. Use `/screenshot --full-page` to capture a complete web page, or start a new Act or Dev task. Connection failures fail the task rather than silently falling back. Ask mode does not open an automation run. Tasks can start on blank/internal tabs; document binding is deferred until authorized navigation reaches a web page. The connection test checks the real BiDi session. It does not submit forms or send input. Disabling the setting or changing the port disconnects the helper; restart any active task afterward. diff --git a/package-lock.json b/package-lock.json index 58e361dfbf..08a07323cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "webbrain", - "version": "42.0.6", + "version": "42.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webbrain", - "version": "42.0.6", + "version": "42.1.0", "license": "GPL-3.0-or-later", "devDependencies": { "c8": "^12.0.0", diff --git a/package.json b/package.json index bb48bd8c35..399b375b1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webbrain", - "version": "42.0.6", + "version": "42.1.0", "description": "Open-source AI browser agent — chat with pages, automate tasks, multi-provider LLM support.", "private": true, "type": "module", @@ -19,6 +19,7 @@ "test:frontier:live": "node scripts/check-frontier-models.mjs", "test:provider-catalog": "node test/provider-catalog-integrations.mjs", "test:provider-instances:ui": "node test/provider-instances-ui.mjs", + "test:settings-pages:ui": "node test/settings-pages-ui.mjs", "test:openrouter-capabilities": "node --test test/frontier-model-compatibility.mjs test/openrouter-model-capabilities.mjs test/muse-tool-choice.mjs test/qwen-tool-calls.mjs test/dolphin-prompted-tools.mjs test/model-retry.mjs", "test:markdown": "node --test test/markdown-render.mjs", "test:accessibility-tree-benchmark": "node --test test/llm/lib/accessibility-tree-formats.test.mjs test/llm/report-html-encoding.mjs && node test/llm/accessibility-tree-benchmark.mjs --no-exact-tokenizer --check", @@ -64,7 +65,7 @@ "benchmark:relevance": "node scripts/benchmark-offline-relevance.mjs --verbose", "test:social-contract": "node --test test/social-publish-contract.mjs test/publication-quote-markup.mjs test/publication-prefetch.mjs", "test:social-contract:dom": "node test/social-publish-contract-dom.mjs", - "test:runtime-lifecycle": "node test/bot-memory-dom.mjs && node --test test/agent-lifecycle.mjs test/runtime-startup.mjs test/run-ui-scheduled-lifecycle.mjs test/transport-deadlines.mjs test/cdp-worker-restart.mjs test/bot-memory.mjs test/bot-memory-registries.mjs test/bot-memory-cloud-controller.mjs test/cdp-clear-receipt.mjs test/cdp-field-submit-recovery.mjs test/conversation-persistence.mjs test/history-recovery-state.mjs test/history-recovery-scheduler.mjs test/history-recovery-atomic.mjs test/context-live-tool-group.mjs test/integration-races.mjs test/watch-completion-checkpoint.mjs test/runtime-model-identity.mjs test/provider-message-privacy.mjs test/runtime-task-authority.mjs test/planner-repair-authority.mjs test/runtime-progress-continuation.mjs test/chat-resume-chain.mjs test/chat-resume-completion.mjs test/native-chat-execution-ledger.mjs test/chat-send-dispatch-result.mjs test/chat-reply-dedup-race.mjs test/memcode-lifecycle.mjs test/runtime-peer-review.mjs test/read-continuation-schema.mjs test/completion-submit-acknowledgement.mjs test/completion-live-status.mjs test/completion-iframe-submit.mjs test/form-validation-alert-readings.mjs test/control-effect-readings.mjs test/guard-reading-carry-over.mjs test/trusted-retry-readings.mjs test/completion-semantic-commit.mjs test/completion-diagnostics.mjs test/mastodon-publication.mjs test/calculator.mjs test/chat-recovery-protocol.mjs test/chat-pending-reconciliation.mjs test/semantic-page-retry.mjs test/pdf-detection.mjs test/runtime-lifecycle.mjs test/collection-read-progress.mjs test/network-lifecycle.mjs test/text-write-cancellation.mjs test/guard-advisory-writes.mjs test/trusted-field-preparation.mjs test/draftjs-text.mjs test/codemirror-text.mjs test/rich-text-frameworks.mjs test/cdp-managed-text-selection.mjs test/firefox-rich-text-readback.mjs test/contenteditable-beforeinput.mjs test/trusted-field-preparation-ownership.mjs test/typing-preparation-geometry.mjs test/chat-steering.mjs test/lifecycle-steering-restart.mjs test/resource-mutation-guards.mjs test/completion-steering-receipt-authority.mjs test/steering-revision-recovery.mjs test/pending-clarification-hydration.mjs test/clarify-timeout-policy.mjs test/guard-ask-cards.mjs test/permission-steering-wakeup.mjs test/pure-calculation-reply.mjs test/pure-calculation-tools.mjs test/page-feedback.mjs test/page-feedback-progress.mjs test/page-feedback-unbindable-target.mjs test/guard-advisory-actions.mjs test/rich-text-preflight-page-change.mjs test/keyboard-receiver-frame.mjs test/ask-response-scope.mjs test/ask-completion-churn.mjs test/page-feedback-policy.mjs test/research-escalation-page-feedback.mjs test/page-feedback-transport-races.mjs test/page-feedback-recovery.mjs test/telegram-read-preparation-agent.mjs test/media-download-agent-handler.mjs test/code-scanning-url-recipient.mjs test/apocalypse-comm-parsing.mjs test/apocalypse-scalar-decoding.mjs test/bitgpu-chat-security.mjs test/social-media-url-upgrades.mjs test/downloaded-file-saved-bytes.mjs test/downloaded-file-local-probe.mjs test/formless-verification-recovery.mjs test/file-upload-accept.mjs test/file-upload-accept-agent.mjs test/workflow-route-generic-completion.mjs test/release-publication-completion.mjs test/workflow-implicit-metadata.mjs test/workflow-field-readings.mjs test/workflow-field-anchors.mjs test/user-turn-kind.mjs test/follow-up-task-context.mjs test/completion-current-execution-evidence.mjs test/monitor-intervention-contract.mjs test/monitor-owned-geometry.mjs test/monitor-viewport-remainder.mjs test/monitor-scroll-churn.mjs test/monitor-local-attribution.mjs test/monitor-lifecycle-leaks.mjs test/feedback-automatic-churn.mjs test/feedback-navigation-idle.mjs test/feedback-run-boundaries.mjs test/feedback-ask-viewing.mjs test/lifecycle-terminal-done.mjs test/incomplete-completion-recovery.mjs test/guard-advisory-completion.mjs test/guard-policy.mjs test/lean-mode.mjs test/prompt-unverified-pages.mjs test/prompt-missing-values.mjs test/lifecycle-planner-digest.mjs test/lifecycle-vision-fallback.mjs test/guards-control-classification.mjs test/guards-unbound-deletion.mjs test/guards-steering-receipts.mjs && node test/ui-content-lifecycle.mjs && node --test test/native-telegram-chat.mjs test/native-telegram-recipient.mjs test/telegram-native-baseline.mjs test/telegram-native-latest.mjs test/native-chat-pre-enter-draft.mjs test/chat-draft-dispatch-ownership.mjs test/native-telegram-alias-preparation.mjs test/telegram-read-preparation-content.mjs test/queued-composer-ownership.mjs test/onboarding-provider-ready.mjs test/sidepanel-permission-gate-ui.mjs test/workflow-native-targets.mjs test/native-whatsapp-chat.mjs test/native-chat-context-identity.mjs test/native-whatsapp-contact.mjs test/whatsapp-native-bootstrap.mjs test/whatsapp-drawer-identity.mjs test/whatsapp-read-latest.mjs test/whatsapp-read-preparation.mjs test/whatsapp-chat-completion.mjs test/whatsapp-chat-restart.mjs test/chat-goal-lifecycle.mjs test/chat-completion.mjs test/chat-generic-dispatch.mjs test/completion-live-status-browser.mjs test/native-confirmation-visibility.mjs test/read-continuation-browser.mjs test/iframe-preparation-focus.mjs test/contenteditable-literal.mjs test/native-chat-empty-editor.mjs test/native-chat-trusted-clear.mjs test/chat-steering-ui.mjs test/recipient-confirmation-ui.mjs test/assistant-message-visibility-ui.mjs test/history-recovery.mjs test/history-recovery-ui.mjs test/page-monitor-ui.mjs test/x-compose-trusted-typing.mjs test/page-monitor-dialog.mjs test/page-monitor-dialog-native.mjs test/page-monitor-inline-post.mjs test/bluesky-composer-context.mjs test/page-monitor-anchored.mjs test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs test/page-monitor-native-controls.mjs test/page-monitor-native-preparation.mjs test/native-preparation-cold.mjs test/page-monitor-navigation.mjs test/page-monitor-main-owner.mjs test/page-monitor-collateral-controls.mjs test/accessibility-tree-scoped-budget.mjs test/ax-reference-origin.mjs test/page-monitor-decorative-hit.mjs test/social-ui-navigation.mjs test/native-resource-deletion-binding.mjs test/native-mastodon-confirmation.mjs test/dropdown-menu-inventory.mjs test/page-monitor-passive-progress.mjs test/page-monitor-feed-items.mjs test/media-download-binding.mjs test/media-download-capture-integration.mjs test/social-media-downloader-reinjection.mjs test/upload-file-local-state-guidance.mjs && node test/message-recipient-upload.mjs && node test/message-recipient-clarify-binding.mjs && node --test test/message-recipient-whatsapp.mjs test/message-control-readings.mjs && node test/quality/integration-mv3.mjs --full-form && node test/quality/literal-calculate-midrun-mv3.mjs && node test/quality/ask-completion-churn-mv3.mjs && node test/quality/ask-person-activity-mv3.mjs && node test/quality/telegram-cold-preparation-mv3.mjs && node test/quality/native-chat-mv3.mjs && node test/quality/native-chat-presubmit-mv3.mjs && node test/quality/cloud-bot-memory-mv3.mjs && node test/quality/whatsapp-contact-matrix.mjs && node test/quality/pdf-detection-mv3.mjs && node test/quality/download-upload-mv3.mjs && node test/quality/upload-release-binding-mv3.mjs && node test/quality/release-review-world-mv3.mjs && node test/quality/downloaded-file-saved-bytes-mv3.mjs && node test/quality/file-upload-accept-mv3.mjs && node test/quality/bulk-resume-mv3.mjs && node test/quality/literal-frame-mv3.mjs && node test/quality/mastodon-publication-mv3.mjs && node test/quality/mastodon-reply-route-mv3.mjs && node test/quality/mastodon-deletion-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs --menu-read && node test/quality/mastodon-delete-confirmation-mv3.mjs --vague && node test/quality/mastodon-delete-after-correction-mv3.mjs && node test/quality/unbound-deletion-mv3.mjs && node test/quality/recipient-clarify-mv3.mjs && node test/quality/open-chat-recipients-mv3.mjs && node test/quality/correction-cross-site-mv3.mjs && node test/quality/anchored-action-mv3.mjs && node test/quality/inline-social-composer-mv3.mjs && node test/quality/x-compose-dialog-mv3.mjs && node test/quality/bluesky-composer-mv3.mjs && node test/quality/dropdown-menu-matrix.mjs && node test/quality/mastodon-deletion-navigation-mv3.mjs && node test/quality/semantic-navigation-matrix.mjs && node test/quality/workflow-replay-mv3.mjs && node test/quality/generative-media-mv3.mjs && node test/quality/cdp-worker-restart-mv3.mjs && node test/quality/steering-worker-restart-mv3.mjs", + "test:runtime-lifecycle": "node test/bot-memory-dom.mjs && node --test test/agent-lifecycle.mjs test/runtime-startup.mjs test/run-ui-scheduled-lifecycle.mjs test/transport-deadlines.mjs test/cdp-worker-restart.mjs test/bot-memory.mjs test/bot-memory-registries.mjs test/bot-memory-cloud-controller.mjs test/cdp-clear-receipt.mjs test/cdp-field-submit-recovery.mjs test/conversation-persistence.mjs test/history-recovery-state.mjs test/history-recovery-scheduler.mjs test/history-recovery-atomic.mjs test/context-live-tool-group.mjs test/integration-races.mjs test/watch-completion-checkpoint.mjs test/runtime-model-identity.mjs test/provider-message-privacy.mjs test/runtime-task-authority.mjs test/planner-repair-authority.mjs test/runtime-progress-continuation.mjs test/chat-resume-chain.mjs test/chat-resume-completion.mjs test/native-chat-execution-ledger.mjs test/chat-send-dispatch-result.mjs test/chat-reply-dedup-race.mjs test/memcode-lifecycle.mjs test/runtime-peer-review.mjs test/read-continuation-schema.mjs test/completion-submit-acknowledgement.mjs test/completion-live-status.mjs test/completion-iframe-submit.mjs test/form-validation-alert-readings.mjs test/control-effect-readings.mjs test/guard-reading-carry-over.mjs test/trusted-retry-readings.mjs test/completion-semantic-commit.mjs test/completion-diagnostics.mjs test/mastodon-publication.mjs test/calculator.mjs test/chat-recovery-protocol.mjs test/chat-pending-reconciliation.mjs test/semantic-page-retry.mjs test/pdf-detection.mjs test/runtime-lifecycle.mjs test/collection-read-progress.mjs test/network-lifecycle.mjs test/text-write-cancellation.mjs test/guard-advisory-writes.mjs test/trusted-field-preparation.mjs test/draftjs-text.mjs test/codemirror-text.mjs test/rich-text-frameworks.mjs test/cdp-managed-text-selection.mjs test/firefox-rich-text-readback.mjs test/contenteditable-beforeinput.mjs test/trusted-field-preparation-ownership.mjs test/typing-preparation-geometry.mjs test/chat-steering.mjs test/lifecycle-steering-restart.mjs test/resource-mutation-guards.mjs test/completion-steering-receipt-authority.mjs test/steering-revision-recovery.mjs test/pending-clarification-hydration.mjs test/clarify-timeout-policy.mjs test/guard-ask-cards.mjs test/permission-steering-wakeup.mjs test/pure-calculation-reply.mjs test/pure-calculation-tools.mjs test/page-feedback.mjs test/page-feedback-progress.mjs test/page-feedback-unbindable-target.mjs test/guard-advisory-actions.mjs test/rich-text-preflight-page-change.mjs test/keyboard-receiver-frame.mjs test/ask-response-scope.mjs test/ask-completion-churn.mjs test/page-feedback-policy.mjs test/research-escalation-page-feedback.mjs test/page-feedback-transport-races.mjs test/page-feedback-recovery.mjs test/telegram-read-preparation-agent.mjs test/media-download-agent-handler.mjs test/code-scanning-url-recipient.mjs test/apocalypse-comm-parsing.mjs test/apocalypse-scalar-decoding.mjs test/bitgpu-chat-security.mjs test/social-media-url-upgrades.mjs test/downloaded-file-saved-bytes.mjs test/downloaded-file-local-probe.mjs test/formless-verification-recovery.mjs test/file-upload-accept.mjs test/file-upload-accept-agent.mjs test/workflow-route-generic-completion.mjs test/release-publication-completion.mjs test/workflow-implicit-metadata.mjs test/workflow-field-readings.mjs test/workflow-field-anchors.mjs test/user-turn-kind.mjs test/follow-up-task-context.mjs test/completion-current-execution-evidence.mjs test/monitor-intervention-contract.mjs test/monitor-owned-geometry.mjs test/monitor-viewport-remainder.mjs test/monitor-scroll-churn.mjs test/monitor-local-attribution.mjs test/monitor-lifecycle-leaks.mjs test/feedback-automatic-churn.mjs test/feedback-navigation-idle.mjs test/feedback-run-boundaries.mjs test/feedback-ask-viewing.mjs test/lifecycle-terminal-done.mjs test/incomplete-completion-recovery.mjs test/guard-advisory-completion.mjs test/guard-policy.mjs test/lean-mode.mjs test/prompt-unverified-pages.mjs test/prompt-missing-values.mjs test/lifecycle-planner-digest.mjs test/lifecycle-vision-fallback.mjs test/guards-control-classification.mjs test/guards-unbound-deletion.mjs test/guards-steering-receipts.mjs && node test/ui-content-lifecycle.mjs && node --test test/native-telegram-chat.mjs test/native-telegram-recipient.mjs test/telegram-native-baseline.mjs test/telegram-native-latest.mjs test/native-chat-pre-enter-draft.mjs test/chat-draft-dispatch-ownership.mjs test/native-telegram-alias-preparation.mjs test/telegram-read-preparation-content.mjs test/queued-composer-ownership.mjs test/onboarding-provider-ready.mjs test/sidepanel-permission-gate-ui.mjs test/workflow-native-targets.mjs test/native-whatsapp-chat.mjs test/native-chat-context-identity.mjs test/native-whatsapp-contact.mjs test/whatsapp-chat-selection.mjs test/whatsapp-native-bootstrap.mjs test/whatsapp-drawer-identity.mjs test/whatsapp-read-latest.mjs test/whatsapp-read-preparation.mjs test/whatsapp-chat-completion.mjs test/whatsapp-chat-restart.mjs test/chat-goal-lifecycle.mjs test/chat-completion.mjs test/chat-generic-dispatch.mjs test/completion-live-status-browser.mjs test/native-confirmation-visibility.mjs test/read-continuation-browser.mjs test/iframe-preparation-focus.mjs test/contenteditable-literal.mjs test/native-chat-empty-editor.mjs test/native-chat-trusted-clear.mjs test/chat-steering-ui.mjs test/recipient-confirmation-ui.mjs test/assistant-message-visibility-ui.mjs test/history-recovery.mjs test/history-recovery-ui.mjs test/page-monitor-ui.mjs test/x-compose-trusted-typing.mjs test/page-monitor-dialog.mjs test/page-monitor-dialog-native.mjs test/page-monitor-inline-post.mjs test/bluesky-composer-context.mjs test/page-monitor-anchored.mjs test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs test/page-monitor-native-controls.mjs test/page-monitor-native-preparation.mjs test/native-preparation-cold.mjs test/page-monitor-navigation.mjs test/page-monitor-main-owner.mjs test/page-monitor-collateral-controls.mjs test/accessibility-tree-scoped-budget.mjs test/ax-reference-origin.mjs test/page-monitor-decorative-hit.mjs test/social-ui-navigation.mjs test/native-resource-deletion-binding.mjs test/native-mastodon-confirmation.mjs test/dropdown-menu-inventory.mjs test/page-monitor-passive-progress.mjs test/page-monitor-feed-items.mjs test/media-download-binding.mjs test/media-download-capture-integration.mjs test/social-media-downloader-reinjection.mjs test/upload-file-local-state-guidance.mjs && node test/message-recipient-upload.mjs && node test/message-recipient-clarify-binding.mjs && node --test test/message-recipient-whatsapp.mjs test/message-control-readings.mjs && node test/quality/integration-mv3.mjs --full-form && node test/quality/literal-calculate-midrun-mv3.mjs && node test/quality/ask-completion-churn-mv3.mjs && node test/quality/ask-person-activity-mv3.mjs && node test/quality/telegram-cold-preparation-mv3.mjs && node test/quality/native-chat-mv3.mjs && node test/quality/native-chat-presubmit-mv3.mjs && node test/quality/cloud-bot-memory-mv3.mjs && node test/quality/whatsapp-contact-matrix.mjs && node test/quality/pdf-detection-mv3.mjs && node test/quality/download-upload-mv3.mjs && node test/quality/upload-release-binding-mv3.mjs && node test/quality/release-review-world-mv3.mjs && node test/quality/downloaded-file-saved-bytes-mv3.mjs && node test/quality/file-upload-accept-mv3.mjs && node test/quality/bulk-resume-mv3.mjs && node test/quality/literal-frame-mv3.mjs && node test/quality/mastodon-publication-mv3.mjs && node test/quality/mastodon-reply-route-mv3.mjs && node test/quality/mastodon-deletion-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs --menu-read && node test/quality/mastodon-delete-confirmation-mv3.mjs --vague && node test/quality/mastodon-delete-after-correction-mv3.mjs && node test/quality/unbound-deletion-mv3.mjs && node test/quality/recipient-clarify-mv3.mjs && node test/quality/open-chat-recipients-mv3.mjs && node test/quality/correction-cross-site-mv3.mjs && node test/quality/anchored-action-mv3.mjs && node test/quality/inline-social-composer-mv3.mjs && node test/quality/x-compose-dialog-mv3.mjs && node test/quality/bluesky-composer-mv3.mjs && node test/quality/dropdown-menu-matrix.mjs && node test/quality/mastodon-deletion-navigation-mv3.mjs && node test/quality/semantic-navigation-matrix.mjs && node test/quality/workflow-replay-mv3.mjs && node test/quality/generative-media-mv3.mjs && node test/quality/cdp-worker-restart-mv3.mjs && node test/quality/steering-worker-restart-mv3.mjs", "test:page-feedback": "node --test test/trusted-field-preparation.mjs test/guard-advisory-writes.mjs test/draftjs-text.mjs test/codemirror-text.mjs test/rich-text-frameworks.mjs test/cdp-managed-text-selection.mjs test/firefox-rich-text-readback.mjs test/contenteditable-beforeinput.mjs test/trusted-field-preparation-ownership.mjs test/typing-preparation-geometry.mjs test/pure-calculation-reply.mjs test/pure-calculation-tools.mjs test/page-feedback.mjs test/page-feedback-progress.mjs test/page-feedback-unbindable-target.mjs test/guard-advisory-actions.mjs test/rich-text-preflight-page-change.mjs test/keyboard-receiver-frame.mjs test/ask-response-scope.mjs test/ask-completion-churn.mjs test/page-feedback-policy.mjs test/research-escalation-page-feedback.mjs test/page-feedback-transport-races.mjs test/page-feedback-recovery.mjs test/telegram-read-preparation-agent.mjs test/media-download-agent-handler.mjs test/page-monitor-ui.mjs test/x-compose-trusted-typing.mjs test/page-monitor-dialog.mjs test/page-monitor-dialog-native.mjs test/page-monitor-inline-post.mjs test/bluesky-composer-context.mjs test/page-monitor-anchored.mjs test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs test/page-monitor-native-controls.mjs test/page-monitor-passive-progress.mjs test/page-monitor-feed-items.mjs test/media-download-binding.mjs test/media-download-capture-integration.mjs test/monitor-intervention-contract.mjs test/monitor-owned-geometry.mjs test/monitor-viewport-remainder.mjs test/monitor-scroll-churn.mjs test/monitor-local-attribution.mjs test/monitor-lifecycle-leaks.mjs test/feedback-automatic-churn.mjs test/feedback-navigation-idle.mjs test/feedback-run-boundaries.mjs test/feedback-ask-viewing.mjs test/delivery-click-ax-response-loss.mjs test/delivery-stop-compound.mjs test/delivery-cdp-input.mjs test/delivery-click-locks.mjs test/delivery-native-button-geometry.mjs test/delivery-hover-transition.mjs test/delivery-native-button-route.mjs test/delivery-dispatch-boundary.mjs && node test/message-recipient-upload.mjs && node test/message-recipient-clarify-binding.mjs && node --test test/message-recipient-whatsapp.mjs test/page-feedback-held-time.mjs test/page-monitor-held-observation.mjs", "test:history-recovery": "node --test test/history-recovery.mjs test/history-recovery-ui.mjs test/history-recovery-state.mjs test/history-recovery-scheduler.mjs test/history-recovery-atomic.mjs test/conversation-persistence.mjs", "test:chat-steering": "node --test test/chat-steering.mjs test/chat-steering-ui.mjs test/recipient-confirmation-ui.mjs test/lifecycle-steering-latency.mjs test/lifecycle-steering-restart.mjs test/lifecycle-run-ui.mjs test/lifecycle-menu-prompts-held.mjs", @@ -97,9 +98,9 @@ "test:quality:whatsapp": "node test/quality/whatsapp-contact-matrix.mjs", "test:chat-draft-recovery": "node --test test/native-chat-pre-enter-draft.mjs test/chat-draft-dispatch-ownership.mjs && node test/quality/native-chat-presubmit-mv3.mjs", "test:upload-owner": "node --test test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs", - "test:shard:quick": "npm run test:cms && npm run test:markdown && npm run test:generative-media && npm run test:systemone && npm run test:systemone:fast && node --test test/guard-policy.mjs test/browser-dialogs.mjs test/capsolver-cloud-broker.mjs test/captcha-providers.mjs test/captcha-weighted-fallback.mjs test/captcha-hcaptcha-providers.mjs test/captcha-native-providers.mjs test/captcha-runtime-policy.mjs test/captcha-callback-bridge.mjs test/captcha-bridge-registration.mjs test/captcha-aws-recovery.mjs test/captcha-documented-contracts.mjs test/huggingface-signup-recovery.mjs test/trace-full-export.mjs test/feedback-traces.mjs && npm run test:firefox-bidi && npm run test:billing-notice && npm run test:compass-quota && npm run test:provider-limits && npm run test:provider-catalog && npm run test:provider-instances:ui && npm run test:openrouter-capabilities && npm run test:anthropic && npm run test:browser-batch && npm run test:accessibility-tree-benchmark && npm run test:toolbar-guard && npm run test:cloud-bridge-approval && npm run test:discord && npm run test:pdf-read && npm run test:pdf-selection && npm run test:social-contract && npm run test:safesocial && npm run test:build-unpacked && npm run test:attachment-drop && npm run test:workflow-editor && node --test test/profile-sync-stats.mjs && node --test test/memcode-recall.mjs", + "test:shard:quick": "npm run test:cms && npm run test:markdown && npm run test:generative-media && npm run test:systemone && npm run test:systemone:fast && node --test test/guard-policy.mjs test/browser-dialogs.mjs test/capsolver-cloud-broker.mjs test/captcha-providers.mjs test/captcha-weighted-fallback.mjs test/captcha-hcaptcha-providers.mjs test/captcha-native-providers.mjs test/captcha-runtime-policy.mjs test/captcha-callback-bridge.mjs test/captcha-bridge-registration.mjs test/captcha-aws-recovery.mjs test/captcha-documented-contracts.mjs test/huggingface-signup-recovery.mjs test/trace-full-export.mjs test/feedback-traces.mjs && npm run test:firefox-bidi && npm run test:billing-notice && npm run test:compass-quota && npm run test:provider-limits && npm run test:provider-catalog && npm run test:provider-instances:ui && npm run test:settings-pages:ui && npm run test:openrouter-capabilities && npm run test:anthropic && npm run test:browser-batch && npm run test:accessibility-tree-benchmark && npm run test:toolbar-guard && npm run test:cloud-bridge-approval && npm run test:discord && npm run test:pdf-read && npm run test:pdf-selection && npm run test:social-contract && npm run test:safesocial && npm run test:build-unpacked && npm run test:attachment-drop && npm run test:workflow-editor && node --test test/profile-sync-stats.mjs && node --test test/memcode-recall.mjs", "test:shard:runtime-unit": "node --test test/skill-download-wait.mjs && node --test test/agent-lifecycle.mjs test/runtime-startup.mjs test/run-ui-scheduled-lifecycle.mjs test/transport-deadlines.mjs test/cdp-worker-restart.mjs test/bot-memory.mjs test/bot-memory-click-guard.mjs test/bot-memory-registries.mjs test/bot-memory-cloud-controller.mjs test/cdp-clear-receipt.mjs test/cdp-field-submit-recovery.mjs test/conversation-persistence.mjs test/context-live-tool-group.mjs test/integration-races.mjs test/watch-completion-checkpoint.mjs test/runtime-model-identity.mjs test/provider-message-privacy.mjs test/runtime-task-authority.mjs test/planner-repair-authority.mjs test/runtime-progress-continuation.mjs test/chat-resume-chain.mjs test/chat-resume-completion.mjs test/native-chat-execution-ledger.mjs test/chat-send-dispatch-result.mjs test/chat-reply-dedup-race.mjs test/memcode-lifecycle.mjs test/runtime-peer-review.mjs test/read-continuation-schema.mjs test/completion-submit-acknowledgement.mjs test/completion-live-status.mjs test/completion-iframe-submit.mjs test/form-validation-alert-readings.mjs test/control-effect-readings.mjs test/guard-reading-carry-over.mjs test/trusted-retry-readings.mjs test/completion-semantic-commit.mjs test/completion-diagnostics.mjs test/mastodon-publication.mjs test/calculator.mjs test/chat-recovery-protocol.mjs test/chat-pending-reconciliation.mjs test/semantic-page-retry.mjs test/pdf-detection.mjs test/runtime-lifecycle.mjs test/collection-read-progress.mjs test/network-lifecycle.mjs test/text-write-cancellation.mjs test/guard-advisory-writes.mjs test/trusted-field-preparation.mjs test/draftjs-text.mjs test/codemirror-text.mjs test/rich-text-frameworks.mjs test/cdp-managed-text-selection.mjs test/firefox-rich-text-readback.mjs test/contenteditable-beforeinput.mjs test/trusted-field-preparation-ownership.mjs test/typing-preparation-geometry.mjs test/chat-steering.mjs test/resource-mutation-guards.mjs test/completion-steering-receipt-authority.mjs test/steering-revision-recovery.mjs test/pending-clarification-hydration.mjs test/clarify-timeout-policy.mjs test/guard-ask-cards.mjs test/permission-steering-wakeup.mjs test/pure-calculation-reply.mjs test/pure-calculation-tools.mjs test/page-feedback.mjs test/page-feedback-progress.mjs test/page-feedback-unbindable-target.mjs test/guard-advisory-actions.mjs test/rich-text-preflight-page-change.mjs test/keyboard-receiver-frame.mjs test/ask-response-scope.mjs test/auto-mode.mjs test/model-picker-icon.mjs test/ask-completion-churn.mjs test/page-feedback-policy.mjs test/research-escalation-page-feedback.mjs test/page-feedback-transport-races.mjs test/page-feedback-recovery.mjs test/telegram-read-preparation-agent.mjs test/media-download-agent-handler.mjs test/code-scanning-url-recipient.mjs test/apocalypse-comm-parsing.mjs test/apocalypse-scalar-decoding.mjs test/bitgpu-chat-security.mjs test/social-media-url-upgrades.mjs test/downloaded-file-saved-bytes.mjs test/downloaded-file-local-probe.mjs test/formless-verification-recovery.mjs test/file-upload-accept.mjs test/file-upload-accept-agent.mjs test/workflow-route-generic-completion.mjs test/release-publication-completion.mjs test/workflow-implicit-metadata.mjs test/workflow-field-readings.mjs test/workflow-field-anchors.mjs test/user-turn-kind.mjs test/follow-up-task-context.mjs test/completion-current-execution-evidence.mjs test/video-upload-attachment.mjs test/feedback-automatic-churn.mjs test/feedback-navigation-idle.mjs test/feedback-run-boundaries.mjs test/feedback-ask-viewing.mjs test/lifecycle-terminal-done.mjs test/incomplete-completion-recovery.mjs test/guard-advisory-completion.mjs test/lean-mode.mjs test/prompt-unverified-pages.mjs test/prompt-missing-values.mjs test/lifecycle-planner-digest.mjs test/lifecycle-steering-latency.mjs test/lifecycle-steering-restart.mjs test/lifecycle-vision-fallback.mjs test/delivery-click-locks.mjs test/guards-steering-receipts.mjs test/terminal-user-messages.mjs test/improver-providers.mjs test/improver-providers-agent.mjs test/improver-guards-ledger.mjs test/improver-guards-tools.mjs test/improver-clarify.mjs test/improver-clarify-scheduler.mjs test/improver-misc.mjs test/improver-forms.mjs test/improver-forms-strict-secrets.mjs test/improver-content-press-keys-hint.mjs && npm run test:plan-notifications", - "test:shard:browser-a": "node --test test/captcha-draft-content.mjs test/captcha-challenge-surfaces.mjs && node test/bot-memory-dom.mjs && node test/bot-memory-click-dom.mjs && node test/ui-content-lifecycle.mjs && node --test test/native-telegram-chat.mjs test/native-telegram-recipient.mjs test/telegram-native-baseline.mjs test/telegram-native-latest.mjs test/native-chat-pre-enter-draft.mjs test/chat-draft-dispatch-ownership.mjs test/native-telegram-alias-preparation.mjs test/telegram-read-preparation-content.mjs test/queued-composer-ownership.mjs test/onboarding-provider-ready.mjs test/sidepanel-permission-gate-ui.mjs test/workflow-native-targets.mjs test/native-whatsapp-chat.mjs test/native-chat-context-identity.mjs test/native-whatsapp-contact.mjs test/whatsapp-native-bootstrap.mjs test/whatsapp-drawer-identity.mjs test/whatsapp-read-latest.mjs test/whatsapp-read-preparation.mjs test/whatsapp-chat-completion.mjs test/whatsapp-chat-restart.mjs test/chat-goal-lifecycle.mjs test/chat-completion.mjs test/chat-generic-dispatch.mjs test/completion-live-status-browser.mjs test/native-confirmation-visibility.mjs test/native-button-preparation.mjs test/read-continuation-browser.mjs test/iframe-preparation-focus.mjs test/contenteditable-literal.mjs test/native-chat-empty-editor.mjs test/native-chat-trusted-clear.mjs test/chat-steering-ui.mjs test/recipient-confirmation-ui.mjs test/assistant-message-visibility-ui.mjs test/page-monitor-ui.mjs test/x-compose-trusted-typing.mjs test/page-monitor-dialog.mjs test/page-monitor-dialog-native.mjs test/page-monitor-inline-post.mjs test/bluesky-composer-context.mjs test/page-monitor-anchored.mjs test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs test/page-monitor-native-controls.mjs test/page-monitor-native-preparation.mjs test/native-preparation-cold.mjs test/page-monitor-navigation.mjs test/page-monitor-main-owner.mjs test/page-monitor-collateral-controls.mjs test/accessibility-tree-scoped-budget.mjs test/ax-reference-origin.mjs test/page-monitor-decorative-hit.mjs test/social-ui-navigation.mjs test/native-resource-deletion-binding.mjs test/native-mastodon-confirmation.mjs test/dropdown-menu-inventory.mjs test/page-monitor-passive-progress.mjs test/page-monitor-feed-items.mjs test/media-download-binding.mjs test/media-download-capture-integration.mjs test/social-media-downloader-reinjection.mjs test/upload-file-local-state-guidance.mjs test/monitor-intervention-contract.mjs test/monitor-owned-geometry.mjs test/monitor-viewport-remainder.mjs test/monitor-scroll-churn.mjs test/monitor-local-attribution.mjs test/monitor-lifecycle-leaks.mjs test/lifecycle-run-ui.mjs test/lifecycle-menu-prompts-held.mjs test/delivery-cdp-input.mjs test/delivery-click-ax-response-loss.mjs test/delivery-native-button-geometry.mjs test/delivery-hover-transition.mjs test/delivery-native-button-route.mjs test/delivery-dispatch-boundary.mjs test/delivery-stop-compound.mjs test/guards-control-classification.mjs test/guards-unbound-deletion.mjs test/submit-probe-readings.mjs test/improver-content-account-chrome.mjs test/improver-content-recipient.mjs test/improver-content-truncated-replacement.mjs test/improver-forms-probe.mjs test/improver-misc-trace-browser.mjs test/page-feedback-held-time.mjs test/page-monitor-held-observation.mjs", + "test:shard:browser-a": "node --test test/captcha-draft-content.mjs test/captcha-challenge-surfaces.mjs && node test/bot-memory-dom.mjs && node test/bot-memory-click-dom.mjs && node test/ui-content-lifecycle.mjs && node --test test/native-telegram-chat.mjs test/native-telegram-recipient.mjs test/telegram-native-baseline.mjs test/telegram-native-latest.mjs test/native-chat-pre-enter-draft.mjs test/chat-draft-dispatch-ownership.mjs test/native-telegram-alias-preparation.mjs test/telegram-read-preparation-content.mjs test/queued-composer-ownership.mjs test/onboarding-provider-ready.mjs test/sidepanel-permission-gate-ui.mjs test/workflow-native-targets.mjs test/native-whatsapp-chat.mjs test/native-chat-context-identity.mjs test/native-whatsapp-contact.mjs test/whatsapp-chat-selection.mjs test/whatsapp-native-bootstrap.mjs test/whatsapp-drawer-identity.mjs test/whatsapp-read-latest.mjs test/whatsapp-read-preparation.mjs test/whatsapp-chat-completion.mjs test/whatsapp-chat-restart.mjs test/chat-goal-lifecycle.mjs test/chat-completion.mjs test/chat-generic-dispatch.mjs test/completion-live-status-browser.mjs test/native-confirmation-visibility.mjs test/native-button-preparation.mjs test/read-continuation-browser.mjs test/iframe-preparation-focus.mjs test/contenteditable-literal.mjs test/native-chat-empty-editor.mjs test/native-chat-trusted-clear.mjs test/chat-steering-ui.mjs test/recipient-confirmation-ui.mjs test/assistant-message-visibility-ui.mjs test/page-monitor-ui.mjs test/x-compose-trusted-typing.mjs test/page-monitor-dialog.mjs test/page-monitor-dialog-native.mjs test/page-monitor-inline-post.mjs test/bluesky-composer-context.mjs test/page-monitor-anchored.mjs test/page-monitor-upload-owner.mjs test/page-monitor-upload-release.mjs test/page-monitor-native-controls.mjs test/page-monitor-native-preparation.mjs test/native-preparation-cold.mjs test/page-monitor-navigation.mjs test/page-monitor-main-owner.mjs test/page-monitor-collateral-controls.mjs test/accessibility-tree-scoped-budget.mjs test/ax-reference-origin.mjs test/page-monitor-decorative-hit.mjs test/social-ui-navigation.mjs test/native-resource-deletion-binding.mjs test/native-mastodon-confirmation.mjs test/dropdown-menu-inventory.mjs test/page-monitor-passive-progress.mjs test/page-monitor-feed-items.mjs test/media-download-binding.mjs test/media-download-capture-integration.mjs test/social-media-downloader-reinjection.mjs test/upload-file-local-state-guidance.mjs test/monitor-intervention-contract.mjs test/monitor-owned-geometry.mjs test/monitor-viewport-remainder.mjs test/monitor-scroll-churn.mjs test/monitor-local-attribution.mjs test/monitor-lifecycle-leaks.mjs test/lifecycle-run-ui.mjs test/lifecycle-menu-prompts-held.mjs test/delivery-cdp-input.mjs test/delivery-click-ax-response-loss.mjs test/delivery-native-button-geometry.mjs test/delivery-hover-transition.mjs test/delivery-native-button-route.mjs test/delivery-dispatch-boundary.mjs test/delivery-stop-compound.mjs test/guards-control-classification.mjs test/guards-unbound-deletion.mjs test/submit-probe-readings.mjs test/improver-content-account-chrome.mjs test/improver-content-recipient.mjs test/improver-content-truncated-replacement.mjs test/improver-forms-probe.mjs test/improver-misc-trace-browser.mjs test/page-feedback-held-time.mjs test/page-monitor-held-observation.mjs", "test:shard:browser-b1": "node test/message-recipient-upload.mjs && node test/message-recipient-clarify-binding.mjs && node --test test/message-recipient-whatsapp.mjs test/message-control-readings.mjs && node test/quality/integration-mv3.mjs --full-form && node test/quality/integration-mv3.mjs --batch && node test/quality/literal-calculate-midrun-mv3.mjs && node test/quality/ask-completion-churn-mv3.mjs && node test/quality/ask-person-activity-mv3.mjs && node test/quality/telegram-cold-preparation-mv3.mjs && node test/quality/native-chat-mv3.mjs && node test/quality/native-chat-presubmit-mv3.mjs && node test/quality/cloud-bot-memory-mv3.mjs", "test:shard:browser-b2": "node test/quality/whatsapp-contact-matrix.mjs && node test/quality/pdf-detection-mv3.mjs && node test/quality/download-upload-mv3.mjs && node test/quality/upload-release-binding-mv3.mjs && node test/quality/upload-release-binding-mv3.mjs --selector-recovery && node test/quality/upload-release-binding-mv3.mjs --sequential-assets && node test/quality/release-review-world-mv3.mjs && node test/quality/downloaded-file-saved-bytes-mv3.mjs && node test/quality/file-upload-accept-mv3.mjs && node test/quality/bulk-resume-mv3.mjs && node test/quality/shared-action-guards-mv3.mjs && node test/quality/video-upload-attachment-mv3.mjs", "test:shard:browser-c": "node test/quality/literal-frame-mv3.mjs && node test/quality/mastodon-publication-mv3.mjs && node test/quality/mastodon-reply-route-mv3.mjs && node test/quality/mastodon-deletion-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs && node test/quality/mastodon-delete-confirmation-mv3.mjs --menu-read && node test/quality/mastodon-delete-confirmation-mv3.mjs --vague && node test/quality/mastodon-delete-after-correction-mv3.mjs && node test/quality/unbound-deletion-mv3.mjs && node test/quality/recipient-clarify-mv3.mjs && node test/quality/open-chat-recipients-mv3.mjs && node test/quality/correction-cross-site-mv3.mjs && node test/quality/anchored-action-mv3.mjs && node test/quality/inline-social-composer-mv3.mjs && node test/quality/x-compose-dialog-mv3.mjs && node test/quality/bluesky-composer-mv3.mjs && node test/quality/dropdown-menu-matrix.mjs && node test/quality/mastodon-deletion-navigation-mv3.mjs && node test/quality/semantic-navigation-matrix.mjs && node test/quality/workflow-replay-mv3.mjs && node test/quality/generative-media-mv3.mjs && node test/quality/cdp-worker-restart-mv3.mjs && node test/quality/steering-worker-restart-mv3.mjs", diff --git a/scripts/check-tiny-ask-screenshot-gate.mjs b/scripts/check-tiny-ask-screenshot-gate.mjs index 64c079d994..8de1d20851 100644 --- a/scripts/check-tiny-ask-screenshot-gate.mjs +++ b/scripts/check-tiny-ask-screenshot-gate.mjs @@ -191,7 +191,8 @@ try { const worker = context.serviceWorkers()[0] || await context.waitForEvent('serviceworker', { timeout: 30000 }); const id = new URL(worker.url()).host; const harness = await context.newPage(); - await harness.goto(`chrome-extension://${id}/src/ui/settings.html`); + // Decision fixtures and D1 controls answer only the Providers page. + await harness.goto(`chrome-extension://${id}/src/ui/providers.html`); const message = (action, data = {}) => harness.evaluate(({ action, data }) => chrome.runtime.sendMessage({ target: 'background', action, ...data }), { action, data }); await harness.evaluate(() => chrome.storage.local.set({ onboardingComplete: true, wbLocale: 'en', helpImproveWebBrain: false })); result.extensionVersion = await harness.evaluate(() => chrome.runtime.getManifest().version); diff --git a/scripts/check-webgpu-decisions.mjs b/scripts/check-webgpu-decisions.mjs index 1d2b916709..0f693b3781 100644 --- a/scripts/check-webgpu-decisions.mjs +++ b/scripts/check-webgpu-decisions.mjs @@ -64,7 +64,8 @@ try { const worker = context.serviceWorkers()[0] || await context.waitForEvent('serviceworker', { timeout: 30000 }); const id = new URL(worker.url()).host; const harness = await context.newPage(); - await harness.goto(`chrome-extension://${id}/src/ui/settings.html`); + // Decision fixtures and D1 controls answer only the Providers page. + await harness.goto(`chrome-extension://${id}/src/ui/providers.html`); const message = (action, data = {}) => harness.evaluate(({ action, data }) => chrome.runtime.sendMessage({ target: 'background', action, ...data }), { action, data }); await harness.evaluate(() => chrome.storage.local.set({ onboardingComplete: true, wbLocale: 'en', helpImproveWebBrain: false })); result.extensionVersion = await harness.evaluate(() => chrome.runtime.getManifest().version); diff --git a/src/chrome/ARCHITECTURE.md b/src/chrome/ARCHITECTURE.md index 6e45106756..7418985200 100644 --- a/src/chrome/ARCHITECTURE.md +++ b/src/chrome/ARCHITECTURE.md @@ -1,6 +1,6 @@ # WebBrain Chrome/Edge Extension — Architecture -> Version 42.0.6 · Manifest V3 · Service Worker background +> Version 42.1.0 · Manifest V3 · Service Worker background ## High-Level Overview @@ -79,8 +79,12 @@ src/chrome/ │ └── ui/ │ ├── sidepanel.html │ ├── sidepanel.js # Chat UI, verbose mode, deep verbose -│ ├── settings.html -│ ├── settings.js # Provider + display settings +│ ├── settings.html # Settings: General, Budgets, Memory, Skills, CAPTCHA, Bridge, Advanced +│ ├── providers.html # Providers: LLM, Vision, Speech, Generative, Decision, SafeSocial +│ ├── permissions.html # Site permissions +│ ├── settings.css # Shared by the three settings pages +│ ├── settings-tabs.js # Tab bar, deep links and moved-tab redirects +│ ├── settings.js # One controller for all three settings pages │ ├── traces.html │ └── traces.js # Trace viewer / model comparison UI ├── skills/ # Packaged default skills (removable after seeding) @@ -771,7 +775,7 @@ in-progress Markdown after older delta events have been acknowledged. ## Trace Recorder (optional) -Off by default. Enabled via Settings → Display → "Record traces". When on, every agent run writes to an IndexedDB database (`webbrain-traces`): +Off by default. Enabled via Settings → Advanced → "Record traces", which records each run with its full request details (`tracingEnabled` and `losslessTrace` together). When on, every agent run writes to an IndexedDB database (`webbrain-traces`): - `runs` store: one row per user message — model, provider, token totals, timestamps. - `events` store: one row per LLM request/response, tool call, screenshot. LLM requests retain content-free prompt provenance (controlled variant, counts, declared prompt/tool policy revisions, and runtime-mode alignment), not fingerprints or raw system prompts, message text, tool schemas, or tool names. Policy revisions are bumped when controlled prompt templates or tool-exposure rules change; private request content does not affect them. Rows are indexed by `(runId, seq)`. @@ -785,19 +789,21 @@ advertise mutation availability and route still-missing required inputs through --- -## Display Settings +## Settings Pages -`Settings → Display` toggles (stored in `chrome.storage.local`): +Settings (`ui/settings.html`) has General, Budgets, Memory, Skills, CAPTCHA, Bridge and Advanced tabs. The chat provider and the assistive models live on `ui/providers.html` (LLM, Vision, Speech, Generative, Decision and SafeSocial tabs), and site permissions on `ui/permissions.html`. One controller, `ui/settings.js`, serves all three pages; each section wires itself only when its markup is on the page. Old `settings.html#providers`, `#multimodal` and `#permissions` links redirect to the new pages. -| Setting | Effect | -|---|---| -| Verbose mode | Shows full tool args + JSON results in chat instead of compact labels. | -| Screenshot fallback | Capture a screenshot when DOM read fails or returns insufficient content. | -| Site adapters | Inject per-site guidance and expose validated app-owned workflow jobs to the planner (default on). | -| Auto-screenshot | `off` / `navigation` / `state_change` (default) / `every_step`. | -| Record traces | Enable the trace recorder (see above). | -| Completion sound | Play a chime in the side panel when the agent finishes. | -| Max Agent Steps | 5–195 finite steps or unlimited, default 130. | +Selected toggles (stored in `chrome.storage.local`): + +| Setting | Tab | Effect | +|---|---|---| +| Verbose mode | Advanced | Shows full tool args + JSON results in chat instead of compact labels. | +| Screenshot fallback | Advanced | Capture a screenshot when DOM read fails or returns insufficient content. | +| Site adapters | Advanced | Inject per-site guidance and expose validated app-owned workflow jobs to the planner (default on). | +| Auto-screenshot | General | `off` / `navigation` (default) / `state_change` / `every_step`. | +| Record traces | Advanced | Enable the trace recorder with full request details (see above). | +| Completion sound | Advanced | Play a chime in the side panel when the agent finishes. | +| Max Agent Steps | Budgets | 5–195 finite steps or unlimited, default 130. | --- diff --git a/src/chrome/manifest.json b/src/chrome/manifest.json index d1304d4930..12b2796754 100644 --- a/src/chrome/manifest.json +++ b/src/chrome/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "WebBrain", - "version": "42.0.6", + "version": "42.1.0", "description": "Open-source AI browser agent — chat with pages, automate tasks, multi-provider LLM support.", "permissions": [ "sidePanel", diff --git a/src/chrome/src/agent/adapters.js b/src/chrome/src/agent/adapters.js index 6f901ad415..317184acf0 100644 --- a/src/chrome/src/agent/adapters.js +++ b/src/chrome/src/agent/adapters.js @@ -17663,6 +17663,7 @@ const ADAPTERS = [ - First-time setup REQUIRES the user to scan a QR code with their phone's WhatsApp app. The agent CANNOT scan a QR code — if the QR is on screen, surface it to the user and stop. Don't loop waiting for it to disappear. - Once linked, layout is: conversation list on the LEFT (chats sorted by recency), active conversation on the RIGHT. - Message input is a contenteditable div at the bottom of the conversation. set_field works; Enter sends by default. +- Open the recipient's chat first: click_ax its row in the chat list, or search for them. Then, before sending or attaching, confirm the contact: click_ax the contact name in the chat header, and close the Contact info panel it opens with that panel's own Close button. Until then message actions are blocked, and the blocked result names the exact control. One run confirms one chat. - Emoji picker, attachment button (paperclip), voice-note (mic) sit to the left/right of the input. - Search at the top of the conversation list searches across all chats (people, group names, message content). - "Status" tab (eye icon) is a separate stream of ephemeral updates; "Calls" tab shows call history and starts voice/video calls. @@ -18349,6 +18350,21 @@ export function getMessageRecipientGuardPolicy(url) { }; } +/** + * Native chat clients whose recipient guard confirms a contact and reads the + * latest messages through the chat tools (chat_observe, chat_send). Lean mode + * keeps that guard, so it offers those two tools on these pages. + */ +export function isNativeChatClientUrl(url) { + try { + const parsed = new URL(url); + return parsed.protocol === 'https:' && (parsed.hostname === 'web.whatsapp.com' + || /^(?:web|webk|weba|webz|k)\.telegram\.org$/i.test(parsed.hostname)); + } catch { + return false; + } +} + /** * Get a printable list of all registered adapters (for settings UI / docs). */ diff --git a/src/chrome/src/agent/agent.js b/src/chrome/src/agent/agent.js index 8b811864a9..be3739f94f 100644 --- a/src/chrome/src/agent/agent.js +++ b/src/chrome/src/agent/agent.js @@ -65,7 +65,7 @@ import { analyzeMastodonPage, isMastodonPageUrl, mastodonHandoffInstruction, mas import { PROGRESS_ACTIONS, isProgressActionAllowed, isProgressIntentActive, normalizeProgressAction, normalizeProgressIntent } from './progress-intent.js'; import { classifyCompletionForm, completionDoneBlock, completionPlainFinalBlock, completionPlainFinalPartial, consumeCompletionObservation, consumeCompletionObservationResult, createCompletionInvariantState, didCompletionActionExecute, hasUnconsumedCompletionObservation, hasUnconsumedCompletionObservationResult, isCompletionActionTool, publicationDetailResource, publicationReplyParent, publicationResourceRecordRoot, recordCompletionToolResult } from './completion-invariant.js'; import { cdpClient, isCdpCommandNotSentError } from '../cdp/cdp-client.js'; -import { findLastGmailResultPage, getActiveAdapter, getAdapterWorkflowRouting, getCarouselNavigationPolicy, getCarouselNavigationTarget, getFullPageCapturePolicy, getGmailResultCountPolicy, getGmailResultPageUrl, getMessageRecipientGuardPolicy, isGmailChatRoute, isPublicComposerRoute, parseCarouselSlideCount, parseGmailPaginationRange, resolveAdapterWorkflowJob, UNIVERSAL_PREAMBLE } from './adapters.js'; +import { findLastGmailResultPage, getActiveAdapter, getAdapterWorkflowRouting, getCarouselNavigationPolicy, getCarouselNavigationTarget, getFullPageCapturePolicy, getGmailResultCountPolicy, getGmailResultPageUrl, getMessageRecipientGuardPolicy, isGmailChatRoute, isNativeChatClientUrl, isPublicComposerRoute, parseCarouselSlideCount, parseGmailPaginationRange, resolveAdapterWorkflowJob, UNIVERSAL_PREAMBLE } from './adapters.js'; import { formatAdapterWorkflowExecutionPolicy } from './adapter-workflow.js'; import { invalidateWorkflowInventoryCompleteness, @@ -1005,14 +1005,14 @@ export class Agent extends LoopDetector { // Permission/form-submit prompts are never timed out. // Loaded from chrome.storage.local in background.js (default 60). this.clarifyTimeoutSec = 60; - // Settings → General → "When a question times out": 'finish' (default) + // Settings → Budgets → "When a question times out": 'finish' (default) // keeps the task moving, 'safe' takes the safe default. See clarify-timeout.js. this.clarifyTimeoutPolicy = 'finish'; - // Settings → General → "Strict checks" (off by default): quality + // Settings → Advanced → "Strict checks" (off by default): quality // guards advise instead of refusing. See guard-policy.js. this.strictGuards = false; this._guardRunStates = new Map(); - // Settings → General → "Lean mode": 'auto' (default) | 'on' | 'off'. A run + // Settings → Advanced → "Lean mode": 'auto' (default) | 'on' | 'off'. A run // resolves it once at its start (_beginLeanRun) and keeps the answer in // _leanRuns, so its tools, prompt and guards agree. See lean-mode.js. this.leanMode = 'auto'; @@ -1046,8 +1046,9 @@ export class Agent extends LoopDetector { // never suppressed — see _manageContext. this._compactCooldown = new Map(); // Auto-screenshot mode. 'off' | 'navigation' | 'state_change' | 'every_step'. - // Loaded from chrome.storage.local in background.js. - this.autoScreenshot = 'state_change'; + // Loaded from chrome.storage.local in background.js. The default captures + // after the agent navigates, not after every click or keystroke. + this.autoScreenshot = 'navigation'; // Whether to inject site adapter notes + universal cookie/paywall // guidance into the system prompt. Loaded from chrome.storage.local. // Default true. The adapter notes themselves still live in @@ -1271,7 +1272,7 @@ export class Agent extends LoopDetector { try { await chrome.storage.local.set({ wb_permissions: grants }); } catch { /* best-effort */ } }, }); - // Master switch (Settings → Permissions): when the user turns OFF "Ask + // Master switch (permissions page and side panel): when the user turns OFF "Ask // before consequential actions", the permission gate is bypassed entirely // for fast/trusted usage. Default ON. Layers 1 & 2 (untrusted-content // wrapping + system-prompt contract) stay active regardless — they cost @@ -1279,7 +1280,7 @@ export class Agent extends LoopDetector { this._skipPermissionGate = false; this._gateSettingLoaded = false; // Keep in-memory state in sync when storage changes out-of-band — a grant - // revoked in Settings, or the master switch toggled. + // revoked on the permissions page, or the master switch toggled. try { chrome.storage.onChanged.addListener((changes, area) => { if (area !== 'local') return; @@ -1719,8 +1720,8 @@ export class Agent extends LoopDetector { if (phase === 'error') return `Local vision is unavailable: ${status.error || 'download failed'}.`; // Auto stays off until Ternary Bonsai 2 2B Vision is downloaded, and no // choice downloads on its own, so both point at the one place to fix it. - if (phase === 'disabled') return 'Local vision is off. Choose an in-browser vision model in Settings → Assistive Models → Vision.'; - return 'Local vision is not downloaded. Download it in Settings → Assistive Models → Vision.'; + if (phase === 'disabled') return 'Local vision is off. Choose an in-browser vision model in Providers → Vision.'; + return 'Local vision is not downloaded. Download it in Providers → Vision.'; } _recordVisionStatusTrace(tabId, context, route) { @@ -5704,7 +5705,7 @@ export class Agent extends LoopDetector { }; } - // Completion guards under the default policy (Settings → General → + // Completion guards under the default policy (Settings → Advanced → // "Strict checks" off; see guard-policy.js). A completion guard refuses a // done or a plain final at most once per run, and that refusal is the // model's note. The next completion the same guard would refuse is @@ -8830,7 +8831,7 @@ export class Agent extends LoopDetector { _costAllowanceMessage(scope, spentUsd, limitUsd) { const scopeText = scope === 'session' ? 'this session' : 'total cloud/router usage'; - return `Cloud cost allowance reached: ${scopeText} is ${this._formatUsd(spentUsd)} against the ${this._formatUsd(limitUsd)} limit. Stopping before further cloud/router model calls. Increase or reset the allowance in Settings.`; + return `Cloud cost allowance reached: ${scopeText} is ${this._formatUsd(spentUsd)} against the ${this._formatUsd(limitUsd)} limit. Stopping before further cloud/router model calls. Increase or reset the allowance in Settings → Budgets.`; } // `pending`: which requests in flight to count at their most (see @@ -12003,7 +12004,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d * Cost model: every auto-screenshot is not just image bytes in the context * (pruned to the last few messages) — it is also a *separate vision LLM call* * to describe it. On a run of repetitive actions (invite N people, like N - * posts, click through a list) the default `state_change` mode therefore paid + * posts, click through a list) the `state_change` mode therefore paid * one capture + one full model round trip per action, which is the largest * avoidable token and latency cost in a run. * @@ -22003,7 +22004,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d * wait forever). Invalid values fall back to the product default of 60s. * Stored slider values above 1200 mean Off. */ - // Settings → General → "Strict checks": every quality guard blocks again. + // Settings → Advanced → "Strict checks": every quality guard blocks again. _guardStrict() { return this.strictGuards === true; } @@ -22108,7 +22109,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d } /** - * Settings → General → "Lean mode" for a run on `tabId` with `provider` + * Settings → Advanced → "Lean mode" for a run on `tabId` with `provider` * (the tab's active provider by default): 'on' and 'off' decide; 'auto' * turns it on only for a strong model on a cloud provider whose prompt tier * is Full (lean-mode.js). Act mode only: Ask, Dev and standalone chat keep @@ -31382,6 +31383,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d supportsRecipientSets: policy.supportsRecipientSets === true, ...(name === 'upload_file' ? { uploadSourceKey } : {}), ...(target?.target_kind === 'named' ? { expectedRecipients: target.recipients } : {}), + ...(this._messageTargetNamesRecipient(guard, target) ? { namedRecipientSelection: true } : {}), }); if (probe?.success === true && probe?.conclusive === true && probe.messageSend === false) { if (probe.nativeTelegramRepair === true) { @@ -31710,6 +31712,15 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d // says so, instead of sending the agent to re-read and retry in vain. const contactCheckSpent = inconclusive && probe?.nativeWhatsappRepairSpent === true && probe?.reasonCode === 'native_whatsapp_contact_check_spent' && typeof probe?.error === 'string'; + // A native WhatsApp chat whose contact this run has not confirmed yet. + // The model is told the one control that confirms it, by its exact ref: + // "re-read and retry" kept a model clicking Attach and the chat row, + // each blocked again, until it gave up without sending. + const whatsappContactCheck = inconclusive && !contactCheckSpent + && probe?.reasonCode === 'native_whatsapp_contact_binding_required' + ? this._nativeWhatsappContactCheckGuidance(probe?.nativeWhatsappRepairTarget, + { namedRecipient: this._messageTargetNamesRecipient(guard, target) }) + : ''; // Human-readable view of who the page actually addresses, so a mismatch // block can name the exact observed recipient. const observedRecipientLabel = (() => { @@ -31733,7 +31744,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d reasonCode: inconclusive ? (probe?.reasonCode || 'message_send_classification_inconclusive') : (target ? 'active_recipient_unverified' : 'authorized_recipient_missing'), - error: contactCheckSpent ? String(probe.error || '') : missingLinkedInComposer + error: contactCheckSpent ? String(probe.error || '') : whatsappContactCheck ? whatsappContactCheck : missingLinkedInComposer ? (probe?.reasonCode === 'message_commit_without_composer' ? 'Message send blocked: this control commits a message (for example "Send" / "Send without a note") but no active composer or recipient could be verified. Changing click targeting methods will not help. Open the intended conversation so its composer and recipient are visible, or report that the message could not be sent.' : 'Message send blocked: no message composer is visible, so this send cannot be verified. Changing click targeting methods will not resolve this classification failure. Re-read the page to find a supported navigation or composer-opening control; if none is available, report the blocker instead of repeating the click.') @@ -31749,6 +31760,39 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d }; } + // Whether a request names the person its message is for, so that it may + // open that person's WhatsApp chat from the chat list before the contact + // check. A request for the open chat itself ("this one"), with or without + // people named besides it, and a target already pinned to a verified chat + // identity keep the check on the chat that was open. + _messageTargetNamesRecipient(guard, target) { + const named = normalizeMessageTarget(target); + return named?.target_kind === 'named' && named.recipients.length > 0 + && named.recipients.every(item => !/^whatsapp:/i.test(String(item?.identity || ''))) + && !(Array.isArray(guard?.activeConversationRecipients) && guard.activeConversationRecipients.length > 0) + && !normalizeMessageTarget(guard?.requestedMessaging); + } + + // What the model reads when a message action is blocked in a native + // WhatsApp chat whose contact the run has not confirmed yet. The page names + // the confirming control (the contact name in the chat header, then the + // Contact info panel's Close button) as an app-issued ref when it can. + _nativeWhatsappContactCheckGuidance(repairTarget, { namedRecipient = false } = {}) { + const ref = typeof repairTarget?.ref_id === 'string' && /^ref_[A-Za-z0-9_:-]{1,100}$/.test(repairTarget.ref_id) + ? repairTarget.ref_id : ''; + if (ref && repairTarget.phase === 'close_contact') { + return `Message action blocked, nothing was sent: this chat's Contact info panel is still open. Close it with click_ax({ref_id:"${ref}"}), the panel's own Close button, to finish confirming the contact, then retry this action.`; + } + const confirm = ref && repairTarget.phase === 'open_contact' + ? `click_ax({ref_id:"${ref}"}), the contact name in the chat header` + : 'click_ax only the contact name in the chat header (read the header with get_accessibility_tree first)'; + return 'Message action blocked, nothing was sent: on WhatsApp, WebBrain confirms who the open chat is with before any message action in it, and this chat is not confirmed yet. ' + + (namedRecipient + ? 'If this is not the chat of the person the message is for, open their chat from the chat list first; the check applies to the chat that is open. ' + : '') + + `To confirm it, ${confirm}, then close the Contact info panel it opens with that panel's own Close button, and retry this action. The avatar, call, search and menu buttons do not confirm a contact.`; + } + /** * What the model reads when a send to an unconfirmed recipient could not be * put to the user (an unattended run) or was not confirmed. It names both @@ -31969,7 +32013,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d * 'once' lets this one step go ahead, anything else refuses it. Returns * 'once' | 'deny', or null when Stop or a correction cancelled the card. * - * A quality guard's card (`hard: false`) follows Settings → General: the + * A quality guard's card (`hard: false`) follows Settings → Budgets: the * clarify timeout (Off waits for the user, Instant answers at once) and * "When a question times out" ('finish' goes ahead, 'safe' does not). A * hard-class card never times out, like the recipient and deletion cards, @@ -47354,7 +47398,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d const stored = await chrome.storage.local.get(CAPTCHA_SETTINGS_KEYS); const providers = getCaptchaProviders(stored); if (!providers.length) { - return noDispatchFailure('No CAPTCHA solver is enabled with a valid API key. Save and enable a CAPTCHA provider key in Settings → General → Advanced, or ask the user to solve the CAPTCHA manually.'); + return noDispatchFailure('No CAPTCHA solver is enabled with a valid API key. Save and enable a CAPTCHA provider key in Settings → CAPTCHA, or ask the user to solve the CAPTCHA manually.'); } // Use the top-level URL as a fallback. Frame-aware detection below @@ -54278,7 +54322,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d if (stagedVisionRoute && !stagedVisionRoute.provider && stagedVisionRoute.visionStatus) continue; if (!provider?.supportsVision && (!stagedVisionRoute?.provider || stagedVisionRoute.rawImage)) { const overrideHint = provider?.config?.visionMode != null - ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Settings.' + ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Providers.' : ''; return { ok: false, @@ -54324,7 +54368,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d } if (!provider?.supportsVision && (!stagedVisionRoute?.provider || stagedVisionRoute.rawImage)) { const overrideHint = provider?.config?.visionMode != null - ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Settings.' + ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Providers.' : ''; return { ok: false, @@ -54826,6 +54870,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, autoModeEscalation: mode === 'ask' && this._autoModeEscalationTabs.has(tabId), }); @@ -55119,6 +55164,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, autoModeEscalation: mode === 'ask' && this._autoModeEscalationTabs.has(tabId), }); @@ -56516,6 +56562,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, }); // Match the non-streaming path: selection-grounded turns are tool-free so @@ -56634,6 +56681,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, }); tools = this._botMemoryRunTools(tabId, tools); diff --git a/src/chrome/src/agent/clarify-timeout.js b/src/chrome/src/agent/clarify-timeout.js index a591ea67b3..d19bd3f619 100644 --- a/src/chrome/src/agent/clarify-timeout.js +++ b/src/chrome/src/agent/clarify-timeout.js @@ -1,6 +1,6 @@ // What WebBrain does when nobody answers a clarify question in time. // -// The user chooses this in Settings → General ("When a question times out"): +// The user chooses this in Settings → Budgets ("When a question times out"): // - 'finish' (default) keeps the task moving. The option the model named as // finish_option applies as the answer; without one, the model continues // with the choice that best completes the task. Runs no longer stall diff --git a/src/chrome/src/agent/fal-media.js b/src/chrome/src/agent/fal-media.js index e30efcfa4f..c3ee2a92d4 100644 --- a/src/chrome/src/agent/fal-media.js +++ b/src/chrome/src/agent/fal-media.js @@ -1,6 +1,6 @@ // fal.ai generative media (assistive model). // -// Configured in Settings -> Assistive Models -> Generative Media (fal.ai provider). +// Configured in Providers -> Generative (fal.ai provider). // and stored in extension storage as `imageGenModel = { apiKey, model }`. // fal.ai uses a queue API: submit a prompt, poll status_url, then fetch // response_url. Auth uses `Authorization: Key `. diff --git a/src/chrome/src/agent/generative-media.js b/src/chrome/src/agent/generative-media.js index ef0d80ec60..ffbf00b497 100644 --- a/src/chrome/src/agent/generative-media.js +++ b/src/chrome/src/agent/generative-media.js @@ -219,7 +219,7 @@ export async function generateImage(args, options = {}) { const fetchImpl = typeof options === 'function' ? options : options.fetchImpl || fetch; try { const config = Object.hasOwn(options, 'config') ? options.config : await readMediaConfig(); - if (!config) throw new Error('Configure Generative Media in Settings → Assistive Models.'); + if (!config) throw new Error('Configure Generative Media in Providers → Generative.'); const result = await runMediaGeneration({ prompt: args?.prompt, config, fetchImpl, signal: options.signal }); if (result.url.startsWith('data:')) { const asset = await storeGeneratedMedia(result.url); diff --git a/src/chrome/src/agent/lean-mode.js b/src/chrome/src/agent/lean-mode.js index 1401297945..8adefde3f5 100644 --- a/src/chrome/src/agent/lean-mode.js +++ b/src/chrome/src/agent/lean-mode.js @@ -1,4 +1,4 @@ -// Lean mode: Settings → General → "Lean mode" ('auto' | 'on' | 'off'). +// Lean mode: Settings → Advanced → "Lean mode" ('auto' | 'on' | 'off'). // // A strong model does not need WebBrain's verification scaffolding: the // extra tools, readbacks, completion judges and forced re-check turns that diff --git a/src/chrome/src/agent/media-config.js b/src/chrome/src/agent/media-config.js index e434710fba..62937413d6 100644 --- a/src/chrome/src/agent/media-config.js +++ b/src/chrome/src/agent/media-config.js @@ -1,6 +1,6 @@ // Provider settings are user-authored. Model tool arguments never select a host or key. export const IMAGE_GEN_MODEL_KEY = 'imageGenModel'; -export const GENERATIVE_MEDIA_SETUP_NOTE = 'Built-in media generation requires setup in Settings → Assistive Models → Generative Media.'; +export const GENERATIVE_MEDIA_SETUP_NOTE = 'Built-in media generation requires setup in Providers → Generative.'; export const GENERATIVE_MEDIA_TIER_NOTE = 'Built-in media generation requires Full-tier Act mode.'; export const MEDIA_PROVIDERS = Object.freeze({ fal: { label: 'fal.ai', model: 'fal-ai/flux/schnell', keyPlaceholder: 'FAL_KEY', docs: 'https://fal.ai/dashboard/keys' }, diff --git a/src/chrome/src/agent/terminal-messages.js b/src/chrome/src/agent/terminal-messages.js index a091c90107..1c9638b84a 100644 --- a/src/chrome/src/agent/terminal-messages.js +++ b/src/chrome/src/agent/terminal-messages.js @@ -103,6 +103,6 @@ export function stepLimitUserMessage(steps, lastAssistantText = '') { const lines = [`I reached the step limit${count ? ` (${count} step${count === 1 ? '' : 's'})` : ''} before finishing the task.`]; const snippet = String(lastAssistantText || '').replace(/\s+/g, ' ').trim(); if (snippet) lines.push(`Where I stopped: "${snippet.slice(0, 280)}${snippet.length > 280 ? '...' : ''}"`); - lines.push('This usually means the task is too complex for the current model, the step limit is too low (you can raise it in Settings), or the task should be split into smaller parts.'); + lines.push('This usually means the task is too complex for the current model, the step limit is too low (you can raise it in Settings → Budgets), or the task should be split into smaller parts.'); return lines.join('\n\n'); } diff --git a/src/chrome/src/agent/tools.js b/src/chrome/src/agent/tools.js index 0047c2b8ac..48c1d1ab7b 100644 --- a/src/chrome/src/agent/tools.js +++ b/src/chrome/src/agent/tools.js @@ -1443,7 +1443,7 @@ export const AGENT_TOOLS = [ type: 'function', function: { name: 'solve_captcha', - description: "Solve a CAPTCHA using compatible providers enabled in Settings → General → Advanced, in descending weight order. A single call may charge multiple providers on fallback. Follow the runtime CAPTCHA gate: never repurchase an unresolved challenge from an attempted provider. A new challenge or a runtime-offered AWS fallback can proceed after fresh inspection. Omit providerTasks for automatic reCAPTCHA v2/v3, hCaptcha, Turnstile, AWS WAF, and image handling. AWS WAF observes initial or secondary verification inputs and applies its cookie; reload once and read the page to verify clearance. For ALL other documented methods, first read get_captcha_capabilities and the selected method schemas, then provide one native task per compatible enabled provider with observed parameters and inject:false. Native methods preserve tokens, cookies, coordinates, audio/text, and structured answers; apply them using apply_captcha_solution. Unknown or missing parameters fail before spending. Verify page progress; a returned answer is not proof of clearance. Missing provider/input or failed solving requires manual completion.", + description: "Solve a CAPTCHA using compatible providers enabled in Settings → CAPTCHA, in descending weight order. A single call may charge multiple providers on fallback. Follow the runtime CAPTCHA gate: never repurchase an unresolved challenge from an attempted provider. A new challenge or a runtime-offered AWS fallback can proceed after fresh inspection. Omit providerTasks for automatic reCAPTCHA v2/v3, hCaptcha, Turnstile, AWS WAF, and image handling. AWS WAF observes initial or secondary verification inputs and applies its cookie; reload once and read the page to verify clearance. For ALL other documented methods, first read get_captcha_capabilities and the selected method schemas, then provide one native task per compatible enabled provider with observed parameters and inject:false. Native methods preserve tokens, cookies, coordinates, audio/text, and structured answers; apply them using apply_captcha_solution. Unknown or missing parameters fail before spending. Verify page progress; a returned answer is not proof of clearance. Missing provider/input or failed solving requires manual completion.", parameters: { type: 'object', properties: { @@ -1487,7 +1487,7 @@ export const AGENT_TOOLS = [ type: 'function', function: { name: 'generate_image', - description: 'Generate media (usually an image) from a text prompt using the user\'s configured generative media provider (Settings → Assistive Models → Generative Media). Supports fal.ai, OpenRouter, Comfy Router and local ComfyUI workflows; generation may take several minutes. Returns a media URL or inline media displayed in the chat. Not available in Ask mode.', + description: 'Generate media (usually an image) from a text prompt using the user\'s configured generative media provider (Providers → Generative). Supports fal.ai, OpenRouter, Comfy Router and local ComfyUI workflows; generation may take several minutes. Returns a media URL or inline media displayed in the chat. Not available in Ask mode.', parameters: { type: 'object', properties: { @@ -1950,7 +1950,7 @@ export function getToolsForMode(mode, opts = {}) { const tier = opts.tier || (opts.compact ? 'compact' : 'full'); const normalizedMode = mode === 'dev' ? 'dev' : (mode === 'ask' ? 'ask' : 'act'); const devCompactBlocked = normalizedMode === 'dev' && tier === 'compact'; - // Lean mode (Settings → General → "Lean mode", Act only): strong models get + // Lean mode (Settings → Advanced → "Lean mode", Act only): strong models get // a small subset of the normal tools instead of the tier's list. Same // schemas, no new tools; see lean-mode.js and LEAN_TOOL_NAMES below. const lean = opts.lean === true && normalizedMode === 'act'; @@ -1965,7 +1965,8 @@ export function getToolsForMode(mode, opts = {}) { // A Compact provider keeps its upload_file schema: its permission gate // accepts only an attachment and a target from upload_file's own discovery. base = AGENT_TOOLS - .filter(t => LEAN_TOOL_NAMES.has(t.function.name)) + .filter(t => LEAN_TOOL_NAMES.has(t.function.name) + || (opts.nativeChatTools === true && LEAN_NATIVE_CHAT_TOOL_NAMES.has(t.function.name))) .map(t => (tier === 'compact' && t.function.name === 'upload_file' ? compactUploadFileTool(t) : t)); } else if (tier === 'compact') { base = AGENT_TOOLS @@ -2695,7 +2696,7 @@ LISTINGS: - On listing/search-result pages, EXTRACT first, paginate second: list each visible item to the user (title + price/date + link), then move to the next page. For "give me the links/items" tasks, call done with what you have as soon as it's useful — partial-but-delivered beats complete-but-never-delivered.`; /** - * Lean tool set (Settings → General → "Lean mode", Act only). A thin surface + * Lean tool set (Settings → Advanced → "Lean mode", Act only). A thin surface * in the spirit of Claude in Chrome for strong models: read the page, act by * ref or by a point from a screenshot, type, press keys, scroll, navigate, * wait, upload, and ask or finish. Tabs are not model-callable in WebBrain, so @@ -2712,6 +2713,16 @@ export const LEAN_TOOL_NAMES = new Set([ 'generate_image', 'carousel_navigate', 'gmail_count_results', ]); +/** + * Chat tools a lean run is also offered on a native chat client (WhatsApp + * Web, Telegram Web; `nativeChatTools`, from isNativeChatClientUrl). Lean mode + * keeps the recipient guard, which confirms a contact and reads the latest + * messages there through chat_observe and sends through chat_send. Without + * them its repairs pointed at tools the run did not have, and the planner's + * chat_observe/chat_send steps could not run. + */ +export const LEAN_NATIVE_CHAT_TOOL_NAMES = new Set(['chat_observe', 'chat_send']); + /** * Lean Act prompt: short, with the hard limits and the prompt-injection * boundary kept in full. WebBrain runs no quality checks in lean mode, so the diff --git a/src/chrome/src/agent/transcribe.js b/src/chrome/src/agent/transcribe.js index 8f5ff8a6db..9adcd0db14 100644 --- a/src/chrome/src/agent/transcribe.js +++ b/src/chrome/src/agent/transcribe.js @@ -86,7 +86,7 @@ function pickProvider(providers) { * Read the user's explicit transcription override from storage if set. * * Lives in chrome.storage.local under `transcriptionModel = {baseUrl, apiKey, - * model}` — written by Settings → Multimodal → Transcription. All three + * model}` — written by Providers → Speech. All three * fields must be present (baseUrl, model required; apiKey optional for * local servers like LM Studio / llama.cpp) for the override to win over * the auto-pick path. Returns null when not set so callers can fall @@ -127,7 +127,7 @@ export async function transcribeAudio(providers, audioBlob, opts = {}) { if (!audioBlob || audioBlob.size === 0) { return { ok: false, error: 'Transcription: empty audio blob.' }; } - // Explicit Settings → Multimodal → Transcription override wins over the + // Explicit Providers → Speech override wins over the // auto-pick path. When the user has bothered to fill in a base URL + // model, that's a strong signal that they want THOSE rather than the // first OpenAI-compatible provider in their list. @@ -136,7 +136,7 @@ export async function transcribeAudio(providers, audioBlob, opts = {}) { if (!picked) { return { ok: false, - error: 'No Whisper-compatible provider configured. Add an API key to OpenAI (whisper-1) or Groq (whisper-large-v3) in Settings → Providers, OR set an explicit Transcription endpoint in Settings → Multimodal → Transcription, then re-record.', + error: 'No Whisper-compatible provider configured. Add an API key to OpenAI (whisper-1) or Groq (whisper-large-v3) in Providers → LLM, OR set an explicit transcription endpoint in Providers → Speech, then re-record.', }; } @@ -206,9 +206,9 @@ export async function transcribeAudio(providers, audioBlob, opts = {}) { `not multipart audio uploads. ` + (isLocal ? `Either load a GGUF Whisper model in that server (LM Studio 0.3+ and recent llama.cpp builds support whisper.cpp models), ` + - `or add an API key for OpenAI (whisper-1) or Groq (whisper-large-v3) in Settings → Providers — those host Whisper natively ` + + `or add an API key for OpenAI (whisper-1) or Groq (whisper-large-v3) in Providers → LLM — those host Whisper natively ` + `and will be auto-picked when configured.` - : `Add an API key for OpenAI (whisper-1) or Groq (whisper-large-v3) in Settings → Providers — webbrain auto-picks the first ` + + : `Add an API key for OpenAI (whisper-1) or Groq (whisper-large-v3) in Providers → LLM — webbrain auto-picks the first ` + `Whisper-capable provider, so a configured OpenAI key takes priority.`), }; } diff --git a/src/chrome/src/background.js b/src/chrome/src/background.js index 3fb6a9669d..ebec0d1fb2 100644 --- a/src/chrome/src/background.js +++ b/src/chrome/src/background.js @@ -626,6 +626,31 @@ async function loadAutoScreenshot() { } loadAutoScreenshot(); +// Settings has one Record traces switch for both trace tiers: full request +// details are recorded whenever traces are. A profile from before the merge +// can have the two set apart, so the update lines them up once and the switch +// shows what is recorded. A new install has nothing to line up and only notes +// that, so harnesses that set the tiers apart on a fresh profile keep their +// choice, as does anyone who sets them apart after the merge. +const TRACE_TIERS_MERGED_KEY = 'traceTiersMergedV1'; +async function mergeTraceTiers(reason) { + if (reason === 'install') { + await chrome.storage.local.set({ [TRACE_TIERS_MERGED_KEY]: true }); + return; + } + if (reason !== 'update') return; + const stored = await chrome.storage.local.get(['tracingEnabled', 'losslessTrace', TRACE_TIERS_MERGED_KEY]); + if (stored[TRACE_TIERS_MERGED_KEY] === true) return; + const updates = { [TRACE_TIERS_MERGED_KEY]: true }; + if ((stored.tracingEnabled === true) !== (stored.losslessTrace === true)) { + updates.losslessTrace = stored.tracingEnabled === true; + } + await chrome.storage.local.set(updates); +} +chrome.runtime.onInstalled.addListener(({ reason }) => { + mergeTraceTiers(reason).catch(() => {}); +}); + async function loadSiteAdapters() { const stored = await chrome.storage.local.get('useSiteAdapters'); if (stored.useSiteAdapters != null) agent.useSiteAdapters = stored.useSiteAdapters; @@ -2677,7 +2702,7 @@ async function standaloneRunProviderId(msg) { const config = providerManager.getAll().webgpu; const download = await providerManager.getWebgpuDownloadStatus().catch(() => null); if (!isShippedWebgpuPreset(config?.model) || download?.ready !== true) { - throw new Error(`Download ${webgpuModelDisplayName(config?.model || WEBGPU_COMPASS_TINY_V2_MODEL_ID)} in Settings > Providers > WebGPU or Apocalypse Mode > WebGPU before using WebGPU in standalone chat.`); + throw new Error(`Download ${webgpuModelDisplayName(config?.model || WEBGPU_COMPASS_TINY_V2_MODEL_ID)} in Providers > WebGPU or Apocalypse Mode > WebGPU before using WebGPU in standalone chat.`); } return providerId; } @@ -4490,7 +4515,14 @@ async function handleMessage(msg, sender) { imported.settings, ) : imported.settings; - await chrome.storage.local.set(settings); + // Exports carry Record traces only. A restored export brings full request + // details along with it, as the Settings switch does. A provisioning + // patch can turn both off, but never turns full request details on. + const traceTiers = Object.hasOwn(settings, 'tracingEnabled') + && (msg.action === 'import_config' || settings.tracingEnabled !== true) + ? { losslessTrace: settings.tracingEnabled === true } + : {}; + await chrome.storage.local.set({ ...settings, ...traceTiers }); await providerManager.load(); await Promise.all([ loadMaxSteps(), @@ -4841,9 +4873,10 @@ async function handleMessage(msg, sender) { return await providerManager.testVisionProvider(); } case 'enable_webgpu_vision': { - const settingsUrl = chrome.runtime.getURL('src/ui/settings.html'); - if (String(sender?.url || '').split('#')[0] !== settingsUrl) { - return { ok: false, code: 'vision_consent_required', error: 'Local vision can only be enabled from Settings.' }; + // Consent is recorded only from the Vision tab of the Providers page. + const providersUrl = chrome.runtime.getURL('src/ui/providers.html'); + if (String(sender?.url || '').split(/[?#]/)[0] !== providersUrl) { + return { ok: false, code: 'vision_consent_required', error: 'Local vision can only be enabled from Providers → Vision.' }; } return await startExplicitVisionModelDownload(); } @@ -4858,9 +4891,9 @@ async function handleMessage(msg, sender) { // Choosing WebBrain VL 2 450M can re-enable it under consent already // given, so only the two pages that show the choice may change it. const senderPage = String(sender?.url || '').split(/[?#]/)[0]; - const allowedPages = ['src/ui/settings.html', 'src/ui/apocalypse-mode.html'].map(page => chrome.runtime.getURL(page)); + const allowedPages = ['src/ui/providers.html', 'src/ui/apocalypse-mode.html'].map(page => chrome.runtime.getURL(page)); if (!allowedPages.includes(senderPage)) { - return { ok: false, code: 'vision_choice_page', error: 'The in-browser vision model can only be chosen in Settings or Apocalypse Mode.' }; + return { ok: false, code: 'vision_choice_page', error: 'The in-browser vision model can only be chosen in Providers → Vision or Apocalypse Mode.' }; } return await providerManager.setWebgpuVisionChoice(msg.choice); } @@ -4901,11 +4934,12 @@ async function handleMessage(msg, sender) { } // Diagnostic decision readout on the in-browser chat model, for the - // hardware eval (scripts/check-webgpu-decisions.mjs). Settings page only. + // hardware eval (scripts/check-webgpu-decisions.mjs). Providers page only, + // where the decision models are configured. case 'webgpu_decide_fixture': { const api = globalThis.browser || globalThis.chrome; - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); - if (sender.id !== api.runtime.id || String(sender.url || '').split('#')[0] !== settingsUrl) return { success: false, error: 'Decision fixtures are available only from extension Settings.' }; + const providersUrl = api.runtime.getURL('src/ui/providers.html'); + if (sender.id !== api.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== providersUrl) return { success: false, error: 'Decision fixtures are available only from the extension Providers page.' }; try { await strictSecretModeReady; if (agent.strictSecretMode) throw new Error('Decision requests are disabled in Strict Secret Mode.'); @@ -4918,9 +4952,10 @@ async function handleMessage(msg, sender) { } case 'd1_control': { + // The D1 controls are on the Decision tab of the Providers page. const api = globalThis.browser || globalThis.chrome; - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); - if (sender.id !== api.runtime.id || String(sender.url || '').split('#')[0] !== settingsUrl) return { success: false, error: 'D1 model controls are available only from extension Settings.' }; + const providersUrl = api.runtime.getURL('src/ui/providers.html'); + if (sender.id !== api.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== providersUrl) return { success: false, error: 'D1 model controls are available only from the extension Providers page.' }; try { await strictSecretModeReady; if (agent.strictSecretMode && !['dispose', 'reset', 'stop', 'clear', 'status'].includes(msg.command)) throw new Error('D1 is disabled in Strict Secret Mode.'); diff --git a/src/chrome/src/config-transfer.js b/src/chrome/src/config-transfer.js index 8e7f263322..dcee8b4788 100644 --- a/src/chrome/src/config-transfer.js +++ b/src/chrome/src/config-transfer.js @@ -36,7 +36,7 @@ export const DEFAULT_CONFIG_SETTINGS = Object.freeze({ clarifyTimeoutSec: 60, clarifyTimeoutSemanticsV2: true, clarifyTimeoutPolicy: 'finish', - autoScreenshot: 'state_change', + autoScreenshot: 'navigation', useSiteAdapters: true, researchEscalationEnabled: false, researchEscalationEngine: 'chatgpt', diff --git a/src/chrome/src/content/chat-observation.js b/src/chrome/src/content/chat-observation.js index 6146452cfe..00dce3c9c5 100644 --- a/src/chrome/src/content/chat-observation.js +++ b/src/chrome/src/content/chat-observation.js @@ -482,6 +482,15 @@ let whatsappPending = null; let whatsappActive = null; let whatsappRepairAnchor = null; + // The anchor is normally the first chat the run looks at. A run that names + // its recipient may first have to open that person's chat from the chat + // list: the recipient probe reports that selection, and the anchor then + // follows WhatsApp's selection until the run arms its one check (a guarded + // header click). A run for the open chat itself ("this one") never moves + // its anchor, since that chat is its target. Once a check is armed the + // anchor stays with that chat, and a later selection change spends it. + let whatsappAnchorFollowsSelection = false; + let whatsappCheckArmed = false; const whatsappRendered = node => { if (!visible(node)) return false; for (let current = node, depth = 0; current && depth < 128; current = current.parentElement, depth++) { @@ -556,6 +565,7 @@ whatsappRestore = restore && typeof restore === 'object' ? restore : null; if (next !== whatsappOwner) { invalidateWhatsappBindings(false, true); whatsappRepairAnchor = null; whatsappOwner = next; + whatsappAnchorFollowsSelection = false; whatsappCheckArmed = false; let sameRunSourceChanged = false; try { const prior = JSON.parse(whatsappParkedFloor?.owner || 'null'), current = JSON.parse(next || 'null'); @@ -734,22 +744,38 @@ if (!pins || !contains(pins.carrier, target)) return false; invalidateWhatsappBindings(true, true); whatsappPending = { pins, owner: whatsappOwner, priorDrawers: new Set(query(document, '[data-testid="chat-info-drawer"]')) }; + // The run's one check now belongs to this chat. + if (whatsappAnchorFollowsSelection) whatsappRepairAnchor = { pins, invalidated: false }; + whatsappCheckArmed = true; whatsappAnchorFollowsSelection = false; return true; }; window.__wb_get_native_whatsapp_repair = () => { const composers = query(document, '[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); const pins = composers.length === 1 ? whatsappPins(composers[0]) : null; if (!pins || !whatsappOwner) return null; - if (!whatsappRepairAnchor) whatsappRepairAnchor = { pins, invalidated: false }; + if (!whatsappRepairAnchor || (whatsappAnchorFollowsSelection && !whatsappCheckArmed + && (whatsappRepairAnchor.invalidated || !sameWhatsappPins(whatsappRepairAnchor.pins)))) { + whatsappRepairAnchor = { pins, invalidated: false }; + } return !whatsappRepairAnchor.invalidated && sameWhatsappPins(whatsappRepairAnchor.pins) ? pins : null; }; - // A run checks one contact through its drawer: the anchor is the first - // chat the run looked at, and once it is invalidated, as when WhatsApp's - // chat selection changes, no chat can be checked again until the next run - // (a new owner). True when that is why no check is available. Anchored - // nodes that are only hidden for now, as behind a modal, do not count. + // The recipient probe calls this for a guarded chat-list selection in a run + // that names its recipient (see whatsappAnchorFollowsSelection). False once + // the run has armed its check, which stays with the chat it armed. + window.__wb_native_whatsapp_follow_selection = () => { + if (!whatsappObserver || !whatsappOwner || whatsappCheckArmed) return false; + whatsappAnchorFollowsSelection = true; + return true; + }; + // A run checks one contact through its drawer, for its anchor chat. Once + // the anchor is invalidated, as when WhatsApp's chat selection changes + // after the check was armed (or, in a run for the open chat, at all), no + // chat can be checked again until the next run (a new owner). True when + // that is why no check is available. Anchored nodes that are only hidden + // for now, as behind a modal, do not count. window.__wb_native_whatsapp_repair_spent = () => { if (!whatsappOwner || whatsappRepairAnchor?.invalidated !== true) return false; + if (whatsappAnchorFollowsSelection && !whatsappCheckArmed) return false; const composers = query(document, '[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); return composers.length === 1 && whatsappNativeComposer(composers[0]); }; @@ -777,6 +803,9 @@ if (typeof ref_id !== 'string' || !/^ref_[A-Za-z0-9_:-]{1,100}$/.test(ref_id)) return null; return { phase: drawers.length ? 'close_contact' : 'open_contact', ref_id }; }; + // The recipient probe names this same control to the model when it blocks + // a message action in a chat whose contact is not confirmed yet. + window.__wb_native_whatsapp_repair_guidance = () => whatsappRepairGuidance(); window.__wb_native_whatsapp_repair_matches = snapshot => { if (!snapshot || snapshot.owner !== whatsappOwner || !whatsappObserver) return false; whatsappMutations(whatsappObserver.takeRecords()); @@ -1528,7 +1557,7 @@ // here: the native composer is no longer tied to a checked chat). if (window.__wb_native_whatsapp_repair_spent()) { return { success: false, schema: SCHEMA, reason: 'native_whatsapp_contact_check_spent', retryable: false, - error: 'This run can no longer confirm a WhatsApp contact: its contact check belongs to the first chat it looked at, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' }; + error: 'This run can no longer confirm a WhatsApp contact: its one contact check belongs to the chat it first looked at or started checking, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' }; } if (composer && window.__wb_get_native_whatsapp_repair()?.composer === composer) { const nativeWhatsappRepair = whatsappRepairGuidance(); diff --git a/src/chrome/src/content/content.js b/src/chrome/src/content/content.js index 1298092ceb..75903ebc58 100644 --- a/src/chrome/src/content/content.js +++ b/src/chrome/src/content/content.js @@ -1241,7 +1241,13 @@ const unsafeAncestor = el?.parentElement?.closest?.( 'button,a,input,select,textarea,label,form,[role="button"],[role="link"],[onclick],[data-action]' ); - const safeRole = !role || ['generic', 'listitem', 'row'].includes(role); + // WhatsApp's chat list is a grid whose cells a script-dispatched click does + // not open, so without the trusted retry the agent could not open a chat. + // Any other grid (a spreadsheet, a calendar) keeps its cells synthetic-only: + // a second, trusted click there can turn a selection into an edit. + const whatsappChatCell = role === 'gridcell' && location.hostname === 'web.whatsapp.com' + && !!el?.closest?.('[data-testid="chat-list"]'); + const safeRole = !role || ['generic', 'listitem', 'row'].includes(role) || whatsappChatCell; let blockedReason = ''; if (isEditable) blockedReason = 'editable targets must not be auto-clicked twice'; else if (tag === 'select') blockedReason = 'native select controls must use keyboard selection'; @@ -7864,6 +7870,19 @@ } const nativeWhatsappComposer = location.hostname === 'web.whatsapp.com' && layoutCandidate?.matches?.('[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); + // A row of WhatsApp's own chat list (the rows the native contact check + // reads), clicked on the row itself and not on its menu, link or + // another control nested in it. + const nativeWhatsappChatListRow = clicked => { + if (!clicked || editable(clicked)) return false; + const row = clicked.closest?.('[role="row"]'); + if (!row || !row.closest?.('[data-testid="chat-list"]') || !visible(row) + || row.querySelectorAll('[data-testid="cell-frame-title"]').length !== 1) return false; + const nested = clicked.closest?.('a[href],button,input,select,textarea,summary,[contenteditable="true"],' + + '[contenteditable=""],[role="button"],[role="link"],[role="menuitem"],[role="checkbox"],[role="radio"],' + + '[role="switch"],[role="combobox"],[role="textbox"],[aria-haspopup],[onclick],[data-action]'); + return !nested || !row.contains(nested); + }; if (nativeWhatsappComposer && nativeLayoutContext?.service !== 'whatsapp-self') { const repair = window.__wb_get_native_whatsapp_repair?.(); if (!observationOnly && tool === 'click_ax' && targetResolved @@ -7871,16 +7890,35 @@ return { success: true, messageSend: false, conclusive: true, composerAvailable: true, nativeWhatsappRepair: true, identityCandidates: [] }; } + // Opening another chat from the chat list sends nothing, and a request + // for a named person may have to leave the chat that was open when it + // started. Blocking it until the open chat's contact was confirmed + // left the agent no way to reach the right chat. The contact check + // then belongs to the chat that ends up open (see + // __wb_native_whatsapp_follow_selection). + if (!observationOnly && ['click', 'click_ax'].includes(tool) && targetResolved + && nativeWhatsappChatListRow(target)) { + if (params.bindDispatch === true && params.namedRecipientSelection === true) { + window.__wb_native_whatsapp_follow_selection?.(); + } + return { success: true, messageSend: false, conclusive: true, conversationSelection: true, + identityCandidates: [] }; + } if (nativeLayoutContext?.service !== 'whatsapp') { // No check left in this run: say so, rather than send the agent // after a header click that cannot help. const spent = !repair && window.__wb_native_whatsapp_repair_spent?.() === true; + // Otherwise name the exact control that confirms this chat's + // contact, so the agent can pass it on instead of "re-read and + // retry", which kept a model clicking Attach and the chat row. + const repairTarget = !spent && repair ? window.__wb_native_whatsapp_repair_guidance?.() || null : null; return { success: true, messageSend: observationOnly ? false : null, conclusive: false, composerAvailable: true, nativeWhatsappRepairAvailable: !!repair, ...(spent ? { nativeWhatsappRepairSpent: true } : {}), + ...(repairTarget ? { nativeWhatsappRepairTarget: repairTarget } : {}), reasonCode: spent ? 'native_whatsapp_contact_check_spent' : 'native_whatsapp_contact_binding_required', identityCandidates: [], error: spent - ? 'This run can no longer confirm a WhatsApp contact: its contact check belongs to the first chat it looked at, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' + ? 'This run can no longer confirm a WhatsApp contact: its one contact check belongs to the chat it first looked at or started checking, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' : 'Native WhatsApp contact identity needs a fresh guarded header click, its contact drawer phone, and closing that same drawer. No message or editor write was authorized.' }; } } diff --git a/src/chrome/src/offscreen/bonsai-worker.js b/src/chrome/src/offscreen/bonsai-worker.js index 18aa00c18b..49ed5c04a1 100644 --- a/src/chrome/src/offscreen/bonsai-worker.js +++ b/src/chrome/src/offscreen/bonsai-worker.js @@ -591,7 +591,7 @@ async function getTextRuntime({ localFilesOnly = false } = {}) { if (textRuntime) return textRuntime; if (textRuntimeLoadPromise) return textRuntimeLoadPromise; if (localFilesOnly && !await isTextModelReady()) { - throw new Error(`${WEBGPU_BONSAI27_MODEL_ID} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); + throw new Error(`${WEBGPU_BONSAI27_MODEL_ID} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); } textRuntimeLoadPromise = (async () => { const { createEngine: engineCreate, createChat: chatCreate } = await loadLibraries(); @@ -848,7 +848,7 @@ async function runText(payload, signal = null) { throwIfTextCancelled(signal); const modelId = assertBonsaiModel(payload?.modelId); if (!await isTextModelReady(modelId, payload?.dtype || WEBGPU_BONSAI27_DTYPE)) { - throw new Error(`${modelId} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); + throw new Error(`${modelId} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); } const runtime = await getTextRuntime({ localFilesOnly: true }); throwIfTextCancelled(signal); diff --git a/src/chrome/src/offscreen/inference-worker.js b/src/chrome/src/offscreen/inference-worker.js index af3c66f100..ab979fb3c6 100644 --- a/src/chrome/src/offscreen/inference-worker.js +++ b/src/chrome/src/offscreen/inference-worker.js @@ -771,7 +771,7 @@ async function enrichWebGpuExecutionError(error) { const suffix = [ details.length ? `GPU detail: ${details.join(' ')}` : '', adapter ? `Adapter: ${adapter}.` : '', - 'Close other GPU-heavy tabs/apps and retry with a short prompt; a retry restarts the on-device worker and re-creates the session from the cached download, it does not re-download. On repeated out-of-memory failures, lower the context window on the WebGPU card in Settings > Providers (16384 is a safe fallback for Compass Tiny v2.1). If it persists, this GPU/driver cannot execute this model with the current WebGPU runtime.', + 'Close other GPU-heavy tabs/apps and retry with a short prompt; a retry restarts the on-device worker and re-creates the session from the cached download, it does not re-download. On repeated out-of-memory failures, lower the context window on the WebGPU card in Providers (16384 is a safe fallback for Compass Tiny v2.1). If it persists, this GPU/driver cannot execute this model with the current WebGPU runtime.', ].filter(Boolean).join(' '); return new Error(`${error?.message || String(error)} ${suffix}`); } @@ -1807,7 +1807,7 @@ async function runMultimodalText(payload) { decoder_model_merged: 'q4', }; if (!await isTextModelReady(modelId, dtype)) { - throw new Error(`${modelId} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); + throw new Error(`${modelId} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); } const runtime = await getVisionRuntime(modelId, dtype, device, { localFilesOnly: true, @@ -1919,7 +1919,7 @@ async function runMultimodalDecision(payload, { isCancelled = () => false } = {} const request = normalizeDecisionRequest(payload); const dtype = payload?.dtype || { embed_tokens: 'fp16', vision_encoder: 'fp16', decoder_model_merged: 'q2f16' }; if (!await isTextModelReady(modelId, dtype)) { - throw new Error(`${modelId} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it first.`); + throw new Error(`${modelId} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it first.`); } const runtime = await getVisionRuntime(modelId, dtype, payload?.device || 'webgpu', { localFilesOnly: true, @@ -1997,7 +1997,7 @@ async function runMultimodalDecision(payload, { isCancelled = () => false } = {} const output = await bonsai2ContinuationLogits(runtime, prefix, cache, suffix.input_ids, { withHidden: true }); margins.push(output.logits[yesId] - output.logits[noId]); if (variant === 'probe' && !output.hidden) { - throw new Error('In-browser decisions need the updated Ternary Bonsai 2 2B Vision decoder. Download the model again in Settings > Providers > WebGPU.'); + throw new Error('In-browser decisions need the updated Ternary Bonsai 2 2B Vision decoder. Download the model again in Providers > WebGPU.'); } hidden.push(output.hidden); } @@ -2019,7 +2019,7 @@ async function runMultimodalDecision(payload, { isCancelled = () => false } = {} const probability = tinyAskGateProbability(modelId, margin, output.hidden); // Collecting training data needs only the margin and hidden state. if (probability === null && !(returnHidden && output.hidden)) { - throw new Error('The screenshot gate needs the updated Ternary Bonsai 2 2B Vision decoder. Download the model again in Settings > Providers > WebGPU.'); + throw new Error('The screenshot gate needs the updated Ternary Bonsai 2 2B Vision decoder. Download the model again in Providers > WebGPU.'); } answers[id] = { type: 'noul', @@ -2078,7 +2078,7 @@ async function runText(payload) { const usesLongOutputBudget = WEBGPU_LONG_OUTPUT_MODEL_IDS.has(modelId); const sampling = WEBGPU_TEXT_SAMPLING.get(modelId); if (!await isTextModelReady(modelId, dtype)) { - throw new Error(`${modelId} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); + throw new Error(`${modelId} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); } const runtime = await getTextRuntime(modelId, dtype, device, { localFilesOnly: true }); throwIfTextCancelled(requestKey); diff --git a/src/chrome/src/providers/d1-cache.js b/src/chrome/src/providers/d1-cache.js index a40fc2e419..e245e783dd 100644 --- a/src/chrome/src/providers/d1-cache.js +++ b/src/chrome/src/providers/d1-cache.js @@ -48,7 +48,7 @@ export async function readD1Manifest(directory, { download = false, signal } = { let bytes; try { bytes = new Uint8Array(await (await (await directory.getFileHandle('package-manifest.json')).getFile()).arrayBuffer()); } catch { - if (!download) throw new Error('Download D1 explicitly in Settings > Assistive Models > Decision models first.'); + if (!download) throw new Error('Download D1 explicitly in Providers > Decision first.'); const response = await fetch(d1BaseURL() + 'package-manifest.json', { credentials: 'omit', redirect: 'follow', signal }); if (!response.ok || Number(response.headers.get('content-length')) > 1024 * 1024) throw new Error('D1 package manifest download failed.'); bytes = new Uint8Array(await response.arrayBuffer()); diff --git a/src/chrome/src/providers/d1-config.js b/src/chrome/src/providers/d1-config.js index e63b7da196..8b6946ccca 100644 --- a/src/chrome/src/providers/d1-config.js +++ b/src/chrome/src/providers/d1-config.js @@ -1,7 +1,7 @@ export const D1_MODEL_ID = 'webbrain-one/d1-browser-decision-fp16'; export const D1_CONSENT_VERSION = 1; export const D1_CONSENT_KEY = 'd1WebgpuConsentVersion'; -// Set by Settings' Download and load (or Load, once cached), cleared by Unload, +// Set by the Providers page's Download and load (or Load, once cached), cleared by Unload, // Remove and switching D1 off there. While it is set, a decision that finds // the model unloaded (a browser restart, a discarded stalled session, a lost // GPU device) reloads the verified cache in the background; never downloads. diff --git a/src/chrome/src/providers/d1-diagnostic.js b/src/chrome/src/providers/d1-diagnostic.js index 6231ce1f85..18fc1997b5 100644 --- a/src/chrome/src/providers/d1-diagnostic.js +++ b/src/chrome/src/providers/d1-diagnostic.js @@ -3,8 +3,8 @@ import { validateSystemOneAnswers } from '../agent/systemone-judge.js'; import { D1_CONSENT_KEY, D1_CONSENT_VERSION } from './d1-config.js'; export async function evaluateD1LocalFixture({ fixture, sender, api, strictSecretMode, agent, client }) { - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); - if (sender?.id !== api.runtime.id || String(sender.url || '').split('#')[0] !== settingsUrl) throw new Error('Local D1 fixture tests are available only from extension Settings.'); + const providersUrl = api.runtime.getURL('src/ui/providers.html'); + if (sender?.id !== api.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== providersUrl) throw new Error('Local D1 fixture tests are available only from the extension Providers page.'); if (strictSecretMode) throw new Error('Decision requests are disabled in Strict Secret Mode.'); const stored = await api.storage.local.get(DECISION_SETTINGS_KEYS); if (stored.decisionProvider !== 'webgpu_d1' || resolveDecisionMode(stored) !== 'on' || stored[D1_CONSENT_KEY] !== D1_CONSENT_VERSION) throw new Error('Select, enable and explicitly consent to the local D1 provider before testing a fixture.'); diff --git a/src/chrome/src/providers/d1-worker.js b/src/chrome/src/providers/d1-worker.js index b222d751b3..9f50248713 100644 --- a/src/chrome/src/providers/d1-worker.js +++ b/src/chrome/src/providers/d1-worker.js @@ -73,7 +73,7 @@ const currentPackage = marker => marker?.revision === D1_RELEASE.revision && mar async function status() { if (transfer || runtime || loading || ['error', 'stopped'].includes(state.status)) { // An error or a stop leaves the verified cache in place (a lost GPU device - // after a good download, say); report it so Settings can retry with Load + // after a good download, say); report it so the Providers page can retry with Load // instead of falling back to a full download pass. const cached = !transfer && !runtime && !loading && currentPackage(await readyMarker()); return { ...state, ready: !!runtime, cached }; diff --git a/src/chrome/src/providers/fetch-with-fallback.js b/src/chrome/src/providers/fetch-with-fallback.js index eb3af162bf..a1790f2499 100644 --- a/src/chrome/src/providers/fetch-with-fallback.js +++ b/src/chrome/src/providers/fetch-with-fallback.js @@ -22,7 +22,7 @@ import { ensureOffscreen } from '../offscreen/ensure.js'; // Cloud providers (OpenAI / Anthropic / Gemini) start their SSE stream // within a couple seconds, so the higher default costs them nothing — // the timer only ever fires for genuinely stalled endpoints. Users bump -// or lower it via Settings → Display → "LLM request timeout". +// or lower it via Settings → Budgets → "LLM request timeout". // // Cached at module scope after a lazy first read, refreshed in-place // when the settings page writes a new value. Providers don't pass diff --git a/src/chrome/src/providers/manager.js b/src/chrome/src/providers/manager.js index 8b271ceb64..250fd99347 100644 --- a/src/chrome/src/providers/manager.js +++ b/src/chrome/src/providers/manager.js @@ -1955,7 +1955,7 @@ export class ProviderManager { ok: false, recoverable: true, code: 'vision_consent_required', - error: 'Enable local vision with “Use local fallback” in Settings first.', + error: 'Choose an in-browser vision model in Providers → Vision first.', visionStatus: readiness, }; } @@ -2074,7 +2074,7 @@ export class ProviderManager { if (nextProvider instanceof WebGPUProvider) { const download = await nextProvider.downloadStatus(); if (!download.ready) { - throw new Error(`Download ${webgpuModelDisplayName(nextProvider.model)} in Settings > Providers > WebGPU or Apocalypse Mode > WebGPU before selecting it for chat.`); + throw new Error(`Download ${webgpuModelDisplayName(nextProvider.model)} in Providers > WebGPU or Apocalypse Mode > WebGPU before selecting it for chat.`); } } this.activeProviderId = id; diff --git a/src/chrome/src/providers/oauth-claude.js b/src/chrome/src/providers/oauth-claude.js index d1f875a545..a89ac21abc 100644 --- a/src/chrome/src/providers/oauth-claude.js +++ b/src/chrome/src/providers/oauth-claude.js @@ -302,7 +302,7 @@ async function _doRefreshClaudeAccessToken() { export async function getClaudeAccessToken() { const stored = await chrome.storage.local.get([STORAGE_KEY]); const tokens = stored[STORAGE_KEY]; - if (!tokens?.accessToken) throw new Error('Not signed in to Claude. Open Settings → Claude (Pro/Max) → Sign in.'); + if (!tokens?.accessToken) throw new Error('Not signed in to Claude. Open Providers → Claude (Pro/Max) → Sign in.'); if (Date.now() >= tokens.expiresAt) { const refreshed = await refreshClaudeAccessToken(); return refreshed.accessToken; diff --git a/src/chrome/src/providers/oauth-subscriptions.js b/src/chrome/src/providers/oauth-subscriptions.js index 91cd8d781e..183aa0284f 100644 --- a/src/chrome/src/providers/oauth-subscriptions.js +++ b/src/chrome/src/providers/oauth-subscriptions.js @@ -252,7 +252,7 @@ function makeOAuthClient(def) { async function getAccessToken() { const stored = await chrome.storage.local.get([STORAGE_KEY]); const tokens = stored[STORAGE_KEY]; - if (!tokens?.accessToken) throw new Error(`Not signed in to ${def.label}. Open Settings and sign in.`); + if (!tokens?.accessToken) throw new Error(`Not signed in to ${def.label}. Open Providers and sign in.`); if (Date.now() >= tokens.expiresAt) return (await refresh()).accessToken; return tokens.accessToken; } diff --git a/src/chrome/src/providers/webgpu.js b/src/chrome/src/providers/webgpu.js index 66d61d2579..a827c4e0ce 100644 --- a/src/chrome/src/providers/webgpu.js +++ b/src/chrome/src/providers/webgpu.js @@ -206,7 +206,7 @@ export const WEBGPU_SELECTABLE_MODEL_PRESETS = Object.freeze(WEBGPU_PICKER_MODEL // The preset with a trained decision probe (src/chrome/src/offscreen/bonsai-decision-probe.js). export const WEBGPU_DECISION_MODEL_ID = WEBGPU_BONSAI2_VL_2B_MODEL_ID; export const WEBGPU_DECISION_MODEL_IDS = new Set([WEBGPU_DECISION_MODEL_ID]); -export const WEBGPU_MODEL_NOT_READY_ERROR = `${WEBGPU_COMPASS_TINY_V2_MODEL_ID} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`; +export const WEBGPU_MODEL_NOT_READY_ERROR = `${WEBGPU_COMPASS_TINY_V2_MODEL_ID} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`; // Chrome-only selection state. Keep this separate from the synced // `visionModel` endpoint so enabling the fallback never overwrites a user's // remote vision credentials or sends a Chromium-only provider type to Firefox. @@ -223,7 +223,7 @@ export const WEBGPU_VISION_CONSENT_VERSION = 2; // Which in-browser model reads screenshots (Chrome-local, never synced or // exported: Firefox has no WebGPU runtime). Auto follows Ternary Bonsai 2 2B // Vision: on once it is downloaded, off until then. Neither choice starts a -// download; that always takes a click in Settings or Apocalypse Mode. +// download; that always takes a click in Providers or Apocalypse Mode. export const WEBGPU_VISION_CHOICE_KEY = 'webgpuVisionChoice'; export const WEBGPU_VISION_CHOICE_AUTO = 'auto'; export const WEBGPU_VISION_CHOICE_BONSAI = 'bonsai'; @@ -505,11 +505,11 @@ export class WebGPUProvider extends WebGPUOffscreenProvider { async chat(messages, options = {}) { if (options.signal?.aborted) throw responseAbortError(options.signal); if (this._messagesContainImage(messages) && !this.supportsVision) { - throw new Error('The WebGPU chat model is text-only. Configure a separate model under Settings -> Multimodal for screenshots.'); + throw new Error('The WebGPU chat model is text-only. Configure a separate model under Providers -> Vision for screenshots.'); } const download = await this.downloadStatus(); if (!download.ready) { - throw new Error(`${webgpuModelDisplayName(this.model)} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); + throw new Error(`${webgpuModelDisplayName(this.model)} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it before chatting.`); } // A caller that can abort gets a key the worker can use to interrupt this generation. const signal = options.signal || null; @@ -565,7 +565,7 @@ export class WebGPUProvider extends WebGPUOffscreenProvider { stopIfAborted(); const download = await this.downloadStatus(); if (!download.ready) { - throw new Error(`${webgpuModelDisplayName(this.model)} is not downloaded. Open Settings > Providers > WebGPU or Apocalypse Mode > WebGPU to download it first.`); + throw new Error(`${webgpuModelDisplayName(this.model)} is not downloaded. Open Providers > WebGPU or Apocalypse Mode > WebGPU to download it first.`); } const prefillSliceTokens = await this._prefillSliceTokens(); stopIfAborted(); @@ -729,7 +729,7 @@ export class WebGPUVisionProvider extends WebGPUOffscreenProvider { ]); if (stored[WEBGPU_VISION_ENABLED_KEY] !== true || stored[WEBGPU_VISION_CONSENT_VERSION_KEY] !== WEBGPU_VISION_CONSENT_VERSION) { - const error = new Error('The local Vision Model is disabled. Enable it explicitly in Settings before using screenshots.'); + const error = new Error('The local Vision Model is disabled. Enable it explicitly in Providers → Vision before using screenshots.'); error.code = 'vision_model_disabled'; throw error; } diff --git a/src/chrome/src/safesocial/background.js b/src/chrome/src/safesocial/background.js index a4507a45f7..ddd6ab3892 100644 --- a/src/chrome/src/safesocial/background.js +++ b/src/chrome/src/safesocial/background.js @@ -3,7 +3,8 @@ import { SETTINGS_KEY, CACHE_NAME, normalizeSettings, isInstagramUrl, isMediaUrl export function installSafeSocialBackground(api, runHost) { let generation = 0; let transition = Promise.resolve(); - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); + // SafeSocial is managed from its tab on the Providers page. + const providersUrl = api.runtime.getURL('src/ui/providers.html'); api.storage.onChanged.addListener((changes, area) => { if (area !== 'local' || !changes[SETTINGS_KEY]) return; generation++; @@ -14,7 +15,7 @@ export function installSafeSocialBackground(api, runHost) { }); async function handle(message, sender) { if (sender.id !== api.runtime.id) throw new Error('Invalid classifier caller.'); - const trustedSettings = String(sender.url || '').split(/[?#]/)[0] === settingsUrl; + const trustedSettings = String(sender.url || '').split(/[?#]/)[0] === providersUrl; if (message.command === 'classify') { if (!sender.tab || sender.frameId !== 0 || !isInstagramUrl(sender.url) || !isMediaUrl(message.url)) { throw new Error('Classifier is limited to Instagram images.'); diff --git a/src/chrome/src/ui/apocalypse-mode.js b/src/chrome/src/ui/apocalypse-mode.js index e577d07638..0acc6a4b53 100644 --- a/src/chrome/src/ui/apocalypse-mode.js +++ b/src/chrome/src/ui/apocalypse-mode.js @@ -556,7 +556,7 @@ async function runVisionDownloadAction(action) { if (path === 'bonsai') return runBonsaiVisionAction(action); if (path !== 'webbrain-vl') return; if ((action === 'start' || action === 'resume') && !visionFallbackExplicitlyEnabled) { - globalThis.location.href = runtimeApi.runtime.getURL('src/ui/settings.html#multimodal'); + globalThis.location.href = runtimeApi.runtime.getURL('src/ui/providers.html#vision'); return; } const actionMap = { diff --git a/src/chrome/src/ui/captcha-settings.js b/src/chrome/src/ui/captcha-settings.js index 1565a1c269..937d41c00d 100644 --- a/src/chrome/src/ui/captcha-settings.js +++ b/src/chrome/src/ui/captcha-settings.js @@ -6,7 +6,16 @@ export async function initCaptchaSettings(storage, sendToBackground, t) { const card = document.getElementById('captcha-card'); if (!card) return; card.hidden = managed; - if (managed) return; + if (managed) { + // A managed browser solves through WebBrain Cloud and has no keys to set + // here, so its CAPTCHA tab steps aside and a deep link lands on General. + const tab = document.querySelector('.tab-btn[data-tab="captcha"]'); + if (tab) { + tab.hidden = true; + if (tab.classList.contains('active')) document.querySelector('.tab-btn[data-tab="display"]')?.click(); + } + return; + } for (const provider of CAPTCHA_PROVIDERS) { const id = provider.domId; const typeLabels = { recaptcha_v2: 'reCAPTCHA v2', recaptcha_v2_enterprise: 'reCAPTCHA v2 Enterprise', diff --git a/src/chrome/src/ui/d1-settings.js b/src/chrome/src/ui/d1-settings.js index 456d6f2e00..db2adfe0d8 100644 --- a/src/chrome/src/ui/d1-settings.js +++ b/src/chrome/src/ui/d1-settings.js @@ -3,6 +3,8 @@ import { t } from './i18n.js'; export function initD1Settings(send) { const provider = document.getElementById('decision-provider'), controls = document.getElementById('d1-controls'), line = document.getElementById('d1-status'), consent = document.getElementById('d1-consent'); + // The decision card is on providers.html; the other settings pages have nothing to wire. + if (!provider || !controls) return async () => {}; let timer = null, busy = false; const show = async () => { const selected = provider.value === 'webgpu_d1'; controls.hidden = !selected; diff --git a/src/chrome/src/ui/locales/apocalypse-copy.mjs b/src/chrome/src/ui/locales/apocalypse-copy.mjs index 1b99b1186c..09f4a8c8e3 100644 --- a/src/chrome/src/ui/locales/apocalypse-copy.mjs +++ b/src/chrome/src/ui/locales/apocalypse-copy.mjs @@ -38,7 +38,7 @@ const englishApocalypseModeCopy = { 'ap.models.status.error': 'Error', 'ap.models.remove': 'Remove', 'ap.models.confirm_remove': 'Remove the {model} and its cached files? You will need to download it again to use it offline.', - 'ap.vision.auto': 'Local vision is optional and never downloads on its own. WebBrain VL 2 450M first needs your consent in Settings → Assistive Models → Vision.', + 'ap.vision.auto': 'Local vision is optional and never downloads on its own. WebBrain VL 2 450M first needs your consent in Providers → Vision.', 'ap.vision.waiting': 'Disabled until you explicitly enable local vision', 'ap.vision.text_model_sees': 'Your Text Model, Ternary Bonsai 2 2B Vision, already reads images. No extra download.', 'ap.enabled': 'Enabled', diff --git a/src/chrome/src/ui/locales/apocalypse-translations.mjs b/src/chrome/src/ui/locales/apocalypse-translations.mjs index e10c43599e..c820a6344e 100644 --- a/src/chrome/src/ui/locales/apocalypse-translations.mjs +++ b/src/chrome/src/ui/locales/apocalypse-translations.mjs @@ -16,7 +16,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Conocimiento sin conexión bajo tu control", "ap.hero.desc": "Configura los cuatro elementos esenciales para el chat local privado: un modelo de texto, un modelo de visión, una edición de Wikipedia sin conexión y la Caja de Emergencia.", "ap.hero.consent": "Al activar este modo se inician las descargas del modelo de texto y de la pequeña Wikipedia en inglés simple. La visión local sigue siendo opcional y debe habilitarse por separado.", - "ap.vision.auto": "La visión local es opcional y nunca se descarga sola. WebBrain VL 2 450M necesita antes tu consentimiento en Ajustes → Modelos auxiliares → Visión.", + "ap.vision.auto": "La visión local es opcional y nunca se descarga sola. WebBrain VL 2 450M necesita antes tu consentimiento en Proveedores → Visión.", "ap.vision.waiting": "Desactivada hasta que habilites explícitamente la visión local", "ap.vision.text_model_sees": "Tu modelo de texto, Ternary Bonsai 2 2B Vision, ya lee imágenes. Sin descarga adicional.", "ap.enabled": "Activado", @@ -143,7 +143,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Connaissance hors ligne, sous votre contrôle", "ap.hero.desc": "Configurez les quatre éléments essentiels du chat local privé : un modèle de texte, un modèle de vision, une édition hors ligne de Wikipédia et la Boîte d'urgence.", "ap.hero.consent": "L’activation de ce mode lance les téléchargements du modèle de texte et de la petite Wikipédia en anglais simple. La vision locale reste facultative et doit être activée séparément.", - "ap.vision.auto": "La vision locale est facultative et ne se télécharge jamais d’elle-même. WebBrain VL 2 450M demande d’abord votre consentement dans Paramètres → Modèles auxiliaires → Vision.", + "ap.vision.auto": "La vision locale est facultative et ne se télécharge jamais d’elle-même. WebBrain VL 2 450M demande d’abord votre consentement dans Fournisseurs → Vision.", "ap.vision.waiting": "Désactivée jusqu’à l’activation explicite de la vision locale", "ap.vision.text_model_sees": "Votre modèle de texte, Ternary Bonsai 2 2B Vision, lit déjà les images. Aucun téléchargement supplémentaire.", "ap.enabled": "Activé", @@ -270,7 +270,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Kendi kontrolünüzde çevrimdışı bilgi", "ap.hero.desc": "Özel yerel sohbet için dört temel bileşeni kurun: Metin Modeli, Görüntü Modeli, bir çevrimdışı Vikipedi sürümü ve Acil Durum Kutusu.", "ap.hero.consent": "Bu modu açmak Metin Modeli ve küçük Basit İngilizce Vikipedi indirmelerini başlatır. Yerel görüntü işleme isteğe bağlı kalır ve ayrıca etkinleştirilmelidir.", - "ap.vision.auto": "Yerel görme isteğe bağlıdır ve kendiliğinden hiçbir şey indirmez. WebBrain VL 2 450M için önce Ayarlar → Yardımcı Modeller → Görme bölümünden onay vermeniz gerekir.", + "ap.vision.auto": "Yerel görme isteğe bağlıdır ve kendiliğinden hiçbir şey indirmez. WebBrain VL 2 450M için önce Sağlayıcılar → Görme bölümünden onay vermeniz gerekir.", "ap.vision.waiting": "Yerel görüntü işlemeyi açıkça etkinleştirene kadar devre dışı", "ap.vision.text_model_sees": "Metin modeliniz Ternary Bonsai 2 2B Vision zaten görüntü okuyabiliyor. Ek indirme gerekmez.", "ap.enabled": "Etkin", @@ -397,7 +397,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "由您掌控的离线知识", "ap.hero.desc": "设置私人本地聊天所需的四项核心内容:文本模型、视觉模型、一个离线维基百科版本和应急箱。", "ap.hero.consent": "开启此模式会开始下载文本模型和较小的简明英语维基百科。本地视觉仍为可选功能,必须单独启用。", - "ap.vision.auto": "本地视觉是可选的,绝不会自行下载。WebBrain VL 2 450M 需要先在“设置 → 辅助模型 → 视觉”中获得你的同意。", + "ap.vision.auto": "本地视觉是可选的,绝不会自行下载。WebBrain VL 2 450M 需要先在“提供商 → 视觉”中获得你的同意。", "ap.vision.waiting": "在您明确启用本地视觉之前保持禁用", "ap.vision.text_model_sees": "你的文本模型 Ternary Bonsai 2 2B Vision 已经能读取图像,无需额外下载。", "ap.enabled": "已启用", @@ -524,7 +524,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Офлайн-знания под вашим контролем", "ap.hero.desc": "Настройте четыре основных компонента для приватного локального чата: текстовую модель, модель компьютерного зрения, одну офлайн-версию Википедии и Аварийный ящик.", "ap.hero.consent": "Включение этого режима запускает загрузку текстовой модели и уменьшенной Википедии на упрощённом английском. Локальное зрение остаётся необязательным и включается отдельно.", - "ap.vision.auto": "Локальное зрение необязательно и никогда не загружается само. Для WebBrain VL 2 450M сначала нужно ваше согласие в разделе Настройки → Вспомогательные модели → Зрение.", + "ap.vision.auto": "Локальное зрение необязательно и никогда не загружается само. Для WebBrain VL 2 450M сначала нужно ваше согласие в разделе Провайдеры → Зрение.", "ap.vision.waiting": "Отключено, пока вы явно не включите локальное зрение", "ap.vision.text_model_sees": "Ваша текстовая модель Ternary Bonsai 2 2B Vision уже читает изображения. Дополнительная загрузка не нужна.", "ap.enabled": "Включено", @@ -651,7 +651,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Офлайн знання під вашим контролем", "ap.hero.desc": "Налаштуйте чотири основні компоненти для приватного локального чату: текстову модель, модель комп’ютерного зору, одну офлайн-версію Вікіпедії та Аварійну скриньку.", "ap.hero.consent": "Увімкнення цього режиму запускає завантаження текстової моделі та меншої Вікіпедії спрощеною англійською. Локальний зір залишається необов’язковим і вмикається окремо.", - "ap.vision.auto": "Локальний зір необов’язковий і ніколи не завантажується сам. Для WebBrain VL 2 450M спершу потрібна ваша згода в розділі Налаштування → Допоміжні моделі → Зір.", + "ap.vision.auto": "Локальний зір необов’язковий і ніколи не завантажується сам. Для WebBrain VL 2 450M спершу потрібна ваша згода в розділі Провайдери → Зір.", "ap.vision.waiting": "Вимкнено, доки ви явно не ввімкнете локальний зір", "ap.vision.text_model_sees": "Ваша текстова модель Ternary Bonsai 2 2B Vision уже читає зображення. Додаткове завантаження не потрібне.", "ap.enabled": "Увімкнено", @@ -778,7 +778,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "معرفة دون اتصال، تحت سيطرتك", "ap.hero.desc": "أعِدّ العناصر الأساسية الأربعة للدردشة المحلية الخاصة: نموذج نص، ونموذج رؤية، وإصدار واحد من ويكيبيديا دون اتصال، وصندوق الطوارئ.", "ap.hero.consent": "يؤدي تشغيل هذا الوضع إلى بدء تنزيل نموذج النص ونسخة ويكيبيديا الأصغر باللغة الإنجليزية المبسطة. تظل الرؤية المحلية اختيارية ويجب تفعيلها بشكل منفصل.", - "ap.vision.auto": "الرؤية المحلية اختيارية ولا تُنزَّل من تلقاء نفسها أبدًا. أما WebBrain VL 2 450M فيحتاج أولًا إلى موافقتك من الإعدادات ← النماذج المساعدة ← الرؤية.", + "ap.vision.auto": "الرؤية المحلية اختيارية ولا تُنزَّل من تلقاء نفسها أبدًا. أما WebBrain VL 2 450M فيحتاج أولًا إلى موافقتك من المزوّدون ← الرؤية.", "ap.vision.waiting": "معطلة حتى تفعّل الرؤية المحلية صراحةً", "ap.vision.text_model_sees": "نموذج النص لديك، Ternary Bonsai 2 2B Vision، يقرأ الصور بالفعل. لا حاجة إلى تنزيل إضافي.", "ap.enabled": "مفعّل", @@ -905,7 +905,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "あなたの制御下のオフライン知識", "ap.hero.desc": "プライベートなローカルチャットに必要な4つの要素(テキストモデル、ビジョンモデル、オフライン版ウィキペディア1つ、緊急ボックス)をセットアップします。", "ap.hero.consent": "このモードを有効にすると、テキストモデルと小容量のシンプル英語版ウィキペディアのダウンロードが始まります。ローカル画像認識は任意で、別途有効にする必要があります。", - "ap.vision.auto": "ローカルの画像認識は任意で、勝手にダウンロードされることはありません。WebBrain VL 2 450M は先に「設定 → 補助モデル → 画像認識」で同意が必要です。", + "ap.vision.auto": "ローカルの画像認識は任意で、勝手にダウンロードされることはありません。WebBrain VL 2 450M は先に「プロバイダー → 画像認識」で同意が必要です。", "ap.vision.waiting": "ローカル画像認識を明示的に有効にするまで無効", "ap.vision.text_model_sees": "テキストモデルの Ternary Bonsai 2 2B Vision はすでに画像を読み取れます。追加のダウンロードは不要です。", "ap.enabled": "有効", @@ -1032,7 +1032,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "사용자 통제 하에 오프라인 지식", "ap.hero.desc": "개인 로컬 채팅에 필요한 네 가지 핵심 요소인 텍스트 모델, 비전 모델, 오프라인 위키백과 버전 하나, 비상 상자를 설정하세요.", "ap.hero.consent": "이 모드를 켜면 텍스트 모델과 용량이 작은 쉬운 영어 위키백과 다운로드가 시작됩니다. 로컬 비전은 선택 사항이며 별도로 활성화해야 합니다.", - "ap.vision.auto": "로컬 비전은 선택 사항이며 스스로 다운로드되지 않습니다. WebBrain VL 2 450M는 먼저 설정 → 보조 모델 → 비전에서 동의해야 합니다.", + "ap.vision.auto": "로컬 비전은 선택 사항이며 스스로 다운로드되지 않습니다. WebBrain VL 2 450M는 먼저 제공자 → 비전에서 동의해야 합니다.", "ap.vision.waiting": "로컬 비전을 명시적으로 활성화할 때까지 비활성화됨", "ap.vision.text_model_sees": "텍스트 모델인 Ternary Bonsai 2 2B Vision가 이미 이미지를 읽습니다. 추가 다운로드가 필요 없습니다.", "ap.enabled": "활성화", @@ -1159,7 +1159,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Pengetahuan offline, di bawah kendali Anda", "ap.hero.desc": "Siapkan empat komponen penting untuk obrolan lokal pribadi: Model Teks, Model Visi, satu edisi Wikipedia offline, dan Kotak Darurat.", "ap.hero.consent": "Mengaktifkan mode ini memulai unduhan Model Teks dan Wikipedia Bahasa Inggris Sederhana berukuran kecil. Visi lokal tetap opsional dan harus diaktifkan secara terpisah.", - "ap.vision.auto": "Visi lokal bersifat opsional dan tidak pernah mengunduh sendiri. WebBrain VL 2 450M memerlukan persetujuan Anda terlebih dahulu di Pengaturan → Model Pendukung → Visi.", + "ap.vision.auto": "Visi lokal bersifat opsional dan tidak pernah mengunduh sendiri. WebBrain VL 2 450M memerlukan persetujuan Anda terlebih dahulu di Penyedia → Visi.", "ap.vision.waiting": "Dinonaktifkan sampai Anda mengaktifkan visi lokal secara eksplisit", "ap.vision.text_model_sees": "Model teks Anda, Ternary Bonsai 2 2B Vision, sudah bisa membaca gambar. Tidak perlu unduhan tambahan.", "ap.enabled": "Aktif", @@ -1286,7 +1286,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "ความรู้แบบออฟไลน์ ภายใต้การควบคุมของคุณ", "ap.hero.desc": "ตั้งค่าองค์ประกอบสำคัญสี่อย่างสำหรับแชทส่วนตัวในเครื่อง ได้แก่ โมเดลข้อความ โมเดลการมองเห็น วิกิพีเดียออฟไลน์หนึ่งฉบับ และกล่องฉุกเฉิน", "ap.hero.consent": "การเปิดโหมดนี้จะเริ่มดาวน์โหลดโมเดลข้อความและวิกิพีเดียภาษาอังกฤษแบบง่ายฉบับขนาดเล็ก การมองเห็นในเครื่องยังคงเป็นตัวเลือกและต้องเปิดใช้แยกต่างหาก", - "ap.vision.auto": "การมองเห็นในเครื่องเป็นตัวเลือกเสริมและไม่ดาวน์โหลดเอง ส่วน WebBrain VL 2 450M ต้องได้รับความยินยอมจากคุณก่อนใน การตั้งค่า → โมเดลเสริม → การมองเห็น", + "ap.vision.auto": "การมองเห็นในเครื่องเป็นตัวเลือกเสริมและไม่ดาวน์โหลดเอง ส่วน WebBrain VL 2 450M ต้องได้รับความยินยอมจากคุณก่อนใน ผู้ให้บริการ → การมองเห็น", "ap.vision.waiting": "ปิดใช้งานจนกว่าคุณจะเปิดการมองเห็นในเครื่องอย่างชัดเจน", "ap.vision.text_model_sees": "โมเดลข้อความของคุณ Ternary Bonsai 2 2B Vision อ่านภาพได้อยู่แล้ว ไม่ต้องดาวน์โหลดเพิ่ม", "ap.enabled": "เปิดใช้งาน", @@ -1413,7 +1413,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Pengetahuan luar talian, di bawah kawalan anda", "ap.hero.desc": "Sediakan empat komponen penting untuk sembang setempat peribadi: Model Teks, Model Penglihatan, satu edisi Wikipedia luar talian dan Kotak Kecemasan.", "ap.hero.consent": "Mengaktifkan mod ini memulakan muat turun Model Teks dan Wikipedia Bahasa Inggeris Mudah yang kecil. Penglihatan setempat kekal pilihan dan mesti didayakan secara berasingan.", - "ap.vision.auto": "Penglihatan setempat adalah pilihan dan tidak pernah dimuat turun dengan sendirinya. WebBrain VL 2 450M memerlukan persetujuan anda dahulu dalam Tetapan → Model Bantuan → Penglihatan.", + "ap.vision.auto": "Penglihatan setempat adalah pilihan dan tidak pernah dimuat turun dengan sendirinya. WebBrain VL 2 450M memerlukan persetujuan anda dahulu dalam Pembekal → Penglihatan.", "ap.vision.waiting": "Dilumpuhkan sehingga anda mendayakan penglihatan setempat secara jelas", "ap.vision.text_model_sees": "Model Teks anda, Ternary Bonsai 2 2B Vision, sudah boleh membaca imej. Tiada muat turun tambahan.", "ap.enabled": "Dikesan", @@ -1540,7 +1540,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline na kaalaman, nasa iyong kontrol", "ap.hero.desc": "I-set up ang apat na mahalagang bahagi para sa pribadong lokal na chat: Text Model, Vision Model, isang offline na edisyon ng Wikipedia, at ang Kahon ng Emergency.", "ap.hero.consent": "Ang pag-enable sa mode na ito ay magsisimula sa pag-download ng Text Model at maliit na Simple English Wikipedia. Opsyonal ang lokal na vision at kailangang i-enable nang hiwalay.", - "ap.vision.auto": "Opsyonal ang lokal na vision at hindi kusang nagda-download. Kailangan muna ng WebBrain VL 2 450M ang iyong pahintulot sa Mga Setting → Mga Pantulong na Modelo → Bisyon.", + "ap.vision.auto": "Opsyonal ang lokal na vision at hindi kusang nagda-download. Kailangan muna ng WebBrain VL 2 450M ang iyong pahintulot sa Mga Provider → Bisyon.", "ap.vision.waiting": "Naka-disable hanggang tahasan mong i-enable ang lokal na vision", "ap.vision.text_model_sees": "Nakakabasa na ng mga larawan ang iyong Text Model na Ternary Bonsai 2 2B Vision. Walang dagdag na download.", "ap.enabled": "Naka-enable", @@ -1667,7 +1667,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline wiedza, pod Twoją kontrolą", "ap.hero.desc": "Skonfiguruj cztery podstawowe elementy prywatnego czatu lokalnego: model tekstowy, model wizyjny, jedną wersję Wikipedii offline i Skrzynkę awaryjną.", "ap.hero.consent": "Włączenie tego trybu rozpoczyna pobieranie modelu tekstowego i małej Wikipedii w uproszczonym angielskim. Lokalna wizja pozostaje opcjonalna i wymaga osobnego włączenia.", - "ap.vision.auto": "Lokalna wizja jest opcjonalna i nigdy nie pobiera się sama. WebBrain VL 2 450M wymaga najpierw Twojej zgody w Ustawienia → Modele pomocnicze → Wizja.", + "ap.vision.auto": "Lokalna wizja jest opcjonalna i nigdy nie pobiera się sama. WebBrain VL 2 450M wymaga najpierw Twojej zgody w Dostawcy → Wizja.", "ap.vision.waiting": "Wyłączona do czasu jawnego włączenia lokalnej wizji", "ap.vision.text_model_sees": "Twój model tekstowy, Ternary Bonsai 2 2B Vision, już czyta obrazy. Bez dodatkowego pobierania.", "ap.enabled": "Włączone", @@ -1794,7 +1794,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "ידע לא מקוון בשליטתך", "ap.hero.desc": "הגדירו את ארבעת הרכיבים החיוניים לצ׳אט מקומי ופרטי: מודל טקסט, מודל ראייה, מהדורת ויקיפדיה אחת לשימוש לא מקוון וקופסת חירום.", "ap.hero.consent": "הפעלת מצב זה מתחילה את הורדות מודל הטקסט וויקיפדיה הקטנה יותר באנגלית פשוטה. הראייה המקומית נשארת אופציונלית ויש להפעיל אותה בנפרד.", - "ap.vision.auto": "ראייה מקומית היא אופציונלית ואף פעם לא מורדת מעצמה. WebBrain VL 2 450M דורש קודם את הסכמתכם בהגדרות ← מודלים מסייעים ← ראייה.", + "ap.vision.auto": "ראייה מקומית היא אופציונלית ואף פעם לא מורדת מעצמה. WebBrain VL 2 450M דורש קודם את הסכמתכם בספקים ← ראייה.", "ap.vision.waiting": "מושבת עד שתפעילו במפורש את הראייה המקומית", "ap.vision.text_model_sees": "מודל הטקסט שלכם, Ternary Bonsai 2 2B Vision, כבר קורא תמונות. אין צורך בהורדה נוספת.", "ap.enabled": "מופעל", @@ -1921,7 +1921,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "आपके नियंत्रण में ऑफ़लाइन ज्ञान", "ap.hero.desc": "निजी स्थानीय चैट के लिए चार आवश्यक चीज़ें सेट अप करें: टेक्स्ट मॉडल, विज़न मॉडल, विकिपीडिया का एक ऑफ़लाइन संस्करण और आपातकालीन बॉक्स।", "ap.hero.consent": "इस मोड को चालू करने पर टेक्स्ट मॉडल और छोटे सरल अंग्रेज़ी विकिपीडिया का डाउनलोड शुरू होता है। स्थानीय विज़न वैकल्पिक रहता है और इसे अलग से सक्षम करना होगा।", - "ap.vision.auto": "स्थानीय विज़न वैकल्पिक है और अपने आप कभी डाउनलोड नहीं होता। WebBrain VL 2 450M के लिए पहले सेटिंग्स → सहायक मॉडल → दृष्टि में आपकी सहमति चाहिए।", + "ap.vision.auto": "स्थानीय विज़न वैकल्पिक है और अपने आप कभी डाउनलोड नहीं होता। WebBrain VL 2 450M के लिए पहले प्रदाता → दृष्टि में आपकी सहमति चाहिए।", "ap.vision.waiting": "जब तक आप स्थानीय विज़न को स्पष्ट रूप से सक्षम न करें, तब तक अक्षम", "ap.vision.text_model_sees": "आपका टेक्स्ट मॉडल, Ternary Bonsai 2 2B Vision, पहले से इमेज पढ़ता है। कोई अतिरिक्त डाउनलोड नहीं।", "ap.enabled": "सक्षम", @@ -2048,7 +2048,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Conhecimento offline, sob seu controle", "ap.hero.desc": "Configure os quatro elementos essenciais para um bate-papo local e privado: um Modelo de Texto, um Modelo de Visão, uma edição offline da Wikipédia e a Caixa de Emergência.", "ap.hero.consent": "Ativar este modo inicia os downloads do Modelo de Texto e da Wikipédia pequena em inglês simples. A visão local continua opcional e deve ser ativada separadamente.", - "ap.vision.auto": "A visão local é opcional e nunca é baixada sozinha. O WebBrain VL 2 450M precisa antes do seu consentimento em Configurações → Modelos auxiliares → Visão.", + "ap.vision.auto": "A visão local é opcional e nunca é baixada sozinha. O WebBrain VL 2 450M precisa antes do seu consentimento em Provedores → Visão.", "ap.vision.waiting": "Desativada até você ativar explicitamente a visão local", "ap.vision.text_model_sees": "Seu modelo de texto, Ternary Bonsai 2 2B Vision, já lê imagens. Sem download extra.", "ap.enabled": "Ativado", @@ -2175,7 +2175,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Kiến thức ngoại tuyến, dưới sự kiểm soát của bạn", "ap.hero.desc": "Thiết lập bốn thành phần thiết yếu cho trò chuyện cục bộ riêng tư: Mô hình Văn bản, Mô hình Thị giác, một phiên bản Wikipedia ngoại tuyến và Hộp Khẩn Cấp.", "ap.hero.consent": "Bật chế độ này sẽ bắt đầu tải Mô hình Văn bản và Wikipedia tiếng Anh đơn giản dung lượng nhỏ. Thị giác cục bộ vẫn là tùy chọn và phải được bật riêng.", - "ap.vision.auto": "Thị giác cục bộ là tùy chọn và không bao giờ tự tải về. WebBrain VL 2 450M cần bạn đồng ý trước trong Cài đặt → Mô hình hỗ trợ → Tầm nhìn.", + "ap.vision.auto": "Thị giác cục bộ là tùy chọn và không bao giờ tự tải về. WebBrain VL 2 450M cần bạn đồng ý trước trong Nhà cung cấp → Tầm nhìn.", "ap.vision.waiting": "Bị tắt cho đến khi bạn bật rõ ràng thị giác cục bộ", "ap.vision.text_model_sees": "Mô hình văn bản của bạn, Ternary Bonsai 2 2B Vision, đã đọc được hình ảnh. Không cần tải thêm.", "ap.enabled": "Đã bật", @@ -2302,7 +2302,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "আপনার নিয়ন্ত্রণে অফলাইন জ্ঞান", "ap.hero.desc": "ব্যক্তিগত স্থানীয় চ্যাটের জন্য চারটি অপরিহার্য উপাদান সেট আপ করুন: টেক্সট মডেল, ভিশন মডেল, উইকিপিডিয়ার একটি অফলাইন সংস্করণ এবং জরুরি বাক্স।", "ap.hero.consent": "এই মোড চালু করলে টেক্সট মডেল ও ছোট সহজ ইংরেজি উইকিপিডিয়ার ডাউনলোড শুরু হয়। স্থানীয় ভিশন ঐচ্ছিক থাকে এবং আলাদাভাবে চালু করতে হয়।", - "ap.vision.auto": "লোকাল ভিশন ঐচ্ছিক এবং কখনও নিজে থেকে ডাউনলোড হয় না। WebBrain VL 2 450M-এর জন্য আগে সেটিংস → সহায়ক মডেল → দৃষ্টি-তে আপনার সম্মতি লাগবে।", + "ap.vision.auto": "লোকাল ভিশন ঐচ্ছিক এবং কখনও নিজে থেকে ডাউনলোড হয় না। WebBrain VL 2 450M-এর জন্য আগে প্রদানকারী → দৃষ্টি-তে আপনার সম্মতি লাগবে।", "ap.vision.waiting": "আপনি স্পষ্টভাবে স্থানীয় ভিশন চালু না করা পর্যন্ত নিষ্ক্রিয়", "ap.vision.text_model_sees": "আপনার টেক্সট মডেল Ternary Bonsai 2 2B Vision ইতিমধ্যে ছবি পড়তে পারে। বাড়তি ডাউনলোড লাগবে না।", "ap.enabled": "চালু", @@ -2429,7 +2429,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "دانش آفلاین، تحت کنترل شما", "ap.hero.desc": "چهار جزء ضروری برای چت خصوصی و محلی را راه‌اندازی کنید: مدل متن، مدل بینایی، یک نسخهٔ آفلاین ویکی‌پدیا و جعبهٔ اضطراری.", "ap.hero.consent": "روشن کردن این حالت، دانلود مدل متن و نسخهٔ کوچک ویکی‌پدیای انگلیسی ساده را آغاز می‌کند. بینایی محلی اختیاری است و باید جداگانه فعال شود.", - "ap.vision.auto": "بینایی محلی اختیاری است و هرگز خودبه‌خود دانلود نمی‌شود. WebBrain VL 2 450M ابتدا به رضایت شما در تنظیمات ← مدل‌های کمکی ← چشم انداز نیاز دارد.", + "ap.vision.auto": "بینایی محلی اختیاری است و هرگز خودبه‌خود دانلود نمی‌شود. WebBrain VL 2 450M ابتدا به رضایت شما در ارائه دهندگان ← چشم انداز نیاز دارد.", "ap.vision.waiting": "تا زمانی که بینایی محلی را صریحاً فعال نکنید، غیرفعال است", "ap.vision.text_model_sees": "مدل متنی شما، Ternary Bonsai 2 2B Vision، از قبل تصویر می‌خواند. دانلود اضافه لازم نیست.", "ap.enabled": "فعال", @@ -2556,7 +2556,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline-kennis onder uw controle", "ap.hero.desc": "Stel de vier essentiële onderdelen voor privé lokaal chatten in: een tekstmodel, een visiemodel, één offline Wikipedia-editie en de Noodbox.", "ap.hero.consent": "Als u deze modus inschakelt, starten de downloads van het tekstmodel en de kleine Simple English Wikipedia. Lokale visie blijft optioneel en moet apart worden ingeschakeld.", - "ap.vision.auto": "Lokale visie is optioneel en downloadt nooit vanzelf. Voor WebBrain VL 2 450M is eerst je toestemming nodig in Instellingen → Ondersteunende modellen → Visie.", + "ap.vision.auto": "Lokale visie is optioneel en downloadt nooit vanzelf. Voor WebBrain VL 2 450M is eerst je toestemming nodig in Providers → Visie.", "ap.vision.waiting": "Uitgeschakeld totdat u lokale visie expliciet inschakelt", "ap.vision.text_model_sees": "Je tekstmodel, Ternary Bonsai 2 2B Vision, leest al afbeeldingen. Geen extra download.", "ap.enabled": "Aan", @@ -2683,7 +2683,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline-Wissen unter Ihrer Kontrolle", "ap.hero.desc": "Richte die vier wesentlichen Komponenten für einen privaten lokalen Chat ein: ein Textmodell, ein Bildmodell, eine Offline-Ausgabe der Wikipedia und die Notfallbox.", "ap.hero.consent": "Beim Aktivieren dieses Modus starten die Downloads des Textmodells und der kleinen Simple-English-Wikipedia. Lokale Bilderkennung bleibt optional und muss separat aktiviert werden.", - "ap.vision.auto": "Lokale Bilderkennung ist optional und lädt nie von selbst herunter. WebBrain VL 2 450M braucht zuerst deine Zustimmung unter Einstellungen → Assistenzmodelle → Vision.", + "ap.vision.auto": "Lokale Bilderkennung ist optional und lädt nie von selbst herunter. WebBrain VL 2 450M braucht zuerst deine Zustimmung unter Anbieter → Vision.", "ap.vision.waiting": "Deaktiviert, bis du lokale Bilderkennung ausdrücklich aktivierst", "ap.vision.text_model_sees": "Dein Textmodell, Ternary Bonsai 2 2B Vision, liest bereits Bilder. Kein zusätzlicher Download.", "ap.enabled": "Aktiviert", diff --git a/src/chrome/src/ui/locales/ar.js b/src/chrome/src/ui/locales/ar.js index 3fe054623d..85cf014a8c 100644 --- a/src/chrome/src/ui/locales/ar.js +++ b/src/chrome/src/ui/locales/ar.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'تصغير واجهة الإضافة', 'sp.ui_scale.increase': 'تكبير واجهة الإضافة', 'sp.ui_scale.reset': 'إعادة الضبط', - 'st.display.ui_scale.label': 'تكبير واجهة الإضافة', - 'st.display.ui_scale.decrease': 'تصغير واجهة الإضافة', - 'st.display.ui_scale.increase': 'تكبير واجهة الإضافة', - 'st.display.ui_scale.reset': 'إعادة الضبط', - 'st.display.ui_scale.desc': 'غيّر حجم الشريط الجانبي ونافذة الدردشة المنفصلة دون تغيير تكبير صفحات الويب.', - 'st.display.ui_scale.shortcuts': 'اختصارات مخصصة: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'غير معيّنة', - 'st.display.ui_scale.manage_shortcuts': 'تخصيص الاختصارات', 'tool.delegate_research': 'جارٍ البحث باستخدام ChatGPT', 'st.display.research_escalation.label': 'تصعيد البحث', 'st.display.research_escalation.desc': 'عند التفعيل، قد يطلب WebBrain موافقتك قبل إرسال مطالبة بحثية معقدة للقراءة فقط إلى ChatGPT. معطّل افتراضيًا. لا تتم مشاركة المطالبة الدقيقة إلا بعد موافقتك الصريحة.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "عدم المتابعة", "sp.recipient.reason_unrequested": "لم يتمكن WebBrain من فهم أن طلبك يتضمن إرسال رسالة. المحادثة المفتوحة على {host} مع {recipient}.", "sp.recipient.reason_unnamed": "لم يتمكن WebBrain من فهم من يجب أن يتلقى هذه الرسالة من طلبك. المحادثة المفتوحة على {host} مع {recipient}.", - 'st.tab.permissions': "الأذونات", 'st.perms.revoke': "إلغاء", 'st.perms.clear_all': "مسح كل الأذونات", 'st.perms.gate.label': "السؤال قبل الإجراءات المهمة", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'ابدأ', 'ob.btn.skip': 'تخطي الآن', 'ob.btn.start': 'بدء', - 'ob.cloud.body': 'WebBrain Compass جاهز مع بدل أسبوعي مجاني. قد يتم الاحتفاظ بمحادثات Compass المحددة واستخدامها لتحسين WebBrain بينما يكون Help Improve WebBrain قيد التشغيل افتراضيًا. يمكنك إيقاف تشغيله في الإعدادات → عام.', + 'ob.cloud.body': 'WebBrain Compass جاهز مع بدل أسبوعي مجاني. قد يتم الاحتفاظ بمحادثات Compass المحددة واستخدامها لتحسين WebBrain بينما يكون Help Improve WebBrain قيد التشغيل افتراضيًا. يمكنك إيقاف تشغيله في الإعدادات → متقدم.', 'ob.cloud.change': 'تغيير', 'ob.cloud.using': 'استخدام WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'النتيجة', 'sp.api.enabled_html': '🔓 تفعيل تعديلات واجهة API لهذه المحادثة. يمكن للوكيل الآن استخدام POST/PUT/PATCH/DELETE عبر fetch_url و execute_js عندما يرى أن API أكثر موثوقية من الواجهة. يظل التفاعل عبر الواجهة هو الافتراضي. تُمسح هذه العلامة عند تصفير المحادثة.', - 'sp.permissions.disabled_html': '⚠️ مطالبات الأذونات مُعطّلة. سيقوم WebBrain بالنقر والكتابة والتنقل وتشغيل JavaScript والرفع والتنزيل والتسجيل وجدولة أعمال مستقبلية دون أن يسأل أولًا. أعد تفعيل هذا من الإعدادات ← الأذونات ← السؤال قبل الإجراءات المهمة.', + 'sp.permissions.disabled_html': '⚠️ مطالبات الأذونات مُعطّلة. سيقوم WebBrain بالنقر والكتابة والتنقل وتشغيل JavaScript والرفع والتنزيل والتسجيل وجدولة أعمال مستقبلية دون أن يسأل أولًا. أعد تفعيل هذا من زر ⚠ بجوار الميكروفون.', 'sp.permissions.button': 'مطالبات الأذونات: مُفعّلة', 'sp.permissions.button_off': 'مطالبات الأذونات: مُعطّلة', 'sp.permissions.gate_desc': 'يسأل WebBrain في أول مرة ينقر فيها أو يكتب أو ينزّل ملفات أو يشغّل تعليمات برمجية على موقع.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'انتظار «{selector}»', 'st.title': 'إعدادات WebBrain', - 'st.subtitle': 'اضبط مزوّدي LLM والتفضيلات · v{version}', + 'st.subtitle': 'اضبط طريقة عمل WebBrain · v{version}', 'st.tab.display': 'عام', + 'st.tab.budgets': 'الميزانيات', + 'st.tab.advanced': 'متقدم', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'الكلام', + 'st.tab.generative': 'التوليد', + 'st.tab.decision': 'القرار', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'مزوّدو WebBrain', + 'st.providers_page.subtitle': 'اختر النماذج التي يستخدمها WebBrain · v{version}', + 'st.permissions_page.title': 'أذونات WebBrain', + 'st.permissions_page.subtitle': 'المواقع التي يمكن لـ WebBrain التصرف فيها دون أن يسأل أولًا', 'st.tab.providers': 'المزوّدون', 'st.tab.vision': 'الرؤية', 'st.tab.profile': 'الملف الشخصي', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "تحديث طريقة الدفع", 'st.account.manage_billing': 'إدارة الفوترة', - 'st.display.language.label': 'اللغة', - 'st.display.language.desc': 'لغة واجهة إضافة WebBrain.', 'st.display.verbose.label': 'الوضع المفصّل', 'st.display.verbose.desc': 'إظهار تفاصيل استدعاءات الأدوات كاملة، والمعطيات، ونتائج JSON الأولية. مُعطَّل افتراضيًا للحصول على تجربة محادثة أنظف.', 'st.display.selection_shortcut.label': 'اختصار التحديد', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'لقطة شاشة تلقائية', "st.display.auto_screenshot.desc": "التقط لقطة شاشة لنافذة العرض تلقائيًا بعد أن يتصرف الوكيل في الصفحة، لكي يرى مسار الرؤية المحدد ما تغيّر. يستهلك ذلك مزيدًا من الرموز. إذا لم تتوفر الرؤية، يتم تخطي الإثراء وتستمر المهمة مع إشعار بالحالة.", 'st.display.auto_screenshot.off': 'مُعطَّل', - 'st.display.auto_screenshot.navigation': 'عند التنقّل', - 'st.display.auto_screenshot.state_change': 'عند تغيّر الحالة (افتراضي)', + 'st.display.auto_screenshot.navigation': 'عند التنقّل (افتراضي)', + 'st.display.auto_screenshot.state_change': 'عند تغيّر الحالة', 'st.display.auto_screenshot.every_step': 'كل خطوة', 'st.display.tracing.label': 'تسجيل التتبّعات (لمقارنة النماذج)', - 'st.display.tracing.desc_html': 'حفظ كل تشغيل (طلبات LLM، الاستجابات، استدعاءات الأدوات، لقطات الشاشة) في IndexedDB المحلية حتى تتمكّن من فحص النماذج ومقارنتها جنبًا إلى جنب. يُفتح في علامة تبويب «التتبّعات» منفصلة. مُعطَّل افتراضيًا لأنه يضيف عمليات كتابة على القرص في كل خطوة. افتح صفحة التتبّعات →', - 'st.display.lossless_tracing.label': 'تسجيل تفاصيل الطلب الكاملة (طبقة تصحيح الأخطاء)', - 'st.display.lossless_tracing.desc_html': 'يحفظ أيضًا المطالبات والرسائل ومخططات الأدوات الكاملة لكل طلب نموذج لغوي بدلاً من الملخصات الخالية من المحتوى، ويحتفظ بما يصل إلى 200 كيلوبايت من كل نتيجة أداة. يتيح تصحيح الأخطاء العميق وإعادة بناء الطلبات. معطّل افتراضيًا لأنه يكتب محتوى محادثتك محليًا ويستهلك مساحة أكبر بكثير. يتطلب تفعيل تسجيل التتبعات.', + 'st.display.tracing.desc_html': 'حفظ كل تشغيل (طلبات LLM، الاستجابات، استدعاءات الأدوات، لقطات الشاشة) في IndexedDB المحلية حتى تتمكّن من فحص النماذج ومقارنتها جنبًا إلى جنب، بما في ذلك المطالبات والرسائل ومخططات الأدوات الكاملة لكل طلب نموذج لغوي وما يصل إلى 200 كيلوبايت من كل نتيجة أداة. يُفتح في علامة تبويب «التتبّعات» منفصلة. مُعطَّل افتراضيًا لأنه يكتب محتوى محادثتك محليًا ويستهلك مساحة أكبر بكثير. افتح صفحة التتبّعات →', 'st.display.allow_local_network.label': 'السماح للوكيل بالوصول إلى الشبكة المحلية', 'st.display.allow_local_network.desc': 'يسمح لأداة fetch_url للوكيل بالوصول إلى عناوين loopback (127.0.0.1، localhost) وعناوين RFC1918 الخاصة (10.x، 192.168.x، 172.16–31.x). مفيد لخوادم التطوير المحلية، وأدوات الإنترانت، وواجهات API ذاتية الاستضافة. مُعطَّل افتراضيًا. عند تعطيله، تُحظر عناوين IP الخاصة وloopback المكتوبة في URL وأسماء localhost. لا يتم فحص تحليل DNS، لذا قد تصل أسماء أخرى إلى عناوين محلية. تظل عناوين IP الحرفية لبيانات السحابة (169.254.169.254) وأسماء بيانات السحابة المدرجة أو *.internal/*.local محظورة حتى عند التفعيل.', 'st.display.notify_sound.label': "أصوات الإشعارات", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "وضع الرؤية مُفعّل للمزوّد النشط.", "sp.vision.off": "وضع الرؤية مُعطّل للمزوّد النشط.", "sp.vision.error": "فشل تبديل وضع الرؤية: {msg}", - "st.tab.multimodal": "النماذج المساعدة", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "موصى به. عند تفعيله، يطلب WebBrain الإذن في أول مرّة ينقر فيها أو يكتب أو يتنقّل أو يُشغّل JavaScript أو يرفع أو يُنزّل أو يُسجّل على موقع (ثم يتذكّر اختيارك). عطّله للاستخدام السريع دون مطالبات على المواقع التي تثق بها تمامًا.", "st.perms.gate.warning": "⚠️ مطالبات الأذونات مُعطّلة. سينقر WebBrain ويكتب ويتنقّل ويُشغّل JavaScript ويرفع ويُنزّل ويُسجّل على أي موقع دون أن يسأل — بما في ذلك على الصفحات التي قد يتحكّم في محتواها مهاجم. لا يزال محتوى الصفحة يُعامَل داخليًا كغير موثوق، لكن لا شيء سيمنع تعليمة محقونة من تشغيل إجراء. لا تُبقِ هذا معطّلًا إلا إذا كنت تثق تمامًا بكل موقع تستخدم المساعد عليه.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "الإعداد الافتراضي للنظام", "st.display.download_directory.error": "استخدم مجلدًا نسبيًا مثل WebBrain أو Work/WebBrain. لا يُسمح بالمسارات المطلقة أو “..”.", "st.display.strict_secret.label": "المعالجة الصارمة للأسرار", - "st.display.strict_secret.desc": "رفض اقتباس بيانات الاعتماد (كلمات المرور، مفاتيح API، الرموز، رموز OTP) في الملخّصات أو نص المساعد — حتى عندما تطلبها صراحةً. مفيد إذا كنت تشارك ملفات التتبّع أو تشارك شاشتك بانتظام. مُعطّل افتراضيًا ليتمكّن الوكيل من تكرار القيمة الدقيقة التي تطلبها عند الحاجة. فعّله (الإعدادات ← الأمان) عندما تريد إبقاء ملخّصات `done` مرتّبة وتجنّب تكرار بيانات الاعتماد.", + "st.display.strict_secret.desc": "رفض اقتباس بيانات الاعتماد (كلمات المرور، مفاتيح API، الرموز، رموز OTP) في الملخّصات أو نص المساعد — حتى عندما تطلبها صراحةً. مفيد إذا كنت تشارك ملفات التتبّع أو تشارك شاشتك بانتظام. مُعطّل افتراضيًا ليتمكّن الوكيل من تكرار القيمة الدقيقة التي تطلبها عند الحاجة. فعّله عندما تريد إبقاء ملخّصات `done` مرتّبة وتجنّب تكرار بيانات الاعتماد.", "st.display.request_timeout.label": "مهلة طلب LLM", "st.display.request_timeout.desc": "الحد الأقصى لانتظار ترويسات الاستجابة ولكل فترة توقف بين أجزاء الاستجابة المتدفقة. الافتراضي: 120 ثانية. زِد المدة للنماذج المحلية البطيئة، خاصة عند تشغيلها على المعالج أو مع سياق كبير.", "st.providers.filter.all": "الكل", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'تُضاف الرسائل إلى قائمة الانتظار بينما يكون WebBrain مشغولًا. يمكن فقط لـ /help و /progress و /btw و /scratchpad و /memory و /schedule --list و /watch و /dangerously-skip-permissions و /screenshot و /export و /export --traces و /verbose العمل فورًا كأوامر slash.', 'tool.go_back': 'العودة للخلف', 'tool.go_forward': 'التقدم للأمام', - 'st.display.search.placeholder': 'البحث في الإعدادات العامة', - 'st.display.search.empty': 'لا توجد إعدادات عامة مطابقة.', + 'st.display.search.placeholder': 'البحث في الإعدادات', + 'st.display.search.empty': 'لا توجد إعدادات مطابقة.', 'st.display.advanced': 'متقدم', ...getApocalypseModeCopy('ar'), ...getEmergencyBoxCopy('ar'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "لا توجد ذاكرة محفوظة بهذا المعرّف.", "st.memory.security_html": "الخصوصية: تُخزَّن ذاكرة المستخدم كنص عادي في ملف تعريف المتصفح هذا. عند تمكينها، تُرسل سجلات الذاكرة النشطة إلى موفّر LLM الذي تضبطه كجزء من مطالبة النظام. لا تخزّن هنا كلمات المرور أو مفاتيح API أو الرموز المميزة أو رموز الاسترداد أو الأسرار الحساسة.", "hist.filter.clear": "مسح عامل التصفية وعرض كل المحادثات", - "st.redaction.heading": "تعتيم لقطات الشاشة", "st.redaction.toggle.label": "إخفاء المحتوى الحساس في لقطات الشاشة", "st.redaction.toggle.desc": "قبل إرسال لقطة الشاشة إلى نموذج رؤية، يقوم بتغبيش حقول النماذج والنص الذي يبدو كبريد إلكتروني أو رقم هاتف. يعمل الكشف بالكامل على جهازك — لا يُنقل أي شيء إضافي.", "st.redaction.warning": "⚠️ هذا تعتيم بأفضل جهد ومن نوع fail-open: إذا تعذّر تشغيل التعتيم على صفحة ما (مثلًا مباشرة بعد التنقل، أو في عارضات PDF، أو على صفحات المتصفح المقيّدة)، فستُرسل لقطة الشاشة كما هي دون تعتيم. يعتمد الكشف فقط على استدلالات DOM — النص المرسوم على عنصر canvas، أو البيانات الشخصية داخل الصور، أو أي شيء لا يُعرف كحقل نموذج أو نص بريد/هاتف قد يفلت من الكشف، كما أن نص الصفحة المُرسل إلى النموذج لا يُعتَّم بهذا الإعداد. هذا ليس ضمانًا أمنيًا. للخصوصية الكاملة، استخدم نموذجًا محليًا/دون اتصال (llama.cpp أو Ollama): عندها لن تغادر لقطات الشاشة جهازك إطلاقًا ولن تعود هناك حاجة للتعتيم.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "تصدير جلسة التتبع المحفوظة كاملة بصيغة JSON، بما فيها لقطات الشاشة", "sp.export_traces.recording_truncated": "تم تصدير جميع السجلات المحفوظة بصيغة JSON. حُذف بعض المحتوى أثناء التسجيل ولا يمكن استعادته بالتصدير.", "sp.slash.export_traces": "تصدير سلسلة الأدوات (التتبعات)", - "sp.export_traces.none": "لا توجد تتبعات لهذه المحادثة. فعّل «تسجيل التتبعات» في الإعدادات ثم أعد التشغيل.", + "sp.export_traces.none": "لا توجد تتبعات لهذه المحادثة. فعّل «تسجيل التتبعات» في الإعدادات ← متقدم ثم أعد التشغيل.", "sp.export_traces.error": "تعذّر تصدير التتبعات.", "sp.export_traces.done": "تم تصدير سلسلة الأدوات.", "sp.export_traces.no_conversation": "لا يوجد ما يُصدَّر بعد — ابدأ محادثة أولًا.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "استخدام WebBrain كصفحة علامة التبويب الجديدة", "st.display.newtab.desc": "تفتح علامات التبويب الجديدة صفحة WebBrain مع مربع للسؤال أو التنفيذ أو البحث. أوقف هذا الخيار للإبقاء على صفحة علامة التبويب الجديدة المعتادة في متصفحك؛ يمكنك تغييره في أي وقت من الإعدادات ← عام.", "st.display.help_improve.desc_html": "السماح بالاحتفاظ بتفاعلات محددة مع WebBrain Compass واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. مفعّل افتراضيًا. عطّله لمنع استخدام تفاعلات Compass المستقبلية لهذه الأغراض. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا من المورّدين الذين تفعّل لديهم «مشاركة الاستعلامات لأغراض البحث». سياسة الخصوصية →", - "st.providers.webbrain_data_use.body": "يتضمن WebBrain Compass استخدامًا يوميًا مجانيًا. عندما تكون «المساعدة في تحسين WebBrain» مفعّلة افتراضيًا، قد يتم الاحتفاظ بمحادثات Compass محددة واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. عطّلها من عام ← متقدم لاستبعاد تفاعلات Compass المستقبلية من هذه الاستخدامات. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا عند تفعيل خيار «مشاركة الاستعلامات لأغراض البحث» الخاص بهذا المورّد. {privacyLink}. لمزيد من الاستخدام، اشترك عبر {subscribeLink}. أدِر الفوترة عبر {accountLink}.", + "st.providers.webbrain_data_use.body": "يتضمن WebBrain Compass استخدامًا يوميًا مجانيًا. عندما تكون «المساعدة في تحسين WebBrain» مفعّلة افتراضيًا، قد يتم الاحتفاظ بمحادثات Compass محددة واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. عطّلها من الإعدادات ← متقدم لاستبعاد تفاعلات Compass المستقبلية من هذه الاستخدامات. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا عند تفعيل خيار «مشاركة الاستعلامات لأغراض البحث» الخاص بهذا المورّد. {privacyLink}. لمزيد من الاستخدام، اشترك عبر {subscribeLink}. أدِر الفوترة عبر {accountLink}.", 'st.providers.share_research.label': "مشاركة الاستعلامات لأغراض البحث", 'st.providers.share_research.hint': "يرسل المطالبات والردود من هذا المورّد إلى WebBrain للتقييم والتحسين، بما في ذلك المورّد والنموذج المستخدَمين. تُحذف الصور والمرفقات الثنائية ويُقتطع النص قبل المشاركة؛ ويُرسَل النص المتبقي كما هو.", 'st.providers.share_research.confirm': "مشاركة استعلامات هذا المورّد مع WebBrain لأغراض البحث؟\n\nعند التفعيل، ستُرسَل مطالباتك وردودك وتفاعلات الأدوات مع هذا المورّد إلى WebBrain للتقييم والتحسين، مع اسم المورّد والنموذج. يُرسَل النص كما هو بعد حذف الصور واقتطاع المحتوى الطويل، لذا تجنّب مشاركة البيانات الشخصية الحساسة. يمكنك إيقاف ذلك في أي وقت لإيقاف المشاركة مستقبلاً.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "هل تريد مقاطعات أقل؟ يتذكر خيار «السماح دائمًا» هذا الموقع. يعطّل الأمر أدناه مطالبات أذونات WebBrain على جميع المواقع.", "sp.perm.insert_skip_command": "إدراج /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "لم تتغير مسودتك. امسحها قبل إدراج الأمر.", - "ob.act.permissions_tip": "تكون مطالبات الأذونات مفعّلة افتراضيًا. يمكن للمستخدمين المتقدمين تعطيلها عالميًا باستخدام /dangerously-skip-permissions وإعادة تفعيلها من الإعدادات ← الأذونات.", + "ob.act.permissions_tip": "تكون مطالبات الأذونات مفعّلة افتراضيًا. يمكن للمستخدمين المتقدمين تعطيلها عالميًا باستخدام /dangerously-skip-permissions وإعادة تفعيلها من زر ⚠ بجوار الميكروفون.", 'st.provider.field.cache_read_cost_per_million': "تكلفة قراءة ذاكرة التخزين المؤقت المقدّرة ($ / مليون رمز)", 'st.provider.field.cache_write_cost_per_million': "تكلفة كتابة ذاكرة التخزين المؤقت لمدة 5 دقائق ($ / مليون رمز)", 'st.provider.field.cache_write_1h_cost_per_million': "تكلفة كتابة ذاكرة التخزين المؤقت لمدة ساعة واحدة ($ / مليون رمز)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "هل تريد استبدال النسخة السحابية المشفرة بإعداد WebBrain الحالي لهذا الجهاز؟", "st.sync.consent.legacy": "هل تريد تفعيل المزامنة المشفرة؟ سيرسل WebBrain نسخة مشفرة من طرف إلى طرف من ذكرياتك، والملء التلقائي لملفك الشخصي، وإعدادات موفر مفتاح واجهة برمجة التطبيقات (API) إلى WebBrain Compass. لا تتم مزامنة سجل الدردشة وتسجيلات الدخول عبر OAuth.", "st.sync.consent.denied": "لم يتم منح إذن المزامنة المشفرة.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/bn.js b/src/chrome/src/ui/locales/bn.js index 4e17f7501d..a263c06e06 100644 --- a/src/chrome/src/ui/locales/bn.js +++ b/src/chrome/src/ui/locales/bn.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'এক্সটেনশনের UI ছোট করুন', 'sp.ui_scale.increase': 'এক্সটেনশনের UI বড় করুন', 'sp.ui_scale.reset': 'রিসেট', - 'st.display.ui_scale.label': 'এক্সটেনশনের UI জুম', - 'st.display.ui_scale.decrease': 'এক্সটেনশনের UI ছোট করুন', - 'st.display.ui_scale.increase': 'এক্সটেনশনের UI বড় করুন', - 'st.display.ui_scale.reset': 'রিসেট', - 'st.display.ui_scale.desc': 'পেজের জুম পরিবর্তন না করে সাইড প্যানেল এবং আলাদা চ্যাট উইন্ডোর আকার পরিবর্তন করুন।', - 'st.display.ui_scale.shortcuts': 'নির্দিষ্ট শর্টকাট: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'নির্ধারিত নয়', - 'st.display.ui_scale.manage_shortcuts': 'শর্টকাট কাস্টমাইজ করুন', 'tool.delegate_research': 'ChatGPT দিয়ে গবেষণা চলছে', 'st.display.research_escalation.label': 'গবেষণা এসকেলেশন', 'st.display.research_escalation.desc': 'সক্রিয় থাকলে, WebBrain একটি অস্বাভাবিক জটিল শুধু-পঠন গবেষণা প্রম্পট ChatGPT-তে পাঠানোর আগে অনুমতি চাইতে পারে। ডিফল্টভাবে বন্ধ। আপনার স্পষ্ট অনুমোদনের পরেই সঠিক প্রম্পটটি শেয়ার করা হয়।', @@ -500,7 +492,7 @@ export default { 'sp.step.result_label': "ফলাফল", 'sp.api.enabled_html': "🔓 API মিউটেশন সক্রিয় করা হয়েছে এই কথোপকথনের জন্য। এজেন্ট এখন fetch_url এবং execute_js এর মাধ্যমে POST/PUT/PATCH/DELETE ব্যবহার করতে পারে যখন এটি API-কে একটি ধাপের জন্য UI এর চেয়ে বেশি নির্ভরযোগ্য বলে বিচার করে। UI-প্রথম ডিফল্ট থাকে। আপনি কথোপকথন রিসেট করলে এই পতাকাটি পরিষ্কার হয়ে যায়।", - 'sp.permissions.disabled_html': "⚠️ অনুমতি প্রম্পট বন্ধ আছে. WebBrain প্রথমে জিজ্ঞাসা না করেই ক্লিক করবে, টাইপ করবে, নেভিগেট করবে, JavaScript চালাবে, আপলোড করবে, ডাউনলোড করবে, রেকর্ড করবে এবং ভবিষ্যৎ কাজের সময়সূচী করবে। সেটিংস → অনুমতি → আনুষঙ্গিক কর্মের আগে জিজ্ঞাসা করুন থেকে এটি পুনরায় সক্ষম করুন৷", + 'sp.permissions.disabled_html': "⚠️ অনুমতি প্রম্পট বন্ধ আছে. WebBrain প্রথমে জিজ্ঞাসা না করেই ক্লিক করবে, টাইপ করবে, নেভিগেট করবে, JavaScript চালাবে, আপলোড করবে, ডাউনলোড করবে, রেকর্ড করবে এবং ভবিষ্যৎ কাজের সময়সূচী করবে। মাইক্রোফোনের পাশের ⚠ বোতাম থেকে এটি পুনরায় চালু করুন।", 'sp.permissions.button': 'অনুমতি প্রম্পট: চালু', 'sp.permissions.button_off': 'অনুমতি প্রম্পট: বন্ধ', 'sp.permissions.gate_desc': 'কোনো সাইটে প্রথমবার ক্লিক, টাইপ, ডাউনলোড বা কোড চালানোর আগে WebBrain জিজ্ঞাসা করে।', @@ -659,7 +651,7 @@ export default { 'ob.act.warn1': "WebBrain পরিকল্পনার জন্য স্ক্রিনশট ক্যাপচার করতে পারে। স্বাস্থ্য, অর্থ, ডেটিং বা ব্যক্তিগত অ্যাকাউন্ট পোর্টালের মতো সংবেদনশীল পৃষ্ঠাগুলিতে এজেন্ট মোড ব্যবহার করা এড়িয়ে চলুন, যদি না আপনি সেই ঝুঁকি গ্রহণ করেন।", 'ob.act.warn2': "ওয়েব বিষয়বস্তুতে AI আচরণকে ম্যানিপুলেট করার জন্য ডিজাইন করা দূষিত প্রম্পট ইনজেকশন থাকতে পারে।", 'ob.act.warn3': "সর্বদা প্রস্তাবিত ক্রিয়াগুলি পর্যালোচনা করুন এবং রানগুলি বন্ধ করুন যা অপ্রত্যাশিত দেখায়।", - 'ob.act.permissions_tip': "অনুমতি প্রম্পট ডিফল্টরূপে চালু আছে. উন্নত ব্যবহারকারীরা /dangerously-skip-permissions এর মাধ্যমে বিশ্বব্যাপী সেগুলিকে নিষ্ক্রিয় করতে পারে এবং সেটিংস → অনুমতিগুলিতে পুনরায় সক্ষম করতে পারে৷", + 'ob.act.permissions_tip': "অনুমতি প্রম্পট ডিফল্টরূপে চালু আছে. উন্নত ব্যবহারকারীরা /dangerously-skip-permissions এর মাধ্যমে বিশ্বব্যাপী সেগুলিকে নিষ্ক্রিয় করতে পারে এবং মাইক্রোফোনের পাশের ⚠ বোতাম থেকে পুনরায় চালু করতে পারে।", 'ob.tokens.title': "একটি মডেল চয়ন করুন", 'ob.tokens.body': "WebBrain কাজ করার জন্য একটি ভাষা মডেল প্রয়োজন। আমরা প্রথমে স্থানীয় মডেলগুলি পরীক্ষা করব। যদি কোনটি উপলব্ধ না হয়, সেটিংস খুলুন এবং একটি প্রদানকারী যোগ করুন:", 'ob.tokens.scanning': "স্থানীয় মডেল পরীক্ষা করা হচ্ছে...", @@ -685,23 +677,32 @@ export default { 'ob.btn.done': "শুরু করুন", 'ob.btn.skip': "আপাতত এড়িয়ে যান", 'ob.btn.start': 'শুরু', - 'ob.cloud.body': 'WebBrain Compass একটি বিনামূল্যের সাপ্তাহিক ভাতা সহ প্রস্তুত৷ নির্বাচিত Compass কথোপকথনগুলি ধরে রাখা যেতে পারে এবং WebBrain উন্নত করতে ব্যবহার করা যেতে পারে যখন Help Improve WebBrain ডিফল্টরূপে চালু থাকে৷ আপনি এটি Settings → General এ বন্ধ করতে পারেন৷', + 'ob.cloud.body': 'WebBrain Compass একটি বিনামূল্যের সাপ্তাহিক ভাতা সহ প্রস্তুত৷ নির্বাচিত Compass কথোপকথনগুলি ধরে রাখা যেতে পারে এবং WebBrain উন্নত করতে ব্যবহার করা যেতে পারে যখন Help Improve WebBrain ডিফল্টরূপে চালু থাকে৷ আপনি এটি Settings → Advanced এ বন্ধ করতে পারেন৷', 'ob.cloud.change': 'পরিবর্তন', 'ob.cloud.using': 'WebBrain Compass ব্যবহার করছে৷', // --- Settings ---------------------------------------------------------- 'st.title': "WebBrain সেটিংস", - 'st.subtitle': "আপনার LLM প্রদানকারী এবং পছন্দগুলি কনফিগার করুন · v{version}৷", + 'st.subtitle': "WebBrain কীভাবে কাজ করে তা কনফিগার করুন · v{version}", 'st.tab.display': "সাধারণ", + 'st.tab.budgets': 'বাজেট', + 'st.tab.advanced': 'উন্নত', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'কথা', + 'st.tab.generative': 'জেনারেটিভ', + 'st.tab.decision': 'ডিসিশন', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain প্রদানকারী', + 'st.providers_page.subtitle': 'WebBrain যে মডেলগুলো ব্যবহার করে সেগুলো বেছে নিন · v{version}', + 'st.permissions_page.title': 'WebBrain অনুমতি', + 'st.permissions_page.subtitle': 'যেসব সাইটে WebBrain আগে জিজ্ঞাসা না করেই কাজ করতে পারে', 'st.tab.providers': "প্রদানকারী", 'st.tab.skills': "দক্ষতা", 'st.tab.vision': "দৃষ্টি", - 'st.tab.multimodal': "সহায়ক মডেল", 'st.tab.memory': "স্মৃতি", 'st.tab.profile': "প্রোফাইল", 'st.tab.account': "হিসাব", 'st.tab.captcha': "ক্যাপচা", - 'st.tab.permissions': "অনুমতি", 'st.perms.gate.label': "ফলাফলমূলক কর্মের আগে জিজ্ঞাসা করুন", 'st.perms.gate.desc': "প্রস্তাবিত চালু হলে, WebBrain প্রথমবার অনুমতি চায় এটি ক্লিক করে, টাইপ করে, নেভিগেট করে, জাভাস্ক্রিপ্ট চালায়, আপলোড করে, ডাউনলোড করে, রেকর্ড করে, বা কোনও সাইটে ভবিষ্যতের কাজের সময়সূচী করে (তারপর আপনার পছন্দ মনে রাখে)। আপনি সম্পূর্ণরূপে বিশ্বাস করেন এমন সাইটগুলিতে দ্রুত, প্রম্পট-মুক্ত ব্যবহারের জন্য বন্ধ করুন৷", @@ -723,8 +724,6 @@ export default { "st.account.update_payment": "পেমেন্ট পদ্ধতি আপডেট করুন", 'st.account.manage_billing': "বিলিং পরিচালনা করুন", - 'st.display.language.label': "ভাষা", - 'st.display.language.desc': "WebBrain প্লাগইনের জন্য ইন্টারফেস ভাষা।", 'st.display.theme.label': "চেহারা", 'st.display.theme.desc': "হালকা, অন্ধকার বা আপনার OS সেটিংস অনুসরণ করুন।", 'st.display.theme.system': "সিস্টেম", @@ -734,8 +733,8 @@ export default { 'st.display.download_directory.desc': "আপনার ব্রাউজার বা সিস্টেম ডাউনলোড ডিরেক্টরির ভিতরে ঐচ্ছিক সাবফোল্ডার। সিস্টেম ডিফল্ট ব্যবহার করতে ফাঁকা ছেড়ে দিন।", 'st.display.download_directory.placeholder': "সিস্টেম ডিফল্ট", 'st.display.download_directory.error': "একটি আপেক্ষিক ফোল্ডার ব্যবহার করুন যেমন WebBrain বা Work/WebBrain। সম্পূর্ণ পাথ এবং \"..\" অনুমোদিত নয়৷", - 'st.display.search.placeholder': "সাধারণ সেটিংস অনুসন্ধান করুন", - 'st.display.search.empty': "কোনো সাধারণ সেটিংস মেলে না।", + 'st.display.search.placeholder': "সেটিংস অনুসন্ধান করুন", + 'st.display.search.empty': "কোনো সেটিং মেলেনি।", 'st.display.advanced': "উন্নত", ...getApocalypseModeCopy('bn'), ...getEmergencyBoxCopy('bn'), @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': "অটো-স্ক্রিনশট", "st.display.auto_screenshot.desc": "এজেন্ট পৃষ্ঠায় কাজ করার পর স্বয়ংক্রিয়ভাবে ভিউপোর্টের স্ক্রিনশট নিন, যাতে নির্বাচিত ভিশন রুট পরিবর্তনটি দেখতে পারে। এতে বেশি টোকেন লাগে। ভিশন না থাকলে সমৃদ্ধকরণ এড়িয়ে কাজটি স্ট্যাটাস নোটিশসহ চলতে থাকে।", 'st.display.auto_screenshot.off': "বন্ধ", - 'st.display.auto_screenshot.navigation': "নেভিগেশন", - 'st.display.auto_screenshot.state_change': "রাষ্ট্র পরিবর্তনের উপর (ডিফল্ট)", + 'st.display.auto_screenshot.navigation': "নেভিগেশন (ডিফল্ট)", + 'st.display.auto_screenshot.state_change': "রাষ্ট্র পরিবর্তনের উপর", 'st.display.auto_screenshot.every_step': "প্রতিটি পদক্ষেপ", 'st.display.tracing.label': "রেকর্ড ট্রেস (মডেল তুলনা জন্য)", - 'st.display.tracing.desc_html': "স্থানীয় IndexedDB-তে প্রতিটি রান (LLM অনুরোধ, প্রতিক্রিয়া, টুল কল, স্ক্রিনশট) চালিয়ে যান যাতে আপনি পাশাপাশি মডেলগুলি পরিদর্শন এবং তুলনা করতে পারেন। একটি পৃথক ট্রেস ট্যাবে খোলে। ডিফল্টরূপে বন্ধ কারণ এটি প্রতি ধাপে ডিস্ক রাইট যোগ করে। ট্রেস পৃষ্ঠা খুলুন →", - 'st.display.lossless_tracing.label': 'সম্পূর্ণ অনুরোধের বিবরণ রেকর্ড করুন (ডিবাগ স্তর)', - 'st.display.lossless_tracing.desc_html': 'প্রতিটি LLM অনুরোধের সম্পূর্ণ প্রম্পট, বার্তা এবং টুল স্কিমা বিষয়বস্তুহীন সারাংশের পরিবর্তে সংরক্ষণ করে এবং প্রতিটি টুল ফলাফলের ২০০ KB পর্যন্ত রাখে। গভীর ডিবাগিং এবং অনুরোধ পুনর্নির্মাণ সক্ষম করে। ডিফল্টভাবে বন্ধ কারণ এটি আপনার কথোপকথনের বিষয়বস্তু স্থানীয়ভাবে লেখে এবং অনেক বেশি ডিস্ক ব্যবহার করে। ট্রেস রেকর্ডিং চালু থাকা প্রয়োজন।', + 'st.display.tracing.desc_html': "স্থানীয় IndexedDB-তে প্রতিটি রান (LLM অনুরোধ, প্রতিক্রিয়া, টুল কল, স্ক্রিনশট) সংরক্ষণ করুন, যাতে আপনি পাশাপাশি মডেলগুলি পরিদর্শন ও তুলনা করতে পারেন — প্রতিটি LLM অনুরোধের সম্পূর্ণ প্রম্পট, বার্তা ও টুল স্কিমা এবং প্রতিটি টুল ফলাফলের ২০০ KB পর্যন্ত সহ। একটি পৃথক ট্রেস ট্যাবে খোলে। ডিফল্টভাবে বন্ধ কারণ এটি আপনার কথোপকথনের বিষয়বস্তু স্থানীয়ভাবে লেখে এবং অনেক বেশি ডিস্ক ব্যবহার করে। ট্রেস পৃষ্ঠা খুলুন →", 'st.display.cost_session_limit.label': "মেঘ খরচ অধিবেশন ভাতা", 'st.display.cost_session_limit.desc': "স্টপ ক্লাউড এবং OpenRouter এই সেশনটি রিপোর্ট করা বা আনুমানিক খরচ ভাতা পৌঁছানোর পরে অন্য একটি প্রদত্ত মডেল কলের আগে চলে। ডিফল্ট $10।", 'st.display.cost_total_limit.label': "ক্লাউড খরচ মোট ভাতা", 'st.display.cost_total_limit.desc': "ট্র্যাক রিপোর্ট করা বা আনুমানিক ক্লাউড/OpenRouter মডেল এক্সটেনশন জুড়ে ব্যয় করে এবং ভাতাতে আরও প্রদত্ত কল বন্ধ করে। স্থানীয় প্রদানকারীদের গণনা করা হয় না.", 'st.display.cost_reset': "খরচ রিসেট করুন", 'st.display.strict_secret.label': "কঠোর গোপন হ্যান্ডলিং", - 'st.display.strict_secret.desc': "সারাংশ বা সহকারী টেক্সটে শংসাপত্র (পাসওয়ার্ড, API কী, টোকেন, ওটিপি) উদ্ধৃত করতে অস্বীকার করুন — এমনকি আপনি যখন স্পষ্টভাবে তাদের জন্য জিজ্ঞাসা করেন। আপনি যদি নিয়মিত ট্রেস ফাইল বা স্ক্রিন-শেয়ার করেন তবে দরকারী। ডিফল্টরূপে বন্ধ: এজেন্ট আপনার জিজ্ঞাসা করা নির্দিষ্ট মান, প্রয়োজনে পুনরায় বলতে পারে। `done` সারাংশ পরিপাটি রাখতে এবং শংসাপত্র কখনও পুনরাবৃত্তি না করতে চাইলে এটি চালু করুন (সেটিংস → নিরাপত্তা)।", + 'st.display.strict_secret.desc': "সারাংশ বা সহকারী টেক্সটে শংসাপত্র (পাসওয়ার্ড, API কী, টোকেন, ওটিপি) উদ্ধৃত করতে অস্বীকার করুন — এমনকি আপনি যখন স্পষ্টভাবে তাদের জন্য জিজ্ঞাসা করেন। আপনি যদি নিয়মিত ট্রেস ফাইল বা স্ক্রিন-শেয়ার করেন তবে দরকারী। ডিফল্টরূপে বন্ধ: এজেন্ট আপনার জিজ্ঞাসা করা নির্দিষ্ট মান, প্রয়োজনে পুনরায় বলতে পারে। `done` সারাংশ পরিপাটি রাখতে এবং শংসাপত্র কখনও পুনরাবৃত্তি না করতে চাইলে এটি চালু করুন।", 'st.display.allow_local_network.label': "এজেন্টকে স্থানীয় নেটওয়ার্ক অ্যাক্সেস করার অনুমতি দিন", 'st.display.allow_local_network.desc': "এজেন্টের fetch_url টুলকে লুপব্যাকে (127.0.0.1, localhost) এবং ব্যক্তিগত/RFC1918 ঠিকানায় (10.x, 192.168.x, 172.16–31.x) পৌঁছাতে দেয়। স্থানীয় ডেভ সার্ভার, ইন্ট্রানেট টুল বা স্ব-হোস্টেড API-এর জন্য দরকারী। ডিফল্টরূপে বন্ধ। বন্ধ থাকলে URL-এ সরাসরি লেখা ব্যক্তিগত ও লুপব্যাক IP ঠিকানা এবং localhost নাম ব্লক থাকে। DNS রেজল্যুশন পরীক্ষা করা হয় না, তাই অন্য হোস্টনাম স্থানীয় ঠিকানায় পৌঁছাতে পারে। ক্লাউড-মেটাডেটার সরাসরি IP ঠিকানা (169.254.169.254) এবং তালিকাভুক্ত মেটাডেটা বা *.internal/*.local হোস্টনাম চালু থাকলেও ব্লক থাকে।", 'st.display.scheduled_tasks.label': "নির্ধারিত কাজ", @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': "সর্বোচ্চ", 'st.providers.compat.value.system': "সিস্টেম", 'st.providers.compat.value.developer': "বিকাশকারী", - 'st.providers.webbrain_data_use.body': "বিনামূল্যে দৈনিক WebBrain Compass ব্যবহার অন্তর্ভুক্ত করা হয়েছে। WebBrain উন্নত করার জন্য সহায়তা ডিফল্টরূপে চালু থাকলেও, নির্বাচিত Compass কথোপকথনগুলি বজায় রাখা যেতে পারে এবং মূল্যায়ন, উন্নতি, ফাইন-টিউনিং এবং প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে। এই ব্যবহারগুলি থেকে ভবিষ্যতের Compass ইন্টারঅ্যাকশনগুলি বাদ দিতে সাধারণ → উন্নত-এ এটি বন্ধ করুন৷ WebBrain স্থানীয়-মডেল ও আপনার নিজের API অনুরোধ শুধু তখনই সংগ্রহ করে যখন আপনি এই প্রদানকারীর “গবেষণার জন্য কোয়েরি শেয়ার করুন” বিকল্প চালু করেন। {privacyLink}। আরও ব্যবহারের জন্য, {subscribeLink}-এ সদস্যতা নিন। {accountLink} এ বিলিং পরিচালনা করুন।", + 'st.providers.webbrain_data_use.body': "বিনামূল্যে দৈনিক WebBrain Compass ব্যবহার অন্তর্ভুক্ত করা হয়েছে। WebBrain উন্নত করার জন্য সহায়তা ডিফল্টরূপে চালু থাকলেও, নির্বাচিত Compass কথোপকথনগুলি বজায় রাখা যেতে পারে এবং মূল্যায়ন, উন্নতি, ফাইন-টিউনিং এবং প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে। এই ব্যবহারগুলি থেকে ভবিষ্যতের Compass ইন্টারঅ্যাকশনগুলি বাদ দিতে সেটিংস → উন্নত-এ এটি বন্ধ করুন৷ WebBrain স্থানীয়-মডেল ও আপনার নিজের API অনুরোধ শুধু তখনই সংগ্রহ করে যখন আপনি এই প্রদানকারীর “গবেষণার জন্য কোয়েরি শেয়ার করুন” বিকল্প চালু করেন। {privacyLink}। আরও ব্যবহারের জন্য, {subscribeLink}-এ সদস্যতা নিন। {accountLink} এ বিলিং পরিচালনা করুন।", 'st.providers.share_research.label': "গবেষণার জন্য কোয়েরি শেয়ার করুন", 'st.providers.share_research.hint': "এই প্রদানকারীর প্রম্পট ও প্রতিক্রিয়া মূল্যায়ন ও উন্নতির জন্য WebBrain-কে পাঠায়, ব্যবহৃত প্রদানকারী ও মডেলসহ। শেয়ারের আগে ছবি ও বাইনারি সংযুক্তি সরানো হয় এবং টেক্সট ছেঁটে নেয়া হয়; বাকি টেক্সট অপরিবর্তিত পাঠানো হয়।", 'st.providers.share_research.confirm': "এই প্রদানকারীর কোয়েরি কি গবেষণার জন্য WebBrain-এর সাথে শেয়ার করবেন?\n\nচালু থাকলে, এই প্রদানকারীর সাথে আপনার প্রম্পট, প্রতিক্রিয়া ও টুল ইন্টারঅ্যাকশন প্রদানকারী ও মডেলের নামসহ মূল্যায়ন ও উন্নতির জন্য WebBrain-কে পাঠানো হবে। ছবি সরিয়ে ও দীর্ঘ কনটেন্ট ছেঁটে টেক্সট অপরিবর্তিত পাঠানো হয়, তাই সংবেদনশীল ব্যক্তিগত তথ্য শেয়ার এড়িয়ে চলুন। ভবিষযতে শেয়ার বন্ধ করতে যেকোনো সময় এটি বন্ধ করতে পারেন।", @@ -1058,7 +1055,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "স্ক্রিনশট রিডাকশন", 'st.redaction.toggle.label': "স্ক্রিনশট থেকে সংবেদনশীল কন্টেন্ট রিড্যাক্ট করুন", 'st.redaction.toggle.desc': "একটি ভিশন মডেলে একটি স্ক্রিনশট পাঠানোর আগে, ফর্মের ক্ষেত্রগুলি এবং পাঠ্যটি অস্পষ্ট করুন যা একটি ইমেল বা ফোন নম্বরের মতো দেখাচ্ছে৷ সনাক্তকরণ সম্পূর্ণরূপে আপনার ডিভাইসে চলে — অতিরিক্ত কিছুই প্রেরণ করা হয় না।", 'st.redaction.warning': "⚠️ সর্বোত্তম-প্রচেষ্টা এবং ব্যর্থ-ওপেন: যদি রিডাকশন কোনও পৃষ্ঠায় চলতে না পারে (উদাহরণস্বরূপ, নেভিগেশনের ঠিক পরে, পিডিএফ ভিউয়ারে বা সীমাবদ্ধ ব্রাউজার পৃষ্ঠাগুলিতে), স্ক্রিনশটটি এখনও সংশোধন না করে পাঠানো হয়। সনাক্তকরণ শুধুমাত্র DOM হিউরিস্টিক ব্যবহার করে — ক্যানভাস-আঁকানো পাঠ্য, চিত্রের ভিতরে PII, বা ফর্ম ক্ষেত্র হিসাবে স্বীকৃত নয় এমন কিছু বা ইমেল/ফোন পাঠ্যটি স্লিপ হতে পারে এবং মডেলে পাঠানো পৃষ্ঠা পাঠ্য এই সেটিং দ্বারা সংশোধন করা হয় না। এটি একটি নিরাপত্তা গ্যারান্টি নয়. সম্পূর্ণ গোপনীয়তার জন্য, একটি স্থানীয়/অফলাইন মডেল ব্যবহার করুন (llama.cpp, Ollama): তারপর স্ক্রিনশটগুলি কখনই আপনার মেশিন ছেড়ে যাবেন না এবং সংশোধন অপ্রয়োজনীয়।", @@ -1246,7 +1242,7 @@ export default { "sp.slash.export_traces_full": "স্ক্রিনশটসহ সম্পূর্ণ সংরক্ষিত ট্রেস সেশন JSON হিসেবে রপ্তানি করুন", "sp.export_traces.recording_truncated": "সব সংরক্ষিত রেকর্ড JSON হিসেবে রপ্তানি করা হয়েছে। রেকর্ডিংয়ের সময় বাদ পড়া কিছু তথ্য রপ্তানির মাধ্যমে ফেরত পাওয়া যাবে না।", "sp.slash.export_traces": "টুল চেইন (ট্রেস) রপ্তানি করুন", - "sp.export_traces.none": "এই কথোপকথনের জন্য কোন চিহ্ন নেই. সেটিংসে রেকর্ড ট্রেস সক্ষম করুন, তারপর আবার চালান।", + "sp.export_traces.none": "এই কথোপকথনের জন্য কোন চিহ্ন নেই. সেটিংস → উন্নত-এ রেকর্ড ট্রেস সক্ষম করুন, তারপর আবার চালান।", "sp.export_traces.error": "ট্রেস এক্সপোর্ট করা যায়নি।", "sp.export_traces.done": "টুল চেইন রপ্তানি করা হয়েছে।", "sp.export_traces.no_conversation": "এখনও রপ্তানি করার কিছু নেই — প্রথমে একটি কথোপকথন শুরু করুন।", @@ -1320,8 +1316,8 @@ export default { "st.sync.confirm.reset": "এই ডিভাইসের বর্তমান WebBrain সেটআপ দিয়ে এনক্রিপ্ট করা ক্লাউড কপি প্রতিস্থাপন করবেন?", "st.sync.consent.legacy": "এনক্রিপ্ট করা সিঙ্ক চালু করবেন? WebBrain আপনার স্মৃতি, প্রোফাইল অটোফিল এবং API-কী প্রদানকারী সেটিংসের একটি এন্ড-টু-এন্ড এনক্রিপ্টেড কপি WebBrain Compass-এ প্রেরণ করবে। চ্যাট ইতিহাস এবং OAuth সাইন-ইন সিঙ্ক করা হয় না।", "st.sync.consent.denied": "এনক্রিপ্ট করা সিঙ্ক অনুমতি দেওয়া হয়নি।", - 'st.providers.webgpu_note.body': '{modelLink} কোনো API এন্ডপয়েন্ট ছাড়াই সম্পূর্ণভাবে Chrome-এ চলে। এটি Settings > Providers > WebGPU বা Apocalypse Mode থেকে ডাউনলোড করুন, তারপর standalone chat-এ nuclear control ব্যবহার করুন।', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} কোনো API এন্ডপয়েন্ট ছাড়াই সম্পূর্ণভাবে Chrome-এ চলে। এটি Providers > WebGPU বা Apocalypse Mode থেকে ডাউনলোড করুন, তারপর standalone chat-এ nuclear control ব্যবহার করুন।', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/de.js b/src/chrome/src/ui/locales/de.js index ba1387a7fc..bd4cd08f1b 100644 --- a/src/chrome/src/ui/locales/de.js +++ b/src/chrome/src/ui/locales/de.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Erweiterungsoberfläche verkleinern', 'sp.ui_scale.increase': 'Erweiterungsoberfläche vergrößern', 'sp.ui_scale.reset': 'Zurücksetzen', - 'st.display.ui_scale.label': 'Erweiterungsoberfläche zoomen', - 'st.display.ui_scale.decrease': 'Erweiterungsoberfläche verkleinern', - 'st.display.ui_scale.increase': 'Erweiterungsoberfläche vergrößern', - 'st.display.ui_scale.reset': 'Zurücksetzen', - 'st.display.ui_scale.desc': 'Seitenleiste und separates Chatfenster vergrößern oder verkleinern, ohne den Seitenzoom zu ändern.', - 'st.display.ui_scale.shortcuts': 'Eigene Tastenkürzel: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Nicht zugewiesen', - 'st.display.ui_scale.manage_shortcuts': 'Tastenkürzel anpassen', 'tool.delegate_research': 'Recherche mit ChatGPT', 'st.display.research_escalation.label': 'Recherche-Eskalation', 'st.display.research_escalation.desc': 'Wenn aktiviert, kann WebBrain vor dem Senden einer ungewöhnlich komplexen, schreibgeschützten Rechercheanfrage an ChatGPT um Zustimmung bitten. Standardmäßig deaktiviert. Die genaue Anfrage wird nur nach Ihrer ausdrücklichen Zustimmung geteilt.', @@ -454,7 +446,7 @@ export default { 'sp.step.input_label': 'Eingabe', 'sp.step.result_label': 'Ergebnis', 'sp.api.enabled_html': '🔓 API-Mutationen aktiviert für dieses Gespräch. Der Agent kann nun POST/PUT/PATCH/DELETE über fetch_url und execute_js verwenden, wenn er API für zuverlässiger als die Benutzeroberfläche hält. Die Oberfläche bleibt standardmäßig bevorzugt. Dieses Flag wird beim Zurücksetzen des Gesprächs gelöscht.', - 'sp.permissions.disabled_html': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen, ohne vorher zu fragen. Schalten Sie diese Option in Einstellungen → Berechtigungen → Vor bedeutsamen Aktionen fragen wieder ein.', + 'sp.permissions.disabled_html': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen, ohne vorher zu fragen. Schalten Sie diese Option über die ⚠-Schaltfläche neben dem Mikrofon wieder ein.', 'sp.permissions.button': 'Berechtigungsabfragen: an', 'sp.permissions.button_off': 'Berechtigungsabfragen: aus', 'sp.permissions.gate_desc': 'WebBrain fragt, bevor es auf einer Website zum ersten Mal klickt, tippt, herunterlädt oder Code ausführt.', @@ -559,7 +551,7 @@ export default { 'sp.workflows.reason.name_required': 'Geben Sie einen Workflow-Namen an: /workflow --save .', 'sp.workflows.reason.http_start_url': 'Der aufgezeichnete Durchlauf muss auf einer http(s)-Seite beginnen, bevor er gespeichert werden kann.', 'sp.workflows.reason.normalization_failed': 'Dieser Workflow konnte nicht gespeichert werden, da seine Schritte nicht sicher für die Wiedergabe sind.', - 'sp.export_traces.none': 'Keine Traces für dieses Gespräch. Aktivieren Sie „Traces aufzeichnen" in den Einstellungen und führen Sie den Durchlauf erneut aus.', + 'sp.export_traces.none': 'Keine Traces für dieses Gespräch. Aktivieren Sie „Traces aufzeichnen" unter Einstellungen → Erweitert und führen Sie den Durchlauf erneut aus.', 'sp.export_traces.error': 'Traces konnten nicht exportiert werden.', 'sp.export_traces.done': 'Werkzeugkette exportiert.', 'sp.export_traces.no_conversation': 'Noch nichts zu exportieren — beginnen Sie zunächst ein Gespräch.', @@ -660,7 +652,7 @@ export default { 'ob.act.warn1': 'WebBrain kann Screenshots für die Planung aufnehmen. Vermeiden Sie den Agent-Modus auf sensiblen Seiten wie Gesundheit, Finanzen, Dating oder privaten Kontenportalen, sofern Sie dieses Risiko akzeptieren.', 'ob.act.warn2': 'Web-Inhalte können bösartige Prompt-Injection enthalten, die auf die Manipulation von KI-Verhalten abzielen.', 'ob.act.warn3': 'Überprüfen Sie immer die vorgeschlagenen Aktionen und stoppen Sie Durchläufe, die unerwartet aussehen.', - 'ob.act.permissions_tip': 'Berechtigungsabfragen sind standardmäßig aktiv. Fortgeschrittene Benutzer können sie global mit /dangerously-skip-permissions deaktivieren und in Einstellungen → Berechtigungen wieder aktivieren.', + 'ob.act.permissions_tip': 'Berechtigungsabfragen sind standardmäßig aktiv. Fortgeschrittene Benutzer können sie global mit /dangerously-skip-permissions deaktivieren und über die ⚠-Schaltfläche neben dem Mikrofon wieder aktivieren.', 'ob.tokens.title': 'Modell auswählen', 'ob.tokens.body': 'WebBrain benötigt ein Sprachmodell. Wir prüfen zuerst auf lokale Modelle. Wenn keine verfügbar sind, öffnen Sie die Einstellungen und fügen Sie einen Anbieter hinzu:', 'ob.tokens.scanning': 'Suche nach lokalen Modellen...', @@ -686,22 +678,31 @@ export default { 'ob.btn.done': 'Loslegen', 'ob.btn.skip': 'Vorerst überspringen', 'ob.btn.start': 'Starten', - 'ob.cloud.body': 'WebBrain Compass ist mit einem wöchentlichen kostenlosen Kontingent bereit. Ausgewählte Compass-Gespräche können gespeichert und zur Verbesserung von WebBrain verwendet werden, solange „Hilfe, WebBrain zu verbessern" standardmäßig aktiviert ist. Sie können dies in Einstellungen → Allgemein deaktivieren.', + 'ob.cloud.body': 'WebBrain Compass ist mit einem wöchentlichen kostenlosen Kontingent bereit. Ausgewählte Compass-Gespräche können gespeichert und zur Verbesserung von WebBrain verwendet werden, solange „Hilfe, WebBrain zu verbessern" standardmäßig aktiviert ist. Sie können dies in Einstellungen → Erweitert deaktivieren.', 'ob.cloud.change': 'Ändern', 'ob.cloud.using': 'WebBrain Compass verwenden.', // --- Settings --- 'st.title': 'WebBrain-Einstellungen', - 'st.subtitle': 'Konfigurieren Sie Ihre LLM-Anbieter und Präferenzen · v{version}', + 'st.subtitle': 'Legen Sie fest, wie WebBrain arbeitet · v{version}', 'st.tab.display': 'Allgemein', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Erweitert', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Sprache', + 'st.tab.generative': 'Generativ', + 'st.tab.decision': 'Entscheidung', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain-Anbieter', + 'st.providers_page.subtitle': 'Wählen Sie die Modelle, die WebBrain verwendet · v{version}', + 'st.permissions_page.title': 'WebBrain-Berechtigungen', + 'st.permissions_page.subtitle': 'Websites, auf denen WebBrain ohne Nachfrage handeln darf', 'st.tab.providers': 'Anbieter', 'st.tab.skills': 'Skills', 'st.tab.vision': 'Vision', - 'st.tab.multimodal': "Assistenzmodelle", 'st.tab.memory': 'Memorie', 'st.tab.profile': 'Profil', 'st.tab.account': 'Konto', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Berechtigungen', 'st.perms.gate.label': 'Vor bedeutsamen Aktionen fragen', 'st.perms.gate.desc': 'Empfohlen. Wenn aktiviert, fragt WebBrain beim ersten Klick, Tippen, Navigieren, JavaScript-Ausführen, Hochladen, Herunterladen, Aufnehmen oder Planen zukünftiger Aufgaben auf einer Website um Erlaubnis (und merkt sich Ihre Auswahl). Deaktivieren Sie diese Option für schnelle, auffreie Nutzung auf Websites, denen Sie voll vertrauen.', 'st.perms.gate.warning': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird auf jeder Website klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen OHNE zu fragen — einschließlich auf Seiten, deren Inhalt von Angreifern kontrolliert werden kann.', @@ -720,8 +721,6 @@ export default { "st.account.payment_failed": "Deine Abonnementzahlung konnte nicht abgeschlossen werden. Aktualisiere deine Zahlungsmethode, um deinen kostenpflichtigen Tarif wieder zu nutzen.", "st.account.update_payment": "Zahlungsmethode aktualisieren", 'st.account.manage_billing': 'Abrechnung verwalten', - 'st.display.language.label': 'Sprache', - 'st.display.language.desc': 'Oberflächensprache des WebBrain-Plugins.', 'st.display.theme.label': 'Darstellung', 'st.display.theme.desc': 'Hell, Dunkel oder OS-Einstellung übernehmen.', 'st.display.theme.system': 'System', @@ -731,8 +730,8 @@ export default { 'st.display.download_directory.desc': 'Optionaler Unterordner im Browser- oder System-Download-Verzeichnis. Leer lassen, um den Systemstandard zu verwenden.', 'st.display.download_directory.placeholder': 'Systemstandard', 'st.display.download_directory.error': 'Verwenden Sie einen relativen Ordner wie WebBrain oder Work/WebBrain. Absolute Pfade und „.." sind nicht erlaubt.', - 'st.display.search.placeholder': 'Allgemeine Einstellungen durchsuchen', - 'st.display.search.empty': 'Keine passenden allgemeinen Einstellungen.', + 'st.display.search.placeholder': 'Einstellungen durchsuchen', + 'st.display.search.empty': 'Keine passenden Einstellungen.', 'st.display.advanced': 'Erweitert', ...getApocalypseModeCopy('de'), ...getEmergencyBoxCopy('de'), @@ -790,20 +789,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatischer Screenshot', "st.display.auto_screenshot.desc": "Erstellt automatisch einen Viewport-Screenshot, nachdem der Agent auf der Seite gehandelt hat, damit die ausgewählte Bildverarbeitungsroute die Änderung sehen kann. Das kostet mehr Tokens. Ist keine Bildverarbeitung verfügbar, wird die Anreicherung übersprungen und die Aufgabe mit einem Statushinweis fortgesetzt.", 'st.display.auto_screenshot.off': 'Aus', - 'st.display.auto_screenshot.navigation': 'Bei Navigation', - 'st.display.auto_screenshot.state_change': 'Bei Zustandsänderung (Standard)', + 'st.display.auto_screenshot.navigation': 'Bei Navigation (Standard)', + 'st.display.auto_screenshot.state_change': 'Bei Zustandsänderung', 'st.display.auto_screenshot.every_step': 'Bei jedem Schritt', 'st.display.tracing.label': 'Traces aufzeichnen (zum Modellvergleich)', - 'st.display.tracing.desc_html': 'Speichert jeden Durchlauf in der lokalen IndexedDB, damit Sie Modelle seitenweise inspizieren und vergleichen können. Traces öffnen →', - 'st.display.lossless_tracing.label': 'Vollständige Anforderungsdetails aufzeichnen (Debug-Stufe)', - 'st.display.lossless_tracing.desc_html': 'Speichert zusätzlich die vollständigen Prompts, Nachrichten und Tool-Schemata jeder LLM-Anfrage statt inhaltsloser Zusammenfassungen und behält bis zu 200 KB jedes Tool-Ergebnisses. Ermöglicht tiefes Debugging und die Rekonstruktion von Anfragen. Standardmäßig aus, weil es Ihren Gesprächsinhalt lokal schreibt und deutlich mehr Speicherplatz benötigt. Erfordert aktivierte Trace-Aufzeichnung.', + 'st.display.tracing.desc_html': 'Speichert jeden Durchlauf (LLM-Anfragen, Antworten, Tool-Aufrufe, Screenshots) in der lokalen IndexedDB, damit Sie Modelle nebeneinander inspizieren und vergleichen können – einschließlich der vollständigen Prompts, Nachrichten und Tool-Schemata jeder LLM-Anfrage und bis zu 200 KB jedes Tool-Ergebnisses. Öffnet sich in einem eigenen Traces-Tab. Standardmäßig aus, weil es Ihren Gesprächsinhalt lokal schreibt und deutlich mehr Speicherplatz benötigt. Traces öffnen →', 'st.display.cost_session_limit.label': 'Cloud-Kosten-Sitzungskontingent', 'st.display.cost_session_limit.desc': 'Stoppt Cloud- und OpenRouter-Durchläufe vor einem weiteren kostenpflichtigen Modellaufruf, wenn diese Sitzung das Kostenkontingent erreicht.', 'st.display.cost_total_limit.label': 'Cloud-Kosten-Gesamtkontingent', 'st.display.cost_total_limit.desc': 'Verfolgt gemeldete oder geschätzte Cloud/OpenRouter-Modellausgaben in der gesamten Erweiterung und stoppt weitere kostenpflichtige Aufrufe am Kontingent.', 'st.display.cost_reset': 'Ausgaben zurücksetzen', 'st.display.strict_secret.label': 'Strenge Geheimnisverwaltung', - 'st.display.strict_secret.desc': 'Weigert sich, Anmeldeinformationen (Passwörter, API-Schlüssel, Token, OTPs) in Zusammenfassungen oder Assistententext zu zitieren — auch wenn Sie ausdrücklich danach fragen. Nützlich, wenn Sie regelmäßig Trace-Dateien teilen oder den Bildschirm freigeben. Standardmäßig deaktiviert, damit der Agent den exakten Wert, den Sie anfordern, bei Bedarf wiedergeben kann. Aktivieren Sie es (Einstellungen → Sicherheit), wenn `done`-Zusammenfassungen ordentlich bleiben und Anmeldeinformationen nie wiederholt werden sollen.', + 'st.display.strict_secret.desc': 'Weigert sich, Anmeldeinformationen (Passwörter, API-Schlüssel, Token, OTPs) in Zusammenfassungen oder Assistententext zu zitieren — auch wenn Sie ausdrücklich danach fragen. Nützlich, wenn Sie regelmäßig Trace-Dateien teilen oder den Bildschirm freigeben. Standardmäßig deaktiviert, damit der Agent den exakten Wert, den Sie anfordern, bei Bedarf wiedergeben kann. Aktivieren Sie es, wenn `done`-Zusammenfassungen ordentlich bleiben und Anmeldeinformationen nie wiederholt werden sollen.', 'st.display.allow_local_network.label': 'Agenten den Zugriff auf das lokale Netzwerk erlauben', 'st.display.allow_local_network.desc': 'Ermöglicht es dem fetch_url-Tool des Agents, Loopback- und private/RFC1918-Adressen zu erreichen.', 'st.display.scheduled_tasks.label': 'Geplante Aufgaben', @@ -858,7 +855,7 @@ export default { 'st.providers.get_api_key': 'API-Schlüssel abrufen', 'st.providers.webbrain_note.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Anfragen werden über api.webbrain.one weitergeleitet; standardmäßig protokollieren wir Metadaten für Kontingente und Fehlerbehebung, jedoch keine Prompt-Texte, Seiteninhalte, Screenshots oder Modellantworten. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', 'st.providers.webbrain_note.privacy_link': 'Datenschutzrichtlinie', - 'st.providers.webbrain_data_use.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Solange „Bei der Verbesserung von WebBrain helfen“ standardmäßig aktiviert ist, können ausgewählte Compass-Unterhaltungen gespeichert und für Auswertung, Verbesserung, Feinabstimmung und Training verwendet werden. Deaktivieren Sie die Option unter „Allgemein → Erweitert“, um zukünftige Compass-Interaktionen davon auszuschließen. Anfragen an lokale Modelle und eigene APIs werden von WebBrain nur erfasst, wenn Sie die anbieterspezifische Option „Suchanfragen für Forschung teilen“ aktivieren. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Solange „Bei der Verbesserung von WebBrain helfen“ standardmäßig aktiviert ist, können ausgewählte Compass-Unterhaltungen gespeichert und für Auswertung, Verbesserung, Feinabstimmung und Training verwendet werden. Deaktivieren Sie die Option unter „Einstellungen → Erweitert“, um zukünftige Compass-Interaktionen davon auszuschließen. Anfragen an lokale Modelle und eigene APIs werden von WebBrain nur erfasst, wenn Sie die anbieterspezifische Option „Suchanfragen für Forschung teilen“ aktivieren. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', 'st.providers.share_research.label': "Suchanfragen für Forschung teilen", 'st.providers.share_research.hint': "Sendet Prompts und Antworten dieses Anbieters zur Auswertung und Verbesserung an WebBrain, einschließlich des verwendeten Anbieters und Modells. Bilder und binäre Anhänge werden entfernt und Texte gekürzt; der übrige Text wird unverändert gesendet.", 'st.providers.share_research.confirm': "Suchanfragen dieses Anbieters für Forschung mit WebBrain teilen?\n\nWenn aktiviert, werden Ihre Prompts, Antworten und Tool-Interaktionen mit diesem Anbieter zusammen mit Anbieter- und Modellname zur Auswertung und Verbesserung an WebBrain gesendet. Texte werden nach dem Entfernen von Bildern und Kürzen langer Inhalte unverändert gesendet – teilen Sie daher keine sensiblen persönlichen Daten. Sie können dies jederzeit deaktivieren, um die weitere Freigabe zu stoppen.", @@ -1000,7 +997,6 @@ export default { 'st.imageBudget.warning': '⚠️ Diese Einstellungen gelten für Screenshots, die für Vision erfasst werden...', // --- Screenshot redaction --- - 'st.redaction.heading': 'Screenshot-Verpixelung', 'st.redaction.toggle.label': 'Sensible Inhalte auf Screenshots verpixeln', 'st.redaction.toggle.desc': 'Bevor ein Screenshot an ein Vision-Modell gesendet wird, werden Formularfelder und Text, der wie eine E-Mail oder Telefonnummer aussieht, verwischt...', 'st.redaction.warning': '⚠️ Best-Effort und fail-open: Wenn die Verpixelung auf einer Seite nicht ausgeführt werden kann...', @@ -1293,8 +1289,8 @@ export default { "st.sync.confirm.reset": "Die verschlüsselte Cloud-Kopie durch das aktuelle WebBrain-Setup dieses Geräts ersetzen?", "st.sync.consent.legacy": "Verschlüsselte Synchronisierung aktivieren? WebBrain überträgt eine Ende-zu-Ende-verschlüsselte Kopie Ihrer Erinnerungen, des automatischen Ausfüllens Ihres Profils und der Einstellungen des API-Schlüsselanbieters an die WebBrain Compass. Chatverlauf und OAuth-Anmeldungen werden nicht synchronisiert.", "st.sync.consent.denied": "Die Berechtigung zur verschlüsselten Synchronisierung wurde nicht erteilt.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/en.js b/src/chrome/src/ui/locales/en.js index 7a5617b5a3..e10a90f023 100644 --- a/src/chrome/src/ui/locales/en.js +++ b/src/chrome/src/ui/locales/en.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Zoom extension UI out', 'sp.ui_scale.increase': 'Zoom extension UI in', 'sp.ui_scale.reset': 'Reset', - 'st.display.ui_scale.label': 'Extension UI zoom', - 'st.display.ui_scale.decrease': 'Zoom extension UI out', - 'st.display.ui_scale.increase': 'Zoom extension UI in', - 'st.display.ui_scale.reset': 'Reset', - 'st.display.ui_scale.desc': 'Resize the side panel and detached chat window without changing page zoom.', - 'st.display.ui_scale.shortcuts': 'Dedicated shortcuts: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Not assigned', - 'st.display.ui_scale.manage_shortcuts': 'Customize shortcuts', 'tool.delegate_research': 'Researching with ChatGPT', 'st.display.research_escalation.label': 'Research escalation', 'st.display.research_escalation.desc': 'When enabled, WebBrain may ask before sending an unusually complex read-only research prompt to ChatGPT. Off by default. The exact prompt is shared only after your explicit approval.', @@ -505,7 +497,7 @@ export default { 'sp.step.result_label': 'Result', 'sp.api.enabled_html': '🔓 API mutations enabled for this conversation. The agent may now use POST/PUT/PATCH/DELETE via fetch_url and execute_js when it judges API to be more reliable than UI for a step. UI-first remains the default. This flag clears when you reset the conversation.', - 'sp.permissions.disabled_html': '⚠️ Permission prompts are OFF. WebBrain will click, type, navigate, run JavaScript, upload, download, record, and schedule future work without asking first. Re-enable this from Settings → Permissions → Ask before consequential actions.', + 'sp.permissions.disabled_html': '⚠️ Permission prompts are OFF. WebBrain will click, type, navigate, run JavaScript, upload, download, record, and schedule future work without asking first. Re-enable this from the ⚠ button next to the microphone.', 'sp.permissions.button': 'Permission prompts: on', 'sp.permissions.button_off': 'Permission prompts: off', 'sp.permissions.gate_desc': 'WebBrain asks the first time it clicks, types, downloads or runs code on a site.', @@ -664,7 +656,7 @@ export default { 'ob.act.warn1': 'WebBrain may capture screenshots for planning. Avoid using agent mode on sensitive pages, such as health, finance, dating, or private account portals, unless you accept that risk.', 'ob.act.warn2': 'Web content can contain malicious prompt injections designed to manipulate AI behavior.', 'ob.act.warn3': 'Always review suggested actions and stop runs that look unexpected.', - 'ob.act.permissions_tip': 'Permission prompts are on by default. Advanced users can disable them globally with /dangerously-skip-permissions and re-enable them in Settings → Permissions.', + 'ob.act.permissions_tip': 'Permission prompts are on by default. Advanced users can disable them globally with /dangerously-skip-permissions and re-enable them from the ⚠ button next to the microphone.', 'ob.tokens.title': 'Choose a model', 'ob.tokens.body': 'WebBrain needs a language model to work. We will check for local models first. If none are available, open Settings and add a provider:', 'ob.tokens.scanning': 'Checking for local models...', @@ -690,23 +682,32 @@ export default { 'ob.btn.done': 'Get Started', 'ob.btn.skip': 'Skip for now', 'ob.btn.start': 'Start', - 'ob.cloud.body': 'WebBrain Compass is ready with a free weekly allowance. Selected Compass conversations may be retained and used to improve WebBrain while Help Improve WebBrain is on by default. You can turn it off in Settings → General.', + 'ob.cloud.body': 'WebBrain Compass is ready with a free weekly allowance. Selected Compass conversations may be retained and used to improve WebBrain while Help Improve WebBrain is on by default. You can turn it off in Settings → Advanced.', 'ob.cloud.change': 'Change', 'ob.cloud.using': 'Using WebBrain Compass. ', // --- Settings ---------------------------------------------------------- 'st.title': 'WebBrain Settings', - 'st.subtitle': 'Configure your LLM providers and preferences · v{version}', + 'st.subtitle': 'Configure how WebBrain works · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Advanced', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Speech', + 'st.tab.generative': 'Generative', + 'st.tab.decision': 'Decision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain Providers', + 'st.providers_page.subtitle': 'Choose the models WebBrain uses · v{version}', + 'st.permissions_page.title': 'WebBrain Permissions', + 'st.permissions_page.subtitle': 'Sites where WebBrain may act without asking first', 'st.tab.providers': 'Providers', 'st.tab.skills': 'Skills', 'st.tab.vision': 'Vision', - 'st.tab.multimodal': "Assistive Models", 'st.tab.memory': 'Memory', 'st.tab.profile': 'Profile', 'st.tab.account': 'Account', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Permissions', 'st.perms.gate.label': 'Ask before consequential actions', 'st.perms.gate.desc': 'Recommended. When on, WebBrain asks permission the first time it clicks, types, navigates, runs JavaScript, uploads, downloads, records, or schedules future work on a site (then remembers your choice). Turn off for fast, prompt-free use on sites you fully trust.', @@ -728,8 +729,6 @@ export default { 'st.account.update_payment': 'Update payment method', 'st.account.manage_billing': 'Manage billing', - 'st.display.language.label': 'Language', - 'st.display.language.desc': 'Interface language for the WebBrain plugin.', 'st.display.theme.label': 'Appearance', 'st.display.theme.desc': 'Light, dark, or follow your OS setting.', 'st.display.theme.system': 'System', @@ -739,8 +738,8 @@ export default { 'st.display.download_directory.desc': 'Optional subfolder inside your browser or system Downloads directory. Leave blank to use the system default.', 'st.display.download_directory.placeholder': 'System default', 'st.display.download_directory.error': 'Use a relative folder such as WebBrain or Work/WebBrain. Absolute paths and “..” are not allowed.', - 'st.display.search.placeholder': 'Search General settings', - 'st.display.search.empty': 'No General settings match.', + 'st.display.search.placeholder': 'Search settings', + 'st.display.search.empty': 'No settings match.', 'st.display.advanced': 'Advanced', ...apocalypseModeCopy, ...emergencyCopy, @@ -799,20 +798,18 @@ export default { 'st.display.auto_screenshot.label': 'Auto-screenshot', "st.display.auto_screenshot.desc": "Automatically capture a viewport screenshot after the agent acts on the page, so the selected vision route can see what changed. Costs more tokens. If vision is unavailable, enrichment is skipped and the task continues with a status notice.", 'st.display.auto_screenshot.off': 'Off', - 'st.display.auto_screenshot.navigation': 'On navigation', - 'st.display.auto_screenshot.state_change': 'On state change (default)', + 'st.display.auto_screenshot.navigation': 'On navigation (default)', + 'st.display.auto_screenshot.state_change': 'On state change', 'st.display.auto_screenshot.every_step': 'Every step', 'st.display.tracing.label': 'Record traces (for model comparison)', - 'st.display.tracing.desc_html': 'Persist every run (LLM requests, responses, tool calls, screenshots) into local IndexedDB so you can inspect and compare models side-by-side. Opens in a separate Traces tab. Off by default because it adds disk writes per step. Open Traces page →', - 'st.display.lossless_tracing.label': 'Record full request details (debug tier)', - 'st.display.lossless_tracing.desc_html': 'Also persist the full prompts, messages, and tool schemas of each LLM request instead of content-free summaries, and keep up to 200 KB of each tool result. Enables deep debugging and request reconstruction. Off by default because it writes your conversation content locally and uses much more disk. Requires Record traces to be on.', + 'st.display.tracing.desc_html': 'Persist every run (LLM requests, responses, tool calls, screenshots) into local IndexedDB so you can inspect and compare models side-by-side, including the full prompts, messages and tool schemas of each LLM request and up to 200 KB of each tool result. Opens in a separate Traces tab. Off by default because it writes your conversation content locally and uses much more disk. Open Traces page →', 'st.display.cost_session_limit.label': 'Cloud cost session allowance', 'st.display.cost_session_limit.desc': 'Stops eligible cloud and router runs before another paid model call once this session reaches the reported or estimated cost allowance. Default $10.', 'st.display.cost_total_limit.label': 'Cloud cost total allowance', 'st.display.cost_total_limit.desc': 'Tracks reported or estimated spend for eligible cloud and router model calls across the extension and stops further paid calls at the allowance.', 'st.display.cost_reset': 'Reset spend', 'st.display.strict_secret.label': 'Strict secret handling', - 'st.display.strict_secret.desc': 'Refuse to quote credentials (passwords, API keys, tokens, OTPs) in summaries or assistant text — even when you explicitly ask for them. Useful if you regularly share trace files or screen-share. Off by default so the agent can echo the exact value you ask for when you need it. Turn it on (Settings → Security) when you want `done` summaries kept tidy and credentials never repeated.', + 'st.display.strict_secret.desc': 'Refuse to quote credentials (passwords, API keys, tokens, OTPs) in summaries or assistant text — even when you explicitly ask for them. Useful if you regularly share trace files or screen-share. Off by default so the agent can echo the exact value you ask for when you need it. Turn it on when you want `done` summaries kept tidy and credentials never repeated.', 'st.display.allow_local_network.label': 'Allow agent to access local network', 'st.display.allow_local_network.desc': 'Lets the agent\'s fetch_url tool reach loopback (127.0.0.1, localhost) and private/RFC1918 addresses (10.x, 192.168.x, 172.16–31.x). Useful for local dev servers, intranet tools, or self-hosted APIs. Off by default. When off, URLs written with private or loopback IP literals and localhost names are blocked. DNS resolution is not checked, so other hostnames may still reach local addresses. Cloud-metadata IP literals (169.254.169.254) and listed metadata or *.internal/*.local hostnames stay blocked even when on.', 'st.display.scheduled_tasks.label': 'Scheduled tasks', @@ -902,7 +899,7 @@ export default { 'st.providers.compat.value.max': 'Max', 'st.providers.compat.value.system': 'System', 'st.providers.compat.value.developer': 'Developer', - 'st.providers.webbrain_data_use.body': 'Free weekly WebBrain Compass usage is included. While Help Improve WebBrain is on by default, selected Compass conversations may be retained and used for evaluation, improvement, fine-tuning, and training. Turn it off in General → Advanced to exclude future Compass interactions from those uses. Local-model and bring-your-own API requests are only collected by WebBrain when you turn on the per-provider “Share queries for research” option. {privacyLink}. For more usage, subscribe at {subscribeLink}. Manage billing at {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Free weekly WebBrain Compass usage is included. While Help Improve WebBrain is on by default, selected Compass conversations may be retained and used for evaluation, improvement, fine-tuning, and training. Turn it off in Settings → Advanced to exclude future Compass interactions from those uses. Local-model and bring-your-own API requests are only collected by WebBrain when you turn on the per-provider “Share queries for research” option. {privacyLink}. For more usage, subscribe at {subscribeLink}. Manage billing at {accountLink}.', 'st.providers.share_research.label': 'Share queries for research', 'st.providers.share_research.hint': 'Send bounded prompts, responses, tool interactions, and diagnostic trace metadata (steps, tool names, statuses, errors, and timings) from this provider to WebBrain for evaluation and improvement. Images and binary attachments are stripped; text is truncated before sharing.', 'st.providers.share_research.confirm': 'Share queries and diagnostic traces from this provider with WebBrain for research?\n\nWhen on, your prompts, responses, tool interactions, and bounded diagnostic trace metadata—including failed runs, tool names, statuses, errors, and timings—will be sent to WebBrain with the provider and model name. Screenshots and binary attachments are not uploaded. Other text is sent as-is after truncation, so avoid sharing sensitive personal data. You can turn this off at any time to stop future sharing.', @@ -1040,7 +1037,7 @@ export default { 'st.transcription.failed': 'Failed: {error}', 'st.transcription.fill_required': 'Fill in Base URL and Model first.', - // Generative Media — Assistive Models section + // Generative Media — Providers page, Generative tab 'st.imagegen.heading': "Generative Media", 'st.imagegen.desc': "Used by the generate_image agent tool to create images and other media from a text prompt with the selected provider.", 'st.imagegen.saved': 'Saved!', @@ -1052,7 +1049,7 @@ export default { // Image budget (issue #311): tune screenshot quality + how many // screenshots the agent may capture/send per turn, and how large each - // image may be. All controls live on the Assistive Models tab. + // image may be. All controls live on the Budgets tab of Settings. 'st.imageBudget.heading': 'Image budget', 'st.imageBudget.desc': 'Control screenshot size and how many the agent captures for vision per turn. Lower detail and dimension cuts cost and latency for smaller endpoints; higher keeps fidelity. Defaults match the previous behavior.', 'st.imageBudget.detail.label': 'Image detail', @@ -1069,7 +1066,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': 'Screenshot redaction', 'st.redaction.toggle.label': 'Redact sensitive content from screenshots', 'st.redaction.toggle.desc': 'Before a screenshot is sent to a vision model, blur form fields and text that looks like an email or phone number. Detection runs entirely on your device — nothing extra is transmitted.', 'st.redaction.warning': '⚠️ Best-effort and fail-open: if redaction cannot run on a page (for example right after a navigation, on PDF viewers, or on restricted browser pages), the screenshot is still sent unredacted. Detection uses DOM heuristics only — canvas-drawn text, PII inside images, or anything not recognized as a form field or email/phone text may slip through, and page text sent to the model is not redacted by this setting. It is NOT a security guarantee. For full privacy, use a local/offline model (llama.cpp, Ollama): screenshots then never leave your machine and redaction is unnecessary.', @@ -1257,7 +1253,7 @@ export default { "sp.slash.export_traces_full": "Export the complete stored trace session as JSON, including screenshots", "sp.export_traces.recording_truncated": "JSON exported with all stored records. Some content was omitted during recording and cannot be recovered by export.", "sp.slash.export_traces": "Export the tool chain (traces)", - "sp.export_traces.none": "No traces for this conversation. Enable Record traces in Settings, then run again.", + "sp.export_traces.none": "No traces for this conversation. Enable Record traces in Settings → Advanced, then run again.", "sp.export_traces.error": "Couldn't export traces.", "sp.export_traces.done": "Tool chain exported.", "sp.export_traces.no_conversation": "Nothing to export yet — start a conversation first.", @@ -1331,8 +1327,8 @@ export default { 'st.sync.confirm.reset': 'Replace the encrypted cloud copy with this device’s current WebBrain setup?', 'st.sync.consent.legacy': 'Turn on encrypted sync? WebBrain will transmit an end-to-end encrypted copy of your memories, profile autofill, and API-key provider settings to WebBrain Compass. Chat history and OAuth sign-ins are not synced.', 'st.sync.consent.denied': 'Encrypted sync permission was not granted.', - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/es.js b/src/chrome/src/ui/locales/es.js index 3b4e1dbd3c..1a7d65e3b1 100644 --- a/src/chrome/src/ui/locales/es.js +++ b/src/chrome/src/ui/locales/es.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Reducir el zoom de la interfaz', 'sp.ui_scale.increase': 'Aumentar el zoom de la interfaz', 'sp.ui_scale.reset': 'Restablecer', - 'st.display.ui_scale.label': 'Zoom de la interfaz de la extensión', - 'st.display.ui_scale.decrease': 'Reducir el zoom de la interfaz', - 'st.display.ui_scale.increase': 'Aumentar el zoom de la interfaz', - 'st.display.ui_scale.reset': 'Restablecer', - 'st.display.ui_scale.desc': 'Cambia el tamaño del panel lateral y de la ventana de chat independiente sin cambiar el zoom de la página.', - 'st.display.ui_scale.shortcuts': 'Atajos exclusivos: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Sin asignar', - 'st.display.ui_scale.manage_shortcuts': 'Personalizar atajos', 'tool.delegate_research': 'Investigando con ChatGPT', 'st.display.research_escalation.label': 'Escalado de investigación', 'st.display.research_escalation.desc': 'Cuando está activado, WebBrain puede pedir permiso antes de enviar a ChatGPT una solicitud de investigación de solo lectura inusualmente compleja. Desactivado de forma predeterminada. La solicitud exacta solo se comparte tras tu aprobación explícita.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "No continuar", "sp.recipient.reason_unrequested": "WebBrain no pudo deducir de tu solicitud que deba enviarse un mensaje. La conversación abierta en {host} es con {recipient}.", "sp.recipient.reason_unnamed": "WebBrain no pudo deducir de tu solicitud quién debe recibir este mensaje. La conversación abierta en {host} es con {recipient}.", - 'st.tab.permissions': "Permisos", 'st.perms.revoke': "Revocar", 'st.perms.clear_all': "Borrar todos los permisos", 'st.perms.gate.label': "Preguntar antes de acciones importantes", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Empezar', 'ob.btn.skip': 'Omitir por ahora', 'ob.btn.start': 'Iniciar', - 'ob.cloud.body': 'WebBrain Compass está listo con una asignación semanal gratuita. Las conversaciones de Compass seleccionadas pueden conservarse y utilizarse para mejorar WebBrain mientras Ayuda a mejorar WebBrain está activado de forma predeterminada. Puedes desactivarlo en Configuración → General.', + 'ob.cloud.body': 'WebBrain Compass está listo con una asignación semanal gratuita. Las conversaciones de Compass seleccionadas pueden conservarse y utilizarse para mejorar WebBrain mientras Ayuda a mejorar WebBrain está activado de forma predeterminada. Puedes desactivarlo en Configuración → Avanzado.', 'ob.cloud.change': 'Cambiar', 'ob.cloud.using': 'Usando WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Resultado', 'sp.api.enabled_html': '🔓 Mutaciones de API habilitadas en esta conversación. El agente ahora puede usar POST/PUT/PATCH/DELETE mediante fetch_url y execute_js cuando considere que la API es más fiable que la interfaz para un paso. La interfaz sigue siendo la opción por defecto. Este indicador se desactiva al reiniciar la conversación.', - 'sp.permissions.disabled_html': '⚠️ Las solicitudes de permiso están DESACTIVADAS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará, grabará y programará trabajos futuros sin preguntar primero. Reactiva esto desde Ajustes → Permisos → Preguntar antes de acciones importantes.', + 'sp.permissions.disabled_html': '⚠️ Las solicitudes de permiso están DESACTIVADAS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará, grabará y programará trabajos futuros sin preguntar primero. Reactiva esto desde el botón ⚠ junto al micrófono.', 'sp.permissions.button': 'Solicitudes de permiso: activadas', 'sp.permissions.button_off': 'Solicitudes de permiso: desactivadas', 'sp.permissions.gate_desc': 'WebBrain pregunta la primera vez que hace clic, escribe, descarga o ejecuta código en un sitio.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Esperando «{selector}»', 'st.title': 'Ajustes de WebBrain', - 'st.subtitle': 'Configura tus proveedores de LLM y preferencias · v{version}', + 'st.subtitle': 'Configura cómo funciona WebBrain · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Presupuestos', + 'st.tab.advanced': 'Avanzado', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Voz', + 'st.tab.generative': 'Generativo', + 'st.tab.decision': 'Decisión', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Proveedores de WebBrain', + 'st.providers_page.subtitle': 'Elige los modelos que usa WebBrain · v{version}', + 'st.permissions_page.title': 'Permisos de WebBrain', + 'st.permissions_page.subtitle': 'Sitios donde WebBrain puede actuar sin preguntar antes', 'st.tab.providers': 'Proveedores', 'st.tab.vision': 'Visión', 'st.tab.profile': 'Perfil', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Actualizar método de pago", 'st.account.manage_billing': 'Gestionar facturación', - 'st.display.language.label': 'Idioma', - 'st.display.language.desc': 'Idioma de la interfaz del plugin WebBrain.', 'st.display.verbose.label': 'Modo detallado', 'st.display.verbose.desc': 'Muestra todos los detalles de las llamadas a herramientas, argumentos y resultados JSON sin procesar. Desactivado por defecto para una experiencia de chat más limpia.', 'st.display.selection_shortcut.label': 'Acceso directo de selección', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Captura automática', "st.display.auto_screenshot.desc": "Captura automáticamente una imagen de la ventana después de que el agente actúe en la página, para que la ruta de visión seleccionada vea qué cambió. Consume más tokens. Si la visión no está disponible, se omite el enriquecimiento y la tarea continúa con un aviso de estado.", 'st.display.auto_screenshot.off': 'Desactivada', - 'st.display.auto_screenshot.navigation': 'Al navegar', - 'st.display.auto_screenshot.state_change': 'Al cambiar de estado (por defecto)', + 'st.display.auto_screenshot.navigation': 'Al navegar (por defecto)', + 'st.display.auto_screenshot.state_change': 'Al cambiar de estado', 'st.display.auto_screenshot.every_step': 'En cada paso', 'st.display.tracing.label': 'Registrar trazas (para comparar modelos)', - 'st.display.tracing.desc_html': 'Guarda cada ejecución (peticiones al LLM, respuestas, llamadas a herramientas, capturas) en IndexedDB local para que puedas inspeccionar y comparar modelos lado a lado. Se abre en una pestaña de Trazas aparte. Desactivado por defecto porque añade escrituras en disco por paso. Abrir página de Trazas →', - 'st.display.lossless_tracing.label': 'Grabar detalles completos de la solicitud (nivel de depuración)', - 'st.display.lossless_tracing.desc_html': 'También guarda los prompts, mensajes y esquemas de herramientas completos de cada solicitud LLM en lugar de resúmenes sin contenido, y conserva hasta 200 KB de cada resultado de herramienta. Permite depuración profunda y reconstrucción de solicitudes. Desactivado por defecto porque escribe el contenido de tu conversación localmente y usa mucho más disco. Requiere que Grabar trazas esté activado.', + 'st.display.tracing.desc_html': 'Guarda cada ejecución (peticiones al LLM, respuestas, llamadas a herramientas, capturas) en IndexedDB local para que puedas inspeccionar y comparar modelos lado a lado, incluidos los prompts, mensajes y esquemas de herramientas completos de cada solicitud LLM y hasta 200 KB de cada resultado de herramienta. Se abre en una pestaña de Trazas aparte. Desactivado por defecto porque escribe el contenido de tu conversación localmente y usa mucho más disco. Abrir página de Trazas →', 'st.display.allow_local_network.label': 'Permitir al agente acceder a la red local', 'st.display.allow_local_network.desc': 'Permite que la herramienta fetch_url del agente alcance direcciones loopback (127.0.0.1, localhost) y privadas/RFC1918 (10.x, 192.168.x, 172.16–31.x). Útil para servidores de desarrollo locales, herramientas de intranet o APIs auto-alojadas. Desactivado por defecto. Al desactivarlo, se bloquean las URL escritas con IP privadas o de loopback y nombres localhost. No se comprueba la resolución DNS, por lo que otros nombres de host pueden alcanzar direcciones locales. Las IP literales de metadatos de la nube (169.254.169.254) y los nombres de metadatos incluidos en la lista o *.internal/*.local siguen bloqueados incluso al activarlo.', 'st.display.notify_sound.label': "Sonidos de notificación", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Modo de visión activado para el proveedor activo.", "sp.vision.off": "Modo de visión desactivado para el proveedor activo.", "sp.vision.error": "Falló el cambio del modo de visión: {msg}", - "st.tab.multimodal": "Modelos auxiliares", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Recomendado. Cuando está activado, WebBrain pide permiso la primera vez que hace clic, escribe, navega, ejecuta JavaScript, sube, descarga o graba en un sitio (y luego recuerda tu elección). Desactívalo para un uso rápido y sin avisos en sitios en los que confías plenamente.", "st.perms.gate.warning": "⚠️ Los avisos de permiso están DESACTIVADOS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará y grabará en cualquier sitio SIN preguntar, incluso en páginas cuyo contenido pueda estar controlado por un atacante. El contenido de la página se sigue tratando como no fiable internamente, pero nada impedirá que una instrucción inyectada desencadene una acción. Deja esto desactivado solo si confías plenamente en todos los sitios donde usas el asistente.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Predeterminado del sistema", "st.display.download_directory.error": "Usa una carpeta relativa como WebBrain o Work/WebBrain. No se permiten rutas absolutas ni “..”.", "st.display.strict_secret.label": "Manejo estricto de secretos", - "st.display.strict_secret.desc": "Se niega a citar credenciales (contraseñas, claves de API, tokens, OTPs) en resúmenes o texto del asistente, incluso cuando se las pidas explícitamente. Útil si compartes a menudo archivos de traza o tu pantalla. Desactivado por defecto para que el agente pueda repetir el valor exacto que pidas cuando lo necesites. Actívalo (Ajustes → Seguridad) cuando quieras mantener limpios los resúmenes de `done` y que las credenciales nunca se repitan.", + "st.display.strict_secret.desc": "Se niega a citar credenciales (contraseñas, claves de API, tokens, OTPs) en resúmenes o texto del asistente, incluso cuando se las pidas explícitamente. Útil si compartes a menudo archivos de traza o tu pantalla. Desactivado por defecto para que el agente pueda repetir el valor exacto que pidas cuando lo necesites. Actívalo cuando quieras mantener limpios los resúmenes de `done` y que las credenciales nunca se repitan.", "st.display.request_timeout.label": "Tiempo de espera de la petición al LLM", "st.display.request_timeout.desc": "Tiempo máximo de espera para recibir las cabeceras y para cada pausa entre fragmentos de la respuesta en streaming. Por defecto: 120 s. Auméntalo para modelos locales lentos, especialmente en CPU o con contextos grandes.", "st.providers.filter.all": "Todos", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Los mensajes se ponen en cola mientras WebBrain está ocupado. Solo /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces y /verbose pueden ejecutarse de inmediato como comandos slash.', 'tool.go_back': 'Volviendo atrás', 'tool.go_forward': 'Avanzando', - 'st.display.search.placeholder': 'Buscar en ajustes generales', - 'st.display.search.empty': 'No hay ajustes generales que coincidan.', + 'st.display.search.placeholder': 'Buscar en ajustes', + 'st.display.search.empty': 'No hay ajustes que coincidan.', 'st.display.advanced': 'Avanzado', ...getApocalypseModeCopy('es'), ...getEmergencyBoxCopy('es'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Ninguna memoria guardada tiene ese ID.", "st.memory.security_html": "Privacidad: la memoria del usuario se almacena como texto sin formato en este perfil del navegador. Cuando está activada, los registros de memoria activos se envían al proveedor de LLM que configures como parte de las instrucciones del sistema. No guardes aquí contraseñas, claves de API, tokens, códigos de recuperación ni secretos sensibles.", "hist.filter.clear": "Borrar el filtro y mostrar todas las conversaciones", - "st.redaction.heading": "Redacción de capturas de pantalla", "st.redaction.toggle.label": "Redactar contenido sensible en las capturas de pantalla", "st.redaction.toggle.desc": "Antes de enviar una captura de pantalla a un modelo de visión, difumina los campos de formulario y el texto que parezca un correo electrónico o un número de teléfono. La detección se ejecuta enteramente en tu dispositivo — no se transmite nada adicional.", "st.redaction.warning": "⚠️ Es una redacción best-effort y fail-open: si no se puede aplicar en una página (por ejemplo justo después de una navegación, en visores de PDF o en páginas restringidas del navegador), la captura se envía igualmente sin redactar. La detección usa solo heurísticas del DOM — texto dibujado en un canvas, datos personales dentro de imágenes, o cualquier cosa no reconocida como campo de formulario o texto de correo/teléfono puede pasar desapercibida, y el texto de la página enviado al modelo no se redacta con este ajuste. No es una garantía de seguridad. Para privacidad total, usa un modelo local/sin conexión (llama.cpp, Ollama): las capturas nunca saldrán de tu equipo y la redacción deja de ser necesaria.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Exportar toda la sesión de trazas guardada como JSON, incluidas las capturas", "sp.export_traces.recording_truncated": "Se exportaron todos los registros guardados como JSON. El contenido omitido durante la grabación no puede recuperarse mediante la exportación.", "sp.slash.export_traces": "Exportar la cadena de herramientas (trazas)", - "sp.export_traces.none": "No hay trazas para esta conversación. Activa «Registrar trazas» en Ajustes y vuelve a ejecutar.", + "sp.export_traces.none": "No hay trazas para esta conversación. Activa «Registrar trazas» en Ajustes → Avanzado y vuelve a ejecutar.", "sp.export_traces.error": "No se pudieron exportar las trazas.", "sp.export_traces.done": "Cadena de herramientas exportada.", "sp.export_traces.no_conversation": "Aún no hay nada que exportar: inicia una conversación primero.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Usar WebBrain como mi página de nueva pestaña", "st.display.newtab.desc": "Las pestañas nuevas abren una página de WebBrain con un cuadro para preguntar, actuar o buscar. Desactívalo para mantener la página de nueva pestaña normal de tu navegador; puedes cambiarlo cuando quieras en Ajustes → General.", "st.display.help_improve.desc_html": "Permite conservar determinadas interacciones de WebBrain Compass y utilizarlas para evaluación, mejora, ajuste fino y entrenamiento. Activado de forma predeterminada. Desactívalo para impedir que futuras interacciones de Compass se utilicen con esos fines. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API de los proveedores donde actives «Compartir consultas para investigación». Política de privacidad →", - "st.providers.webbrain_data_use.body": "Se incluye uso diario gratuito de WebBrain Compass. Mientras Ayuda a mejorar WebBrain está activado de forma predeterminada, algunas conversaciones de Compass pueden conservarse y utilizarse para evaluación, mejora, ajuste fino y entrenamiento. Desactívalo en General → Avanzado para excluir futuras interacciones de Compass de esos usos. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API cuando activas la opción «Compartir consultas para investigación» de ese proveedor. {privacyLink}. Para obtener más uso, suscríbete en {subscribeLink}. Gestiona la facturación en {accountLink}.", + "st.providers.webbrain_data_use.body": "Se incluye uso diario gratuito de WebBrain Compass. Mientras Ayuda a mejorar WebBrain está activado de forma predeterminada, algunas conversaciones de Compass pueden conservarse y utilizarse para evaluación, mejora, ajuste fino y entrenamiento. Desactívalo en Ajustes → Avanzado para excluir futuras interacciones de Compass de esos usos. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API cuando activas la opción «Compartir consultas para investigación» de ese proveedor. {privacyLink}. Para obtener más uso, suscríbete en {subscribeLink}. Gestiona la facturación en {accountLink}.", 'st.providers.share_research.label': "Compartir consultas para investigación", 'st.providers.share_research.hint': "Envía los prompts y respuestas de este proveedor a WebBrain para evaluación y mejora, incluidos el proveedor y el modelo utilizados. Las imágenes y los adjuntos binarios se eliminan y el texto se trunca antes de compartir; el resto del texto se envía tal cual.", 'st.providers.share_research.confirm': "¿Compartir las consultas de este proveedor con WebBrain para investigación?\n\nSi se activa, tus prompts, respuestas e interacciones de herramientas con este proveedor se enviarán a WebBrain para evaluación y mejora, junto con el nombre del proveedor y del modelo. El texto se envía tal cual tras eliminar imágenes y truncar contenidos largos, así que evita compartir datos personales sensibles. Puedes desactivarlo en cualquier momento para detener el intercambio.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "¿Quieres menos interrupciones? «Permitir siempre» recuerda este sitio. El comando de abajo desactiva los avisos de permisos de WebBrain en todos los sitios.", "sp.perm.insert_skip_command": "Insertar /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Tu borrador no ha cambiado. Bórralo antes de insertar el comando.", - "ob.act.permissions_tip": "Los avisos de permisos están activados de forma predeterminada. Los usuarios avanzados pueden desactivarlos globalmente con /dangerously-skip-permissions y volver a activarlos en Configuración → Permisos.", + "ob.act.permissions_tip": "Los avisos de permisos están activados de forma predeterminada. Los usuarios avanzados pueden desactivarlos globalmente con /dangerously-skip-permissions y volver a activarlos desde el botón ⚠ junto al micrófono.", 'st.provider.field.cache_read_cost_per_million': "Coste estimado de lectura de caché ($ / 1M tokens)", 'st.provider.field.cache_write_cost_per_million': "Coste estimado de escritura en caché de 5 min ($ / 1M tokens)", 'st.provider.field.cache_write_1h_cost_per_million': "Coste estimado de escritura en caché de 1 h ($ / 1M tokens)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "¿Reemplazar la copia cifrada en la nube con la configuración actual de WebBrain de este dispositivo?", "st.sync.consent.legacy": "¿Activar sincronización cifrada? WebBrain transmitirá una copia cifrada de extremo a extremo de sus recuerdos, el autocompletado de perfiles y la configuración del proveedor de claves API a WebBrain Compass. El historial de chat y los inicios de sesión de OAuth no están sincronizados.", "st.sync.consent.denied": "No se concedió el permiso de sincronización cifrada.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/fa.js b/src/chrome/src/ui/locales/fa.js index 6d719d2123..421b7d7c58 100644 --- a/src/chrome/src/ui/locales/fa.js +++ b/src/chrome/src/ui/locales/fa.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'کاهش بزرگ‌نمایی رابط افزونه', 'sp.ui_scale.increase': 'افزایش بزرگ‌نمایی رابط افزونه', 'sp.ui_scale.reset': 'بازنشانی', - 'st.display.ui_scale.label': 'بزرگ‌نمایی رابط کاربری افزونه', - 'st.display.ui_scale.decrease': 'کاهش بزرگ‌نمایی رابط افزونه', - 'st.display.ui_scale.increase': 'افزایش بزرگ‌نمایی رابط افزونه', - 'st.display.ui_scale.reset': 'بازنشانی', - 'st.display.ui_scale.desc': 'اندازهٔ پنل کناری و پنجرهٔ گفت‌وگوی جداگانه را بدون تغییر بزرگ‌نمایی صفحه تغییر دهید.', - 'st.display.ui_scale.shortcuts': 'میانبرهای اختصاصی: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'تنظیم نشده', - 'st.display.ui_scale.manage_shortcuts': 'سفارشی‌سازی میانبرها', 'tool.delegate_research': 'در حال پژوهش با ChatGPT', 'st.display.research_escalation.label': 'ارتقای پژوهش', 'st.display.research_escalation.desc': 'در صورت فعال بودن، WebBrain ممکن است پیش از ارسال یک درخواست پژوهشی فقط‌خواندنی و بسیار پیچیده به ChatGPT اجازه بخواهد. به‌صورت پیش‌فرض خاموش است. متن دقیق فقط پس از تأیید صریح شما به اشتراک گذاشته می‌شود.', @@ -500,7 +492,7 @@ export default { 'sp.step.result_label': "نتیجه", 'sp.api.enabled_html': "🔓 جهش های API فعال شد برای این گفتگو عامل اکنون ممکن است از POST/PUT/PATCH/DELETE از طریق fetch_url و execute_js استفاده کند، زمانی که تشخیص دهد API برای یک مرحله قابل اعتمادتر از UI است. UI-first پیش فرض باقی می ماند. وقتی مکالمه را بازنشانی می کنید، این پرچم پاک می شود.", - 'sp.permissions.disabled_html': "⚠️ درخواست‌های مجوز خاموش هستند. WebBrain کلیک می کند، تایپ می کند، پیمایش می کند، جاوا اسکریپت را اجرا می کند، آپلود می کند، دانلود می کند، ضبط می کند و کارهای آینده را بدون درخواست اولیه برنامه ریزی می کند. این را از تنظیمات → مجوزها → قبل از اقدامات بعدی بپرسید دوباره فعال کنید.", + 'sp.permissions.disabled_html': "⚠️ درخواست‌های مجوز خاموش هستند. WebBrain کلیک می کند، تایپ می کند، پیمایش می کند، جاوا اسکریپت را اجرا می کند، آپلود می کند، دانلود می کند، ضبط می کند و کارهای آینده را بدون درخواست اولیه برنامه ریزی می کند. این را از دکمهٔ ⚠ کنار میکروفون دوباره فعال کنید.", 'sp.permissions.button': 'درخواست‌های مجوز: روشن', 'sp.permissions.button_off': 'درخواست‌های مجوز: خاموش', 'sp.permissions.gate_desc': 'WebBrain اولین باری که در یک سایت کلیک می‌کند، تایپ می‌کند، فایلی دانلود می‌کند یا کدی اجرا می‌کند، اجازه می‌گیرد.', @@ -659,7 +651,7 @@ export default { 'ob.act.warn1': "WebBrain ممکن است برای برنامه ریزی اسکرین شات بگیرد. از استفاده از حالت نماینده در صفحات حساس مانند سلامت، امور مالی، دوستیابی یا پورتال های حساب خصوصی خودداری کنید، مگر اینکه این خطر را بپذیرید.", 'ob.act.warn2': "محتوای وب می‌تواند حاوی تزریق‌های بدافزار باشد که برای دستکاری رفتار هوش مصنوعی طراحی شده‌اند.", 'ob.act.warn3': "همیشه اقدامات پیشنهادی را مرور کنید و اجرای غیرمنتظره‌ای را متوقف کنید.", - 'ob.act.permissions_tip': "درخواست های مجوز به طور پیش فرض روشن هستند. کاربران پیشرفته می توانند با /dangerously-skip-permissions آنها را به صورت جهانی غیرفعال کنند و در تنظیمات → مجوزها مجدداً آنها را فعال کنند.", + 'ob.act.permissions_tip': "درخواست های مجوز به طور پیش فرض روشن هستند. کاربران پیشرفته می توانند با /dangerously-skip-permissions آنها را به صورت جهانی غیرفعال کنند و از دکمهٔ ⚠ کنار میکروفون دوباره آن‌ها را فعال کنند.", 'ob.tokens.title': "یک مدل انتخاب کنید", 'ob.tokens.body': "WebBrain برای کار کردن به یک مدل زبان نیاز دارد. ابتدا مدل های محلی را بررسی می کنیم. اگر هیچ یک در دسترس نیست، تنظیمات را باز کنید و یک ارائه دهنده اضافه کنید:", 'ob.tokens.scanning': "بررسی مدل های محلی...", @@ -685,23 +677,32 @@ export default { 'ob.btn.done': "شروع کنید", 'ob.btn.skip': "فعلا رد شوید", 'ob.btn.start': 'شروع', - 'ob.cloud.body': 'WebBrain Compass با یک بدله هفتگی رایگان آماده است. مکالمات Compass انتخابی ممکن است حفظ شوند و برای بهبود WebBrain استفاده شوند در حالی که Help Improve WebBrain به طور پیش فرض روشن است. شما می توانید آن را در Settings → General خاموش کنید.', + 'ob.cloud.body': 'WebBrain Compass با یک بدله هفتگی رایگان آماده است. مکالمات Compass انتخابی ممکن است حفظ شوند و برای بهبود WebBrain استفاده شوند در حالی که Help Improve WebBrain به طور پیش فرض روشن است. شما می توانید آن را در Settings → Advanced خاموش کنید.', 'ob.cloud.change': 'تغییر', 'ob.cloud.using': 'استفاده از WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "تنظیمات WebBrain", - 'st.subtitle': "ارائه دهندگان و تنظیمات برگزیده LLM خود را پیکربندی کنید · v{version}", + 'st.subtitle': "نحوهٔ کار WebBrain را پیکربندی کنید · v{version}", 'st.tab.display': "ژنرال", + 'st.tab.budgets': 'بودجه‌ها', + 'st.tab.advanced': 'پیشرفته', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'گفتار', + 'st.tab.generative': 'مولد', + 'st.tab.decision': 'تصمیم', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'ارائه‌دهندگان WebBrain', + 'st.providers_page.subtitle': 'مدل‌هایی را که WebBrain استفاده می‌کند انتخاب کنید · v{version}', + 'st.permissions_page.title': 'مجوزهای WebBrain', + 'st.permissions_page.subtitle': 'سایت‌هایی که WebBrain می‌تواند بدون پرسیدن در آن‌ها عمل کند', 'st.tab.providers': "ارائه دهندگان", 'st.tab.skills': "مهارت ها", 'st.tab.vision': "چشم انداز", - 'st.tab.multimodal': "مدل‌های کمکی", 'st.tab.memory': "حافظه", 'st.tab.profile': "نمایه", 'st.tab.account': "حساب", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "مجوزها", 'st.perms.gate.label': "قبل از اقدامات بعدی بپرسید", 'st.perms.gate.desc': "توصیه می شود. وقتی روشن است، WebBrain اولین باری که کلیک می‌کند، تایپ می‌کند، پیمایش می‌کند، جاوا اسکریپت را اجرا می‌کند، آپلود می‌کند، دانلود می‌کند، ضبط می‌کند، یا زمان‌بندی کار آینده در یک سایت را می‌گیرد (سپس انتخاب شما را به خاطر می‌آورد). برای استفاده سریع و بی‌سرعت در سایت‌هایی که کاملاً به آن‌ها اعتماد دارید خاموش کنید.", @@ -723,8 +724,6 @@ export default { "st.account.update_payment": "به‌روزرسانی روش پرداخت", 'st.account.manage_billing': "مدیریت صورتحساب", - 'st.display.language.label': "زبان", - 'st.display.language.desc': "زبان رابط برای افزونه WebBrain.", 'st.display.theme.label': "ظاهر", 'st.display.theme.desc': "روشن، تاریک، یا تنظیمات سیستم عامل خود را دنبال کنید.", 'st.display.theme.system': "سیستم", @@ -734,8 +733,8 @@ export default { 'st.display.download_directory.desc': "زیرپوشه اختیاری در فهرست دانلودهای مرورگر یا سیستم شما. برای استفاده از پیش فرض سیستم، آن را خالی بگذارید.", 'st.display.download_directory.placeholder': "پیش فرض سیستم", 'st.display.download_directory.error': "از یک پوشه نسبی مانند WebBrain یا Work/WebBrain استفاده کنید. مسیرهای مطلق و «..» مجاز نیستند.", - 'st.display.search.placeholder': "تنظیمات عمومی را جستجو کنید", - 'st.display.search.empty': "تنظیمات عمومی مطابقت ندارد.", + 'st.display.search.placeholder': "جستجو در تنظیمات", + 'st.display.search.empty': "هیچ تنظیمی مطابقت ندارد.", 'st.display.advanced': "پیشرفته", ...getApocalypseModeCopy('fa'), ...getEmergencyBoxCopy('fa'), @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': "اسکرین شات خودکار", "st.display.auto_screenshot.desc": "پس از اقدام عامل روی صفحه، به‌طور خودکار از نمای صفحه عکس بگیرید تا مسیر بینایی انتخاب‌شده تغییرات را ببیند. این کار توکن بیشتری مصرف می‌کند. اگر بینایی در دسترس نباشد، غنی‌سازی رد می‌شود و کار با یک اعلان وضعیت ادامه می‌یابد.", 'st.display.auto_screenshot.off': "خاموش", - 'st.display.auto_screenshot.navigation': "در ناوبری", - 'st.display.auto_screenshot.state_change': "در تغییر وضعیت (پیش‌فرض)", + 'st.display.auto_screenshot.navigation': "در ناوبری (پیش‌فرض)", + 'st.display.auto_screenshot.state_change': "در تغییر وضعیت", 'st.display.auto_screenshot.every_step': "هر قدم", 'st.display.tracing.label': "ثبت ردیابی (برای مقایسه مدل)", - 'st.display.tracing.desc_html': "هر اجرا (درخواست‌های LLM، پاسخ‌ها، تماس‌های ابزار، تصاویر صفحه) را در IndexedDB محلی ادامه دهید تا بتوانید مدل‌ها را در کنار یکدیگر بررسی و مقایسه کنید. در یک برگه Traces جداگانه باز می شود. به‌طور پیش‌فرض خاموش است زیرا نوشته‌های دیسک را در هر مرحله اضافه می‌کند. باز کردن صفحه Traces →", - 'st.display.lossless_tracing.label': 'ثبت جزئیات کامل درخواست (لایه اشکالزدایی)', - 'st.display.lossless_tracing.desc_html': 'همچنین پرامپتها، پیامها و ساختار ابزارهای کامل هر درخواست LLM را بهجای خلاصههای بدون محتوا ذخیره میکند و تا ۲۰۰ کیلوبایت از هر نتیجه ابزار را نگه میدارد. اشکالزدایی عمیق و بازسازی درخواست را ممکن میسازد. بهصورت پیشفرض خاموش است زیرا محتوای گفتوگوی شما را محلی مینویسد و فضای دیسک بسیار بیشتری مصرف میکند. نیازمند فعال بودن ضبط ردگیری است.', + 'st.display.tracing.desc_html': "هر اجرا (درخواست‌های LLM، پاسخ‌ها، فراخوانی‌های ابزار، تصاویر صفحه) را در IndexedDB محلی ذخیره کنید تا بتوانید مدل‌ها را کنار هم بررسی و مقایسه کنید، از جمله پرامپت‌ها، پیام‌ها و ساختار کامل ابزارهای هر درخواست LLM و تا ۲۰۰ کیلوبایت از هر نتیجهٔ ابزار. در یک برگهٔ Traces جداگانه باز می‌شود. به‌طور پیش‌فرض خاموش است زیرا محتوای گفت‌وگوی شما را به‌صورت محلی می‌نویسد و فضای دیسک بسیار بیشتری مصرف می‌کند. باز کردن صفحه Traces →", 'st.display.cost_session_limit.label': "کمک هزینه جلسه هزینه ابر", 'st.display.cost_session_limit.desc': "هنگامی که این جلسه به میزان هزینه گزارش شده یا تخمین زده شده رسید، ابر را متوقف می کند و OpenRouter قبل از تماس مدل پولی دیگر اجرا می شود. پیش فرض 10 دلار.", 'st.display.cost_total_limit.label': "هزینه کل کمک هزینه", 'st.display.cost_total_limit.desc': "هزینه‌های گزارش‌شده یا تخمینی مدل ابر/OpenRouter را در سراسر برنامه افزودنی ردیابی می‌کند و تماس‌های پولی بیشتر را با کمک هزینه متوقف می‌کند. ارائه دهندگان محلی به حساب نمی آیند.", 'st.display.cost_reset': "بازنشانی هزینه", 'st.display.strict_secret.label': "برخورد محرمانه دقیق", - 'st.display.strict_secret.desc': "از نقل قول اعتبارنامه ها (گذرواژه، کلیدهای API، نشانه ها، OTPها) در خلاصه ها یا متن دستیار خودداری کنید - حتی زمانی که صریحاً آنها را درخواست می کنید. اگر به طور منظم فایل های ردیابی یا اشتراک گذاری صفحه را به اشتراک می گذارید مفید است. به‌طور پیش‌فرض خاموش است تا نماینده بتواند در صورت نیاز مقدار دقیقی را که درخواست می‌کنید بازگو کند. وقتی می‌خواهید خلاصه‌های `done` مرتب بمانند و اعتبارنامه‌ها هرگز تکرار نشوند، آن را روشن کنید (تنظیمات ← امنیت).", + 'st.display.strict_secret.desc': "از نقل قول اعتبارنامه ها (گذرواژه، کلیدهای API، نشانه ها، OTPها) در خلاصه ها یا متن دستیار خودداری کنید - حتی زمانی که صریحاً آنها را درخواست می کنید. اگر به طور منظم فایل های ردیابی یا اشتراک گذاری صفحه را به اشتراک می گذارید مفید است. به‌طور پیش‌فرض خاموش است تا نماینده بتواند در صورت نیاز مقدار دقیقی را که درخواست می‌کنید بازگو کند. وقتی می‌خواهید خلاصه‌های `done` مرتب بمانند و اعتبارنامه‌ها هرگز تکرار نشوند، آن را روشن کنید.", 'st.display.allow_local_network.label': "به عامل اجازه دسترسی به شبکه محلی را بدهید", 'st.display.allow_local_network.desc': "به ابزار fetch_url عامل اجازه می‌دهد به آدرس‌های Loopback (127.0.0.1، localhost) و خصوصی/RFC1918 (10.x، 192.168.x، 172.16–31.x) دسترسی پیدا کند. برای سرورهای توسعه دهنده محلی، ابزارهای اینترانت یا APIهای خود میزبان مفید است. به‌طور پیش‌فرض خاموش است. وقتی خاموش است، URLهایی که در آن‌ها IP خصوصی یا Loopback به‌صورت مستقیم نوشته شده و نام‌های localhost مسدود می‌شوند. نتیجهٔ DNS بررسی نمی‌شود، پس نام‌های میزبان دیگر ممکن است به آدرس‌های محلی برسند. IPهای مستقیم ابردادهٔ ابری (169.254.169.254) و نام‌های فهرست‌شدهٔ ابرداده یا *.internal/*.local حتی در صورت روشن بودن مسدود می‌مانند.", 'st.display.scheduled_tasks.label': "وظایف برنامه ریزی شده", @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': "حداکثر", 'st.providers.compat.value.system': "سیستم", 'st.providers.compat.value.developer': "توسعه دهنده", - 'st.providers.webbrain_data_use.body': "استفاده روزانه رایگان از WebBrain Compass گنجانده شده است. در حالی که Help Improve WebBrain به طور پیش‌فرض روشن است، مکالمات انتخابی Compass ممکن است حفظ شوند و برای ارزیابی، بهبود، تنظیم دقیق و آموزش استفاده شوند. آن را در عمومی ← پیشرفته خاموش کنید تا تعاملات Compass آینده را از این کاربردها حذف کنید. WebBrain درخواست‌های مدل محلی و API شخصی شما را فقط زمانی جمع‌آوری می‌کند که گزینه «اشتراک‌گذاری پرسش‌ها برای پژوهش» همین ارائه‌دهنده را روشن کنید. {privacyLink}. برای استفاده بیشتر، در {subscribeLink} مشترک شوید. صورتحساب را در {accountLink} مدیریت کنید.", + 'st.providers.webbrain_data_use.body': "استفاده روزانه رایگان از WebBrain Compass گنجانده شده است. در حالی که Help Improve WebBrain به طور پیش‌فرض روشن است، مکالمات انتخابی Compass ممکن است حفظ شوند و برای ارزیابی، بهبود، تنظیم دقیق و آموزش استفاده شوند. آن را در تنظیمات ← پیشرفته خاموش کنید تا تعاملات Compass آینده را از این کاربردها حذف کنید. WebBrain درخواست‌های مدل محلی و API شخصی شما را فقط زمانی جمع‌آوری می‌کند که گزینه «اشتراک‌گذاری پرسش‌ها برای پژوهش» همین ارائه‌دهنده را روشن کنید. {privacyLink}. برای استفاده بیشتر، در {subscribeLink} مشترک شوید. صورتحساب را در {accountLink} مدیریت کنید.", 'st.providers.share_research.label': "اشتراک‌گذاری پرسش‌ها برای پژوهش", 'st.providers.share_research.hint': "اعلان‌ها و پاسخ‌های این ارائه‌دهنده را به‌همراه نام ارائه‌دهنده و مدل استفاده‌شده برای ارزیابی و بهبود به WebBrain ارسال می‌کند. تصاویر و پیوست‌های باینری پیش از اشتراک حذف و متن کوتاه می‌شود؛ متن باقی‌مانده بدون تغییر ارسال می‌شود.", 'st.providers.share_research.confirm': "پرسش‌های این ارائه‌دهنده برای پژوهش با WebBrain به اشتراک گذاشته شود؟\n\nهنگام فعال بودن، اعلان‌ها، پاسخ‌ها و تعامل‌های ابزار شما با این ارائه‌دهنده به‌همراه نام ارائه‌دهنده و مدل برای ارزیابی و بهبود به WebBrain ارسال می‌شود. متن پس از حذف تصاویر و کوتاه‌سازی محتوای طولانی بدون تغییر ارسال می‌شود، پس از اشتراک داده‌های شخصی حساس خودداری کنید. می‌توانید هر زمان آن را خاموش کنید تا اشتراک آینده متوقف شود.", @@ -1058,7 +1055,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "ویرایش اسکرین شات", 'st.redaction.toggle.label': "محتوای حساس را از روی اسکرین شات ها ویرایش کنید", 'st.redaction.toggle.desc': "قبل از ارسال اسکرین شات به مدل بینایی، فیلدها و متنی را که شبیه ایمیل یا شماره تلفن است محو کنید. تشخیص به طور کامل بر روی دستگاه شما اجرا می شود - هیچ چیز اضافی منتقل نمی شود.", 'st.redaction.warning': "⚠️ بهترین تلاش و باز کردن شکست: اگر ویرایش در یک صفحه اجرا نشود (مثلاً بلافاصله پس از پیمایش، در بینندگان PDF یا در صفحات مرورگر محدود شده)، تصویر صفحه همچنان بدون ویرایش ارسال می‌شود. تشخیص فقط از روش‌های اکتشافی DOM استفاده می‌کند - متن بوم کشیده، PII داخل تصاویر، یا هر چیزی که به‌عنوان فیلد فرم یا متن ایمیل/تلفن شناسایی نمی‌شود ممکن است از بین برود، و متن صفحه ارسال‌شده به مدل با این تنظیم ویرایش نمی‌شود. این یک تضمین امنیتی نیست. برای حفظ حریم خصوصی کامل، از یک مدل محلی/آفلاین (llama.cpp، Ollama) استفاده کنید: تصاویر صفحه‌نمایش هرگز از دستگاه خود خارج نمی‌شوند و ویرایش غیرضروری است.", @@ -1246,7 +1242,7 @@ export default { "sp.slash.export_traces_full": "صدور تمام نشست ردگیری ذخیره‌شده به صورت JSON، شامل تصاویر صفحه", "sp.export_traces.recording_truncated": "تمام رکوردهای ذخیره‌شده به صورت JSON صادر شدند. محتوای حذف‌شده هنگام ضبط با صدور قابل بازیابی نیست.", "sp.slash.export_traces": "صادرات زنجیره ابزار (ردیابی)", - "sp.export_traces.none": "هیچ اثری برای این گفتگو وجود ندارد. ضبط ردیابی را در تنظیمات فعال کنید، سپس دوباره اجرا کنید.", + "sp.export_traces.none": "هیچ اثری برای این گفتگو وجود ندارد. ضبط ردیابی را در تنظیمات ← پیشرفته فعال کنید، سپس دوباره اجرا کنید.", "sp.export_traces.error": "ردیابی صادر نشد.", "sp.export_traces.done": "زنجیره ابزار صادر شد.", "sp.export_traces.no_conversation": "هنوز چیزی برای صادرات وجود ندارد - ابتدا یک مکالمه را شروع کنید.", @@ -1320,8 +1316,8 @@ export default { "st.sync.confirm.reset": "کپی ابری رمزگذاری شده با راه‌اندازی فعلی WebBrain این دستگاه جایگزین شود؟", "st.sync.consent.legacy": "همگام سازی رمزگذاری شده روشن شود؟ WebBrain یک نسخه رمزگذاری شده سرتاسر از خاطرات، تکمیل خودکار نمایه و تنظیمات ارائه دهنده کلید API شما را به WebBrain Compass منتقل می کند. سابقه گپ و ورود به سیستم OAuth همگام سازی نمی شوند.", "st.sync.consent.denied": "مجوز همگام‌سازی رمزگذاری شده داده نشد.", - 'st.providers.webgpu_note.body': '{modelLink} بدون هیچ نقطهٔ پایانی API کاملاً در Chrome اجرا می‌شود. آن را در Settings > Providers > WebGPU یا حالت Apocalypse دانلود کنید، سپس از کنترل nuclear در standalone chat استفاده کنید.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} بدون هیچ نقطهٔ پایانی API کاملاً در Chrome اجرا می‌شود. آن را در Providers > WebGPU یا حالت Apocalypse دانلود کنید، سپس از کنترل nuclear در standalone chat استفاده کنید.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/fr.js b/src/chrome/src/ui/locales/fr.js index 6c963c95c5..811b2f593d 100644 --- a/src/chrome/src/ui/locales/fr.js +++ b/src/chrome/src/ui/locales/fr.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Réduire le zoom de l’interface', 'sp.ui_scale.increase': 'Augmenter le zoom de l’interface', 'sp.ui_scale.reset': 'Réinitialiser', - 'st.display.ui_scale.label': 'Zoom de l’interface de l’extension', - 'st.display.ui_scale.decrease': 'Réduire le zoom de l’interface', - 'st.display.ui_scale.increase': 'Augmenter le zoom de l’interface', - 'st.display.ui_scale.reset': 'Réinitialiser', - 'st.display.ui_scale.desc': 'Redimensionne le panneau latéral et la fenêtre de chat détachée sans modifier le zoom de la page.', - 'st.display.ui_scale.shortcuts': 'Raccourcis dédiés : {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Non attribué', - 'st.display.ui_scale.manage_shortcuts': 'Personnaliser les raccourcis', 'tool.delegate_research': 'Recherche avec ChatGPT', 'st.display.research_escalation.label': 'Escalade de recherche', 'st.display.research_escalation.desc': 'Lorsque cette option est activée, WebBrain peut demander votre accord avant d’envoyer à ChatGPT une requête de recherche en lecture seule particulièrement complexe. Désactivé par défaut. La requête exacte n’est partagée qu’après votre accord explicite.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Ne pas continuer", "sp.recipient.reason_unrequested": "WebBrain n’a pas pu déduire de votre demande qu’un message doit être envoyé. La conversation ouverte sur {host} est avec {recipient}.", "sp.recipient.reason_unnamed": "WebBrain n’a pas pu déduire de votre demande qui doit recevoir ce message. La conversation ouverte sur {host} est avec {recipient}.", - 'st.tab.permissions': "Autorisations", 'st.perms.revoke': "Révoquer", 'st.perms.clear_all': "Effacer toutes les autorisations", 'st.perms.gate.label': "Demander avant les actions importantes", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Commencer', 'ob.btn.skip': 'Ignorer pour le moment', 'ob.btn.start': 'Démarrer', - 'ob.cloud.body': 'WebBrain Compass est prêt avec une allocation hebdomadairene gratuite. Les conversations Compass sélectionnées peuvent être conservées et utilisées pour améliorer WebBrain pendant que Aider à améliorer WebBrain est activé par défaut. Vous pouvez le désactiver dans Paramètres → Général.', + 'ob.cloud.body': 'WebBrain Compass est prêt avec une allocation hebdomadairene gratuite. Les conversations Compass sélectionnées peuvent être conservées et utilisées pour améliorer WebBrain pendant que Aider à améliorer WebBrain est activé par défaut. Vous pouvez le désactiver dans Paramètres → Avancé.', 'ob.cloud.change': 'Changer', 'ob.cloud.using': 'Utilisation de WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Résultat', 'sp.api.enabled_html': '🔓 Mutations d\'API activées pour cette conversation. L\'agent peut désormais utiliser POST/PUT/PATCH/DELETE via fetch_url et execute_js quand il juge l\'API plus fiable que l\'interface pour une étape. L\'interface reste privilégiée par défaut. Ce drapeau s\'efface quand vous réinitialisez la conversation.', - 'sp.permissions.disabled_html': '⚠️ Les demandes d\'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera, enregistrera et planifiera des tâches futures sans demander au préalable. Réactivez cette option depuis Paramètres → Autorisations → Demander avant les actions importantes.', + 'sp.permissions.disabled_html': "⚠️ Les demandes d'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera, enregistrera et planifiera des tâches futures sans demander au préalable. Réactivez cette option depuis le bouton ⚠ à côté du micro.", 'sp.permissions.button': 'Demandes d\'autorisation : activées', 'sp.permissions.button_off': 'Demandes d\'autorisation : désactivées', 'sp.permissions.gate_desc': 'WebBrain demande la première fois qu\'il clique, saisit, télécharge ou exécute du code sur un site.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Attente de « {selector} »', 'st.title': 'Paramètres WebBrain', - 'st.subtitle': 'Configurez vos fournisseurs de LLM et vos préférences · v{version}', + 'st.subtitle': 'Configurez le fonctionnement de WebBrain · v{version}', 'st.tab.display': 'Général', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Avancé', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Parole', + 'st.tab.generative': 'Génératif', + 'st.tab.decision': 'Décision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Fournisseurs WebBrain', + 'st.providers_page.subtitle': 'Choisissez les modèles utilisés par WebBrain · v{version}', + 'st.permissions_page.title': 'Autorisations WebBrain', + 'st.permissions_page.subtitle': 'Sites où WebBrain peut agir sans demander d’abord', 'st.tab.providers': 'Fournisseurs', 'st.tab.vision': 'Vision', 'st.tab.profile': 'Profil', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Mettre à jour le moyen de paiement", 'st.account.manage_billing': 'Gérer la facturation', - 'st.display.language.label': 'Langue', - 'st.display.language.desc': 'Langue de l\'interface de l\'extension WebBrain.', 'st.display.verbose.label': 'Mode détaillé', 'st.display.verbose.desc': 'Affiche tous les détails des appels d\'outils, les arguments et les résultats JSON bruts. Désactivé par défaut pour un chat plus épuré.', 'st.display.selection_shortcut.label': 'Raccourci de sélection', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Capture automatique', "st.display.auto_screenshot.desc": "Capture automatiquement une image de la fenêtre après une action de l’agent sur la page, afin que la route de vision sélectionnée voie ce qui a changé. Cela consomme plus de jetons. Si la vision est indisponible, l’enrichissement est ignoré et la tâche continue avec un avis d’état.", 'st.display.auto_screenshot.off': 'Désactivée', - 'st.display.auto_screenshot.navigation': 'À la navigation', - 'st.display.auto_screenshot.state_change': 'Au changement d\'état (par défaut)', + 'st.display.auto_screenshot.navigation': 'À la navigation (par défaut)', + 'st.display.auto_screenshot.state_change': "Au changement d'état", 'st.display.auto_screenshot.every_step': 'À chaque étape', 'st.display.tracing.label': 'Enregistrer les traces (pour comparer des modèles)', - 'st.display.tracing.desc_html': 'Conserve chaque exécution (requêtes LLM, réponses, appels d\'outils, captures) dans IndexedDB local pour pouvoir inspecter et comparer les modèles côte à côte. S\'ouvre dans un onglet Traces distinct. Désactivé par défaut car cela ajoute des écritures disque à chaque étape. Ouvrir la page Traces →', - 'st.display.lossless_tracing.label': 'Enregistrer les détails complets des requêtes (niveau débogage)', - 'st.display.lossless_tracing.desc_html': 'Conserve aussi les prompts, messages et schémas d\'outils complets de chaque requête LLM au lieu de résumés sans contenu, et garde jusqu\'à 200 Ko de chaque résultat d\'outil. Permet un débogage approfondi et la reconstruction des requêtes. Désactivé par défaut car cela écrit localement le contenu de votre conversation et utilise beaucoup plus d\'espace disque. Nécessite que l\'enregistrement des traces soit activé.', + 'st.display.tracing.desc_html': "Conserve chaque exécution (requêtes LLM, réponses, appels d'outils, captures) dans IndexedDB local pour pouvoir inspecter et comparer les modèles côte à côte, y compris les prompts, messages et schémas d'outils complets de chaque requête LLM et jusqu'à 200 Ko de chaque résultat d'outil. S'ouvre dans un onglet Traces distinct. Désactivé par défaut car cela écrit localement le contenu de votre conversation et utilise beaucoup plus d'espace disque. Ouvrir la page Traces →", 'st.display.allow_local_network.label': 'Autoriser l\'agent à accéder au réseau local', 'st.display.allow_local_network.desc': 'Permet à l\'outil fetch_url de l\'agent d\'atteindre les adresses loopback (127.0.0.1, localhost) et privées/RFC1918 (10.x, 192.168.x, 172.16–31.x). Utile pour les serveurs de dev locaux, outils intranet ou API auto-hébergées. Désactivé par défaut. Lorsqu’il est désactivé, les URL contenant une adresse IP privée ou de boucle locale écrite directement et les noms localhost sont bloqués. La résolution DNS n’est pas vérifiée : d’autres noms peuvent encore atteindre des adresses locales. Les adresses IP littérales de métadonnées cloud (169.254.169.254) et les noms de métadonnées répertoriés ou *.internal/*.local restent bloqués même lorsqu’il est activé.', 'st.display.notify_sound.label': "Sons de notification", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Mode vision activé pour le fournisseur actif.", "sp.vision.off": "Mode vision désactivé pour le fournisseur actif.", "sp.vision.error": "Échec du basculement de la vision : {msg}", - "st.tab.multimodal": "Modèles auxiliaires", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Recommandé. Lorsque activé, WebBrain demande l'autorisation la première fois qu'il clique, saisit du texte, navigue, exécute du JavaScript, téléverse, télécharge ou enregistre sur un site (puis mémorise votre choix). Désactivez-le pour une utilisation rapide et sans invite sur les sites en lesquels vous avez pleinement confiance.", "st.perms.gate.warning": "⚠️ Les demandes d'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera et enregistrera sur n'importe quel site SANS demander — y compris sur des pages dont le contenu peut être contrôlé par un attaquant. Le contenu des pages reste traité comme non fiable en interne, mais rien n'empêchera une instruction injectée de déclencher une action. Ne laissez ceci désactivé que si vous avez pleinement confiance en chaque site sur lequel vous utilisez l'assistant.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Valeur par défaut du système", "st.display.download_directory.error": "Utilisez un dossier relatif comme WebBrain ou Work/WebBrain. Les chemins absolus et « .. » ne sont pas autorisés.", "st.display.strict_secret.label": "Gestion stricte des secrets", - "st.display.strict_secret.desc": "Refuse de citer les identifiants (mots de passe, clés d'API, jetons, OTPs) dans les résumés ou le texte de l'assistant — même lorsque vous le demandez explicitement. Utile si vous partagez régulièrement des fichiers de trace ou votre écran. Désactivé par défaut afin que l'agent puisse répéter la valeur exacte que vous demandez lorsque vous en avez besoin. Activez-le (Paramètres → Sécurité) lorsque vous voulez garder les résumés `done` propres et que les identifiants ne soient jamais répétés.", + "st.display.strict_secret.desc": "Refuse de citer les identifiants (mots de passe, clés d'API, jetons, OTPs) dans les résumés ou le texte de l'assistant — même lorsque vous le demandez explicitement. Utile si vous partagez régulièrement des fichiers de trace ou votre écran. Désactivé par défaut afin que l'agent puisse répéter la valeur exacte que vous demandez lorsque vous en avez besoin. Activez-le lorsque vous voulez garder les résumés `done` propres et que les identifiants ne soient jamais répétés.", "st.display.request_timeout.label": "Délai d'attente des requêtes LLM", "st.display.request_timeout.desc": "Attente maximale des en-têtes de réponse et de chaque pause entre les fragments de réponse en streaming. Par défaut : 120 s. Augmentez cette durée pour les modèles locaux lents, surtout sur CPU ou avec un contexte volumineux.", "st.providers.filter.all": "Tous", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Les messages sont mis en file d\'attente pendant que WebBrain est occupé. Seuls /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces et /verbose peuvent s\'exécuter immédiatement comme commandes slash.', 'tool.go_back': 'Revenir en arrière', 'tool.go_forward': 'Aller en avant', - 'st.display.search.placeholder': 'Rechercher dans les paramètres généraux', - 'st.display.search.empty': 'Aucun paramètre général correspondant.', + 'st.display.search.placeholder': 'Rechercher dans les paramètres', + 'st.display.search.empty': 'Aucun paramètre correspondant.', 'st.display.advanced': 'Avancé', ...getApocalypseModeCopy('fr'), ...getEmergencyBoxCopy('fr'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Aucune mémoire enregistrée ne possède cet identifiant.", "st.memory.security_html": "Confidentialité : la mémoire utilisateur est stockée en texte brut dans ce profil de navigateur. Lorsqu’elle est activée, les enregistrements de mémoire actifs sont envoyés au fournisseur LLM configuré dans l’invite système. N’y enregistrez pas de mots de passe, clés API, jetons, codes de récupération ou secrets sensibles.", "hist.filter.clear": "Effacer le filtre et afficher toutes les conversations", - "st.redaction.heading": "Floutage des captures d'écran", "st.redaction.toggle.label": "Flouter le contenu sensible dans les captures d'écran", "st.redaction.toggle.desc": "Avant qu'une capture d'écran soit envoyée à un modèle de vision, floute les champs de formulaire et le texte qui ressemble à un e-mail ou un numéro de téléphone. La détection s'exécute entièrement sur votre appareil — rien de plus n'est transmis.", "st.redaction.warning": "⚠️ Meilleur effort et fail-open : si le floutage ne peut pas s'exécuter sur une page (par exemple juste après une navigation, dans les visionneuses PDF, ou sur des pages restreintes du navigateur), la capture est quand même envoyée non floutée. La détection utilise uniquement des heuristiques DOM — texte dessiné sur un canvas, données personnelles dans des images, ou tout ce qui n'est pas reconnu comme champ de formulaire ou texte e-mail/téléphone peut passer inaperçu, et le texte de la page envoyé au modèle n'est pas flouté par ce réglage. Ce n'est PAS une garantie de sécurité. Pour une confidentialité totale, utilisez un modèle local/hors ligne (llama.cpp, Ollama) : les captures ne quittent alors jamais votre machine et le floutage devient inutile.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Exporter toute la session de traces enregistrée en JSON, captures comprises", "sp.export_traces.recording_truncated": "Tous les enregistrements sauvegardés ont été exportés en JSON. Le contenu omis lors de l’enregistrement ne peut pas être récupéré par l’export.", "sp.slash.export_traces": "Exporter la chaîne d'outils (traces)", - "sp.export_traces.none": "Aucune trace pour cette conversation. Activez « Enregistrer les traces » dans les paramètres, puis relancez.", + "sp.export_traces.none": "Aucune trace pour cette conversation. Activez « Enregistrer les traces » dans Paramètres → Avancé, puis relancez.", "sp.export_traces.error": "Impossible d'exporter les traces.", "sp.export_traces.done": "Chaîne d'outils exportée.", "sp.export_traces.no_conversation": "Rien à exporter pour l'instant — commencez une conversation d'abord.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Utiliser WebBrain comme page de nouvel onglet", "st.display.newtab.desc": "Les nouveaux onglets ouvrent une page WebBrain avec une zone pour demander, agir ou rechercher. Désactivez cette option pour garder la page de nouvel onglet habituelle de votre navigateur ; vous pouvez la modifier à tout moment dans Paramètres → Général.", "st.display.help_improve.desc_html": "Autorise la conservation de certaines interactions WebBrain Compass et leur utilisation pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Activé par défaut. Désactivez cette option pour empêcher que les futures interactions Compass soient utilisées à ces fins. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que pour les fournisseurs où vous activez « Partager les requêtes pour la recherche ». Politique de confidentialité →", - "st.providers.webbrain_data_use.body": "Une utilisation quotidienne gratuite de WebBrain Compass est incluse. Tant que Aider à améliorer WebBrain est activé par défaut, certaines conversations Compass peuvent être conservées et utilisées pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Désactivez cette option dans Général → Avancé pour exclure les futures interactions Compass de ces usages. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que si vous activez l’option « Partager les requêtes pour la recherche » de ce fournisseur. {privacyLink}. Pour davantage d’utilisation, abonnez-vous sur {subscribeLink}. Gérez la facturation sur {accountLink}.", + "st.providers.webbrain_data_use.body": "Une utilisation quotidienne gratuite de WebBrain Compass est incluse. Tant que Aider à améliorer WebBrain est activé par défaut, certaines conversations Compass peuvent être conservées et utilisées pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Désactivez cette option dans Paramètres → Avancé pour exclure les futures interactions Compass de ces usages. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que si vous activez l’option « Partager les requêtes pour la recherche » de ce fournisseur. {privacyLink}. Pour davantage d’utilisation, abonnez-vous sur {subscribeLink}. Gérez la facturation sur {accountLink}.", 'st.providers.share_research.label': "Partager les requêtes pour la recherche", 'st.providers.share_research.hint': "Envoie les prompts et les réponses de ce fournisseur à WebBrain pour évaluation et amélioration, y compris le fournisseur et le modèle utilisés. Les images et pièces jointes binaires sont supprimées et le texte est tronqué avant partage ; le texte restant est envoyé tel quel.", 'st.providers.share_research.confirm': "Partager les requêtes de ce fournisseur avec WebBrain pour la recherche ?\n\nSi activé, vos prompts, réponses et interactions d’outils avec ce fournisseur seront envoyés à WebBrain pour évaluation et amélioration, avec le nom du fournisseur et du modèle. Le texte est envoyé tel quel après suppression des images et troncation des contenus longs : évitez donc de partager des données personnelles sensibles. Vous pouvez désactiver cette option à tout moment pour arrêter le partage.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Vous voulez moins d’interruptions ? « Toujours autoriser » mémorise ce site. La commande ci-dessous désactive les demandes d’autorisation de WebBrain sur tous les sites.", "sp.perm.insert_skip_command": "Insérer /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Votre brouillon reste inchangé. Effacez-le avant d’insérer la commande.", - "ob.act.permissions_tip": "Les demandes d’autorisation sont activées par défaut. Les utilisateurs avancés peuvent les désactiver partout avec /dangerously-skip-permissions et les réactiver dans Paramètres → Autorisations.", + "ob.act.permissions_tip": "Les demandes d’autorisation sont activées par défaut. Les utilisateurs avancés peuvent les désactiver partout avec /dangerously-skip-permissions et les réactiver depuis le bouton ⚠ à côté du micro.", 'st.provider.field.cache_read_cost_per_million': "Coût estimé de lecture du cache ($ / 1M tokens)", 'st.provider.field.cache_write_cost_per_million': "Coût estimé d’écriture du cache (5 min) ($ / 1M tokens)", 'st.provider.field.cache_write_1h_cost_per_million': "Coût estimé d’écriture du cache (1 h) ($ / 1M tokens)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Remplacer la copie cloud cryptée par la configuration WebBrain actuelle de cet appareil ?", "st.sync.consent.legacy": "Activer la synchronisation chiffrée ? WebBrain transmettra une copie cryptée de bout en bout de vos souvenirs, du remplissage automatique de votre profil et des paramètres du fournisseur de clé API à WebBrain Compass. L'historique des discussions et les connexions OAuth ne sont pas synchronisés.", "st.sync.consent.denied": "L'autorisation de synchronisation chiffrée n'a pas été accordée.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/he.js b/src/chrome/src/ui/locales/he.js index 28f476370f..522698d987 100644 --- a/src/chrome/src/ui/locales/he.js +++ b/src/chrome/src/ui/locales/he.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'הקטנת תצוגת ממשק התוסף', 'sp.ui_scale.increase': 'הגדלת תצוגת ממשק התוסף', 'sp.ui_scale.reset': 'איפוס', - 'st.display.ui_scale.label': 'הגדלת ממשק התוסף', - 'st.display.ui_scale.decrease': 'הקטנת תצוגת ממשק התוסף', - 'st.display.ui_scale.increase': 'הגדלת תצוגת ממשק התוסף', - 'st.display.ui_scale.reset': 'איפוס', - 'st.display.ui_scale.desc': 'שינוי גודל הסרגל הצדדי וחלון הצ׳אט הנפרד בלי לשנות את תצוגת הדף.', - 'st.display.ui_scale.shortcuts': 'קיצורי דרך ייעודיים: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'לא הוקצה', - 'st.display.ui_scale.manage_shortcuts': 'התאמת קיצורי דרך', 'tool.delegate_research': 'חוקר עם ChatGPT', 'st.display.research_escalation.label': 'הסלמת מחקר', 'st.display.research_escalation.desc': 'כאשר האפשרות מופעלת, WebBrain עשוי לבקש אישור לפני שליחת בקשת מחקר מורכבת לקריאה בלבד אל ChatGPT. כבוי כברירת מחדל. הבקשה המדויקת משותפת רק לאחר אישור מפורש שלך.', @@ -485,7 +477,7 @@ export default { "sp.step.input_label": "קלט", "sp.step.result_label": "תוצאה", "sp.api.enabled_html": "🔓 שינויי API מופעלים בשיחה הזו. הסוכן יכול כעת להשתמש בבקשות POST/PUT/PATCH/DELETE דרך fetch_url ו-execute_js כאשר הוא מעריך שה-API אמין יותר מממשק המשתמש בשלב מסוים. ממשק המשתמש נשאר ברירת המחדל. הדגל נמחק בעת איפוס השיחה.", - "sp.permissions.disabled_html": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בלי לשאול תחילה. ניתן להפעיל אותן מחדש דרך הגדרות ← הרשאות ← בקש אישור לפני פעולות משמעותיות.", + "sp.permissions.disabled_html": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בלי לשאול תחילה. ניתן להפעיל אותן מחדש דרך הכפתור ⚠ ליד המיקרופון.", "sp.permissions.button": "בקשות הרשאה: מופעלות", "sp.permissions.button_off": "בקשות הרשאה: כבויות", "sp.permissions.gate_desc": "WebBrain שואל בפעם הראשונה שהוא לוחץ, מקליד, מוריד קבצים או מריץ קוד באתר.", @@ -643,16 +635,26 @@ export default { "ob.btn.done": "התחל", "ob.btn.skip": "דלג לעת עתה", 'ob.btn.start': 'התחל', - 'ob.cloud.body': 'WebBrain Compass מוכן עם הקצבה שבועית חינםית. שיחות Compass נבחרות עשויות להישמר ולשמש לשיפור WebBrain בזמן ש- Help Improve WebBrain מופעל כברירת מחדל. אתה יכול לכבות את זה בהגדרות → כללי.', + 'ob.cloud.body': 'WebBrain Compass מוכן עם הקצבה שבועית חינםית. שיחות Compass נבחרות עשויות להישמר ולשמש לשיפור WebBrain בזמן ש- Help Improve WebBrain מופעל כברירת מחדל. אתה יכול לכבות את זה בהגדרות → מתקדם.', 'ob.cloud.change': 'שינוי', 'ob.cloud.using': 'שימוש ב-WebBrain Compass.', "st.title": "הגדרות WebBrain", - "st.subtitle": "הגדר ספקי LLM והעדפות · גרסה {version}", + "st.subtitle": "הגדר את אופן הפעולה של WebBrain · גרסה {version}", "st.tab.display": "כללי", + "st.tab.budgets": "תקציבים", + "st.tab.advanced": "מִתקַדֵם", + "st.tab.llm": "LLM", + "st.tab.speech": "דיבור", + "st.tab.generative": "גנרטיבי", + "st.tab.decision": "החלטות", + "st.tab.safesocial": "SafeSocial", + "st.providers_page.title": "ספקי WebBrain", + "st.providers_page.subtitle": "בחר את המודלים ש-WebBrain משתמש בהם · גרסה {version}", + "st.permissions_page.title": "הרשאות WebBrain", + "st.permissions_page.subtitle": "אתרים שבהם WebBrain רשאי לפעול בלי לשאול קודם", "st.tab.providers": "ספקים", "st.tab.skills": "מיומנויות", "st.tab.vision": "ראייה", - "st.tab.multimodal": "מודלים מסייעים", 'sp.slash.workflow_editor': "עורך תהליכי עבודה", "sp.slash.workflows": "הצגה וניהול של תהליכי עבודה שמורים", "sp.slash.teach": "הקלטת הפעולות שלך כתהליך עבודה שמור", @@ -690,7 +692,6 @@ export default { "st.tab.profile": "פרופיל", "st.tab.account": "חשבון", "st.tab.captcha": "CAPTCHA", - "st.tab.permissions": "הרשאות", "st.perms.gate.label": "שאל לפני פעולות בעלות השפעה", "st.perms.gate.desc": "מומלץ. כאשר האפשרות מופעלת, WebBrain מבקש רשות בפעם הראשונה שהוא לוחץ, מקליד, מנווט, מריץ JavaScript, מעלה או מוריד קבצים, מקליט או מתזמן עבודה עתידית באתר, ולאחר מכן זוכר את בחירתך. כבה רק לשימוש מהיר ללא בקשות באתרים שאתה בוטח בהם לחלוטין.", "st.perms.gate.warning": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בכל אתר בלי לשאול — גם בדפים שתוקף עשוי לשלוט בתוכן שלהם. תוכן הדף עדיין מטופל פנימית כלא-מהימן, אך דבר לא יעצור הוראה מוזרקת מלגרום לפעולה. השאר אפשרות זו כבויה רק אם אתה בוטח לחלוטין בכל אתר שבו נעשה שימוש בסוכן.", @@ -709,8 +710,6 @@ export default { "st.account.payment_failed": "לא ניתן היה להשלים את התשלום עבור המינוי. עדכנו את אמצעי התשלום כדי לשחזר את התוכנית בתשלום.", "st.account.update_payment": "עדכון אמצעי התשלום", "st.account.manage_billing": "ניהול חיוב", - "st.display.language.label": "שפה", - "st.display.language.desc": "שפת הממשק של תוסף WebBrain.", "st.display.theme.label": "מראה", "st.display.theme.desc": "בחר ערכת נושא בהירה, כהה או לפי הגדרת מערכת ההפעלה.", "st.display.theme.system": "מערכת", @@ -720,8 +719,8 @@ export default { "st.display.download_directory.desc": "תיקיית משנה אופציונלית בתוך תיקיית ההורדות של הדפדפן או המערכת. השאירו ריק כדי להשתמש בברירת המחדל של המערכת.", "st.display.download_directory.placeholder": "ברירת המחדל של המערכת", "st.display.download_directory.error": "השתמשו בתיקייה יחסית כמו WebBrain או Work/WebBrain. נתיבים מוחלטים ו-”..“ אינם מותרים.", - "st.display.search.placeholder": "חפש בהגדרות כלליות", - "st.display.search.empty": "אין הגדרות כלליות תואמות.", + "st.display.search.placeholder": "חפש בהגדרות", + "st.display.search.empty": "אין הגדרות תואמות.", "st.display.advanced": "מִתקַדֵם", ...getApocalypseModeCopy('he'), ...getEmergencyBoxCopy('he'), @@ -775,20 +774,18 @@ export default { "st.display.auto_screenshot.label": "צילום מסך אוטומטי", "st.display.auto_screenshot.desc": "צלם אוטומטית צילום מסך של אזור התצוגה לאחר שהסוכן פועל בדף, כדי שמסלול הראייה שנבחר יוכל לראות מה השתנה. הפעולה צורכת יותר אסימונים. אם הראייה אינה זמינה, ההעשרה מדולגת והמשימה ממשיכה עם הודעת מצב.", "st.display.auto_screenshot.off": "כבוי", - "st.display.auto_screenshot.navigation": "על ניווט", - "st.display.auto_screenshot.state_change": "בשינוי מצב (ברירת מחדל)", + "st.display.auto_screenshot.navigation": "על ניווט (ברירת מחדל)", + "st.display.auto_screenshot.state_change": "בשינוי מצב", "st.display.auto_screenshot.every_step": "כל צעד", "st.display.tracing.label": "הקלטת עקבות (להשוואת מודלים)", - "st.display.tracing.desc_html": "תתמיד בכל ריצה (LLM בקשות, תגובות, קריאות לכלים, צילומי מסך) לתוך IndexedDB המקומי כדי שתוכל לבדוק ולהשוות מודלים זה לצד זה. נפתח בלשונית Traces נפרדת. כבוי כברירת מחדל מכיוון שהוא מוסיף כתיבה בדיסק בכל שלב. פתח את דף העקבות →", - "st.display.lossless_tracing.label": "רישום פרטי בקשה מלאים (שכבת דיבאג)", - "st.display.lossless_tracing.desc_html": "שומר גם את ההנחיות, ההודעות והמבנים המלאים של כל בקשת LLM במקום סיכומים חסרי תוכן, ומחזיק עד 200KB מכל תוצאת כלי. מאפשר ניפוי שגיאות מעמיק ושחזור בקשות. כבוי כברירת מחדל משום שהוא כותב את תוכן השיחה שלך מקומית ומשתמש בהרבה יותר מקום. דורש שהקלטת מעקב תהיה פעילה.", + "st.display.tracing.desc_html": "שומר כל ריצה (בקשות LLM, תגובות, קריאות לכלים, צילומי מסך) ב-IndexedDB המקומי כדי שתוכל לבדוק ולהשוות מודלים זה לצד זה, כולל ההנחיות, ההודעות ומבני הכלים המלאים של כל בקשת LLM ועד 200KB מכל תוצאת כלי. נפתח בלשונית Traces נפרדת. כבוי כברירת מחדל משום שהוא כותב את תוכן השיחה שלך מקומית ומשתמש בהרבה יותר מקום. פתח את דף העקבות →", "st.display.cost_session_limit.label": "קצבת הפגישה בעלות ענן", "st.display.cost_session_limit.desc": "מפסיק ענן ו OpenRouter פועל לפני שיחת מודל בתשלום נוספת ברגע שההפעלה הזו מגיעה לקצבת העלות המדווחת או המשוערת. ברירת מחדל 10 $.", "st.display.cost_total_limit.label": "הקצבה כוללת של עלות ענן", "st.display.cost_total_limit.desc": "עוקבים מדווחים או ענן משוער/OpenRouter הוצאה של הדגם ברחבי השלוחה ומפסיקה שיחות נוספות בתשלום בקצבה. ספקים מקומיים אינם נספרים.", "st.display.cost_reset": "אפס את ההוצאה", "st.display.strict_secret.label": "טיפול סודי קפדני", - "st.display.strict_secret.desc": "מנע ציטוט של פרטי גישה (סיסמאות, מפתחות API, אסימונים וקודים חד-פעמיים) בסיכומים או בתשובות — גם אם ביקשת אותם במפורש. שימושי בעת שיתוף עקבות או מסך. כבוי כברירת מחדל כדי שהסוכן יוכל לחזור על הערך המדויק שביקשת כשתצטרך אותו. הפעל אותו (הגדרות ← אבטחה) כשאתה רוצה שסיכומי `done` יישארו מסודרים ופרטי גישה לא יחזרו על עצמם.", + "st.display.strict_secret.desc": "מנע ציטוט של פרטי גישה (סיסמאות, מפתחות API, אסימונים וקודים חד-פעמיים) בסיכומים או בתשובות — גם אם ביקשת אותם במפורש. שימושי בעת שיתוף עקבות או מסך. כבוי כברירת מחדל כדי שהסוכן יוכל לחזור על הערך המדויק שביקשת כשתצטרך אותו. הפעל אותו כשאתה רוצה שסיכומי `done` יישארו מסודרים ופרטי גישה לא יחזרו על עצמם.", "st.display.allow_local_network.label": "אפשר לסוכן לגשת לרשת המקומית", "st.display.allow_local_network.desc": "נותן לסוכן fetch_url לולאה חוזרת של כלי הגעה (127.0.0.1, localhost) ו-private/RFC1918 כתובות (10.x, 192.168.x, 172.16–31.x). שימושי עבור שרתי פיתוח מקומיים, כלי אינטראנט או ממשקי API מתארחים בעצמם. כבוי כברירת מחדל. כשהוא כבוי, כתובות URL שבהן נכתבה ישירות כתובת IP פרטית או loopback ושמות localhost נחסמים. פתרון DNS אינו נבדק, ולכן שמות מארח אחרים עדיין עשויים להגיע לכתובות מקומיות. כתובות IP ישירות של מטא־נתוני ענן (169.254.169.254) ושמות מטא־נתונים שברשימה או *.internal/*.local נשארים חסומים גם כשהאפשרות מופעלת.", "st.display.scheduled_tasks.label": "משימות מתוזמנות", @@ -1096,7 +1093,6 @@ export default { "tr.event.result": "תוֹצָאָה", "tr.event.step": "שָׁלָב {step}", "sp.perm.verb.record": "להקליט את הכרטיסייה (ואת המיקרופון) באתר", - "st.redaction.heading": "טשטוש צילומי מסך", "st.redaction.toggle.label": "טשטש תוכן רגיש בצילומי מסך", "st.redaction.toggle.desc": "לפני שצילום מסך נשלח למודל ראייה, מטשטש שדות טופס וטקסט שנראה כמו אימייל או מספר טלפון. הזיהוי פועל כולו במכשיר שלך — שום דבר נוסף לא מועבר.", "st.redaction.warning": "⚠️ זהו טשטוש במאמץ סביר (best-effort) מסוג fail-open: אם הטשטוש לא יכול לפעול בדף מסוים (למשל מיד אחרי ניווט, בצפייה בקבצי PDF, או בדפי דפדפן מוגבלים), צילום המסך עדיין יישלח ללא טשטוש. הזיהוי מסתמך רק על היוריסטיקות DOM — טקסט המצויר על canvas, מידע אישי בתוך תמונות, או כל דבר שלא מזוהה כשדה טופס או כטקסט אימייל/טלפון עלול לחמוק, וטקסט הדף הנשלח למודל אינו מטושטש על ידי הגדרה זו. זו אינה ערבות אבטחה. לפרטיות מלאה, השתמש במודל מקומי/לא מקוון (llama.cpp, Ollama): כך צילומי מסך לעולם לא יעזבו את המכשיר שלך והטשטוש כבר לא יידרש.", @@ -1116,7 +1112,7 @@ export default { "sp.slash.export_traces_full": "ייצוא כל סשן המעקב השמור כ־JSON, כולל צילומי מסך", "sp.export_traces.recording_truncated": "כל הרשומות השמורות יוצאו כ־JSON. תוכן שהושמט בזמן ההקלטה אינו ניתן לשחזור באמצעות ייצוא.", "sp.slash.export_traces": "ייצוא שרשרת הכלים (מעקבים)", - "sp.export_traces.none": "אין מעקבים לשיחה זו. הפעילו את «הקלטת מעקבים» בהגדרות והריצו שוב.", + "sp.export_traces.none": "אין מעקבים לשיחה זו. הפעילו את «הקלטת מעקבים» בהגדרות ← מתקדם והריצו שוב.", "sp.export_traces.error": "לא ניתן לייצא מעקבים.", "sp.export_traces.done": "שרשרת הכלים יוצאה.", "sp.export_traces.no_conversation": "אין עדיין מה לייצא — התחילו שיחה קודם.", @@ -1126,7 +1122,7 @@ export default { "st.display.newtab.label": "להשתמש ב-WebBrain כדף הכרטיסייה החדשה", "st.display.newtab.desc": "כרטיסיות חדשות יפתחו דף WebBrain עם תיבה לשאילת שאלות, לביצוע פעולות או לחיפוש. כבו את האפשרות כדי להשאיר את דף הכרטיסייה החדשה הרגיל של הדפדפן; אפשר לשנות זאת בכל עת בהגדרות ← כללי.", "st.display.help_improve.desc_html": "אפשרו לשמור אינטראקציות נבחרות עם WebBrain Compass ולהשתמש בהן להערכה, שיפור, כוונון עדין ואימון. מופעל כברירת מחדל. כבו כדי למנוע שימוש באינטראקציות Compass עתידיות למטרות אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק מספקים שבהם הפעלתם את «שיתוף שאילתות למחקר». מדיניות פרטיות →", - "st.providers.webbrain_data_use.body": "שימוש יומי חינמי ב-WebBrain Compass כלול. כאשר ״עזרה בשיפור WebBrain״ מופעלת כברירת מחדל, ייתכן ששיחות Compass נבחרות יישמרו וישמשו להערכה, שיפור, כוונון עדין ואימון. כבו את האפשרות ב״כללי ← מִתקַדֵם״ כדי להחריג אינטראקציות Compass עתידיות משימושים אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק כאשר אתם מפעילים את האפשרות «שיתוף שאילתות למחקר» של ספק זה. {privacyLink}. לשימוש נוסף, הירשמו דרך {subscribeLink}. נהלו את החיוב דרך {accountLink}.", + "st.providers.webbrain_data_use.body": "שימוש יומי חינמי ב-WebBrain Compass כלול. כאשר ״עזרה בשיפור WebBrain״ מופעלת כברירת מחדל, ייתכן ששיחות Compass נבחרות יישמרו וישמשו להערכה, שיפור, כוונון עדין ואימון. כבו את האפשרות ב״הגדרות ← מִתקַדֵם״ כדי להחריג אינטראקציות Compass עתידיות משימושים אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק כאשר אתם מפעילים את האפשרות «שיתוף שאילתות למחקר» של ספק זה. {privacyLink}. לשימוש נוסף, הירשמו דרך {subscribeLink}. נהלו את החיוב דרך {accountLink}.", 'st.providers.share_research.label': "שיתוף שאילתות למחקר", 'st.providers.share_research.hint': "שולח את ההנחיות והתשובות של ספק זה ל-WebBrain להערכה ולשיפור, כולל הספק והמודל ששימשו. תמונות וקבצים בינאריים מוסרים והטקסט נחתך לפני השיתוף; הטקסט הנותר נשלח כפי שהוא.", 'st.providers.share_research.confirm': "לשתף את השאילתות של ספק זה עם WebBrain למחקר?\n\nכאשר מופעל, ההנחיות, התשובות ואינטראקציות הכלים שלך עם ספק זה יישלחו ל-WebBrain להערכה ולשיפור, יחד עם שם הספק והמודל. הטקסט נשלח כפי שהוא לאחר הסרת תמונות וקיצוץ תוכן ארוך, לכן הימנעו משיתוף מידע אישי רגיש. ניתן לכבות בכל עת כדי להפסיק את השיתוף.", @@ -1172,7 +1168,7 @@ export default { "sp.perm.skip_hint": "רוצה פחות הפרעות? ״אפשר תמיד״ זוכר את האתר הזה. הפקודה שלמטה משביתה את בקשות ההרשאה של WebBrain בכל האתרים.", "sp.perm.insert_skip_command": "הוספת /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "הטיוטה שלך לא השתנתה. יש לנקות אותה לפני הוספת הפקודה.", - "ob.act.permissions_tip": "בקשות הרשאה מופעלות כברירת מחדל. משתמשים מתקדמים יכולים להשבית אותן בכל האתרים באמצעות /dangerously-skip-permissions ולהפעיל אותן מחדש דרך הגדרות ← הרשאות.", + "ob.act.permissions_tip": "בקשות הרשאה מופעלות כברירת מחדל. משתמשים מתקדמים יכולים להשבית אותן בכל האתרים באמצעות /dangerously-skip-permissions ולהפעיל אותן מחדש דרך הכפתור ⚠ ליד המיקרופון.", 'st.provider.field.cache_read_cost_per_million': "עלות משוערת לקריאה מהמטמון ($ / מיליון אסימונים)", 'st.provider.field.cache_write_cost_per_million': "עלות משוערת לכתיבה למטמון ל-5 דקות ($ / מיליון אסימונים)", 'st.provider.field.cache_write_1h_cost_per_million': "עלות משוערת לכתיבה למטמון לשעה ($ / מיליון אסימונים)", @@ -1274,8 +1270,8 @@ export default { "st.vision.local.status.preparing": "נטען ל-GPU…", "st.vision.local.status.bonsai_downloading": "מוריד את Ternary Bonsai 2 2B Vision · {progress}%", "st.vision.local.testing": "הראייה המקומית נטענת ונבדקת…", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/hi.js b/src/chrome/src/ui/locales/hi.js index 4881dd6d69..d7a9c83a00 100644 --- a/src/chrome/src/ui/locales/hi.js +++ b/src/chrome/src/ui/locales/hi.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'एक्सटेंशन UI को छोटा करें', 'sp.ui_scale.increase': 'एक्सटेंशन UI को बड़ा करें', 'sp.ui_scale.reset': 'रीसेट', - 'st.display.ui_scale.label': 'एक्सटेंशन UI ज़ूम', - 'st.display.ui_scale.decrease': 'एक्सटेंशन UI को छोटा करें', - 'st.display.ui_scale.increase': 'एक्सटेंशन UI को बड़ा करें', - 'st.display.ui_scale.reset': 'रीसेट', - 'st.display.ui_scale.desc': 'पेज का ज़ूम बदले बिना साइड पैनल और अलग चैट विंडो का आकार बदलें।', - 'st.display.ui_scale.shortcuts': 'समर्पित शॉर्टकट: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'निर्धारित नहीं', - 'st.display.ui_scale.manage_shortcuts': 'शॉर्टकट कस्टमाइज़ करें', 'tool.delegate_research': 'ChatGPT से शोध हो रहा है', 'st.display.research_escalation.label': 'शोध एस्केलेशन', 'st.display.research_escalation.desc': 'सक्षम होने पर, WebBrain असामान्य रूप से जटिल केवल-पढ़ने योग्य शोध प्रॉम्प्ट को ChatGPT पर भेजने से पहले अनुमति मांग सकता है। डिफ़ॉल्ट रूप से बंद। सटीक प्रॉम्प्ट केवल आपकी स्पष्ट स्वीकृति के बाद साझा किया जाता है।', @@ -500,7 +492,7 @@ export default { 'sp.step.result_label': "नतीजा", 'sp.api.enabled_html': "🔓 एपीआई म्यूटेशन सक्षम इस बातचीत के लिए. जब एजेंट किसी चरण के लिए एपीआई को यूआई से अधिक विश्वसनीय मानता है तो वह अब Fetch_url औरexecute_js के माध्यम से POST/PUT/PATCH/DELETE का उपयोग कर सकता है। यूआई-प्रथम डिफ़ॉल्ट रहता है। जब आप वार्तालाप को रीसेट करते हैं तो यह ध्वज साफ़ हो जाता है।", - 'sp.permissions.disabled_html': "⚠️ अनुमति संकेत बंद हैं. WebBrain पहले पूछे बिना क्लिक करेगा, टाइप करेगा, नेविगेट करेगा, जावास्क्रिप्ट चलाएगा, अपलोड करेगा, डाउनलोड करेगा, रिकॉर्ड करेगा और भविष्य के काम को शेड्यूल करेगा। सेटिंग्स → अनुमतियाँ → परिणामी कार्रवाई से पहले पूछें से इसे पुनः सक्षम करें।", + 'sp.permissions.disabled_html': "⚠️ अनुमति संकेत बंद हैं. WebBrain पहले पूछे बिना क्लिक करेगा, टाइप करेगा, नेविगेट करेगा, जावास्क्रिप्ट चलाएगा, अपलोड करेगा, डाउनलोड करेगा, रिकॉर्ड करेगा और भविष्य के काम को शेड्यूल करेगा। माइक्रोफ़ोन के पास वाले ⚠ बटन से इसे फिर से सक्षम करें।", 'sp.permissions.button': 'अनुमति संकेत: चालू', 'sp.permissions.button_off': 'अनुमति संकेत: बंद', 'sp.permissions.gate_desc': 'किसी साइट पर पहली बार क्लिक करने, टाइप करने, डाउनलोड करने या कोड चलाने से पहले WebBrain पूछता है।', @@ -659,7 +651,7 @@ export default { 'ob.act.warn1': "WebBrain योजना बनाने के लिए स्क्रीनशॉट कैप्चर कर सकता है। स्वास्थ्य, वित्त, डेटिंग या निजी खाता पोर्टल जैसे संवेदनशील पेजों पर एजेंट मोड का उपयोग करने से बचें, जब तक कि आप उस जोखिम को स्वीकार नहीं करते।", 'ob.act.warn2': "वेब सामग्री में एआई व्यवहार में हेरफेर करने के लिए डिज़ाइन किए गए दुर्भावनापूर्ण प्रॉम्प्ट इंजेक्शन हो सकते हैं।", 'ob.act.warn3': "हमेशा सुझाई गई कार्रवाइयों की समीक्षा करें और अप्रत्याशित दिखने वाले रन रोकें।", - 'ob.act.permissions_tip': "अनुमति संकेत डिफ़ॉल्ट रूप से चालू हैं. उन्नत उपयोगकर्ता उन्हें /dangerously-skip-permissions के साथ विश्व स्तर पर अक्षम कर सकते हैं और सेटिंग्स → अनुमतियाँ में उन्हें पुनः सक्षम कर सकते हैं।", + 'ob.act.permissions_tip': "अनुमति संकेत डिफ़ॉल्ट रूप से चालू हैं. उन्नत उपयोगकर्ता उन्हें /dangerously-skip-permissions के साथ विश्व स्तर पर अक्षम कर सकते हैं और माइक्रोफ़ोन के पास वाले ⚠ बटन से उन्हें फिर से सक्षम कर सकते हैं।", 'ob.tokens.title': "एक मॉडल चुनें", 'ob.tokens.body': "WebBrain को काम करने के लिए एक भाषा मॉडल की आवश्यकता है। हम पहले स्थानीय मॉडलों की जांच करेंगे। यदि कोई उपलब्ध नहीं है, तो सेटिंग्स खोलें और एक प्रदाता जोड़ें:", 'ob.tokens.scanning': "स्थानीय मॉडलों की जाँच की जा रही है...", @@ -685,23 +677,32 @@ export default { 'ob.btn.done': "आरंभ करें", 'ob.btn.skip': "अभी के लिए छोड़ें", 'ob.btn.start': 'प्रारंभ', - 'ob.cloud.body': 'WebBrain Compass एक निःशुल्क साप्ताहिक भत्ते के साथ तैयार है। चयनित Compass बातचीत बनाए रखी जा सकती है और WebBrain में सुधार के लिए उपयोग की जा सकती है जबकि Help Improve WebBrain डिफ़ॉल्ट रूप से चालू है। आप इसे Settings → General में बंद कर सकते हैं।', + 'ob.cloud.body': 'WebBrain Compass एक निःशुल्क साप्ताहिक भत्ते के साथ तैयार है। चयनित Compass बातचीत बनाए रखी जा सकती है और WebBrain में सुधार के लिए उपयोग की जा सकती है जबकि Help Improve WebBrain डिफ़ॉल्ट रूप से चालू है। आप इसे Settings → Advanced में बंद कर सकते हैं।', 'ob.cloud.change': 'बदलें', 'ob.cloud.using': 'WebBrain Compass का उपयोग कर रहा है।', // --- Settings ---------------------------------------------------------- 'st.title': "WebBrain सेटिंग्स", - 'st.subtitle': "अपने एलएलएम प्रदाताओं और प्राथमिकताओं को कॉन्फ़िगर करें · v{version}", + 'st.subtitle': "WebBrain के काम करने का तरीका कॉन्फ़िगर करें · v{version}", 'st.tab.display': "सामान्य", + 'st.tab.budgets': 'बजट', + 'st.tab.advanced': 'उन्नत', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'वाक्', + 'st.tab.generative': 'जनरेटिव', + 'st.tab.decision': 'निर्णय', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain प्रदाता', + 'st.providers_page.subtitle': 'WebBrain द्वारा उपयोग किए जाने वाले मॉडल चुनें · v{version}', + 'st.permissions_page.title': 'WebBrain अनुमतियाँ', + 'st.permissions_page.subtitle': 'वे साइटें जहाँ WebBrain पहले पूछे बिना काम कर सकता है', 'st.tab.providers': "प्रदाता", 'st.tab.skills': "कौशल", 'st.tab.vision': "दृष्टि", - 'st.tab.multimodal': "सहायक मॉडल", 'st.tab.memory': "स्मृति", 'st.tab.profile': "प्रोफाइल", 'st.tab.account': "खाता", 'st.tab.captcha': "कैप्चा", - 'st.tab.permissions': "अनुमतियाँ", 'st.perms.gate.label': "परिणामी कार्रवाई से पहले पूछें", 'st.perms.gate.desc': "अनुशंसित. चालू होने पर, WebBrain पहली बार किसी साइट पर क्लिक करने, टाइप करने, नेविगेट करने, जावास्क्रिप्ट चलाने, अपलोड करने, डाउनलोड करने, रिकॉर्ड करने या भविष्य के काम को शेड्यूल करने पर अनुमति मांगता है (फिर आपकी पसंद को याद करता है)। उन साइटों पर तेज़, त्वरित-मुक्त उपयोग के लिए बंद करें जिन पर आप पूरी तरह भरोसा करते हैं।", @@ -723,8 +724,6 @@ export default { "st.account.update_payment": "भुगतान विधि अपडेट करें", 'st.account.manage_billing': "बिलिंग प्रबंधित करें", - 'st.display.language.label': "भाषा", - 'st.display.language.desc': "WebBrain प्लगइन के लिए इंटरफ़ेस भाषा।", 'st.display.theme.label': "दिखावट", 'st.display.theme.desc': "प्रकाश, अंधेरा, या अपनी ओएस सेटिंग का पालन करें।", 'st.display.theme.system': "सिस्टम", @@ -734,8 +733,8 @@ export default { 'st.display.download_directory.desc': "आपके ब्राउज़र या सिस्टम डाउनलोड निर्देशिका के अंदर वैकल्पिक सबफ़ोल्डर। सिस्टम डिफ़ॉल्ट का उपयोग करने के लिए खाली छोड़ दें.", 'st.display.download_directory.placeholder': "सिस्टम डिफ़ॉल्ट", 'st.display.download_directory.error': "WebBrain या Work/WebBrain जैसे संबंधित फ़ोल्डर का उपयोग करें। पूर्ण पथ और \"..\" की अनुमति नहीं है।", - 'st.display.search.placeholder': "सामान्य सेटिंग्स खोजें", - 'st.display.search.empty': "कोई सामान्य सेटिंग मेल नहीं खाती.", + 'st.display.search.placeholder': "सेटिंग्स खोजें", + 'st.display.search.empty': "कोई सेटिंग मेल नहीं खाती.", 'st.display.advanced': "उन्नत", ...getApocalypseModeCopy('hi'), ...getEmergencyBoxCopy('hi'), @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': "ऑटो-स्क्रीनशॉट", "st.display.auto_screenshot.desc": "एजेंट के पेज पर कार्य करने के बाद अपने-आप व्यूपोर्ट स्क्रीनशॉट लें, ताकि चुना गया विज़न मार्ग बदलाव देख सके। इसमें अधिक टोकन लगते हैं। विज़न उपलब्ध न होने पर संवर्धन छोड़ दिया जाता है और कार्य स्थिति सूचना के साथ जारी रहता है।", 'st.display.auto_screenshot.off': "बंद", - 'st.display.auto_screenshot.navigation': "नेविगेशन पर", - 'st.display.auto_screenshot.state_change': "राज्य परिवर्तन पर (डिफ़ॉल्ट)", + 'st.display.auto_screenshot.navigation': "नेविगेशन पर (डिफ़ॉल्ट)", + 'st.display.auto_screenshot.state_change': "राज्य परिवर्तन पर", 'st.display.auto_screenshot.every_step': "हर कदम", 'st.display.tracing.label': "रिकॉर्ड निशान (मॉडल तुलना के लिए)", - 'st.display.tracing.desc_html': "प्रत्येक रन (एलएलएम अनुरोध, प्रतिक्रिया, टूल कॉल, स्क्रीनशॉट) को स्थानीय IndexedDB में जारी रखें ताकि आप साथ-साथ मॉडलों का निरीक्षण और तुलना कर सकें। एक अलग ट्रेसेस टैब में खुलता है। डिफ़ॉल्ट रूप से बंद है क्योंकि यह प्रति चरण डिस्क राइट जोड़ता है। ट्रेस पेज खोलें →", - 'st.display.lossless_tracing.label': 'पूर्ण अनुरोध विवरण रिकॉर्ड करें (डीबग स्तर)', - 'st.display.lossless_tracing.desc_html': 'प्रत्येक LLM अनुरोध के पूर्ण प्रॉम्प्ट, संदेश और टूल स्कीमा को बिना सामग्री वाले सारांशों के बजाय सहेजता है, और प्रत्येक टूल परिणाम का 200 KB तक रखता है। गहन डीबगिंग और अनुरोध पुनर्निर्माण सक्षम करता है। डिफ़ॉल्ट रूप से बंद क्योंकि यह आपकी बातचीत की सामग्री को स्थानीय रूप से लिखता है और बहुत अधिक डिस्क उपयोग करता है। ट्रेस रिकॉर्डिंग चालू होना आवश्यक है।', + 'st.display.tracing.desc_html': "प्रत्येक रन (LLM अनुरोध, प्रतिक्रियाएँ, टूल कॉल, स्क्रीनशॉट) को स्थानीय IndexedDB में सहेजें ताकि आप मॉडलों को साथ-साथ जाँच और तुलना कर सकें — प्रत्येक LLM अनुरोध के पूर्ण प्रॉम्प्ट, संदेश और टूल स्कीमा तथा प्रत्येक टूल परिणाम के 200 KB तक सहित। एक अलग ट्रेसेस टैब में खुलता है। डिफ़ॉल्ट रूप से बंद क्योंकि यह आपकी बातचीत की सामग्री को स्थानीय रूप से लिखता है और बहुत अधिक डिस्क उपयोग करता है। ट्रेस पेज खोलें →", 'st.display.cost_session_limit.label': "क्लाउड लागत सत्र भत्ता", 'st.display.cost_session_limit.desc': "एक बार जब यह सत्र रिपोर्ट की गई या अनुमानित लागत भत्ता तक पहुंच जाता है, तो क्लाउड रुक जाता है और OpenRouter किसी अन्य भुगतान मॉडल कॉल से पहले चलता है। डिफ़ॉल्ट $10.", 'st.display.cost_total_limit.label': "क्लाउड लागत कुल भत्ता", 'st.display.cost_total_limit.desc': "ट्रैक रिपोर्ट किए गए या अनुमानित क्लाउड/OpenRouter मॉडल पूरे एक्सटेंशन में खर्च होते हैं और भत्ते पर आगे भुगतान किए गए कॉल को रोकते हैं। स्थानीय प्रदाताओं की गणना नहीं की जाती है.", 'st.display.cost_reset': "व्यय रीसेट करें", 'st.display.strict_secret.label': "सख्त गुप्त संचालन", - 'st.display.strict_secret.desc': "सारांश या सहायक पाठ में क्रेडेंशियल (पासवर्ड, एपीआई कुंजी, टोकन, ओटीपी) उद्धृत करने से इनकार करें - भले ही आप स्पष्ट रूप से उनके लिए पूछें। उपयोगी यदि आप नियमित रूप से ट्रेस फ़ाइलें या स्क्रीन-शेयर साझा करते हैं। डिफ़ॉल्ट रूप से बंद, ताकि एजेंट ज़रूरत पड़ने पर आपके द्वारा पूछा गया सटीक मान दोहरा सके। जब आप चाहते हैं कि `done` सारांश व्यवस्थित रहें और क्रेडेंशियल कभी न दोहराए जाएँ, तो इसे चालू करें (सेटिंग्स → सुरक्षा)।", + 'st.display.strict_secret.desc': "सारांश या सहायक पाठ में क्रेडेंशियल (पासवर्ड, एपीआई कुंजी, टोकन, ओटीपी) उद्धृत करने से इनकार करें - भले ही आप स्पष्ट रूप से उनके लिए पूछें। उपयोगी यदि आप नियमित रूप से ट्रेस फ़ाइलें या स्क्रीन-शेयर साझा करते हैं। डिफ़ॉल्ट रूप से बंद, ताकि एजेंट ज़रूरत पड़ने पर आपके द्वारा पूछा गया सटीक मान दोहरा सके। जब आप चाहते हैं कि `done` सारांश व्यवस्थित रहें और क्रेडेंशियल कभी न दोहराए जाएँ, तो इसे चालू करें।", 'st.display.allow_local_network.label': "एजेंट को स्थानीय नेटवर्क तक पहुंचने की अनुमति दें", 'st.display.allow_local_network.desc': "एजेंट के फ़ेच_यूआरएल टूल को लूपबैक (127.0.0.1, localhost) और निजी/RFC1918 पते (10.x, 192.168.x, 172.16–31.x) तक पहुंचने देता है। स्थानीय डेव सर्वर, इंट्रानेट टूल या स्वयं-होस्टेड एपीआई के लिए उपयोगी। डिफ़ॉल्ट रूप से बंद। बंद होने पर सीधे निजी या लूपबैक IP पते वाले URL और localhost नाम अवरुद्ध होते हैं। DNS रिज़ॉल्यूशन की जाँच नहीं होती, इसलिए अन्य होस्टनाम स्थानीय पतों तक पहुँच सकते हैं। क्लाउड-मेटाडेटा के सीधे IP पते (169.254.169.254) और सूचीबद्ध मेटाडेटा या *.internal/*.local होस्टनाम चालू होने पर भी अवरुद्ध रहते हैं।", 'st.display.scheduled_tasks.label': "निर्धारित कार्य", @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': "अधिकतम", 'st.providers.compat.value.system': "सिस्टम", 'st.providers.compat.value.developer': "डेवलपर", - 'st.providers.webbrain_data_use.body': "मुफ़्त दैनिक WebBrain Compass उपयोग शामिल है। जबकि हेल्प इम्प्रूव WebBrain डिफ़ॉल्ट रूप से चालू है, चयनित Compass वार्तालापों को बनाए रखा जा सकता है और मूल्यांकन, सुधार, फाइन-ट्यूनिंग और प्रशिक्षण के लिए उपयोग किया जा सकता है। उन उपयोगों से भविष्य के Compass इंटरैक्शन को बाहर करने के लिए इसे सामान्य → उन्नत में बंद करें। WebBrain स्थानीय-मॉडल और आपके स्वयं के API अनुरोध केवल तभी एकत्र करता है जब आप उस प्रदाता का “अनुसंधान हेतु क्वेरी साझा करें” विकल्प चालू करते हैं। {privacyLink}. अधिक उपयोग के लिए, {subscribeLink} पर सदस्यता लें। {accountLink} पर बिलिंग प्रबंधित करें।", + 'st.providers.webbrain_data_use.body': "मुफ़्त दैनिक WebBrain Compass उपयोग शामिल है। जबकि हेल्प इम्प्रूव WebBrain डिफ़ॉल्ट रूप से चालू है, चयनित Compass वार्तालापों को बनाए रखा जा सकता है और मूल्यांकन, सुधार, फाइन-ट्यूनिंग और प्रशिक्षण के लिए उपयोग किया जा सकता है। उन उपयोगों से भविष्य के Compass इंटरैक्शन को बाहर करने के लिए इसे सेटिंग्स → उन्नत में बंद करें। WebBrain स्थानीय-मॉडल और आपके स्वयं के API अनुरोध केवल तभी एकत्र करता है जब आप उस प्रदाता का “अनुसंधान हेतु क्वेरी साझा करें” विकल्प चालू करते हैं। {privacyLink}. अधिक उपयोग के लिए, {subscribeLink} पर सदस्यता लें। {accountLink} पर बिलिंग प्रबंधित करें।", 'st.providers.share_research.label': "अनुसंधान हेतु क्वेरी साझा करें", 'st.providers.share_research.hint': "इस प्रदाता के प्रॉम्प और प्रतिक्रियाएँ मूल्यांकन और सुधार हेतु WebBrain को भेजता है, जिसमें प्रयुक्त प्रदाता और मॉडल शामिल हैं। साझा करने से पहले चित्र और बाइनरी अनुलग्नक हटाए जाते हैं और पाठ छोटा किया जाता है; शेष पाठ ज्यों-का-त्यों भेजा जाता है।", 'st.providers.share_research.confirm': "क्या इस प्रदाता की क्वेरी अनुसंधान हेतु WebBrain के साथ साझा करें?\n\nचालू होने पर, इस प्रदाता के साथ आपके प्रॉम्प, प्रतिक्रियाएँ और टूल इंटरैक्शन प्रदाता और मॉडल के नाम सहित मूल्यांकन और सुधार हेतु WebBrain को भेजे जाएँगे। चित्र हटाने और लंबी सामग्री छोटा करने के बाद पाठ ज्यों-का-त्यों भेजा जाता है, इसलिए संवेदनशील व्यक्तिगत डेटा साझा करने से बचें। भविष्य में साझा करना रोकने हेतु आप इसे कभी भी बंद कर सकते हैं।", @@ -1058,7 +1055,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "स्क्रीनशॉट संशोधन", 'st.redaction.toggle.label': "स्क्रीनशॉट से संवेदनशील सामग्री को संपादित करें", 'st.redaction.toggle.desc': "विज़न मॉडल पर स्क्रीनशॉट भेजने से पहले, फॉर्म फ़ील्ड और टेक्स्ट को धुंधला कर दें जो ईमेल या फ़ोन नंबर जैसा दिखता है। डिटेक्शन पूरी तरह से आपके डिवाइस पर चलता है - अतिरिक्त कुछ भी प्रसारित नहीं होता है।", 'st.redaction.warning': "⚠️ सर्वश्रेष्ठ-प्रयास और असफल-ओपन: यदि किसी पृष्ठ पर संपादन नहीं चल सकता है (उदाहरण के लिए नेविगेशन के ठीक बाद, पीडीएफ दर्शकों पर, या प्रतिबंधित ब्राउज़र पृष्ठों पर), तो स्क्रीनशॉट अभी भी बिना संपादित किए भेजा जाता है। डिटेक्शन केवल DOM ह्यूरिस्टिक्स का उपयोग करता है - कैनवास-तैयार पाठ, छवियों के अंदर पीआईआई, या फॉर्म फ़ील्ड या ईमेल/फोन टेक्स्ट के रूप में पहचानी नहीं गई कोई भी चीज़ फिसल सकती है, और मॉडल को भेजा गया पेज टेक्स्ट इस सेटिंग द्वारा संपादित नहीं किया जाता है। यह कोई सुरक्षा गारंटी नहीं है. पूर्ण गोपनीयता के लिए, स्थानीय/ऑफ़लाइन मॉडल (llama.cpp, Ollama) का उपयोग करें: स्क्रीनशॉट कभी भी आपकी मशीन को नहीं छोड़ते हैं और संपादन अनावश्यक है।", @@ -1246,7 +1242,7 @@ export default { "sp.slash.export_traces_full": "स्क्रीनशॉट सहित पूरा सहेजा गया ट्रेस सत्र JSON के रूप में निर्यात करें", "sp.export_traces.recording_truncated": "सभी सहेजे गए रिकॉर्ड JSON में निर्यात हो गए। रिकॉर्डिंग के दौरान छोड़ी गई सामग्री निर्यात से वापस नहीं मिल सकती।", "sp.slash.export_traces": "उपकरण श्रृंखला (निशान) निर्यात करें", - "sp.export_traces.none": "इस बातचीत का कोई निशान नहीं. सेटिंग्स में रिकॉर्ड ट्रेस सक्षम करें, फिर से चलाएँ।", + "sp.export_traces.none": "इस बातचीत का कोई निशान नहीं. सेटिंग्स → उन्नत में रिकॉर्ड ट्रेस सक्षम करें, फिर से चलाएँ।", "sp.export_traces.error": "निशान निर्यात नहीं किए जा सके.", "sp.export_traces.done": "टूल श्रृंखला निर्यात की गई.", "sp.export_traces.no_conversation": "अभी तक निर्यात करने के लिए कुछ भी नहीं है - पहले बातचीत शुरू करें।", @@ -1320,8 +1316,8 @@ export default { "st.sync.confirm.reset": "क्या एन्क्रिप्टेड क्लाउड कॉपी को इस डिवाइस के मौजूदा WebBrain सेटअप से बदलना है?", "st.sync.consent.legacy": "एन्क्रिप्टेड सिंक चालू करें? WebBrain आपकी यादों, प्रोफ़ाइल ऑटोफ़िल और API-कुंजी प्रदाता सेटिंग्स की एंड-टू-एंड एन्क्रिप्टेड कॉपी WebBrain Compass को भेजेगा। चैट इतिहास और OAuth साइन-इन सिंक नहीं किए जाते।", "st.sync.consent.denied": "एन्क्रिप्टेड सिंक अनुमति नहीं दी गई थी.", - 'st.providers.webgpu_note.body': '{modelLink} बिना किसी API एंडपॉइंट के पूरी तरह Chrome में चलता है। इसे Settings > Providers > WebGPU या Apocalypse Mode में डाउनलोड करें, फिर standalone chat में nuclear control का उपयोग करें।', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} बिना किसी API एंडपॉइंट के पूरी तरह Chrome में चलता है। इसे Providers > WebGPU या Apocalypse Mode में डाउनलोड करें, फिर standalone chat में nuclear control का उपयोग करें।', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/id.js b/src/chrome/src/ui/locales/id.js index 42ba54ed68..788b02690d 100644 --- a/src/chrome/src/ui/locales/id.js +++ b/src/chrome/src/ui/locales/id.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Perkecil UI ekstensi', 'sp.ui_scale.increase': 'Perbesar UI ekstensi', 'sp.ui_scale.reset': 'Atur ulang', - 'st.display.ui_scale.label': 'Zoom UI ekstensi', - 'st.display.ui_scale.decrease': 'Perkecil UI ekstensi', - 'st.display.ui_scale.increase': 'Perbesar UI ekstensi', - 'st.display.ui_scale.reset': 'Atur ulang', - 'st.display.ui_scale.desc': 'Ubah ukuran panel samping dan jendela chat terpisah tanpa mengubah zoom halaman.', - 'st.display.ui_scale.shortcuts': 'Pintasan khusus: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Belum ditetapkan', - 'st.display.ui_scale.manage_shortcuts': 'Sesuaikan pintasan', 'tool.delegate_research': 'Meneliti dengan ChatGPT', 'st.display.research_escalation.label': 'Eskalasi riset', 'st.display.research_escalation.desc': 'Jika diaktifkan, WebBrain dapat meminta izin sebelum mengirim prompt riset hanya-baca yang sangat kompleks ke ChatGPT. Nonaktif secara default. Prompt yang persis sama hanya dibagikan setelah persetujuan eksplisit Anda.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Jangan lanjutkan", "sp.recipient.reason_unrequested": "WebBrain tidak dapat memastikan dari permintaan Anda bahwa pesan harus dikirim. Percakapan yang terbuka di {host} adalah dengan {recipient}.", "sp.recipient.reason_unnamed": "WebBrain tidak dapat memastikan dari permintaan Anda siapa yang harus menerima pesan ini. Percakapan yang terbuka di {host} adalah dengan {recipient}.", - 'st.tab.permissions': "Izin", 'st.perms.revoke': "Cabut", 'st.perms.clear_all': "Hapus semua izin", 'st.perms.gate.label': "Tanya sebelum tindakan penting", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Mulai', 'ob.btn.skip': 'Lewati dulu', 'ob.btn.start': 'Mulai', - 'ob.cloud.body': 'WebBrain Compass siap dengan alokasi mingguan gratis. Percakapan Compass yang dipilih dapat disimpan dan digunakan untuk meningkatkan WebBrain selama Bantu Tingkatkan WebBrain aktif secara default. Anda dapat mematikannya di Pengaturan → Umum.', + 'ob.cloud.body': 'WebBrain Compass siap dengan alokasi mingguan gratis. Percakapan Compass yang dipilih dapat disimpan dan digunakan untuk meningkatkan WebBrain selama Bantu Tingkatkan WebBrain aktif secara default. Anda dapat mematikannya di Pengaturan → Lanjutan.', 'ob.cloud.change': 'Ubah', 'ob.cloud.using': 'Menggunakan WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Hasil', 'sp.api.enabled_html': '🔓 Perubahan melalui API diaktifkan untuk percakapan ini. Agen kini dapat menggunakan POST/PUT/PATCH/DELETE melalui fetch_url dan execute_js bila menilai API lebih andal daripada UI untuk suatu langkah. UI tetap menjadi pilihan utama secara bawaan. Flag ini akan terhapus saat Anda mereset percakapan.', - 'sp.permissions.disabled_html': '⚠️ Permintaan izin NONAKTIF. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, merekam, dan menjadwalkan pekerjaan mendatang tanpa bertanya terlebih dahulu. Aktifkan kembali dari Pengaturan → Izin → Tanya sebelum tindakan penting.', + 'sp.permissions.disabled_html': '⚠️ Permintaan izin NONAKTIF. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, merekam, dan menjadwalkan pekerjaan mendatang tanpa bertanya terlebih dahulu. Aktifkan kembali dari tombol ⚠ di samping mikrofon.', 'sp.permissions.button': 'Permintaan izin: aktif', 'sp.permissions.button_off': 'Permintaan izin: nonaktif', 'sp.permissions.gate_desc': 'WebBrain bertanya saat pertama kali mengklik, mengetik, mengunduh, atau menjalankan kode di sebuah situs.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Menunggu "{selector}"', 'st.title': 'Pengaturan WebBrain', - 'st.subtitle': 'Konfigurasikan penyedia LLM dan preferensi · v{version}', + 'st.subtitle': 'Konfigurasikan cara kerja WebBrain · v{version}', 'st.tab.display': 'Umum', + 'st.tab.budgets': 'Anggaran', + 'st.tab.advanced': 'Lanjutan', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Ucapan', + 'st.tab.generative': 'Generatif', + 'st.tab.decision': 'Keputusan', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Penyedia WebBrain', + 'st.providers_page.subtitle': 'Pilih model yang digunakan WebBrain · v{version}', + 'st.permissions_page.title': 'Izin WebBrain', + 'st.permissions_page.subtitle': 'Situs tempat WebBrain boleh bertindak tanpa bertanya dulu', 'st.tab.providers': 'Penyedia', 'st.tab.vision': 'Visi', 'st.tab.profile': 'Profil', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Perbarui metode pembayaran", 'st.account.manage_billing': 'Kelola penagihan', - 'st.display.language.label': 'Bahasa', - 'st.display.language.desc': 'Bahasa antarmuka untuk plugin WebBrain.', 'st.display.verbose.label': 'Mode terperinci', 'st.display.verbose.desc': 'Tampilkan detail lengkap pemanggilan alat, argumen, dan hasil JSON mentah. Nonaktif secara bawaan demi tampilan obrolan yang lebih bersih.', 'st.display.selection_shortcut.label': 'Pintasan pilihan', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Tangkapan layar otomatis', "st.display.auto_screenshot.desc": "Ambil tangkapan layar viewport secara otomatis setelah agen bertindak pada halaman, agar rute visi yang dipilih dapat melihat perubahan. Ini memakai lebih banyak token. Jika visi tidak tersedia, pengayaan dilewati dan tugas berlanjut dengan pemberitahuan status.", 'st.display.auto_screenshot.off': 'Nonaktif', - 'st.display.auto_screenshot.navigation': 'Saat navigasi', - 'st.display.auto_screenshot.state_change': 'Saat perubahan status (bawaan)', + 'st.display.auto_screenshot.navigation': 'Saat navigasi (bawaan)', + 'st.display.auto_screenshot.state_change': 'Saat perubahan status', 'st.display.auto_screenshot.every_step': 'Setiap langkah', 'st.display.tracing.label': 'Rekam jejak (untuk perbandingan model)', - 'st.display.tracing.desc_html': 'Simpan setiap proses (permintaan LLM, respons, pemanggilan alat, tangkapan layar) ke IndexedDB lokal sehingga Anda dapat memeriksa dan membandingkan model berdampingan. Membuka tab Jejak terpisah. Nonaktif secara bawaan karena menambah penulisan disk per langkah. Buka halaman Jejak →', - 'st.display.lossless_tracing.label': 'Rekam detail lengkap permintaan (tingkat debug)', - 'st.display.lossless_tracing.desc_html': 'Juga menyimpan prompt, pesan, dan skema alat lengkap dari setiap permintaan LLM alih-alih ringkasan tanpa konten, dan menyimpan hingga 200 KB setiap hasil alat. Memungkinkan debug mendalam dan rekonstruksi permintaan. Nonaktif secara default karena menulis konten percakapan Anda secara lokal dan memakai disk jauh lebih banyak. Memerlukan perekaman trace aktif.', + 'st.display.tracing.desc_html': 'Simpan setiap proses (permintaan LLM, respons, pemanggilan alat, tangkapan layar) ke IndexedDB lokal sehingga Anda dapat memeriksa dan membandingkan model berdampingan, termasuk prompt, pesan, dan skema alat lengkap dari setiap permintaan LLM serta hingga 200 KB setiap hasil alat. Membuka tab Jejak terpisah. Nonaktif secara bawaan karena menulis konten percakapan Anda secara lokal dan memakai disk jauh lebih banyak. Buka halaman Jejak →', 'st.display.allow_local_network.label': 'Izinkan agen mengakses jaringan lokal', 'st.display.allow_local_network.desc': 'Memungkinkan alat fetch_url agen menjangkau loopback (127.0.0.1, localhost) dan alamat privat/RFC1918 (10.x, 192.168.x, 172.16–31.x). Berguna untuk server pengembangan lokal, alat intranet, atau API yang di-host sendiri. Nonaktif secara bawaan. Saat nonaktif, URL dengan alamat IP privat atau loopback yang ditulis langsung dan nama localhost diblokir. Resolusi DNS tidak diperiksa, sehingga nama host lain masih dapat menjangkau alamat lokal. IP literal metadata cloud (169.254.169.254) dan nama metadata dalam daftar atau *.internal/*.local tetap diblokir meskipun diaktifkan.', 'st.display.notify_sound.label': "Suara notifikasi", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Mode visi diaktifkan untuk penyedia aktif.", "sp.vision.off": "Mode visi dinonaktifkan untuk penyedia aktif.", "sp.vision.error": "Pengalihan visi gagal: {msg}", - "st.tab.multimodal": "Model Pendukung", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Disarankan. Saat aktif, WebBrain meminta izin pertama kali ia mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, atau merekam pada sebuah situs (lalu mengingat pilihan Anda). Matikan untuk penggunaan cepat tanpa konfirmasi pada situs yang sepenuhnya Anda percayai.", "st.perms.gate.warning": "⚠️ Konfirmasi izin NONAKTIF. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, dan merekam pada situs apa pun TANPA bertanya — termasuk pada halaman yang kontennya mungkin dikendalikan penyerang. Konten halaman tetap diperlakukan sebagai tidak tepercaya secara internal, tetapi tidak ada yang akan mencegah instruksi yang disisipkan memicu sebuah tindakan. Biarkan nonaktif hanya jika Anda sepenuhnya memercayai setiap situs tempat Anda memakai asisten ini.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Bawaan sistem", "st.display.download_directory.error": "Gunakan folder relatif seperti WebBrain atau Work/WebBrain. Jalur absolut dan “..” tidak diizinkan.", "st.display.strict_secret.label": "Penanganan rahasia ketat", - "st.display.strict_secret.desc": "Menolak mengutip kredensial (kata sandi, kunci API, token, OTP) dalam ringkasan atau teks asisten — bahkan saat Anda memintanya secara eksplisit. Berguna jika Anda kerap berbagi berkas jejak atau berbagi layar. Nonaktif secara bawaan sehingga agen dapat mengulang nilai persis yang Anda minta saat Anda membutuhkannya. Aktifkan (Pengaturan → Keamanan) jika Anda ingin ringkasan `done` tetap rapi dan kredensial tidak pernah diulang.", + "st.display.strict_secret.desc": "Menolak mengutip kredensial (kata sandi, kunci API, token, OTP) dalam ringkasan atau teks asisten — bahkan saat Anda memintanya secara eksplisit. Berguna jika Anda kerap berbagi berkas jejak atau berbagi layar. Nonaktif secara bawaan sehingga agen dapat mengulang nilai persis yang Anda minta saat Anda membutuhkannya. Aktifkan jika Anda ingin ringkasan `done` tetap rapi dan kredensial tidak pernah diulang.", "st.display.request_timeout.label": "Batas waktu permintaan LLM", "st.display.request_timeout.desc": "Batas waktu menunggu header respons dan setiap jeda antarbagian respons streaming. Bawaan: 120 detik. Naikkan untuk model lokal yang lambat, terutama pada CPU atau dengan konteks besar.", "st.providers.filter.all": "Semua", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Pesan dimasukkan ke antrean saat WebBrain sibuk. Hanya /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, dan /verbose yang dapat langsung berjalan sebagai perintah slash.', 'tool.go_back': 'Kembali', 'tool.go_forward': 'Maju', - 'st.display.search.placeholder': 'Cari pengaturan Umum', - 'st.display.search.empty': 'Tidak ada pengaturan Umum yang cocok.', + 'st.display.search.placeholder': 'Cari pengaturan', + 'st.display.search.empty': 'Tidak ada pengaturan yang cocok.', 'st.display.advanced': 'Lanjutan', ...getApocalypseModeCopy('id'), ...getEmergencyBoxCopy('id'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Tidak ada memori tersimpan dengan ID tersebut.", "st.memory.security_html": "Privasi: memori pengguna disimpan sebagai teks biasa di profil peramban ini. Saat diaktifkan, catatan memori aktif dikirim ke penyedia LLM yang Anda konfigurasikan sebagai bagian dari prompt sistem. Jangan simpan kata sandi, kunci API, token, kode pemulihan, atau rahasia sensitif di sini.", "hist.filter.clear": "Bersihkan filter dan tampilkan semua percakapan", - "st.redaction.heading": "Penyamaran tangkapan layar", "st.redaction.toggle.label": "Samarkan konten sensitif pada tangkapan layar", "st.redaction.toggle.desc": "Sebelum tangkapan layar dikirim ke model visi, WebBrain mengaburkan kolom formulir dan teks yang terlihat seperti email atau nomor telepon. Pendeteksian berjalan sepenuhnya di perangkat Anda — tidak ada yang dikirim ekstra.", "st.redaction.warning": "⚠️ Ini bersifat best-effort dan fail-open: jika penyamaran tidak bisa berjalan di suatu halaman (misalnya tepat setelah navigasi, di penampil PDF, atau di halaman browser yang dibatasi), tangkapan layar tetap dikirim tanpa disamarkan. Pendeteksian hanya menggunakan heuristik DOM — teks yang digambar di canvas, informasi pribadi di dalam gambar, atau apa pun yang tidak dikenali sebagai kolom formulir atau teks email/telepon bisa saja lolos, dan teks halaman yang dikirim ke model tidak disamarkan oleh pengaturan ini. Ini BUKAN jaminan keamanan. Untuk privasi penuh, gunakan model lokal/offline (llama.cpp, Ollama): tangkapan layar tidak akan pernah meninggalkan perangkat Anda dan penyamaran pun jadi tidak diperlukan.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Ekspor seluruh sesi jejak tersimpan sebagai JSON, termasuk tangkapan layar", "sp.export_traces.recording_truncated": "Semua catatan tersimpan telah diekspor sebagai JSON. Konten yang dihilangkan saat perekaman tidak dapat dipulihkan melalui ekspor.", "sp.slash.export_traces": "Ekspor rantai alat (jejak)", - "sp.export_traces.none": "Tidak ada jejak untuk percakapan ini. Aktifkan Rekam jejak di Pengaturan, lalu jalankan lagi.", + "sp.export_traces.none": "Tidak ada jejak untuk percakapan ini. Aktifkan Rekam jejak di Pengaturan → Lanjutan, lalu jalankan lagi.", "sp.export_traces.error": "Tidak dapat mengekspor jejak.", "sp.export_traces.done": "Rantai alat diekspor.", "sp.export_traces.no_conversation": "Belum ada yang diekspor — mulai percakapan dulu.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Gunakan WebBrain sebagai halaman tab baru", "st.display.newtab.desc": "Tab baru membuka halaman WebBrain dengan kotak untuk Bertanya, Bertindak, atau Mencari. Matikan untuk tetap memakai halaman tab baru bawaan browser Anda; Anda dapat mengubahnya kapan saja di Pengaturan → Umum.", "st.display.help_improve.desc_html": "Izinkan interaksi WebBrain Compass tertentu disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Aktif secara default. Nonaktifkan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri dari penyedia tempat Anda mengaktifkan “Bagikan kueri untuk riset”. Kebijakan privasi →", - "st.providers.webbrain_data_use.body": "Penggunaan harian gratis WebBrain Compass sudah termasuk. Saat Bantu Tingkatkan WebBrain aktif secara default, percakapan Compass tertentu dapat disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Nonaktifkan di Umum → Lanjutan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri jika Anda mengaktifkan opsi “Bagikan kueri untuk riset” penyedia ini. {privacyLink}. Untuk penggunaan lebih banyak, berlangganan di {subscribeLink}. Kelola penagihan di {accountLink}.", + "st.providers.webbrain_data_use.body": "Penggunaan harian gratis WebBrain Compass sudah termasuk. Saat Bantu Tingkatkan WebBrain aktif secara default, percakapan Compass tertentu dapat disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Nonaktifkan di Pengaturan → Lanjutan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri jika Anda mengaktifkan opsi “Bagikan kueri untuk riset” penyedia ini. {privacyLink}. Untuk penggunaan lebih banyak, berlangganan di {subscribeLink}. Kelola penagihan di {accountLink}.", 'st.providers.share_research.label': "Bagikan kueri untuk riset", 'st.providers.share_research.hint': "Mengirim prompt dan respons dari penyedia ini ke WebBrain untuk evaluasi dan peningkatan, termasuk penyedia dan model yang digunakan. Gambar dan lampiran biner dihapus dan teks dipotong sebelum dibagikan; sisa teks dikirim apa adanya.", 'st.providers.share_research.confirm': "Bagikan kueri dari penyedia ini dengan WebBrain untuk riset?\n\nJika aktif, prompt, respons, dan interaksi alat Anda dengan penyedia ini akan dikirim ke WebBrain untuk evaluasi dan peningkatan, beserta nama penyedia dan model. Teks dikirim apa adanya setelah gambar dihapus dan konten panjang dipotong, jadi hindari membagikan data pribadi yang sensitif. Anda dapat mematikannya kapan saja untuk menghentikan berbagi.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Ingin lebih sedikit gangguan? “Selalu izinkan” mengingat situs ini. Perintah di bawah menonaktifkan permintaan izin WebBrain di semua situs.", "sp.perm.insert_skip_command": "Sisipkan /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Draf Anda tidak berubah. Kosongkan sebelum menyisipkan perintah.", - "ob.act.permissions_tip": "Permintaan izin aktif secara default. Pengguna tingkat lanjut dapat menonaktifkannya secara global dengan /dangerously-skip-permissions dan mengaktifkannya kembali di Pengaturan → Izin.", + "ob.act.permissions_tip": "Permintaan izin aktif secara default. Pengguna tingkat lanjut dapat menonaktifkannya secara global dengan /dangerously-skip-permissions dan mengaktifkannya kembali dari tombol ⚠ di samping mikrofon.", 'st.provider.field.cache_read_cost_per_million': "Perkiraan biaya baca cache ($ / 1 juta token)", 'st.provider.field.cache_write_cost_per_million': "Perkiraan biaya tulis cache 5 menit ($ / 1 juta token)", 'st.provider.field.cache_write_1h_cost_per_million': "Perkiraan biaya tulis cache 1 jam ($ / 1 juta token)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Ganti salinan cloud terenkripsi dengan pengaturan WebBrain perangkat ini saat ini?", "st.sync.consent.legacy": "Aktifkan sinkronisasi terenkripsi? WebBrain akan mengirimkan salinan memori Anda yang terenkripsi ujung ke ujung, pengisian otomatis profil, dan pengaturan penyedia kunci API ke WebBrain Compass. Riwayat obrolan dan proses masuk OAuth tidak disinkronkan.", "st.sync.consent.denied": "Izin sinkronisasi terenkripsi tidak diberikan.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/ja.js b/src/chrome/src/ui/locales/ja.js index 9956a7d986..9c14e002df 100644 --- a/src/chrome/src/ui/locales/ja.js +++ b/src/chrome/src/ui/locales/ja.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '拡張機能 UI を縮小', 'sp.ui_scale.increase': '拡張機能 UI を拡大', 'sp.ui_scale.reset': 'リセット', - 'st.display.ui_scale.label': '拡張機能 UI のズーム', - 'st.display.ui_scale.decrease': '拡張機能 UI を縮小', - 'st.display.ui_scale.increase': '拡張機能 UI を拡大', - 'st.display.ui_scale.reset': 'リセット', - 'st.display.ui_scale.desc': 'ページのズームを変更せずに、サイドパネルと独立したチャットウィンドウのサイズを変更します。', - 'st.display.ui_scale.shortcuts': '専用ショートカット: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': '未設定', - 'st.display.ui_scale.manage_shortcuts': 'ショートカットをカスタマイズ', 'tool.delegate_research': 'ChatGPTで調査中', 'st.display.research_escalation.label': '調査のエスカレーション', 'st.display.research_escalation.desc': '有効にすると、WebBrainは非常に複雑な読み取り専用の調査プロンプトをChatGPTへ送信する前に許可を求めることがあります。デフォルトではオフです。正確なプロンプトは、明示的な承認後にのみ共有されます。', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "続行しない", "sp.recipient.reason_unrequested": "WebBrain はリクエストから、メッセージを送るべきかどうか判断できませんでした。{host} で開いている会話の相手は {recipient} です。", "sp.recipient.reason_unnamed": "WebBrain はリクエストから、このメッセージを誰に送るか判断できませんでした。{host} で開いている会話の相手は {recipient} です。", - 'st.tab.permissions': "権限", 'st.perms.revoke': "取り消す", 'st.perms.clear_all': "すべての権限を消去", 'st.perms.gate.label': "重要な操作の前に確認する", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '開始', 'ob.btn.skip': '今はスキップ', 'ob.btn.start': '開始', - 'ob.cloud.body': 'WebBrain Compass は1週間あたりの無料割り当てで準備できています。選択した Compass 会話は、WebBrain の改善を支援がデフォルトでオンになっている間、WebBrain の改善のために保存および使用される可能性があります。設定 → 一般でオフにできます。', + 'ob.cloud.body': 'WebBrain Compass は1週間あたりの無料割り当てで準備できています。選択した Compass 会話は、WebBrain の改善を支援がデフォルトでオンになっている間、WebBrain の改善のために保存および使用される可能性があります。設定 → 詳細設定でオフにできます。', 'ob.cloud.change': '変更', 'ob.cloud.using': 'WebBrain Compass を使用しています。', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '結果', 'sp.api.enabled_html': '🔓 この会話で API による変更が有効 になりました。エージェントは UI より API のほうが確実だと判断したとき、fetch_url と execute_js で POST/PUT/PATCH/DELETE を使えるようになります。UI 優先という基本方針は変わりません。このフラグは会話をリセットするとクリアされます。', - 'sp.permissions.disabled_html': '⚠️ 権限の確認がオフです。 WebBrain は確認なしにクリック、入力、移動、JavaScript の実行、アップロード、ダウンロード、録画、将来の作業のスケジュールを行います。設定 → 権限 → 重要な操作前に確認 から再有効にしてください。', + 'sp.permissions.disabled_html': '⚠️ 権限の確認がオフです。 WebBrain は確認なしにクリック、入力、移動、JavaScript の実行、アップロード、ダウンロード、録画、将来の作業のスケジュールを行います。マイクの横の ⚠ ボタンから再び有効にしてください。', 'sp.permissions.button': '権限の確認: オン', 'sp.permissions.button_off': '権限の確認: オフ', 'sp.permissions.gate_desc': 'サイトで初めてクリック、入力、ダウンロード、コードの実行を行う前に WebBrain が確認します。', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': '「{selector}」を待機', 'st.title': 'WebBrain 設定', - 'st.subtitle': 'LLM プロバイダーと設定を構成 · v{version}', + 'st.subtitle': 'WebBrain の動作を設定 · v{version}', 'st.tab.display': '一般', + 'st.tab.budgets': '予算', + 'st.tab.advanced': '詳細設定', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '音声', + 'st.tab.generative': '生成', + 'st.tab.decision': '判定', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain プロバイダー', + 'st.providers_page.subtitle': 'WebBrain が使うモデルを選択 · v{version}', + 'st.permissions_page.title': 'WebBrain の権限', + 'st.permissions_page.subtitle': 'WebBrain が確認せずに操作できるサイト', 'st.tab.providers': 'プロバイダー', 'st.tab.vision': '画像認識', 'st.tab.profile': 'プロフィール', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "支払い方法を更新", 'st.account.manage_billing': '請求を管理', - 'st.display.language.label': '言語', - 'st.display.language.desc': 'WebBrain プラグインのインターフェース言語です。', 'st.display.verbose.label': '詳細モード', 'st.display.verbose.desc': 'ツール呼び出しの詳細・引数・生の JSON 結果をすべて表示します。チャットをすっきり見せるため、デフォルトはオフです。', 'st.display.selection_shortcut.label': '選択ショートカット', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': '自動スクリーンショット', "st.display.auto_screenshot.desc": "エージェントがページを操作した後にビューポートのスクリーンショットを自動取得し、選択された画像認識ルートで変化を確認できるようにします。トークン消費が増えます。画像認識が利用できない場合は補足処理を省略し、状態通知を表示してタスクを続行します。", 'st.display.auto_screenshot.off': 'オフ', - 'st.display.auto_screenshot.navigation': '遷移時', - 'st.display.auto_screenshot.state_change': '状態変化時(デフォルト)', + 'st.display.auto_screenshot.navigation': '遷移時(デフォルト)', + 'st.display.auto_screenshot.state_change': '状態変化時', 'st.display.auto_screenshot.every_step': '毎ステップ', 'st.display.tracing.label': 'トレースを記録(モデル比較用)', - 'st.display.tracing.desc_html': 'すべての実行(LLM リクエスト、レスポンス、ツール呼び出し、スクリーンショット)をローカルの IndexedDB に保存し、モデルを並べて検査・比較できるようにします。別の「トレース」タブで開きます。毎ステップで書き込みが増えるためデフォルトはオフです。トレースページを開く →', - 'st.display.lossless_tracing.label': 'リクエストの完全な詳細を記録(デバッグ層)', - 'st.display.lossless_tracing.desc_html': '各LLMリクエストの完全なプロンプト・メッセージ・ツールスキーマを、内容を含まない要約の代わりに保存し、各ツール結果を最大200KB保持します。深いデバッグとリクエスト再構築が可能になります。会話内容をローカルに書き込み、ディスク消費が大幅に増えるため、既定ではオフです。トレース記録の有効化が必要です。', + 'st.display.tracing.desc_html': 'すべての実行(LLM リクエスト、レスポンス、ツール呼び出し、スクリーンショット)をローカルの IndexedDB に保存し、モデルを並べて検査・比較できるようにします。各 LLM リクエストの完全なプロンプト・メッセージ・ツールスキーマと、各ツール結果の最大 200KB も保存されます。別の「トレース」タブで開きます。会話内容をローカルに書き込み、ディスク消費が大幅に増えるため、既定ではオフです。トレースページを開く →', 'st.display.allow_local_network.label': 'エージェントにローカルネットワークへのアクセスを許可', 'st.display.allow_local_network.desc': 'エージェントの fetch_url ツールがループバック(127.0.0.1、localhost)やプライベート/RFC1918 アドレス(10.x、192.168.x、172.16–31.x)に届くようになります。ローカル開発サーバー、社内ツール、セルフホスト API に便利です。デフォルトはオフです。オフの場合、プライベート IP やループバック IP を直接記述した URL と localhost のホスト名をブロックします。DNS の名前解決は確認しないため、別のホスト名からローカルアドレスに接続できる場合があります。クラウドメタデータの IP リテラル(169.254.169.254)と、指定のメタデータ名または *.internal/*.local はオンでもブロックされます。', 'st.display.notify_sound.label': "通知サウンド", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "アクティブなプロバイダーで画像認識モードを有効にしました。", "sp.vision.off": "アクティブなプロバイダーで画像認識モードを無効にしました。", "sp.vision.error": "画像認識の切り替えに失敗しました: {msg}", - "st.tab.multimodal": "補助モデル", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "推奨。オンにすると、WebBrain はサイトで初めてクリック・入力・移動・JavaScript の実行・アップロード・ダウンロード・録画を行うときに権限を尋ねます(その後はあなたの選択を記憶します)。完全に信頼できるサイトで、確認なしに素早く使いたい場合はオフにしてください。", "st.perms.gate.warning": "⚠️ 権限の確認がオフです。WebBrain はあらゆるサイトで確認なしにクリック・入力・移動・JavaScript の実行・アップロード・ダウンロード・録画を行います — 内容が攻撃者に操作されている可能性のあるページでも同様です。ページの内容は内部的には引き続き信頼できないものとして扱われますが、注入された指示が操作を引き起こすのを止めるものは何もありません。アシスタントを使うすべてのサイトを完全に信頼できる場合にのみ、これをオフのままにしてください。", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "システムの既定値", "st.display.download_directory.error": "WebBrain や Work/WebBrain のような相対フォルダーを指定してください。絶対パスと「..」は使用できません。", "st.display.strict_secret.label": "資格情報の厳格な取り扱い", - "st.display.strict_secret.desc": "要約やアシスタントの文章の中で資格情報(パスワード、API キー、トークン、OTP)を引用することを、たとえ明示的に求めた場合でも拒否します。トレースファイルを共有したり画面を共有したりすることが多い場合に便利です。デフォルトはオフなので、必要なときにエージェントがあなたが求めた正確な値をそのまま返せます。`done` の要約をすっきり保ち、資格情報を決して繰り返さないようにしたい場合は、有効にしてください(設定 → セキュリティ)。", + "st.display.strict_secret.desc": "要約やアシスタントの文章の中で資格情報(パスワード、API キー、トークン、OTP)を引用することを、たとえ明示的に求めた場合でも拒否します。トレースファイルを共有したり画面を共有したりすることが多い場合に便利です。デフォルトはオフなので、必要なときにエージェントがあなたが求めた正確な値をそのまま返せます。`done` の要約をすっきり保ち、資格情報を決して繰り返さないようにしたい場合は、有効にしてください。", "st.display.request_timeout.label": "LLM リクエストのタイムアウト", "st.display.request_timeout.desc": "応答ヘッダーの受信と、ストリーミング応答の各部分の間で待機できる最大時間です。デフォルトは120秒です。ローカルモデルが遅い場合、特にCPUで実行する場合やコンテキストが大きい場合は、時間を長くしてください。", "st.providers.filter.all": "すべて", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain がビジーの間、メッセージはキューに入ります。/help、/progress、/btw、/scratchpad、/memory、/schedule --list、/watch、/dangerously-skip-permissions、/screenshot、/export、/export --traces、/verbose だけがスラッシュコマンドとしてすぐに実行できます。', 'tool.go_back': '戻る', 'tool.go_forward': '進む', - 'st.display.search.placeholder': '一般設定を検索', - 'st.display.search.empty': '一致する一般設定はありません。', + 'st.display.search.placeholder': '設定を検索', + 'st.display.search.empty': '一致する設定はありません。', 'st.display.advanced': '詳細設定', ...getApocalypseModeCopy('ja'), ...getEmergencyBoxCopy('ja'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "その ID の保存済みメモリはありません。", "st.memory.security_html": "プライバシー: ユーザーメモリは、このブラウザープロフィールにプレーンテキストで保存されます。有効にすると、有効なメモリ記録がシステムプロンプトの一部として、設定した LLM プロバイダーに送信されます。パスワード、API キー、トークン、復旧コード、機密情報は保存しないでください。", "hist.filter.clear": "フィルターを消去してすべての会話を表示", - "st.redaction.heading": "スクリーンショットの黒塗り", "st.redaction.toggle.label": "スクリーンショット内の機密情報を黒塗りする", "st.redaction.toggle.desc": "スクリーンショットをビジョンモデルに送信する前に、フォーム項目やメールアドレス・電話番号らしきテキストにモザイクをかけます。検出はすべて端末内で行われ、追加で送信されるデータはありません。", "st.redaction.warning": "⚠️ これはベストエフォートかつフェイルオープンな処理です。ページ上で黒塗り処理が実行できない場合(ナビゲーション直後、PDFビューア、制限されたブラウザページなど)、スクリーンショットは黒塗りされないまま送信されます。検出はDOMヒューリスティックのみに基づいており、canvasに描画されたテキスト、画像内の個人情報、フォーム項目やメール/電話のテキストと認識されないものは見逃される可能性があります。またモデルに送られるページの本文テキストはこの設定では黒塗りされません。これはセキュリティ上の保証ではありません。完全なプライバシーが必要な場合は、ローカル/オフラインモデル(llama.cpp、Ollamaなど)を使用してください。その場合スクリーンショットは端末から一切出ないため、黒塗りは不要になります。", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "スクリーンショットを含む保存済みトレースセッション全体をJSONでエクスポート", "sp.export_traces.recording_truncated": "保存済みの全記録をJSONでエクスポートしました。記録時に省略された内容はエクスポートでは復元できません。", "sp.slash.export_traces": "ツールチェーンをエクスポート(トレース)", - "sp.export_traces.none": "この会話のトレースがありません。設定で「トレースを記録」をオンにして、もう一度実行してください。", + "sp.export_traces.none": "この会話のトレースがありません。設定 → 詳細設定で「トレースを記録」をオンにして、もう一度実行してください。", "sp.export_traces.error": "トレースをエクスポートできませんでした。", "sp.export_traces.done": "ツールチェーンを書き出しました。", "sp.export_traces.no_conversation": "まだ書き出すものがありません — 先に会話を始めてください。", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "新しいタブページに WebBrain を使う", "st.display.newtab.desc": "新しいタブで、質問・操作・検索ができる入力欄のある WebBrain のページが開きます。オフにするとブラウザー標準の新しいタブページのままになります。設定 → 一般 でいつでも変更できます。", "st.display.help_improve.desc_html": "選択された WebBrain Compass の操作を保持し、評価、改善、微調整、トレーニングに使用することを許可します。既定でオンです。今後の Compass 操作がこれらの目的に使用されないようにするにはオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、「研究のためにクエリを共有」をオンにしたプロバイダーからのみWebBrainが収集します。プライバシーポリシー →", - "st.providers.webbrain_data_use.body": "WebBrain Compass には毎日の無料利用枠が含まれます。「WebBrain の改善に協力する」は既定でオンであり、選択された Compass の会話が保持され、評価、改善、微調整、トレーニングに使用される場合があります。今後の Compass 操作をこれらの用途から除外するには、一般 → 詳細設定でオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、このプロバイダーの「研究のためにクエリを共有」オプションをオンにした場合のみWebBrainが収集します。{privacyLink}。追加利用は {subscribeLink} で購読してください。請求は {accountLink} で管理できます。", + "st.providers.webbrain_data_use.body": "WebBrain Compass には毎日の無料利用枠が含まれます。「WebBrain の改善に協力する」は既定でオンであり、選択された Compass の会話が保持され、評価、改善、微調整、トレーニングに使用される場合があります。今後の Compass 操作をこれらの用途から除外するには、設定 → 詳細設定でオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、このプロバイダーの「研究のためにクエリを共有」オプションをオンにした場合のみWebBrainが収集します。{privacyLink}。追加利用は {subscribeLink} で購読してください。請求は {accountLink} で管理できます。", 'st.providers.share_research.label': "研究のためにクエリを共有", 'st.providers.share_research.hint': "このプロバイダーのプロンプトと応答を、使用したプロバイダーとモデル名とともに評価・改善のためWebBrainに送信します。画像やバイナリ添付は共有前に除去され、テキストは切り詰められます。残りのテキストはそのまま送信されます。", 'st.providers.share_research.confirm': "このプロバイダーのクエリを研究のためにWebBrainと共有しますか?\n\nオンにすると、このプロバイダーとのプロンプト、応答、ツール操作がプロバイダー名・モデル名とともに評価・改善のためWebBrainに送信されます。テキストは画像除去・長い内容の切り詰め後にそのまま送信されるため、機密の個人情報を共有しないでください。オフにすればいつでも今後の共有を停止できます。", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "中断を減らしますか?「常に許可」はこのサイトを記憶します。以下のコマンドは、すべてのサイトで WebBrain の許可確認を無効にします。", "sp.perm.insert_skip_command": "/dangerously-skip-permissions を入力", "sp.perm.skip_hint_draft": "下書きは変更されていません。コマンドを入力する前に消去してください。", - "ob.act.permissions_tip": "許可確認は既定で有効です。上級ユーザーは /dangerously-skip-permissions ですべてのサイトの確認を無効にし、設定 → 権限から再び有効にできます。", + "ob.act.permissions_tip": "許可確認は既定で有効です。上級ユーザーは /dangerously-skip-permissions ですべてのサイトの確認を無効にし、マイクの横の ⚠ ボタンから再び有効にできます。", 'st.provider.field.cache_read_cost_per_million': "キャッシュ読み取りの推定費用($ / 100万トークン)", 'st.provider.field.cache_write_cost_per_million': "5分キャッシュ書き込みの推定費用($ / 100万トークン)", 'st.provider.field.cache_write_1h_cost_per_million': "1時間キャッシュ書き込みの推定費用($ / 100万トークン)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "暗号化されたクラウド コピーをこのデバイスの現在の WebBrain セットアップに置き換えますか?", "st.sync.consent.legacy": "暗号化された同期をオンにしますか? WebBrain は、エンドツーエンドで暗号化された思い出、プロファイルの自動入力、API キー プロバイダー設定のコピーを WebBrain Compass に送信します。チャット履歴と OAuth サインインは同期されません。", "st.sync.consent.denied": "暗号化された同期権限が付与されませんでした。", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/ko.js b/src/chrome/src/ui/locales/ko.js index 3d60b8b14a..f1b9c350d4 100644 --- a/src/chrome/src/ui/locales/ko.js +++ b/src/chrome/src/ui/locales/ko.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '확장 프로그램 UI 축소', 'sp.ui_scale.increase': '확장 프로그램 UI 확대', 'sp.ui_scale.reset': '초기화', - 'st.display.ui_scale.label': '확장 프로그램 UI 확대/축소', - 'st.display.ui_scale.decrease': '확장 프로그램 UI 축소', - 'st.display.ui_scale.increase': '확장 프로그램 UI 확대', - 'st.display.ui_scale.reset': '초기화', - 'st.display.ui_scale.desc': '페이지 확대/축소는 변경하지 않고 사이드 패널과 별도 채팅 창의 크기를 조정합니다.', - 'st.display.ui_scale.shortcuts': '전용 단축키: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': '지정되지 않음', - 'st.display.ui_scale.manage_shortcuts': '단축키 사용자 지정', 'tool.delegate_research': 'ChatGPT로 조사 중', 'st.display.research_escalation.label': '조사 에스컬레이션', 'st.display.research_escalation.desc': '활성화하면 WebBrain이 매우 복잡한 읽기 전용 조사 프롬프트를 ChatGPT에 보내기 전에 허가를 요청할 수 있습니다. 기본값은 꺼짐입니다. 정확한 프롬프트는 명시적으로 승인한 후에만 공유됩니다.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "계속하지 않기", "sp.recipient.reason_unrequested": "WebBrain이 요청에서 메시지를 보내야 하는지 판단하지 못했습니다. {host}에서 열려 있는 대화 상대는 {recipient}입니다.", "sp.recipient.reason_unnamed": "WebBrain이 요청에서 이 메시지를 누구에게 보낼지 판단하지 못했습니다. {host}에서 열려 있는 대화 상대는 {recipient}입니다.", - 'st.tab.permissions': "권한", 'st.perms.revoke': "취소", 'st.perms.clear_all': "모든 권한 지우기", 'st.perms.gate.label': "중요한 작업 전에 확인", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '시작하기', 'ob.btn.skip': '지금은 건너뛰기', 'ob.btn.start': '시작', - 'ob.cloud.body': 'WebBrain Compass가 무료 주간 할당량으로 준비되었습니다. 선택한 Compass 대화는 WebBrain 개선 도움이 기본적으로 켜져 있는 동안 WebBrain 개선을 위해 저장되고 사용될 수 있습니다. 설정 → 일반에서 끌 수 있습니다.', + 'ob.cloud.body': 'WebBrain Compass가 무료 주간 할당량으로 준비되었습니다. 선택한 Compass 대화는 WebBrain 개선 도움이 기본적으로 켜져 있는 동안 WebBrain 개선을 위해 저장되고 사용될 수 있습니다. 설정 → 고급에서 끌 수 있습니다.', 'ob.cloud.change': '변경', 'ob.cloud.using': 'WebBrain Compass를 사용 중입니다.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '결과', 'sp.api.enabled_html': '🔓 이 대화에서 API 변경이 허용되었습니다. 에이전트는 이제 UI보다 API가 더 안정적이라고 판단할 때 fetch_url과 execute_js를 통해 POST/PUT/PATCH/DELETE를 사용할 수 있습니다. 기본적으로는 UI 우선 방침을 유지합니다. 이 플래그는 대화를 초기화하면 해제됩니다.', - 'sp.permissions.disabled_html': '⚠️ 권한 확인이 꺼져 있습니다. WebBrain은 묻지 않고 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화 및 예약 작업을 수행합니다. 설정 → 권한 → 중요한 작업 전 확인에서 다시 활성화하세요.', + 'sp.permissions.disabled_html': '⚠️ 권한 확인이 꺼져 있습니다. WebBrain은 묻지 않고 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화 및 예약 작업을 수행합니다. 마이크 옆의 ⚠ 버튼에서 다시 활성화하세요.', 'sp.permissions.button': '권한 확인: 켜짐', 'sp.permissions.button_off': '권한 확인: 꺼짐', 'sp.permissions.gate_desc': 'WebBrain은 사이트에서 처음으로 클릭, 입력, 다운로드 또는 코드 실행을 할 때 확인을 요청합니다.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': '"{selector}" 대기', 'st.title': 'WebBrain 설정', - 'st.subtitle': 'LLM 제공자와 설정을 구성합니다 · v{version}', + 'st.subtitle': 'WebBrain의 동작 방식을 구성합니다 · v{version}', 'st.tab.display': '일반', + 'st.tab.budgets': '예산', + 'st.tab.advanced': '고급', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '음성', + 'st.tab.generative': '생성', + 'st.tab.decision': '결정', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain 제공자', + 'st.providers_page.subtitle': 'WebBrain이 사용할 모델을 선택합니다 · v{version}', + 'st.permissions_page.title': 'WebBrain 권한', + 'st.permissions_page.subtitle': 'WebBrain이 먼저 묻지 않고 작업할 수 있는 사이트', 'st.tab.providers': '제공자', 'st.tab.vision': '비전', 'st.tab.profile': '프로필', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "결제 수단 업데이트", 'st.account.manage_billing': '청구 관리', - 'st.display.language.label': '언어', - 'st.display.language.desc': 'WebBrain 플러그인의 인터페이스 언어입니다.', 'st.display.verbose.label': '상세 모드', 'st.display.verbose.desc': '도구 호출의 상세 내용, 인수, 원본 JSON 결과를 모두 표시합니다. 기본적으로는 끔으로 깔끔한 채팅 환경을 제공합니다.', 'st.display.selection_shortcut.label': '선택 바로가기', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': '자동 스크린샷', "st.display.auto_screenshot.desc": "에이전트가 페이지에서 동작한 뒤 뷰포트 스크린샷을 자동으로 캡처하여 선택된 비전 경로가 변경 사항을 볼 수 있게 합니다. 토큰을 더 사용합니다. 비전을 사용할 수 없으면 보강을 건너뛰고 상태 알림과 함께 작업을 계속합니다.", 'st.display.auto_screenshot.off': '끔', - 'st.display.auto_screenshot.navigation': '이동 시', - 'st.display.auto_screenshot.state_change': '상태 변경 시 (기본값)', + 'st.display.auto_screenshot.navigation': '이동 시 (기본값)', + 'st.display.auto_screenshot.state_change': '상태 변경 시', 'st.display.auto_screenshot.every_step': '매 단계', 'st.display.tracing.label': '트레이스 기록 (모델 비교용)', - 'st.display.tracing.desc_html': '모든 실행(LLM 요청, 응답, 도구 호출, 스크린샷)을 로컬 IndexedDB에 보관하여 모델을 나란히 검사하고 비교할 수 있게 합니다. 별도의 트레이스 탭에서 열립니다. 매 단계마다 디스크 쓰기가 늘어나므로 기본값은 꺼짐입니다. 트레이스 페이지 열기 →', - 'st.display.lossless_tracing.label': '요청 전체 세부정보 기록(디버그 계층)', - 'st.display.lossless_tracing.desc_html': '각 LLM 요청의 전체 프롬프트·메시지·도구 스키마를 내용 없는 요약 대신 저장하고, 각 도구 결과를 최대 200KB까지 보관합니다. 심층 디버깅과 요청 재구성이 가능합니다. 대화 내용을 로컬에 기록하고 디스크를 훨씬 더 사용하므로 기본적으로 꺼져 있습니다. 트레이스 기록이 켜져 있어야 합니다.', + 'st.display.tracing.desc_html': '모든 실행(LLM 요청, 응답, 도구 호출, 스크린샷)을 로컬 IndexedDB에 보관하여 모델을 나란히 검사하고 비교할 수 있게 합니다. 각 LLM 요청의 전체 프롬프트·메시지·도구 스키마와 각 도구 결과를 최대 200KB까지 함께 저장합니다. 별도의 트레이스 탭에서 열립니다. 대화 내용을 로컬에 기록하고 디스크를 훨씬 더 사용하므로 기본적으로 꺼져 있습니다. 트레이스 페이지 열기 →', 'st.display.allow_local_network.label': '에이전트의 로컬 네트워크 접근 허용', 'st.display.allow_local_network.desc': '에이전트의 fetch_url 도구가 루프백(127.0.0.1, localhost)과 사설/RFC1918 주소(10.x, 192.168.x, 172.16–31.x)에 접근할 수 있게 합니다. 로컬 개발 서버, 인트라넷 도구, 자체 호스팅 API에 유용합니다. 기본값은 끔입니다. 꺼져 있으면 사설 또는 루프백 IP를 직접 적은 URL과 localhost 이름을 차단합니다. DNS 해석은 확인하지 않으므로 다른 호스트명은 로컬 주소에 접근할 수 있습니다. 클라우드 메타데이터 IP 리터럴(169.254.169.254)과 목록에 있는 메타데이터 이름 또는 *.internal/*.local은 켜져 있어도 차단됩니다.', 'st.display.notify_sound.label': "알림 소리", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "활성 제공자에서 비전 모드가 활성화되었습니다.", "sp.vision.off": "활성 제공자에서 비전 모드가 비활성화되었습니다.", "sp.vision.error": "비전 전환에 실패했습니다: {msg}", - "st.tab.multimodal": "보조 모델", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "권장됩니다. 켜져 있으면 WebBrain이 사이트에서 처음으로 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드 또는 녹화할 때 권한을 요청합니다(이후 선택을 기억합니다). 완전히 신뢰하는 사이트에서 확인 없이 빠르게 사용하려면 끄세요.", "st.perms.gate.warning": "⚠️ 권한 확인이 꺼져 있습니다. WebBrain이 어떤 사이트에서든 — 콘텐츠가 공격자에 의해 조작될 수 있는 페이지를 포함해 — 묻지 않고 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화를 수행합니다. 페이지 콘텐츠는 내부적으로 여전히 신뢰할 수 없는 것으로 취급되지만, 주입된 지시가 동작을 유발하는 것을 막을 수는 없습니다. 어시스턴트를 사용하는 모든 사이트를 완전히 신뢰하는 경우에만 끈 채로 두세요.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "시스템 기본값", "st.display.download_directory.error": "WebBrain 또는 Work/WebBrain 같은 상대 폴더를 사용하세요. 절대 경로와 “..”는 허용되지 않습니다.", "st.display.strict_secret.label": "엄격한 비밀 정보 처리", - "st.display.strict_secret.desc": "요약이나 어시스턴트 텍스트에 자격 증명(비밀번호, API 키, 토큰, OTP)을 인용하기를 거부합니다 — 명시적으로 요청하더라도 마찬가지입니다. 트레이스 파일을 자주 공유하거나 화면을 공유한다면 유용합니다. 기본값은 꺼짐: 필요할 때 에이전트가 요청한 정확한 값을 그대로 알려줄 수 있습니다. `done` 요약을 깔끔하게 유지하고 자격 증명이 반복되지 않게 하려면 켜세요 (설정 → 보안).", + "st.display.strict_secret.desc": "요약이나 어시스턴트 텍스트에 자격 증명(비밀번호, API 키, 토큰, OTP)을 인용하기를 거부합니다 — 명시적으로 요청하더라도 마찬가지입니다. 트레이스 파일을 자주 공유하거나 화면을 공유한다면 유용합니다. 기본값은 꺼짐: 필요할 때 에이전트가 요청한 정확한 값을 그대로 알려줄 수 있습니다. `done` 요약을 깔끔하게 유지하고 자격 증명이 반복되지 않게 하려면 켜세요.", "st.display.request_timeout.label": "LLM 요청 시간 제한", "st.display.request_timeout.desc": "응답 헤더 수신과 스트리밍 응답의 각 청크 사이에 기다리는 최대 시간입니다. 기본값: 120초. 로컬 모델이 느리면, 특히 CPU에서 실행하거나 컨텍스트가 큰 경우 이 시간을 늘리세요.", "st.providers.filter.all": "전체", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain이 사용 중일 때 메시지는 대기열에 추가됩니다. /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, /verbose만 슬래시 명령으로 즉시 실행할 수 있습니다.', 'tool.go_back': '뒤로 가기', 'tool.go_forward': '앞으로 가기', - 'st.display.search.placeholder': '일반 설정 검색', - 'st.display.search.empty': '일치하는 일반 설정이 없습니다.', + 'st.display.search.placeholder': '설정 검색', + 'st.display.search.empty': '일치하는 설정이 없습니다.', 'st.display.advanced': '고급', ...getApocalypseModeCopy('ko'), ...getEmergencyBoxCopy('ko'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "해당 ID의 저장된 메모리가 없습니다.", "st.memory.security_html": "개인정보 보호: 사용자 메모리는 이 브라우저 프로필에 일반 텍스트로 저장됩니다. 사용하면 활성 메모리 기록이 시스템 프롬프트의 일부로 설정한 LLM 공급자에게 전송됩니다. 비밀번호, API 키, 토큰, 복구 코드 또는 민감한 비밀 정보는 저장하지 마세요.", "hist.filter.clear": "필터를 지우고 모든 대화 표시", - "st.redaction.heading": "스크린샷 마스킹", "st.redaction.toggle.label": "스크린샷의 민감한 콘텐츠 마스킹", "st.redaction.toggle.desc": "스크린샷을 비전 모델로 보내기 전에 양식 필드와 이메일이나 전화번호처럼 보이는 텍스트를 흐리게 처리합니다. 감지는 전적으로 사용자 기기에서 실행되며, 추가로 전송되는 데이터는 없습니다.", "st.redaction.warning": "⚠️ 이 기능은 최선을 다하는(best-effort) 방식이며 fail-open입니다. 마스킹이 페이지에서 실행될 수 없는 경우(예: 탐색 직후, PDF 뷰어, 제한된 브라우저 페이지 등) 스크린샷은 마스킹되지 않은 채로 그대로 전송됩니다. 감지는 DOM 휴리스틱만 사용하므로 캔버스에 그려진 텍스트, 이미지 안의 개인정보, 양식 필드나 이메일/전화번호 텍스트로 인식되지 않는 항목은 놓칠 수 있으며, 모델로 전송되는 페이지 텍스트는 이 설정으로 마스킹되지 않습니다. 이는 보안을 보장하는 기능이 아닙니다. 완전한 프라이버시가 필요하다면 로컬/오프라인 모델(llama.cpp, Ollama)을 사용하세요. 이 경우 스크린샷이 기기를 벗어나지 않으므로 마스킹 자체가 필요하지 않습니다.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "스크린샷을 포함한 저장된 전체 추적 세션을 JSON으로 내보내기", "sp.export_traces.recording_truncated": "저장된 모든 기록을 JSON으로 내보냈습니다. 기록 중 누락된 내용은 내보내기로 복구할 수 없습니다.", "sp.slash.export_traces": "도구 체인 내보내기(트레이스)", - "sp.export_traces.none": "이 대화에 대한 트레이스가 없습니다. 설정에서 '트레이스 기록'을 켜고 다시 실행하세요.", + "sp.export_traces.none": "이 대화에 대한 트레이스가 없습니다. 설정 → 고급에서 '트레이스 기록'을 켜고 다시 실행하세요.", "sp.export_traces.error": "트레이스를 내보낼 수 없습니다.", "sp.export_traces.done": "도구 체인을 내보냈습니다.", "sp.export_traces.no_conversation": "아직 내보낼 내용이 없습니다 — 먼저 대화를 시작하세요.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "새 탭 페이지로 WebBrain 사용", "st.display.newtab.desc": "새 탭을 열면 질문, 실행, 검색을 할 수 있는 입력창이 있는 WebBrain 페이지가 열립니다. 끄면 브라우저의 기본 새 탭 페이지가 유지됩니다. 설정 → 일반에서 언제든지 바꿀 수 있습니다.", "st.display.help_improve.desc_html": "선택된 WebBrain Compass 상호작용을 보관하고 평가, 개선, 미세 조정 및 학습에 사용하도록 허용합니다. 기본적으로 켜져 있습니다. 향후 Compass 상호작용이 이러한 목적으로 사용되지 않도록 하려면 끄세요. 로컬 모델 및 자체 API 요청은 “연구를 위해 쿼리 공유”를 켜 제공업체에 한해 WebBrain이 수집합니다. 개인정보 처리방침 →", - "st.providers.webbrain_data_use.body": "WebBrain Compass에는 일일 무료 사용량이 포함됩니다. ‘WebBrain 개선에 참여’가 기본적으로 켜져 있는 동안 선택된 Compass 대화가 보관되어 평가, 개선, 미세 조정 및 학습에 사용될 수 있습니다. 향후 Compass 상호작용을 이러한 사용에서 제외하려면 일반 → 고급에서 끄세요. 로컬 모델 및 자체 API 요청은 이 제공업체의 “연구를 위해 쿼리 공유” 옵션을 켜 경우에만 WebBrain이 수집합니다. {privacyLink}. 더 많은 사용량이 필요하면 {subscribeLink}에서 구독하세요. 청구는 {accountLink}에서 관리하세요.", + "st.providers.webbrain_data_use.body": "WebBrain Compass에는 일일 무료 사용량이 포함됩니다. ‘WebBrain 개선에 참여’가 기본적으로 켜져 있는 동안 선택된 Compass 대화가 보관되어 평가, 개선, 미세 조정 및 학습에 사용될 수 있습니다. 향후 Compass 상호작용을 이러한 사용에서 제외하려면 설정 → 고급에서 끄세요. 로컬 모델 및 자체 API 요청은 이 제공업체의 “연구를 위해 쿼리 공유” 옵션을 켜 경우에만 WebBrain이 수집합니다. {privacyLink}. 더 많은 사용량이 필요하면 {subscribeLink}에서 구독하세요. 청구는 {accountLink}에서 관리하세요.", 'st.providers.share_research.label': "연구를 위해 쿼리 공유", 'st.providers.share_research.hint': "이 제공업체의 프롬프트와 응답을 사용된 제공업체 및 모델과 함께 평가 및 개선을 위해 WebBrain에 전송합니다. 이미지와 바이너리 첨부파일은 공유 전에 제거되고 텍스트는 잘립니다. 나머지 텍스트는 그대로 전송됩니다.", 'st.providers.share_research.confirm': "이 제공업체의 쿼리를 연구를 위해 WebBrain과 공유하시겠습니까?\n\n켜면 이 제공업체와의 프롬프트, 응답, 도구 상호작용이 제공업체 및 모델 이름과 함께 평가 및 개선을 위해 WebBrain에 전송됩니다. 텍스트는 이미지 제거 및 긴 내용 자르기 후 그대로 전송되므로 민감한 개인정보는 공유하지 마세요. 언제든지 꺼서 이후 공유를 중단할 수 있습니다.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "방해를 줄이고 싶으신가요? “항상 허용”은 이 사이트를 기억합니다. 아래 명령은 모든 사이트에서 WebBrain 권한 확인을 끕니다.", "sp.perm.insert_skip_command": "/dangerously-skip-permissions 입력", "sp.perm.skip_hint_draft": "초안은 변경되지 않았습니다. 명령을 입력하기 전에 비워 주세요.", - "ob.act.permissions_tip": "권한 확인은 기본적으로 켜져 있습니다. 고급 사용자는 /dangerously-skip-permissions로 모든 사이트의 확인을 끄고 설정 → 권한에서 다시 켤 수 있습니다.", + "ob.act.permissions_tip": "권한 확인은 기본적으로 켜져 있습니다. 고급 사용자는 /dangerously-skip-permissions로 모든 사이트의 확인을 끄고 마이크 옆의 ⚠ 버튼에서 다시 켤 수 있습니다.", 'st.provider.field.cache_read_cost_per_million': "캐시 읽기 예상 비용($ / 100만 토큰)", 'st.provider.field.cache_write_cost_per_million': "5분 캐시 쓰기 예상 비용($ / 100만 토큰)", 'st.provider.field.cache_write_1h_cost_per_million': "1시간 캐시 쓰기 예상 비용($ / 100만 토큰)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "암호화된 클라우드 사본을 이 기기의 현재 WebBrain 설정으로 바꾸시겠습니까?", "st.sync.consent.legacy": "암호화된 동기화를 사용하시겠습니까? WebBrain은 추억, 프로필 자동 완성 및 API 키 제공자 설정의 엔드 투 엔드 암호화 사본을 WebBrain Compass로 전송합니다. 채팅 기록과 OAuth 로그인은 동기화되지 않습니다.", "st.sync.consent.denied": "암호화된 동기화 권한이 부여되지 않았습니다.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/ms.js b/src/chrome/src/ui/locales/ms.js index 885377d293..43b6c12a64 100644 --- a/src/chrome/src/ui/locales/ms.js +++ b/src/chrome/src/ui/locales/ms.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Kecilkan UI sambungan', 'sp.ui_scale.increase': 'Besarkan UI sambungan', 'sp.ui_scale.reset': 'Tetapkan semula', - 'st.display.ui_scale.label': 'Zum UI sambungan', - 'st.display.ui_scale.decrease': 'Kecilkan UI sambungan', - 'st.display.ui_scale.increase': 'Besarkan UI sambungan', - 'st.display.ui_scale.reset': 'Tetapkan semula', - 'st.display.ui_scale.desc': 'Ubah saiz panel sisi dan tetingkap sembang berasingan tanpa mengubah zum halaman.', - 'st.display.ui_scale.shortcuts': 'Pintasan khusus: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Tidak ditetapkan', - 'st.display.ui_scale.manage_shortcuts': 'Sesuaikan pintasan', 'tool.delegate_research': 'Menyelidik dengan ChatGPT', 'st.display.research_escalation.label': 'Eskalasi penyelidikan', 'st.display.research_escalation.desc': 'Apabila diaktifkan, WebBrain mungkin meminta izin sebelum menghantar gesaan penyelidikan baca sahaja yang luar biasa kompleks kepada ChatGPT. Dimatikan secara lalai. Gesaan tepat hanya dikongsi selepas kelulusan jelas anda.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Jangan teruskan", "sp.recipient.reason_unrequested": "WebBrain tidak dapat memastikan daripada permintaan anda bahawa mesej perlu dihantar. Perbualan yang terbuka di {host} adalah dengan {recipient}.", "sp.recipient.reason_unnamed": "WebBrain tidak dapat memastikan daripada permintaan anda siapa yang patut menerima mesej ini. Perbualan yang terbuka di {host} adalah dengan {recipient}.", - 'st.tab.permissions': "Kebenaran", 'st.perms.revoke': "Batalkan", 'st.perms.clear_all': "Kosongkan semua kebenaran", 'st.perms.gate.label': "Tanya sebelum tindakan penting", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Mula', 'ob.btn.skip': 'Langkau buat masa ini', 'ob.btn.start': 'Mula', - 'ob.cloud.body': 'WebBrain Compass sedia dengan elaun mingguan percuma. Perbincangan Compass yang dipilih boleh disimpan dan digunakan untuk meningkatkan WebBrain semasa Bantu Tingkatkan WebBrain didayakan secara lalai. Anda boleh mematikannya di Tetapan → Umum.', + 'ob.cloud.body': 'WebBrain Compass sedia dengan elaun mingguan percuma. Perbincangan Compass yang dipilih boleh disimpan dan digunakan untuk meningkatkan WebBrain semasa Bantu Tingkatkan WebBrain didayakan secara lalai. Anda boleh mematikannya di Tetapan → Lanjutan.', 'ob.cloud.change': 'Tukar', 'ob.cloud.using': 'Menggunakan WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Keputusan', 'sp.api.enabled_html': '🔓 Pengubahan API diaktifkan untuk perbualan ini. Ejen kini boleh menggunakan POST/PUT/PATCH/DELETE melalui fetch_url dan execute_js apabila ia menilai API lebih boleh dipercayai berbanding UI untuk sesuatu langkah. UI tetap menjadi pilihan utama secara lalai. Bendera ini akan dikosongkan apabila anda menetapkan semula perbualan.', - 'sp.permissions.disabled_html': '⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun, merakam, dan menjadualkan kerja masa hadapan tanpa bertanya terlebih dahulu. Dayakan semula ini dari Tetapan → Kebenaran → Tanya sebelum tindakan penting.', + 'sp.permissions.disabled_html': '⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun, merakam, dan menjadualkan kerja masa hadapan tanpa bertanya terlebih dahulu. Dayakan semula ini dari butang ⚠ di sebelah mikrofon.', 'sp.permissions.button': 'Gesaan kebenaran: hidup', 'sp.permissions.button_off': 'Gesaan kebenaran: mati', 'sp.permissions.gate_desc': 'WebBrain bertanya kali pertama ia mengklik, menaip, memuat turun atau menjalankan kod di sesebuah tapak.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Menunggu "{selector}"', 'st.title': 'Tetapan WebBrain', - 'st.subtitle': 'Konfigurasi pembekal LLM dan keutamaan anda · v{version}', + 'st.subtitle': 'Konfigurasi cara WebBrain berfungsi · v{version}', 'st.tab.display': 'Umum', + 'st.tab.budgets': 'Bajet', + 'st.tab.advanced': 'Lanjutan', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Pertuturan', + 'st.tab.generative': 'Generatif', + 'st.tab.decision': 'Keputusan', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Pembekal WebBrain', + 'st.providers_page.subtitle': 'Pilih model yang digunakan WebBrain · v{version}', + 'st.permissions_page.title': 'Kebenaran WebBrain', + 'st.permissions_page.subtitle': 'Tapak tempat WebBrain boleh bertindak tanpa bertanya dahulu', 'st.tab.providers': 'Pembekal', 'st.tab.vision': 'Penglihatan', 'st.tab.profile': 'Profil', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Kemas kini kaedah pembayaran", 'st.account.manage_billing': 'Urus pengebilan', - 'st.display.language.label': 'Bahasa', - 'st.display.language.desc': 'Bahasa antara muka untuk pemalam WebBrain.', 'st.display.verbose.label': 'Mod terperinci', 'st.display.verbose.desc': 'Tunjukkan butiran penuh panggilan alat, argumen, dan hasil JSON mentah. Dimatikan secara lalai untuk pengalaman sembang yang lebih bersih.', 'st.display.selection_shortcut.label': 'Pintasan pilihan', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Tangkapan skrin auto', "st.display.auto_screenshot.desc": "Tangkap tangkapan skrin viewport secara automatik selepas ejen bertindak pada halaman supaya laluan penglihatan yang dipilih dapat melihat perubahan. Ini menggunakan lebih banyak token. Jika penglihatan tidak tersedia, pengayaan dilangkau dan tugas diteruskan dengan notis status.", 'st.display.auto_screenshot.off': 'Mati', - 'st.display.auto_screenshot.navigation': 'Apabila navigasi', - 'st.display.auto_screenshot.state_change': 'Apabila keadaan berubah (lalai)', + 'st.display.auto_screenshot.navigation': 'Apabila navigasi (lalai)', + 'st.display.auto_screenshot.state_change': 'Apabila keadaan berubah', 'st.display.auto_screenshot.every_step': 'Setiap langkah', 'st.display.tracing.label': 'Rakam jejak (untuk perbandingan model)', - 'st.display.tracing.desc_html': 'Simpan setiap larian (permintaan LLM, respons, panggilan alat, tangkapan skrin) ke dalam IndexedDB tempatan supaya anda boleh memeriksa dan membandingkan model secara bersebelahan. Dibuka dalam tab Jejak yang berasingan. Dimatikan secara lalai kerana ia menambah penulisan cakera pada setiap langkah. Buka halaman Jejak →', - 'st.display.lossless_tracing.label': 'Rekod butiran penuh permintaan (peringkat debug)', - 'st.display.lossless_tracing.desc_html': 'Juga menyimpan prompt, mesej, dan skema alatan penuh bagi setiap permintaan LLM dan bukannya ringkasan tanpa kandungan, serta mengekalkan sehingga 200 KB bagi setiap hasil alatan. Membolehkan penyahpepijatan mendalam dan pembinaan semula permintaan. Dimatikan secara lalai kerana menulis kandungan perbualan anda secara setempat dan menggunakan lebih banyak cakera. Memerlukan rakaman jejak dihidupkan.', + 'st.display.tracing.desc_html': 'Simpan setiap larian (permintaan LLM, respons, panggilan alat, tangkapan skrin) ke dalam IndexedDB tempatan supaya anda boleh memeriksa dan membandingkan model secara bersebelahan, termasuk prompt, mesej dan skema alatan penuh bagi setiap permintaan LLM serta sehingga 200 KB bagi setiap hasil alatan. Dibuka dalam tab Jejak yang berasingan. Dimatikan secara lalai kerana menulis kandungan perbualan anda secara setempat dan menggunakan lebih banyak cakera. Buka halaman Jejak →', 'st.display.allow_local_network.label': 'Benarkan ejen mengakses rangkaian tempatan', 'st.display.allow_local_network.desc': 'Membenarkan alat fetch_url ejen mencapai loopback (127.0.0.1, localhost) dan alamat peribadi/RFC1918 (10.x, 192.168.x, 172.16–31.x). Berguna untuk pelayan pembangunan tempatan, alat intranet, atau API yang dihos sendiri. Dimatikan secara lalai. Apabila dimatikan, URL yang menggunakan IP peribadi atau loopback secara langsung dan nama localhost disekat. Resolusi DNS tidak diperiksa, jadi nama hos lain masih boleh mencapai alamat tempatan. IP literal metadata awan (169.254.169.254) dan nama metadata yang disenaraikan atau *.internal/*.local kekal disekat walaupun dihidupkan.', 'st.display.notify_sound.label': "Bunyi pemberitahuan", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Mod penglihatan didayakan untuk pembekal aktif.", "sp.vision.off": "Mod penglihatan dinyahaktifkan untuk pembekal aktif.", "sp.vision.error": "Togol penglihatan gagal: {msg}", - "st.tab.multimodal": "Model Bantuan", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Disyorkan. Apabila dihidupkan, WebBrain meminta kebenaran kali pertama ia mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun atau merakam pada sesuatu laman (kemudian mengingati pilihan anda). Matikan untuk penggunaan pantas tanpa gesaan pada laman yang anda percayai sepenuhnya.", "st.perms.gate.warning": "⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun dan merakam pada mana-mana laman TANPA bertanya — termasuk pada halaman yang kandungannya mungkin dikawal oleh penyerang. Kandungan halaman masih dianggap tidak dipercayai secara dalaman, tetapi tiada apa-apa akan menghalang arahan yang disuntik daripada mencetuskan tindakan. Biarkan ini dimatikan hanya jika anda mempercayai sepenuhnya setiap laman tempat anda menggunakan pembantu ini.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Lalai sistem", "st.display.download_directory.error": "Gunakan folder relatif seperti WebBrain atau Work/WebBrain. Laluan mutlak dan “..” tidak dibenarkan.", "st.display.strict_secret.label": "Pengendalian rahsia ketat", - "st.display.strict_secret.desc": "Enggan memetik kelayakan (kata laluan, kunci API, token, OTP) dalam ringkasan atau teks pembantu — walaupun apabila anda secara jelas memintanya. Berguna jika anda kerap berkongsi fail jejak atau berkongsi skrin. Dimatikan secara lalai supaya ejen boleh mengulangi nilai tepat yang anda minta apabila anda memerlukannya. Hidupkannya (Tetapan → Keselamatan) apabila anda mahu ringkasan `done` kekal kemas dan kelayakan tidak pernah diulangi.", + "st.display.strict_secret.desc": "Enggan memetik kelayakan (kata laluan, kunci API, token, OTP) dalam ringkasan atau teks pembantu — walaupun apabila anda secara jelas memintanya. Berguna jika anda kerap berkongsi fail jejak atau berkongsi skrin. Dimatikan secara lalai supaya ejen boleh mengulangi nilai tepat yang anda minta apabila anda memerlukannya. Hidupkannya apabila anda mahu ringkasan `done` kekal kemas dan kelayakan tidak pernah diulangi.", "st.display.request_timeout.label": "Tamat masa permintaan LLM", "st.display.request_timeout.desc": "Masa menunggu maksimum untuk pengepala respons dan setiap jeda antara bahagian respons penstriman. Lalai: 120 saat. Tambahkan masa ini untuk model tempatan yang perlahan, terutamanya pada CPU atau dengan konteks besar.", "st.providers.filter.all": "Semua", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Mesej dimasukkan ke giliran semasa WebBrain sibuk. Hanya /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, dan /verbose boleh berjalan serta-merta sebagai arahan slash.', 'tool.go_back': 'Kembali', 'tool.go_forward': 'Maju', - 'st.display.search.placeholder': 'Cari tetapan Umum', - 'st.display.search.empty': 'Tiada tetapan Umum yang sepadan.', + 'st.display.search.placeholder': 'Cari tetapan', + 'st.display.search.empty': 'Tiada tetapan yang sepadan.', 'st.display.advanced': 'Lanjutan', ...getApocalypseModeCopy('ms'), ...getEmergencyBoxCopy('ms'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Tiada memori yang disimpan dengan ID tersebut.", "st.memory.security_html": "Privasi: memori pengguna disimpan sebagai teks biasa dalam profil pelayar ini. Apabila diaktifkan, rekod memori aktif dihantar kepada pembekal LLM yang anda konfigurasikan sebagai sebahagian daripada system prompt. Jangan simpan kata laluan, kunci API, token, kod pemulihan atau rahsia sensitif di sini.", "hist.filter.clear": "Kosongkan penapis dan tunjukkan semua perbualan", - "st.redaction.heading": "Penyamaran tangkapan skrin", "st.redaction.toggle.label": "Samarkan kandungan sensitif dalam tangkapan skrin", "st.redaction.toggle.desc": "Sebelum tangkapan skrin dihantar ke model visi, medan borang dan teks yang kelihatan seperti e-mel atau nombor telefon akan dikaburkan. Pengesanan berjalan sepenuhnya pada peranti anda — tiada apa-apa tambahan dihantar.", "st.redaction.warning": "⚠️ Ini bersifat usaha terbaik (best-effort) dan fail-open: jika penyamaran tidak dapat berjalan pada sesuatu halaman (contohnya sejurus selepas navigasi, dalam pemapar PDF, atau pada halaman pelayar yang dihadkan), tangkapan skrin tetap dihantar tanpa disamarkan. Pengesanan hanya menggunakan heuristik DOM — teks yang dilukis pada canvas, maklumat peribadi dalam imej, atau apa-apa yang tidak dikenali sebagai medan borang atau teks e-mel/telefon mungkin terlepas, dan teks halaman yang dihantar kepada model tidak disamarkan oleh tetapan ini. Ini BUKAN jaminan keselamatan. Untuk privasi sepenuhnya, gunakan model tempatan/luar talian (llama.cpp, Ollama): tangkapan skrin tidak akan meninggalkan peranti anda dan penyamaran menjadi tidak diperlukan.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Eksport seluruh sesi jejak tersimpan sebagai JSON, termasuk tangkapan skrin", "sp.export_traces.recording_truncated": "Semua rekod tersimpan telah dieksport sebagai JSON. Kandungan yang ditinggalkan semasa rakaman tidak dapat dipulihkan melalui eksport.", "sp.slash.export_traces": "Eksport rantaian alat (jejak)", - "sp.export_traces.none": "Tiada jejak untuk perbualan ini. Hidupkan Rakam jejak dalam Tetapan, kemudian jalankan semula.", + "sp.export_traces.none": "Tiada jejak untuk perbualan ini. Hidupkan Rakam jejak dalam Tetapan → Lanjutan, kemudian jalankan semula.", "sp.export_traces.error": "Tidak dapat mengeksport jejak.", "sp.export_traces.done": "Rantaian alat dieksport.", "sp.export_traces.no_conversation": "Tiada lagi yang dieksport — mulakan perbualan dahulu.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Gunakan WebBrain sebagai halaman tab baharu", "st.display.newtab.desc": "Tab baharu membuka halaman WebBrain dengan kotak untuk Tanya, Bertindak atau Cari. Matikan untuk mengekalkan halaman tab baharu biasa pelayar anda; anda boleh menukarnya pada bila-bila masa di Tetapan → Umum.", "st.display.help_improve.desc_html": "Benarkan interaksi WebBrain Compass terpilih disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Dihidupkan secara lalai. Matikan untuk menghalang interaksi Compass pada masa hadapan daripada digunakan bagi tujuan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri daripada penyedia yang anda hidupkan “Kongsi pertanyaan untuk penyelidikan”. Dasar privasi →", - "st.providers.webbrain_data_use.body": "Penggunaan harian percuma WebBrain Compass disertakan. Semasa Bantu Tingkatkan WebBrain dihidupkan secara lalai, perbualan Compass terpilih mungkin disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Matikan di Umum → Lanjutan untuk mengecualikan interaksi Compass pada masa hadapan daripada penggunaan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri jika anda menghidupkan opsyen “Kongsi pertanyaan untuk penyelidikan” penyedia ini. {privacyLink}. Untuk penggunaan tambahan, langgan di {subscribeLink}. Urus pengebilan di {accountLink}.", + "st.providers.webbrain_data_use.body": "Penggunaan harian percuma WebBrain Compass disertakan. Semasa Bantu Tingkatkan WebBrain dihidupkan secara lalai, perbualan Compass terpilih mungkin disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Matikan di Tetapan → Lanjutan untuk mengecualikan interaksi Compass pada masa hadapan daripada penggunaan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri jika anda menghidupkan opsyen “Kongsi pertanyaan untuk penyelidikan” penyedia ini. {privacyLink}. Untuk penggunaan tambahan, langgan di {subscribeLink}. Urus pengebilan di {accountLink}.", 'st.providers.share_research.label': "Kongsi pertanyaan untuk penyelidikan", 'st.providers.share_research.hint': "Menghantar gesaan dan respons daripada penyedia ini kepada WebBrain untuk penilaian dan penambahbaikan, termasuk penyedia dan model yang digunakan. Imej dan lampiran binari dibuang dan teks dipangkas sebelum dikongsi; baki teks dihantar seadanya.", 'st.providers.share_research.confirm': "Kongsi pertanyaan daripada penyedia ini dengan WebBrain untuk penyelidikan?\n\nJika dihidupkan, gesaan, respons dan interaksi alat anda dengan penyedia ini akan dihantar kepada WebBrain untuk penilaian dan penambahbaikan, berserta nama penyedia dan model. Teks dihantar seadanya selepas imej dibuang dan kandungan panjang dipangkas, jadi elakkan berkongsi data peribadi yang sensitif. Anda boleh mematikannya pada bila-bila masa untuk menghentikan perkongsian.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Mahukan lebih sedikit gangguan? “Sentiasa benarkan” mengingati laman ini. Perintah di bawah mematikan permintaan izin WebBrain di semua laman.", "sp.perm.insert_skip_command": "Sisipkan /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Draf anda tidak berubah. Kosongkannya sebelum menyisipkan perintah.", - "ob.act.permissions_tip": "Permintaan izin dihidupkan secara lalai. Pengguna lanjutan boleh mematikannya secara global dengan /dangerously-skip-permissions dan menghidupkannya semula di Tetapan → Izin.", + "ob.act.permissions_tip": "Permintaan izin dihidupkan secara lalai. Pengguna lanjutan boleh mematikannya secara global dengan /dangerously-skip-permissions dan menghidupkannya semula dari butang ⚠ di sebelah mikrofon.", 'st.provider.field.cache_read_cost_per_million': "Anggaran kos bacaan cache ($ / 1 juta token)", 'st.provider.field.cache_write_cost_per_million': "Anggaran kos tulis cache 5 minit ($ / 1 juta token)", 'st.provider.field.cache_write_1h_cost_per_million': "Anggaran kos tulis cache 1 jam ($ / 1 juta token)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Gantikan salinan awan yang disulitkan dengan persediaan WebBrain semasa peranti ini?", "st.sync.consent.legacy": "Hidupkan penyegerakan yang disulitkan? WebBrain akan menghantar salinan memori anda yang disulitkan hujung ke hujung, autolengkap profil dan tetapan pembekal kunci API ke WebBrain Compass. Sejarah sembang dan log masuk OAuth tidak disegerakkan.", "st.sync.consent.denied": "Kebenaran penyegerakan yang disulitkan tidak diberikan.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/nl.js b/src/chrome/src/ui/locales/nl.js index 45232af5c5..34acf90a82 100644 --- a/src/chrome/src/ui/locales/nl.js +++ b/src/chrome/src/ui/locales/nl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Extensie-interface uitzoomen', 'sp.ui_scale.increase': 'Extensie-interface inzoomen', 'sp.ui_scale.reset': 'Resetten', - 'st.display.ui_scale.label': 'Zoom van extensie-interface', - 'st.display.ui_scale.decrease': 'Extensie-interface uitzoomen', - 'st.display.ui_scale.increase': 'Extensie-interface inzoomen', - 'st.display.ui_scale.reset': 'Resetten', - 'st.display.ui_scale.desc': 'Pas het formaat van het zijpaneel en het losse chatvenster aan zonder de paginazoom te wijzigen.', - 'st.display.ui_scale.shortcuts': 'Speciale sneltoetsen: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Niet toegewezen', - 'st.display.ui_scale.manage_shortcuts': 'Sneltoetsen aanpassen', 'tool.delegate_research': 'Onderzoeken met ChatGPT', 'st.display.research_escalation.label': 'Onderzoeksescalatie', 'st.display.research_escalation.desc': 'Indien ingeschakeld kan WebBrain toestemming vragen voordat een ongewoon complexe alleen-lezen onderzoeksprompt naar ChatGPT wordt gestuurd. Standaard uitgeschakeld. De exacte prompt wordt alleen gedeeld na uw uitdrukkelijke goedkeuring.', @@ -667,21 +659,30 @@ export default { 'ob.btn.done': 'Aan de slag', 'ob.btn.skip': 'Nu overslaan', 'ob.btn.start': 'Starten', - 'ob.cloud.body': 'WebBrain Compass is klaar met een gratis wekelijkse toewijzing. Geselecteerde Compass-gesprekken kunnen worden bewaard en gebruikt om WebBrain te verbeteren terwijl Help WebBrain verbeteren standaard is ingeschakeld. U kunt dit uitschakelen in Instellingen → Algemeen.', + 'ob.cloud.body': 'WebBrain Compass is klaar met een gratis wekelijkse toewijzing. Geselecteerde Compass-gesprekken kunnen worden bewaard en gebruikt om WebBrain te verbeteren terwijl Help WebBrain verbeteren standaard is ingeschakeld. U kunt dit uitschakelen in Instellingen → Geavanceerd.', 'ob.cloud.change': 'Wijzigen', 'ob.cloud.using': 'WebBrain Compass gebruiken.', 'st.title': 'WebBrain Instellingen', - 'st.subtitle': 'Configureer uw LLM-providers en voorkeuren · v{version}', + 'st.subtitle': 'Configureer hoe WebBrain werkt · v{version}', 'st.tab.display': 'Algemeen', + 'st.tab.budgets': 'Budgetten', + 'st.tab.advanced': 'Geavanceerd', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Spraak', + 'st.tab.generative': 'Generatief', + 'st.tab.decision': 'Beslissing', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain-providers', + 'st.providers_page.subtitle': 'Kies de modellen die WebBrain gebruikt · v{version}', + 'st.permissions_page.title': 'WebBrain-machtigingen', + 'st.permissions_page.subtitle': 'Sites waar WebBrain zonder eerst te vragen mag handelen', 'st.tab.providers': 'Providers', 'st.tab.skills': 'Vaardigheden', 'st.tab.vision': 'Visie', - 'st.tab.multimodal': "Ondersteunende modellen", 'st.tab.memory': 'Geheugen', 'st.tab.profile': 'Profiel', 'st.tab.account': 'Account', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Machtigingen', 'st.perms.gate.label': 'Vragen voor gevolghebbende acties', 'st.perms.gate.desc': 'Aanbevolen. Wanneer ingeschakeld, vraagt WebBrain om toestemming de eerste keer dat...', 'st.perms.gate.warning': '⚠️ Machtigingsvragen zijn UIT...', @@ -700,8 +701,6 @@ export default { "st.account.payment_failed": "Je abonnementsbetaling kon niet worden voltooid. Werk je betaalmethode bij om je betaalde abonnement te herstellen.", "st.account.update_payment": "Betaalmethode bijwerken", 'st.account.manage_billing': 'Facturering beheren', - 'st.display.language.label': 'Taal', - 'st.display.language.desc': 'Interfacetaal voor de WebBrain-plug-in.', 'st.display.theme.label': 'Weergave', 'st.display.theme.desc': 'Licht, donker of volg uw OS-instelling.', 'st.display.theme.system': 'Systeem', @@ -711,8 +710,8 @@ export default { 'st.display.download_directory.desc': 'Optionele submap binnen uw browser- of systeemdownloadmap...', 'st.display.download_directory.placeholder': 'Standaard', 'st.display.download_directory.error': 'Gebruik een relatieve map zoals WebBrain of Work/WebBrain...', - 'st.display.search.placeholder': 'Zoek in Algemene instellingen', - 'st.display.search.empty': 'Geen algemene instellingen gevonden.', + 'st.display.search.placeholder': 'Zoek in instellingen', + 'st.display.search.empty': 'Geen instellingen gevonden.', 'st.display.advanced': 'Geavanceerd', ...getApocalypseModeCopy('nl'), ...getEmergencyBoxCopy('nl'), @@ -770,20 +769,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatische schermafbeelding', "st.display.auto_screenshot.desc": "Maak automatisch een schermafbeelding van de viewport nadat de agent op de pagina heeft gehandeld, zodat de gekozen visieroute de wijziging kan zien. Dit kost meer tokens. Als visie niet beschikbaar is, wordt de verrijking overgeslagen en gaat de taak verder met een statusmelding.", 'st.display.auto_screenshot.off': 'Uit', - 'st.display.auto_screenshot.navigation': 'Bij navigatie', - 'st.display.auto_screenshot.state_change': 'Bij statustwijziging (standaard)', + 'st.display.auto_screenshot.navigation': 'Bij navigatie (standaard)', + 'st.display.auto_screenshot.state_change': 'Bij statustwijziging', 'st.display.auto_screenshot.every_step': 'Elke stap', 'st.display.tracing.label': 'Traces opslaan (voor modelvergelijking)', - 'st.display.tracing.desc_html': 'Sla elke uitvoering op in lokale IndexedDB... Traces openen →', - 'st.display.lossless_tracing.label': 'Volledige verzoekdetails opnemen (debuglaag)', - 'st.display.lossless_tracing.desc_html': 'Bewaart ook de volledige prompts, berichten en tool-schema\'s van elk LLM-verzoek in plaats van inhoudsloze samenvattingen, en houdt tot 200 KB van elk toolresultaat. Maakt diepgaand debuggen en reconstructie van verzoeken mogelijk. Standaard uit omdat het de inhoud van uw gesprek lokaal opslaat en veel meer schijfruimte gebruikt. Vereist dat tracerecordering aan staat.', + 'st.display.tracing.desc_html': "Slaat elke uitvoering (LLM-verzoeken, antwoorden, tool-aanroepen, screenshots) op in lokale IndexedDB, zodat u modellen naast elkaar kunt inspecteren en vergelijken, inclusief de volledige prompts, berichten en tool-schema's van elk LLM-verzoek en tot 200 KB van elk toolresultaat. Opent in een apart Traces-tabblad. Standaard uit omdat het de inhoud van uw gesprek lokaal opslaat en veel meer schijfruimte gebruikt. Traces openen →", 'st.display.cost_session_limit.label': 'Cloudkostensessietegoed', 'st.display.cost_session_limit.desc': 'Stopt cloud- en OpenRouter-uitvoeringen voordat nog een betaald modelaanroep plaatsvindt...', 'st.display.cost_total_limit.label': 'Cloudkostentotaaltegoed', 'st.display.cost_total_limit.desc': 'Volgt gerapporteerde of geschatte cloud-/OpenRouter-modeluitgaven...', 'st.display.cost_reset': 'Uitgaven resetten', 'st.display.strict_secret.label': 'Strikte geheimhouding', - 'st.display.strict_secret.desc': 'Weiger om inloggegevens (wachtwoorden, API-sleutels, tokens, OTP\'s) te citeren in samenvattingen of assistenttekst — zelfs wanneer je er expliciet om vraagt. Handig als je regelmatig tracebestanden deelt of het scherm deelt. Standaard uit, zodat de agent de exacte waarde kan herhalen die je opvraagt wanneer je die nodig hebt. Schakel het in (Instellingen → Beveiliging) wanneer je wilt dat `done`-samenvattingen netjes blijven en inloggegevens nooit worden herhaald.', + 'st.display.strict_secret.desc': "Weiger om inloggegevens (wachtwoorden, API-sleutels, tokens, OTP's) te citeren in samenvattingen of assistenttekst — zelfs wanneer je er expliciet om vraagt. Handig als je regelmatig tracebestanden deelt of het scherm deelt. Standaard uit, zodat de agent de exacte waarde kan herhalen die je opvraagt wanneer je die nodig hebt. Schakel het in wanneer je wilt dat `done`-samenvattingen netjes blijven en inloggegevens nooit worden herhaald.", 'st.display.allow_local_network.label': 'Sta agent toe om lokaal netwerk te bereiken', 'st.display.allow_local_network.desc': 'Staat het fetch_url-gereedschap van de agent toe om loopback- en privé-/RFC1918-adressen te bereiken...', 'st.display.scheduled_tasks.label': 'Geplande taken', @@ -962,7 +959,6 @@ export default { 'st.imageBudget.maxDimension.label': 'Max afbeeldingsdimensie', 'st.imageBudget.maxDimension.desc': 'Grootste zijde (breedte of hoogte) in pixels...', 'st.imageBudget.warning': '⚠️ Deze instellingen gelden voor schermafbeeldingen vastgelegd voor visie...', - 'st.redaction.heading': 'Schermafbeeldingreductie', 'st.redaction.toggle.label': 'Gevoelige inhoud onleesbaar maken op schermafbeeldingen', 'st.redaction.toggle.desc': 'Voordat een schermafbeelding naar een viemodel wordt verzonden, maak formuliervelden onleesbaar...', 'st.redaction.warning': '⚠️ Op basis van inschatting en faalt open...', @@ -1182,7 +1178,7 @@ export default { 'st.providers.compat.value.max': 'Max', 'st.providers.compat.value.system': 'Systeem', 'st.providers.compat.value.developer': 'Ontwikkelaar', - 'st.providers.webbrain_data_use.body': 'Gratis wekelijks WebBrain Compass-gebruik is inbegrepen. Zolang „Help WebBrain verbeteren“ standaard is ingeschakeld, kunnen geselecteerde Compass-gesprekken worden bewaard en gebruikt voor evaluatie, verbetering, fine-tuning en training. Schakel dit uit onder Algemeen → Geavanceerd om toekomstige Compass-interacties van dit gebruik uit te sluiten. Verzoeken aan lokale modellen en je eigen API worden door WebBrain alleen verzameld wanneer je de provideroptie “Query’s delen voor onderzoek” inschakelt. {privacyLink}. Abonneer u voor meer gebruik via {subscribeLink}. Beheer facturering via {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Gratis wekelijks WebBrain Compass-gebruik is inbegrepen. Zolang „Help WebBrain verbeteren“ standaard is ingeschakeld, kunnen geselecteerde Compass-gesprekken worden bewaard en gebruikt voor evaluatie, verbetering, fine-tuning en training. Schakel dit uit onder Instellingen → Geavanceerd om toekomstige Compass-interacties van dit gebruik uit te sluiten. Verzoeken aan lokale modellen en je eigen API worden door WebBrain alleen verzameld wanneer je de provideroptie “Query’s delen voor onderzoek” inschakelt. {privacyLink}. Abonneer u voor meer gebruik via {subscribeLink}. Beheer facturering via {accountLink}.', 'st.providers.share_research.label': "Query’s delen voor onderzoek", 'st.providers.share_research.hint': "Verzendt prompts en antwoorden van deze provider naar WebBrain voor evaluatie en verbetering, inclusief de gebruikte provider en het model. Afbeeldingen en binaire bijlagen worden verwijderd en tekst wordt ingekort vóór het delen; de resterende tekst wordt ongewijzigd verzonden.", 'st.providers.share_research.confirm': "Query’s van deze provider delen met WebBrain voor onderzoek?\n\nIndien ingeschakeld worden je prompts, antwoorden en toolinteracties met deze provider samen met de provider- en modelnaam naar WebBrain verzonden voor evaluatie en verbetering. Tekst wordt ongewijzigd verzonden na het verwijderen van afbeeldingen en het inkorten van lange inhoud; deel dus geen gevoelige persoonsgegevens. Je kunt dit op elk moment uitschakelen om verder delen te stoppen.", @@ -1273,8 +1269,8 @@ export default { "st.sync.confirm.reset": "De gecodeerde cloudkopie vervangen door de huidige WebBrain-installatie van dit apparaat?", "st.sync.consent.legacy": "Versleutelde synchronisatie inschakelen? WebBrain verzendt een end-to-end gecodeerde kopie van uw herinneringen, automatisch aanvullen van profielen en API-sleutelproviderinstellingen naar WebBrain Compass. Chatgeschiedenis en OAuth-aanmeldingen worden niet gesynchroniseerd.", "st.sync.consent.denied": "Er is geen versleutelde synchronisatietoestemming verleend.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/pl.js b/src/chrome/src/ui/locales/pl.js index e158063bc8..f49cab655a 100644 --- a/src/chrome/src/ui/locales/pl.js +++ b/src/chrome/src/ui/locales/pl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Pomniejsz interfejs rozszerzenia', 'sp.ui_scale.increase': 'Powiększ interfejs rozszerzenia', 'sp.ui_scale.reset': 'Resetuj', - 'st.display.ui_scale.label': 'Powiększenie interfejsu rozszerzenia', - 'st.display.ui_scale.decrease': 'Pomniejsz interfejs rozszerzenia', - 'st.display.ui_scale.increase': 'Powiększ interfejs rozszerzenia', - 'st.display.ui_scale.reset': 'Resetuj', - 'st.display.ui_scale.desc': 'Zmień rozmiar panelu bocznego i osobnego okna czatu bez zmieniania powiększenia strony.', - 'st.display.ui_scale.shortcuts': 'Dedykowane skróty: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Nie przypisano', - 'st.display.ui_scale.manage_shortcuts': 'Dostosuj skróty', 'tool.delegate_research': 'Badanie z ChatGPT', 'st.display.research_escalation.label': 'Eskalacja badań', 'st.display.research_escalation.desc': 'Po włączeniu WebBrain może poprosić o zgodę przed wysłaniem do ChatGPT wyjątkowo złożonego polecenia badawczego tylko do odczytu. Domyślnie wyłączone. Dokładne polecenie jest udostępniane wyłącznie po wyraźnej zgodzie użytkownika.', @@ -384,7 +376,7 @@ export default { 'sp.step.input_label': 'Wejście', 'sp.step.result_label': 'Wynik', 'sp.api.enabled_html': '🔓 Modyfikacje API włączone dla tej rozmowy. Agent może teraz używać POST/PUT/PATCH/DELETE przez fetch_url i execute_js, gdy uzna API za bardziej niezawodne niż interfejs dla danego kroku. Domyślnie nadal preferowany jest interfejs. Ta flaga jest czyszczona po zresetowaniu rozmowy.', - 'sp.permissions.disabled_html': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania bez pytania. Włącz ponownie w Ustawienia → Uprawnienia → Pytaj przed istotnymi działaniami.', + 'sp.permissions.disabled_html': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania bez pytania. Włącz ponownie przyciskiem ⚠ obok mikrofonu.', 'sp.permissions.button': 'Pytania o uprawnienia: włączone', 'sp.permissions.button_off': 'Pytania o uprawnienia: wyłączone', 'sp.permissions.gate_desc': 'WebBrain pyta za pierwszym razem, gdy klika, pisze, pobiera pliki lub uruchamia kod na stronie.', @@ -530,19 +522,28 @@ export default { 'ob.btn.done': 'Rozpocznij', 'ob.btn.skip': 'Pomiń na razie', 'ob.btn.start': 'Rozpocznij', - 'ob.cloud.body': 'WebBrain Compass gotowy z tygodniowym darmowym kontyngentem. Niektóre rozmowy Compass mogą być zachowywane i wykorzystywane do ulepszania WebBrain, podczas gdy Pomóż ulepszyć WebBrain jest domyślnie włączony. Możesz go wyłączyć w Ustawienia → Ogólne.', + 'ob.cloud.body': 'WebBrain Compass gotowy z tygodniowym darmowym kontyngentem. Niektóre rozmowy Compass mogą być zachowywane i wykorzystywane do ulepszania WebBrain, podczas gdy Pomóż ulepszyć WebBrain jest domyślnie włączony. Możesz go wyłączyć w Ustawienia → Zaawansowane.', 'ob.cloud.change': 'Zmień', 'ob.cloud.using': 'Korzystanie z WebBrain Compass.', 'st.title': 'Ustawienia WebBrain', - 'st.subtitle': 'Skonfiguruj dostawców LLM i preferencje · v{version}', + 'st.subtitle': 'Skonfiguruj działanie WebBrain · v{version}', 'st.tab.display': 'Ogólne', + 'st.tab.budgets': 'Budżety', + 'st.tab.advanced': 'Zaawansowane', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Mowa', + 'st.tab.generative': 'Generatywne', + 'st.tab.decision': 'Decyzje', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Dostawcy WebBrain', + 'st.providers_page.subtitle': 'Wybierz modele, których używa WebBrain · v{version}', + 'st.permissions_page.title': 'Uprawnienia WebBrain', + 'st.permissions_page.subtitle': 'Witryny, w których WebBrain może działać bez pytania', 'st.tab.providers': 'Dostawcy', 'st.tab.vision': 'Wizja', - 'st.tab.multimodal': "Modele pomocnicze", 'st.tab.profile': 'Profil', 'st.tab.account': 'Konto', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Uprawnienia', 'st.perms.gate.label': 'Pytaj przed istotnymi działaniami', 'st.perms.gate.desc': 'Zalecane. Po włączeniu WebBrain pyta o pozwolenie przy pierwszym kliknięciu, pisaniu, nawigacji, uruchomieniu JavaScriptu, przesyłaniu, pobieraniu, nagrywaniu lub planowaniu przyszłych działań na stronie (a następnie zapamiętuje Twój wybór). Wyłącz, aby szybko korzystać bez pytań na stronach, którym w pełni ufasz.', 'st.perms.gate.warning': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania na każdej stronie BEZ pytania — w tym na stronach, których treść może być kontrolowana przez atakującego. Treść strony jest nadal wewnętrznie traktowana jako niezaufana, ale nic nie powstrzyma wstrzykniętego polecenia przed wywołaniem działania. Zostaw to wyłączone tylko, jeśli w pełni ufasz każdej stronie, na której używasz asystenta.', @@ -561,8 +562,6 @@ export default { "st.account.payment_failed": "Nie udało się zrealizować płatności za subskrypcję. Zaktualizuj metodę płatności, aby przywrócić płatny plan.", "st.account.update_payment": "Zaktualizuj metodę płatności", 'st.account.manage_billing': 'Zarządzaj rozliczeniami', - 'st.display.language.label': 'Język', - 'st.display.language.desc': 'Język interfejsu wtyczki WebBrain.', 'st.display.theme.label': 'Wygląd', 'st.display.theme.desc': 'Jasny, ciemny lub zgodny z ustawieniem systemu.', 'st.display.theme.system': 'Systemowy', @@ -585,20 +584,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatyczny zrzut ekranu', "st.display.auto_screenshot.desc": "Automatycznie przechwytuj zrzut widocznego obszaru po działaniu agenta na stronie, aby wybrana trasa wizyjna mogła zobaczyć zmianę. Zużywa to więcej tokenów. Jeśli wizja jest niedostępna, wzbogacanie jest pomijane, a zadanie jest kontynuowane z komunikatem o stanie.", 'st.display.auto_screenshot.off': 'Wyłączone', - 'st.display.auto_screenshot.navigation': 'Przy nawigacji', - 'st.display.auto_screenshot.state_change': 'Przy zmianie stanu (domyślnie)', + 'st.display.auto_screenshot.navigation': 'Przy nawigacji (domyślnie)', + 'st.display.auto_screenshot.state_change': 'Przy zmianie stanu', 'st.display.auto_screenshot.every_step': 'Przy każdym kroku', 'st.display.tracing.label': 'Rejestruj ślady (do porównywania modeli)', - 'st.display.tracing.desc_html': 'Zapisuj każde wykonanie (żądania LLM, odpowiedzi, wywołania narzędzi, zrzuty ekranu) w lokalnej bazie IndexedDB, aby móc je analizować i porównywać modele obok siebie. Otwiera się w osobnej karcie Ślady. Domyślnie wyłączone, ponieważ dodaje zapisy na dysk przy każdym kroku. Otwórz stronę Ślady →', - 'st.display.lossless_tracing.label': 'Zapisuj pełne szczegóły żądań (poziom debugowania)', - 'st.display.lossless_tracing.desc_html': 'Zapisuje również pełne prompty, wiadomości i schematy narzędzi każdego żądania LLM zamiast podsumowań bez treści oraz przechowuje do 200 KB każdego wyniku narzędzia. Umożliwia głębokie debugowanie i rekonstrukcję żądań. Wyłączone domyślnie, ponieważ zapisuje treść rozmowy lokalnie i zużywa znacznie więcej miejsca. Wymaga włączonego zapisu śladów.', + 'st.display.tracing.desc_html': 'Zapisuj każde wykonanie (żądania LLM, odpowiedzi, wywołania narzędzi, zrzuty ekranu) w lokalnej bazie IndexedDB, aby móc analizować i porównywać modele obok siebie, wraz z pełnymi promptami, wiadomościami i schematami narzędzi każdego żądania LLM oraz do 200 KB każdego wyniku narzędzia. Otwiera się w osobnej karcie Ślady. Domyślnie wyłączone, ponieważ zapisuje treść rozmowy lokalnie i zużywa znacznie więcej miejsca. Otwórz stronę Ślady →', 'st.display.cost_session_limit.label': 'Limit kosztów chmury na sesję', 'st.display.cost_session_limit.desc': 'Zatrzymuje wykonania w chmurze i OpenRouter przed kolejnym płatnym wywołaniem modelu, gdy ta sesja osiągnie zgłoszony lub szacowany limit kosztów. Domyślnie 10 USD.', 'st.display.cost_total_limit.label': 'Całkowity limit kosztów chmury', 'st.display.cost_total_limit.desc': 'Śledzi zgłoszone lub szacowane wydatki na modele chmury/OpenRouter w całym rozszerzeniu i zatrzymuje dalsze płatne wywołania po osiągnięciu limitu. Dostawcy lokalni nie są liczeni.', 'st.display.cost_reset': 'Zresetuj wydatki', 'st.display.strict_secret.label': 'Ścisłe traktowanie sekretów', - 'st.display.strict_secret.desc': 'Odmawiaj cytowania poświadczeń (hasła, klucze API, tokeny, kody OTP) w podsumowaniach lub tekście asystenta — nawet gdy o nie wprost poprosisz. Przydatne, jeśli regularnie udostępniasz pliki śladów lub ekran. Domyślnie wyłączone, dzięki czemu agent może powtórzyć dokładną wartość, o którą poprosisz, gdy jej potrzebujesz. Włącz je (Ustawienia → Bezpieczeństwo), gdy chcesz, aby podsumowania `done` pozostały uporządkowane, a poświadczenia nigdy nie były powtarzane.', + 'st.display.strict_secret.desc': 'Odmawiaj cytowania poświadczeń (hasła, klucze API, tokeny, kody OTP) w podsumowaniach lub tekście asystenta — nawet gdy o nie wprost poprosisz. Przydatne, jeśli regularnie udostępniasz pliki śladów lub ekran. Domyślnie wyłączone, dzięki czemu agent może powtórzyć dokładną wartość, o którą poprosisz, gdy jej potrzebujesz. Włącz je, gdy chcesz, aby podsumowania `done` pozostały uporządkowane, a poświadczenia nigdy nie były powtarzane.', 'st.display.allow_local_network.label': 'Zezwól agentowi na dostęp do sieci lokalnej', 'st.display.allow_local_network.desc': 'Pozwala narzędziu fetch_url agenta sięgać do pętli zwrotnej (127.0.0.1, localhost) i adresów prywatnych/RFC1918 (10.x, 192.168.x, 172.16–31.x). Przydatne dla lokalnych serwerów deweloperskich, narzędzi intranetowych lub samodzielnie hostowanych API. Domyślnie wyłączone. Gdy opcja jest wyłączona, blokowane są URL z wpisanym bezpośrednio prywatnym adresem IP lub adresem pętli zwrotnej oraz nazwy localhost. Rozwiązywanie DNS nie jest sprawdzane, więc inne nazwy hostów mogą nadal prowadzić do adresów lokalnych. Dosłowne adresy IP metadanych chmury (169.254.169.254) i nazwy metadanych z listy lub *.internal/*.local pozostają zablokowane także po włączeniu.', 'st.display.scheduled_tasks.label': 'Zaplanowane zadania', @@ -915,8 +912,8 @@ export default { 'sp.slash.busy_only_oob': 'Wiadomości są kolejkowane, gdy WebBrain jest zajęty. Tylko /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces i /verbose mogą uruchamiać się od razu jako polecenia slash.', 'tool.go_back': 'Cofanie', 'tool.go_forward': 'Przechodzenie do przodu', - 'st.display.search.placeholder': 'Szukaj w ustawieniach ogólnych', - 'st.display.search.empty': 'Brak pasujących ustawień ogólnych.', + 'st.display.search.placeholder': 'Szukaj w ustawieniach', + 'st.display.search.empty': 'Brak pasujących ustawień.', 'st.display.advanced': 'Zaawansowane', ...getApocalypseModeCopy('pl'), ...getEmergencyBoxCopy('pl'), @@ -1151,7 +1148,6 @@ export default { "st.memory.reason.not_found": "Nie ma zapisanego wpisu o tym ID.", "st.memory.security_html": "Prywatność: pamięć użytkownika jest przechowywana jako zwykły tekst w tym profilu przeglądarki. Po włączeniu aktywne wpisy pamięci są wysyłane do skonfigurowanego dostawcy LLM jako część promptu systemowego. Nie zapisuj tutaj haseł, kluczy API, tokenów, kodów odzyskiwania ani poufnych sekretów.", "hist.filter.clear": "Wyczyść filtr i pokaż wszystkie rozmowy", - "st.redaction.heading": "Redakcja zrzutów ekranu", "st.redaction.toggle.label": "Redaguj poufną treść na zrzutach ekranu", "st.redaction.toggle.desc": "Zanim zrzut ekranu zostanie wysłany do modelu wizyjnego, rozmywa pola formularzy oraz tekst wyglądający jak e-mail lub numer telefonu. Wykrywanie działa całkowicie na Twoim urządzeniu — nic dodatkowego nie jest przesyłane.", "st.redaction.warning": "⚠️ To redakcja typu best-effort i fail-open: jeśli redakcja nie może zadziałać na danej stronie (np. tuż po nawigacji, w przeglądarkach PDF lub na ograniczonych stronach przeglądarki), zrzut ekranu i tak zostanie wysłany bez redakcji. Wykrywanie opiera się wyłącznie na heurystykach DOM — tekst narysowany na canvasie, dane osobowe wewnątrz obrazów lub cokolwiek nierozpoznanego jako pole formularza czy tekst e-mail/telefon może zostać pominięte, a tekst strony wysyłany do modelu nie jest redagowany przez to ustawienie. To NIE jest gwarancja bezpieczeństwa. Dla pełnej prywatności użyj lokalnego/offline'owego modelu (llama.cpp, Ollama): wtedy zrzuty ekranu nigdy nie opuszczają Twojego urządzenia, a redakcja przestaje być potrzebna.", @@ -1171,7 +1167,7 @@ export default { "sp.slash.export_traces_full": "Eksportuj całą zapisaną sesję śledzenia jako JSON, wraz ze zrzutami ekranu", "sp.export_traces.recording_truncated": "Wyeksportowano wszystkie zapisane rekordy jako JSON. Treści pominiętych podczas rejestrowania nie można odzyskać przez eksport.", "sp.slash.export_traces": "Eksportuj łańcuch narzędzi (ślady)", - "sp.export_traces.none": "Brak śladów dla tej rozmowy. Włącz „Rejestruj ślady\" w Ustawieniach i uruchom ponownie.", + "sp.export_traces.none": "Brak śladów dla tej rozmowy. Włącz „Rejestruj ślady\" w Ustawieniach → Zaawansowane i uruchom ponownie.", "sp.export_traces.error": "Nie udało się wyeksportować śladów.", "sp.export_traces.done": "Wyeksportowano łańcuch narzędzi.", "sp.export_traces.no_conversation": "Nie ma jeszcze nic do eksportu — najpierw rozpocznij rozmowę.", @@ -1181,7 +1177,7 @@ export default { "st.display.newtab.label": "Używaj WebBrain jako strony nowej karty", "st.display.newtab.desc": "Nowe karty otwierają stronę WebBrain z polem do zadawania pytań, wykonywania zadań lub wyszukiwania. Wyłącz, aby zachować zwykłą stronę nowej karty przeglądarki; możesz to zmienić w dowolnej chwili w Ustawienia → Ogólne.", "st.display.help_improve.desc_html": "Zezwól na przechowywanie wybranych interakcji z WebBrain Compass i używanie ich do oceny, ulepszania, dostrajania i trenowania. Domyślnie włączone. Wyłącz, aby przyszłe interakcje Compass nie były używane do tych celów. WebBrain zbiera żądania modeli lokalnych i własnych API wyłącznie od dostawców, u których włączysz „Udostępniaj zapytania do badań”. Polityka prywatności →", - "st.providers.webbrain_data_use.body": "Darmowe dzienne korzystanie z WebBrain Compass jest wliczone. Gdy opcja „Pomóż ulepszać WebBrain” jest domyślnie włączona, wybrane rozmowy Compass mogą być przechowywane i używane do oceny, ulepszania, dostrajania i trenowania. Wyłącz ją w Ogólne → Zaawansowane, aby wykluczyć przyszłe interakcje Compass z tych zastosowań. WebBrain zbiera żądania modeli lokalnych i własnych API tylko wtedy, gdy włączysz opcję „Udostępniaj zapytania do badań” dla danego dostawcy. {privacyLink}. Aby korzystać więcej, subskrybuj na {subscribeLink}. Zarządzaj rozliczeniami na {accountLink}.", + "st.providers.webbrain_data_use.body": "Darmowe dzienne korzystanie z WebBrain Compass jest wliczone. Gdy opcja „Pomóż ulepszać WebBrain” jest domyślnie włączona, wybrane rozmowy Compass mogą być przechowywane i używane do oceny, ulepszania, dostrajania i trenowania. Wyłącz ją w Ustawienia → Zaawansowane, aby wykluczyć przyszłe interakcje Compass z tych zastosowań. WebBrain zbiera żądania modeli lokalnych i własnych API tylko wtedy, gdy włączysz opcję „Udostępniaj zapytania do badań” dla danego dostawcy. {privacyLink}. Aby korzystać więcej, subskrybuj na {subscribeLink}. Zarządzaj rozliczeniami na {accountLink}.", 'st.providers.share_research.label': "Udostępniaj zapytania do badań", 'st.providers.share_research.hint': "Wysyła prompty i odpowiedzi tego dostawcy do WebBrain w celu oceny i ulepszania, wraz z nazwą dostawcy i modelu. Obrazy i załączniki binarne są usuwane, a tekst jest przycinany przed udostępnieniem; pozostały tekst jest wysyłany bez zmian.", 'st.providers.share_research.confirm': "Udostępniać zapytania tego dostawcy WebBrain do badań?\n\nPo włączeniu Twoje prompty, odpowiedzi i interakcje narzędzi z tym dostawcą będą wysyłane do WebBrain w celu oceny i ulepszania, wraz z nazwą dostawcy i modelu. Tekst jest wysyłany bez zmian po usunięciu obrazów i przycięciu długich treści, dlatego unikaj udostępniania wrażliwych danych osobowych. Możesz to w każdej chwili wyłączyć, aby zatrzymać udostępnianie.", @@ -1196,7 +1192,7 @@ export default { "sp.perm.skip_hint": "Chcesz mniej przerw? „Zawsze zezwalaj” zapamiętuje tę witrynę. Poniższe polecenie wyłącza pytania WebBrain o uprawnienia we wszystkich witrynach.", "sp.perm.insert_skip_command": "Wstaw /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Szkic pozostał bez zmian. Wyczyść go przed wstawieniem polecenia.", - "ob.act.permissions_tip": "Pytania o uprawnienia są domyślnie włączone. Zaawansowani użytkownicy mogą wyłączyć je globalnie poleceniem /dangerously-skip-permissions i ponownie włączyć w Ustawienia → Uprawnienia.", + "ob.act.permissions_tip": "Pytania o uprawnienia są domyślnie włączone. Zaawansowani użytkownicy mogą wyłączyć je globalnie poleceniem /dangerously-skip-permissions i ponownie włączyć przyciskiem ⚠ obok mikrofonu.", 'st.provider.field.cache_read_cost_per_million': "Szacowany koszt odczytu z pamięci podręcznej ($ / 1M tokenów)", 'st.provider.field.cache_write_cost_per_million': "Szacowany koszt zapisu do pamięci podręcznej (5 min) ($ / 1M tokenów)", 'st.provider.field.cache_write_1h_cost_per_million': "Szacowany koszt zapisu do pamięci podręcznej (1 godz.) ($ / 1M tokenów)", @@ -1282,8 +1278,8 @@ export default { "st.sync.confirm.reset": "Zastąpić zaszyfrowaną kopię w chmurze bieżącą konfiguracją WebBrain tego urządzenia?", "st.sync.consent.legacy": "Włączyć szyfrowaną synchronizację? WebBrain prześle kompleksowo zaszyfrowaną kopię Twoich wspomnień, autouzupełniania profilu i ustawień dostawcy klucza API do WebBrain Compass. Historia czatów i logowania OAuth nie są synchronizowane.", "st.sync.consent.denied": "Nie przyznano zezwolenia na szyfrowaną synchronizację.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/pt.js b/src/chrome/src/ui/locales/pt.js index d6c48e8cdd..8b90935706 100644 --- a/src/chrome/src/ui/locales/pt.js +++ b/src/chrome/src/ui/locales/pt.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Reduzir o zoom da interface', 'sp.ui_scale.increase': 'Aumentar o zoom da interface', 'sp.ui_scale.reset': 'Redefinir', - 'st.display.ui_scale.label': 'Zoom da interface da extensão', - 'st.display.ui_scale.decrease': 'Reduzir o zoom da interface', - 'st.display.ui_scale.increase': 'Aumentar o zoom da interface', - 'st.display.ui_scale.reset': 'Redefinir', - 'st.display.ui_scale.desc': 'Redimensiona o painel lateral e a janela de chat independente sem alterar o zoom da página.', - 'st.display.ui_scale.shortcuts': 'Atalhos dedicados: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Não atribuído', - 'st.display.ui_scale.manage_shortcuts': 'Personalizar atalhos', 'tool.delegate_research': 'Pesquisando com ChatGPT', 'st.display.research_escalation.label': 'Escalonamento de pesquisa', 'st.display.research_escalation.desc': 'Quando ativado, o WebBrain pode pedir permissão antes de enviar ao ChatGPT uma solicitação de pesquisa somente leitura incomumente complexa. Desativado por padrão. A solicitação exata só é compartilhada após sua aprovação explícita.', @@ -500,7 +492,7 @@ export default { 'sp.step.result_label': "Resultado", 'sp.api.enabled_html': "🔓 Mutações de API ativadas para esta conversa. O agente agora pode usar POST/PUT/PATCH/DELETE via fetch_url e execute_js quando julgar que a API é mais confiável do que a UI para uma etapa. UI-first continua sendo o padrão. Esse sinalizador é apagado quando você reinicia a conversa.", - 'sp.permissions.disabled_html': "⚠️ Os prompts de permissão estão DESATIVADOS. WebBrain clicará, digitará, navegará, executará JavaScript, fará upload, baixará, gravará e agendará trabalhos futuros sem perguntar primeiro. Reative isso em Configurações → Permissões → Perguntar antes de ações consequentes.", + 'sp.permissions.disabled_html': "⚠️ Os prompts de permissão estão DESATIVADOS. WebBrain clicará, digitará, navegará, executará JavaScript, fará upload, baixará, gravará e agendará trabalhos futuros sem perguntar primeiro. Reative isso no botão ⚠ ao lado do microfone.", 'sp.permissions.button': 'Prompts de permissão: ativados', 'sp.permissions.button_off': 'Prompts de permissão: desativados', 'sp.permissions.gate_desc': 'O WebBrain pergunta na primeira vez que clica, digita, baixa arquivos ou executa código em um site.', @@ -659,7 +651,7 @@ export default { 'ob.act.warn1': "WebBrain pode capturar capturas de tela para planejamento. Evite usar o modo agente em páginas confidenciais, como portais de saúde, finanças, namoro ou contas privadas, a menos que você aceite esse risco.", 'ob.act.warn2': "O conteúdo da Web pode conter injeções de alerta maliciosas projetadas para manipular o comportamento da IA.", 'ob.act.warn3': "Sempre revise as ações sugeridas e interrompa execuções que pareçam inesperadas.", - 'ob.act.permissions_tip': "Os prompts de permissão estão ativados por padrão. Usuários avançados podem desativá-los globalmente com /dangerously-skip-permissions e reativá-los em Configurações → Permissões.", + 'ob.act.permissions_tip': "Os prompts de permissão estão ativados por padrão. Usuários avançados podem desativá-los globalmente com /dangerously-skip-permissions e reativá-los no botão ⚠ ao lado do microfone.", 'ob.tokens.title': "Escolha um modelo", 'ob.tokens.body': "WebBrain precisa de um modelo de linguagem para funcionar. Verificaremos primeiro os modelos locais. Se nenhum estiver disponível, abra Configurações e adicione um provedor:", 'ob.tokens.scanning': "Verificando modelos locais...", @@ -685,23 +677,32 @@ export default { 'ob.btn.done': "Comece", 'ob.btn.skip': "Pular por enquanto", 'ob.btn.start': 'Iniciar', - 'ob.cloud.body': 'WebBrain Compass está pronto com uma alocação semanal gratuita. Conversas selecionadas do Compass podem ser retidas e usadas para melhorar o WebBrain enquanto Ajuda a Melhorar o WebBrain está ativado por padrão. Você pode desativá-lo em Configurações → Geral.', + 'ob.cloud.body': 'WebBrain Compass está pronto com uma alocação semanal gratuita. Conversas selecionadas do Compass podem ser retidas e usadas para melhorar o WebBrain enquanto Ajuda a Melhorar o WebBrain está ativado por padrão. Você pode desativá-lo em Configurações → Avançado.', 'ob.cloud.change': 'Alterar', 'ob.cloud.using': 'Usando WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "Configurações WebBrain", - 'st.subtitle': "Configure seus provedores e preferências de LLM · v{version}", + 'st.subtitle': "Configure como o WebBrain funciona · v{version}", 'st.tab.display': "Geral", + 'st.tab.budgets': 'Orçamentos', + 'st.tab.advanced': 'Avançado', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Fala', + 'st.tab.generative': 'Generativo', + 'st.tab.decision': 'Decisão', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Provedores do WebBrain', + 'st.providers_page.subtitle': 'Escolha os modelos que o WebBrain usa · v{version}', + 'st.permissions_page.title': 'Permissões do WebBrain', + 'st.permissions_page.subtitle': 'Sites onde o WebBrain pode agir sem perguntar antes', 'st.tab.providers': "Provedores", 'st.tab.skills': "Habilidades", 'st.tab.vision': "Visão", - 'st.tab.multimodal': "Modelos auxiliares", 'st.tab.memory': "Memória", 'st.tab.profile': "Perfil", 'st.tab.account': "Conta", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "Permissões", 'st.perms.gate.label': "Pergunte antes de ações consequentes", 'st.perms.gate.desc': "Recomendado. Quando ativado, WebBrain pede permissão na primeira vez que clica, digita, navega, executa JavaScript, carrega, baixa, registra ou agenda trabalhos futuros em um site (depois lembra sua escolha). Desligue para uso rápido e gratuito em sites em que você confia totalmente.", @@ -723,8 +724,6 @@ export default { "st.account.update_payment": "Atualizar método de pagamento", 'st.account.manage_billing': "Gerenciar faturamento", - 'st.display.language.label': "Idioma", - 'st.display.language.desc': "Linguagem de interface para o plugin WebBrain.", 'st.display.theme.label': "Aparência", 'st.display.theme.desc': "Claro, escuro ou siga a configuração do seu sistema operacional.", 'st.display.theme.system': "Sistema", @@ -734,8 +733,8 @@ export default { 'st.display.download_directory.desc': "Subpasta opcional dentro do seu navegador ou diretório de downloads do sistema. Deixe em branco para usar o padrão do sistema.", 'st.display.download_directory.placeholder': "Padrão do sistema", 'st.display.download_directory.error': "Use uma pasta relativa como WebBrain ou Work/WebBrain. Caminhos absolutos e “..” não são permitidos.", - 'st.display.search.placeholder': "Pesquisar configurações gerais", - 'st.display.search.empty': "Nenhuma configuração geral corresponde.", + 'st.display.search.placeholder': "Pesquisar configurações", + 'st.display.search.empty': "Nenhuma configuração corresponde.", 'st.display.advanced': "Avançado", ...getApocalypseModeCopy('pt'), ...getEmergencyBoxCopy('pt'), @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': "Captura de tela automática", "st.display.auto_screenshot.desc": "Capture automaticamente a janela de visualização depois que o agente atuar na página, para que a rota de visão selecionada veja o que mudou. Isso consome mais tokens. Se a visão estiver indisponível, o enriquecimento será ignorado e a tarefa continuará com um aviso de status.", 'st.display.auto_screenshot.off': "Desligado", - 'st.display.auto_screenshot.navigation': "Na navegação", - 'st.display.auto_screenshot.state_change': "Na mudança de estado (padrão)", + 'st.display.auto_screenshot.navigation': "Na navegação (padrão)", + 'st.display.auto_screenshot.state_change': "Na mudança de estado", 'st.display.auto_screenshot.every_step': "Cada passo", 'st.display.tracing.label': "Registrar rastreamentos (para comparação de modelos)", - 'st.display.tracing.desc_html': "Persista cada execução (solicitações LLM, respostas, chamadas de ferramentas, capturas de tela) no IndexedDB local para que você possa inspecionar e comparar modelos lado a lado. Abre em uma guia Traces separada. Desativado por padrão porque adiciona gravações de disco por etapa. Abra a página Traces →", - 'st.display.lossless_tracing.label': 'Registrar detalhes completos da solicitação (nível de depuração)', - 'st.display.lossless_tracing.desc_html': 'Também persiste os prompts, mensagens e esquemas de ferramentas completos de cada solicitação LLM em vez de resumos sem conteúdo, e mantém até 200 KB de cada resultado de ferramenta. Permite depuração profunda e reconstrução de solicitações. Desativado por padrão porque grava o conteúdo da sua conversa localmente e usa muito mais disco. Exige que o registro de rastros esteja ativado.', + 'st.display.tracing.desc_html': "Persista cada execução (solicitações LLM, respostas, chamadas de ferramentas, capturas de tela) no IndexedDB local para que você possa inspecionar e comparar modelos lado a lado, incluindo os prompts, mensagens e esquemas de ferramentas completos de cada solicitação LLM e até 200 KB de cada resultado de ferramenta. Abre em uma guia Traces separada. Desativado por padrão porque grava o conteúdo da sua conversa localmente e usa muito mais disco. Abra a página Traces →", 'st.display.cost_session_limit.label': "Subsídio de sessão de custo na nuvem", 'st.display.cost_session_limit.desc': "Interrompe a nuvem e OpenRouter é executado antes de outra chamada de modelo pago quando esta sessão atinge o limite de custo relatado ou estimado. Padrão $ 10.", 'st.display.cost_total_limit.label': "Permissão total de custos de nuvem", 'st.display.cost_total_limit.desc': "Rastreia os gastos relatados ou estimados do modelo de nuvem/OpenRouter em todo o ramal e interrompe outras chamadas pagas no limite. Os provedores locais não são contabilizados.", 'st.display.cost_reset': "Redefinir gastos", 'st.display.strict_secret.label': "Tratamento estrito de segredos", - 'st.display.strict_secret.desc': "Recuse-se a citar credenciais (senhas, chaves de API, tokens, OTPs) em resumos ou textos de assistente – mesmo quando você as solicitar explicitamente. Útil se você compartilha regularmente arquivos de rastreamento ou compartilhamento de tela. Desativado por padrão para que o agente possa repetir o valor exato que você pedir quando precisar. Ative-o (Configurações → Segurança) quando quiser manter os resumos `done` organizados e evitar que credenciais sejam repetidas.", + 'st.display.strict_secret.desc': "Recuse-se a citar credenciais (senhas, chaves de API, tokens, OTPs) em resumos ou textos de assistente – mesmo quando você as solicitar explicitamente. Útil se você compartilha regularmente arquivos de rastreamento ou compartilhamento de tela. Desativado por padrão para que o agente possa repetir o valor exato que você pedir quando precisar. Ative-o quando quiser manter os resumos `done` organizados e evitar que credenciais sejam repetidas.", 'st.display.allow_local_network.label': "Permitir que o agente acesse a rede local", 'st.display.allow_local_network.desc': "Permite que a ferramenta fetch_url do agente alcance loopback (127.0.0.1, localhost) e endereços privados/RFC1918 (10.x, 192.168.x, 172.16–31.x). Útil para servidores de desenvolvimento locais, ferramentas de intranet ou APIs auto-hospedadas. Desativado por padrão. Quando desativado, URLs com IPs privados ou de loopback escritos diretamente e nomes localhost são bloqueados. A resolução DNS não é verificada, então outros nomes de host ainda podem alcançar endereços locais. IPs literais de metadados da nuvem (169.254.169.254) e nomes de metadados listados ou *.internal/*.local continuam bloqueados mesmo quando ativado.", 'st.display.scheduled_tasks.label': "Tarefas agendadas", @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': "Máx.", 'st.providers.compat.value.system': "Sistema", 'st.providers.compat.value.developer': "Desenvolvedor", - 'st.providers.webbrain_data_use.body': "O uso diário gratuito do WebBrain Compass está incluído. Embora Ajudar a melhorar WebBrain esteja ativado por padrão, conversas selecionadas no Compass podem ser retidas e usadas para avaliação, melhoria, ajuste fino e treinamento. Desative-o em Geral → Avançado para excluir futuras interações no Compass desses usos. A WebBrain só coleta solicitações de modelos locais e de suas próprias APIs quando você ativa a opção “Compartilhar consultas para pesquisa” desse provedor. {privacyLink}. Para mais uso, assine em {subscribeLink}. Gerencie o faturamento em {accountLink}.", + 'st.providers.webbrain_data_use.body': "O uso diário gratuito do WebBrain Compass está incluído. Embora Ajudar a melhorar WebBrain esteja ativado por padrão, conversas selecionadas no Compass podem ser retidas e usadas para avaliação, melhoria, ajuste fino e treinamento. Desative-o em Configurações → Avançado para excluir futuras interações no Compass desses usos. A WebBrain só coleta solicitações de modelos locais e de suas próprias APIs quando você ativa a opção “Compartilhar consultas para pesquisa” desse provedor. {privacyLink}. Para mais uso, assine em {subscribeLink}. Gerencie o faturamento em {accountLink}.", 'st.providers.share_research.label': "Compartilhar consultas para pesquisa", 'st.providers.share_research.hint': "Envia os prompts e respostas deste provedor à WebBrain para avaliação e melhoria, incluindo o provedor e o modelo usados. Imagens e anexos binários são removidos e o texto é truncado antes do compartilhamento; o restante do texto é enviado como está.", 'st.providers.share_research.confirm': "Compartilhar as consultas deste provedor com a WebBrain para pesquisa?\n\nQuando ativado, seus prompts, respostas e interações de ferramentas com este provedor serão enviados à WebBrain para avaliação e melhoria, junto com o nome do provedor e do modelo. O texto é enviado como está após remover imagens e truncar conteúdos longos, portanto evite compartilhar dados pessoais sensíveis. Você pode desativar a qualquer momento para interromper o compartilhamento.", @@ -1058,7 +1055,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "Redação de captura de tela", 'st.redaction.toggle.label': "Editar conteúdo confidencial de capturas de tela", 'st.redaction.toggle.desc': "Antes de uma captura de tela ser enviada para um modelo de visão, desfoque os campos do formulário e o texto que se parece com um e-mail ou número de telefone. A detecção é executada inteiramente no seu dispositivo – nada extra é transmitido.", 'st.redaction.warning': "⚠️ Melhor esforço e falha na abertura: se a redação não puder ser executada em uma página (por exemplo, logo após uma navegação, em visualizadores de PDF ou em páginas restritas do navegador), a captura de tela ainda será enviada sem edição. A detecção usa apenas heurística DOM – texto desenhado em tela, PII dentro de imagens ou qualquer coisa não reconhecida como um campo de formulário ou texto de e-mail/telefone pode passar despercebido e o texto da página enviado ao modelo não é editado por esta configuração. NÃO é uma garantia de segurança. Para total privacidade, use um modelo local/offline (llama.cpp, Ollama): as capturas de tela nunca saem da sua máquina e a redação é desnecessária.", @@ -1246,7 +1242,7 @@ export default { "sp.slash.export_traces_full": "Exportar toda a sessão de rastreamento salva como JSON, incluindo capturas de tela", "sp.export_traces.recording_truncated": "Todos os registros salvos foram exportados como JSON. O conteúdo omitido durante a gravação não pode ser recuperado pela exportação.", "sp.slash.export_traces": "Exportar a cadeia de ferramentas (traços)", - "sp.export_traces.none": "Não há vestígios desta conversa. Habilite Gravar rastreamentos em Configurações e execute novamente.", + "sp.export_traces.none": "Não há vestígios desta conversa. Habilite Gravar rastreamentos em Configurações → Avançado e execute novamente.", "sp.export_traces.error": "Não foi possível exportar rastreamentos.", "sp.export_traces.done": "Cadeia de ferramentas exportada.", "sp.export_traces.no_conversation": "Nada para exportar ainda – inicie uma conversa primeiro.", @@ -1320,8 +1316,8 @@ export default { "st.sync.confirm.reset": "Substituir a cópia criptografada na nuvem pela configuração atual do WebBrain deste dispositivo?", "st.sync.consent.legacy": "Ativar a sincronização criptografada? O WebBrain transmitirá uma cópia criptografada de ponta a ponta de suas memórias, preenchimento automático de perfil e configurações do provedor de chave API para o WebBrain Compass. O histórico de bate-papo e os logins do OAuth não são sincronizados.", "st.sync.consent.denied": "A permissão de sincronização criptografada não foi concedida.", - 'st.providers.webgpu_note.body': '{modelLink} é executado inteiramente no Chrome, sem endpoint de API. Baixe-o em Settings > Providers > WebGPU ou no Modo Apocalipse e use o controle nuclear no standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} é executado inteiramente no Chrome, sem endpoint de API. Baixe-o em Providers > WebGPU ou no Modo Apocalipse e use o controle nuclear no standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/ru.js b/src/chrome/src/ui/locales/ru.js index eb70064b65..e4cf1649c5 100644 --- a/src/chrome/src/ui/locales/ru.js +++ b/src/chrome/src/ui/locales/ru.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Уменьшить интерфейс расширения', 'sp.ui_scale.increase': 'Увеличить интерфейс расширения', 'sp.ui_scale.reset': 'Сбросить', - 'st.display.ui_scale.label': 'Масштаб интерфейса расширения', - 'st.display.ui_scale.decrease': 'Уменьшить интерфейс расширения', - 'st.display.ui_scale.increase': 'Увеличить интерфейс расширения', - 'st.display.ui_scale.reset': 'Сбросить', - 'st.display.ui_scale.desc': 'Изменяет размер боковой панели и отдельного окна чата, не меняя масштаб страницы.', - 'st.display.ui_scale.shortcuts': 'Специальные сочетания клавиш: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Не назначено', - 'st.display.ui_scale.manage_shortcuts': 'Настроить сочетания клавиш', 'tool.delegate_research': 'Исследование в ChatGPT', 'st.display.research_escalation.label': 'Эскалация исследований', 'st.display.research_escalation.desc': 'Если функция включена, WebBrain может запросить разрешение перед отправкой в ChatGPT необычно сложного исследовательского запроса только для чтения. По умолчанию выключено. Точный запрос передаётся только после вашего явного согласия.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Не продолжать", "sp.recipient.reason_unrequested": "WebBrain не смог понять из вашего запроса, что нужно отправить сообщение. Открытый диалог на {host}: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain не смог понять из вашего запроса, кому отправить это сообщение. Открытый диалог на {host}: {recipient}.", - 'st.tab.permissions': "Разрешения", 'st.perms.revoke': "Отозвать", 'st.perms.clear_all': "Очистить все разрешения", 'st.perms.gate.label': "Спрашивать перед важными действиями", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Начать', 'ob.btn.skip': 'Пропустить пока', 'ob.btn.start': 'Начать', - 'ob.cloud.body': 'WebBrain Compass готов с еженедельным бесплатным лимитом. Выбранные разговоры Compass могут быть сохранены и использованы для улучшения WebBrain, пока Помощь в улучшении WebBrain включена по умолчанию. Вы можете отключить это в Настройки → Основное.', + 'ob.cloud.body': 'WebBrain Compass готов с еженедельным бесплатным лимитом. Выбранные разговоры Compass могут быть сохранены и использованы для улучшения WebBrain, пока Помощь в улучшении WebBrain включена по умолчанию. Вы можете отключить это в Настройки → Расширенные.', 'ob.cloud.change': 'Изменить', 'ob.cloud.using': 'Используется WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Результат', 'sp.api.enabled_html': '🔓 Изменения через API включены для этого диалога. Агент теперь может использовать POST/PUT/PATCH/DELETE через fetch_url и execute_js, если посчитает API надёжнее интерфейса. По умолчанию используется интерфейс. Этот флаг сбрасывается при очистке диалога.', - 'sp.permissions.disabled_html': '⚠️ Запросы разрешений отключены. WebBrain будет нажимать, вводить текст, переходить, запускать JavaScript, загружать, скачивать, записывать и планировать будущие задачи без запроса. Включите снова: Настройки → Разрешения → Спрашивать перед важными действиями.', + 'sp.permissions.disabled_html': '⚠️ Запросы разрешений отключены. WebBrain будет нажимать, вводить текст, переходить, запускать JavaScript, загружать, скачивать, записывать и планировать будущие задачи без запроса. Включите снова кнопкой ⚠ рядом с микрофоном.', 'sp.permissions.button': 'Запросы разрешений: включены', 'sp.permissions.button_off': 'Запросы разрешений: отключены', 'sp.permissions.gate_desc': 'WebBrain спрашивает, когда впервые нажимает, вводит текст, скачивает файлы или запускает код на сайте.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Ожидание «{selector}»', 'st.title': 'Настройки WebBrain', - 'st.subtitle': 'Настройте провайдеров LLM и параметры · v{version}', + 'st.subtitle': 'Настройте работу WebBrain · v{version}', 'st.tab.display': 'Общие', + 'st.tab.budgets': 'Бюджеты', + 'st.tab.advanced': 'Расширенные', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Речь', + 'st.tab.generative': 'Генерация', + 'st.tab.decision': 'Решения', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Провайдеры WebBrain', + 'st.providers_page.subtitle': 'Выберите модели, которые использует WebBrain · v{version}', + 'st.permissions_page.title': 'Разрешения WebBrain', + 'st.permissions_page.subtitle': 'Сайты, где WebBrain может действовать, не спрашивая заранее', 'st.tab.providers': 'Провайдеры', 'st.tab.vision': 'Зрение', 'st.tab.profile': 'Профиль', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Обновить способ оплаты", 'st.account.manage_billing': 'Управление оплатой', - 'st.display.language.label': 'Язык', - 'st.display.language.desc': 'Язык интерфейса плагина WebBrain.', 'st.display.verbose.label': 'Подробный режим', 'st.display.verbose.desc': 'Показывать полные детали вызовов инструментов, аргументы и сырой JSON-результат. По умолчанию выключено для более чистого чата.', 'st.display.selection_shortcut.label': 'Быстрое действие для выделения', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Авто-скриншот', "st.display.auto_screenshot.desc": "Автоматически делайте снимок области просмотра после действий агента, чтобы выбранный маршрут обработки изображений видел изменения. Это расходует больше токенов. Если зрение недоступно, обогащение пропускается, а задача продолжается с уведомлением о состоянии.", 'st.display.auto_screenshot.off': 'Выкл.', - 'st.display.auto_screenshot.navigation': 'При навигации', - 'st.display.auto_screenshot.state_change': 'При изменении состояния (по умолчанию)', + 'st.display.auto_screenshot.navigation': 'При навигации (по умолчанию)', + 'st.display.auto_screenshot.state_change': 'При изменении состояния', 'st.display.auto_screenshot.every_step': 'Каждый шаг', 'st.display.tracing.label': 'Записывать трассы (для сравнения моделей)', - 'st.display.tracing.desc_html': 'Сохранять каждый запуск (LLM-запросы, ответы, вызовы инструментов, скриншоты) в локальную IndexedDB, чтобы можно было разбирать и сравнивать модели бок о бок. Открывается в отдельной вкладке «Трассы». По умолчанию выключено, потому что добавляет запись на диск на каждом шаге. Открыть страницу трасс →', - 'st.display.lossless_tracing.label': 'Записывать полные детали запросов (отладочный уровень)', - 'st.display.lossless_tracing.desc_html': 'Также сохраняет полные промпты, сообщения и схемы инструментов каждого LLM-запроса вместо кратких сводок без содержимого, и хранит до 200 КБ каждого результата инструмента. Позволяет глубокую отладку и восстановление запросов. Выключено по умолчанию, так как записывает содержимое вашего диалога локально и занимает заметно больше места. Требует включённой записи трасс.', + 'st.display.tracing.desc_html': 'Сохранять каждый запуск (LLM-запросы, ответы, вызовы инструментов, скриншоты) в локальную IndexedDB, чтобы можно было разбирать и сравнивать модели бок о бок, включая полные промпты, сообщения и схемы инструментов каждого LLM-запроса и до 200 КБ каждого результата инструмента. Открывается в отдельной вкладке «Трассы». По умолчанию выключено, так как записывает содержимое вашего диалога локально и занимает заметно больше места. Открыть страницу трасс →', 'st.display.allow_local_network.label': 'Разрешить агенту доступ к локальной сети', 'st.display.allow_local_network.desc': 'Разрешает инструменту fetch_url агента обращаться к loopback (127.0.0.1, localhost) и частным адресам RFC1918 (10.x, 192.168.x, 172.16–31.x). Полезно для локальных серверов разработки, интранет-инструментов и self-hosted API. По умолчанию выключено. В этом состоянии блокируются URL с явно записанными частными или loopback IP-адресами и имена localhost. Результат DNS не проверяется, поэтому другие имена хостов могут вести к локальным адресам. IP-адреса метаданных облака, записанные явно (169.254.169.254), и перечисленные имена метаданных или *.internal/*.local остаются заблокированы даже при включении.', 'st.display.notify_sound.label': "Звуки уведомлений", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Режим зрения включён для активного провайдера.", "sp.vision.off": "Режим зрения выключен для активного провайдера.", "sp.vision.error": "Не удалось переключить зрение: {msg}", - "st.tab.multimodal": "Вспомогательные модели", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Рекомендуется. Когда включено, WebBrain спрашивает разрешение при первом нажатии, вводе, переходе, запуске JavaScript, загрузке, скачивании или записи на сайте (а затем запоминает ваш выбор). Выключите для быстрой работы без запросов на сайтах, которым вы полностью доверяете.", "st.perms.gate.warning": "⚠️ Запросы на разрешения ВЫКЛЮЧЕНЫ. WebBrain будет нажимать, вводить текст, переходить, запускать JavaScript, загружать, скачивать и записывать на любом сайте БЕЗ запроса — в том числе на страницах, содержимое которых может контролироваться злоумышленником. Содержимое страниц по-прежнему считается недоверенным внутри системы, но ничто не помешает внедрённой инструкции запустить действие. Оставляйте это выключенным, только если полностью доверяете каждому сайту, на котором используете ассистента.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Системное значение", "st.display.download_directory.error": "Используйте относительную папку, например WebBrain или Work/WebBrain. Абсолютные пути и «..» не допускаются.", "st.display.strict_secret.label": "Строгая обработка секретов", - "st.display.strict_secret.desc": "Отказываться цитировать учётные данные (пароли, API-ключи, токены, OTP) в сводках или тексте ассистента — даже когда вы явно об этом просите. Полезно, если вы регулярно делитесь файлами трасс или демонстрируете экран. По умолчанию выключено, чтобы агент мог при необходимости повторять точное значение, которое вы запросите. Включите (Настройки → Безопасность), когда хотите, чтобы сводки `done` оставались аккуратными, а учётные данные никогда не повторялись.", + "st.display.strict_secret.desc": "Отказываться цитировать учётные данные (пароли, API-ключи, токены, OTP) в сводках или тексте ассистента — даже когда вы явно об этом просите. Полезно, если вы регулярно делитесь файлами трасс или демонстрируете экран. По умолчанию выключено, чтобы агент мог при необходимости повторять точное значение, которое вы запросите. Включите, когда хотите, чтобы сводки `done` оставались аккуратными, а учётные данные никогда не повторялись.", "st.display.request_timeout.label": "Тайм-аут запроса к LLM", "st.display.request_timeout.desc": "Максимальное время ожидания заголовков ответа и каждой паузы между фрагментами потокового ответа. По умолчанию: 120 с. Увеличьте его для медленных локальных моделей, особенно на CPU или с большим контекстом.", "st.providers.filter.all": "Все", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Пока WebBrain занят, сообщения ставятся в очередь. Только /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces и /verbose могут запускаться сразу как slash-команды.', 'tool.go_back': 'Назад', 'tool.go_forward': 'Вперёд', - 'st.display.search.placeholder': 'Поиск в общих настройках', - 'st.display.search.empty': 'Нет совпадений в общих настройках.', + 'st.display.search.placeholder': 'Поиск в настройках', + 'st.display.search.empty': 'Нет совпадающих настроек.', 'st.display.advanced': 'Расширенные', ...getApocalypseModeCopy('ru'), ...getEmergencyBoxCopy('ru'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Сохранённой записи с таким ID нет.", "st.memory.security_html": "Конфиденциальность: память пользователя хранится открытым текстом в этом профиле браузера. Когда она включена, активные записи памяти отправляются выбранному провайдеру LLM как часть системного промпта. Не храните здесь пароли, API-ключи, токены, коды восстановления или другие конфиденциальные секреты.", "hist.filter.clear": "Очистить фильтр и показать все разговоры", - "st.redaction.heading": "Редактирование скриншотов", "st.redaction.toggle.label": "Скрывать чувствительный контент на скриншотах", "st.redaction.toggle.desc": "Перед отправкой скриншота модели зрения размывает поля форм и текст, похожий на email или номер телефона. Обнаружение выполняется полностью на вашем устройстве — ничего лишнего не передаётся.", "st.redaction.warning": "⚠️ Работает по принципу «максимум усилий» и fail-open: если редактирование не может выполниться на странице (например, сразу после перехода, в просмотрщиках PDF или на ограниченных страницах браузера), скриншот всё равно отправляется неотредактированным. Обнаружение использует только эвристики DOM — текст, нарисованный на canvas, персональные данные внутри изображений или что-либо, не распознанное как поле формы или текст email/телефона, может остаться незамеченным, а текст страницы, отправляемый модели, этой настройкой не редактируется. Это НЕ гарантия безопасности. Для полной приватности используйте локальную/офлайн-модель (llama.cpp, Ollama): тогда скриншоты вообще не покидают ваше устройство и редактирование не требуется.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Экспортировать всю сохранённую сессию трассировки в JSON, включая снимки экрана", "sp.export_traces.recording_truncated": "Все сохранённые записи экспортированы в JSON. Содержимое, пропущенное при записи, невозможно восстановить экспортом.", "sp.slash.export_traces": "Экспорт цепочки инструментов (трассировки)", - "sp.export_traces.none": "Нет трассировок для этого разговора. Включите «Записывать трассировки» в настройках и запустите снова.", + "sp.export_traces.none": "Нет трассировок для этого разговора. Включите «Записывать трассировки» в разделе Настройки → Расширенные и запустите снова.", "sp.export_traces.error": "Не удалось экспортировать трассировки.", "sp.export_traces.done": "Цепочка инструментов экспортирована.", "sp.export_traces.no_conversation": "Пока нечего экспортировать — сначала начните разговор.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Использовать WebBrain как страницу новой вкладки", "st.display.newtab.desc": "Новые вкладки открывают страницу WebBrain с полем, где можно спросить, поручить действие или выполнить поиск. Отключите, чтобы оставить обычную страницу новой вкладки браузера; изменить это можно в любой момент в Настройки → Общие.", "st.display.help_improve.desc_html": "Разрешить хранить отдельные взаимодействия с WebBrain Compass и использовать их для оценки, улучшения, тонкой настройки и обучения. Включено по умолчанию. Отключите, чтобы будущие взаимодействия с Compass не использовались для этих целей. WebBrain собирает запросы к локальным моделям и вашим собственным API только от провайдеров, у которых вы включили «Делиться запросами для исследований». Политика конфиденциальности →", - "st.providers.webbrain_data_use.body": "Включён бесплатный ежедневный объём WebBrain Compass. Пока параметр «Помогать улучшать WebBrain» включён по умолчанию, отдельные разговоры в Compass могут храниться и использоваться для оценки, улучшения, тонкой настройки и обучения. Отключите его в разделе «Общие → Расширенные», чтобы исключить будущие взаимодействия с Compass из такого использования. WebBrain собирает запросы к локальным моделям и вашим собственным API, только когда вы включаете опцию «Делиться запросами для исследований» для этого провайдера. {privacyLink}. Для большего объёма оформите подписку на {subscribeLink}. Управляйте оплатой на {accountLink}.", + "st.providers.webbrain_data_use.body": "Включён бесплатный ежедневный объём WebBrain Compass. Пока параметр «Помогать улучшать WebBrain» включён по умолчанию, отдельные разговоры в Compass могут храниться и использоваться для оценки, улучшения, тонкой настройки и обучения. Отключите его в разделе «Настройки → Расширенные», чтобы исключить будущие взаимодействия с Compass из такого использования. WebBrain собирает запросы к локальным моделям и вашим собственным API, только когда вы включаете опцию «Делиться запросами для исследований» для этого провайдера. {privacyLink}. Для большего объёма оформите подписку на {subscribeLink}. Управляйте оплатой на {accountLink}.", 'st.providers.share_research.label': "Делиться запросами для исследований", 'st.providers.share_research.hint': "Отправляет запросы и ответы этого провайдера в WebBrain для оценки и улучшения, включая сведения об используемом провайдере и модели. Изображения и бинарные вложения удаляются, а текст сокращается перед отправкой; остальной текст отправляется как есть.", 'st.providers.share_research.confirm': "Делиться запросами этого провайдера с WebBrain для исследований?\n\nПри включении ваши запросы, ответы и взаимодействия с инструментами этого провайдера будут отправляться в WebBrain для оценки и улучшения вместе с названием провайдера и модели. Текст отправляется как есть после удаления изображений и сокращения длинного содержимого, поэтому не передавайте чувствительные персональные данные. Вы можете отключить это в любое время, чтобы прекратить передачу.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Хотите меньше прерываний? «Всегда разрешать» запоминает этот сайт. Команда ниже отключает запросы разрешений WebBrain на всех сайтах.", "sp.perm.insert_skip_command": "Вставить /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Черновик не изменён. Очистите его перед вставкой команды.", - "ob.act.permissions_tip": "Запросы разрешений включены по умолчанию. Опытные пользователи могут отключить их глобально командой /dangerously-skip-permissions и снова включить в Настройки → Разрешения.", + "ob.act.permissions_tip": "Запросы разрешений включены по умолчанию. Опытные пользователи могут отключить их глобально командой /dangerously-skip-permissions и снова включить кнопкой ⚠ рядом с микрофоном.", 'st.provider.field.cache_read_cost_per_million': "Расчётная стоимость чтения из кэша ($ / 1 млн токенов)", 'st.provider.field.cache_write_cost_per_million': "Расчётная стоимость записи в кэш на 5 минут ($ / 1 млн токенов)", 'st.provider.field.cache_write_1h_cost_per_million': "Расчётная стоимость записи в кэш на 1 час ($ / 1 млн токенов)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Заменить зашифрованную облачную копию текущей настройкой WebBrain этого устройства?", "st.sync.consent.legacy": "Включить шифрованную синхронизацию? WebBrain передаст сквозную зашифрованную копию ваших воспоминаний, автозаполнение профиля и настройки поставщика ключей API в WebBrain Compass. История чата и входы по OAuth не синхронизируются.", "st.sync.consent.denied": "Разрешение на зашифрованную синхронизацию не предоставлено.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/th.js b/src/chrome/src/ui/locales/th.js index bf1b3176db..b79caa3e28 100644 --- a/src/chrome/src/ui/locales/th.js +++ b/src/chrome/src/ui/locales/th.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'ย่อ UI ของส่วนขยาย', 'sp.ui_scale.increase': 'ขยาย UI ของส่วนขยาย', 'sp.ui_scale.reset': 'รีเซ็ต', - 'st.display.ui_scale.label': 'ซูม UI ของส่วนขยาย', - 'st.display.ui_scale.decrease': 'ย่อ UI ของส่วนขยาย', - 'st.display.ui_scale.increase': 'ขยาย UI ของส่วนขยาย', - 'st.display.ui_scale.reset': 'รีเซ็ต', - 'st.display.ui_scale.desc': 'ปรับขนาดแผงด้านข้างและหน้าต่างแชตแบบแยก โดยไม่เปลี่ยนการซูมหน้าเว็บ', - 'st.display.ui_scale.shortcuts': 'แป้นพิมพ์ลัดเฉพาะ: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'ยังไม่ได้กำหนด', - 'st.display.ui_scale.manage_shortcuts': 'ปรับแต่งแป้นพิมพ์ลัด', 'tool.delegate_research': 'กำลังค้นคว้าด้วย ChatGPT', 'st.display.research_escalation.label': 'การส่งต่อการค้นคว้า', 'st.display.research_escalation.desc': 'เมื่อเปิดใช้ WebBrain อาจขออนุญาตก่อนส่งพรอมต์ค้นคว้าแบบอ่านอย่างเดียวที่ซับซ้อนเป็นพิเศษไปยัง ChatGPT ปิดไว้ตามค่าเริ่มต้น พรอมต์ที่ตรงกันจะถูกแชร์หลังจากคุณอนุมัติอย่างชัดเจนเท่านั้น', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "ไม่ดำเนินการ", "sp.recipient.reason_unrequested": "WebBrain ไม่แน่ใจจากคำขอของคุณว่าต้องส่งข้อความ บทสนทนาที่เปิดอยู่บน {host} คือกับ {recipient}", "sp.recipient.reason_unnamed": "WebBrain ไม่แน่ใจจากคำขอของคุณว่าใครควรได้รับข้อความนี้ บทสนทนาที่เปิดอยู่บน {host} คือกับ {recipient}", - 'st.tab.permissions': "สิทธิ์", 'st.perms.revoke': "เพิกถอน", 'st.perms.clear_all': "ล้างสิทธิ์ทั้งหมด", 'st.perms.gate.label': "ถามก่อนการดำเนินการสำคัญ", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'เริ่มต้น', 'ob.btn.skip': 'ข้ามไปก่อน', 'ob.btn.start': 'เริ่ม', - 'ob.cloud.body': 'WebBrain Compass พร้อมพร้อมกับการจัดสรรรายสัปดาห์ฟรี บทสนทนา Compass ที่เลือกอาจถูกเก็บและใช้เพื่อปรับปรุง WebBrain ในขณะที่ช่วยปรับปรุง WebBrain ถูกเปิดใช้งานตามค่าเริ่มต้น คุณสามารถปิดการใช้งานนี้ในการตั้งค่า → ทั่วไป', + 'ob.cloud.body': 'WebBrain Compass พร้อมพร้อมกับการจัดสรรรายสัปดาห์ฟรี บทสนทนา Compass ที่เลือกอาจถูกเก็บและใช้เพื่อปรับปรุง WebBrain ในขณะที่ช่วยปรับปรุง WebBrain ถูกเปิดใช้งานตามค่าเริ่มต้น คุณสามารถปิดการใช้งานนี้ในการตั้งค่า → ขั้นสูง', 'ob.cloud.change': 'เปลี่ยน', 'ob.cloud.using': 'กำลังใช้ WebBrain Compass', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'ผลลัพธ์', 'sp.api.enabled_html': '🔓 เปิดการแก้ไขผ่าน API สำหรับการสนทนานี้แล้ว เอเจนต์สามารถใช้ POST/PUT/PATCH/DELETE ผ่าน fetch_url และ execute_js เมื่อพิจารณาว่า API น่าเชื่อถือกว่า UI สำหรับขั้นตอนหนึ่ง โดย UI ยังคงเป็นค่าเริ่มต้น แฟล็กนี้จะถูกล้างเมื่อคุณรีเซ็ตการสนทนา', - 'sp.permissions.disabled_html': '⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด บันทึก และตั้งเวลางานในอนาคตโดยไม่ถามก่อน เปิดใช้งานอีกครั้งได้ที่ การตั้งค่า → สิทธิ์ → ถามก่อนการดำเนินการสำคัญ', + 'sp.permissions.disabled_html': '⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด บันทึก และตั้งเวลางานในอนาคตโดยไม่ถามก่อน เปิดใช้งานอีกครั้งได้จากปุ่ม ⚠ ข้างไมโครโฟน', 'sp.permissions.button': 'การถามสิทธิ์: เปิด', 'sp.permissions.button_off': 'การถามสิทธิ์: ปิด', 'sp.permissions.gate_desc': 'WebBrain จะถามก่อนครั้งแรกที่คลิก พิมพ์ ดาวน์โหลด หรือเรียกใช้โค้ดบนเว็บไซต์', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'รอ “{selector}”', 'st.title': 'การตั้งค่า WebBrain', - 'st.subtitle': 'ตั้งค่าผู้ให้บริการ LLM และการตั้งค่า · v{version}', + 'st.subtitle': 'ตั้งค่าการทำงานของ WebBrain · v{version}', 'st.tab.display': 'ทั่วไป', + 'st.tab.budgets': 'งบประมาณ', + 'st.tab.advanced': 'ขั้นสูง', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'เสียงพูด', + 'st.tab.generative': 'เชิงสร้างสรรค์', + 'st.tab.decision': 'การตัดสินใจ', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'ผู้ให้บริการ WebBrain', + 'st.providers_page.subtitle': 'เลือกโมเดลที่ WebBrain ใช้ · v{version}', + 'st.permissions_page.title': 'สิทธิ์ของ WebBrain', + 'st.permissions_page.subtitle': 'เว็บไซต์ที่ WebBrain ดำเนินการได้โดยไม่ต้องถามก่อน', 'st.tab.providers': 'ผู้ให้บริการ', 'st.tab.vision': 'การมองเห็น', 'st.tab.profile': 'โปรไฟล์', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "อัปเดตวิธีชำระเงิน", 'st.account.manage_billing': 'จัดการการเรียกเก็บเงิน', - 'st.display.language.label': 'ภาษา', - 'st.display.language.desc': 'ภาษาของหน้าจอปลั๊กอิน WebBrain', 'st.display.verbose.label': 'โหมดละเอียด', 'st.display.verbose.desc': 'แสดงรายละเอียดการเรียกใช้เครื่องมือเต็ม อาร์กิวเมนต์ และผลลัพธ์ JSON ดิบ ปิดเป็นค่าเริ่มต้นเพื่อประสบการณ์แชตที่สะอาดขึ้น', 'st.display.selection_shortcut.label': 'ทางลัดสำหรับข้อความที่เลือก', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'จับภาพหน้าจออัตโนมัติ', "st.display.auto_screenshot.desc": "จับภาพหน้าจอของวิวพอร์ตโดยอัตโนมัติหลังจากเอเจนต์ทำงานบนหน้า เพื่อให้เส้นทางการมองเห็นที่เลือกเห็นการเปลี่ยนแปลง การทำงานนี้ใช้โทเค็นมากขึ้น หากการมองเห็นไม่พร้อมใช้งาน ระบบจะข้ามการเสริมข้อมูลและทำงานต่อพร้อมแจ้งสถานะ", 'st.display.auto_screenshot.off': 'ปิด', - 'st.display.auto_screenshot.navigation': 'เมื่อมีการนำทาง', - 'st.display.auto_screenshot.state_change': 'เมื่อสถานะเปลี่ยน (ค่าเริ่มต้น)', + 'st.display.auto_screenshot.navigation': 'เมื่อมีการนำทาง (ค่าเริ่มต้น)', + 'st.display.auto_screenshot.state_change': 'เมื่อสถานะเปลี่ยน', 'st.display.auto_screenshot.every_step': 'ทุกขั้น', 'st.display.tracing.label': 'บันทึกการติดตาม (เพื่อเปรียบเทียบโมเดล)', - 'st.display.tracing.desc_html': 'จัดเก็บทุกการทำงาน (คำขอ LLM, การตอบกลับ, การเรียกใช้เครื่องมือ, ภาพหน้าจอ) ลงใน IndexedDB ในเครื่อง เพื่อให้คุณตรวจสอบและเปรียบเทียบโมเดลแบบเคียงข้างกันได้ จะเปิดในแท็บ Traces แยกต่างหาก ปิดเป็นค่าเริ่มต้นเพราะเพิ่มการเขียนดิสก์ในทุกขั้น เปิดหน้า Traces →', - 'st.display.lossless_tracing.label': 'บันทึกรายละเอียดคำขอทั้งหมด (ระดับดีบัก)', - 'st.display.lossless_tracing.desc_html': 'จัดเก็บพรอมต์ ข้อความ และโครงสร้างเครื่องมือแบบเต็มของแต่ละคำขอ LLM แทนสรุปที่ไม่มีเนื้อหา และเก็บผลลัพธ์เครื่องมือแต่ละรายการสูงสุด 200 KB เปิดใช้งานการดีบักเชิงลึกและการสร้างคำขอใหม่ ปิดโดยค่าเริ่มต้นเพราะเขียนเนื้อหาสนทนาของคุณในเครื่องและใช้พื้นที่ดิสก์มากกว่ามาก ต้องเปิดการบันทึกเทรซ', + 'st.display.tracing.desc_html': 'จัดเก็บทุกการทำงาน (คำขอ LLM, การตอบกลับ, การเรียกใช้เครื่องมือ, ภาพหน้าจอ) ลงใน IndexedDB ในเครื่อง เพื่อให้คุณตรวจสอบและเปรียบเทียบโมเดลแบบเคียงข้างกันได้ รวมถึงพรอมต์ ข้อความ และโครงสร้างเครื่องมือแบบเต็มของแต่ละคำขอ LLM และผลลัพธ์เครื่องมือแต่ละรายการสูงสุด 200 KB จะเปิดในแท็บ Traces แยกต่างหาก ปิดเป็นค่าเริ่มต้นเพราะเขียนเนื้อหาสนทนาของคุณในเครื่องและใช้พื้นที่ดิสก์มากกว่ามาก เปิดหน้า Traces →', 'st.display.allow_local_network.label': 'อนุญาตให้เอเจนต์เข้าถึงเครือข่ายภายใน', 'st.display.allow_local_network.desc': 'ให้เครื่องมือ fetch_url ของเอเจนต์เข้าถึง loopback (127.0.0.1, localhost) และที่อยู่ส่วนตัว/RFC1918 (10.x, 192.168.x, 172.16–31.x) มีประโยชน์สำหรับเซิร์ฟเวอร์พัฒนาภายใน เครื่องมืออินทราเน็ต หรือ API ที่โฮสต์เอง ปิดเป็นค่าเริ่มต้น เมื่อปิด จะบล็อก URL ที่ระบุ IP ส่วนตัวหรือ loopback โดยตรงและชื่อ localhost ไม่มีการตรวจสอบผลการแปลงชื่อ DNS ดังนั้นชื่อโฮสต์อื่นอาจยังเข้าถึงที่อยู่ภายในได้ IP เมตาดาตาคลาวด์ที่ระบุโดยตรง (169.254.169.254) และชื่อเมตาดาตาในรายการหรือ *.internal/*.local ยังคงถูกบล็อกแม้เปิดไว้', 'st.display.notify_sound.label': "เสียงแจ้งเตือน", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "โหมดการมองเห็น เปิดใช้งานแล้ว สำหรับผู้ให้บริการที่ใช้งานอยู่", "sp.vision.off": "โหมดการมองเห็น ปิดใช้งานแล้ว สำหรับผู้ให้บริการที่ใช้งานอยู่", "sp.vision.error": "สลับโหมดการมองเห็นไม่สำเร็จ: {msg}", - "st.tab.multimodal": "โมเดลเสริม", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "แนะนำ เมื่อเปิด WebBrain จะขออนุญาตในครั้งแรกที่คลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด หรือบันทึกบนเว็บไซต์ (จากนั้นจะจดจำตัวเลือกของคุณ) ปิดไว้เพื่อใช้งานได้รวดเร็วโดยไม่ต้องถาม บนเว็บไซต์ที่คุณไว้วางใจเต็มที่", "st.perms.gate.warning": "⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด และบันทึกบนเว็บไซต์ใด ๆ โดยไม่ถาม — รวมถึงหน้าที่เนื้อหาอาจถูกควบคุมโดยผู้โจมตี เนื้อหาของหน้ายังถูกปฏิบัติเสมือนไม่น่าเชื่อถือภายในระบบ แต่ไม่มีอะไรหยุดคำสั่งที่ถูกแทรกเข้ามาไม่ให้กระตุ้นการกระทำได้ ปิดไว้เฉพาะเมื่อคุณไว้วางใจทุกเว็บไซต์ที่ใช้ผู้ช่วยนี้เต็มที่", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "ค่าเริ่มต้นของระบบ", "st.display.download_directory.error": "ใช้โฟลเดอร์แบบสัมพัทธ์ เช่น WebBrain หรือ Work/WebBrain ไม่อนุญาตพาธแบบสัมบูรณ์และ “..”", "st.display.strict_secret.label": "การจัดการความลับอย่างเข้มงวด", - "st.display.strict_secret.desc": "ปฏิเสธการอ้างอิงข้อมูลรับรอง (รหัสผ่าน คีย์ API โทเค็น OTP) ในบทสรุปหรือข้อความของผู้ช่วย — แม้คุณจะขอโดยตรง มีประโยชน์หากคุณแชร์ไฟล์ trace หรือแชร์หน้าจอเป็นประจำ ปิดเป็นค่าเริ่มต้น เพื่อให้เอเจนต์สามารถแสดงค่าที่แน่นอนที่คุณร้องขอออกมาได้เมื่อคุณต้องการ เปิดใช้งาน (การตั้งค่า → ความปลอดภัย) เมื่อคุณต้องการให้บทสรุป `done` เรียบร้อยและไม่มีการอ้างอิงข้อมูลรับรองซ้ำ", + "st.display.strict_secret.desc": "ปฏิเสธการอ้างอิงข้อมูลรับรอง (รหัสผ่าน คีย์ API โทเค็น OTP) ในบทสรุปหรือข้อความของผู้ช่วย — แม้คุณจะขอโดยตรง มีประโยชน์หากคุณแชร์ไฟล์ trace หรือแชร์หน้าจอเป็นประจำ ปิดเป็นค่าเริ่มต้น เพื่อให้เอเจนต์สามารถแสดงค่าที่แน่นอนที่คุณร้องขอออกมาได้เมื่อคุณต้องการ เปิดใช้งาน เมื่อคุณต้องการให้บทสรุป `done` เรียบร้อยและไม่มีการอ้างอิงข้อมูลรับรองซ้ำ", "st.display.request_timeout.label": "เวลารอคำขอ LLM", "st.display.request_timeout.desc": "เวลารอสูงสุดสำหรับส่วนหัวของการตอบกลับและแต่ละช่วงหยุดระหว่างส่วนของคำตอบแบบสตรีม ค่าเริ่มต้น: 120 วินาที เพิ่มเวลานี้สำหรับโมเดลในเครื่องที่ทำงานช้า โดยเฉพาะเมื่อใช้ CPU หรือบริบทขนาดใหญ่", "st.providers.filter.all": "ทั้งหมด", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'ข้อความจะถูกเข้าคิวขณะที่ WebBrain ไม่ว่าง เฉพาะ /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces และ /verbose เท่านั้นที่เรียกใช้ได้ทันทีในฐานะคำสั่ง slash', 'tool.go_back': 'กำลังย้อนกลับ', 'tool.go_forward': 'กำลังไปข้างหน้า', - 'st.display.search.placeholder': 'ค้นหาการตั้งค่าทั่วไป', - 'st.display.search.empty': 'ไม่พบการตั้งค่าทั่วไปที่ตรงกัน', + 'st.display.search.placeholder': 'ค้นหาการตั้งค่า', + 'st.display.search.empty': 'ไม่พบการตั้งค่าที่ตรงกัน', 'st.display.advanced': 'ขั้นสูง', ...getApocalypseModeCopy('th'), ...getEmergencyBoxCopy('th'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "ไม่มีหน่วยความจำที่บันทึกไว้ด้วย ID นี้", "st.memory.security_html": "ความเป็นส่วนตัว: หน่วยความจำผู้ใช้ถูกเก็บเป็นข้อความธรรมดาในโปรไฟล์เบราว์เซอร์นี้ เมื่อเปิดใช้งาน บันทึกหน่วยความจำที่ใช้งานอยู่จะถูกส่งไปยังผู้ให้บริการ LLM ที่คุณตั้งค่าไว้โดยเป็นส่วนหนึ่งของ system prompt อย่าเก็บรหัสผ่าน คีย์ API โทเค็น รหัสกู้คืน หรือข้อมูลลับที่ละเอียดอ่อนไว้ที่นี่", "hist.filter.clear": "ล้างตัวกรองและแสดงการสนทนาทั้งหมด", - "st.redaction.heading": "การเบลอภาพหน้าจอ", "st.redaction.toggle.label": "เบลอเนื้อหาที่ละเอียดอ่อนในภาพหน้าจอ", "st.redaction.toggle.desc": "ก่อนส่งภาพหน้าจอไปยังโมเดลวิชั่น ระบบจะเบลอช่องฟอร์มและข้อความที่ดูเหมือนอีเมลหรือหมายเลขโทรศัพท์ การตรวจจับทำงานทั้งหมดบนอุปกรณ์ของคุณ — ไม่มีการส่งข้อมูลเพิ่มเติมใดๆ", "st.redaction.warning": "⚠️ ฟีเจอร์นี้เป็นแบบ best-effort และ fail-open: หากการเบลอไม่สามารถทำงานบนหน้าใดหน้าหนึ่งได้ (เช่น ทันทีหลังการนำทาง ในตัวแสดง PDF หรือบนหน้าเบราว์เซอร์ที่ถูกจำกัด) ภาพหน้าจอจะยังคงถูกส่งไปโดยไม่ถูกเบลอ การตรวจจับใช้เพียงหลักการ DOM heuristics เท่านั้น — ข้อความที่วาดบน canvas ข้อมูลส่วนบุคคลในรูปภาพ หรือสิ่งใดก็ตามที่ไม่ถูกจดจำว่าเป็นช่องฟอร์มหรือข้อความอีเมล/โทรศัพท์ อาจหลุดรอดไปได้ และข้อความในหน้าเว็บที่ส่งไปยังโมเดลก็ไม่ถูกเบลอโดยการตั้งค่านี้ นี่ไม่ใช่การรับประกันด้านความปลอดภัย หากต้องการความเป็นส่วนตัวอย่างเต็มที่ ให้ใช้โมเดลภายในเครื่อง/ออฟไลน์ (llama.cpp, Ollama) เพราะภาพหน้าจอจะไม่ออกจากเครื่องของคุณเลย และไม่จำเป็นต้องเบลออีกต่อไป", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "ส่งออกเซสชันการติดตามที่บันทึกไว้ทั้งหมดเป็น JSON รวมภาพหน้าจอ", "sp.export_traces.recording_truncated": "ส่งออกข้อมูลที่บันทึกไว้ทั้งหมดเป็น JSON แล้ว เนื้อหาที่ละเว้นระหว่างการบันทึกไม่สามารถกู้คืนด้วยการส่งออกได้", "sp.slash.export_traces": "ส่งออกลำดับการทำงานของเครื่องมือ (trace)", - "sp.export_traces.none": "ไม่มี trace สำหรับการสนทนานี้ เปิด «บันทึก trace» ในการตั้งค่า แล้วเรียกใช้อีกครั้ง", + "sp.export_traces.none": "ไม่มี trace สำหรับการสนทนานี้ เปิด «บันทึก trace» ในการตั้งค่า → ขั้นสูง แล้วเรียกใช้อีกครั้ง", "sp.export_traces.error": "ไม่สามารถส่งออก trace ได้", "sp.export_traces.done": "ส่งออกลำดับเครื่องมือแล้ว", "sp.export_traces.no_conversation": "ยังไม่มีอะไรให้ส่งออก — เริ่มการสนทนาก่อน", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "ใช้ WebBrain เป็นหน้าแท็บใหม่", "st.display.newtab.desc": "แท็บใหม่จะเปิดหน้า WebBrain ที่มีช่องสำหรับถาม สั่งให้ทำ หรือค้นหา ปิดตัวเลือกนี้หากต้องการใช้หน้าแท็บใหม่ปกติของเบราว์เซอร์ และเปลี่ยนได้ทุกเมื่อที่ การตั้งค่า → ทั่วไป", "st.display.help_improve.desc_html": "อนุญาตให้เก็บการโต้ตอบกับ WebBrain Compass บางรายการและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก โดยเปิดไว้เป็นค่าเริ่มต้น ปิดตัวเลือกนี้เพื่อไม่ให้การโต้ตอบกับ Compass ในอนาคตถูกใช้เพื่อวัตถุประสงค์เหล่านี้ WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะจากผู้ให้บริการที่คุณเปิด “แชร์คำค้นเพื่อการวิจัย” เท่านั้น นโยบายความเป็นส่วนตัว →", - "st.providers.webbrain_data_use.body": "WebBrain Compass มีโควตาใช้งานฟรีรายวัน ขณะที่ “ช่วยปรับปรุง WebBrain” เปิดไว้เป็นค่าเริ่มต้น การสนทนา Compass บางรายการอาจถูกเก็บและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก ปิดได้ที่ ทั่วไป → ขั้นสูง เพื่อไม่ให้การโต้ตอบ Compass ในอนาคตถูกใช้ในลักษณะดังกล่าว WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะเมื่อคุณเปิดตัวเลือก “แชร์คำค้นเพื่อการวิจัย” ของผู้ให้บริการรายนี้ {privacyLink} หากต้องการใช้งานเพิ่ม สมัครที่ {subscribeLink} จัดการการเรียกเก็บเงินที่ {accountLink}", + "st.providers.webbrain_data_use.body": "WebBrain Compass มีโควตาใช้งานฟรีรายวัน ขณะที่ “ช่วยปรับปรุง WebBrain” เปิดไว้เป็นค่าเริ่มต้น การสนทนา Compass บางรายการอาจถูกเก็บและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก ปิดได้ที่ การตั้งค่า → ขั้นสูง เพื่อไม่ให้การโต้ตอบ Compass ในอนาคตถูกใช้ในลักษณะดังกล่าว WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะเมื่อคุณเปิดตัวเลือก “แชร์คำค้นเพื่อการวิจัย” ของผู้ให้บริการรายนี้ {privacyLink} หากต้องการใช้งานเพิ่ม สมัครที่ {subscribeLink} จัดการการเรียกเก็บเงินที่ {accountLink}", 'st.providers.share_research.label': "แชร์คำค้นเพื่อการวิจัย", 'st.providers.share_research.hint': "ส่งพรอมต์และการตอบกลับจากผู้ให้บริการรายนี้ไปยัง WebBrain เพื่อประเมินและปรับปรุง รวมถึงชื่อผู้ให้บริการและโมเดลที่ใช้ รูปภาพและไฟล์แนบไบนารีจะถูกลบออกและข้อความจะถูกตัดทอนก่อนแชร์ ข้อความที่เหลือจะถูกส่งไปตามที่เป็น", 'st.providers.share_research.confirm': "แชร์คำค้นจากผู้ให้บริการรายนี้กับ WebBrain เพื่อการวิจัยหรือไม่?\n\nเมื่อเปิดใช้ พรอมต์ การตอบกลับ และการโต้ตอบเครื่องมือของคุณกับผู้ให้บริการรายนี้จะถูกส่งไปยัง WebBrain เพื่อประเมินและปรับปรุง พร้อมชื่อผู้ให้บริการและโมเดล ข้อความจะถูกส่งตามที่เป็นหลังลบรูปภาพและตัดทอนเนื้อหายาว ดังนั้นโปรดหลีกเลี่ยงการแชร์ข้อมูลส่วนบุคคลที่ละเอียดอ่อน คุณสามารถปิดได้ทุกเมื่อเพื่อหยุดการแชร์ในอนาคต", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "ต้องการให้ขัดจังหวะน้อยลงไหม? “อนุญาตเสมอ” จะจดจำเว็บไซต์นี้ คำสั่งด้านล่างจะปิดการถามสิทธิ์ของ WebBrain ในทุกเว็บไซต์", "sp.perm.insert_skip_command": "แทรก /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "แบบร่างของคุณยังไม่เปลี่ยน โปรดล้างก่อนแทรกคำสั่ง", - "ob.act.permissions_tip": "การถามสิทธิ์เปิดอยู่ตามค่าเริ่มต้น ผู้ใช้ขั้นสูงสามารถปิดทั่วโลกด้วย /dangerously-skip-permissions และเปิดอีกครั้งได้ที่ การตั้งค่า → สิทธิ์", + "ob.act.permissions_tip": "การถามสิทธิ์เปิดอยู่ตามค่าเริ่มต้น ผู้ใช้ขั้นสูงสามารถปิดทั่วโลกด้วย /dangerously-skip-permissions และเปิดอีกครั้งได้จากปุ่ม ⚠ ข้างไมโครโฟน", 'st.provider.field.cache_read_cost_per_million': "ค่าอ่านแคชโดยประมาณ ($ / 1 ล้านโทเค็น)", 'st.provider.field.cache_write_cost_per_million': "ค่าการเขียนแคช 5 นาทีโดยประมาณ ($ / 1 ล้านโทเค็น)", 'st.provider.field.cache_write_1h_cost_per_million': "ค่าการเขียนแคช 1 ชั่วโมงโดยประมาณ ($ / 1 ล้านโทเค็น)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "แทนที่สำเนาบนคลาวด์ที่เข้ารหัสด้วยการตั้งค่า WebBrain ปัจจุบันของอุปกรณ์นี้หรือไม่", "st.sync.consent.legacy": "เปิดการซิงค์ที่เข้ารหัสไหม WebBrain จะส่งสำเนาความทรงจำของคุณ การกรอกโปรไฟล์อัตโนมัติ และการตั้งค่าผู้ให้บริการคีย์ API ที่เข้ารหัสจากต้นทางถึงปลายทางไปยัง WebBrain Compass ประวัติการแชทและการลงชื่อเข้าใช้ OAuth จะไม่ซิงค์กัน", "st.sync.consent.denied": "ไม่ได้รับสิทธิ์การซิงค์ที่เข้ารหัส", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/tl.js b/src/chrome/src/ui/locales/tl.js index 050bdfea2d..116a988b8b 100644 --- a/src/chrome/src/ui/locales/tl.js +++ b/src/chrome/src/ui/locales/tl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Bawasan ang zoom ng UI ng extension', 'sp.ui_scale.increase': 'Dagdagan ang zoom ng UI ng extension', 'sp.ui_scale.reset': 'I-reset', - 'st.display.ui_scale.label': 'Pag-zoom ng UI ng extension', - 'st.display.ui_scale.decrease': 'Bawasan ang zoom ng UI ng extension', - 'st.display.ui_scale.increase': 'Dagdagan ang zoom ng UI ng extension', - 'st.display.ui_scale.reset': 'I-reset', - 'st.display.ui_scale.desc': 'Baguhin ang laki ng side panel at hiwalay na chat window nang hindi binabago ang page zoom.', - 'st.display.ui_scale.shortcuts': 'Mga nakatalagang shortcut: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Hindi nakatalaga', - 'st.display.ui_scale.manage_shortcuts': 'I-customize ang mga shortcut', 'tool.delegate_research': 'Nagsasaliksik gamit ang ChatGPT', 'st.display.research_escalation.label': 'Pag-escalate ng pananaliksik', 'st.display.research_escalation.desc': 'Kapag pinagana, maaaring humingi ng pahintulot ang WebBrain bago magpadala ng napakakomplikadong read-only na prompt sa pananaliksik sa ChatGPT. Naka-off bilang default. Ibinabahagi lamang ang eksaktong prompt pagkatapos ng iyong tahasang pag-apruba.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Huwag ituloy", "sp.recipient.reason_unrequested": "Hindi matiyak ng WebBrain mula sa iyong kahilingan na dapat magpadala ng mensahe. Ang bukas na usapan sa {host} ay kay {recipient}.", "sp.recipient.reason_unnamed": "Hindi matiyak ng WebBrain mula sa iyong kahilingan kung sino ang dapat makatanggap ng mensaheng ito. Ang bukas na usapan sa {host} ay kay {recipient}.", - 'st.tab.permissions': "Mga pahintulot", 'st.perms.revoke': "Bawiin", 'st.perms.clear_all': "I-clear ang lahat ng pahintulot", 'st.perms.gate.label': "Magtanong bago ang mahahalagang aksyon", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Magsimula', 'ob.btn.skip': 'Laktawan muna', 'ob.btn.start': 'Magsimula', - 'ob.cloud.body': 'Ang WebBrain Compass ay handa na may libreng lingguhang na alokasyon. Maaaring manatili at gamitin ang mga napiling Compass na pakikipag-usap upang mapahusay ang WebBrain habang ang Tulong sa Pagsasapa ng WebBrain ay naka-on sa default. Maaari mong ito sa Settings → General.', + 'ob.cloud.body': 'Ang WebBrain Compass ay handa na may libreng lingguhang na alokasyon. Maaaring manatili at gamitin ang mga napiling Compass na pakikipag-usap upang mapahusay ang WebBrain habang ang Tulong sa Pagsasapa ng WebBrain ay naka-on sa default. Maaari mong ito sa Settings → Advanced.', 'ob.cloud.change': 'Baguhin', 'ob.cloud.using': 'Gumagamit ng WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Resulta', 'sp.api.enabled_html': '🔓 Naka-enable ang mga pagbabago sa API para sa pag-uusap na ito. Maaari nang gamitin ng ahente ang POST/PUT/PATCH/DELETE sa pamamagitan ng fetch_url at execute_js kapag sa tingin niyang mas maaasahan ang API kaysa UI para sa isang hakbang. UI-first pa rin ang default. Maaaclear ang flag na ito kapag ni-reset mo ang pag-uusap.', - 'sp.permissions.disabled_html': '⚠️ Naka-off ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, magre-record, at mag-iskedyul ng mga gawaing hinaharap ang WebBrain nang hindi nagtatanong. I-enable muli mula sa Mga Setting → Mga Pahintulot → Magtanong bago ang mahahalagang aksyon.', + 'sp.permissions.disabled_html': '⚠️ Naka-off ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, magre-record, at mag-iskedyul ng mga gawaing hinaharap ang WebBrain nang hindi nagtatanong. I-enable muli mula sa ⚠ button sa tabi ng mikropono.', 'sp.permissions.button': 'Mga prompt ng pahintulot: naka-on', 'sp.permissions.button_off': 'Mga prompt ng pahintulot: naka-off', 'sp.permissions.gate_desc': 'Nagtatanong ang WebBrain sa unang beses na ito ay mag-click, mag-type, mag-download o magpatakbo ng code sa isang site.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Naghihintay sa "{selector}"', 'st.title': 'Mga Setting ng WebBrain', - 'st.subtitle': 'I-configure ang iyong mga LLM provider at preference · v{version}', + 'st.subtitle': 'I-configure kung paano gumagana ang WebBrain · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Mga Badyet', + 'st.tab.advanced': 'Advanced', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Pagsasalita', + 'st.tab.generative': 'Generative', + 'st.tab.decision': 'Decision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Mga Provider ng WebBrain', + 'st.providers_page.subtitle': 'Piliin ang mga model na ginagamit ng WebBrain · v{version}', + 'st.permissions_page.title': 'Mga Pahintulot ng WebBrain', + 'st.permissions_page.subtitle': 'Mga site kung saan puwedeng kumilos ang WebBrain nang hindi muna nagtatanong', 'st.tab.providers': 'Mga Provider', 'st.tab.vision': 'Bisyon', 'st.tab.profile': 'Profile', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "I-update ang paraan ng pagbabayad", 'st.account.manage_billing': 'Pamahalaan ang pagsingil', - 'st.display.language.label': 'Wika', - 'st.display.language.desc': 'Wika ng interface para sa WebBrain plugin.', 'st.display.verbose.label': 'Verbose Mode', 'st.display.verbose.desc': 'Ipakita ang buong detalye ng mga tool call, argument, at raw JSON na resulta. Naka-off bilang default para sa mas malinis na chat experience.', 'st.display.selection_shortcut.label': 'Shortcut sa pagpili', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Auto-screenshot', "st.display.auto_screenshot.desc": "Awtomatikong kumuha ng screenshot ng viewport pagkatapos kumilos ang ahente sa pahina para makita ng napiling vision route ang pagbabago. Mas maraming token ang gagamitin nito. Kung walang vision, lalaktawan ang enrichment at magpapatuloy ang gawain na may status notice.", 'st.display.auto_screenshot.off': 'Naka-off', - 'st.display.auto_screenshot.navigation': 'Kapag nag-navigate', - 'st.display.auto_screenshot.state_change': 'Kapag nagbago ang state (default)', + 'st.display.auto_screenshot.navigation': 'Kapag nag-navigate (default)', + 'st.display.auto_screenshot.state_change': 'Kapag nagbago ang state', 'st.display.auto_screenshot.every_step': 'Bawat hakbang', 'st.display.tracing.label': 'I-record ang mga trace (para sa paghahambing ng modelo)', - 'st.display.tracing.desc_html': 'I-save ang bawat run (mga LLM request, response, tool call, screenshot) sa lokal na IndexedDB para maaari mong suriin at ihambing ang mga modelo nang magkatabi. Bumubukas sa hiwalay na Traces tab. Naka-off bilang default dahil nagdadagdag ito ng disk writes kada hakbang. Buksan ang Traces page →', - 'st.display.lossless_tracing.label': 'Itala ang buong detalye ng kahilingan (antas ng debug)', - 'st.display.lossless_tracing.desc_html': 'Iniimbak din ang buong prompt, mensahe, at schema ng tool ng bawat LLM request sa halip na buod na walang nilalaman, at nagpapanatili ng hanggang 200 KB ng bawat resulta ng tool. Nagbibigay-daan sa malalim na pag-debug at muling pagbuo ng request. Naka-off bilang default dahil isinusulat nito ang nilalaman ng iyong usapan nang lokal at gumagamit ng mas malaking disk. Nangangailangan ng naka-on na pag-record ng trace.', + 'st.display.tracing.desc_html': 'I-save ang bawat run (mga LLM request, response, tool call, screenshot) sa lokal na IndexedDB para masuri at maihambing mo ang mga modelo nang magkatabi, kasama ang buong prompt, mensahe, at schema ng tool ng bawat LLM request at hanggang 200 KB ng bawat resulta ng tool. Bumubukas sa hiwalay na Traces tab. Naka-off bilang default dahil isinusulat nito ang nilalaman ng iyong usapan nang lokal at gumagamit ng mas malaking disk. Buksan ang Traces page →', 'st.display.allow_local_network.label': 'Pahintulutan ang ahente na ma-access ang lokal na network', 'st.display.allow_local_network.desc': 'Hinahayaan ang fetch_url tool ng ahente na maabot ang loopback (127.0.0.1, localhost) at mga private/RFC1918 address (10.x, 192.168.x, 172.16–31.x). Mainam para sa mga lokal na dev server, intranet tool, o self-hosted API. Naka-off bilang default. Kapag naka-off, naka-block ang mga URL na may direktang nakasulat na private o loopback IP at mga pangalang localhost. Hindi sinusuri ang DNS resolution, kaya maaari pa ring makarating sa lokal na address ang ibang hostname. Naka-block pa rin kahit naka-on ang literal na cloud-metadata IP (169.254.169.254) at mga nakalistang metadata o *.internal/*.local hostname.', 'st.display.notify_sound.label': "Mga tunog ng abiso", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Vision mode naka-enable para sa aktibong provider.", "sp.vision.off": "Vision mode naka-disable para sa aktibong provider.", "sp.vision.error": "Nabigo ang vision toggle: {msg}", - "st.tab.multimodal": "Mga Pantulong na Modelo", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Inirerekomenda. Kapag naka-on, humihingi ng pahintulot ang WebBrain sa unang pagkakataong mag-click, mag-type, mag-navigate, magpatakbo ng JavaScript, mag-upload, mag-download, o mag-record ito sa isang site (at saka tinatandaan ang iyong pinili). I-off para sa mabilis at walang prompt na paggamit sa mga site na lubos mong pinagkakatiwalaan.", "st.perms.gate.warning": "⚠️ Naka-OFF ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, at magre-record ang WebBrain sa anumang site nang HINDI nagtatanong — kasama na ang mga pahinang ang nilalaman ay maaaring kontrolado ng attacker. Itinuturing pa ring untrusted ang nilalaman ng pahina sa loob, ngunit walang pipigil sa isang injected na tagubilin na mag-trigger ng aksyon. Iwang naka-off lamang ito kung lubos mong pinagkakatiwalaan ang bawat site na ginagamitan mo ng assistant.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Default ng system", "st.display.download_directory.error": "Gumamit ng relative na folder tulad ng WebBrain o Work/WebBrain. Hindi pinapayagan ang absolute path at “..”.", "st.display.strict_secret.label": "Mahigpit na paghawak ng lihim", - "st.display.strict_secret.desc": "Tanggihang i-quote ang mga kredensyal (password, API key, token, OTPs) sa mga summary o teksto ng assistant — kahit hayagan mong hilingin ang mga ito. Mainam kung madalas kang magbahagi ng trace files o screen-share. Naka-off bilang default para maulit ng ahente ang eksaktong halaga na hihilingin mo kapag kailangan mo ito. I-on ito (Settings → Security) kapag nais mong manatiling malinis ang mga `done` na summary at hindi na maulit ang mga kredensyal.", + "st.display.strict_secret.desc": "Tanggihang i-quote ang mga kredensyal (password, API key, token, OTPs) sa mga summary o teksto ng assistant — kahit hayagan mong hilingin ang mga ito. Mainam kung madalas kang magbahagi ng trace files o screen-share. Naka-off bilang default para maulit ng ahente ang eksaktong halaga na hihilingin mo kapag kailangan mo ito. I-on ito kapag nais mong manatiling malinis ang mga `done` na summary at hindi na maulit ang mga kredensyal.", "st.display.request_timeout.label": "Timeout ng LLM request", "st.display.request_timeout.desc": "Pinakamatagal na paghihintay sa mga header ng tugon at sa bawat pagitan ng mga bahagi ng streaming na tugon. Default: 120 segundo. Dagdagan ito para sa mababagal na lokal na modelo, lalo na kung gumagamit ng CPU o malaking konteksto.", "st.providers.filter.all": "Lahat", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Nakapila ang mga mensahe habang abala ang WebBrain. Tanging /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, at /verbose ang maaaring tumakbo agad bilang mga slash command.', 'tool.go_back': 'Bumabalik', 'tool.go_forward': 'Sumusulong', - 'st.display.search.placeholder': 'Maghanap sa General na mga setting', - 'st.display.search.empty': 'Walang tugmang General na mga setting.', + 'st.display.search.placeholder': 'Maghanap sa mga setting', + 'st.display.search.empty': 'Walang tugmang setting.', 'st.display.advanced': 'Advanced', ...getApocalypseModeCopy('tl'), ...getEmergencyBoxCopy('tl'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Walang naka-save na memory na may ganoong ID.", "st.memory.security_html": "Privacy: naka-store bilang plain text ang memory ng user sa browser profile na ito. Kapag naka-enable, ipinapadala ang mga aktibong memory record sa naka-configure mong LLM provider bilang bahagi ng system prompt. Huwag mag-store dito ng mga password, API key, token, recovery code, o sensitibong lihim.", "hist.filter.clear": "I-clear ang filter at ipakita ang lahat ng pag-uusap", - "st.redaction.heading": "Pagbura sa mga screenshot", "st.redaction.toggle.label": "Burahin ang sensitibong nilalaman sa mga screenshot", "st.redaction.toggle.desc": "Bago ipadala ang isang screenshot sa isang vision model, binuburahin nito ang mga form field at tekstong mukhang email o numero ng telepono. Tumatakbo ang detection nang buo sa iyong device — walang karagdagang ipinapadala.", "st.redaction.warning": "⚠️ Best-effort at fail-open ito: kung hindi matakbo ang pagbura sa isang page (halimbawa, agad pagkatapos mag-navigate, sa mga PDF viewer, o sa mga restricted browser page), ipapadala pa rin ang screenshot nang hindi nabura. Gumagamit lang ang detection ng DOM heuristics — puwedeng makalusot ang tekstong iginuhit sa canvas, personal na impormasyon sa loob ng mga larawan, o anumang hindi nakikilalang form field o email/phone text, at hindi binubura ng setting na ito ang text ng page na ipinapadala sa model. Hindi ito garantiya ng seguridad. Para sa ganap na privacy, gumamit ng local/offline model (llama.cpp, Ollama): hindi na aalis sa iyong device ang mga screenshot at hindi na kailangan ang pagbura.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "I-export ang buong naka-save na trace session bilang JSON, kasama ang mga screenshot", "sp.export_traces.recording_truncated": "Na-export bilang JSON ang lahat ng naka-save na tala. Hindi maibabalik sa pag-export ang nilalamang hindi naisama habang nagre-record.", "sp.slash.export_traces": "I-export ang tool chain (mga trace)", - "sp.export_traces.none": "Walang trace para sa usapang ito. I-on ang Record traces sa Settings, pagkatapos ay patakbuhin muli.", + "sp.export_traces.none": "Walang trace para sa usapang ito. I-on ang Record traces sa Settings → Advanced, pagkatapos ay patakbuhin muli.", "sp.export_traces.error": "Hindi ma-export ang mga trace.", "sp.export_traces.done": "Na-export na ang tool chain.", "sp.export_traces.no_conversation": "Wala pang mae-export — magsimula muna ng usapan.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Gamitin ang WebBrain bilang pahina ng bagong tab", "st.display.newtab.desc": "Ang mga bagong tab ay magbubukas ng pahina ng WebBrain na may kahon para magtanong, kumilos, o maghanap. I-off ito para panatilihin ang karaniwang pahina ng bagong tab ng iyong browser; maaari mo itong baguhin anumang oras sa Mga Setting → Pangkalahatan.", "st.display.help_improve.desc_html": "Payagan ang piling interaksyon sa WebBrain Compass na mapanatili at magamit para sa pagsusuri, pagpapahusay, fine-tuning, at training. Naka-on bilang default. I-off ito upang hindi magamit ang mga susunod na interaksyon sa Compass para sa mga layuning iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API mula sa mga provider kung saan mo binuksan ang “Ibahagi ang mga query para sa pananaliksik”. Patakaran sa privacy →", - "st.providers.webbrain_data_use.body": "Kasama ang libreng pang-araw-araw na paggamit ng WebBrain Compass. Habang naka-on bilang default ang Tumulong na Pahusayin ang WebBrain, maaaring panatilihin at gamitin ang piling pag-uusap sa Compass para sa pagsusuri, pagpapahusay, fine-tuning, at training. I-off ito sa General → Advanced upang hindi maisama ang mga susunod na interaksyon sa Compass sa mga paggamit na iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API kapag binuksan mo ang opsyong “Ibahagi ang mga query para sa pananaliksik” ng provider na ito. {privacyLink}. Para sa higit pang paggamit, mag-subscribe sa {subscribeLink}. Pamahalaan ang billing sa {accountLink}.", + "st.providers.webbrain_data_use.body": "Kasama ang libreng pang-araw-araw na paggamit ng WebBrain Compass. Habang naka-on bilang default ang Tumulong na Pahusayin ang WebBrain, maaaring panatilihin at gamitin ang piling pag-uusap sa Compass para sa pagsusuri, pagpapahusay, fine-tuning, at training. I-off ito sa Settings → Advanced upang hindi maisama ang mga susunod na interaksyon sa Compass sa mga paggamit na iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API kapag binuksan mo ang opsyong “Ibahagi ang mga query para sa pananaliksik” ng provider na ito. {privacyLink}. Para sa higit pang paggamit, mag-subscribe sa {subscribeLink}. Pamahalaan ang billing sa {accountLink}.", 'st.providers.share_research.label': "Ibahagi ang mga query para sa pananaliksik", 'st.providers.share_research.hint': "Ipinapadala ang mga prompt at tugon mula sa provider na ito sa WebBrain para sa pagsusuri at pagpapabuti, kabilang ang provider at modelong ginamit. Tinatanggal ang mga larawan at binary na attachment at pinuputol ang teksto bago ibahagi; ang natitirang teksto ay ipinapadala nang apa adanya.", 'st.providers.share_research.confirm': "Ibabahagi ba ang mga query mula sa provider na ito sa WebBrain para sa pananaliksik?\n\nKapag naka-on, ang iyong mga prompt, tugon, at interaksyon sa tool sa provider na ito ay ipapadala sa WebBrain para sa pagsusuri at pagpapabuti, kasama ang pangalan ng provider at modelo. Ipinapadala ang teksto nang apa adanya pagkatapos tanggalin ang mga larawan at putulin ang mahahabang nilalaman, kaya iwasang magbahagi ng sensitibong personal na datos. Maaari mo itong patayin anumang oras upang ihinto ang pagbabahagi.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Gusto mo ng mas kaunting pagkaantala? Tinatandaan ng “Palaging payagan” ang site na ito. Ino-off ng command sa ibaba ang mga permission prompt ng WebBrain sa lahat ng site.", "sp.perm.insert_skip_command": "Ilagay ang /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Hindi binago ang draft mo. I-clear ito bago ilagay ang command.", - "ob.act.permissions_tip": "Naka-on bilang default ang mga permission prompt. Maaaring i-off ng advanced users ang mga ito sa lahat ng site gamit ang /dangerously-skip-permissions at i-on muli sa Settings → Permissions.", + "ob.act.permissions_tip": "Naka-on bilang default ang mga permission prompt. Maaaring i-off ng advanced users ang mga ito sa lahat ng site gamit ang /dangerously-skip-permissions at i-on muli mula sa ⚠ button sa tabi ng mikropono.", 'st.provider.field.cache_read_cost_per_million': "Tinatayang gastos sa pagbasa ng cache ($ / 1M token)", 'st.provider.field.cache_write_cost_per_million': "Tinatayang gastos sa 5 minutong pagsulat ng cache ($ / 1M token)", 'st.provider.field.cache_write_1h_cost_per_million': "Tinatayang gastos sa 1 oras na pagsulat ng cache ($ / 1M token)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Palitan ang naka-encrypt na cloud copy ng kasalukuyang setup ng WebBrain ng device na ito?", "st.sync.consent.legacy": "I-on ang naka-encrypt na pag-sync? Magpapadala ang WebBrain ng end-to-end na naka-encrypt na kopya ng iyong mga alaala, profile autofill, at API-key na mga setting ng provider sa WebBrain Compass. Hindi naka-sync ang history ng chat at OAuth sign-in.", "st.sync.consent.denied": "Hindi ibinigay ang naka-encrypt na pahintulot sa pag-sync.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/tr.js b/src/chrome/src/ui/locales/tr.js index 9d78cafe0a..71c5635f90 100644 --- a/src/chrome/src/ui/locales/tr.js +++ b/src/chrome/src/ui/locales/tr.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Uzantı arayüzünü uzaklaştır', 'sp.ui_scale.increase': 'Uzantı arayüzünü yakınlaştır', 'sp.ui_scale.reset': 'Sıfırla', - 'st.display.ui_scale.label': 'Uzantı arayüzü yakınlaştırması', - 'st.display.ui_scale.decrease': 'Uzantı arayüzünü uzaklaştır', - 'st.display.ui_scale.increase': 'Uzantı arayüzünü yakınlaştır', - 'st.display.ui_scale.reset': 'Sıfırla', - 'st.display.ui_scale.desc': 'Sayfa yakınlaştırmasını değiştirmeden yan paneli ve ayrı sohbet penceresini yeniden boyutlandırın.', - 'st.display.ui_scale.shortcuts': 'Özel kısayollar: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Atanmamış', - 'st.display.ui_scale.manage_shortcuts': 'Kısayolları özelleştir', 'tool.delegate_research': 'ChatGPT ile araştırılıyor', 'st.display.research_escalation.label': 'Araştırmayı devretme', 'st.display.research_escalation.desc': 'Etkinleştirildiğinde WebBrain, olağandışı derecede karmaşık salt okunur bir araştırma istemini ChatGPT’ye göndermeden önce izin isteyebilir. Varsayılan olarak kapalıdır. İstemin tam metni yalnızca açık onayınızdan sonra paylaşılır.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Devam etme", "sp.recipient.reason_unrequested": "WebBrain isteğinden bir mesaj gönderilmesi gerektiğini anlayamadı. {host} üzerinde açık olan sohbet: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain isteğinden bu mesajın kime gideceğini anlayamadı. {host} üzerinde açık olan sohbet: {recipient}.", - 'st.tab.permissions': "İzinler", 'st.tab.skills': 'Skills', 'st.perms.revoke': "Kaldır", 'st.perms.clear_all': "Tüm izinleri temizle", @@ -274,7 +265,7 @@ export default { 'ob.btn.done': 'Başlayın', 'ob.btn.skip': 'Şimdilik atla', 'ob.btn.start': 'Başla', - 'ob.cloud.body': 'WebBrain Compass haftalık ücretsiz tahsis ile hazır. Seçilen Compass sohbetleri, WebBrain\'i Geliştir Yardımı varsayılan olarak açıkken WebBrain\'i geliştirmek için saklanabilir ve kullanılabilir. Bunu Ayarlar → Genel olarak kapatabilirsiniz.', + 'ob.cloud.body': "WebBrain Compass haftalık ücretsiz tahsis ile hazır. Seçilen Compass sohbetleri, WebBrain'i Geliştir Yardımı varsayılan olarak açıkken WebBrain'i geliştirmek için saklanabilir ve kullanılabilir. Bunu Ayarlar → Gelişmiş bölümünden kapatabilirsiniz.", 'ob.cloud.change': 'Değiştir', 'ob.cloud.using': 'WebBrain Compass kullanılıyor.', @@ -370,7 +361,7 @@ export default { 'sp.step.result_label': 'Sonuç', 'sp.api.enabled_html': '🔓 Bu konuşma için API mutasyonları etkin. Aracı artık bir adım için API\'nin arayüzden daha güvenilir olduğuna karar verirse fetch_url ve execute_js üzerinden POST/PUT/PATCH/DELETE kullanabilir. Varsayılan yine arayüz öncelikli kalır. Bu bayrak konuşmayı sıfırladığında temizlenir.', - 'sp.permissions.disabled_html': '⚠️ İzin istemleri KAPALI. WebBrain, sormadan tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek, kayıt yapacak ve gelecek işleri zamanlayacaktır. Bunu Ayarlar → İzinler → Önemli işlemlerden önce sor ayarlarından yeniden etkinleştirin.', + 'sp.permissions.disabled_html': '⚠️ İzin istemleri KAPALI. WebBrain, sormadan tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek, kayıt yapacak ve gelecek işleri zamanlayacaktır. Bunu mikrofonun yanındaki ⚠ düğmesinden yeniden etkinleştirin.', 'sp.permissions.button': 'İzin istemleri: açık', 'sp.permissions.button_off': 'İzin istemleri: kapalı', 'sp.permissions.gate_desc': 'WebBrain bir sitede ilk kez tıklarken, yazarken, indirirken veya kod çalıştırırken izin ister.', @@ -451,8 +442,19 @@ export default { 'tool.wait_for_element.selector': '«{selector}» bekleniyor', 'st.title': 'WebBrain Ayarları', - 'st.subtitle': 'LLM sağlayıcılarını ve tercihleri yapılandır · v{version}', + 'st.subtitle': "WebBrain'in nasıl çalıştığını yapılandır · v{version}", 'st.tab.display': 'Genel', + 'st.tab.budgets': 'Bütçeler', + 'st.tab.advanced': 'Gelişmiş', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Konuşma', + 'st.tab.generative': 'Üretken', + 'st.tab.decision': 'Karar', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain Sağlayıcıları', + 'st.providers_page.subtitle': "WebBrain'in kullandığı modelleri seç · v{version}", + 'st.permissions_page.title': 'WebBrain İzinleri', + 'st.permissions_page.subtitle': "WebBrain'in önce sormadan işlem yapabileceği siteler", 'st.tab.providers': 'Sağlayıcılar', 'st.tab.vision': 'Görme', 'st.tab.profile': 'Profil', @@ -468,8 +470,6 @@ export default { 'st.account.update_payment': 'Ödeme yöntemini güncelle', 'st.account.manage_billing': 'Faturalandırmayı yönet', - 'st.display.language.label': 'Dil', - 'st.display.language.desc': 'WebBrain eklentisinin arayüz dili.', 'st.display.verbose.label': 'Ayrıntılı mod', 'st.display.verbose.desc': 'Tüm araç çağrı ayrıntılarını, argümanları ve ham JSON sonuçlarını gösterir. Daha temiz bir sohbet deneyimi için varsayılan olarak kapalıdır.', 'st.display.selection_shortcut.label': 'Seçim kısayolu', @@ -483,13 +483,11 @@ export default { 'st.display.auto_screenshot.label': 'Otomatik ekran görüntüsü', "st.display.auto_screenshot.desc": "Aracı sayfada işlem yaptıktan sonra görüntüleme alanının ekran görüntüsünü otomatik olarak alır; böylece seçilen görüntü rotası değişikliği görebilir. Daha fazla token tüketir. Görüntü işleme kullanılamıyorsa zenginleştirme atlanır ve görev bir durum bildirimiyle devam eder.", 'st.display.auto_screenshot.off': 'Kapalı', - 'st.display.auto_screenshot.navigation': 'Gezinmede', - 'st.display.auto_screenshot.state_change': 'Durum değiştiğinde (varsayılan)', + 'st.display.auto_screenshot.navigation': 'Gezinmede (varsayılan)', + 'st.display.auto_screenshot.state_change': 'Durum değiştiğinde', 'st.display.auto_screenshot.every_step': 'Her adımda', 'st.display.tracing.label': 'İzleri kaydet (model karşılaştırması için)', - 'st.display.tracing.desc_html': 'Her çalışmayı (LLM istekleri, yanıtlar, araç çağrıları, ekran görüntüleri) yerel IndexedDB\'de saklar, böylece modelleri yan yana inceleyip karşılaştırabilirsin. Ayrı bir İzler sekmesinde açılır. Her adımda diske yazdığı için varsayılan olarak kapalıdır. İzler sayfasını aç →', - 'st.display.lossless_tracing.label': 'Tüm istek ayrıntılarını kaydet (hata ayıklama katmanı)', - 'st.display.lossless_tracing.desc_html': 'Her LLM isteğinin tam prompt, mesaj ve araç şemalarını içeriksiz özetler yerine de kalıcı olarak kaydeder ve her araç sonucundan en fazla 200 KB tutar. Derin hata ayıklama ve istek yeniden yapılandırmasını sağlar. Varsayılan olarak kapalıdır çünkü konuşma içeriğinizi yerel olarak yazar ve çok daha fazla disk kullanır. İz kaydının açık olmasını gerektirir.', + 'st.display.tracing.desc_html': "Her çalışmayı (LLM istekleri, yanıtlar, araç çağrıları, ekran görüntüleri) yerel IndexedDB'de saklar, böylece modelleri yan yana inceleyip karşılaştırabilirsin; her LLM isteğinin tam prompt, mesaj ve araç şemaları ile her araç sonucundan en fazla 200 KB da kaydedilir. Ayrı bir İzler sekmesinde açılır. Konuşma içeriğini yerel olarak yazdığı ve çok daha fazla disk kullandığı için varsayılan olarak kapalıdır. İzler sayfasını aç →", 'st.display.allow_local_network.label': 'Aracının yerel ağa erişmesine izin ver', 'st.display.allow_local_network.desc': 'Aracının fetch_url aracının loopback (127.0.0.1, localhost) ve özel/RFC1918 adreslerine (10.x, 192.168.x, 172.16–31.x) ulaşmasına izin verir. Yerel geliştirme sunucuları, intranet araçları veya kendi sunucundaki API\'lar için kullanışlıdır. Varsayılan olarak kapalıdır. Kapalıyken özel veya loopback IP adresi doğrudan yazılmış URL’ler ve localhost adları engellenir. DNS çözümlemesi denetlenmez; diğer ana makine adları yerel adreslere ulaşabilir. Doğrudan yazılmış bulut meta-veri IP adresleri (169.254.169.254) ile listedeki meta-veri adları veya *.internal/*.local adları açıkken de engellenir.', 'st.display.notify_sound.label': "Bildirim sesleri", @@ -717,7 +715,6 @@ export default { "sp.vision.on": "Aktif sağlayıcı için görme kipi etkin.", "sp.vision.off": "Aktif sağlayıcı için görme kipi devre dışı.", "sp.vision.error": "Görme kipi değiştirilemedi: {msg}", - "st.tab.multimodal": "Yardımcı Modeller", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Önerilir. Açıkken WebBrain, bir sitede ilk kez tıkladığında, yazdığında, gezindiğinde, JavaScript çalıştırdığında, dosya yüklediğinde, indirdiğinde veya kayıt yaptığında izin ister (sonra seçimini hatırlar). Tamamen güvendiğin sitelerde hızlı, istemsiz kullanım için kapat.", "st.perms.gate.warning": "⚠️ İzin istemleri KAPALI. WebBrain herhangi bir sitede SORMADAN tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek ve kayıt yapacak — içeriği saldırgan kontrolünde olabilecek sayfalar dahil. Sayfa içeriği yine de dahili olarak güvenilmez kabul edilir, ama enjekte edilmiş bir talimatın bir işlemi tetiklemesini hiçbir şey engellemez. Bunu yalnızca asistanı kullandığın her siteye tamamen güveniyorsan kapalı bırak.", @@ -735,7 +732,7 @@ export default { "st.display.download_directory.placeholder": "Sistem varsayılanı", "st.display.download_directory.error": "WebBrain veya Work/WebBrain gibi göreli bir klasör kullanın. Mutlak yollara ve “..” kullanımına izin verilmez.", "st.display.strict_secret.label": "Katı gizli bilgi işleme", - "st.display.strict_secret.desc": "Özellikle istesen bile, özetlerde veya asistan metninde kimlik bilgilerini (parolalar, API anahtarları, jetonlar, OTP'ler) aktarmayı reddet. Düzenli olarak iz dosyaları paylaşıyorsan veya ekran paylaşımı yapıyorsan kullanışlıdır. Varsayılan olarak kapalı: böylece aracı, istediğin tam değeri ihtiyacın olduğunda yineleyebilir. `done` özetlerinin derli toplu kalmasını ve kimlik bilgilerinin asla tekrarlanmamasını istiyorsan aç (Ayarlar → Güvenlik).", + "st.display.strict_secret.desc": "Özellikle istesen bile, özetlerde veya asistan metninde kimlik bilgilerini (parolalar, API anahtarları, jetonlar, OTP'ler) aktarmayı reddet. Düzenli olarak iz dosyaları paylaşıyorsan veya ekran paylaşımı yapıyorsan kullanışlıdır. Varsayılan olarak kapalı: böylece aracı, istediğin tam değeri ihtiyacın olduğunda yineleyebilir. `done` özetlerinin derli toplu kalmasını ve kimlik bilgilerinin asla tekrarlanmamasını istiyorsan aç.", "st.display.request_timeout.label": "LLM istek zaman aşımı", "st.display.request_timeout.desc": "Yanıt başlıkları ve akıştaki yanıt parçaları arasındaki her duraklama için en uzun bekleme süresi. Varsayılan: 120 saniye. Yavaş yerel modellerde, özellikle CPU üzerinde veya büyük bağlamla çalışırken bu süreyi artırın.", "st.providers.filter.all": "Tümü", @@ -932,8 +929,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain meşgulken mesajlar kuyruğa alınır. Yalnızca /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces ve /verbose slash komutları olarak hemen çalışabilir.', 'tool.go_back': 'Geri gidiliyor', 'tool.go_forward': 'İleri gidiliyor', - 'st.display.search.placeholder': 'Genel ayarları ara', - 'st.display.search.empty': 'Eşleşen Genel ayar yok.', + 'st.display.search.placeholder': 'Ayarlarda ara', + 'st.display.search.empty': 'Eşleşen ayar yok.', 'st.display.advanced': 'Gelişmiş', ...getApocalypseModeCopy('tr'), ...getEmergencyBoxCopy('tr'), @@ -1163,7 +1160,6 @@ export default { "st.memory.reason.not_found": "Bu kimliğe sahip kaydedilmiş bellek yok.", "st.memory.security_html": "Gizlilik: kullanıcı belleği bu tarayıcı profilinde düz metin olarak saklanır. Etkinleştirildiğinde aktif bellek kayıtları, sistem isteminin bir parçası olarak yapılandırdığınız LLM sağlayıcısına gönderilir. Burada parola, API anahtarı, token, kurtarma kodu veya hassas gizli bilgi saklamayın.", "hist.filter.clear": "Filtreyi temizle ve tüm konuşmaları göster", - "st.redaction.heading": "Ekran görüntüsü sansürleme", "st.redaction.toggle.label": "Ekran görüntülerindeki hassas içeriği sansürle", "st.redaction.toggle.desc": "Bir ekran görüntüsü bir görüntü modeline gönderilmeden önce, form alanlarını ve e-posta ya da telefon numarasına benzeyen metni bulanıklaştırır. Algılama tamamen cihazınızda çalışır — fazladan hiçbir şey iletilmez.", "st.redaction.warning": "⚠️ En iyi çaba ilkesiyle çalışır ve fail-open'dır: sansürleme bir sayfada çalışamazsa (örneğin bir gezinmeden hemen sonra, PDF görüntüleyicilerde veya kısıtlı tarayıcı sayfalarında), ekran görüntüsü yine de sansürlenmeden gönderilir. Algılama yalnızca DOM sezgisel yöntemlerini kullanır — bir canvas üzerine çizilmiş metin, görsellerin içindeki kişisel veriler veya form alanı ya da e-posta/telefon metni olarak tanınmayan herhangi bir şey gözden kaçabilir; modele gönderilen sayfa metni de bu ayarla sansürlenmez. Bu bir güvenlik garantisi DEĞİLDİR. Tam gizlilik için yerel/çevrimdışı bir model kullanın (llama.cpp, Ollama): bu durumda ekran görüntüleri makinenizden hiç çıkmaz ve sansürleme gereksiz hale gelir.", @@ -1183,7 +1179,7 @@ export default { "sp.slash.export_traces_full": "Ekran görüntüleri dahil kaydedilmiş izleme oturumunun tamamını JSON olarak dışa aktar", "sp.export_traces.recording_truncated": "Kaydedilmiş tüm kayıtlar JSON olarak dışa aktarıldı. Kayıt sırasında atlanan içerikler dışa aktarılarak geri getirilemez.", "sp.slash.export_traces": "Araç zincirini dışa aktar (izler)", - "sp.export_traces.none": "Bu konuşma için iz yok. Ayarlar'da İzleri kaydet seçeneğini açıp yeniden çalıştırın.", + "sp.export_traces.none": "Bu konuşma için iz yok. Ayarlar → Gelişmiş bölümünde İzleri kaydet seçeneğini açıp yeniden çalıştırın.", "sp.export_traces.error": "İzler dışa aktarılamadı.", "sp.export_traces.done": "Araç zinciri dışa aktarıldı.", "sp.export_traces.no_conversation": "Henüz dışa aktarılacak bir şey yok — önce bir konuşma başlatın.", @@ -1193,7 +1189,7 @@ export default { "st.display.newtab.label": "WebBrain'i yeni sekme sayfam olarak kullan", "st.display.newtab.desc": "Yeni sekmeler; sormak, işlem yaptırmak veya arama yapmak için bir kutu içeren bir WebBrain sayfası açar. Tarayıcınızın normal yeni sekme sayfasını korumak için kapatın; istediğiniz zaman Ayarlar → Genel bölümünden değiştirebilirsiniz.", "st.display.help_improve.desc_html": "Seçili WebBrain Compass etkileşimlerinin saklanmasına ve değerlendirme, iyileştirme, ince ayar ve eğitim için kullanılmasına izin verin. Varsayılan olarak açıktır. Gelecekteki Compass etkileşimlerinin bu amaçlarla kullanılmasını önlemek için kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca “Araştırma için sorguları paylaş” seçeneğini açtığınız sağlayıcılardan toplar. Gizlilik politikası →", - "st.providers.webbrain_data_use.body": "Ücretsiz günlük WebBrain Compass kullanımı dahildir. WebBrain’i İyileştirmeye Yardım Et varsayılan olarak açıkken, seçili Compass konuşmaları değerlendirme, iyileştirme, ince ayar ve eğitim için saklanabilir ve kullanılabilir. Gelecekteki Compass etkileşimlerini bu kullanımların dışında tutmak için Genel → Gelişmiş bölümünden kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca ilgili sağlayıcıda “Araştırma için sorguları paylaş” seçeneğini açtığınızda toplar. {privacyLink}. Daha fazla kullanım için {subscribeLink} adresinden abone olun. Faturalandırmayı {accountLink} adresinden yönetin.", + "st.providers.webbrain_data_use.body": "Ücretsiz günlük WebBrain Compass kullanımı dahildir. WebBrain’i İyileştirmeye Yardım Et varsayılan olarak açıkken, seçili Compass konuşmaları değerlendirme, iyileştirme, ince ayar ve eğitim için saklanabilir ve kullanılabilir. Gelecekteki Compass etkileşimlerini bu kullanımların dışında tutmak için Ayarlar → Gelişmiş bölümünden kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca ilgili sağlayıcıda “Araştırma için sorguları paylaş” seçeneğini açtığınızda toplar. {privacyLink}. Daha fazla kullanım için {subscribeLink} adresinden abone olun. Faturalandırmayı {accountLink} adresinden yönetin.", 'st.providers.share_research.label': "Araştırma için sorguları paylaş", 'st.providers.share_research.hint': "Bu sağlayıcının sınırlı istemlerini, yanıtlarını, araç etkileşimlerini ve tanılama izi metaverilerini (adımlar, araç adları, durumlar, hatalar ve süreler) değerlendirme amacıyla WebBrain’e gönderir. Görseller ve ikili ekler kaldırılır; metin kısaltılır.", 'st.providers.share_research.confirm': "Bu sağlayıcının sorguları ve tanılama izleri araştırma için WebBrain ile paylaşılsın mı?\n\nAçıkken istemleriniz, yanıtlarınız, araç etkileşimleriniz ve başarısız çalıştırmalar dâhil sınırlı tanılama izi metaverileri (araç adları, durumlar, hatalar ve süreler) sağlayıcı ve model adıyla birlikte gönderilir. Ekran görüntüleri ve ikili ekler yüklenmez. Diğer metin kısaltıldıktan sonra olduğu gibi gönderilir; hassas kişisel veri paylaşmamaya dikkat edin. Gelecekteki paylaşımları durdurmak için bunu istediğiniz zaman kapatabilirsiniz.", @@ -1239,7 +1235,7 @@ export default { "sp.perm.skip_hint": "Daha az kesinti mi istiyorsunuz? “Her zaman izin ver” bu siteyi hatırlar. Aşağıdaki komut, WebBrain izin istemlerini tüm sitelerde kapatır.", "sp.perm.insert_skip_command": "/dangerously-skip-permissions komutunu ekle", "sp.perm.skip_hint_draft": "Taslağınız değişmedi. Komutu eklemeden önce taslağı temizleyin.", - "ob.act.permissions_tip": "İzin istemleri varsayılan olarak açıktır. İleri düzey kullanıcılar /dangerously-skip-permissions ile bunları tüm sitelerde kapatabilir ve Ayarlar → İzinler bölümünden yeniden açabilir.", + "ob.act.permissions_tip": "İzin istemleri varsayılan olarak açıktır. İleri düzey kullanıcılar /dangerously-skip-permissions ile bunları tüm sitelerde kapatabilir ve mikrofonun yanındaki ⚠ düğmesinden yeniden açabilir.", 'st.provider.field.cache_read_cost_per_million': "Tahmini önbellek okuma maliyeti ($ / 1M token)", 'st.provider.field.cache_write_cost_per_million': "Tahmini 5 dakikalık önbellek yazma maliyeti ($ / 1M token)", 'st.provider.field.cache_write_1h_cost_per_million': "Tahmini 1 saatlik önbellek yazma maliyeti ($ / 1M token)", @@ -1325,8 +1321,8 @@ export default { "st.sync.confirm.reset": "Şifrelenmiş bulut kopyası bu cihazın mevcut WebBrain kurulumuyla değiştirilsin mi?", "st.sync.consent.legacy": "Şifreli senkronizasyon açılsın mı? WebBrain, anılarınızın, profil otomatik doldurmanızın ve API anahtarı sağlayıcı ayarlarınızın uçtan uca şifrelenmiş bir kopyasını WebBrain Compass'a iletecektir. Sohbet geçmişi ve OAuth oturum açma işlemleri senkronize edilmez.", "st.sync.consent.denied": "Şifrelenmiş senkronizasyon izni verilmedi.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/uk.js b/src/chrome/src/ui/locales/uk.js index b7011be81c..80457b4ded 100644 --- a/src/chrome/src/ui/locales/uk.js +++ b/src/chrome/src/ui/locales/uk.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Зменшити інтерфейс розширення', 'sp.ui_scale.increase': 'Збільшити інтерфейс розширення', 'sp.ui_scale.reset': 'Скинути', - 'st.display.ui_scale.label': 'Масштаб інтерфейсу розширення', - 'st.display.ui_scale.decrease': 'Зменшити інтерфейс розширення', - 'st.display.ui_scale.increase': 'Збільшити інтерфейс розширення', - 'st.display.ui_scale.reset': 'Скинути', - 'st.display.ui_scale.desc': 'Змінює розмір бічної панелі й окремого вікна чату, не змінюючи масштаб сторінки.', - 'st.display.ui_scale.shortcuts': 'Спеціальні комбінації клавіш: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Не призначено', - 'st.display.ui_scale.manage_shortcuts': 'Налаштувати комбінації клавіш', 'tool.delegate_research': 'Дослідження за допомогою ChatGPT', 'st.display.research_escalation.label': 'Ескалація досліджень', 'st.display.research_escalation.desc': 'Якщо функцію ввімкнено, WebBrain може попросити дозвіл перед надсиланням до ChatGPT надзвичайно складного дослідницького запиту лише для читання. За замовчуванням вимкнено. Точний запит передається лише після вашої явної згоди.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Не продовжувати", "sp.recipient.reason_unrequested": "WebBrain не зміг зрозуміти з вашого запиту, що потрібно надіслати повідомлення. Відкрита розмова на {host}: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain не зміг зрозуміти з вашого запиту, кому надіслати це повідомлення. Відкрита розмова на {host}: {recipient}.", - 'st.tab.permissions': "Дозволи", 'st.perms.revoke': "Відкликати", 'st.perms.clear_all': "Очистити всі дозволи", 'st.perms.gate.label': "Питати перед важливими діями", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Почати', 'ob.btn.skip': 'Пропустити зараз', 'ob.btn.start': 'Почати', - 'ob.cloud.body': 'WebBrain Compass готовий з безкоштовним тижневим лімітом. Вибрані розмови Compass можуть бути збережені та використані для покращення WebBrain, поки Допомога в покращенні WebBrain увімкнена за замовчуванням. Ви можете вимкнути це в Налаштування → Загальне.', + 'ob.cloud.body': 'WebBrain Compass готовий з безкоштовним тижневим лімітом. Вибрані розмови Compass можуть бути збережені та використані для покращення WebBrain, поки Допомога в покращенні WebBrain увімкнена за замовчуванням. Ви можете вимкнути це в Налаштування → Розширені.', 'ob.cloud.change': 'Змінити', 'ob.cloud.using': 'Використовується WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Результат', 'sp.api.enabled_html': '🔓 Зміни через API ввімкнено для цього діалогу. Агент тепер може використовувати POST/PUT/PATCH/DELETE через fetch_url та execute_js, якщо вважає API надійнішим за інтерфейс. За замовчуванням пріоритет — інтерфейс. Цей прапор скидається після очищення діалогу.', - 'sp.permissions.disabled_html': '⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме, записуватиме та плануватиме майбутню роботу без попереднього запиту. Увімкніть знову в Налаштування → Дозволи → Питати перед важливими діями.', + 'sp.permissions.disabled_html': '⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме, записуватиме та плануватиме майбутню роботу без попереднього запиту. Увімкніть знову кнопкою ⚠ поруч із мікрофоном.', 'sp.permissions.button': 'Запити дозволів: увімкнено', 'sp.permissions.button_off': 'Запити дозволів: вимкнено', 'sp.permissions.gate_desc': 'WebBrain питає, коли вперше натискає, вводить текст, завантажує файли або запускає код на сайті.', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': 'Очікування «{selector}»', 'st.title': 'Налаштування WebBrain', - 'st.subtitle': 'Налаштуйте провайдерів LLM та параметри · v{version}', + 'st.subtitle': 'Налаштуйте роботу WebBrain · v{version}', 'st.tab.display': 'Загальні', + 'st.tab.budgets': 'Бюджети', + 'st.tab.advanced': 'Розширені', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Мовлення', + 'st.tab.generative': 'Генерація', + 'st.tab.decision': 'Рішення', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Провайдери WebBrain', + 'st.providers_page.subtitle': 'Виберіть моделі, які використовує WebBrain · v{version}', + 'st.permissions_page.title': 'Дозволи WebBrain', + 'st.permissions_page.subtitle': 'Сайти, де WebBrain може діяти, не питаючи спершу', 'st.tab.providers': 'Провайдери', 'st.tab.vision': 'Зір', 'st.tab.profile': 'Профіль', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "Оновити спосіб оплати", 'st.account.manage_billing': 'Керування оплатою', - 'st.display.language.label': 'Мова', - 'st.display.language.desc': 'Мова інтерфейсу плагіна WebBrain.', 'st.display.verbose.label': 'Детальний режим', 'st.display.verbose.desc': 'Показувати повні деталі викликів інструментів, аргументи та сирий JSON-результат. За замовчуванням вимкнено для чистішого чату.', 'st.display.selection_shortcut.label': 'Швидка дія для виділення', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': 'Авто-скриншот', "st.display.auto_screenshot.desc": "Автоматично робіть знімок області перегляду після дій агента, щоб вибраний маршрут обробки зображень бачив зміни. Це витрачає більше токенів. Якщо зір недоступний, збагачення пропускається, а завдання продовжується зі сповіщенням про стан.", 'st.display.auto_screenshot.off': 'Вимкнено', - 'st.display.auto_screenshot.navigation': 'Під час навігації', - 'st.display.auto_screenshot.state_change': 'При зміні стану (за замовчуванням)', + 'st.display.auto_screenshot.navigation': 'Під час навігації (за замовчуванням)', + 'st.display.auto_screenshot.state_change': 'При зміні стану', 'st.display.auto_screenshot.every_step': 'Кожен крок', 'st.display.tracing.label': 'Записувати траси (для порівняння моделей)', - 'st.display.tracing.desc_html': 'Зберігати кожен запуск (LLM-запити, відповіді, виклики інструментів, скриншоти) у локальну IndexedDB, щоб переглядати й порівнювати моделі поряд. Відкривається в окремій вкладці «Траси». За замовчуванням вимкнено, бо додає запис на диск на кожному кроці. Відкрити сторінку трас →', - 'st.display.lossless_tracing.label': 'Записувати повні деталі запитів (рівень налагодження)', - 'st.display.lossless_tracing.desc_html': 'Також зберігає повні промпти, повідомлення та схеми інструментів кожного LLM-запиту замість стислих зведень без вмісту, та тримає до 200 КБ кожного результату інструмента. Дає змогу глибокого налагодження та відтворення запитів. Вимкнено за замовчуванням, бо записує вміст вашої розмови локально та займає значно більше диска. Потребує увімкненого запису трас.', + 'st.display.tracing.desc_html': 'Зберігати кожен запуск (LLM-запити, відповіді, виклики інструментів, скриншоти) у локальну IndexedDB, щоб переглядати й порівнювати моделі поряд, включно з повними промптами, повідомленнями та схемами інструментів кожного LLM-запиту і до 200 КБ кожного результату інструмента. Відкривається в окремій вкладці «Траси». Вимкнено за замовчуванням, бо записує вміст вашої розмови локально та займає значно більше диска. Відкрити сторінку трас →', 'st.display.allow_local_network.label': 'Дозволити агенту доступ до локальної мережі', 'st.display.allow_local_network.desc': 'Дозволяє інструменту fetch_url агента звертатися до loopback (127.0.0.1, localhost) та приватних адрес RFC1918 (10.x, 192.168.x, 172.16–31.x). Корисно для локальних серверів розробки, інтранет-інструментів і self-hosted API. За замовчуванням вимкнено. У цьому стані блокуються URL із безпосередньо записаними приватними або loopback IP-адресами та імена localhost. Результат DNS не перевіряється, тому інші імена хостів можуть вести до локальних адрес. Безпосередньо записані IP-адреси метаданих хмари (169.254.169.254) і перелічені імена метаданих або *.internal/*.local залишаються заблокованими навіть після ввімкнення.', 'st.display.notify_sound.label': "Звуки сповіщень", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "Режим зору увімкнено для активного провайдера.", "sp.vision.off": "Режим зору вимкнено для активного провайдера.", "sp.vision.error": "Не вдалося перемкнути режим зору: {msg}", - "st.tab.multimodal": "Допоміжні моделі", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Рекомендовано. Коли увімкнено, WebBrain запитує дозвіл, коли вперше натискає, друкує, переходить, запускає JavaScript, вивантажує, завантажує або записує на сайті (а потім запам'ятовує ваш вибір). Вимкніть для швидкого використання без запитів на сайтах, яким ви повністю довіряєте.", "st.perms.gate.warning": "⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме й записуватиме на будь-якому сайті БЕЗ запитань — зокрема на сторінках, вміст яких може контролювати зловмисник. Вміст сторінок усе одно вважається ненадійним усередині, але ніщо не завадить впровадженій інструкції запустити дію. Залишайте це вимкненим лише якщо повністю довіряєте кожному сайту, на якому користуєтеся асистентом.", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "Системне значення", "st.display.download_directory.error": "Використовуйте відносну папку, наприклад WebBrain або Work/WebBrain. Абсолютні шляхи та «..» заборонені.", "st.display.strict_secret.label": "Суворе поводження з секретами", - "st.display.strict_secret.desc": "Відмовлятися наводити облікові дані (паролі, API-ключі, токени, OTP) у підсумках чи тексті асистента — навіть коли ви явно про них просите. Корисно, якщо ви регулярно ділитеся файлами трас або демонструєте екран. Вимкнено за замовчуванням, щоб агент міг повторити точне значення, яке ви попросите, коли воно вам потрібне. Увімкніть (Налаштування → Безпека), коли хочете, щоб підсумки `done` лишалися охайними, а облікові дані ніколи не повторювались.", + "st.display.strict_secret.desc": "Відмовлятися наводити облікові дані (паролі, API-ключі, токени, OTP) у підсумках чи тексті асистента — навіть коли ви явно про них просите. Корисно, якщо ви регулярно ділитеся файлами трас або демонструєте екран. Вимкнено за замовчуванням, щоб агент міг повторити точне значення, яке ви попросите, коли воно вам потрібне. Увімкніть, коли хочете, щоб підсумки `done` лишалися охайними, а облікові дані ніколи не повторювались.", "st.display.request_timeout.label": "Тайм-аут запиту до LLM", "st.display.request_timeout.desc": "Максимальний час очікування заголовків відповіді та кожної паузи між частинами потокової відповіді. За замовчуванням: 120 с. Збільште його для повільних локальних моделей, особливо на CPU або з великим контекстом.", "st.providers.filter.all": "Усі", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'Поки WebBrain зайнятий, повідомлення ставляться в чергу. Лише /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces та /verbose можуть запускатися одразу як slash-команди.', 'tool.go_back': 'Назад', 'tool.go_forward': 'Вперед', - 'st.display.search.placeholder': 'Пошук у загальних налаштуваннях', - 'st.display.search.empty': 'Немає збігів у загальних налаштуваннях.', + 'st.display.search.placeholder': 'Пошук у налаштуваннях', + 'st.display.search.empty': 'Немає відповідних налаштувань.', 'st.display.advanced': 'Розширені', ...getApocalypseModeCopy('uk'), ...getEmergencyBoxCopy('uk'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "Збереженого запису з таким ID немає.", "st.memory.security_html": "Конфіденційність: пам’ять користувача зберігається відкритим текстом у цьому профілі браузера. Коли її ввімкнено, активні записи пам’яті надсилаються вибраному провайдеру LLM як частина системного промпту. Не зберігайте тут паролі, ключі API, токени, коди відновлення чи інші конфіденційні секрети.", "hist.filter.clear": "Очистити фільтр і показати всі розмови", - "st.redaction.heading": "Редагування знімків екрана", "st.redaction.toggle.label": "Приховувати чутливий вміст на знімках екрана", "st.redaction.toggle.desc": "Перед надсиланням знімка екрана моделі зору розмиває поля форм і текст, схожий на email чи номер телефону. Виявлення виконується повністю на вашому пристрої — нічого зайвого не передається.", "st.redaction.warning": "⚠️ Працює за принципом «найкращих зусиль» і fail-open: якщо редагування не може виконатися на сторінці (наприклад, одразу після переходу, у переглядачах PDF або на обмежених сторінках браузера), знімок екрана все одно надсилається невідредагованим. Виявлення використовує лише евристики DOM — текст, намальований на canvas, персональні дані всередині зображень або будь-що, не розпізнане як поле форми чи текст email/телефону, може залишитися непоміченим, а текст сторінки, що надсилається моделі, цим налаштуванням не редагується. Це НЕ гарантія безпеки. Для повної приватності використовуйте локальну/офлайн-модель (llama.cpp, Ollama): тоді знімки екрана взагалі не покидають ваш пристрій і редагування стає непотрібним.", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "Експортувати весь збережений сеанс трасування у JSON, включно зі знімками екрана", "sp.export_traces.recording_truncated": "Усі збережені записи експортовано у JSON. Вміст, пропущений під час запису, неможливо відновити експортом.", "sp.slash.export_traces": "Експортувати ланцюг інструментів (трасування)", - "sp.export_traces.none": "Немає трасувань для цієї розмови. Увімкніть «Записувати трасування» в налаштуваннях і запустіть знову.", + "sp.export_traces.none": "Немає трасувань для цієї розмови. Увімкніть «Записувати трасування» у розділі Налаштування → Розширені і запустіть знову.", "sp.export_traces.error": "Не вдалося експортувати трасування.", "sp.export_traces.done": "Ланцюг інструментів експортовано.", "sp.export_traces.no_conversation": "Поки немає що експортувати — спочатку почніть розмову.", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "Використовувати WebBrain як сторінку нової вкладки", "st.display.newtab.desc": "Нові вкладки відкривають сторінку WebBrain з полем, щоб запитати, доручити дію або шукати. Вимкніть, щоб лишити звичайну сторінку нової вкладки браузера; змінити це можна будь-коли в Налаштування → Загальні.", "st.display.help_improve.desc_html": "Дозволити зберігати вибрані взаємодії з WebBrain Compass і використовувати їх для оцінювання, вдосконалення, тонкого налаштування та навчання. Увімкнено за замовчуванням. Вимкніть, щоб майбутні взаємодії з Compass не використовувалися для цих цілей. WebBrain збирає запити до локальних моделей і ваших власних API лише від провайдерів, у яких ви ввімкнули «Ділитися запитами для досліджень». Політика конфіденційності →", - "st.providers.webbrain_data_use.body": "Безкоштовне щоденне використання WebBrain Compass включено. Поки параметр «Допомагати вдосконалювати WebBrain» увімкнено за замовчуванням, вибрані розмови Compass можуть зберігатися й використовуватися для оцінювання, вдосконалення, тонкого налаштування та навчання. Вимкніть його в розділі «Загальні → Розширені», щоб виключити майбутні взаємодії з Compass із такого використання. WebBrain збирає запити до локальних моделей і ваших власних API, лише коли ви вмикаєте опцію «Ділитися запитами для досліджень» для цього провайдера. {privacyLink}. Для більшого обсягу оформіть підписку на {subscribeLink}. Керуйте оплатою на {accountLink}.", + "st.providers.webbrain_data_use.body": "Безкоштовне щоденне використання WebBrain Compass включено. Поки параметр «Допомагати вдосконалювати WebBrain» увімкнено за замовчуванням, вибрані розмови Compass можуть зберігатися й використовуватися для оцінювання, вдосконалення, тонкого налаштування та навчання. Вимкніть його в розділі «Налаштування → Розширені», щоб виключити майбутні взаємодії з Compass із такого використання. WebBrain збирає запити до локальних моделей і ваших власних API, лише коли ви вмикаєте опцію «Ділитися запитами для досліджень» для цього провайдера. {privacyLink}. Для більшого обсягу оформіть підписку на {subscribeLink}. Керуйте оплатою на {accountLink}.", 'st.providers.share_research.label': "Ділитися запитами для досліджень", 'st.providers.share_research.hint': "Надсилає запити й відповіді цього провайдера до WebBrain для оцінювання та вдосконалення, включно з відомостями про провайдера та модель. Зображення й бінарні вкладення вилучаються, а текст скорочується перед надсиланням; решта тексту надсилається без змін.", 'st.providers.share_research.confirm': "Ділитися запитами цього провайдера з WebBrain для досліджень?\n\nЯкщо ввімкнено, ваші запити, відповіді та взаємодії з інструментами цього провайдера надсилатимуться до WebBrain для оцінювання та вдосконалення разом із назвою провайдера й моделі. Текст надсилається без змін після вилучення зображень і скорочення довгого вмісту, тому не передавайте чутливі персональні дані. Ви можете вимкнути це будь-коли, щоб припинити надсилання.", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "Хочете менше переривань? «Завжди дозволяти» запам’ятовує цей сайт. Команда нижче вимикає запити дозволів WebBrain на всіх сайтах.", "sp.perm.insert_skip_command": "Вставити /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Чернетку не змінено. Очистьте її перед вставленням команди.", - "ob.act.permissions_tip": "Запити дозволів увімкнено за замовчуванням. Досвідчені користувачі можуть вимкнути їх глобально командою /dangerously-skip-permissions і знову ввімкнути в Налаштування → Дозволи.", + "ob.act.permissions_tip": "Запити дозволів увімкнено за замовчуванням. Досвідчені користувачі можуть вимкнути їх глобально командою /dangerously-skip-permissions і знову ввімкнути кнопкою ⚠ поруч із мікрофоном.", 'st.provider.field.cache_read_cost_per_million': "Орієнтовна вартість читання з кешу ($ / 1 млн токенів)", 'st.provider.field.cache_write_cost_per_million': "Орієнтовна вартість запису в кеш на 5 хвилин ($ / 1 млн токенів)", 'st.provider.field.cache_write_1h_cost_per_million': "Орієнтовна вартість запису в кеш на 1 годину ($ / 1 млн токенів)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "Замінити зашифровану хмарну копію на поточні налаштування WebBrain цього пристрою?", "st.sync.consent.legacy": "Увімкнути зашифровану синхронізацію? WebBrain передасть наскрізну зашифровану копію ваших спогадів, автозаповнення профілю та налаштувань постачальника ключа API до WebBrain Compass. Історія чату та вхід OAuth не синхронізуються.", "st.sync.consent.denied": "Дозвіл на зашифровану синхронізацію не надано.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/vi.js b/src/chrome/src/ui/locales/vi.js index c6210f114c..ac3df0c59c 100644 --- a/src/chrome/src/ui/locales/vi.js +++ b/src/chrome/src/ui/locales/vi.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Thu nhỏ giao diện tiện ích', 'sp.ui_scale.increase': 'Phóng to giao diện tiện ích', 'sp.ui_scale.reset': 'Đặt lại', - 'st.display.ui_scale.label': 'Thu phóng giao diện tiện ích', - 'st.display.ui_scale.decrease': 'Thu nhỏ giao diện tiện ích', - 'st.display.ui_scale.increase': 'Phóng to giao diện tiện ích', - 'st.display.ui_scale.reset': 'Đặt lại', - 'st.display.ui_scale.desc': 'Thay đổi kích thước thanh bên và cửa sổ trò chuyện riêng mà không thay đổi mức thu phóng trang.', - 'st.display.ui_scale.shortcuts': 'Phím tắt riêng: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Chưa gán', - 'st.display.ui_scale.manage_shortcuts': 'Tùy chỉnh phím tắt', 'tool.delegate_research': 'Đang nghiên cứu với ChatGPT', 'st.display.research_escalation.label': 'Leo thang nghiên cứu', 'st.display.research_escalation.desc': 'Khi được bật, WebBrain có thể xin phép trước khi gửi một lời nhắc nghiên cứu chỉ đọc phức tạp bất thường đến ChatGPT. Tắt theo mặc định. Lời nhắc chính xác chỉ được chia sẻ sau khi bạn chấp thuận rõ ràng.', @@ -500,7 +492,7 @@ export default { 'sp.step.result_label': "kết quả", 'sp.api.enabled_html': "🔓 Đã bật đột biến API cho cuộc trò chuyện này. Hiện tại, tác nhân có thể sử dụng POST/PUT/PATCH/DELETE thông qua get_url và exec_js khi đánh giá API đáng tin cậy hơn giao diện người dùng cho một bước. UI-first vẫn là mặc định. Cờ này sẽ xóa khi bạn đặt lại cuộc trò chuyện.", - 'sp.permissions.disabled_html': "⚠️ Lời nhắc về quyền đang TẮT. WebBrain sẽ nhấp, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại và lên lịch công việc trong tương lai mà không cần hỏi trước. Kích hoạt lại tính năng này từ Cài đặt → Quyền → Hỏi trước các hành động tiếp theo.", + 'sp.permissions.disabled_html': "⚠️ Lời nhắc về quyền đang TẮT. WebBrain sẽ nhấp, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại và lên lịch công việc trong tương lai mà không cần hỏi trước. Bật lại tính năng này từ nút ⚠ bên cạnh micrô.", 'sp.permissions.button': 'Lời nhắc về quyền: bật', 'sp.permissions.button_off': 'Lời nhắc về quyền: tắt', 'sp.permissions.gate_desc': 'WebBrain sẽ hỏi lần đầu tiên nó nhấp, nhập, tải xuống hoặc chạy mã trên một trang web.', @@ -659,7 +651,7 @@ export default { 'ob.act.warn1': "WebBrain có thể chụp ảnh màn hình để lập kế hoạch. Tránh sử dụng chế độ đại lý trên các trang nhạy cảm, chẳng hạn như cổng thông tin sức khỏe, tài chính, hẹn hò hoặc tài khoản cá nhân, trừ khi bạn chấp nhận rủi ro đó.", 'ob.act.warn2': "Nội dung web có thể chứa các nội dung nhắc nhở độc hại được thiết kế để thao túng hành vi của AI.", 'ob.act.warn3': "Luôn xem xét các hành động được đề xuất và dừng các hoạt động có vẻ ngoài dự kiến.", - 'ob.act.permissions_tip': "Lời nhắc về quyền được bật theo mặc định. Người dùng nâng cao có thể vô hiệu hóa chúng trên toàn cầu bằng /dangerously-skip-permissions và bật lại chúng trong Cài đặt → Quyền.", + 'ob.act.permissions_tip': "Lời nhắc về quyền được bật theo mặc định. Người dùng nâng cao có thể vô hiệu hóa chúng trên toàn cầu bằng /dangerously-skip-permissions và bật lại chúng từ nút ⚠ bên cạnh micrô.", 'ob.tokens.title': "Chọn một mô hình", 'ob.tokens.body': "WebBrain cần một mô hình ngôn ngữ để hoạt động. Trước tiên, chúng tôi sẽ kiểm tra các mô hình địa phương. Nếu không có sẵn, hãy mở Cài đặt và thêm nhà cung cấp:", 'ob.tokens.scanning': "Đang kiểm tra các mô hình địa phương...", @@ -685,23 +677,32 @@ export default { 'ob.btn.done': "Bắt đầu", 'ob.btn.skip': "Bỏ qua bây giờ", 'ob.btn.start': 'Bắt đầu', - 'ob.cloud.body': 'WebBrain Compass đã sẵn sàng với hạn ngạch hằng tuần miễn phí. Các cuộc trò chuyện Compass được chọn có thể được giữ lại và sử dụng để cải thiện WebBrain trong khi Trợ giúp Cải thiện WebBrain được bật theo mặc định. Bạn có thể tắt nó trong Cài đặt → Chung.', + 'ob.cloud.body': 'WebBrain Compass đã sẵn sàng với hạn ngạch hằng tuần miễn phí. Các cuộc trò chuyện Compass được chọn có thể được giữ lại và sử dụng để cải thiện WebBrain trong khi Trợ giúp Cải thiện WebBrain được bật theo mặc định. Bạn có thể tắt nó trong Cài đặt → Nâng cao.', 'ob.cloud.change': 'Thay đổi', 'ob.cloud.using': 'Đang sử dụng WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "Cài đặt WebBrain", - 'st.subtitle': "Định cấu hình các nhà cung cấp và tùy chọn LLM của bạn · v{version}", + 'st.subtitle': "Định cấu hình cách WebBrain hoạt động · v{version}", 'st.tab.display': "chung", + 'st.tab.budgets': 'Ngân sách', + 'st.tab.advanced': 'Nâng cao', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Giọng nói', + 'st.tab.generative': 'Tạo sinh', + 'st.tab.decision': 'Quyết định', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Nhà cung cấp WebBrain', + 'st.providers_page.subtitle': 'Chọn các mô hình WebBrain sử dụng · v{version}', + 'st.permissions_page.title': 'Quyền của WebBrain', + 'st.permissions_page.subtitle': 'Các trang mà WebBrain có thể thao tác mà không cần hỏi trước', 'st.tab.providers': "Nhà cung cấp", 'st.tab.skills': "Kỹ năng", 'st.tab.vision': "Tầm nhìn", - 'st.tab.multimodal': "Mô hình hỗ trợ", 'st.tab.memory': "Bộ nhớ", 'st.tab.profile': "Hồ sơ", 'st.tab.account': "Tài khoản", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "Quyền", 'st.perms.gate.label': "Hỏi trước các hành động mang tính hậu quả", 'st.perms.gate.desc': "Khuyến nghị. Khi bật, WebBrain sẽ yêu cầu quyền trong lần đầu tiên nhấp chuột, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại hoặc lên lịch công việc trong tương lai trên một trang web (sau đó ghi nhớ lựa chọn của bạn). Tắt để sử dụng nhanh chóng, không cần nhắc nhở trên các trang web mà bạn hoàn toàn tin tưởng.", @@ -723,8 +724,6 @@ export default { "st.account.update_payment": "Cập nhật phương thức thanh toán", 'st.account.manage_billing': "Quản lý thanh toán", - 'st.display.language.label': "Ngôn ngữ", - 'st.display.language.desc': "Ngôn ngữ giao diện cho plugin WebBrain.", 'st.display.theme.label': "Ngoại hình", 'st.display.theme.desc': "Sáng, tối hoặc tuân theo cài đặt hệ điều hành của bạn.", 'st.display.theme.system': "Hệ thống", @@ -734,8 +733,8 @@ export default { 'st.display.download_directory.desc': "Thư mục con tùy chọn bên trong thư mục Tải xuống của trình duyệt hoặc hệ thống của bạn. Để trống để sử dụng mặc định của hệ thống.", 'st.display.download_directory.placeholder': "Mặc định hệ thống", 'st.display.download_directory.error': "Sử dụng thư mục tương đối như WebBrain hoặc Work/WebBrain. Đường dẫn tuyệt đối và “..” không được phép.", - 'st.display.search.placeholder': "Tìm kiếm Cài đặt chung", - 'st.display.search.empty': "Không có cài đặt chung nào khớp.", + 'st.display.search.placeholder': "Tìm kiếm cài đặt", + 'st.display.search.empty': "Không có cài đặt nào khớp.", 'st.display.advanced': "Nâng cao", ...getApocalypseModeCopy('vi'), ...getEmergencyBoxCopy('vi'), @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': "Ảnh chụp màn hình tự động", "st.display.auto_screenshot.desc": "Tự động chụp ảnh màn hình khung nhìn sau khi tác nhân thao tác trên trang để tuyến thị giác đã chọn thấy được thay đổi. Việc này tốn nhiều token hơn. Nếu thị giác không khả dụng, phần làm giàu sẽ bị bỏ qua và tác vụ tiếp tục với thông báo trạng thái.", 'st.display.auto_screenshot.off': "Tắt", - 'st.display.auto_screenshot.navigation': "Trên điều hướng", - 'st.display.auto_screenshot.state_change': "Khi thay đổi trạng thái (mặc định)", + 'st.display.auto_screenshot.navigation': "Trên điều hướng (mặc định)", + 'st.display.auto_screenshot.state_change': "Khi thay đổi trạng thái", 'st.display.auto_screenshot.every_step': "Mỗi bước", 'st.display.tracing.label': "Ghi lại dấu vết (để so sánh mô hình)", - 'st.display.tracing.desc_html': "Duy trì mọi lần chạy (yêu cầu LLM, phản hồi, lệnh gọi công cụ, ảnh chụp màn hình) vào IndexedDB cục bộ để bạn có thể kiểm tra và so sánh các mô hình song song. Mở trong tab Dấu vết riêng biệt. Tắt theo mặc định vì nó thêm ghi vào đĩa mỗi bước. Mở trang Dấu vết →", - 'st.display.lossless_tracing.label': 'Ghi lại chi tiết đầy đủ của yêu cầu (lớp gỡ lỗi)', - 'st.display.lossless_tracing.desc_html': 'Cũng lưu trữ đầy đủ prompt, tin nhắn và cấu trúc công cụ của mỗi yêu cầu LLM thay vì bản tóm tắt không nội dung, đồng thời giữ tối đa 200 KB mỗi kết quả công cụ. Cho phép gỡ lỗi sâu và dựng lại yêu cầu. Tắt theo mặc định vì ghi nội dung hội thoại cục bộ và tốn nhiều dung lượng hơn. Yêu cầu bật tính năng ghi trace.', + 'st.display.tracing.desc_html': "Lưu mọi lần chạy (yêu cầu LLM, phản hồi, lệnh gọi công cụ, ảnh chụp màn hình) vào IndexedDB cục bộ để bạn có thể kiểm tra và so sánh các mô hình song song, bao gồm đầy đủ prompt, tin nhắn và cấu trúc công cụ của mỗi yêu cầu LLM cùng tối đa 200 KB mỗi kết quả công cụ. Mở trong tab Dấu vết riêng biệt. Tắt theo mặc định vì ghi nội dung hội thoại cục bộ và tốn nhiều dung lượng hơn. Mở trang Dấu vết →", 'st.display.cost_session_limit.label': "Phụ cấp phiên chi phí đám mây", 'st.display.cost_session_limit.desc': "Dừng đám mây và OpenRouter chạy trước một lệnh gọi mô hình trả phí khác sau khi phiên này đạt đến mức chi phí được báo cáo hoặc ước tính. Mặc định là 10$.", 'st.display.cost_total_limit.label': "Tổng phụ cấp chi phí đám mây", 'st.display.cost_total_limit.desc': "Theo dõi chi tiêu được báo cáo hoặc ước tính trên đám mây/mô hình OpenRouter trên tiện ích mở rộng và dừng các cuộc gọi trả phí tiếp theo ở mức cho phép. Các nhà cung cấp địa phương không được tính.", 'st.display.cost_reset': "Đặt lại chi tiêu", 'st.display.strict_secret.label': "Xử lý bí mật nghiêm ngặt", - 'st.display.strict_secret.desc': "Từ chối trích dẫn thông tin xác thực (mật khẩu, khóa API, mã thông báo, OTP) trong bản tóm tắt hoặc văn bản trợ lý — ngay cả khi bạn yêu cầu chúng một cách rõ ràng. Hữu ích nếu bạn thường xuyên chia sẻ tệp theo dõi hoặc chia sẻ màn hình. Tắt theo mặc định để tác nhân có thể nhắc lại đúng giá trị bạn yêu cầu khi bạn cần. Bật nó (Cài đặt → Bảo mật) khi bạn muốn bản tóm tắt `done` gọn gàng và thông tin xác thực không bao giờ bị lặp lại.", + 'st.display.strict_secret.desc': "Từ chối trích dẫn thông tin xác thực (mật khẩu, khóa API, mã thông báo, OTP) trong bản tóm tắt hoặc văn bản trợ lý — ngay cả khi bạn yêu cầu chúng một cách rõ ràng. Hữu ích nếu bạn thường xuyên chia sẻ tệp theo dõi hoặc chia sẻ màn hình. Tắt theo mặc định để tác nhân có thể nhắc lại đúng giá trị bạn yêu cầu khi bạn cần. Bật nó khi bạn muốn bản tóm tắt `done` gọn gàng và thông tin xác thực không bao giờ bị lặp lại.", 'st.display.allow_local_network.label': "Cho phép đại lý truy cập mạng cục bộ", 'st.display.allow_local_network.desc': "Cho phép công cụ tìm nạp_url của tác nhân tiếp cận vòng lặp ngược (127.0.0.1, localhost) và các địa chỉ riêng tư/RFC1918 (10.x, 192.168.x, 172.16–31.x). Hữu ích cho các máy chủ phát triển cục bộ, công cụ mạng nội bộ hoặc API tự lưu trữ. Tắt theo mặc định. Khi tắt, URL ghi trực tiếp IP riêng hoặc loopback và tên localhost sẽ bị chặn. Không kiểm tra phân giải DNS, nên các tên máy chủ khác vẫn có thể dẫn tới địa chỉ cục bộ. IP trực tiếp của siêu dữ liệu đám mây (169.254.169.254) và tên siêu dữ liệu trong danh sách hoặc *.internal/*.local vẫn bị chặn ngay cả khi bật.", 'st.display.scheduled_tasks.label': "Nhiệm vụ theo lịch trình", @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': "Tối đa", 'st.providers.compat.value.system': "Hệ thống", 'st.providers.compat.value.developer': "Nhà phát triển", - 'st.providers.webbrain_data_use.body': "Đã bao gồm việc sử dụng WebBrain Compass miễn phí hàng ngày. Mặc dù Trợ giúp cải thiện WebBrain được bật theo mặc định, nhưng các cuộc hội thoại Compass đã chọn có thể được giữ lại và sử dụng để đánh giá, cải tiến, tinh chỉnh và đào tạo. Hãy tắt tính năng này trong Chung → Nâng cao để loại trừ các tương tác Compass trong tương lai khỏi những mục đích sử dụng đó. WebBrain chỉ thu thập yêu cầu mô hình cục bộ và API riêng của bạn khi bạn bật tùy chọn “Chia sẻ truy vấn để nghiên cứu” của nhà cung cấp này. {privacyLink}. Để sử dụng nhiều hơn, hãy đăng ký tại {subscribeLink}. Quản lý thanh toán tại {accountLink}.", + 'st.providers.webbrain_data_use.body': "Đã bao gồm việc sử dụng WebBrain Compass miễn phí hàng ngày. Mặc dù Trợ giúp cải thiện WebBrain được bật theo mặc định, nhưng các cuộc hội thoại Compass đã chọn có thể được giữ lại và sử dụng để đánh giá, cải tiến, tinh chỉnh và đào tạo. Hãy tắt tính năng này trong Cài đặt → Nâng cao để loại trừ các tương tác Compass trong tương lai khỏi những mục đích sử dụng đó. WebBrain chỉ thu thập yêu cầu mô hình cục bộ và API riêng của bạn khi bạn bật tùy chọn “Chia sẻ truy vấn để nghiên cứu” của nhà cung cấp này. {privacyLink}. Để sử dụng nhiều hơn, hãy đăng ký tại {subscribeLink}. Quản lý thanh toán tại {accountLink}.", 'st.providers.share_research.label': "Chia sẻ truy vấn để nghiên cứu", 'st.providers.share_research.hint': "Gửi prompt và phản hồi của nhà cung cấp này tới WebBrain để đánh giá và cải thiện, bao gồm nhà cung cấp và mô hình đã dùng. Hình ảnh và tệp đính kèm nhị phân bị loại bỏ và văn bản bị cắt ngắn trước khi chia sẻ; phần văn bản còn lại được gửi nguyên văn.", 'st.providers.share_research.confirm': "Chia sẻ truy vấn của nhà cung cấp này với WebBrain để nghiên cứu?\n\nKhi bật, prompt, phản hồi và tương tác công cụ của bạn với nhà cung cấp này sẽ được gửi tới WebBrain để đánh giá và cải thiện, cùng tên nhà cung cấp và mô hình. Văn bản được gửi nguyên văn sau khi loại ảnh và cắt ngắn nội dung dài, vì vậy hãy tránh chia sẻ dữ liệu cá nhân nhạy cảm. Bạn có thể tắt bất cứ lúc nào để dừng chia sẻ.", @@ -1058,7 +1055,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "Chỉnh sửa ảnh chụp màn hình", 'st.redaction.toggle.label': "Biên tập lại nội dung nhạy cảm từ ảnh chụp màn hình", 'st.redaction.toggle.desc': "Trước khi ảnh chụp màn hình được gửi tới mô hình trực quan, hãy làm mờ các trường biểu mẫu và văn bản trông giống như email hoặc số điện thoại. Quá trình phát hiện chạy hoàn toàn trên thiết bị của bạn — không có gì được truyền đi thêm.", 'st.redaction.warning': "⚠️ Nỗ lực tối đa và không mở được: nếu quá trình biên tập không thể chạy trên một trang (ví dụ: ngay sau khi điều hướng, trên trình xem PDF hoặc trên các trang trình duyệt bị hạn chế), ảnh chụp màn hình vẫn được gửi ở trạng thái chưa được biên tập. Tính năng phát hiện chỉ sử dụng phương pháp phỏng đoán DOM — văn bản được vẽ bằng canvas, PII bên trong hình ảnh hoặc bất kỳ nội dung nào không được nhận dạng dưới dạng trường biểu mẫu hoặc văn bản email/điện thoại có thể lọt qua và văn bản trang được gửi tới mô hình không bị loại bỏ bởi cài đặt này. Nó KHÔNG phải là một đảm bảo an ninh. Để có được sự riêng tư hoàn toàn, hãy sử dụng mô hình cục bộ/ngoại tuyến (llama.cpp, Ollama): ảnh chụp màn hình sau đó không bao giờ rời khỏi máy của bạn và việc chỉnh sửa là không cần thiết.", @@ -1246,7 +1242,7 @@ export default { "sp.slash.export_traces_full": "Xuất toàn bộ phiên theo dõi đã lưu dưới dạng JSON, gồm cả ảnh chụp màn hình", "sp.export_traces.recording_truncated": "Đã xuất mọi bản ghi đã lưu dưới dạng JSON. Nội dung bị bỏ qua trong lúc ghi không thể khôi phục bằng cách xuất.", "sp.slash.export_traces": "Xuất chuỗi công cụ (dấu vết)", - "sp.export_traces.none": "Không có dấu vết cho cuộc trò chuyện này. Bật Ghi dấu vết trong Cài đặt rồi chạy lại.", + "sp.export_traces.none": "Không có dấu vết cho cuộc trò chuyện này. Bật Ghi dấu vết trong Cài đặt → Nâng cao rồi chạy lại.", "sp.export_traces.error": "Không thể xuất dấu vết.", "sp.export_traces.done": "Chuỗi công cụ đã xuất khẩu.", "sp.export_traces.no_conversation": "Chưa có gì để xuất - trước tiên hãy bắt đầu cuộc trò chuyện.", @@ -1320,8 +1316,8 @@ export default { "st.sync.confirm.reset": "Thay thế bản sao đám mây được mã hóa bằng thiết lập WebBrain hiện tại của thiết bị này?", "st.sync.consent.legacy": "Bật đồng bộ hóa được mã hóa? WebBrain sẽ truyền bản sao được mã hóa nối đầu các ký ức của bạn, tự động điền hồ sơ và cài đặt nhà cung cấp khóa API tới WebBrain Compass. Lịch sử trò chuyện và thông tin đăng nhập OAuth không được đồng bộ hóa.", "st.sync.consent.denied": "Quyền đồng bộ hóa được mã hóa không được cấp.", - 'st.providers.webgpu_note.body': '{modelLink} chạy hoàn toàn trong Chrome mà không cần điểm cuối API. Tải mô hình trong Settings > Providers > WebGPU hoặc Chế độ Apocalypse, rồi dùng nút nuclear trong standalone chat.', -'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} chạy hoàn toàn trong Chrome mà không cần điểm cuối API. Tải mô hình trong Providers > WebGPU hoặc Chế độ Apocalypse, rồi dùng nút nuclear trong standalone chat.', +'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/locales/zh.js b/src/chrome/src/ui/locales/zh.js index 270dc1dec5..ea38d5a9dd 100644 --- a/src/chrome/src/ui/locales/zh.js +++ b/src/chrome/src/ui/locales/zh.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '缩小插件界面', 'sp.ui_scale.increase': '放大插件界面', 'sp.ui_scale.reset': '重置', - 'st.display.ui_scale.label': '插件界面缩放', - 'st.display.ui_scale.decrease': '缩小插件界面', - 'st.display.ui_scale.increase': '放大插件界面', - 'st.display.ui_scale.reset': '重置', - 'st.display.ui_scale.desc': '调整侧栏和独立聊天窗口的大小,不影响网页缩放。', - 'st.display.ui_scale.shortcuts': '专用快捷键:{shortcuts}', - 'st.display.ui_scale.shortcuts_none': '未设置', - 'st.display.ui_scale.manage_shortcuts': '自定义快捷键', 'tool.delegate_research': '正在使用 ChatGPT 进行研究', 'st.display.research_escalation.label': '研究升级', 'st.display.research_escalation.desc': '启用后,WebBrain 可能会在向 ChatGPT 发送异常复杂的只读研究提示词前征求许可。默认关闭。只有在您明确批准后,才会共享提示词原文。', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "不继续", "sp.recipient.reason_unrequested": "WebBrain 无法从你的请求中确定需要发送消息。{host} 上打开的对话对象是 {recipient}。", "sp.recipient.reason_unnamed": "WebBrain 无法从你的请求中确定这条消息要发给谁。{host} 上打开的对话对象是 {recipient}。", - 'st.tab.permissions': "权限", 'st.perms.revoke': "撤销", 'st.perms.clear_all': "清除所有权限", 'st.perms.gate.label': "执行重要操作前询问", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '开始使用', 'ob.btn.skip': '暂时跳过', 'ob.btn.start': '开始', - 'ob.cloud.body': 'WebBrain Compass 已准备好每周免费配额。选定的 Compass 对话可能会被保留并用于改进 WebBrain,而帮助改进 WebBrain 默认情况下处于开启状态。您可以在设置 → 常规中将其关闭。', + 'ob.cloud.body': 'WebBrain Compass 已准备好每周免费配额。选定的 Compass 对话可能会被保留并用于改进 WebBrain,而帮助改进 WebBrain 默认情况下处于开启状态。您可以在设置 → 高级中将其关闭。', 'ob.cloud.change': '更改', 'ob.cloud.using': '正在使用 WebBrain Compass。', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '结果', 'sp.api.enabled_html': '🔓 本次会话已启用 API 变更。当代理判断 API 比界面更可靠时,可以通过 fetch_url 和 execute_js 使用 POST/PUT/PATCH/DELETE。默认仍优先使用界面。重置会话后此标志会清除。', - 'sp.permissions.disabled_html': '⚠️ 权限提示已关闭。WebBrain 将在不事先询问的情况下点击、输入、导航、运行 JavaScript、上传、下载、录制和安排后续任务。请在设置 → 权限 → 执行重要操作前询问中重新启用。', + 'sp.permissions.disabled_html': '⚠️ 权限提示已关闭。WebBrain 将在不事先询问的情况下点击、输入、导航、运行 JavaScript、上传、下载、录制和安排后续任务。请通过麦克风旁的 ⚠ 按钮重新启用。', 'sp.permissions.button': '权限提示:开启', 'sp.permissions.button_off': '权限提示:关闭', 'sp.permissions.gate_desc': 'WebBrain 首次在某个网站上点击、输入、下载或运行代码前会先询问。', @@ -410,8 +401,19 @@ export default { 'tool.wait_for_element.selector': '等待「{selector}」', 'st.title': 'WebBrain 设置', - 'st.subtitle': '配置你的 LLM 提供商和偏好 · v{version}', + 'st.subtitle': '配置 WebBrain 的工作方式 · v{version}', 'st.tab.display': '通用', + 'st.tab.budgets': '预算', + 'st.tab.advanced': '高级', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '语音', + 'st.tab.generative': '生成', + 'st.tab.decision': '决策', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain 提供商', + 'st.providers_page.subtitle': '选择 WebBrain 使用的模型 · v{version}', + 'st.permissions_page.title': 'WebBrain 权限', + 'st.permissions_page.subtitle': 'WebBrain 无需先询问即可操作的网站', 'st.tab.providers': '提供商', 'st.tab.vision': '视觉', 'st.tab.profile': '个人资料', @@ -427,8 +429,6 @@ export default { "st.account.update_payment": "更新付款方式", 'st.account.manage_billing': '管理账单', - 'st.display.language.label': '语言', - 'st.display.language.desc': 'WebBrain 插件的界面语言。', 'st.display.verbose.label': '详细模式', 'st.display.verbose.desc': '显示完整的工具调用详情、参数和原始 JSON 结果。默认关闭,以获得更清爽的聊天体验。', 'st.display.selection_shortcut.label': '划词快捷操作', @@ -442,13 +442,11 @@ export default { 'st.display.auto_screenshot.label': '自动截图', "st.display.auto_screenshot.desc": "代理对页面操作后自动截取视口截图,让所选视觉路由看到变化。会消耗更多 token。如果视觉不可用,将跳过视觉增强,并显示状态通知后继续任务。", 'st.display.auto_screenshot.off': '关闭', - 'st.display.auto_screenshot.navigation': '导航时', - 'st.display.auto_screenshot.state_change': '状态变化时(默认)', + 'st.display.auto_screenshot.navigation': '导航时(默认)', + 'st.display.auto_screenshot.state_change': '状态变化时', 'st.display.auto_screenshot.every_step': '每一步', 'st.display.tracing.label': '记录轨迹(用于模型对比)', - 'st.display.tracing.desc_html': '将每次运行(LLM 请求、响应、工具调用、截图)持久化到本地 IndexedDB,以便并排查看和对比模型。在独立的轨迹页打开。因为每步都会写盘,默认关闭。打开轨迹页 →', - 'st.display.lossless_tracing.label': '记录完整请求详情(调试档)', - 'st.display.lossless_tracing.desc_html': '同时持久化每次 LLM 请求的完整提示词、消息与工具结构(而非无内容摘要),并保留每个工具结果最多 200 KB。支持深度调试与请求重建。默认关闭,因为会在本地写入对话内容并占用更多磁盘。需要先开启记录轨迹。', + 'st.display.tracing.desc_html': '将每次运行(LLM 请求、响应、工具调用、截图)持久化到本地 IndexedDB,以便并排查看和对比模型,包括每次 LLM 请求的完整提示词、消息与工具结构,以及每个工具结果最多 200 KB。在独立的轨迹页打开。默认关闭,因为会在本地写入对话内容并占用更多磁盘。打开轨迹页 →', 'st.display.allow_local_network.label': '允许代理访问本地网络', 'st.display.allow_local_network.desc': '允许代理的 fetch_url 工具访问回环(127.0.0.1、localhost)和私有/RFC1918 地址(10.x、192.168.x、172.16–31.x)。用于本地开发服务器、内网工具或自托管 API。默认关闭。关闭时会阻止直接写有私有或回环 IP 地址的 URL 以及 localhost 主机名。不检查 DNS 解析,因此其他主机名仍可能连接到本地地址。即使开启,云元数据的 IP 字面量(169.254.169.254)以及列表中的元数据主机名或 *.internal/*.local 主机名仍会被阻止。', 'st.display.notify_sound.label': "通知提示音", @@ -673,7 +671,6 @@ export default { "sp.vision.on": "已为当前提供商启用视觉模式。", "sp.vision.off": "已为当前提供商禁用视觉模式。", "sp.vision.error": "视觉模式切换失败:{msg}", - "st.tab.multimodal": "辅助模型", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "推荐开启。开启后,WebBrain 首次在某站点点击、输入、导航、运行 JavaScript、上传、下载或录制时会请求权限(随后记住你的选择)。在你完全信任的站点上可关闭,以便快速、免提示地使用。", "st.perms.gate.warning": "⚠️ 权限提示已关闭。WebBrain 将在任何站点上点击、输入、导航、运行 JavaScript、上传、下载和录制而无需询问 —— 包括内容可能被攻击者控制的页面。页面内容在内部仍被视为不可信,但没有任何机制能阻止被注入的指令触发操作。只有当你完全信任使用本助手的每一个站点时,才将其保持关闭。", @@ -691,7 +688,7 @@ export default { "st.display.download_directory.placeholder": "系统默认值", "st.display.download_directory.error": "请使用 WebBrain 或 Work/WebBrain 这样的相对文件夹。不允许使用绝对路径或“..”。", "st.display.strict_secret.label": "严格的机密处理", - "st.display.strict_secret.desc": "拒绝在总结或助手文本中引用凭据(密码、API 密钥、令牌、OTP)—— 即使你明确要求也是如此。如果你经常分享轨迹文件或共享屏幕,这会很有用。默认关闭,这样当你需要时,代理可以复述你要求的确切值。当你希望 `done` 总结保持整洁且凭据不被重复显示时,请开启它(设置 → 安全)。", + "st.display.strict_secret.desc": "拒绝在总结或助手文本中引用凭据(密码、API 密钥、令牌、OTP)—— 即使你明确要求也是如此。如果你经常分享轨迹文件或共享屏幕,这会很有用。默认关闭,这样当你需要时,代理可以复述你要求的确切值。当你希望 `done` 总结保持整洁且凭据不被重复显示时,请开启它。", "st.display.request_timeout.label": "LLM 请求超时", "st.display.request_timeout.desc": "等待响应头以及流式响应中每次数据块间隔的最长时间。默认:120秒。本地模型较慢时,尤其在CPU上运行或上下文较大时,请延长此时间。", "st.providers.filter.all": "全部", @@ -923,8 +920,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain 忙碌时,消息会排队。只有 /help、/progress、/btw、/scratchpad、/memory、/schedule --list、/watch、/dangerously-skip-permissions、/screenshot、/export、/export --traces 和 /verbose 可以作为斜杠命令立即运行。', 'tool.go_back': '返回', 'tool.go_forward': '前进', - 'st.display.search.placeholder': '搜索通用设置', - 'st.display.search.empty': '没有匹配的通用设置。', + 'st.display.search.placeholder': '搜索设置', + 'st.display.search.empty': '没有匹配的设置。', 'st.display.advanced': '高级', ...getApocalypseModeCopy('zh'), ...getEmergencyBoxCopy('zh'), @@ -1159,7 +1156,6 @@ export default { "st.memory.reason.not_found": "没有使用该 ID 的已保存记忆。", "st.memory.security_html": "隐私:用户记忆以明文形式存储在此浏览器配置文件中。启用后,活动记忆记录会作为系统提示词的一部分发送给您配置的 LLM 提供商。请勿在此存储密码、API 密钥、令牌、恢复代码或敏感机密信息。", "hist.filter.clear": "清除筛选并显示所有对话", - "st.redaction.heading": "截图打码", "st.redaction.toggle.label": "对截图中的敏感内容进行打码", "st.redaction.toggle.desc": "在截图发送给视觉模型之前,对表单字段以及看起来像邮箱或电话号码的文本进行打码模糊处理。检测完全在你的设备上运行——不会额外传输任何内容。", "st.redaction.warning": "⚠️ 这是尽力而为且失败开放(fail-open)的处理:如果打码功能在某个页面上无法运行(例如刚导航完成之后、在 PDF 查看器中,或在受限的浏览器页面上),截图仍会以未打码的原样发送。检测仅使用 DOM 启发式方法——canvas 上绘制的文字、图片中的个人信息,或任何未被识别为表单字段或邮箱/电话文本的内容都可能被遗漏,发送给模型的页面文本也不会被此设置打码。这不是安全保证。若需要完全的隐私保护,请使用本地/离线模型(llama.cpp、Ollama):这样截图将永远不会离开你的设备,也就不再需要打码。", @@ -1179,7 +1175,7 @@ export default { "sp.slash.export_traces_full": "将完整的已保存跟踪会话导出为 JSON,包括截图", "sp.export_traces.recording_truncated": "已将所有保存的记录导出为 JSON。录制时省略的内容无法通过导出恢复。", "sp.slash.export_traces": "导出工具链(跟踪)", - "sp.export_traces.none": "此对话没有跟踪记录。请在设置中开启「记录跟踪」,然后重新运行。", + "sp.export_traces.none": "此对话没有跟踪记录。请在设置 → 高级中开启「记录跟踪」,然后重新运行。", "sp.export_traces.error": "无法导出跟踪。", "sp.export_traces.done": "工具链已导出。", "sp.export_traces.no_conversation": "暂无可导出内容 — 请先开始对话。", @@ -1189,7 +1185,7 @@ export default { "st.display.newtab.label": "将 WebBrain 用作新标签页", "st.display.newtab.desc": "新标签页将打开 WebBrain 页面,其中有可用于提问、执行或搜索的输入框。关闭后将保留浏览器自带的新标签页;你可以随时在“设置 → 常规”中更改。", "st.display.help_improve.desc_html": "允许保留选定的 WebBrain Compass 交互,并将其用于评估、改进、微调和训练。此选项默认开启。关闭后,未来的 Compass 交互将不会用于这些用途。WebBrain 仅会收集您开启了“共享查询以用于研究”的服务商的本地模型和自备 API 请求。隐私政策 →", - "st.providers.webbrain_data_use.body": "WebBrain Compass 包含每日免费用量。帮助改进 WebBrain 默认开启时,选定的 Compass 对话可能会被保留,并用于评估、改进、微调和训练。可在“常规 → 高级”中关闭,以排除未来的 Compass 交互。仅当您开启此服务商的“共享查询以用于研究”选项时,WebBrain 才会收集本地模型和自备 API 请求。{privacyLink}。如需更多用量,请在 {subscribeLink} 订阅。在 {accountLink} 管理账单。", + "st.providers.webbrain_data_use.body": "WebBrain Compass 包含每日免费用量。帮助改进 WebBrain 默认开启时,选定的 Compass 对话可能会被保留,并用于评估、改进、微调和训练。可在“设置 → 高级”中关闭,以排除未来的 Compass 交互。仅当您开启此服务商的“共享查询以用于研究”选项时,WebBrain 才会收集本地模型和自备 API 请求。{privacyLink}。如需更多用量,请在 {subscribeLink} 订阅。在 {accountLink} 管理账单。", 'st.providers.share_research.label': "共享查询以用于研究", 'st.providers.share_research.hint': "将此服务商的提示词和回复连同所用的服务商及模型发送给 WebBrain,用于评估与改进。共享前会去除图片和二进制附件并截断文本;其余文本将按原样发送。", 'st.providers.share_research.confirm': "要与 WebBrain 共享此服务商的查询以用于研究吗?\n\n开启后,您与此服务商的提示词、回复和工具交互将连同服务商及模型名称发送给 WebBrain,用于评估与改进。文本在去除图片并截断过长内容后按原样发送,因此请避免共享敏感个人信息。您可以随时关闭以停止今后的共享。", @@ -1235,7 +1231,7 @@ export default { "sp.perm.skip_hint": "想减少打断?“始终允许”会记住此网站。下面的命令会在所有网站上关闭 WebBrain 权限提示。", "sp.perm.insert_skip_command": "插入 /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "草稿未更改。请先清空草稿再插入命令。", - "ob.act.permissions_tip": "权限提示默认开启。高级用户可使用 /dangerously-skip-permissions 在所有网站上关闭提示,并在设置 → 权限中重新开启。", + "ob.act.permissions_tip": "权限提示默认开启。高级用户可使用 /dangerously-skip-permissions 在所有网站上关闭提示,并通过麦克风旁的 ⚠ 按钮重新开启。", 'st.provider.field.cache_read_cost_per_million': "估算缓存读取费用($ / 100 万 token)", 'st.provider.field.cache_write_cost_per_million': "估算 5 分钟缓存写入费用($ / 100 万 token)", 'st.provider.field.cache_write_1h_cost_per_million': "估算 1 小时缓存写入费用($ / 100 万 token)", @@ -1321,8 +1317,8 @@ export default { "st.sync.confirm.reset": "使用该设备当前的 WebBrain 设置替换加密的云副本?", "st.sync.consent.legacy": "开启加密同步? WebBrain 会将您的记忆、个人资料自动填充和 API 密钥提供商设置的端到端加密副本传输到 WebBrain Compass。聊天历史记录和 OAuth 登录不同步。", "st.sync.consent.denied": "未授予加密同步权限。", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', - 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.managed_body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat. It does not replace your selected provider.', 'st.providers.webgpu_download.title': 'WebGPU model files', 'st.providers.webgpu_download.progress_label': 'WebGPU model download progress', 'st.providers.webgpu_download.checking': 'Checking local model files…', diff --git a/src/chrome/src/ui/permissions.html b/src/chrome/src/ui/permissions.html new file mode 100644 index 0000000000..470c3f90dc --- /dev/null +++ b/src/chrome/src/ui/permissions.html @@ -0,0 +1,55 @@ + + + + + + WebBrain Permissions + + + + + +
+
+

+

+
+ +
+ +
+
+
+
+
+
+
+ +
+ + +
+
+ +
+
+ + + + diff --git a/src/chrome/src/ui/providers.html b/src/chrome/src/ui/providers.html new file mode 100644 index 0000000000..24ab9dd81a --- /dev/null +++ b/src/chrome/src/ui/providers.html @@ -0,0 +1,365 @@ + + + + + + WebBrain Providers + + + + + + +
+
+

+

+
+ +
+ + + +
+
+ +
+
+ +
+

+ + +

+
+
+
+ +
+
+ + IN-BROWSER +
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
+
+
+
+ +
+

+ + +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+ +
+

+ + +

+
+
+
+ + +
+
+ + +
+
+ + +
+ + + +
+ + +
+
+ + + +
+
+
+
+ +
+

+ + +

+
+

+ +
+ +
+ + + +
+
+

+ + + +

+ + + + +
+ + + +
+
+ +
+
+
+ +
+

+
+
+
+
+
+
+ +
+

+

+
+ + +
+
+ +
+ + 95% +
+
+
+
+ +
+
+

+
+
+ + +
+
+
+ + + + + + + + diff --git a/src/chrome/src/ui/settings-tabs.js b/src/chrome/src/ui/settings-tabs.js index be33030a88..e8cdf9ec53 100644 --- a/src/chrome/src/ui/settings-tabs.js +++ b/src/chrome/src/ui/settings-tabs.js @@ -1,12 +1,35 @@ -// Tab switcher for settings.html. Kept out of an inline - + @@ -1551,9 +16,13 @@

-

+

+ + + + @@ -1566,29 +35,24 @@

- - - + -
-
- - -
-
-
-
-
- -
+ + + +
+

+
@@ -1600,20 +64,6 @@

-
-
-
-
-
- -
-
- - 100% - - -
-
@@ -1682,22 +132,6 @@

-
-
-
50
-
-
- -
-
-
-
120s
-
-
- -
@@ -1710,6 +144,32 @@

+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+

+
- -
-
- -
-
- -
-

- - -

-
-
-
- -
-
- - IN-BROWSER -
-
-
- - -
-
-
-
-
-
-
- - -
-
- - -
-
- - -
-
- -
-
-
- - -
-
-
- -

-
-
- -
- - -
-
- -
- - -
-
- -
- - + + -
- -
-
- -

-
-
+
-
-
+
50
+
- -
-
-
- -

- - -

-
-
-
- - -
-
- - -
-
- - -
-
- - - -
-
-
- -

- - -

-
-
-
- - -
-
- - -
-
- - -
- - - -
- - -
-
- - - +
-
-
- -

- - -

-
-

- -
- -
- - - -
-
-

- - - -

- - -
@@ -2755,24 +480,195 @@

-
-
-
-
-
-
-
- -
- +
+

+
+
+

+

+ +
+
+

CapSolver

+ +
+

+

+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+
-
-
-
@@ -2837,6 +733,226 @@

+
+

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
Notification sounds
+
Play a distinct sound for plans awaiting review and a short chime for completion or clarification. No sound when you cancel a run.
+
+ +
+
+
+
+
+
+ +
+
+
+
Flash tabs for alerts
+
Blink a background tab’s title and icon when a plan is ready for review or a task finishes. Plans use a ⚠️ icon.
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ @@ -2844,6 +960,5 @@

- diff --git a/src/chrome/src/ui/settings.js b/src/chrome/src/ui/settings.js index f762a33d88..35453f831c 100644 --- a/src/chrome/src/ui/settings.js +++ b/src/chrome/src/ui/settings.js @@ -3,21 +3,18 @@ import { normalizeLeanModeSetting } from '../agent/lean-mode.js'; import { D1_MODEL_ID } from '../providers/d1-config.js'; import { initD1Settings } from './d1-settings.js'; /** - * WebBrain Settings Page — provider configuration + display settings. + * WebBrain Settings pages — settings.html (preferences, budgets, memory, + * skills, CAPTCHA, Bridge, advanced), providers.html (the chat provider and + * the assistive models) and permissions.html (site permissions). + * + * One controller serves all three pages: each section below wires itself up + * only when its markup is on the current page. */ -import { t, getLocale, setLocale, LANGUAGES } from './i18n.js'; +import { t } from './i18n.js'; import { escapeHtml } from './utils.js'; import { MEDIA_PROVIDERS, mediaProvider, validateMediaConfig } from '../agent/media-config.js'; import { THEME_MODES, applyMode, loadMode, watch } from './theme.js'; -import { - UI_SCALE_LEVELS, - UI_SCALE_STORAGE_KEY, - loadUiScale, - nextUiScale, - normalizeUiScale, - saveUiScale, -} from './ui-scale.js'; import { renderSkillMarkdown } from './skill-markdown.js'; import { CAPABILITY_LABEL } from '../agent/permission-gate.js'; import { @@ -103,13 +100,11 @@ const SUBSCRIPTION_GUIDE_PRODUCTS = Object.freeze({ // Version shown in the subtitle. Kept here so it only needs one update per // release; the subtitle string itself is translated. -const EXT_VERSION = '42.0.6'; +const EXT_VERSION = '42.1.0'; const providersContainer = document.getElementById('providers'); -const displaySettings = document.getElementById('display-settings'); const generalSearchInput = document.getElementById('input-general-search'); const generalSearchEmpty = document.getElementById('general-search-empty'); -const advancedSettings = document.querySelector('.advanced-settings'); const apocalypseModeLink = document.getElementById('apocalypse-mode-link'); const apocalypseModeStatus = document.getElementById('apocalypse-mode-status'); const verboseToggle = document.getElementById('toggle-verbose'); @@ -152,7 +147,6 @@ const completionConfettiToggle = document.getElementById('toggle-completion-conf const completionFlashTabToggle = document.getElementById('toggle-completion-flash-tab'); const tracingToggle = document.getElementById('toggle-tracing'); const feedbackDiagnosticsToggle = document.getElementById('toggle-feedback-diagnostics'); -const losslessTracingToggle = document.getElementById('toggle-lossless-tracing'); const strictSecretToggle = document.getElementById('toggle-strict-secret'); const strictGuardsToggle = document.getElementById('toggle-strict-guards'); const leanModeSelect = document.getElementById('select-lean-mode'); @@ -286,8 +280,19 @@ function activeProviderIsCompass() { const config = providersData?.[activeProviderId]; return !!activeProviderId && (providerDefinitionId(activeProviderId) === 'webbrain_cloud' || config?.providerName === 'webbrain-cloud'); } +// The Strict Secret Mode switch is on settings.html and the decision card on +// providers.html, so the card follows the stored setting, not the switch. +let strictSecretModeOn = false; +if (globalThis.chrome?.storage?.onChanged) { + chrome.storage.onChanged.addListener((changes, area) => { + if (area !== 'local' || !changes.strictSecretMode) return; + strictSecretModeOn = changes.strictSecretMode.newValue === true; + void syncDecisionStatus(); + }); +} let decisionStatusSequence = 0; async function syncDecisionStatus() { + if (!decisionModeInputs.length) return; const mode = selectedDecisionMode(); for (const description of document.querySelectorAll('[data-decision-mode-desc]')) description.hidden = description.dataset.decisionModeDesc !== mode; const configured = document.getElementById('decision-configured'); @@ -301,7 +306,7 @@ async function syncDecisionStatus() { return; } // Strict Secret Mode keeps page content away from every decision model, so Auto has nothing to use. - const strict = strictSecretToggle?.checked === true; + const strict = strictSecretModeOn; const compass = !strict && activeProviderIsCompass(); if (sequence !== decisionStatusSequence || selectedDecisionMode() !== 'auto') return; const key = strict ? 'st.decision.status.strict' : compass ? 'st.decision.status.compass' : 'st.decision.status.none'; @@ -344,14 +349,7 @@ const systemOneBrowserToggle = document.getElementById('toggle-system-one-browse const btnTestSystemOne = document.getElementById('btn-test-system-one'); const btnClearSystemOne = document.getElementById('btn-clear-system-one'); const systemOneTestResult = document.getElementById('test-system-one'); -const languageSelect = document.getElementById('select-language'); const themeSelect = document.getElementById('select-theme'); -const settingsUiScaleDecrease = document.getElementById('settings-ui-scale-decrease'); -const settingsUiScaleValue = document.getElementById('settings-ui-scale-value'); -const settingsUiScaleIncrease = document.getElementById('settings-ui-scale-increase'); -const settingsUiScaleReset = document.getElementById('settings-ui-scale-reset'); -const settingsUiScaleShortcuts = document.getElementById('settings-ui-scale-shortcuts'); -const settingsUiScaleManageShortcuts = document.getElementById('settings-ui-scale-manage-shortcuts'); const downloadDirectoryInput = document.getElementById('input-download-directory'); const subtitleEl = document.getElementById('subtitle'); @@ -359,95 +357,36 @@ const subtitleEl = document.getElementById('subtitle'); // Loaded from chrome.storage.local (canonical) with a localStorage mirror // kept in sync by theme.js — so the FOUC bootstrap in always has the // latest mode on next page open. watch() keeps every open extension page -// (this settings tab + the side panel) in sync if any one of them flips it. +// (the settings pages + the side panel) in sync if any one of them flips it. +// Only settings.html has the picker; the other pages still follow changes. let currentThemeMode = 'system'; -if (themeSelect) { - loadMode().then((mode) => { - currentThemeMode = mode; - themeSelect.value = mode; - applyMode(mode, { syncStorage: false }); // already loaded, just paint - }); - themeSelect.addEventListener('change', async () => { - const mode = THEME_MODES.includes(themeSelect.value) ? themeSelect.value : 'system'; - currentThemeMode = mode; - await applyMode(mode); - }); - watch(() => currentThemeMode); - // If another Settings tab or the side panel flips the theme, watch() - // already re-paints this page — but the closure variable and the select - // value won't update on their own. Without this, the picker drifts out - // of sync and a later OS-theme flip can re-apply the stale 'system'. - if (globalThis.chrome?.storage?.onChanged) { - chrome.storage.onChanged.addListener((changes, area) => { - if (area !== 'local' || !changes.themeMode) return; - const next = changes.themeMode.newValue; - if (!THEME_MODES.includes(next)) return; - currentThemeMode = next; - if (themeSelect.value !== next) themeSelect.value = next; - }); - } -} - -let currentSettingsUiScale = 100; -let settingsUiScaleReady = false; - -function renderSettingsUiScale(value) { - currentSettingsUiScale = normalizeUiScale(value); - settingsUiScaleReady = true; - if (settingsUiScaleValue) settingsUiScaleValue.textContent = `${currentSettingsUiScale}%`; - if (settingsUiScaleDecrease) settingsUiScaleDecrease.disabled = currentSettingsUiScale === UI_SCALE_LEVELS[0]; - if (settingsUiScaleIncrease) settingsUiScaleIncrease.disabled = currentSettingsUiScale === UI_SCALE_LEVELS[UI_SCALE_LEVELS.length - 1]; -} - -// Serialized so each step reads the scale rendered by the step before it: -// holding Enter on a focused +/- button repeats faster than the storage write -// resolves, and an unqueued step would keep re-reading the same stale scale. -let settingsUiScaleWriteQueue = Promise.resolve(); - -function changeSettingsUiScale(action) { - if (!settingsUiScaleReady) return Promise.resolve(); - const write = settingsUiScaleWriteQueue.then(async () => { - const next = nextUiScale(currentSettingsUiScale, action); - await saveUiScale(chrome.storage.local, next); - renderSettingsUiScale(next); - }); - // Keep the chain alive after a rejected write while still handing the - // failure to this caller. - settingsUiScaleWriteQueue = write.catch(() => {}); - return write; -} - -loadUiScale(chrome.storage.local).then(renderSettingsUiScale); -if (settingsUiScaleDecrease) settingsUiScaleDecrease.disabled = true; -if (settingsUiScaleIncrease) settingsUiScaleIncrease.disabled = true; -settingsUiScaleDecrease?.addEventListener('click', () => changeSettingsUiScale('decrease').catch(() => {})); -settingsUiScaleIncrease?.addEventListener('click', () => changeSettingsUiScale('increase').catch(() => {})); -settingsUiScaleReset?.addEventListener('click', () => changeSettingsUiScale('reset').catch(() => {})); -chrome.storage.onChanged.addListener((changes, area) => { - if (area === 'local' && changes[UI_SCALE_STORAGE_KEY]) { - renderSettingsUiScale(changes[UI_SCALE_STORAGE_KEY].newValue); - } +loadMode().then((mode) => { + currentThemeMode = mode; + if (themeSelect) themeSelect.value = mode; + applyMode(mode, { syncStorage: false }); // already loaded, just paint }); - -const UI_SCALE_COMMAND_NAMES = ['decrease-ui-scale', 'increase-ui-scale', 'reset-ui-scale']; - -async function refreshUiScaleShortcuts() { - if (!settingsUiScaleShortcuts) return; - const commands = await chrome.commands.getAll(); - const shortcuts = UI_SCALE_COMMAND_NAMES.map((name) => commands.find((command) => command.name === name)?.shortcut) - .filter(Boolean); - const summary = shortcuts.length ? shortcuts.join(' · ') : t('st.display.ui_scale.shortcuts_none'); - settingsUiScaleShortcuts.textContent = t('st.display.ui_scale.shortcuts', { shortcuts: summary }); -} - -refreshUiScaleShortcuts().catch(() => {}); -window.addEventListener('focus', () => refreshUiScaleShortcuts().catch(() => {})); -settingsUiScaleManageShortcuts?.addEventListener('click', () => { - chrome.tabs.create({ url: 'chrome://extensions/shortcuts' }); +themeSelect?.addEventListener('change', async () => { + const mode = THEME_MODES.includes(themeSelect.value) ? themeSelect.value : 'system'; + currentThemeMode = mode; + await applyMode(mode); }); +watch(() => currentThemeMode); +// If another Settings tab or the side panel flips the theme, watch() +// already re-paints this page — but the closure variable and the select +// value won't update on their own. Without this, the picker drifts out +// of sync and a later OS-theme flip can re-apply the stale 'system'. +if (globalThis.chrome?.storage?.onChanged) { + chrome.storage.onChanged.addListener((changes, area) => { + if (area !== 'local' || !changes.themeMode) return; + const next = changes.themeMode.newValue; + if (!THEME_MODES.includes(next)) return; + currentThemeMode = next; + if (themeSelect && themeSelect.value !== next) themeSelect.value = next; + }); +} function renderSubtitle() { - if (subtitleEl) subtitleEl.textContent = t('st.subtitle', { version: EXT_VERSION }); + if (subtitleEl) subtitleEl.textContent = t(subtitleEl.dataset.subtitleKey || 'st.subtitle', { version: EXT_VERSION }); } renderSubtitle(); @@ -477,70 +416,52 @@ function searchTextForGeneralItem(item) { return normalizeGeneralSearchText(`${item.textContent || ''} ${keyedText}`); } +// The search hides rows with a class of its own and leaves the hidden +// attribute to the code that owns each row, so clearing a search cannot bring +// back a card that is hidden for another reason (a managed CAPTCHA card, say). function setGeneralSearchHidden(item, hidden) { - item.hidden = hidden; item.classList.toggle('general-search-hidden', hidden); } +// The search box covers the tabs marked data-search (General, Budgets, +// CAPTCHA and Advanced). With a query, those tabs show together and keep only +// their matching rows; settings-tabs.js clears the query when a tab is picked. +const searchPanels = Array.from(document.querySelectorAll('.tab-panel[data-search]')); + function filterGeneralSettings() { - if (!displaySettings || !generalSearchInput) return; + if (!generalSearchInput || !searchPanels.length) return; const query = normalizeGeneralSearchText(generalSearchInput.value); - const visibleItems = Array.from(displaySettings.children) - .filter((el) => el.classList?.contains('setting-row')); - const advancedBody = advancedSettings?.querySelector('.advanced-settings-body'); - const advancedItems = advancedBody - ? Array.from(advancedBody.children).filter((el) => el.classList?.contains('setting-row') || el.classList?.contains('provider-card')) - : []; - - let visibleMatches = 0; - let advancedMatches = 0; - visibleItems.forEach((item) => { - const matches = !query || searchTextForGeneralItem(item).includes(query); - setGeneralSearchHidden(item, !!query && !matches); - if (matches) visibleMatches += 1; - }); - advancedItems.forEach((item) => { - const matches = !query || searchTextForGeneralItem(item).includes(query); - setGeneralSearchHidden(item, !!query && !matches); - if (matches) advancedMatches += 1; - }); - - if (advancedSettings) { - setGeneralSearchHidden(advancedSettings, !!query && advancedMatches === 0); - if (query && advancedMatches > 0) advancedSettings.open = true; + document.body.classList.toggle('settings-searching', !!query); + let totalMatches = 0; + for (const panel of searchPanels) { + const scope = panel.querySelector('[data-search-scope]') || panel; + let panelMatches = 0; + for (const item of Array.from(scope.children)) { + const matches = !query || (!item.hidden && searchTextForGeneralItem(item).includes(query)); + setGeneralSearchHidden(item, !!query && !matches); + if (matches) panelMatches += 1; + } + setGeneralSearchHidden(panel, !!query && panelMatches === 0); + totalMatches += panelMatches; } if (generalSearchEmpty) { - generalSearchEmpty.hidden = !query || (visibleMatches + advancedMatches) > 0; + generalSearchEmpty.hidden = !query || totalMatches > 0; } } -if (generalSearchInput) { - generalSearchInput.addEventListener('input', filterGeneralSettings); -} +generalSearchInput?.addEventListener('input', filterGeneralSettings); -if (languageSelect) { - languageSelect.innerHTML = LANGUAGES.map((l) => ``).join(''); - languageSelect.value = getLocale(); - languageSelect.addEventListener('change', async () => { - await setLocale(languageSelect.value); - // Re-render dynamic bits whose text comes from JS. - renderSubtitle(); - refreshUiScaleShortcuts().catch(() => {}); - filterGeneralSettings(); - renderProviders(); - }); - document.addEventListener('wb-locale-changed', () => { - languageSelect.value = getLocale(); - renderSubtitle(); - refreshUiScaleShortcuts().catch(() => {}); - filterGeneralSettings(); - if (providersContainer) renderProviders(); - renderSkills(); - renderPermissions(); - refreshProfileSyncState(); - refreshApocalypseModeStatus(); - }); -} +// The language is chosen in the side panel; i18n.js re-translates the static +// markup, and this re-renders what the script writes itself. +document.addEventListener('wb-locale-changed', () => { + renderSubtitle(); + filterGeneralSettings(); + renderProviders(); + renderSkills(); + renderPermissions(); + if (profileSyncStatus) refreshProfileSyncState(); + refreshApocalypseModeStatus(); +}); globalThis.addEventListener('focus', () => { refreshApocalypseModeStatus(); loadVisionConfig().catch(() => {}); @@ -727,11 +648,12 @@ async function init() { chrome.storage.local.remove(['authToken', 'authEmail', 'authDefaultModel']).catch(() => {}); // Load display settings - const stored = await chrome.storage.local.get([...DECISION_SETTINGS_KEYS, 'verboseMode', 'composerDeliveryMode', 'selectionShortcutEnabled', 'pdfViewerEnabled', AUTO_GROUP_TABS_KEY, 'helpImproveWebBrain', 'newTabEnabled', 'screenshotFallback', 'maxAgentSteps', 'autoScreenshot', 'useSiteAdapters', 'researchEscalationEnabled', 'researchEscalationEngine', 'voiceInputEnabled', 'alwaysAllowApiMutations', 'apiMutationObserverEnabled', 'webMcpEnabled', 'openaiAskStreamingEnabled', 'planBeforeActMode', 'planBeforeAct', 'planReviewMode', 'planReviewConfidenceThreshold', DOWNLOAD_DIRECTORY_STORAGE_KEY, 'notifySound', 'completionConfetti', 'completionFlashTab', 'tracingEnabled', 'feedbackDiagnosticsEnabled', 'losslessTrace', 'strictSecretMode', 'strictGuards', 'leanMode', 'agentAllowLocalNetwork', 'scheduledTasksEnabled', 'scheduledRequireConsequentialConfirmation', 'systemOneEnabled', 'systemOneWatchEnabled', 'systemOneCompletionEnabled', 'systemOneFastClassifications', 'systemOneFastBrowser', 'systemOneWatchThreshold', 'systemOneCompletionThreshold', 'typesafeApiKey', 'providerFilter', 'requestTimeoutMs', 'clarifyTimeoutSec', 'clarifyTimeoutSemanticsV2', 'clarifyTimeoutPolicy', 'costAllowanceSessionUsd', 'costAllowanceTotalUsd', 'meteredProviderCostSpentUsd', 'screenshotRedaction', 'imageDetail', 'maxScreenshotsPerTurn', 'maxImageDimension']); + const stored = await chrome.storage.local.get([...DECISION_SETTINGS_KEYS, 'verboseMode', 'composerDeliveryMode', 'selectionShortcutEnabled', 'pdfViewerEnabled', AUTO_GROUP_TABS_KEY, 'helpImproveWebBrain', 'newTabEnabled', 'screenshotFallback', 'maxAgentSteps', 'autoScreenshot', 'useSiteAdapters', 'researchEscalationEnabled', 'researchEscalationEngine', 'voiceInputEnabled', 'alwaysAllowApiMutations', 'apiMutationObserverEnabled', 'webMcpEnabled', 'openaiAskStreamingEnabled', 'planBeforeActMode', 'planBeforeAct', 'planReviewMode', 'planReviewConfidenceThreshold', DOWNLOAD_DIRECTORY_STORAGE_KEY, 'notifySound', 'completionConfetti', 'completionFlashTab', 'tracingEnabled', 'feedbackDiagnosticsEnabled', 'strictSecretMode', 'strictGuards', 'leanMode', 'agentAllowLocalNetwork', 'scheduledTasksEnabled', 'scheduledRequireConsequentialConfirmation', 'systemOneEnabled', 'systemOneWatchEnabled', 'systemOneCompletionEnabled', 'systemOneFastClassifications', 'systemOneFastBrowser', 'systemOneWatchThreshold', 'systemOneCompletionThreshold', 'typesafeApiKey', 'providerFilter', 'requestTimeoutMs', 'clarifyTimeoutSec', 'clarifyTimeoutSemanticsV2', 'clarifyTimeoutPolicy', 'costAllowanceSessionUsd', 'costAllowanceTotalUsd', 'meteredProviderCostSpentUsd', 'screenshotRedaction', 'imageDetail', 'maxScreenshotsPerTurn', 'maxImageDimension']); if (typeof stored.providerFilter === 'string' && ['all','active','local','cloud','router'].includes(stored.providerFilter)) { providerFilter = stored.providerFilter; } - verboseToggle.checked = stored.verboseMode || false; + strictSecretModeOn = stored.strictSecretMode === true; + if (verboseToggle) verboseToggle.checked = stored.verboseMode || false; if (composerDeliveryModeSelect) { composerDeliveryModeSelect.value = stored.composerDeliveryMode === 'steer' ? 'steer' : 'queue'; } @@ -740,13 +662,15 @@ async function init() { if (autoGroupTabsToggle) autoGroupTabsToggle.checked = stored[AUTO_GROUP_TABS_KEY] !== false; if (helpImproveToggle) helpImproveToggle.checked = stored.helpImproveWebBrain !== false; // on by default if (newTabToggle) newTabToggle.checked = stored.newTabEnabled === true; // opt-in: off until chosen - screenshotToggle.checked = stored.screenshotFallback ?? true; // on by default - if (isUnlimitedMaxAgentSteps(stored.maxAgentSteps)) { - maxStepsRange.value = MAX_AGENT_STEPS_UNLIMITED_SENTINEL; - stepsValueLabel.textContent = '∞'; - } else { - maxStepsRange.value = boundedMaxAgentSteps(stored.maxAgentSteps); - stepsValueLabel.textContent = maxStepsRange.value; + if (screenshotToggle) screenshotToggle.checked = stored.screenshotFallback ?? true; // on by default + if (maxStepsRange && stepsValueLabel) { + if (isUnlimitedMaxAgentSteps(stored.maxAgentSteps)) { + maxStepsRange.value = MAX_AGENT_STEPS_UNLIMITED_SENTINEL; + stepsValueLabel.textContent = '∞'; + } else { + maxStepsRange.value = boundedMaxAgentSteps(stored.maxAgentSteps); + stepsValueLabel.textContent = maxStepsRange.value; + } } // requestTimeoutMs is stored in milliseconds, displayed as seconds. // Default 60s when unset. Floor 10s / ceiling 600s matches the slider. @@ -781,15 +705,17 @@ async function init() { if (clarifyTimeoutPolicySelect) { clarifyTimeoutPolicySelect.value = stored.clarifyTimeoutPolicy === 'safe' ? 'safe' : 'finish'; } - autoScreenshotSelect.value = stored.autoScreenshot || 'state_change'; - imageDetailSelect.value = stored.imageDetail || 'auto'; - maxScreenshotsSelect.value = String(stored.maxScreenshotsPerTurn != null ? stored.maxScreenshotsPerTurn : 0); - maxImageDimensionSelect.value = String(stored.maxImageDimension || 1568); - siteAdaptersToggle.checked = stored.useSiteAdapters ?? true; + // On navigation (default) captures after the agent opens a page, not after + // every click or keystroke. + if (autoScreenshotSelect) autoScreenshotSelect.value = stored.autoScreenshot || 'navigation'; + if (imageDetailSelect) imageDetailSelect.value = stored.imageDetail || 'auto'; + if (maxScreenshotsSelect) maxScreenshotsSelect.value = String(stored.maxScreenshotsPerTurn != null ? stored.maxScreenshotsPerTurn : 0); + if (maxImageDimensionSelect) maxImageDimensionSelect.value = String(stored.maxImageDimension || 1568); + if (siteAdaptersToggle) siteAdaptersToggle.checked = stored.useSiteAdapters ?? true; if (researchEscalationToggle) researchEscalationToggle.checked = stored.researchEscalationEnabled === true; if (voiceInputToggle) voiceInputToggle.checked = stored.voiceInputEnabled ?? true; - alwaysAllowApiMutationsToggle.checked = stored.alwaysAllowApiMutations === undefined || stored.alwaysAllowApiMutations === true; - apiMutationObserverToggle.checked = stored.apiMutationObserverEnabled === undefined || stored.apiMutationObserverEnabled === true; + if (alwaysAllowApiMutationsToggle) alwaysAllowApiMutationsToggle.checked = stored.alwaysAllowApiMutations === undefined || stored.alwaysAllowApiMutations === true; + if (apiMutationObserverToggle) apiMutationObserverToggle.checked = stored.apiMutationObserverEnabled === undefined || stored.apiMutationObserverEnabled === true; if (webMcpToggle) webMcpToggle.checked = stored.webMcpEnabled !== false; // on by default if (openAIAskStreamingToggle) openAIAskStreamingToggle.checked = stored.openaiAskStreamingEnabled !== false; if (planBeforeActModeSelect) { @@ -805,15 +731,12 @@ async function init() { if (downloadDirectoryInput) { downloadDirectoryInput.value = normalizeDownloadDirectory(stored[DOWNLOAD_DIRECTORY_STORAGE_KEY]); } - notifySoundToggle.checked = stored.notifySound ?? true; // on by default - completionConfettiToggle.checked = stored.completionConfetti ?? true; // on by default - completionFlashTabToggle.checked = stored.completionFlashTab ?? true; // on by default - tracingToggle.checked = stored.tracingEnabled === true; + if (notifySoundToggle) notifySoundToggle.checked = stored.notifySound ?? true; // on by default + if (completionConfettiToggle) completionConfettiToggle.checked = stored.completionConfetti ?? true; // on by default + if (completionFlashTabToggle) completionFlashTabToggle.checked = stored.completionFlashTab ?? true; // on by default + // One switch records traces with full request details, or neither. + if (tracingToggle) tracingToggle.checked = stored.tracingEnabled === true; if (feedbackDiagnosticsToggle) feedbackDiagnosticsToggle.checked = stored.feedbackDiagnosticsEnabled !== false; - losslessTracingToggle.checked = stored.losslessTrace === true; - // Lossless recording only means something when tracing is on; mirror the - // disabled state so the disclosure reads honestly. - losslessTracingToggle.disabled = tracingToggle.checked !== true; const sessionLimit = normalizeCostAmount(stored.costAllowanceSessionUsd); const totalLimit = normalizeCostAmount(stored.costAllowanceTotalUsd); const totalSpent = normalizeCostAmount(stored.meteredProviderCostSpentUsd, 0); @@ -840,31 +763,33 @@ async function init() { } // The On fields show the configuration On uses: a profile in On as it is // stored, any other with On's defaults. - const storedDecisionMode = resolveDecisionMode(stored); - setDecisionMode(storedDecisionMode); - const decisionConfig = resolveDecisionConfig(storedDecisionMode === 'on' ? stored : { ...stored, [DECISION_MODE_KEY]: 'on' }); - decisionProviderInput.value = previousDecisionProvider = decisionConfig.provider; - decisionModelInput.value = decisionConfig.model; - decisionEndpointInput.value = stored.decisionBaseUrl || 'http://127.0.0.1:8009'; - decisionVisionInput.value = stored.decisionVisionMode || 'auto'; - decisionVisionSupported = stored.decisionVisionSupported === true; - decisionThresholdInput.value = String(decisionConfig.threshold * 100); - await refreshD1Settings(); - syncWebgpuDecisionProvider(); - decisionKeyDrafts.set('typesafe', stored.typesafeApiKey || ''); - decisionKeyDrafts.set('openrouter', stored.decisionApiKey || ''); - decisionKeyDrafts.set('local', stored.decisionLocalApiKey || ''); - document.getElementById('decision-endpoint-field').hidden = decisionConfig.provider !== 'local'; - decisionDoneToggle.checked = decisionConfig.features.done; - if (systemOneWatchToggle) systemOneWatchToggle.checked = decisionConfig.features.watch; - if (systemOneClassificationsToggle) systemOneClassificationsToggle.checked = decisionConfig.features.classifications; - if (systemOneBrowserToggle) systemOneBrowserToggle.checked = decisionConfig.features.browser; - if (systemOneCompletionToggle) systemOneCompletionToggle.checked = decisionConfig.features.completion; - if (systemOneApiKeyInput) systemOneApiKeyInput.value = decisionConfig.apiKey; - if (systemOneWatchThresholdRange) systemOneWatchThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneWatchThreshold) * 100); - if (systemOneCompletionThresholdRange) systemOneCompletionThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneCompletionThreshold) * 100); - void syncDecisionStatus(); - updateSystemOneThresholdLabels(); + if (decisionProviderInput) { + const storedDecisionMode = resolveDecisionMode(stored); + setDecisionMode(storedDecisionMode); + const decisionConfig = resolveDecisionConfig(storedDecisionMode === 'on' ? stored : { ...stored, [DECISION_MODE_KEY]: 'on' }); + decisionProviderInput.value = previousDecisionProvider = decisionConfig.provider; + decisionModelInput.value = decisionConfig.model; + decisionEndpointInput.value = stored.decisionBaseUrl || 'http://127.0.0.1:8009'; + decisionVisionInput.value = stored.decisionVisionMode || 'auto'; + decisionVisionSupported = stored.decisionVisionSupported === true; + decisionThresholdInput.value = String(decisionConfig.threshold * 100); + await refreshD1Settings(); + syncWebgpuDecisionProvider(); + decisionKeyDrafts.set('typesafe', stored.typesafeApiKey || ''); + decisionKeyDrafts.set('openrouter', stored.decisionApiKey || ''); + decisionKeyDrafts.set('local', stored.decisionLocalApiKey || ''); + document.getElementById('decision-endpoint-field').hidden = decisionConfig.provider !== 'local'; + decisionDoneToggle.checked = decisionConfig.features.done; + if (systemOneWatchToggle) systemOneWatchToggle.checked = decisionConfig.features.watch; + if (systemOneClassificationsToggle) systemOneClassificationsToggle.checked = decisionConfig.features.classifications; + if (systemOneBrowserToggle) systemOneBrowserToggle.checked = decisionConfig.features.browser; + if (systemOneCompletionToggle) systemOneCompletionToggle.checked = decisionConfig.features.completion; + if (systemOneApiKeyInput) systemOneApiKeyInput.value = decisionConfig.apiKey; + if (systemOneWatchThresholdRange) systemOneWatchThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneWatchThreshold) * 100); + if (systemOneCompletionThresholdRange) systemOneCompletionThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneCompletionThreshold) * 100); + void syncDecisionStatus(); + updateSystemOneThresholdLabels(); + } // Load vision model config await loadVisionConfig(); @@ -901,11 +826,16 @@ async function init() { await initScreenshotRedactionToggle(); await refreshApocalypseModeStatus(); - // Load providers - const res = await sendToBackground('get_providers'); - providersData = res.providers; - activeProviderId = res.active; - renderProviders(); + // Load providers. The decision card's Auto status reads the active one too. + if (providersContainer || decisionModeInputs.length) { + const res = await sendToBackground('get_providers'); + providersData = res.providers; + activeProviderId = res.active; + renderProviders(); + void syncDecisionStatus(); + } + // Tooling (UI tests, docs screenshots) waits for this before reading the page. + document.documentElement.dataset.settingsReady = 'true'; } // --- Site permissions (capability × origin grants) --- @@ -1423,7 +1353,7 @@ downloadDirectoryInput?.addEventListener('change', async () => { await chrome.storage.local.set({ [DOWNLOAD_DIRECTORY_STORAGE_KEY]: directory }).catch(() => {}); }); -verboseToggle.addEventListener('change', async () => { +verboseToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ verboseMode: verboseToggle.checked }).catch(() => {}); }); @@ -1447,15 +1377,15 @@ helpImproveToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ helpImproveWebBrain: helpImproveToggle.checked }).catch(() => {}); }); -screenshotToggle.addEventListener('change', async () => { +screenshotToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ screenshotFallback: screenshotToggle.checked }).catch(() => {}); }); -maxStepsRange.addEventListener('input', () => { +maxStepsRange?.addEventListener('input', () => { stepsValueLabel.textContent = Number(maxStepsRange.value) === MAX_AGENT_STEPS_UNLIMITED_SENTINEL ? '∞' : maxStepsRange.value; }); -maxStepsRange.addEventListener('change', async () => { +maxStepsRange?.addEventListener('change', async () => { await chrome.storage.local.set({ maxAgentSteps: Number(maxStepsRange.value) === MAX_AGENT_STEPS_UNLIMITED_SENTINEL ? 0 @@ -1501,18 +1431,18 @@ clarifyTimeoutPolicySelect?.addEventListener('change', async () => { await chrome.storage.local.set({ clarifyTimeoutPolicy: policy }).catch(() => {}); }); -autoScreenshotSelect.addEventListener('change', async () => { +autoScreenshotSelect?.addEventListener('change', async () => { await chrome.storage.local.set({ autoScreenshot: autoScreenshotSelect.value }).catch(() => {}); }); -imageDetailSelect.addEventListener('change', async () => { +imageDetailSelect?.addEventListener('change', async () => { const v = imageDetailSelect.value; const imageDetail = (v === 'high' || v === 'low' || v === 'auto') ? v : 'auto'; imageDetailSelect.value = imageDetail; await chrome.storage.local.set({ imageDetail }).catch(() => {}); }); -maxScreenshotsSelect.addEventListener('change', async () => { +maxScreenshotsSelect?.addEventListener('change', async () => { let n = parseInt(maxScreenshotsSelect.value, 10); if (!Number.isFinite(n) || n < 0) n = 0; if (n > 5) n = 5; @@ -1520,7 +1450,7 @@ maxScreenshotsSelect.addEventListener('change', async () => { await chrome.storage.local.set({ maxScreenshotsPerTurn: n }).catch(() => {}); }); -maxImageDimensionSelect.addEventListener('change', async () => { +maxImageDimensionSelect?.addEventListener('change', async () => { let n = parseInt(maxImageDimensionSelect.value, 10); if (!Number.isFinite(n) || n <= 0) n = 1568; n = Math.max(1, Math.min(2048, n)); @@ -1528,7 +1458,7 @@ maxImageDimensionSelect.addEventListener('change', async () => { await chrome.storage.local.set({ maxImageDimension: n }).catch(() => {}); }); -siteAdaptersToggle.addEventListener('change', async () => { +siteAdaptersToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ useSiteAdapters: siteAdaptersToggle.checked }).catch(() => {}); }); @@ -1547,11 +1477,11 @@ if (voiceInputToggle) { }); } -apiMutationObserverToggle.addEventListener('change', async () => { +apiMutationObserverToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ apiMutationObserverEnabled: apiMutationObserverToggle.checked }).catch(() => {}); }); -alwaysAllowApiMutationsToggle.addEventListener('change', async () => { +alwaysAllowApiMutationsToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ alwaysAllowApiMutations: alwaysAllowApiMutationsToggle.checked }).catch(() => {}); }); @@ -1597,29 +1527,23 @@ if (planReviewConfidenceRange) { }); } -notifySoundToggle.addEventListener('change', async () => { +notifySoundToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ notifySound: notifySoundToggle.checked }).catch(() => {}); }); -completionConfettiToggle.addEventListener('change', async () => { +completionConfettiToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ completionConfetti: completionConfettiToggle.checked }).catch(() => {}); }); -completionFlashTabToggle.addEventListener('change', async () => { +completionFlashTabToggle?.addEventListener('change', async () => { await chrome.storage.local.set({ completionFlashTab: completionFlashTabToggle.checked }).catch(() => {}); }); -tracingToggle.addEventListener('change', async () => { - await chrome.storage.local.set({ tracingEnabled: tracingToggle.checked }).catch(() => {}); - losslessTracingToggle.disabled = tracingToggle.checked !== true; - if (!tracingToggle.checked) { - losslessTracingToggle.checked = false; - await chrome.storage.local.set({ losslessTrace: false }).catch(() => {}); - } -}); - -losslessTracingToggle.addEventListener('change', async () => { - await chrome.storage.local.set({ losslessTrace: losslessTracingToggle.checked }).catch(() => {}); +// Record traces is one switch for both trace tiers: on records every run with +// its full request details (losslessTrace), off records neither. +tracingToggle?.addEventListener('change', async () => { + const enabled = tracingToggle.checked; + await chrome.storage.local.set({ tracingEnabled: enabled, losslessTrace: enabled }).catch(() => {}); }); feedbackDiagnosticsToggle?.addEventListener('change', async () => { @@ -1994,6 +1918,7 @@ async function refreshLocalVision() { } async function loadVisionConfig() { + if (!visionBaseUrlInput) return; const stored = await chrome.storage.local.get([ 'visionModel', WEBGPU_VISION_ENABLED_KEY, @@ -2101,7 +2026,7 @@ btnUseWebgpuVision?.addEventListener('click', async () => { } }); -btnSaveVision.addEventListener('click', async () => { +btnSaveVision?.addEventListener('click', async () => { const baseUrl = normalizeOpenAICompatibleBaseUrl(visionBaseUrlInput.value); const apiKey = visionApiKeyInput.value.trim(); const model = visionModelInput.value.trim(); @@ -2116,7 +2041,7 @@ btnSaveVision.addEventListener('click', async () => { flashVisionResult('ok', t('st.vision.saved')); }); -btnTestVision.addEventListener('click', async () => { +btnTestVision?.addEventListener('click', async () => { const baseUrl = normalizeOpenAICompatibleBaseUrl(visionBaseUrlInput.value); const apiKey = visionApiKeyInput.value.trim(); const model = visionModelInput.value.trim(); @@ -2148,7 +2073,7 @@ btnTestVision.addEventListener('click', async () => { } }); -btnClearVision.addEventListener('click', async () => { +btnClearVision?.addEventListener('click', async () => { if (isWebgpuVisionEnabled()) { // Back to Auto; downloaded files stay cached. await setWebgpuVisionChoice(WEBGPU_VISION_CHOICE_AUTO); @@ -2387,7 +2312,7 @@ async function reloadProfileSyncData() { if (profileTextArea) profileTextArea.value = stored.profileText || ''; if (stored.visionModel?.type === 'webgpu') { await loadVisionConfig(); - } else { + } else if (visionBaseUrlInput) { renderVisionConfig(stored.visionModel || {}); } const transcription = stored.transcriptionModel || {}; @@ -2397,11 +2322,19 @@ async function reloadProfileSyncData() { updateMultimodalDetectedProvider('transcription'); renderImageGenConfig(stored.imageGenModel || {}); await loadUserMemorySettings(); + if (!providersContainer) return; const res = await sendToBackground('get_providers'); providersData = res.providers; activeProviderId = res.active; renderProviders(); } +// Profile sync runs from Settings, but what it pulls also fills the Providers +// page. Settings pages open in other tabs reload what they show, so a Save +// there cannot write stale values over the synced ones. +const settingsPagesChannel = typeof BroadcastChannel === 'function' ? new BroadcastChannel('webbrain-settings-pages') : null; +settingsPagesChannel?.addEventListener('message', (event) => { + if (event.data?.type === 'profile-sync-data-changed') reloadProfileSyncData().catch(() => {}); +}); function profileSyncButtonRestore(button, pendingLabel) { if (!button) return () => {}; const previousDisabled = button.disabled; @@ -2415,7 +2348,10 @@ async function profileSyncAction(action, data = {}, options = {}) { try { if (options.pending) showProfileSyncResult(true, options.pending); const result = await sendToBackground(action, data); - if (['profile_sync_unlock', 'profile_sync_now', 'profile_sync_reset'].includes(action)) await reloadProfileSyncData(); + if (['profile_sync_unlock', 'profile_sync_now', 'profile_sync_reset'].includes(action)) { + settingsPagesChannel?.postMessage({ type: 'profile-sync-data-changed' }); + await reloadProfileSyncData(); + } showProfileSyncResult(true, options.success || t('st.sync.result.updated')); await refreshProfileSyncState(); return result; @@ -2449,7 +2385,7 @@ btnProfileSyncLock?.addEventListener('click', () => profileSyncAction('profile_s btnProfileSyncChange?.addEventListener('click', async () => { const oldPassword = window.prompt(t('st.sync.prompt.current_password')); if (!oldPassword) return; let newPassword; try { newPassword = promptConfirmedSyncPassword(); } catch (e) { showProfileSyncResult(false, e.message); return; } if (newPassword) await profileSyncAction('profile_sync_change_password', { oldPassword, newPassword }).catch(() => {}); }); btnProfileSyncDisable?.addEventListener('click', () => { if (window.confirm(t('st.sync.confirm.disable'))) profileSyncAction('profile_sync_disable').catch(() => {}); }); btnProfileSyncReset?.addEventListener('click', async () => { if (!window.confirm(t('st.sync.confirm.reset'))) return; let password; try { password = promptConfirmedSyncPassword(t('st.sync.prompt.replacement_password')); } catch (e) { showProfileSyncResult(false, e.message); return; } if (password) await profileSyncAction('profile_sync_reset', { password }).catch(() => {}); }); -refreshProfileSyncState(); +if (profileSyncStatus) refreshProfileSyncState(); // Persisted to chrome.storage.local in plaintext; the agent picks the // changes up via the storage.onChanged listener in background.js and @@ -2597,6 +2533,7 @@ function renderUserMemoryRecords(records = []) { } async function loadUserMemorySettings() { + if (!userMemoryList) return; const res = await sendToBackground('get_user_memory').catch((error) => ({ ok: false, error: error.message })); if (!res?.ok) { renderUserMemoryRecords([]); @@ -3153,7 +3090,7 @@ function providerSubscriptionGuideHtml(definitionId) { `; } -// The WebGPU chat error points users at Settings > Providers > WebGPU, so the +// The WebGPU chat error points users at Providers > WebGPU, so the // card needs its own download surface instead of sending everyone to // Apocalypse Mode. This drives the same background routes // (`start/stop/get_webgpu_download_status`) with a start/stop button and a @@ -3448,6 +3385,7 @@ async function refreshWebbrainPaymentNotice() { } function renderProviders() { + if (!providersContainer) return; providersContainer.innerHTML = ''; void syncDecisionStatus(); diff --git a/src/chrome/src/ui/sidepanel.js b/src/chrome/src/ui/sidepanel.js index 17b5452edb..ad75a30f46 100644 --- a/src/chrome/src/ui/sidepanel.js +++ b/src/chrome/src/ui/sidepanel.js @@ -340,7 +340,7 @@ const pinCoachmarkDismissed = (async function initPinCoachmark() { function openProviderSettings() { try { - chrome.tabs.create({ url: chrome.runtime.getURL('src/ui/settings.html#providers') }); + chrome.tabs.create({ url: chrome.runtime.getURL('src/ui/providers.html#llm') }); } catch { chrome.runtime.openOptionsPage(); } @@ -469,7 +469,7 @@ const pinCoachmarkDismissed = (async function initPinCoachmark() { if (!providerStatus) return; providerStatus.textContent = ''; const changeLink = document.createElement('a'); - changeLink.href = chrome.runtime.getURL('src/ui/settings.html#providers'); + changeLink.href = chrome.runtime.getURL('src/ui/providers.html#llm'); changeLink.target = '_blank'; changeLink.rel = 'noopener noreferrer'; changeLink.textContent = t('ob.cloud.change'); @@ -1806,7 +1806,7 @@ chrome.storage.onChanged.addListener((changes) => { }); -// Composer switch for the same storage-backed gate as Settings → Permissions and +// Composer switch for the same storage-backed gate as the permissions page and // /dangerously-skip-permissions. Turning prompts off posts the command's // persistent notice. A permission card already waiting is left for the user to // answer: a display switch must never approve a pending action on its own. @@ -2045,7 +2045,7 @@ function closePermissionGatePopover() { } async function openPermissionsSettingsPage() { - const url = chrome.runtime.getURL('src/ui/settings.html#permissions'); + const url = chrome.runtime.getURL('src/ui/permissions.html'); try { await chrome.tabs.create({ url }); } catch { @@ -8654,7 +8654,7 @@ async function loadProviders() { } async function openProvidersSettingsPage() { - const url = chrome.runtime.getURL('src/ui/settings.html#providers'); + const url = chrome.runtime.getURL('src/ui/providers.html#llm'); try { await chrome.tabs.create({ url }); } catch { @@ -13126,7 +13126,7 @@ function parseCostAllowanceError(content) { return { scope: match[1].toLowerCase() === 'this session' ? 'session' : 'total', limitUsd, - message: content.replace(/\s*Increase or reset the allowance in Settings\.\s*$/i, '').trim(), + message: content.replace(/\s*Increase or reset the allowance in Settings(?: → Budgets)?\.\s*$/i, '').trim(), }; } diff --git a/src/chrome/vendor/transformers/README.md b/src/chrome/vendor/transformers/README.md index 37f1ec2ab5..d69e821b81 100644 --- a/src/chrome/vendor/transformers/README.md +++ b/src/chrome/vendor/transformers/README.md @@ -10,7 +10,7 @@ WebGPU paths in Chrome and by offline RAG's CPU/WASM semantic reranker: LFM2.5 and Nanbeige exports. An opt-in Bonsai 27B preset uses a separate vendored bitgpu worker, not this Transformers.js runtime; see `src/chrome/vendor/bitgpu/README.webbrain.md`. -- **Settings -> Multimodal -> Vision -> LFM2.5-VL local fallback** runs +- **Providers -> Vision -> LFM2.5-VL local fallback** runs `LiquidAI/LFM2.5-VL-450M-ONNX` as the dedicated screenshot sidecar. - **Apocalypse Mode -> Offline RAG** runs the explicitly downloaded, pinned `Xenova/multilingual-e5-small` q8 model in a separate CPU/WASM worker. Model diff --git a/src/firefox/ARCHITECTURE.md b/src/firefox/ARCHITECTURE.md index 4a0d03c575..543895328a 100644 --- a/src/firefox/ARCHITECTURE.md +++ b/src/firefox/ARCHITECTURE.md @@ -1,6 +1,6 @@ # WebBrain Firefox Extension — Architecture -> Version 42.0.6 · Manifest V2 · Background Page +> Version 42.1.0 · Manifest V2 · Background Page ## How Firefox Differs from Chrome @@ -96,8 +96,11 @@ src/firefox/ │ └── ui/ │ ├── sidepanel.html │ ├── sidepanel.js # Chat UI, verbose mode, deep verbose -│ ├── settings.html -│ ├── settings.js +│ ├── settings.html # Settings: General, Budgets, Memory, Skills, CAPTCHA, Bridge, Advanced +│ ├── providers.html # Providers: LLM, Vision, Speech, Generative, Decision, SafeSocial +│ ├── permissions.html # Site permissions +│ ├── settings.css # Shared by the three settings pages +│ ├── settings.js # One controller for all three settings pages │ ├── traces.html │ └── traces.js ├── skills/ # Packaged default skills (removable after seeding) diff --git a/src/firefox/manifest.json b/src/firefox/manifest.json index 9fb8425325..02ff034de4 100644 --- a/src/firefox/manifest.json +++ b/src/firefox/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "WebBrain", - "version": "42.0.6", + "version": "42.1.0", "description": "Open-source AI browser agent — chat with pages, automate tasks, multi-provider LLM support.", "permissions": [ "activeTab", diff --git a/src/firefox/src/agent/adapters.js b/src/firefox/src/agent/adapters.js index e722ae5fea..e68c334c4b 100644 --- a/src/firefox/src/agent/adapters.js +++ b/src/firefox/src/agent/adapters.js @@ -17661,6 +17661,7 @@ const ADAPTERS = [ - First-time setup REQUIRES the user to scan a QR code with their phone's WhatsApp app. The agent CANNOT scan a QR code — if the QR is on screen, surface it to the user and stop. Don't loop waiting for it to disappear. - Once linked, layout is: conversation list on the LEFT (chats sorted by recency), active conversation on the RIGHT. - Message input is a contenteditable div at the bottom of the conversation. set_field works; Enter sends by default. +- Open the recipient's chat first: click_ax its row in the chat list, or search for them. Then, before sending or attaching, confirm the contact: click_ax the contact name in the chat header, and close the Contact info panel it opens with that panel's own Close button. Until then message actions are blocked, and the blocked result names the exact control. One run confirms one chat. - Emoji picker, attachment button (paperclip), voice-note (mic) sit to the left/right of the input. - Search at the top of the conversation list searches across all chats (people, group names, message content). - "Status" tab (eye icon) is a separate stream of ephemeral updates; "Calls" tab shows call history and starts voice/video calls. @@ -18347,6 +18348,21 @@ export function getMessageRecipientGuardPolicy(url) { }; } +/** + * Native chat clients whose recipient guard confirms a contact and reads the + * latest messages through the chat tools (chat_observe, chat_send). Lean mode + * keeps that guard, so it offers those two tools on these pages. + */ +export function isNativeChatClientUrl(url) { + try { + const parsed = new URL(url); + return parsed.protocol === 'https:' && (parsed.hostname === 'web.whatsapp.com' + || /^(?:web|webk|weba|webz|k)\.telegram\.org$/i.test(parsed.hostname)); + } catch { + return false; + } +} + /** * Get a printable list of all registered adapters (for settings UI / docs). */ diff --git a/src/firefox/src/agent/agent.js b/src/firefox/src/agent/agent.js index 78aafbca21..7981b9f0f2 100644 --- a/src/firefox/src/agent/agent.js +++ b/src/firefox/src/agent/agent.js @@ -63,7 +63,7 @@ import { buildGithubStargazerProgressItems } from './observers/github-stargazers import { analyzeMastodonPage, isMastodonPageUrl, mastodonHandoffInstruction, mastodonPageLabels, mastodonProgressGuard, mastodonTaskDomains } from './observers/mastodon.js'; import { PROGRESS_ACTIONS, isProgressActionAllowed, isProgressIntentActive, normalizeProgressAction, normalizeProgressIntent } from './progress-intent.js'; import { classifyCompletionForm, completionDoneBlock, completionPlainFinalBlock, completionPlainFinalPartial, consumeCompletionObservation, consumeCompletionObservationResult, createCompletionInvariantState, didCompletionActionExecute, hasUnconsumedCompletionObservation, hasUnconsumedCompletionObservationResult, isCompletionActionTool, publicationDetailResource, publicationReplyParent, publicationResourceRecordRoot, recordCompletionToolResult } from './completion-invariant.js'; -import { findLastGmailResultPage, getActiveAdapter, getAdapterWorkflowRouting, getCarouselNavigationPolicy, getCarouselNavigationTarget, getGmailResultCountPolicy, getGmailResultPageUrl, getMessageRecipientGuardPolicy, isGmailChatRoute, isPublicComposerRoute, parseCarouselSlideCount, parseGmailPaginationRange, resolveAdapterWorkflowJob, UNIVERSAL_PREAMBLE } from './adapters.js'; +import { findLastGmailResultPage, getActiveAdapter, getAdapterWorkflowRouting, getCarouselNavigationPolicy, getCarouselNavigationTarget, getGmailResultCountPolicy, getGmailResultPageUrl, getMessageRecipientGuardPolicy, isGmailChatRoute, isNativeChatClientUrl, isPublicComposerRoute, parseCarouselSlideCount, parseGmailPaginationRange, resolveAdapterWorkflowJob, UNIVERSAL_PREAMBLE } from './adapters.js'; import { formatAdapterWorkflowExecutionPolicy } from './adapter-workflow.js'; import { invalidateWorkflowInventoryCompleteness, @@ -709,14 +709,14 @@ export class Agent extends LoopDetector { // Permission/form-submit prompts are never timed out. // Loaded from browser.storage.local in background.js (default 60). this.clarifyTimeoutSec = 60; - // Settings → General → "When a question times out": 'finish' (default) + // Settings → Budgets → "When a question times out": 'finish' (default) // keeps the task moving, 'safe' takes the safe default. See clarify-timeout.js. this.clarifyTimeoutPolicy = 'finish'; - // Settings → General → "Strict checks" (off by default): quality + // Settings → Advanced → "Strict checks" (off by default): quality // guards advise instead of refusing. See guard-policy.js. this.strictGuards = false; this._guardRunStates = new Map(); - // Settings → General → "Lean mode": 'auto' (default) | 'on' | 'off'. A run + // Settings → Advanced → "Lean mode": 'auto' (default) | 'on' | 'off'. A run // resolves it once at its start (_beginLeanRun) and keeps the answer in // _leanRuns, so its tools, prompt and guards agree. See lean-mode.js. this.leanMode = 'auto'; @@ -749,7 +749,9 @@ export class Agent extends LoopDetector { // next step (compact-every-step thrash). A genuine token-budget overflow is // never suppressed — see _manageContext. this._compactCooldown = new Map(); - this.autoScreenshot = 'state_change'; + // Auto-screenshot mode; the default captures after the agent navigates, + // not after every click or keystroke. Loaded from storage in background.js. + this.autoScreenshot = 'navigation'; this.useSiteAdapters = true; this.researchEscalationEnabled = false; this.researchEscalationEngine = RESEARCH_ESCALATION_ENGINE; @@ -936,7 +938,7 @@ export class Agent extends LoopDetector { try { await browser.storage.local.set({ wb_permissions: grants }); } catch { /* best-effort */ } }, }); - // Master switch (Settings → Permissions): when the user turns OFF "Ask + // Master switch (permissions page and side panel): when the user turns OFF "Ask // before consequential actions", the permission gate is bypassed entirely // for fast/trusted usage. Default ON. Layers 1 & 2 (untrusted-content // wrapping + system-prompt contract) stay active regardless — they cost @@ -944,7 +946,7 @@ export class Agent extends LoopDetector { this._skipPermissionGate = false; this._gateSettingLoaded = false; // Keep in-memory state in sync when storage changes out-of-band — a grant - // revoked in Settings, or the master switch toggled. + // revoked on the permissions page, or the master switch toggled. try { browser.storage.onChanged.addListener((changes, area) => { if (area !== 'local') return; @@ -5251,7 +5253,7 @@ export class Agent extends LoopDetector { }; } - // Completion guards under the default policy (Settings → General → + // Completion guards under the default policy (Settings → Advanced → // "Strict checks" off; see guard-policy.js). A completion guard refuses a // done or a plain final at most once per run, and that refusal is the // model's note. The next completion the same guard would refuse is @@ -8540,7 +8542,7 @@ export class Agent extends LoopDetector { _costAllowanceMessage(scope, spentUsd, limitUsd) { const scopeText = scope === 'session' ? 'this session' : 'total cloud/router usage'; - return `Cloud cost allowance reached: ${scopeText} is ${this._formatUsd(spentUsd)} against the ${this._formatUsd(limitUsd)} limit. Stopping before further cloud/router model calls. Increase or reset the allowance in Settings.`; + return `Cloud cost allowance reached: ${scopeText} is ${this._formatUsd(spentUsd)} against the ${this._formatUsd(limitUsd)} limit. Stopping before further cloud/router model calls. Increase or reset the allowance in Settings → Budgets.`; } // `pending`: which requests in flight to count at their most (see @@ -19043,7 +19045,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d * wait forever). Invalid values fall back to the product default of 60s. * Stored slider values above 1200 mean Off. */ - // Settings → General → "Strict checks": every quality guard blocks again. + // Settings → Advanced → "Strict checks": every quality guard blocks again. _guardStrict() { return this.strictGuards === true; } @@ -19148,7 +19150,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d } /** - * Settings → General → "Lean mode" for a run on `tabId` with `provider` + * Settings → Advanced → "Lean mode" for a run on `tabId` with `provider` * (the tab's active provider by default): 'on' and 'off' decide; 'auto' * turns it on only for a strong model on a cloud provider whose prompt tier * is Full (lean-mode.js). Act mode only: Ask, Dev and standalone chat keep @@ -28368,6 +28370,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d supportsRecipientSets: policy.supportsRecipientSets === true, ...(name === 'upload_file' ? { uploadSourceKey } : {}), ...(target?.target_kind === 'named' ? { expectedRecipients: target.recipients } : {}), + ...(this._messageTargetNamesRecipient(guard, target) ? { namedRecipientSelection: true } : {}), }); if (probe?.success === true && probe?.conclusive === true && probe.messageSend === false) { if (probe.nativeTelegramRepair === true) { @@ -28697,6 +28700,15 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d // says so, instead of sending the agent to re-read and retry in vain. const contactCheckSpent = inconclusive && probe?.nativeWhatsappRepairSpent === true && probe?.reasonCode === 'native_whatsapp_contact_check_spent' && typeof probe?.error === 'string'; + // A native WhatsApp chat whose contact this run has not confirmed yet. + // The model is told the one control that confirms it, by its exact ref: + // "re-read and retry" kept a model clicking Attach and the chat row, + // each blocked again, until it gave up without sending. + const whatsappContactCheck = inconclusive && !contactCheckSpent + && probe?.reasonCode === 'native_whatsapp_contact_binding_required' + ? this._nativeWhatsappContactCheckGuidance(probe?.nativeWhatsappRepairTarget, + { namedRecipient: this._messageTargetNamesRecipient(guard, target) }) + : ''; // Human-readable view of who the page actually addresses, so a mismatch // block can name the exact observed recipient. const observedRecipientLabel = (() => { @@ -28720,7 +28732,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d reasonCode: inconclusive ? (probe?.reasonCode || 'message_send_classification_inconclusive') : (target ? 'active_recipient_unverified' : 'authorized_recipient_missing'), - error: contactCheckSpent ? String(probe.error || '') : missingLinkedInComposer + error: contactCheckSpent ? String(probe.error || '') : whatsappContactCheck ? whatsappContactCheck : missingLinkedInComposer ? (probe?.reasonCode === 'message_commit_without_composer' ? 'Message send blocked: this control commits a message (for example "Send" / "Send without a note") but no active composer or recipient could be verified. Changing click targeting methods will not help. Open the intended conversation so its composer and recipient are visible, or report that the message could not be sent.' : 'Message send blocked: no message composer is visible, so this send cannot be verified. Changing click targeting methods will not resolve this classification failure. Re-read the page to find a supported navigation or composer-opening control; if none is available, report the blocker instead of repeating the click.') @@ -28736,6 +28748,39 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d }; } + // Whether a request names the person its message is for, so that it may + // open that person's WhatsApp chat from the chat list before the contact + // check. A request for the open chat itself ("this one"), with or without + // people named besides it, and a target already pinned to a verified chat + // identity keep the check on the chat that was open. + _messageTargetNamesRecipient(guard, target) { + const named = normalizeMessageTarget(target); + return named?.target_kind === 'named' && named.recipients.length > 0 + && named.recipients.every(item => !/^whatsapp:/i.test(String(item?.identity || ''))) + && !(Array.isArray(guard?.activeConversationRecipients) && guard.activeConversationRecipients.length > 0) + && !normalizeMessageTarget(guard?.requestedMessaging); + } + + // What the model reads when a message action is blocked in a native + // WhatsApp chat whose contact the run has not confirmed yet. The page names + // the confirming control (the contact name in the chat header, then the + // Contact info panel's Close button) as an app-issued ref when it can. + _nativeWhatsappContactCheckGuidance(repairTarget, { namedRecipient = false } = {}) { + const ref = typeof repairTarget?.ref_id === 'string' && /^ref_[A-Za-z0-9_:-]{1,100}$/.test(repairTarget.ref_id) + ? repairTarget.ref_id : ''; + if (ref && repairTarget.phase === 'close_contact') { + return `Message action blocked, nothing was sent: this chat's Contact info panel is still open. Close it with click_ax({ref_id:"${ref}"}), the panel's own Close button, to finish confirming the contact, then retry this action.`; + } + const confirm = ref && repairTarget.phase === 'open_contact' + ? `click_ax({ref_id:"${ref}"}), the contact name in the chat header` + : 'click_ax only the contact name in the chat header (read the header with get_accessibility_tree first)'; + return 'Message action blocked, nothing was sent: on WhatsApp, WebBrain confirms who the open chat is with before any message action in it, and this chat is not confirmed yet. ' + + (namedRecipient + ? 'If this is not the chat of the person the message is for, open their chat from the chat list first; the check applies to the chat that is open. ' + : '') + + `To confirm it, ${confirm}, then close the Contact info panel it opens with that panel's own Close button, and retry this action. The avatar, call, search and menu buttons do not confirm a contact.`; + } + /** * What the model reads when a send to an unconfirmed recipient could not be * put to the user (an unattended run) or was not confirmed. It names both @@ -28956,7 +29001,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d * 'once' lets this one step go ahead, anything else refuses it. Returns * 'once' | 'deny', or null when Stop or a correction cancelled the card. * - * A quality guard's card (`hard: false`) follows Settings → General: the + * A quality guard's card (`hard: false`) follows Settings → Budgets: the * clarify timeout (Off waits for the user, Instant answers at once) and * "When a question times out" ('finish' goes ahead, 'safe' does not). A * hard-class card never times out, like the recipient and deletion cards, @@ -43405,7 +43450,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d const stored = await browser.storage.local.get(CAPTCHA_SETTINGS_KEYS); const providers = getCaptchaProviders(stored); if (!providers.length) { - return noDispatchFailure('No CAPTCHA solver is enabled with a valid API key. Save and enable a CAPTCHA provider key in Settings → General → Advanced, or ask the user to solve the CAPTCHA manually.'); + return noDispatchFailure('No CAPTCHA solver is enabled with a valid API key. Save and enable a CAPTCHA provider key in Settings → CAPTCHA, or ask the user to solve the CAPTCHA manually.'); } let websiteURL = ''; @@ -45815,7 +45860,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d if (stagedVisionRoute && !stagedVisionRoute.provider && stagedVisionRoute.visionStatus) continue; if (!provider?.supportsVision && (!stagedVisionRoute?.provider || stagedVisionRoute.rawImage)) { const overrideHint = provider?.config?.visionMode != null - ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Settings.' + ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Providers.' : ''; return { ok: false, @@ -45850,7 +45895,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d } if (!provider?.supportsVision && (!stagedVisionRoute?.provider || stagedVisionRoute.rawImage)) { const overrideHint = provider?.config?.visionMode != null - ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Settings.' + ? ' If automatic detection is unavailable or incorrect, set Vision capability to Force on in Providers.' : ''; return { ok: false, @@ -46321,6 +46366,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, autoModeEscalation: mode === 'ask' && this._autoModeEscalationTabs.has(tabId), }); @@ -46599,6 +46645,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, autoModeEscalation: mode === 'ask' && this._autoModeEscalationTabs.has(tabId), }); @@ -47815,6 +47862,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, }); // Match the non-streaming path: selection-grounded turns are tool-free so @@ -47929,6 +47977,7 @@ Rules: no prose intro, no conclusion, no "this screenshot shows...", no layout d watchBeep: this.scheduledRunPolicies.get(tabId)?.watch?.beep === true, carouselNavigation: !!getCarouselNavigationPolicy(await this._currentUrl(tabId)), gmailResultCounting: !!getGmailResultCountPolicy(await this._currentUrl(tabId)), + nativeChatTools: isNativeChatClientUrl(await this._currentUrl(tabId)), researchEscalationEnabled: this.researchEscalationEnabled, }); tools = this._botMemoryRunTools(tabId, tools); diff --git a/src/firefox/src/agent/clarify-timeout.js b/src/firefox/src/agent/clarify-timeout.js index a591ea67b3..d19bd3f619 100644 --- a/src/firefox/src/agent/clarify-timeout.js +++ b/src/firefox/src/agent/clarify-timeout.js @@ -1,6 +1,6 @@ // What WebBrain does when nobody answers a clarify question in time. // -// The user chooses this in Settings → General ("When a question times out"): +// The user chooses this in Settings → Budgets ("When a question times out"): // - 'finish' (default) keeps the task moving. The option the model named as // finish_option applies as the answer; without one, the model continues // with the choice that best completes the task. Runs no longer stall diff --git a/src/firefox/src/agent/fal-media.js b/src/firefox/src/agent/fal-media.js index e30efcfa4f..c3ee2a92d4 100644 --- a/src/firefox/src/agent/fal-media.js +++ b/src/firefox/src/agent/fal-media.js @@ -1,6 +1,6 @@ // fal.ai generative media (assistive model). // -// Configured in Settings -> Assistive Models -> Generative Media (fal.ai provider). +// Configured in Providers -> Generative (fal.ai provider). // and stored in extension storage as `imageGenModel = { apiKey, model }`. // fal.ai uses a queue API: submit a prompt, poll status_url, then fetch // response_url. Auth uses `Authorization: Key `. diff --git a/src/firefox/src/agent/generative-media.js b/src/firefox/src/agent/generative-media.js index ef0d80ec60..ffbf00b497 100644 --- a/src/firefox/src/agent/generative-media.js +++ b/src/firefox/src/agent/generative-media.js @@ -219,7 +219,7 @@ export async function generateImage(args, options = {}) { const fetchImpl = typeof options === 'function' ? options : options.fetchImpl || fetch; try { const config = Object.hasOwn(options, 'config') ? options.config : await readMediaConfig(); - if (!config) throw new Error('Configure Generative Media in Settings → Assistive Models.'); + if (!config) throw new Error('Configure Generative Media in Providers → Generative.'); const result = await runMediaGeneration({ prompt: args?.prompt, config, fetchImpl, signal: options.signal }); if (result.url.startsWith('data:')) { const asset = await storeGeneratedMedia(result.url); diff --git a/src/firefox/src/agent/lean-mode.js b/src/firefox/src/agent/lean-mode.js index 1401297945..8adefde3f5 100644 --- a/src/firefox/src/agent/lean-mode.js +++ b/src/firefox/src/agent/lean-mode.js @@ -1,4 +1,4 @@ -// Lean mode: Settings → General → "Lean mode" ('auto' | 'on' | 'off'). +// Lean mode: Settings → Advanced → "Lean mode" ('auto' | 'on' | 'off'). // // A strong model does not need WebBrain's verification scaffolding: the // extra tools, readbacks, completion judges and forced re-check turns that diff --git a/src/firefox/src/agent/media-config.js b/src/firefox/src/agent/media-config.js index e434710fba..62937413d6 100644 --- a/src/firefox/src/agent/media-config.js +++ b/src/firefox/src/agent/media-config.js @@ -1,6 +1,6 @@ // Provider settings are user-authored. Model tool arguments never select a host or key. export const IMAGE_GEN_MODEL_KEY = 'imageGenModel'; -export const GENERATIVE_MEDIA_SETUP_NOTE = 'Built-in media generation requires setup in Settings → Assistive Models → Generative Media.'; +export const GENERATIVE_MEDIA_SETUP_NOTE = 'Built-in media generation requires setup in Providers → Generative.'; export const GENERATIVE_MEDIA_TIER_NOTE = 'Built-in media generation requires Full-tier Act mode.'; export const MEDIA_PROVIDERS = Object.freeze({ fal: { label: 'fal.ai', model: 'fal-ai/flux/schnell', keyPlaceholder: 'FAL_KEY', docs: 'https://fal.ai/dashboard/keys' }, diff --git a/src/firefox/src/agent/rich-text-toolbar-probe.js b/src/firefox/src/agent/rich-text-toolbar-probe.js index 1a0b937781..3e78b93026 100644 --- a/src/firefox/src/agent/rich-text-toolbar-probe.js +++ b/src/firefox/src/agent/rich-text-toolbar-probe.js @@ -342,7 +342,7 @@ export class RichTextToolbarProbe { || el.getAttribute('data-slate-editor') === 'true' || el.getAttribute('data-lexical-editor') === 'true' || Array.from(el.children).some(child => child.getAttribute('data-contents') === 'true'))) { return { ok: false, dispatched: false, trustedTypeRequired: true, - error: 'This rich-text editor requires Firefox trusted automation. Enable it in Settings → General → Advanced and retry.' }; + error: 'This rich-text editor requires Firefox trusted automation. Enable it in Settings → Advanced and retry.' }; } // Preparation only binds a marker. Focus belongs after this frame's // dispatch fence and must retain the exact marked target. diff --git a/src/firefox/src/agent/terminal-messages.js b/src/firefox/src/agent/terminal-messages.js index a091c90107..1c9638b84a 100644 --- a/src/firefox/src/agent/terminal-messages.js +++ b/src/firefox/src/agent/terminal-messages.js @@ -103,6 +103,6 @@ export function stepLimitUserMessage(steps, lastAssistantText = '') { const lines = [`I reached the step limit${count ? ` (${count} step${count === 1 ? '' : 's'})` : ''} before finishing the task.`]; const snippet = String(lastAssistantText || '').replace(/\s+/g, ' ').trim(); if (snippet) lines.push(`Where I stopped: "${snippet.slice(0, 280)}${snippet.length > 280 ? '...' : ''}"`); - lines.push('This usually means the task is too complex for the current model, the step limit is too low (you can raise it in Settings), or the task should be split into smaller parts.'); + lines.push('This usually means the task is too complex for the current model, the step limit is too low (you can raise it in Settings → Budgets), or the task should be split into smaller parts.'); return lines.join('\n\n'); } diff --git a/src/firefox/src/agent/tools.js b/src/firefox/src/agent/tools.js index 55d71d22c5..30ab0ad202 100644 --- a/src/firefox/src/agent/tools.js +++ b/src/firefox/src/agent/tools.js @@ -1298,7 +1298,7 @@ export const AGENT_TOOLS = [ type: 'function', function: { name: 'solve_captcha', - description: "Solve a CAPTCHA using compatible providers enabled in Settings → General → Advanced, in descending weight order. A single call may charge multiple providers on fallback. Follow the runtime CAPTCHA gate: never repurchase an unresolved challenge from an attempted provider. A new challenge or a runtime-offered AWS fallback can proceed after fresh inspection. Omit providerTasks for automatic reCAPTCHA v2/v3, hCaptcha, Turnstile, AWS WAF, and image handling. AWS WAF observes initial or secondary verification inputs and applies its cookie; reload once and read the page to verify clearance. For ALL other documented methods, first read get_captcha_capabilities and the selected method schemas, then provide one native task per compatible enabled provider with observed parameters and inject:false. Native methods preserve tokens, cookies, coordinates, audio/text, and structured answers; apply them using apply_captcha_solution. Unknown or missing parameters fail before spending. Verify page progress; a returned answer is not proof of clearance. Missing provider/input or failed solving requires manual completion.", + description: "Solve a CAPTCHA using compatible providers enabled in Settings → CAPTCHA, in descending weight order. A single call may charge multiple providers on fallback. Follow the runtime CAPTCHA gate: never repurchase an unresolved challenge from an attempted provider. A new challenge or a runtime-offered AWS fallback can proceed after fresh inspection. Omit providerTasks for automatic reCAPTCHA v2/v3, hCaptcha, Turnstile, AWS WAF, and image handling. AWS WAF observes initial or secondary verification inputs and applies its cookie; reload once and read the page to verify clearance. For ALL other documented methods, first read get_captcha_capabilities and the selected method schemas, then provide one native task per compatible enabled provider with observed parameters and inject:false. Native methods preserve tokens, cookies, coordinates, audio/text, and structured answers; apply them using apply_captcha_solution. Unknown or missing parameters fail before spending. Verify page progress; a returned answer is not proof of clearance. Missing provider/input or failed solving requires manual completion.", parameters: { type: 'object', properties: { @@ -1342,7 +1342,7 @@ export const AGENT_TOOLS = [ type: 'function', function: { name: 'generate_image', - description: 'Generate media (usually an image) from a text prompt using the user\'s configured generative media provider (Settings → Assistive Models → Generative Media). Supports fal.ai, OpenRouter, Comfy Router and local ComfyUI workflows; generation may take several minutes. Returns a media URL or inline media displayed in the chat. Not available in Ask mode.', + description: 'Generate media (usually an image) from a text prompt using the user\'s configured generative media provider (Providers → Generative). Supports fal.ai, OpenRouter, Comfy Router and local ComfyUI workflows; generation may take several minutes. Returns a media URL or inline media displayed in the chat. Not available in Ask mode.', parameters: { type: 'object', properties: { @@ -1799,7 +1799,7 @@ export function getToolsForMode(mode, opts = {}) { const tier = opts.tier || (opts.compact ? 'compact' : 'full'); const normalizedMode = mode === 'dev' ? 'dev' : (mode === 'ask' ? 'ask' : 'act'); const devCompactBlocked = normalizedMode === 'dev' && tier === 'compact'; - // Lean mode (Settings → General → "Lean mode", Act only): strong models get + // Lean mode (Settings → Advanced → "Lean mode", Act only): strong models get // a small subset of the normal tools instead of the tier's list. Same // schemas, no new tools; see lean-mode.js and LEAN_TOOL_NAMES below. const lean = opts.lean === true && normalizedMode === 'act'; @@ -1814,7 +1814,8 @@ export function getToolsForMode(mode, opts = {}) { // A Compact provider keeps its upload_file schema: its permission gate // accepts only an attachment and a target from upload_file's own discovery. base = AGENT_TOOLS - .filter(t => LEAN_TOOL_NAMES.has(t.function.name)) + .filter(t => LEAN_TOOL_NAMES.has(t.function.name) + || (opts.nativeChatTools === true && LEAN_NATIVE_CHAT_TOOL_NAMES.has(t.function.name))) .map(t => (tier === 'compact' && t.function.name === 'upload_file' ? compactUploadFileTool(t) : t)); } else if (tier === 'compact') { base = AGENT_TOOLS @@ -2454,7 +2455,7 @@ LISTINGS: - On listing/search-result pages, EXTRACT first, paginate second: list each visible item to the user (title + price/date + link), then move to the next page. For "give me the links/items" tasks, call done with what you have as soon as it's useful — partial-but-delivered beats complete-but-never-delivered.`; /** - * Lean tool set (Settings → General → "Lean mode", Act only). A thin surface + * Lean tool set (Settings → Advanced → "Lean mode", Act only). A thin surface * in the spirit of Claude in Chrome for strong models: read the page, act by * ref or by a point from a screenshot, type, press keys, scroll, navigate, * wait, upload, and ask or finish. Tabs are not model-callable in WebBrain, so @@ -2471,6 +2472,16 @@ export const LEAN_TOOL_NAMES = new Set([ 'generate_image', 'carousel_navigate', 'gmail_count_results', ]); +/** + * Chat tools a lean run is also offered on a native chat client (WhatsApp + * Web, Telegram Web; `nativeChatTools`, from isNativeChatClientUrl). Lean mode + * keeps the recipient guard, which confirms a contact and reads the latest + * messages there through chat_observe and sends through chat_send. Without + * them its repairs pointed at tools the run did not have, and the planner's + * chat_observe/chat_send steps could not run. + */ +export const LEAN_NATIVE_CHAT_TOOL_NAMES = new Set(['chat_observe', 'chat_send']); + /** * Lean Act prompt: short, with the hard limits and the prompt-injection * boundary kept in full. WebBrain runs no quality checks in lean mode, so the diff --git a/src/firefox/src/background.js b/src/firefox/src/background.js index bfa86a191e..e812b938a7 100644 --- a/src/firefox/src/background.js +++ b/src/firefox/src/background.js @@ -529,6 +529,31 @@ async function loadAutoScreenshot() { } loadAutoScreenshot(); +// Settings has one Record traces switch for both trace tiers: full request +// details are recorded whenever traces are. A profile from before the merge +// can have the two set apart, so the update lines them up once and the switch +// shows what is recorded. A new install has nothing to line up and only notes +// that, so harnesses that set the tiers apart on a fresh profile keep their +// choice, as does anyone who sets them apart after the merge. +const TRACE_TIERS_MERGED_KEY = 'traceTiersMergedV1'; +async function mergeTraceTiers(reason) { + if (reason === 'install') { + await browser.storage.local.set({ [TRACE_TIERS_MERGED_KEY]: true }); + return; + } + if (reason !== 'update') return; + const stored = await browser.storage.local.get(['tracingEnabled', 'losslessTrace', TRACE_TIERS_MERGED_KEY]); + if (stored[TRACE_TIERS_MERGED_KEY] === true) return; + const updates = { [TRACE_TIERS_MERGED_KEY]: true }; + if ((stored.tracingEnabled === true) !== (stored.losslessTrace === true)) { + updates.losslessTrace = stored.tracingEnabled === true; + } + await browser.storage.local.set(updates); +} +browser.runtime.onInstalled.addListener(({ reason }) => { + mergeTraceTiers(reason).catch(() => {}); +}); + async function loadSiteAdapters() { const stored = await browser.storage.local.get('useSiteAdapters'); if (stored.useSiteAdapters != null) agent.useSiteAdapters = stored.useSiteAdapters; @@ -3903,7 +3928,14 @@ async function handleMessage(msg, sender) { imported.settings, ) : imported.settings; - await browser.storage.local.set(settings); + // Exports carry Record traces only. A restored export brings full request + // details along with it, as the Settings switch does. A provisioning + // patch can turn both off, but never turns full request details on. + const traceTiers = Object.hasOwn(settings, 'tracingEnabled') + && (msg.action === 'import_config' || settings.tracingEnabled !== true) + ? { losslessTrace: settings.tracingEnabled === true } + : {}; + await browser.storage.local.set({ ...settings, ...traceTiers }); await providerManager.load(); await Promise.all([ loadMaxSteps(), @@ -4291,9 +4323,10 @@ async function handleMessage(msg, sender) { } case 'd1_control': { + // The D1 controls are on the Decision tab of the Providers page. const api = globalThis.browser || globalThis.chrome; - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); - if (sender.id !== api.runtime.id || String(sender.url || '').split('#')[0] !== settingsUrl) return { success: false, error: 'D1 model controls are available only from extension Settings.' }; + const providersUrl = api.runtime.getURL('src/ui/providers.html'); + if (sender.id !== api.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== providersUrl) return { success: false, error: 'D1 model controls are available only from the extension Providers page.' }; try { await strictSecretModeReady; if (agent.strictSecretMode && !['dispose', 'reset', 'stop', 'clear', 'status'].includes(msg.command)) throw new Error('D1 is disabled in Strict Secret Mode.'); @@ -4552,10 +4585,11 @@ browser.commands.onCommand.addListener(async (command, tab) => { } }); -// Connection controls belong only to the packaged Settings page, never a tab. +// Connection controls belong only to the packaged Settings page (its Advanced +// tab, which may be opened as settings.html#advanced), never a tab. browser.runtime.onMessage.addListener((message, sender) => { if (message?.type !== 'WB_BIDI_CONNECT' && message?.type !== 'WB_BIDI_DISCONNECT') return; - if (sender.id !== browser.runtime.id || sender.url !== browser.runtime.getURL('src/ui/settings.html')) return; + if (sender.id !== browser.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== browser.runtime.getURL('src/ui/settings.html')) return; if (message.type === 'WB_BIDI_DISCONNECT') { firefoxBidi.disconnect(); return Promise.resolve({ success: true }); } return firefoxBidi.connect().then(() => ({ success: true }), error => ({ success: false, error: error.message })); }); diff --git a/src/firefox/src/bidi/client.js b/src/firefox/src/bidi/client.js index 67e0b664fd..12cab921da 100644 --- a/src/firefox/src/bidi/client.js +++ b/src/firefox/src/bidi/client.js @@ -152,7 +152,7 @@ export class FirefoxBidiClient { async captureFullPage(tabId, beforeCapture = async () => {}) { const epoch = this.connectionEpoch; const settings = await this.api.storage.local.get('firefoxBidiEnabled'); - if (!settings.firefoxBidiEnabled) throw new Error('Full-page screenshots require Firefox trusted automation. Install the local companion and enable it in Settings → General → Advanced.'); + if (!settings.firefoxBidiEnabled) throw new Error('Full-page screenshots require Firefox trusted automation. Install the local companion and enable it in Settings → Advanced.'); if (this.captures.has(tabId)) throw new Error('A full-page screenshot is already in progress for this tab'); const owner = {}; this.captures.set(tabId, owner); diff --git a/src/firefox/src/config-transfer.js b/src/firefox/src/config-transfer.js index c4a0923ca7..c2acb8703a 100644 --- a/src/firefox/src/config-transfer.js +++ b/src/firefox/src/config-transfer.js @@ -36,7 +36,7 @@ export const DEFAULT_CONFIG_SETTINGS = Object.freeze({ clarifyTimeoutSec: 60, clarifyTimeoutSemanticsV2: true, clarifyTimeoutPolicy: 'finish', - autoScreenshot: 'state_change', + autoScreenshot: 'navigation', useSiteAdapters: true, researchEscalationEnabled: false, researchEscalationEngine: 'chatgpt', diff --git a/src/firefox/src/content/chat-observation.js b/src/firefox/src/content/chat-observation.js index 6146452cfe..00dce3c9c5 100644 --- a/src/firefox/src/content/chat-observation.js +++ b/src/firefox/src/content/chat-observation.js @@ -482,6 +482,15 @@ let whatsappPending = null; let whatsappActive = null; let whatsappRepairAnchor = null; + // The anchor is normally the first chat the run looks at. A run that names + // its recipient may first have to open that person's chat from the chat + // list: the recipient probe reports that selection, and the anchor then + // follows WhatsApp's selection until the run arms its one check (a guarded + // header click). A run for the open chat itself ("this one") never moves + // its anchor, since that chat is its target. Once a check is armed the + // anchor stays with that chat, and a later selection change spends it. + let whatsappAnchorFollowsSelection = false; + let whatsappCheckArmed = false; const whatsappRendered = node => { if (!visible(node)) return false; for (let current = node, depth = 0; current && depth < 128; current = current.parentElement, depth++) { @@ -556,6 +565,7 @@ whatsappRestore = restore && typeof restore === 'object' ? restore : null; if (next !== whatsappOwner) { invalidateWhatsappBindings(false, true); whatsappRepairAnchor = null; whatsappOwner = next; + whatsappAnchorFollowsSelection = false; whatsappCheckArmed = false; let sameRunSourceChanged = false; try { const prior = JSON.parse(whatsappParkedFloor?.owner || 'null'), current = JSON.parse(next || 'null'); @@ -734,22 +744,38 @@ if (!pins || !contains(pins.carrier, target)) return false; invalidateWhatsappBindings(true, true); whatsappPending = { pins, owner: whatsappOwner, priorDrawers: new Set(query(document, '[data-testid="chat-info-drawer"]')) }; + // The run's one check now belongs to this chat. + if (whatsappAnchorFollowsSelection) whatsappRepairAnchor = { pins, invalidated: false }; + whatsappCheckArmed = true; whatsappAnchorFollowsSelection = false; return true; }; window.__wb_get_native_whatsapp_repair = () => { const composers = query(document, '[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); const pins = composers.length === 1 ? whatsappPins(composers[0]) : null; if (!pins || !whatsappOwner) return null; - if (!whatsappRepairAnchor) whatsappRepairAnchor = { pins, invalidated: false }; + if (!whatsappRepairAnchor || (whatsappAnchorFollowsSelection && !whatsappCheckArmed + && (whatsappRepairAnchor.invalidated || !sameWhatsappPins(whatsappRepairAnchor.pins)))) { + whatsappRepairAnchor = { pins, invalidated: false }; + } return !whatsappRepairAnchor.invalidated && sameWhatsappPins(whatsappRepairAnchor.pins) ? pins : null; }; - // A run checks one contact through its drawer: the anchor is the first - // chat the run looked at, and once it is invalidated, as when WhatsApp's - // chat selection changes, no chat can be checked again until the next run - // (a new owner). True when that is why no check is available. Anchored - // nodes that are only hidden for now, as behind a modal, do not count. + // The recipient probe calls this for a guarded chat-list selection in a run + // that names its recipient (see whatsappAnchorFollowsSelection). False once + // the run has armed its check, which stays with the chat it armed. + window.__wb_native_whatsapp_follow_selection = () => { + if (!whatsappObserver || !whatsappOwner || whatsappCheckArmed) return false; + whatsappAnchorFollowsSelection = true; + return true; + }; + // A run checks one contact through its drawer, for its anchor chat. Once + // the anchor is invalidated, as when WhatsApp's chat selection changes + // after the check was armed (or, in a run for the open chat, at all), no + // chat can be checked again until the next run (a new owner). True when + // that is why no check is available. Anchored nodes that are only hidden + // for now, as behind a modal, do not count. window.__wb_native_whatsapp_repair_spent = () => { if (!whatsappOwner || whatsappRepairAnchor?.invalidated !== true) return false; + if (whatsappAnchorFollowsSelection && !whatsappCheckArmed) return false; const composers = query(document, '[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); return composers.length === 1 && whatsappNativeComposer(composers[0]); }; @@ -777,6 +803,9 @@ if (typeof ref_id !== 'string' || !/^ref_[A-Za-z0-9_:-]{1,100}$/.test(ref_id)) return null; return { phase: drawers.length ? 'close_contact' : 'open_contact', ref_id }; }; + // The recipient probe names this same control to the model when it blocks + // a message action in a chat whose contact is not confirmed yet. + window.__wb_native_whatsapp_repair_guidance = () => whatsappRepairGuidance(); window.__wb_native_whatsapp_repair_matches = snapshot => { if (!snapshot || snapshot.owner !== whatsappOwner || !whatsappObserver) return false; whatsappMutations(whatsappObserver.takeRecords()); @@ -1528,7 +1557,7 @@ // here: the native composer is no longer tied to a checked chat). if (window.__wb_native_whatsapp_repair_spent()) { return { success: false, schema: SCHEMA, reason: 'native_whatsapp_contact_check_spent', retryable: false, - error: 'This run can no longer confirm a WhatsApp contact: its contact check belongs to the first chat it looked at, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' }; + error: 'This run can no longer confirm a WhatsApp contact: its one contact check belongs to the chat it first looked at or started checking, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' }; } if (composer && window.__wb_get_native_whatsapp_repair()?.composer === composer) { const nativeWhatsappRepair = whatsappRepairGuidance(); diff --git a/src/firefox/src/content/content.js b/src/firefox/src/content/content.js index 5173687dcf..2653bbf926 100644 --- a/src/firefox/src/content/content.js +++ b/src/firefox/src/content/content.js @@ -3030,7 +3030,7 @@ if (isModelManagedEditor(el)) { // Framework editors own their DOM. Native BiDi input bypasses this // fallback; without it, leave the draft intact instead of corrupting it. - return failure('This rich-text editor requires Firefox trusted automation. Enable it in Settings → General → Advanced and retry.', + return failure('This rich-text editor requires Firefox trusted automation. Enable it in Settings → Advanced and retry.', { trustedTypeRequired: true, recoveryRequired: 'trusted_input', retryable: false }); } if (typeof doc.execCommand !== 'function') { @@ -7042,6 +7042,19 @@ } const nativeWhatsappComposer = location.hostname === 'web.whatsapp.com' && layoutCandidate?.matches?.('[data-testid="conversation-compose-box-input"][contenteditable="true"][role="textbox"]'); + // A row of WhatsApp's own chat list (the rows the native contact check + // reads), clicked on the row itself and not on its menu, link or + // another control nested in it. + const nativeWhatsappChatListRow = clicked => { + if (!clicked || editable(clicked)) return false; + const row = clicked.closest?.('[role="row"]'); + if (!row || !row.closest?.('[data-testid="chat-list"]') || !visible(row) + || row.querySelectorAll('[data-testid="cell-frame-title"]').length !== 1) return false; + const nested = clicked.closest?.('a[href],button,input,select,textarea,summary,[contenteditable="true"],' + + '[contenteditable=""],[role="button"],[role="link"],[role="menuitem"],[role="checkbox"],[role="radio"],' + + '[role="switch"],[role="combobox"],[role="textbox"],[aria-haspopup],[onclick],[data-action]'); + return !nested || !row.contains(nested); + }; if (nativeWhatsappComposer && nativeLayoutContext?.service !== 'whatsapp-self') { const repair = window.__wb_get_native_whatsapp_repair?.(); if (!observationOnly && tool === 'click_ax' && targetResolved @@ -7049,16 +7062,35 @@ return { success: true, messageSend: false, conclusive: true, composerAvailable: true, nativeWhatsappRepair: true, identityCandidates: [] }; } + // Opening another chat from the chat list sends nothing, and a request + // for a named person may have to leave the chat that was open when it + // started. Blocking it until the open chat's contact was confirmed + // left the agent no way to reach the right chat. The contact check + // then belongs to the chat that ends up open (see + // __wb_native_whatsapp_follow_selection). + if (!observationOnly && ['click', 'click_ax'].includes(tool) && targetResolved + && nativeWhatsappChatListRow(target)) { + if (params.bindDispatch === true && params.namedRecipientSelection === true) { + window.__wb_native_whatsapp_follow_selection?.(); + } + return { success: true, messageSend: false, conclusive: true, conversationSelection: true, + identityCandidates: [] }; + } if (nativeLayoutContext?.service !== 'whatsapp') { // No check left in this run: say so, rather than send the agent // after a header click that cannot help. const spent = !repair && window.__wb_native_whatsapp_repair_spent?.() === true; + // Otherwise name the exact control that confirms this chat's + // contact, so the agent can pass it on instead of "re-read and + // retry", which kept a model clicking Attach and the chat row. + const repairTarget = !spent && repair ? window.__wb_native_whatsapp_repair_guidance?.() || null : null; return { success: true, messageSend: observationOnly ? false : null, conclusive: false, composerAvailable: true, nativeWhatsappRepairAvailable: !!repair, ...(spent ? { nativeWhatsappRepairSpent: true } : {}), + ...(repairTarget ? { nativeWhatsappRepairTarget: repairTarget } : {}), reasonCode: spent ? 'native_whatsapp_contact_check_spent' : 'native_whatsapp_contact_binding_required', identityCandidates: [], error: spent - ? 'This run can no longer confirm a WhatsApp contact: its contact check belongs to the first chat it looked at, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' + ? 'This run can no longer confirm a WhatsApp contact: its one contact check belongs to the chat it first looked at or started checking, and WhatsApp\'s chat selection or that chat\'s header changed since. Nothing was sent. Report what was sent and that a message to this chat needs a new request; do not retry it in this run.' : 'Native WhatsApp contact identity needs a fresh guarded header click, its contact drawer phone, and closing that same drawer. No message or editor write was authorized.' }; } } diff --git a/src/firefox/src/providers/d1-cache.js b/src/firefox/src/providers/d1-cache.js index a40fc2e419..e245e783dd 100644 --- a/src/firefox/src/providers/d1-cache.js +++ b/src/firefox/src/providers/d1-cache.js @@ -48,7 +48,7 @@ export async function readD1Manifest(directory, { download = false, signal } = { let bytes; try { bytes = new Uint8Array(await (await (await directory.getFileHandle('package-manifest.json')).getFile()).arrayBuffer()); } catch { - if (!download) throw new Error('Download D1 explicitly in Settings > Assistive Models > Decision models first.'); + if (!download) throw new Error('Download D1 explicitly in Providers > Decision first.'); const response = await fetch(d1BaseURL() + 'package-manifest.json', { credentials: 'omit', redirect: 'follow', signal }); if (!response.ok || Number(response.headers.get('content-length')) > 1024 * 1024) throw new Error('D1 package manifest download failed.'); bytes = new Uint8Array(await response.arrayBuffer()); diff --git a/src/firefox/src/providers/d1-config.js b/src/firefox/src/providers/d1-config.js index e63b7da196..8b6946ccca 100644 --- a/src/firefox/src/providers/d1-config.js +++ b/src/firefox/src/providers/d1-config.js @@ -1,7 +1,7 @@ export const D1_MODEL_ID = 'webbrain-one/d1-browser-decision-fp16'; export const D1_CONSENT_VERSION = 1; export const D1_CONSENT_KEY = 'd1WebgpuConsentVersion'; -// Set by Settings' Download and load (or Load, once cached), cleared by Unload, +// Set by the Providers page's Download and load (or Load, once cached), cleared by Unload, // Remove and switching D1 off there. While it is set, a decision that finds // the model unloaded (a browser restart, a discarded stalled session, a lost // GPU device) reloads the verified cache in the background; never downloads. diff --git a/src/firefox/src/providers/d1-diagnostic.js b/src/firefox/src/providers/d1-diagnostic.js index 6231ce1f85..18fc1997b5 100644 --- a/src/firefox/src/providers/d1-diagnostic.js +++ b/src/firefox/src/providers/d1-diagnostic.js @@ -3,8 +3,8 @@ import { validateSystemOneAnswers } from '../agent/systemone-judge.js'; import { D1_CONSENT_KEY, D1_CONSENT_VERSION } from './d1-config.js'; export async function evaluateD1LocalFixture({ fixture, sender, api, strictSecretMode, agent, client }) { - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); - if (sender?.id !== api.runtime.id || String(sender.url || '').split('#')[0] !== settingsUrl) throw new Error('Local D1 fixture tests are available only from extension Settings.'); + const providersUrl = api.runtime.getURL('src/ui/providers.html'); + if (sender?.id !== api.runtime.id || String(sender.url || '').split(/[?#]/)[0] !== providersUrl) throw new Error('Local D1 fixture tests are available only from the extension Providers page.'); if (strictSecretMode) throw new Error('Decision requests are disabled in Strict Secret Mode.'); const stored = await api.storage.local.get(DECISION_SETTINGS_KEYS); if (stored.decisionProvider !== 'webgpu_d1' || resolveDecisionMode(stored) !== 'on' || stored[D1_CONSENT_KEY] !== D1_CONSENT_VERSION) throw new Error('Select, enable and explicitly consent to the local D1 provider before testing a fixture.'); diff --git a/src/firefox/src/providers/d1-worker.js b/src/firefox/src/providers/d1-worker.js index b222d751b3..9f50248713 100644 --- a/src/firefox/src/providers/d1-worker.js +++ b/src/firefox/src/providers/d1-worker.js @@ -73,7 +73,7 @@ const currentPackage = marker => marker?.revision === D1_RELEASE.revision && mar async function status() { if (transfer || runtime || loading || ['error', 'stopped'].includes(state.status)) { // An error or a stop leaves the verified cache in place (a lost GPU device - // after a good download, say); report it so Settings can retry with Load + // after a good download, say); report it so the Providers page can retry with Load // instead of falling back to a full download pass. const cached = !transfer && !runtime && !loading && currentPackage(await readyMarker()); return { ...state, ready: !!runtime, cached }; diff --git a/src/firefox/src/providers/fetch-timeout.js b/src/firefox/src/providers/fetch-timeout.js index 1b95cd3179..acb56a0711 100644 --- a/src/firefox/src/providers/fetch-timeout.js +++ b/src/firefox/src/providers/fetch-timeout.js @@ -8,7 +8,7 @@ * 1. The same 120s default and 10–600s range apply to every LLM call. * 2. There's one cached timeout value across the providers — not three * copies each with its own storage read and onChanged listener. - * 3. Changing the setting in Settings → Display → "LLM request timeout" + * 3. Changing the setting in Settings → Budgets → "LLM request timeout" * takes effect on the next request without an extension reload. * * The timer aborts ONLY the connection / time-to-headers phase. Once @@ -96,7 +96,7 @@ export async function fetchWithTimeout(url, options = {}) { `Request to ${url} timed out after ${timeoutMs}ms. ` + `The endpoint may be unreachable, blocked by CORS, or stalled. ` + `If this is a local model that needs more time, raise the timeout ` + - `in Settings → Display → "LLM request timeout".` + `in Settings → Budgets → "LLM request timeout".` ); } throw e; diff --git a/src/firefox/src/providers/oauth-claude.js b/src/firefox/src/providers/oauth-claude.js index 67ad5f18c8..d6707195f7 100644 --- a/src/firefox/src/providers/oauth-claude.js +++ b/src/firefox/src/providers/oauth-claude.js @@ -220,7 +220,7 @@ async function _doRefreshClaudeAccessToken() { export async function getClaudeAccessToken() { const stored = await browser.storage.local.get([STORAGE_KEY]); const tokens = stored[STORAGE_KEY]; - if (!tokens?.accessToken) throw new Error('Not signed in to Claude. Open Settings → Claude (Pro/Max) → Sign in.'); + if (!tokens?.accessToken) throw new Error('Not signed in to Claude. Open Providers → Claude (Pro/Max) → Sign in.'); if (Date.now() >= tokens.expiresAt) { const refreshed = await refreshClaudeAccessToken(); return refreshed.accessToken; diff --git a/src/firefox/src/providers/oauth-subscriptions.js b/src/firefox/src/providers/oauth-subscriptions.js index 153d2718ec..de65f7d8fe 100644 --- a/src/firefox/src/providers/oauth-subscriptions.js +++ b/src/firefox/src/providers/oauth-subscriptions.js @@ -252,7 +252,7 @@ function makeOAuthClient(def) { async function getAccessToken() { const stored = await browser.storage.local.get([STORAGE_KEY]); const tokens = stored[STORAGE_KEY]; - if (!tokens?.accessToken) throw new Error(`Not signed in to ${def.label}. Open Settings and sign in.`); + if (!tokens?.accessToken) throw new Error(`Not signed in to ${def.label}. Open Providers and sign in.`); if (Date.now() >= tokens.expiresAt) return (await refresh()).accessToken; return tokens.accessToken; } diff --git a/src/firefox/src/safesocial/background.js b/src/firefox/src/safesocial/background.js index a4507a45f7..ddd6ab3892 100644 --- a/src/firefox/src/safesocial/background.js +++ b/src/firefox/src/safesocial/background.js @@ -3,7 +3,8 @@ import { SETTINGS_KEY, CACHE_NAME, normalizeSettings, isInstagramUrl, isMediaUrl export function installSafeSocialBackground(api, runHost) { let generation = 0; let transition = Promise.resolve(); - const settingsUrl = api.runtime.getURL('src/ui/settings.html'); + // SafeSocial is managed from its tab on the Providers page. + const providersUrl = api.runtime.getURL('src/ui/providers.html'); api.storage.onChanged.addListener((changes, area) => { if (area !== 'local' || !changes[SETTINGS_KEY]) return; generation++; @@ -14,7 +15,7 @@ export function installSafeSocialBackground(api, runHost) { }); async function handle(message, sender) { if (sender.id !== api.runtime.id) throw new Error('Invalid classifier caller.'); - const trustedSettings = String(sender.url || '').split(/[?#]/)[0] === settingsUrl; + const trustedSettings = String(sender.url || '').split(/[?#]/)[0] === providersUrl; if (message.command === 'classify') { if (!sender.tab || sender.frameId !== 0 || !isInstagramUrl(sender.url) || !isMediaUrl(message.url)) { throw new Error('Classifier is limited to Instagram images.'); diff --git a/src/firefox/src/ui/captcha-settings.js b/src/firefox/src/ui/captcha-settings.js index 1565a1c269..937d41c00d 100644 --- a/src/firefox/src/ui/captcha-settings.js +++ b/src/firefox/src/ui/captcha-settings.js @@ -6,7 +6,16 @@ export async function initCaptchaSettings(storage, sendToBackground, t) { const card = document.getElementById('captcha-card'); if (!card) return; card.hidden = managed; - if (managed) return; + if (managed) { + // A managed browser solves through WebBrain Cloud and has no keys to set + // here, so its CAPTCHA tab steps aside and a deep link lands on General. + const tab = document.querySelector('.tab-btn[data-tab="captcha"]'); + if (tab) { + tab.hidden = true; + if (tab.classList.contains('active')) document.querySelector('.tab-btn[data-tab="display"]')?.click(); + } + return; + } for (const provider of CAPTCHA_PROVIDERS) { const id = provider.domId; const typeLabels = { recaptcha_v2: 'reCAPTCHA v2', recaptcha_v2_enterprise: 'reCAPTCHA v2 Enterprise', diff --git a/src/firefox/src/ui/d1-settings.js b/src/firefox/src/ui/d1-settings.js index 456d6f2e00..db2adfe0d8 100644 --- a/src/firefox/src/ui/d1-settings.js +++ b/src/firefox/src/ui/d1-settings.js @@ -3,6 +3,8 @@ import { t } from './i18n.js'; export function initD1Settings(send) { const provider = document.getElementById('decision-provider'), controls = document.getElementById('d1-controls'), line = document.getElementById('d1-status'), consent = document.getElementById('d1-consent'); + // The decision card is on providers.html; the other settings pages have nothing to wire. + if (!provider || !controls) return async () => {}; let timer = null, busy = false; const show = async () => { const selected = provider.value === 'webgpu_d1'; controls.hidden = !selected; diff --git a/src/firefox/src/ui/locales/apocalypse-copy.mjs b/src/firefox/src/ui/locales/apocalypse-copy.mjs index 1b99b1186c..09f4a8c8e3 100644 --- a/src/firefox/src/ui/locales/apocalypse-copy.mjs +++ b/src/firefox/src/ui/locales/apocalypse-copy.mjs @@ -38,7 +38,7 @@ const englishApocalypseModeCopy = { 'ap.models.status.error': 'Error', 'ap.models.remove': 'Remove', 'ap.models.confirm_remove': 'Remove the {model} and its cached files? You will need to download it again to use it offline.', - 'ap.vision.auto': 'Local vision is optional and never downloads on its own. WebBrain VL 2 450M first needs your consent in Settings → Assistive Models → Vision.', + 'ap.vision.auto': 'Local vision is optional and never downloads on its own. WebBrain VL 2 450M first needs your consent in Providers → Vision.', 'ap.vision.waiting': 'Disabled until you explicitly enable local vision', 'ap.vision.text_model_sees': 'Your Text Model, Ternary Bonsai 2 2B Vision, already reads images. No extra download.', 'ap.enabled': 'Enabled', diff --git a/src/firefox/src/ui/locales/apocalypse-translations.mjs b/src/firefox/src/ui/locales/apocalypse-translations.mjs index e10c43599e..c820a6344e 100644 --- a/src/firefox/src/ui/locales/apocalypse-translations.mjs +++ b/src/firefox/src/ui/locales/apocalypse-translations.mjs @@ -16,7 +16,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Conocimiento sin conexión bajo tu control", "ap.hero.desc": "Configura los cuatro elementos esenciales para el chat local privado: un modelo de texto, un modelo de visión, una edición de Wikipedia sin conexión y la Caja de Emergencia.", "ap.hero.consent": "Al activar este modo se inician las descargas del modelo de texto y de la pequeña Wikipedia en inglés simple. La visión local sigue siendo opcional y debe habilitarse por separado.", - "ap.vision.auto": "La visión local es opcional y nunca se descarga sola. WebBrain VL 2 450M necesita antes tu consentimiento en Ajustes → Modelos auxiliares → Visión.", + "ap.vision.auto": "La visión local es opcional y nunca se descarga sola. WebBrain VL 2 450M necesita antes tu consentimiento en Proveedores → Visión.", "ap.vision.waiting": "Desactivada hasta que habilites explícitamente la visión local", "ap.vision.text_model_sees": "Tu modelo de texto, Ternary Bonsai 2 2B Vision, ya lee imágenes. Sin descarga adicional.", "ap.enabled": "Activado", @@ -143,7 +143,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Connaissance hors ligne, sous votre contrôle", "ap.hero.desc": "Configurez les quatre éléments essentiels du chat local privé : un modèle de texte, un modèle de vision, une édition hors ligne de Wikipédia et la Boîte d'urgence.", "ap.hero.consent": "L’activation de ce mode lance les téléchargements du modèle de texte et de la petite Wikipédia en anglais simple. La vision locale reste facultative et doit être activée séparément.", - "ap.vision.auto": "La vision locale est facultative et ne se télécharge jamais d’elle-même. WebBrain VL 2 450M demande d’abord votre consentement dans Paramètres → Modèles auxiliaires → Vision.", + "ap.vision.auto": "La vision locale est facultative et ne se télécharge jamais d’elle-même. WebBrain VL 2 450M demande d’abord votre consentement dans Fournisseurs → Vision.", "ap.vision.waiting": "Désactivée jusqu’à l’activation explicite de la vision locale", "ap.vision.text_model_sees": "Votre modèle de texte, Ternary Bonsai 2 2B Vision, lit déjà les images. Aucun téléchargement supplémentaire.", "ap.enabled": "Activé", @@ -270,7 +270,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Kendi kontrolünüzde çevrimdışı bilgi", "ap.hero.desc": "Özel yerel sohbet için dört temel bileşeni kurun: Metin Modeli, Görüntü Modeli, bir çevrimdışı Vikipedi sürümü ve Acil Durum Kutusu.", "ap.hero.consent": "Bu modu açmak Metin Modeli ve küçük Basit İngilizce Vikipedi indirmelerini başlatır. Yerel görüntü işleme isteğe bağlı kalır ve ayrıca etkinleştirilmelidir.", - "ap.vision.auto": "Yerel görme isteğe bağlıdır ve kendiliğinden hiçbir şey indirmez. WebBrain VL 2 450M için önce Ayarlar → Yardımcı Modeller → Görme bölümünden onay vermeniz gerekir.", + "ap.vision.auto": "Yerel görme isteğe bağlıdır ve kendiliğinden hiçbir şey indirmez. WebBrain VL 2 450M için önce Sağlayıcılar → Görme bölümünden onay vermeniz gerekir.", "ap.vision.waiting": "Yerel görüntü işlemeyi açıkça etkinleştirene kadar devre dışı", "ap.vision.text_model_sees": "Metin modeliniz Ternary Bonsai 2 2B Vision zaten görüntü okuyabiliyor. Ek indirme gerekmez.", "ap.enabled": "Etkin", @@ -397,7 +397,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "由您掌控的离线知识", "ap.hero.desc": "设置私人本地聊天所需的四项核心内容:文本模型、视觉模型、一个离线维基百科版本和应急箱。", "ap.hero.consent": "开启此模式会开始下载文本模型和较小的简明英语维基百科。本地视觉仍为可选功能,必须单独启用。", - "ap.vision.auto": "本地视觉是可选的,绝不会自行下载。WebBrain VL 2 450M 需要先在“设置 → 辅助模型 → 视觉”中获得你的同意。", + "ap.vision.auto": "本地视觉是可选的,绝不会自行下载。WebBrain VL 2 450M 需要先在“提供商 → 视觉”中获得你的同意。", "ap.vision.waiting": "在您明确启用本地视觉之前保持禁用", "ap.vision.text_model_sees": "你的文本模型 Ternary Bonsai 2 2B Vision 已经能读取图像,无需额外下载。", "ap.enabled": "已启用", @@ -524,7 +524,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Офлайн-знания под вашим контролем", "ap.hero.desc": "Настройте четыре основных компонента для приватного локального чата: текстовую модель, модель компьютерного зрения, одну офлайн-версию Википедии и Аварийный ящик.", "ap.hero.consent": "Включение этого режима запускает загрузку текстовой модели и уменьшенной Википедии на упрощённом английском. Локальное зрение остаётся необязательным и включается отдельно.", - "ap.vision.auto": "Локальное зрение необязательно и никогда не загружается само. Для WebBrain VL 2 450M сначала нужно ваше согласие в разделе Настройки → Вспомогательные модели → Зрение.", + "ap.vision.auto": "Локальное зрение необязательно и никогда не загружается само. Для WebBrain VL 2 450M сначала нужно ваше согласие в разделе Провайдеры → Зрение.", "ap.vision.waiting": "Отключено, пока вы явно не включите локальное зрение", "ap.vision.text_model_sees": "Ваша текстовая модель Ternary Bonsai 2 2B Vision уже читает изображения. Дополнительная загрузка не нужна.", "ap.enabled": "Включено", @@ -651,7 +651,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Офлайн знання під вашим контролем", "ap.hero.desc": "Налаштуйте чотири основні компоненти для приватного локального чату: текстову модель, модель комп’ютерного зору, одну офлайн-версію Вікіпедії та Аварійну скриньку.", "ap.hero.consent": "Увімкнення цього режиму запускає завантаження текстової моделі та меншої Вікіпедії спрощеною англійською. Локальний зір залишається необов’язковим і вмикається окремо.", - "ap.vision.auto": "Локальний зір необов’язковий і ніколи не завантажується сам. Для WebBrain VL 2 450M спершу потрібна ваша згода в розділі Налаштування → Допоміжні моделі → Зір.", + "ap.vision.auto": "Локальний зір необов’язковий і ніколи не завантажується сам. Для WebBrain VL 2 450M спершу потрібна ваша згода в розділі Провайдери → Зір.", "ap.vision.waiting": "Вимкнено, доки ви явно не ввімкнете локальний зір", "ap.vision.text_model_sees": "Ваша текстова модель Ternary Bonsai 2 2B Vision уже читає зображення. Додаткове завантаження не потрібне.", "ap.enabled": "Увімкнено", @@ -778,7 +778,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "معرفة دون اتصال، تحت سيطرتك", "ap.hero.desc": "أعِدّ العناصر الأساسية الأربعة للدردشة المحلية الخاصة: نموذج نص، ونموذج رؤية، وإصدار واحد من ويكيبيديا دون اتصال، وصندوق الطوارئ.", "ap.hero.consent": "يؤدي تشغيل هذا الوضع إلى بدء تنزيل نموذج النص ونسخة ويكيبيديا الأصغر باللغة الإنجليزية المبسطة. تظل الرؤية المحلية اختيارية ويجب تفعيلها بشكل منفصل.", - "ap.vision.auto": "الرؤية المحلية اختيارية ولا تُنزَّل من تلقاء نفسها أبدًا. أما WebBrain VL 2 450M فيحتاج أولًا إلى موافقتك من الإعدادات ← النماذج المساعدة ← الرؤية.", + "ap.vision.auto": "الرؤية المحلية اختيارية ولا تُنزَّل من تلقاء نفسها أبدًا. أما WebBrain VL 2 450M فيحتاج أولًا إلى موافقتك من المزوّدون ← الرؤية.", "ap.vision.waiting": "معطلة حتى تفعّل الرؤية المحلية صراحةً", "ap.vision.text_model_sees": "نموذج النص لديك، Ternary Bonsai 2 2B Vision، يقرأ الصور بالفعل. لا حاجة إلى تنزيل إضافي.", "ap.enabled": "مفعّل", @@ -905,7 +905,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "あなたの制御下のオフライン知識", "ap.hero.desc": "プライベートなローカルチャットに必要な4つの要素(テキストモデル、ビジョンモデル、オフライン版ウィキペディア1つ、緊急ボックス)をセットアップします。", "ap.hero.consent": "このモードを有効にすると、テキストモデルと小容量のシンプル英語版ウィキペディアのダウンロードが始まります。ローカル画像認識は任意で、別途有効にする必要があります。", - "ap.vision.auto": "ローカルの画像認識は任意で、勝手にダウンロードされることはありません。WebBrain VL 2 450M は先に「設定 → 補助モデル → 画像認識」で同意が必要です。", + "ap.vision.auto": "ローカルの画像認識は任意で、勝手にダウンロードされることはありません。WebBrain VL 2 450M は先に「プロバイダー → 画像認識」で同意が必要です。", "ap.vision.waiting": "ローカル画像認識を明示的に有効にするまで無効", "ap.vision.text_model_sees": "テキストモデルの Ternary Bonsai 2 2B Vision はすでに画像を読み取れます。追加のダウンロードは不要です。", "ap.enabled": "有効", @@ -1032,7 +1032,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "사용자 통제 하에 오프라인 지식", "ap.hero.desc": "개인 로컬 채팅에 필요한 네 가지 핵심 요소인 텍스트 모델, 비전 모델, 오프라인 위키백과 버전 하나, 비상 상자를 설정하세요.", "ap.hero.consent": "이 모드를 켜면 텍스트 모델과 용량이 작은 쉬운 영어 위키백과 다운로드가 시작됩니다. 로컬 비전은 선택 사항이며 별도로 활성화해야 합니다.", - "ap.vision.auto": "로컬 비전은 선택 사항이며 스스로 다운로드되지 않습니다. WebBrain VL 2 450M는 먼저 설정 → 보조 모델 → 비전에서 동의해야 합니다.", + "ap.vision.auto": "로컬 비전은 선택 사항이며 스스로 다운로드되지 않습니다. WebBrain VL 2 450M는 먼저 제공자 → 비전에서 동의해야 합니다.", "ap.vision.waiting": "로컬 비전을 명시적으로 활성화할 때까지 비활성화됨", "ap.vision.text_model_sees": "텍스트 모델인 Ternary Bonsai 2 2B Vision가 이미 이미지를 읽습니다. 추가 다운로드가 필요 없습니다.", "ap.enabled": "활성화", @@ -1159,7 +1159,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Pengetahuan offline, di bawah kendali Anda", "ap.hero.desc": "Siapkan empat komponen penting untuk obrolan lokal pribadi: Model Teks, Model Visi, satu edisi Wikipedia offline, dan Kotak Darurat.", "ap.hero.consent": "Mengaktifkan mode ini memulai unduhan Model Teks dan Wikipedia Bahasa Inggris Sederhana berukuran kecil. Visi lokal tetap opsional dan harus diaktifkan secara terpisah.", - "ap.vision.auto": "Visi lokal bersifat opsional dan tidak pernah mengunduh sendiri. WebBrain VL 2 450M memerlukan persetujuan Anda terlebih dahulu di Pengaturan → Model Pendukung → Visi.", + "ap.vision.auto": "Visi lokal bersifat opsional dan tidak pernah mengunduh sendiri. WebBrain VL 2 450M memerlukan persetujuan Anda terlebih dahulu di Penyedia → Visi.", "ap.vision.waiting": "Dinonaktifkan sampai Anda mengaktifkan visi lokal secara eksplisit", "ap.vision.text_model_sees": "Model teks Anda, Ternary Bonsai 2 2B Vision, sudah bisa membaca gambar. Tidak perlu unduhan tambahan.", "ap.enabled": "Aktif", @@ -1286,7 +1286,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "ความรู้แบบออฟไลน์ ภายใต้การควบคุมของคุณ", "ap.hero.desc": "ตั้งค่าองค์ประกอบสำคัญสี่อย่างสำหรับแชทส่วนตัวในเครื่อง ได้แก่ โมเดลข้อความ โมเดลการมองเห็น วิกิพีเดียออฟไลน์หนึ่งฉบับ และกล่องฉุกเฉิน", "ap.hero.consent": "การเปิดโหมดนี้จะเริ่มดาวน์โหลดโมเดลข้อความและวิกิพีเดียภาษาอังกฤษแบบง่ายฉบับขนาดเล็ก การมองเห็นในเครื่องยังคงเป็นตัวเลือกและต้องเปิดใช้แยกต่างหาก", - "ap.vision.auto": "การมองเห็นในเครื่องเป็นตัวเลือกเสริมและไม่ดาวน์โหลดเอง ส่วน WebBrain VL 2 450M ต้องได้รับความยินยอมจากคุณก่อนใน การตั้งค่า → โมเดลเสริม → การมองเห็น", + "ap.vision.auto": "การมองเห็นในเครื่องเป็นตัวเลือกเสริมและไม่ดาวน์โหลดเอง ส่วน WebBrain VL 2 450M ต้องได้รับความยินยอมจากคุณก่อนใน ผู้ให้บริการ → การมองเห็น", "ap.vision.waiting": "ปิดใช้งานจนกว่าคุณจะเปิดการมองเห็นในเครื่องอย่างชัดเจน", "ap.vision.text_model_sees": "โมเดลข้อความของคุณ Ternary Bonsai 2 2B Vision อ่านภาพได้อยู่แล้ว ไม่ต้องดาวน์โหลดเพิ่ม", "ap.enabled": "เปิดใช้งาน", @@ -1413,7 +1413,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Pengetahuan luar talian, di bawah kawalan anda", "ap.hero.desc": "Sediakan empat komponen penting untuk sembang setempat peribadi: Model Teks, Model Penglihatan, satu edisi Wikipedia luar talian dan Kotak Kecemasan.", "ap.hero.consent": "Mengaktifkan mod ini memulakan muat turun Model Teks dan Wikipedia Bahasa Inggeris Mudah yang kecil. Penglihatan setempat kekal pilihan dan mesti didayakan secara berasingan.", - "ap.vision.auto": "Penglihatan setempat adalah pilihan dan tidak pernah dimuat turun dengan sendirinya. WebBrain VL 2 450M memerlukan persetujuan anda dahulu dalam Tetapan → Model Bantuan → Penglihatan.", + "ap.vision.auto": "Penglihatan setempat adalah pilihan dan tidak pernah dimuat turun dengan sendirinya. WebBrain VL 2 450M memerlukan persetujuan anda dahulu dalam Pembekal → Penglihatan.", "ap.vision.waiting": "Dilumpuhkan sehingga anda mendayakan penglihatan setempat secara jelas", "ap.vision.text_model_sees": "Model Teks anda, Ternary Bonsai 2 2B Vision, sudah boleh membaca imej. Tiada muat turun tambahan.", "ap.enabled": "Dikesan", @@ -1540,7 +1540,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline na kaalaman, nasa iyong kontrol", "ap.hero.desc": "I-set up ang apat na mahalagang bahagi para sa pribadong lokal na chat: Text Model, Vision Model, isang offline na edisyon ng Wikipedia, at ang Kahon ng Emergency.", "ap.hero.consent": "Ang pag-enable sa mode na ito ay magsisimula sa pag-download ng Text Model at maliit na Simple English Wikipedia. Opsyonal ang lokal na vision at kailangang i-enable nang hiwalay.", - "ap.vision.auto": "Opsyonal ang lokal na vision at hindi kusang nagda-download. Kailangan muna ng WebBrain VL 2 450M ang iyong pahintulot sa Mga Setting → Mga Pantulong na Modelo → Bisyon.", + "ap.vision.auto": "Opsyonal ang lokal na vision at hindi kusang nagda-download. Kailangan muna ng WebBrain VL 2 450M ang iyong pahintulot sa Mga Provider → Bisyon.", "ap.vision.waiting": "Naka-disable hanggang tahasan mong i-enable ang lokal na vision", "ap.vision.text_model_sees": "Nakakabasa na ng mga larawan ang iyong Text Model na Ternary Bonsai 2 2B Vision. Walang dagdag na download.", "ap.enabled": "Naka-enable", @@ -1667,7 +1667,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline wiedza, pod Twoją kontrolą", "ap.hero.desc": "Skonfiguruj cztery podstawowe elementy prywatnego czatu lokalnego: model tekstowy, model wizyjny, jedną wersję Wikipedii offline i Skrzynkę awaryjną.", "ap.hero.consent": "Włączenie tego trybu rozpoczyna pobieranie modelu tekstowego i małej Wikipedii w uproszczonym angielskim. Lokalna wizja pozostaje opcjonalna i wymaga osobnego włączenia.", - "ap.vision.auto": "Lokalna wizja jest opcjonalna i nigdy nie pobiera się sama. WebBrain VL 2 450M wymaga najpierw Twojej zgody w Ustawienia → Modele pomocnicze → Wizja.", + "ap.vision.auto": "Lokalna wizja jest opcjonalna i nigdy nie pobiera się sama. WebBrain VL 2 450M wymaga najpierw Twojej zgody w Dostawcy → Wizja.", "ap.vision.waiting": "Wyłączona do czasu jawnego włączenia lokalnej wizji", "ap.vision.text_model_sees": "Twój model tekstowy, Ternary Bonsai 2 2B Vision, już czyta obrazy. Bez dodatkowego pobierania.", "ap.enabled": "Włączone", @@ -1794,7 +1794,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "ידע לא מקוון בשליטתך", "ap.hero.desc": "הגדירו את ארבעת הרכיבים החיוניים לצ׳אט מקומי ופרטי: מודל טקסט, מודל ראייה, מהדורת ויקיפדיה אחת לשימוש לא מקוון וקופסת חירום.", "ap.hero.consent": "הפעלת מצב זה מתחילה את הורדות מודל הטקסט וויקיפדיה הקטנה יותר באנגלית פשוטה. הראייה המקומית נשארת אופציונלית ויש להפעיל אותה בנפרד.", - "ap.vision.auto": "ראייה מקומית היא אופציונלית ואף פעם לא מורדת מעצמה. WebBrain VL 2 450M דורש קודם את הסכמתכם בהגדרות ← מודלים מסייעים ← ראייה.", + "ap.vision.auto": "ראייה מקומית היא אופציונלית ואף פעם לא מורדת מעצמה. WebBrain VL 2 450M דורש קודם את הסכמתכם בספקים ← ראייה.", "ap.vision.waiting": "מושבת עד שתפעילו במפורש את הראייה המקומית", "ap.vision.text_model_sees": "מודל הטקסט שלכם, Ternary Bonsai 2 2B Vision, כבר קורא תמונות. אין צורך בהורדה נוספת.", "ap.enabled": "מופעל", @@ -1921,7 +1921,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "आपके नियंत्रण में ऑफ़लाइन ज्ञान", "ap.hero.desc": "निजी स्थानीय चैट के लिए चार आवश्यक चीज़ें सेट अप करें: टेक्स्ट मॉडल, विज़न मॉडल, विकिपीडिया का एक ऑफ़लाइन संस्करण और आपातकालीन बॉक्स।", "ap.hero.consent": "इस मोड को चालू करने पर टेक्स्ट मॉडल और छोटे सरल अंग्रेज़ी विकिपीडिया का डाउनलोड शुरू होता है। स्थानीय विज़न वैकल्पिक रहता है और इसे अलग से सक्षम करना होगा।", - "ap.vision.auto": "स्थानीय विज़न वैकल्पिक है और अपने आप कभी डाउनलोड नहीं होता। WebBrain VL 2 450M के लिए पहले सेटिंग्स → सहायक मॉडल → दृष्टि में आपकी सहमति चाहिए।", + "ap.vision.auto": "स्थानीय विज़न वैकल्पिक है और अपने आप कभी डाउनलोड नहीं होता। WebBrain VL 2 450M के लिए पहले प्रदाता → दृष्टि में आपकी सहमति चाहिए।", "ap.vision.waiting": "जब तक आप स्थानीय विज़न को स्पष्ट रूप से सक्षम न करें, तब तक अक्षम", "ap.vision.text_model_sees": "आपका टेक्स्ट मॉडल, Ternary Bonsai 2 2B Vision, पहले से इमेज पढ़ता है। कोई अतिरिक्त डाउनलोड नहीं।", "ap.enabled": "सक्षम", @@ -2048,7 +2048,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Conhecimento offline, sob seu controle", "ap.hero.desc": "Configure os quatro elementos essenciais para um bate-papo local e privado: um Modelo de Texto, um Modelo de Visão, uma edição offline da Wikipédia e a Caixa de Emergência.", "ap.hero.consent": "Ativar este modo inicia os downloads do Modelo de Texto e da Wikipédia pequena em inglês simples. A visão local continua opcional e deve ser ativada separadamente.", - "ap.vision.auto": "A visão local é opcional e nunca é baixada sozinha. O WebBrain VL 2 450M precisa antes do seu consentimento em Configurações → Modelos auxiliares → Visão.", + "ap.vision.auto": "A visão local é opcional e nunca é baixada sozinha. O WebBrain VL 2 450M precisa antes do seu consentimento em Provedores → Visão.", "ap.vision.waiting": "Desativada até você ativar explicitamente a visão local", "ap.vision.text_model_sees": "Seu modelo de texto, Ternary Bonsai 2 2B Vision, já lê imagens. Sem download extra.", "ap.enabled": "Ativado", @@ -2175,7 +2175,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Kiến thức ngoại tuyến, dưới sự kiểm soát của bạn", "ap.hero.desc": "Thiết lập bốn thành phần thiết yếu cho trò chuyện cục bộ riêng tư: Mô hình Văn bản, Mô hình Thị giác, một phiên bản Wikipedia ngoại tuyến và Hộp Khẩn Cấp.", "ap.hero.consent": "Bật chế độ này sẽ bắt đầu tải Mô hình Văn bản và Wikipedia tiếng Anh đơn giản dung lượng nhỏ. Thị giác cục bộ vẫn là tùy chọn và phải được bật riêng.", - "ap.vision.auto": "Thị giác cục bộ là tùy chọn và không bao giờ tự tải về. WebBrain VL 2 450M cần bạn đồng ý trước trong Cài đặt → Mô hình hỗ trợ → Tầm nhìn.", + "ap.vision.auto": "Thị giác cục bộ là tùy chọn và không bao giờ tự tải về. WebBrain VL 2 450M cần bạn đồng ý trước trong Nhà cung cấp → Tầm nhìn.", "ap.vision.waiting": "Bị tắt cho đến khi bạn bật rõ ràng thị giác cục bộ", "ap.vision.text_model_sees": "Mô hình văn bản của bạn, Ternary Bonsai 2 2B Vision, đã đọc được hình ảnh. Không cần tải thêm.", "ap.enabled": "Đã bật", @@ -2302,7 +2302,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "আপনার নিয়ন্ত্রণে অফলাইন জ্ঞান", "ap.hero.desc": "ব্যক্তিগত স্থানীয় চ্যাটের জন্য চারটি অপরিহার্য উপাদান সেট আপ করুন: টেক্সট মডেল, ভিশন মডেল, উইকিপিডিয়ার একটি অফলাইন সংস্করণ এবং জরুরি বাক্স।", "ap.hero.consent": "এই মোড চালু করলে টেক্সট মডেল ও ছোট সহজ ইংরেজি উইকিপিডিয়ার ডাউনলোড শুরু হয়। স্থানীয় ভিশন ঐচ্ছিক থাকে এবং আলাদাভাবে চালু করতে হয়।", - "ap.vision.auto": "লোকাল ভিশন ঐচ্ছিক এবং কখনও নিজে থেকে ডাউনলোড হয় না। WebBrain VL 2 450M-এর জন্য আগে সেটিংস → সহায়ক মডেল → দৃষ্টি-তে আপনার সম্মতি লাগবে।", + "ap.vision.auto": "লোকাল ভিশন ঐচ্ছিক এবং কখনও নিজে থেকে ডাউনলোড হয় না। WebBrain VL 2 450M-এর জন্য আগে প্রদানকারী → দৃষ্টি-তে আপনার সম্মতি লাগবে।", "ap.vision.waiting": "আপনি স্পষ্টভাবে স্থানীয় ভিশন চালু না করা পর্যন্ত নিষ্ক্রিয়", "ap.vision.text_model_sees": "আপনার টেক্সট মডেল Ternary Bonsai 2 2B Vision ইতিমধ্যে ছবি পড়তে পারে। বাড়তি ডাউনলোড লাগবে না।", "ap.enabled": "চালু", @@ -2429,7 +2429,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "دانش آفلاین، تحت کنترل شما", "ap.hero.desc": "چهار جزء ضروری برای چت خصوصی و محلی را راه‌اندازی کنید: مدل متن، مدل بینایی، یک نسخهٔ آفلاین ویکی‌پدیا و جعبهٔ اضطراری.", "ap.hero.consent": "روشن کردن این حالت، دانلود مدل متن و نسخهٔ کوچک ویکی‌پدیای انگلیسی ساده را آغاز می‌کند. بینایی محلی اختیاری است و باید جداگانه فعال شود.", - "ap.vision.auto": "بینایی محلی اختیاری است و هرگز خودبه‌خود دانلود نمی‌شود. WebBrain VL 2 450M ابتدا به رضایت شما در تنظیمات ← مدل‌های کمکی ← چشم انداز نیاز دارد.", + "ap.vision.auto": "بینایی محلی اختیاری است و هرگز خودبه‌خود دانلود نمی‌شود. WebBrain VL 2 450M ابتدا به رضایت شما در ارائه دهندگان ← چشم انداز نیاز دارد.", "ap.vision.waiting": "تا زمانی که بینایی محلی را صریحاً فعال نکنید، غیرفعال است", "ap.vision.text_model_sees": "مدل متنی شما، Ternary Bonsai 2 2B Vision، از قبل تصویر می‌خواند. دانلود اضافه لازم نیست.", "ap.enabled": "فعال", @@ -2556,7 +2556,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline-kennis onder uw controle", "ap.hero.desc": "Stel de vier essentiële onderdelen voor privé lokaal chatten in: een tekstmodel, een visiemodel, één offline Wikipedia-editie en de Noodbox.", "ap.hero.consent": "Als u deze modus inschakelt, starten de downloads van het tekstmodel en de kleine Simple English Wikipedia. Lokale visie blijft optioneel en moet apart worden ingeschakeld.", - "ap.vision.auto": "Lokale visie is optioneel en downloadt nooit vanzelf. Voor WebBrain VL 2 450M is eerst je toestemming nodig in Instellingen → Ondersteunende modellen → Visie.", + "ap.vision.auto": "Lokale visie is optioneel en downloadt nooit vanzelf. Voor WebBrain VL 2 450M is eerst je toestemming nodig in Providers → Visie.", "ap.vision.waiting": "Uitgeschakeld totdat u lokale visie expliciet inschakelt", "ap.vision.text_model_sees": "Je tekstmodel, Ternary Bonsai 2 2B Vision, leest al afbeeldingen. Geen extra download.", "ap.enabled": "Aan", @@ -2683,7 +2683,7 @@ const apocalypseModeTranslations = { "ap.hero.title": "Offline-Wissen unter Ihrer Kontrolle", "ap.hero.desc": "Richte die vier wesentlichen Komponenten für einen privaten lokalen Chat ein: ein Textmodell, ein Bildmodell, eine Offline-Ausgabe der Wikipedia und die Notfallbox.", "ap.hero.consent": "Beim Aktivieren dieses Modus starten die Downloads des Textmodells und der kleinen Simple-English-Wikipedia. Lokale Bilderkennung bleibt optional und muss separat aktiviert werden.", - "ap.vision.auto": "Lokale Bilderkennung ist optional und lädt nie von selbst herunter. WebBrain VL 2 450M braucht zuerst deine Zustimmung unter Einstellungen → Assistenzmodelle → Vision.", + "ap.vision.auto": "Lokale Bilderkennung ist optional und lädt nie von selbst herunter. WebBrain VL 2 450M braucht zuerst deine Zustimmung unter Anbieter → Vision.", "ap.vision.waiting": "Deaktiviert, bis du lokale Bilderkennung ausdrücklich aktivierst", "ap.vision.text_model_sees": "Dein Textmodell, Ternary Bonsai 2 2B Vision, liest bereits Bilder. Kein zusätzlicher Download.", "ap.enabled": "Aktiviert", diff --git a/src/firefox/src/ui/locales/ar.js b/src/firefox/src/ui/locales/ar.js index 3c7073da22..8e8639ba0d 100644 --- a/src/firefox/src/ui/locales/ar.js +++ b/src/firefox/src/ui/locales/ar.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'تصغير واجهة الإضافة', 'sp.ui_scale.increase': 'تكبير واجهة الإضافة', 'sp.ui_scale.reset': 'إعادة الضبط', - 'st.display.ui_scale.label': 'تكبير واجهة الإضافة', - 'st.display.ui_scale.decrease': 'تصغير واجهة الإضافة', - 'st.display.ui_scale.increase': 'تكبير واجهة الإضافة', - 'st.display.ui_scale.reset': 'إعادة الضبط', - 'st.display.ui_scale.desc': 'غيّر حجم الشريط الجانبي ونافذة الدردشة المنفصلة دون تغيير تكبير صفحات الويب.', - 'st.display.ui_scale.shortcuts': 'اختصارات مخصصة: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'غير معيّنة', - 'st.display.ui_scale.manage_shortcuts': 'تخصيص الاختصارات', 'tool.delegate_research': 'جارٍ البحث باستخدام ChatGPT', 'st.display.research_escalation.label': 'تصعيد البحث', 'st.display.research_escalation.desc': 'عند التفعيل، قد يطلب WebBrain موافقتك قبل إرسال مطالبة بحثية معقدة للقراءة فقط إلى ChatGPT. معطّل افتراضيًا. لا تتم مشاركة المطالبة الدقيقة إلا بعد موافقتك الصريحة.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "عدم المتابعة", "sp.recipient.reason_unrequested": "لم يتمكن WebBrain من فهم أن طلبك يتضمن إرسال رسالة. المحادثة المفتوحة على {host} مع {recipient}.", "sp.recipient.reason_unnamed": "لم يتمكن WebBrain من فهم من يجب أن يتلقى هذه الرسالة من طلبك. المحادثة المفتوحة على {host} مع {recipient}.", - 'st.tab.permissions': "الأذونات", 'st.perms.revoke': "إلغاء", 'st.perms.clear_all': "مسح كل الأذونات", 'st.perms.gate.label': "السؤال قبل الإجراءات المهمة", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'ابدأ', 'ob.btn.skip': 'تخطي الآن', 'ob.btn.start': 'بدء', - 'ob.cloud.body': 'WebBrain Compass جاهز مع بدل أسبوعي مجاني. قد يتم الاحتفاظ بمحادثات Compass المحددة واستخدامها لتحسين WebBrain بينما يكون Help Improve WebBrain قيد التشغيل افتراضيًا. يمكنك إيقاف تشغيله في الإعدادات → عام.', + 'ob.cloud.body': 'WebBrain Compass جاهز مع بدل أسبوعي مجاني. قد يتم الاحتفاظ بمحادثات Compass المحددة واستخدامها لتحسين WebBrain بينما يكون Help Improve WebBrain قيد التشغيل افتراضيًا. يمكنك إيقاف تشغيله في الإعدادات → متقدم.', 'ob.cloud.change': 'تغيير', 'ob.cloud.using': 'استخدام WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'النتيجة', 'sp.api.enabled_html': '🔓 تفعيل تعديلات واجهة API لهذه المحادثة. يمكن للوكيل الآن استخدام POST/PUT/PATCH/DELETE عبر fetch_url و execute_js عندما يرى أن API أكثر موثوقية من الواجهة. يظل التفاعل عبر الواجهة هو الافتراضي. تُمسح هذه العلامة عند تصفير المحادثة.', - 'sp.permissions.disabled_html': '⚠️ مطالبات الأذونات مُعطّلة. سيُنقر WebBrain ويكتب ويتنقّل ويُشغّل JavaScript ويرفع ويُنزّل ويُسجّل ويجدول أعمالًا مستقبلية دون أن يسأل أولًا. أعد تفعيل هذا من الإعدادات ← الأذونات ← السؤال قبل الإجراءات المهمة.', + 'sp.permissions.disabled_html': '⚠️ مطالبات الأذونات مُعطّلة. سيُنقر WebBrain ويكتب ويتنقّل ويُشغّل JavaScript ويرفع ويُنزّل ويُسجّل ويجدول أعمالًا مستقبلية دون أن يسأل أولًا. أعد تفعيل هذا من زر ⚠ بجوار الميكروفون.', 'sp.permissions.button': 'مطالبات الأذونات: مُفعّلة', 'sp.permissions.button_off': 'مطالبات الأذونات: مُعطّلة', 'sp.permissions.gate_desc': 'يسأل WebBrain في أول مرة ينقر فيها أو يكتب أو ينزّل ملفات أو يشغّل تعليمات برمجية على موقع.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'انتظار «{selector}»', 'st.title': 'إعدادات WebBrain', - 'st.subtitle': 'اضبط مزوّدي LLM والتفضيلات · v{version}', + 'st.subtitle': 'اضبط طريقة عمل WebBrain · v{version}', 'st.tab.display': 'عام', + 'st.tab.budgets': 'الميزانيات', + 'st.tab.advanced': 'متقدم', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'الكلام', + 'st.tab.generative': 'التوليد', + 'st.tab.decision': 'القرار', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'مزوّدو WebBrain', + 'st.providers_page.subtitle': 'اختر النماذج التي يستخدمها WebBrain · v{version}', + 'st.permissions_page.title': 'أذونات WebBrain', + 'st.permissions_page.subtitle': 'المواقع التي يمكن لـ WebBrain التصرف فيها دون أن يسأل أولًا', 'st.tab.providers': 'المزوّدون', 'st.tab.vision': 'الرؤية', 'st.tab.profile': 'الملف الشخصي', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "تحديث طريقة الدفع", 'st.account.manage_billing': 'إدارة الفوترة', - 'st.display.language.label': 'اللغة', - 'st.display.language.desc': 'لغة واجهة إضافة WebBrain.', 'st.display.verbose.label': 'الوضع المفصّل', 'st.display.verbose.desc': 'إظهار تفاصيل استدعاءات الأدوات كاملة، والمعطيات، ونتائج JSON الأولية. مُعطَّل افتراضيًا للحصول على تجربة محادثة أنظف.', 'st.display.selection_shortcut.label': 'اختصار التحديد', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'لقطة شاشة تلقائية', "st.display.auto_screenshot.desc": "التقط لقطة شاشة لنافذة العرض تلقائيًا بعد أن يتصرف الوكيل في الصفحة، لكي يرى مسار الرؤية المحدد ما تغيّر. يستهلك ذلك مزيدًا من الرموز. إذا لم تتوفر الرؤية، يتم تخطي الإثراء وتستمر المهمة مع إشعار بالحالة.", 'st.display.auto_screenshot.off': 'مُعطَّل', - 'st.display.auto_screenshot.navigation': 'عند التنقّل', - 'st.display.auto_screenshot.state_change': 'عند تغيّر الحالة (افتراضي)', + 'st.display.auto_screenshot.navigation': 'عند التنقّل (افتراضي)', + 'st.display.auto_screenshot.state_change': 'عند تغيّر الحالة', 'st.display.auto_screenshot.every_step': 'كل خطوة', 'st.display.tracing.label': 'تسجيل التتبّعات (لمقارنة النماذج)', - 'st.display.tracing.desc_html': 'حفظ كل تشغيل (طلبات LLM، الاستجابات، استدعاءات الأدوات، لقطات الشاشة) في IndexedDB المحلية حتى تتمكّن من فحص النماذج ومقارنتها جنبًا إلى جنب. يُفتح في علامة تبويب «التتبّعات» منفصلة. مُعطَّل افتراضيًا لأنه يضيف عمليات كتابة على القرص في كل خطوة. افتح صفحة التتبّعات →', - 'st.display.lossless_tracing.label': 'تسجيل تفاصيل الطلب الكاملة (طبقة تصحيح الأخطاء)', - 'st.display.lossless_tracing.desc_html': 'يحفظ أيضًا المطالبات والرسائل ومخططات الأدوات الكاملة لكل طلب نموذج لغوي بدلاً من الملخصات الخالية من المحتوى، ويحتفظ بما يصل إلى 200 كيلوبايت من كل نتيجة أداة. يتيح تصحيح الأخطاء العميق وإعادة بناء الطلبات. معطّل افتراضيًا لأنه يكتب محتوى محادثتك محليًا ويستهلك مساحة أكبر بكثير. يتطلب تفعيل تسجيل التتبعات.', + 'st.display.tracing.desc_html': 'حفظ كل تشغيل (طلبات LLM، الاستجابات، استدعاءات الأدوات، لقطات الشاشة) في IndexedDB المحلية حتى تتمكّن من فحص النماذج ومقارنتها جنبًا إلى جنب، بما في ذلك المطالبات والرسائل ومخططات الأدوات الكاملة لكل طلب نموذج لغوي وما يصل إلى 200 كيلوبايت من كل نتيجة أداة. يُفتح في علامة تبويب «التتبّعات» منفصلة. مُعطَّل افتراضيًا لأنه يكتب محتوى محادثتك محليًا ويستهلك مساحة أكبر بكثير. افتح صفحة التتبّعات →', 'st.display.allow_local_network.label': 'السماح للوكيل بالوصول إلى الشبكة المحلية', 'st.display.allow_local_network.desc': 'يسمح لأداة fetch_url للوكيل بالوصول إلى عناوين loopback (127.0.0.1، localhost) وعناوين RFC1918 الخاصة (10.x، 192.168.x، 172.16–31.x). مفيد لخوادم التطوير المحلية، وأدوات الإنترانت، وواجهات API ذاتية الاستضافة. مُعطَّل افتراضيًا. عند تعطيله، تُحظر عناوين IP الخاصة وloopback المكتوبة في URL وأسماء localhost. لا يتم فحص تحليل DNS، لذا قد تصل أسماء أخرى إلى عناوين محلية. تظل عناوين IP الحرفية لبيانات السحابة (169.254.169.254) وأسماء بيانات السحابة المدرجة أو *.internal/*.local محظورة حتى عند التفعيل.', 'st.display.notify_sound.label': "أصوات الإشعارات", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "وضع الرؤية مُفعّل للمزوّد النشط.", "sp.vision.off": "وضع الرؤية مُعطّل للمزوّد النشط.", "sp.vision.error": "فشل تبديل وضع الرؤية: {msg}", - "st.tab.multimodal": "النماذج المساعدة", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "موصى به. عند تفعيله، يطلب WebBrain الإذن في أول مرّة ينقر فيها أو يكتب أو يتنقّل أو يُشغّل JavaScript أو يرفع أو يُنزّل أو يُسجّل على موقع (ثم يتذكّر اختيارك). عطّله للاستخدام السريع دون مطالبات على المواقع التي تثق بها تمامًا.", "st.perms.gate.warning": "⚠️ مطالبات الأذونات مُعطّلة. سينقر WebBrain ويكتب ويتنقّل ويُشغّل JavaScript ويرفع ويُنزّل ويُسجّل على أي موقع دون أن يسأل — بما في ذلك على الصفحات التي قد يتحكّم في محتواها مهاجم. لا يزال محتوى الصفحة يُعامَل داخليًا كغير موثوق، لكن لا شيء سيمنع تعليمة محقونة من تشغيل إجراء. لا تُبقِ هذا معطّلًا إلا إذا كنت تثق تمامًا بكل موقع تستخدم المساعد عليه.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "الإعداد الافتراضي للنظام", "st.display.download_directory.error": "استخدم مجلدًا نسبيًا مثل WebBrain أو Work/WebBrain. لا يُسمح بالمسارات المطلقة أو “..”.", "st.display.strict_secret.label": "المعالجة الصارمة للأسرار", - "st.display.strict_secret.desc": "رفض اقتباس بيانات الاعتماد (كلمات المرور، مفاتيح API، الرموز، رموز OTP) في الملخّصات أو نص المساعد — حتى عندما تطلبها صراحةً. مفيد إذا كنت تشارك ملفات التتبّع أو تشارك شاشتك بانتظام. مُعطّل افتراضيًا ليتمكّن الوكيل من تكرار القيمة الدقيقة التي تطلبها عند الحاجة. فعّله (الإعدادات ← الأمان) عندما تريد إبقاء ملخّصات `done` مرتّبة وتجنّب تكرار بيانات الاعتماد.", + "st.display.strict_secret.desc": "رفض اقتباس بيانات الاعتماد (كلمات المرور، مفاتيح API، الرموز، رموز OTP) في الملخّصات أو نص المساعد — حتى عندما تطلبها صراحةً. مفيد إذا كنت تشارك ملفات التتبّع أو تشارك شاشتك بانتظام. مُعطّل افتراضيًا ليتمكّن الوكيل من تكرار القيمة الدقيقة التي تطلبها عند الحاجة. فعّله عندما تريد إبقاء ملخّصات `done` مرتّبة وتجنّب تكرار بيانات الاعتماد.", "st.display.request_timeout.label": "مهلة طلب LLM", "st.display.request_timeout.desc": "الحد الأقصى لانتظار ترويسات الاستجابة ولكل فترة توقف بين أجزاء الاستجابة المتدفقة. الافتراضي: 120 ثانية. زِد المدة للنماذج المحلية البطيئة، خاصة عند تشغيلها على المعالج أو مع سياق كبير.", "st.providers.filter.all": "الكل", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'تُضاف الرسائل إلى قائمة الانتظار بينما يكون WebBrain مشغولًا. يمكن فقط لـ /help و /progress و /btw و /scratchpad و /memory و /schedule --list و /watch و /dangerously-skip-permissions و /screenshot و /export و /export --traces و /verbose العمل فورًا كأوامر slash.', 'tool.go_back': 'العودة للخلف', 'tool.go_forward': 'التقدم للأمام', - 'st.display.search.placeholder': 'البحث في الإعدادات العامة', - 'st.display.search.empty': 'لا توجد إعدادات عامة مطابقة.', + 'st.display.search.placeholder': 'البحث في الإعدادات', + 'st.display.search.empty': 'لا توجد إعدادات مطابقة.', 'st.display.advanced': 'متقدم', ...getApocalypseModeCopy('ar'), ...getEmergencyBoxCopy('ar'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "أطول ضلع (العرض أو الارتفاع) بالبكسل لأي لقطة تُرسل إلى الرؤية. حد أصغر يصغّر الصور قبل الإرسال فيخفض الرموز والتكلفة. حد أكبر يحافظ على الدقة.", "st.imageBudget.warning": "⚠️ تنطبق هذه الإعدادات على اللقطات المخصصة للرؤية (لقطة تلقائية، /screenshot، صفحة كاملة، verify_form). الصور المحفوظة يدويًا بدقة كاملة لا تتأثر. «Image detail» تحترمه نقاط النهاية بأسلوب OpenAI؛ قد يتجاهلها مزوّدون آخرون.", - "st.redaction.heading": "تعتيم لقطات الشاشة", "st.redaction.toggle.label": "إخفاء المحتوى الحساس في لقطات الشاشة", "st.redaction.toggle.desc": "قبل إرسال لقطة الشاشة إلى نموذج رؤية، يقوم بتغبيش حقول النماذج والنص الذي يبدو كبريد إلكتروني أو رقم هاتف. يعمل الكشف بالكامل على جهازك — لا يُنقل أي شيء إضافي.", "st.redaction.warning": "⚠️ هذا تعتيم بأفضل جهد ومن نوع fail-open: إذا تعذّر تشغيل التعتيم على صفحة ما (مثلًا مباشرة بعد التنقل، أو في عارضات PDF، أو على صفحات المتصفح المقيّدة)، فستُرسل لقطة الشاشة كما هي دون تعتيم. يعتمد الكشف فقط على استدلالات DOM — النص المرسوم على عنصر canvas، أو البيانات الشخصية داخل الصور، أو أي شيء لا يُعرف كحقل نموذج أو نص بريد/هاتف قد يفلت من الكشف، كما أن نص الصفحة المُرسل إلى النموذج لا يُعتَّم بهذا الإعداد. هذا ليس ضمانًا أمنيًا. للخصوصية الكاملة، استخدم نموذجًا محليًا/دون اتصال (llama.cpp أو Ollama): عندها لن تغادر لقطات الشاشة جهازك إطلاقًا ولن تعود هناك حاجة للتعتيم.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "تصدير جلسة التتبع المحفوظة كاملة بصيغة JSON، بما فيها لقطات الشاشة", "sp.export_traces.recording_truncated": "تم تصدير جميع السجلات المحفوظة بصيغة JSON. حُذف بعض المحتوى أثناء التسجيل ولا يمكن استعادته بالتصدير.", "sp.slash.export_traces": "تصدير سلسلة الأدوات (التتبعات)", - "sp.export_traces.none": "لا توجد تتبعات لهذه المحادثة. فعّل «تسجيل التتبعات» في الإعدادات ثم أعد التشغيل.", + "sp.export_traces.none": "لا توجد تتبعات لهذه المحادثة. فعّل «تسجيل التتبعات» في الإعدادات ← متقدم ثم أعد التشغيل.", "sp.export_traces.error": "تعذّر تصدير التتبعات.", "sp.export_traces.done": "تم تصدير سلسلة الأدوات.", "sp.export_traces.no_conversation": "لا يوجد ما يُصدَّر بعد — ابدأ محادثة أولًا.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "تم تصدير سلسلة الأدوات. قد تُفقد الجولات الأقدم إذا كان لهذه المحادثة كثير من التتبعات.", "st.display.help_improve.label": "المساعدة في تحسين WebBrain", "st.display.help_improve.desc_html": "السماح بالاحتفاظ بتفاعلات محددة مع WebBrain Compass واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. مفعّل افتراضيًا. عطّله لمنع استخدام تفاعلات Compass المستقبلية لهذه الأغراض. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا من المورّدين الذين تفعّل لديهم «مشاركة الاستعلامات لأغراض البحث». سياسة الخصوصية →", - "st.providers.webbrain_data_use.body": "يتضمن WebBrain Compass استخدامًا يوميًا مجانيًا. عندما تكون «المساعدة في تحسين WebBrain» مفعّلة افتراضيًا، قد يتم الاحتفاظ بمحادثات Compass محددة واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. عطّلها من عام ← متقدم لاستبعاد تفاعلات Compass المستقبلية من هذه الاستخدامات. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا عند تفعيل خيار «مشاركة الاستعلامات لأغراض البحث» الخاص بهذا المورّد. {privacyLink}. لمزيد من الاستخدام، اشترك عبر {subscribeLink}. أدِر الفوترة عبر {accountLink}.", + "st.providers.webbrain_data_use.body": "يتضمن WebBrain Compass استخدامًا يوميًا مجانيًا. عندما تكون «المساعدة في تحسين WebBrain» مفعّلة افتراضيًا، قد يتم الاحتفاظ بمحادثات Compass محددة واستخدامها للتقييم والتحسين والضبط الدقيق والتدريب. عطّلها من الإعدادات ← متقدم لاستبعاد تفاعلات Compass المستقبلية من هذه الاستخدامات. لا يجمع WebBrain طلبات النماذج المحلية أو طلبات واجهة API الخاصة بك إلا عند تفعيل خيار «مشاركة الاستعلامات لأغراض البحث» الخاص بهذا المورّد. {privacyLink}. لمزيد من الاستخدام، اشترك عبر {subscribeLink}. أدِر الفوترة عبر {accountLink}.", 'st.providers.share_research.label': "مشاركة الاستعلامات لأغراض البحث", 'st.providers.share_research.hint': "يرسل المطالبات والردود من هذا المورّد إلى WebBrain للتقييم والتحسين، بما في ذلك المورّد والنموذج المستخدَمين. تُحذف الصور والمرفقات الثنائية ويُقتطع النص قبل المشاركة؛ ويُرسَل النص المتبقي كما هو.", 'st.providers.share_research.confirm': "مشاركة استعلامات هذا المورّد مع WebBrain لأغراض البحث؟\n\nعند التفعيل، ستُرسَل مطالباتك وردودك وتفاعلات الأدوات مع هذا المورّد إلى WebBrain للتقييم والتحسين، مع اسم المورّد والنموذج. يُرسَل النص كما هو بعد حذف الصور واقتطاع المحتوى الطويل، لذا تجنّب مشاركة البيانات الشخصية الحساسة. يمكنك إيقاف ذلك في أي وقت لإيقاف المشاركة مستقبلاً.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "هل تريد مقاطعات أقل؟ يتذكر خيار «السماح دائمًا» هذا الموقع. يعطّل الأمر أدناه مطالبات أذونات WebBrain على جميع المواقع.", "sp.perm.insert_skip_command": "إدراج /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "لم تتغير مسودتك. امسحها قبل إدراج الأمر.", - "ob.act.permissions_tip": "تكون مطالبات الأذونات مفعّلة افتراضيًا. يمكن للمستخدمين المتقدمين تعطيلها عالميًا باستخدام /dangerously-skip-permissions وإعادة تفعيلها من الإعدادات ← الأذونات.", + "ob.act.permissions_tip": "تكون مطالبات الأذونات مفعّلة افتراضيًا. يمكن للمستخدمين المتقدمين تعطيلها عالميًا باستخدام /dangerously-skip-permissions وإعادة تفعيلها من زر ⚠ بجوار الميكروفون.", 'st.provider.field.cache_read_cost_per_million': "تكلفة قراءة ذاكرة التخزين المؤقت المقدّرة ($ / مليون رمز)", 'st.provider.field.cache_write_cost_per_million': "تكلفة كتابة ذاكرة التخزين المؤقت لمدة 5 دقائق ($ / مليون رمز)", 'st.provider.field.cache_write_1h_cost_per_million': "تكلفة كتابة ذاكرة التخزين المؤقت لمدة ساعة واحدة ($ / مليون رمز)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "هل تريد استبدال النسخة السحابية المشفرة بإعداد WebBrain الحالي لهذا الجهاز؟", "st.sync.consent.legacy": "هل تريد تفعيل المزامنة المشفرة؟ سيرسل WebBrain نسخة مشفرة من طرف إلى طرف من ذكرياتك، والملء التلقائي لملفك الشخصي، وإعدادات موفر مفتاح واجهة برمجة التطبيقات (API) إلى WebBrain Compass. لا تتم مزامنة سجل الدردشة وتسجيلات الدخول عبر OAuth.", "st.sync.consent.denied": "لم يتم منح إذن المزامنة المشفرة.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "تغيّرت الصفحة أثناء تنفيذ المهمة ({before} → {after}). جارٍ متابعة المهمة.", 'sp.activity.generating_answer': "جارٍ إنشاء الإجابة…", 'sp.activity.retrying_response': "جارٍ إعادة محاولة الإجابة…", diff --git a/src/firefox/src/ui/locales/bn.js b/src/firefox/src/ui/locales/bn.js index ca638a5a27..389f5d51bb 100644 --- a/src/firefox/src/ui/locales/bn.js +++ b/src/firefox/src/ui/locales/bn.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'এক্সটেনশনের UI ছোট করুন', 'sp.ui_scale.increase': 'এক্সটেনশনের UI বড় করুন', 'sp.ui_scale.reset': 'রিসেট', - 'st.display.ui_scale.label': 'এক্সটেনশনের UI জুম', - 'st.display.ui_scale.decrease': 'এক্সটেনশনের UI ছোট করুন', - 'st.display.ui_scale.increase': 'এক্সটেনশনের UI বড় করুন', - 'st.display.ui_scale.reset': 'রিসেট', - 'st.display.ui_scale.desc': 'পেজের জুম পরিবর্তন না করে সাইড প্যানেল এবং আলাদা চ্যাট উইন্ডোর আকার পরিবর্তন করুন।', - 'st.display.ui_scale.shortcuts': 'নির্দিষ্ট শর্টকাট: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'নির্ধারিত নয়', - 'st.display.ui_scale.manage_shortcuts': 'শর্টকাট কাস্টমাইজ করুন', 'tool.delegate_research': 'ChatGPT দিয়ে গবেষণা চলছে', 'st.display.research_escalation.label': 'গবেষণা এসকেলেশন', 'st.display.research_escalation.desc': 'সক্রিয় থাকলে, WebBrain একটি অস্বাভাবিক জটিল শুধু-পঠন গবেষণা প্রম্পট ChatGPT-তে পাঠানোর আগে অনুমতি চাইতে পারে। ডিফল্টভাবে বন্ধ। আপনার স্পষ্ট অনুমোদনের পরেই সঠিক প্রম্পটটি শেয়ার করা হয়।', @@ -497,7 +489,7 @@ export default { 'sp.step.result_label': "ফলাফল", 'sp.api.enabled_html': "🔓 API মিউটেশন সক্রিয় করা হয়েছে এই কথোপকথনের জন্য। এজেন্ট এখন fetch_url এবং execute_js এর মাধ্যমে POST/PUT/PATCH/DELETE ব্যবহার করতে পারে যখন এটি API-কে একটি ধাপের জন্য UI এর চেয়ে বেশি নির্ভরযোগ্য বলে বিচার করে। UI-প্রথম ডিফল্ট থাকে। আপনি কথোপকথন রিসেট করলে এই পতাকাটি পরিষ্কার হয়ে যায়।", - 'sp.permissions.disabled_html': "⚠️ অনুমতি প্রম্পট বন্ধ আছে. WebBrain প্রথমে জিজ্ঞাসা না করেই ক্লিক করবে, টাইপ করবে, নেভিগেট করবে, JavaScript চালাবে, আপলোড করবে, ডাউনলোড করবে, রেকর্ড করবে এবং ভবিষ্যৎ কাজের সময়সূচী করবে। সেটিংস → অনুমতি → আনুষঙ্গিক কর্মের আগে জিজ্ঞাসা করুন থেকে এটি পুনরায় সক্ষম করুন৷", + 'sp.permissions.disabled_html': "⚠️ অনুমতি প্রম্পট বন্ধ আছে. WebBrain প্রথমে জিজ্ঞাসা না করেই ক্লিক করবে, টাইপ করবে, নেভিগেট করবে, JavaScript চালাবে, আপলোড করবে, ডাউনলোড করবে, রেকর্ড করবে এবং ভবিষ্যৎ কাজের সময়সূচী করবে। মাইক্রোফোনের পাশের ⚠ বোতাম থেকে এটি পুনরায় চালু করুন।", 'sp.permissions.button': 'অনুমতি প্রম্পট: চালু', 'sp.permissions.button_off': 'অনুমতি প্রম্পট: বন্ধ', 'sp.permissions.gate_desc': 'কোনো সাইটে প্রথমবার ক্লিক, টাইপ, ডাউনলোড বা কোড চালানোর আগে WebBrain জিজ্ঞাসা করে।', @@ -655,7 +647,7 @@ export default { 'ob.act.warn1': "WebBrain পরিকল্পনার জন্য স্ক্রিনশট ক্যাপচার করতে পারে। স্বাস্থ্য, অর্থ, ডেটিং বা ব্যক্তিগত অ্যাকাউন্ট পোর্টালের মতো সংবেদনশীল পৃষ্ঠাগুলিতে এজেন্ট মোড ব্যবহার করা এড়িয়ে চলুন, যদি না আপনি সেই ঝুঁকি গ্রহণ করেন।", 'ob.act.warn2': "ওয়েব বিষয়বস্তুতে AI আচরণকে ম্যানিপুলেট করার জন্য ডিজাইন করা দূষিত প্রম্পট ইনজেকশন থাকতে পারে।", 'ob.act.warn3': "সর্বদা প্রস্তাবিত ক্রিয়াগুলি পর্যালোচনা করুন এবং রানগুলি বন্ধ করুন যা অপ্রত্যাশিত দেখায়।", - 'ob.act.permissions_tip': "অনুমতি প্রম্পট ডিফল্টরূপে চালু আছে. উন্নত ব্যবহারকারীরা /dangerously-skip-permissions এর মাধ্যমে বিশ্বব্যাপী সেগুলিকে নিষ্ক্রিয় করতে পারে এবং সেটিংস → অনুমতিগুলিতে পুনরায় সক্ষম করতে পারে৷", + 'ob.act.permissions_tip': "অনুমতি প্রম্পট ডিফল্টরূপে চালু আছে. উন্নত ব্যবহারকারীরা /dangerously-skip-permissions এর মাধ্যমে বিশ্বব্যাপী সেগুলিকে নিষ্ক্রিয় করতে পারে এবং মাইক্রোফোনের পাশের ⚠ বোতাম থেকে পুনরায় চালু করতে পারে।", 'ob.tokens.title': "একটি মডেল চয়ন করুন", 'ob.tokens.body': "WebBrain কাজ করার জন্য একটি ভাষা মডেল প্রয়োজন। আমরা প্রথমে স্থানীয় মডেলগুলি পরীক্ষা করব। যদি কোনটি উপলব্ধ না হয়, সেটিংস খুলুন এবং একটি প্রদানকারী যোগ করুন:", 'ob.tokens.scanning': "স্থানীয় মডেল পরীক্ষা করা হচ্ছে...", @@ -681,23 +673,32 @@ export default { 'ob.btn.done': "শুরু করুন", 'ob.btn.skip': "আপাতত এড়িয়ে যান", 'ob.btn.start': 'শুরু', - 'ob.cloud.body': 'WebBrain Compass একটি বিনামূল্যের সাপ্তাহিক ভাতা সহ প্রস্তুত৷ নির্বাচিত Compass কথোপকথনগুলি ধরে রাখা যেতে পারে এবং WebBrain উন্নত করতে ব্যবহার করা যেতে পারে যখন Help Improve WebBrain ডিফল্টরূপে চালু থাকে৷ আপনি এটি Settings → General এ বন্ধ করতে পারেন৷', + 'ob.cloud.body': 'WebBrain Compass একটি বিনামূল্যের সাপ্তাহিক ভাতা সহ প্রস্তুত৷ নির্বাচিত Compass কথোপকথনগুলি ধরে রাখা যেতে পারে এবং WebBrain উন্নত করতে ব্যবহার করা যেতে পারে যখন Help Improve WebBrain ডিফল্টরূপে চালু থাকে৷ আপনি এটি Settings → Advanced এ বন্ধ করতে পারেন৷', 'ob.cloud.change': 'পরিবর্তন', 'ob.cloud.using': 'WebBrain Compass ব্যবহার করছে৷', // --- Settings ---------------------------------------------------------- 'st.title': "WebBrain সেটিংস", - 'st.subtitle': "আপনার LLM প্রদানকারী এবং পছন্দগুলি কনফিগার করুন · v{version}৷", + 'st.subtitle': "WebBrain কীভাবে কাজ করে তা কনফিগার করুন · v{version}", 'st.tab.display': "সাধারণ", + 'st.tab.budgets': 'বাজেট', + 'st.tab.advanced': 'উন্নত', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'কথা', + 'st.tab.generative': 'জেনারেটিভ', + 'st.tab.decision': 'ডিসিশন', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain প্রদানকারী', + 'st.providers_page.subtitle': 'WebBrain যে মডেলগুলো ব্যবহার করে সেগুলো বেছে নিন · v{version}', + 'st.permissions_page.title': 'WebBrain অনুমতি', + 'st.permissions_page.subtitle': 'যেসব সাইটে WebBrain আগে জিজ্ঞাসা না করেই কাজ করতে পারে', 'st.tab.providers': "প্রদানকারী", 'st.tab.skills': "দক্ষতা", 'st.tab.vision': "দৃষ্টি", - 'st.tab.multimodal': "সহায়ক মডেল", 'st.tab.memory': "স্মৃতি", 'st.tab.profile': "প্রোফাইল", 'st.tab.account': "হিসাব", 'st.tab.captcha': "ক্যাপচা", - 'st.tab.permissions': "অনুমতি", 'st.perms.gate.label': "ফলাফলমূলক কর্মের আগে জিজ্ঞাসা করুন", 'st.perms.gate.desc': "প্রস্তাবিত চালু হলে, WebBrain প্রথমবার অনুমতি চায় এটি ক্লিক করে, টাইপ করে, নেভিগেট করে, জাভাস্ক্রিপ্ট চালায়, আপলোড করে, ডাউনলোড করে, রেকর্ড করে, বা কোনও সাইটে ভবিষ্যতের কাজের সময়সূচী করে (তারপর আপনার পছন্দ মনে রাখে)। আপনি সম্পূর্ণরূপে বিশ্বাস করেন এমন সাইটগুলিতে দ্রুত, প্রম্পট-মুক্ত ব্যবহারের জন্য বন্ধ করুন৷", @@ -719,8 +720,6 @@ export default { "st.account.update_payment": "পেমেন্ট পদ্ধতি আপডেট করুন", 'st.account.manage_billing': "বিলিং পরিচালনা করুন", - 'st.display.language.label': "ভাষা", - 'st.display.language.desc': "WebBrain প্লাগইনের জন্য ইন্টারফেস ভাষা।", 'st.display.theme.label': "চেহারা", 'st.display.theme.desc': "হালকা, অন্ধকার বা আপনার OS সেটিংস অনুসরণ করুন।", 'st.display.theme.system': "সিস্টেম", @@ -730,8 +729,8 @@ export default { 'st.display.download_directory.desc': "আপনার ব্রাউজার বা সিস্টেম ডাউনলোড ডিরেক্টরির ভিতরে ঐচ্ছিক সাবফোল্ডার। সিস্টেম ডিফল্ট ব্যবহার করতে ফাঁকা ছেড়ে দিন।", 'st.display.download_directory.placeholder': "সিস্টেম ডিফল্ট", 'st.display.download_directory.error': "একটি আপেক্ষিক ফোল্ডার ব্যবহার করুন যেমন WebBrain বা Work/WebBrain। সম্পূর্ণ পাথ এবং \"..\" অনুমোদিত নয়৷", - 'st.display.search.placeholder': "সাধারণ সেটিংস অনুসন্ধান করুন", - 'st.display.search.empty': "কোনো সাধারণ সেটিংস মেলে না।", + 'st.display.search.placeholder': "সেটিংস অনুসন্ধান করুন", + 'st.display.search.empty': "কোনো সেটিং মেলেনি।", 'st.display.advanced': "উন্নত", ...getApocalypseModeCopy('bn'), ...getEmergencyBoxCopy('bn'), @@ -787,20 +786,18 @@ export default { 'st.display.auto_screenshot.label': "অটো-স্ক্রিনশট", "st.display.auto_screenshot.desc": "এজেন্ট পৃষ্ঠায় কাজ করার পর স্বয়ংক্রিয়ভাবে ভিউপোর্টের স্ক্রিনশট নিন, যাতে নির্বাচিত ভিশন রুট পরিবর্তনটি দেখতে পারে। এতে বেশি টোকেন লাগে। ভিশন না থাকলে সমৃদ্ধকরণ এড়িয়ে কাজটি স্ট্যাটাস নোটিশসহ চলতে থাকে।", 'st.display.auto_screenshot.off': "বন্ধ", - 'st.display.auto_screenshot.navigation': "নেভিগেশন", - 'st.display.auto_screenshot.state_change': "রাষ্ট্র পরিবর্তনের উপর (ডিফল্ট)", + 'st.display.auto_screenshot.navigation': "নেভিগেশন (ডিফল্ট)", + 'st.display.auto_screenshot.state_change': "রাষ্ট্র পরিবর্তনের উপর", 'st.display.auto_screenshot.every_step': "প্রতিটি পদক্ষেপ", 'st.display.tracing.label': "রেকর্ড ট্রেস (মডেল তুলনা জন্য)", - 'st.display.tracing.desc_html': "স্থানীয় IndexedDB-তে প্রতিটি রান (LLM অনুরোধ, প্রতিক্রিয়া, টুল কল, স্ক্রিনশট) চালিয়ে যান যাতে আপনি পাশাপাশি মডেলগুলি পরিদর্শন এবং তুলনা করতে পারেন। একটি পৃথক ট্রেস ট্যাবে খোলে। ডিফল্টরূপে বন্ধ কারণ এটি প্রতি ধাপে ডিস্ক রাইট যোগ করে। ট্রেস পৃষ্ঠা খুলুন →", - 'st.display.lossless_tracing.label': 'সম্পূর্ণ অনুরোধের বিবরণ রেকর্ড করুন (ডিবাগ স্তর)', - 'st.display.lossless_tracing.desc_html': 'প্রতিটি LLM অনুরোধের সম্পূর্ণ প্রম্পট, বার্তা এবং টুল স্কিমা বিষয়বস্তুহীন সারাংশের পরিবর্তে সংরক্ষণ করে এবং প্রতিটি টুল ফলাফলের ২০০ KB পর্যন্ত রাখে। গভীর ডিবাগিং এবং অনুরোধ পুনর্নির্মাণ সক্ষম করে। ডিফল্টভাবে বন্ধ কারণ এটি আপনার কথোপকথনের বিষয়বস্তু স্থানীয়ভাবে লেখে এবং অনেক বেশি ডিস্ক ব্যবহার করে। ট্রেস রেকর্ডিং চালু থাকা প্রয়োজন।', + 'st.display.tracing.desc_html': "স্থানীয় IndexedDB-তে প্রতিটি রান (LLM অনুরোধ, প্রতিক্রিয়া, টুল কল, স্ক্রিনশট) সংরক্ষণ করুন, যাতে আপনি পাশাপাশি মডেলগুলি পরিদর্শন ও তুলনা করতে পারেন — প্রতিটি LLM অনুরোধের সম্পূর্ণ প্রম্পট, বার্তা ও টুল স্কিমা এবং প্রতিটি টুল ফলাফলের ২০০ KB পর্যন্ত সহ। একটি পৃথক ট্রেস ট্যাবে খোলে। ডিফল্টভাবে বন্ধ কারণ এটি আপনার কথোপকথনের বিষয়বস্তু স্থানীয়ভাবে লেখে এবং অনেক বেশি ডিস্ক ব্যবহার করে। ট্রেস পৃষ্ঠা খুলুন →", 'st.display.cost_session_limit.label': "মেঘ খরচ অধিবেশন ভাতা", 'st.display.cost_session_limit.desc': "স্টপ ক্লাউড এবং OpenRouter এই সেশনটি রিপোর্ট করা বা আনুমানিক খরচ ভাতা পৌঁছানোর পরে অন্য একটি প্রদত্ত মডেল কলের আগে চলে। ডিফল্ট $10।", 'st.display.cost_total_limit.label': "ক্লাউড খরচ মোট ভাতা", 'st.display.cost_total_limit.desc': "ট্র্যাক রিপোর্ট করা বা আনুমানিক ক্লাউড/OpenRouter মডেল এক্সটেনশন জুড়ে ব্যয় করে এবং ভাতাতে আরও প্রদত্ত কল বন্ধ করে। স্থানীয় প্রদানকারীদের গণনা করা হয় না.", 'st.display.cost_reset': "খরচ রিসেট করুন", 'st.display.strict_secret.label': "কঠোর গোপন হ্যান্ডলিং", - 'st.display.strict_secret.desc': "সারাংশ বা সহকারী টেক্সটে শংসাপত্র (পাসওয়ার্ড, API কী, টোকেন, ওটিপি) উদ্ধৃত করতে অস্বীকার করুন — এমনকি আপনি যখন স্পষ্টভাবে তাদের জন্য জিজ্ঞাসা করেন। আপনি যদি নিয়মিত ট্রেস ফাইল বা স্ক্রিন-শেয়ার করেন তবে দরকারী। ডিফল্টরূপে বন্ধ: এজেন্ট আপনার জিজ্ঞাসা করা নির্দিষ্ট মান, প্রয়োজনে পুনরায় বলতে পারে। `done` সারাংশ পরিপাটি রাখতে এবং শংসাপত্র কখনও পুনরাবৃত্তি না করতে চাইলে এটি চালু করুন (সেটিংস → নিরাপত্তা)।", + 'st.display.strict_secret.desc': "সারাংশ বা সহকারী টেক্সটে শংসাপত্র (পাসওয়ার্ড, API কী, টোকেন, ওটিপি) উদ্ধৃত করতে অস্বীকার করুন — এমনকি আপনি যখন স্পষ্টভাবে তাদের জন্য জিজ্ঞাসা করেন। আপনি যদি নিয়মিত ট্রেস ফাইল বা স্ক্রিন-শেয়ার করেন তবে দরকারী। ডিফল্টরূপে বন্ধ: এজেন্ট আপনার জিজ্ঞাসা করা নির্দিষ্ট মান, প্রয়োজনে পুনরায় বলতে পারে। `done` সারাংশ পরিপাটি রাখতে এবং শংসাপত্র কখনও পুনরাবৃত্তি না করতে চাইলে এটি চালু করুন।", 'st.display.allow_local_network.label': "এজেন্টকে স্থানীয় নেটওয়ার্ক অ্যাক্সেস করার অনুমতি দিন", 'st.display.allow_local_network.desc': "এজেন্টের fetch_url টুলকে লুপব্যাকে (127.0.0.1, localhost) এবং ব্যক্তিগত/RFC1918 ঠিকানায় (10.x, 192.168.x, 172.16–31.x) পৌঁছাতে দেয়। স্থানীয় ডেভ সার্ভার, ইন্ট্রানেট টুল বা স্ব-হোস্টেড API-এর জন্য দরকারী। ডিফল্টরূপে বন্ধ। বন্ধ থাকলে URL-এ সরাসরি লেখা ব্যক্তিগত ও লুপব্যাক IP ঠিকানা এবং localhost নাম ব্লক থাকে। DNS রেজল্যুশন পরীক্ষা করা হয় না, তাই অন্য হোস্টনাম স্থানীয় ঠিকানায় পৌঁছাতে পারে। ক্লাউড-মেটাডেটার সরাসরি IP ঠিকানা (169.254.169.254) এবং তালিকাভুক্ত মেটাডেটা বা *.internal/*.local হোস্টনাম চালু থাকলেও ব্লক থাকে।", 'st.display.scheduled_tasks.label': "নির্ধারিত কাজ", @@ -890,7 +887,7 @@ export default { 'st.providers.compat.value.max': "সর্বোচ্চ", 'st.providers.compat.value.system': "সিস্টেম", 'st.providers.compat.value.developer': "বিকাশকারী", - 'st.providers.webbrain_data_use.body': "বিনামূল্যে দৈনিক WebBrain Compass ব্যবহার অন্তর্ভুক্ত করা হয়েছে। WebBrain উন্নত করার জন্য সহায়তা ডিফল্টরূপে চালু থাকলেও, নির্বাচিত Compass কথোপকথনগুলি বজায় রাখা যেতে পারে এবং মূল্যায়ন, উন্নতি, ফাইন-টিউনিং এবং প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে। এই ব্যবহারগুলি থেকে ভবিষ্যতের Compass ইন্টারঅ্যাকশনগুলি বাদ দিতে সাধারণ → উন্নত-এ এটি বন্ধ করুন৷ WebBrain স্থানীয়-মডেল ও আপনার নিজের API অনুরোধ শুধু তখনই সংগ্রহ করে যখন আপনি এই প্রদানকারীর “গবেষণার জন্য কোয়েরি শেয়ার করুন” বিকল্প চালু করেন। {privacyLink}। আরও ব্যবহারের জন্য, {subscribeLink}-এ সদস্যতা নিন। {accountLink} এ বিলিং পরিচালনা করুন।", + 'st.providers.webbrain_data_use.body': "বিনামূল্যে দৈনিক WebBrain Compass ব্যবহার অন্তর্ভুক্ত করা হয়েছে। WebBrain উন্নত করার জন্য সহায়তা ডিফল্টরূপে চালু থাকলেও, নির্বাচিত Compass কথোপকথনগুলি বজায় রাখা যেতে পারে এবং মূল্যায়ন, উন্নতি, ফাইন-টিউনিং এবং প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে। এই ব্যবহারগুলি থেকে ভবিষ্যতের Compass ইন্টারঅ্যাকশনগুলি বাদ দিতে সেটিংস → উন্নত-এ এটি বন্ধ করুন৷ WebBrain স্থানীয়-মডেল ও আপনার নিজের API অনুরোধ শুধু তখনই সংগ্রহ করে যখন আপনি এই প্রদানকারীর “গবেষণার জন্য কোয়েরি শেয়ার করুন” বিকল্প চালু করেন। {privacyLink}। আরও ব্যবহারের জন্য, {subscribeLink}-এ সদস্যতা নিন। {accountLink} এ বিলিং পরিচালনা করুন।", 'st.providers.share_research.label': "গবেষণার জন্য কোয়েরি শেয়ার করুন", 'st.providers.share_research.hint': "এই প্রদানকারীর প্রম্পট ও প্রতিক্রিয়া মূল্যায়ন ও উন্নতির জন্য WebBrain-কে পাঠায়, ব্যবহৃত প্রদানকারী ও মডেলসহ। শেয়ারের আগে ছবি ও বাইনারি সংযুক্তি সরানো হয় এবং টেক্সট ছেঁটে নেয়া হয়; বাকি টেক্সট অপরিবর্তিত পাঠানো হয়।", 'st.providers.share_research.confirm': "এই প্রদানকারীর কোয়েরি কি গবেষণার জন্য WebBrain-এর সাথে শেয়ার করবেন?\n\nচালু থাকলে, এই প্রদানকারীর সাথে আপনার প্রম্পট, প্রতিক্রিয়া ও টুল ইন্টারঅ্যাকশন প্রদানকারী ও মডেলের নামসহ মূল্যায়ন ও উন্নতির জন্য WebBrain-কে পাঠানো হবে। ছবি সরিয়ে ও দীর্ঘ কনটেন্ট ছেঁটে টেক্সট অপরিবর্তিত পাঠানো হয়, তাই সংবেদনশীল ব্যক্তিগত তথ্য শেয়ার এড়িয়ে চলুন। ভবিষযতে শেয়ার বন্ধ করতে যেকোনো সময় এটি বন্ধ করতে পারেন।", @@ -1035,7 +1032,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "স্ক্রিনশট রিডাকশন", 'st.redaction.toggle.label': "স্ক্রিনশট থেকে সংবেদনশীল কন্টেন্ট রিড্যাক্ট করুন", 'st.redaction.toggle.desc': "একটি ভিশন মডেলে একটি স্ক্রিনশট পাঠানোর আগে, ফর্মের ক্ষেত্রগুলি এবং পাঠ্যটি অস্পষ্ট করুন যা একটি ইমেল বা ফোন নম্বরের মতো দেখাচ্ছে৷ সনাক্তকরণ সম্পূর্ণরূপে আপনার ডিভাইসে চলে — অতিরিক্ত কিছুই প্রেরণ করা হয় না।", 'st.redaction.warning': "⚠️ সর্বোত্তম-প্রচেষ্টা এবং ব্যর্থ-ওপেন: যদি রিডাকশন কোনও পৃষ্ঠায় চলতে না পারে (উদাহরণস্বরূপ, নেভিগেশনের ঠিক পরে, পিডিএফ ভিউয়ারে বা সীমাবদ্ধ ব্রাউজার পৃষ্ঠাগুলিতে), স্ক্রিনশটটি এখনও সংশোধন না করে পাঠানো হয়। সনাক্তকরণ শুধুমাত্র DOM হিউরিস্টিক ব্যবহার করে — ক্যানভাস-আঁকানো পাঠ্য, চিত্রের ভিতরে PII, বা ফর্ম ক্ষেত্র হিসাবে স্বীকৃত নয় এমন কিছু বা ইমেল/ফোন পাঠ্যটি স্লিপ হতে পারে এবং মডেলে পাঠানো পৃষ্ঠা পাঠ্য এই সেটিং দ্বারা সংশোধন করা হয় না। এটি একটি নিরাপত্তা গ্যারান্টি নয়. সম্পূর্ণ গোপনীয়তার জন্য, একটি স্থানীয়/অফলাইন মডেল ব্যবহার করুন (llama.cpp, Ollama): তারপর স্ক্রিনশটগুলি কখনই আপনার মেশিন ছেড়ে যাবেন না এবং সংশোধন অপ্রয়োজনীয়।", @@ -1223,7 +1219,7 @@ export default { "sp.slash.export_traces_full": "স্ক্রিনশটসহ সম্পূর্ণ সংরক্ষিত ট্রেস সেশন JSON হিসেবে রপ্তানি করুন", "sp.export_traces.recording_truncated": "সব সংরক্ষিত রেকর্ড JSON হিসেবে রপ্তানি করা হয়েছে। রেকর্ডিংয়ের সময় বাদ পড়া কিছু তথ্য রপ্তানির মাধ্যমে ফেরত পাওয়া যাবে না।", "sp.slash.export_traces": "টুল চেইন (ট্রেস) রপ্তানি করুন", - "sp.export_traces.none": "এই কথোপকথনের জন্য কোন চিহ্ন নেই. সেটিংসে রেকর্ড ট্রেস সক্ষম করুন, তারপর আবার চালান।", + "sp.export_traces.none": "এই কথোপকথনের জন্য কোন চিহ্ন নেই. সেটিংস → উন্নত-এ রেকর্ড ট্রেস সক্ষম করুন, তারপর আবার চালান।", "sp.export_traces.error": "ট্রেস এক্সপোর্ট করা যায়নি।", "sp.export_traces.done": "টুল চেইন রপ্তানি করা হয়েছে।", "sp.export_traces.no_conversation": "এখনও রপ্তানি করার কিছু নেই — প্রথমে একটি কথোপকথন শুরু করুন।", @@ -1297,7 +1293,7 @@ export default { "st.sync.confirm.reset": "এই ডিভাইসের বর্তমান WebBrain সেটআপ দিয়ে এনক্রিপ্ট করা ক্লাউড কপি প্রতিস্থাপন করবেন?", "st.sync.consent.legacy": "এনক্রিপ্ট করা সিঙ্ক চালু করবেন? WebBrain আপনার স্মৃতি, প্রোফাইল অটোফিল এবং API-কী প্রদানকারী সেটিংসের একটি এন্ড-টু-এন্ড এনক্রিপ্টেড কপি WebBrain Compass-এ প্রেরণ করবে। চ্যাট ইতিহাস এবং OAuth সাইন-ইন সিঙ্ক করা হয় না।", "st.sync.consent.denied": "এনক্রিপ্ট করা সিঙ্ক অনুমতি দেওয়া হয়নি।", - 'st.providers.webgpu_note.body': '{modelLink} কোনো API এন্ডপয়েন্ট ছাড়াই সম্পূর্ণভাবে Chrome-এ চলে। এটি Settings > Providers > WebGPU বা Apocalypse Mode থেকে ডাউনলোড করুন, তারপর standalone chat-এ nuclear control ব্যবহার করুন।', + 'st.providers.webgpu_note.body': '{modelLink} কোনো API এন্ডপয়েন্ট ছাড়াই সম্পূর্ণভাবে Chrome-এ চলে। এটি Providers > WebGPU বা Apocalypse Mode থেকে ডাউনলোড করুন, তারপর standalone chat-এ nuclear control ব্যবহার করুন।', 'sp.monitor.navigation': "কাজ চলার সময় পৃষ্ঠা বদলেছে ({before} → {after})। কাজ চলতে থাকবে।", 'sp.activity.generating_answer': "উত্তর তৈরি হচ্ছে…", 'sp.activity.retrying_response': "উত্তর আবার চেষ্টা করা হচ্ছে…", diff --git a/src/firefox/src/ui/locales/de.js b/src/firefox/src/ui/locales/de.js index ed3a8f19c1..381ef757ac 100644 --- a/src/firefox/src/ui/locales/de.js +++ b/src/firefox/src/ui/locales/de.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Erweiterungsoberfläche verkleinern', 'sp.ui_scale.increase': 'Erweiterungsoberfläche vergrößern', 'sp.ui_scale.reset': 'Zurücksetzen', - 'st.display.ui_scale.label': 'Erweiterungsoberfläche zoomen', - 'st.display.ui_scale.decrease': 'Erweiterungsoberfläche verkleinern', - 'st.display.ui_scale.increase': 'Erweiterungsoberfläche vergrößern', - 'st.display.ui_scale.reset': 'Zurücksetzen', - 'st.display.ui_scale.desc': 'Seitenleiste und separates Chatfenster vergrößern oder verkleinern, ohne den Seitenzoom zu ändern.', - 'st.display.ui_scale.shortcuts': 'Eigene Tastenkürzel: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Nicht zugewiesen', - 'st.display.ui_scale.manage_shortcuts': 'Tastenkürzel anpassen', 'tool.delegate_research': 'Recherche mit ChatGPT', 'st.display.research_escalation.label': 'Recherche-Eskalation', 'st.display.research_escalation.desc': 'Wenn aktiviert, kann WebBrain vor dem Senden einer ungewöhnlich komplexen, schreibgeschützten Rechercheanfrage an ChatGPT um Zustimmung bitten. Standardmäßig deaktiviert. Die genaue Anfrage wird nur nach Ihrer ausdrücklichen Zustimmung geteilt.', @@ -452,7 +444,7 @@ export default { 'sp.step.input_label': 'Eingabe', 'sp.step.result_label': 'Ergebnis', 'sp.api.enabled_html': '🔓 API-Mutationen aktiviert für dieses Gespräch. Der Agent kann nun POST/PUT/PATCH/DELETE über fetch_url und execute_js verwenden, wenn er API für zuverlässiger als die Benutzeroberfläche hält. Die Oberfläche bleibt standardmäßig bevorzugt. Dieses Flag wird beim Zurücksetzen des Gesprächs gelöscht.', - 'sp.permissions.disabled_html': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen, ohne vorher zu fragen. Schalten Sie diese Option in Einstellungen → Berechtigungen → Vor bedeutsamen Aktionen fragen wieder ein.', + 'sp.permissions.disabled_html': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen, ohne vorher zu fragen. Schalten Sie diese Option über die ⚠-Schaltfläche neben dem Mikrofon wieder ein.', 'sp.permissions.button': 'Berechtigungsabfragen: an', 'sp.permissions.button_off': 'Berechtigungsabfragen: aus', 'sp.permissions.gate_desc': 'WebBrain fragt, bevor es auf einer Website zum ersten Mal klickt, tippt, herunterlädt oder Code ausführt.', @@ -556,7 +548,7 @@ export default { 'sp.workflows.reason.name_required': 'Geben Sie einen Workflow-Namen an: /workflow --save .', 'sp.workflows.reason.http_start_url': 'Der aufgezeichnete Durchlauf muss auf einer http(s)-Seite beginnen, bevor er gespeichert werden kann.', 'sp.workflows.reason.normalization_failed': 'Dieser Workflow konnte nicht gespeichert werden, da seine Schritte nicht sicher für die Wiedergabe sind.', - 'sp.export_traces.none': 'Keine Traces für dieses Gespräch. Aktivieren Sie „Traces aufzeichnen" in den Einstellungen und führen Sie den Durchlauf erneut aus.', + 'sp.export_traces.none': 'Keine Traces für dieses Gespräch. Aktivieren Sie „Traces aufzeichnen" unter Einstellungen → Erweitert und führen Sie den Durchlauf erneut aus.', 'sp.export_traces.error': 'Traces konnten nicht exportiert werden.', 'sp.export_traces.done': 'Werkzeugkette exportiert.', 'sp.export_traces.no_conversation': 'Noch nichts zu exportieren — beginnen Sie zunächst ein Gespräch.', @@ -656,7 +648,7 @@ export default { 'ob.act.warn1': 'WebBrain kann Screenshots für die Planung aufnehmen. Vermeiden Sie den Agent-Modus auf sensiblen Seiten wie Gesundheit, Finanzen, Dating oder privaten Kontenportalen, sofern Sie dieses Risiko akzeptieren.', 'ob.act.warn2': 'Web-Inhalte können bösartige Prompt-Injection enthalten, die auf die Manipulation von KI-Verhalten abzielen.', 'ob.act.warn3': 'Überprüfen Sie immer die vorgeschlagenen Aktionen und stoppen Sie Durchläufe, die unerwartet aussehen.', - 'ob.act.permissions_tip': 'Berechtigungsabfragen sind standardmäßig aktiv. Fortgeschrittene Benutzer können sie global mit /dangerously-skip-permissions deaktivieren und in Einstellungen → Berechtigungen wieder aktivieren.', + 'ob.act.permissions_tip': 'Berechtigungsabfragen sind standardmäßig aktiv. Fortgeschrittene Benutzer können sie global mit /dangerously-skip-permissions deaktivieren und über die ⚠-Schaltfläche neben dem Mikrofon wieder aktivieren.', 'ob.tokens.title': 'Modell auswählen', 'ob.tokens.body': 'WebBrain benötigt ein Sprachmodell. Wir prüfen zuerst auf lokale Modelle. Wenn keine verfügbar sind, öffnen Sie die Einstellungen und fügen Sie einen Anbieter hinzu:', 'ob.tokens.scanning': 'Suche nach lokalen Modellen...', @@ -682,22 +674,31 @@ export default { 'ob.btn.done': 'Loslegen', 'ob.btn.skip': 'Vorerst überspringen', 'ob.btn.start': 'Starten', - 'ob.cloud.body': 'WebBrain Compass ist mit einem wöchentlichen kostenlosen Kontingent bereit. Ausgewählte Compass-Gespräche können gespeichert und zur Verbesserung von WebBrain verwendet werden, solange „Hilfe, WebBrain zu verbessern" standardmäßig aktiviert ist. Sie können dies in Einstellungen → Allgemein deaktivieren.', + 'ob.cloud.body': 'WebBrain Compass ist mit einem wöchentlichen kostenlosen Kontingent bereit. Ausgewählte Compass-Gespräche können gespeichert und zur Verbesserung von WebBrain verwendet werden, solange „Hilfe, WebBrain zu verbessern" standardmäßig aktiviert ist. Sie können dies in Einstellungen → Erweitert deaktivieren.', 'ob.cloud.change': 'Ändern', 'ob.cloud.using': 'WebBrain Compass verwenden.', // --- Settings --- 'st.title': 'WebBrain-Einstellungen', - 'st.subtitle': 'Konfigurieren Sie Ihre LLM-Anbieter und Präferenzen · v{version}', + 'st.subtitle': 'Legen Sie fest, wie WebBrain arbeitet · v{version}', 'st.tab.display': 'Allgemein', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Erweitert', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Sprache', + 'st.tab.generative': 'Generativ', + 'st.tab.decision': 'Entscheidung', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain-Anbieter', + 'st.providers_page.subtitle': 'Wählen Sie die Modelle, die WebBrain verwendet · v{version}', + 'st.permissions_page.title': 'WebBrain-Berechtigungen', + 'st.permissions_page.subtitle': 'Websites, auf denen WebBrain ohne Nachfrage handeln darf', 'st.tab.providers': 'Anbieter', 'st.tab.skills': 'Skills', 'st.tab.vision': 'Vision', - 'st.tab.multimodal': "Assistenzmodelle", 'st.tab.memory': 'Memorie', 'st.tab.profile': 'Profil', 'st.tab.account': 'Konto', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Berechtigungen', 'st.perms.gate.label': 'Vor bedeutsamen Aktionen fragen', 'st.perms.gate.desc': 'Empfohlen. Wenn aktiviert, fragt WebBrain beim ersten Klick, Tippen, Navigieren, JavaScript-Ausführen, Hochladen, Herunterladen, Aufnehmen oder Planen zukünftiger Aufgaben auf einer Website um Erlaubnis (und merkt sich Ihre Auswahl). Deaktivieren Sie diese Option für schnelle, auffreie Nutzung auf Websites, denen Sie voll vertrauen.', 'st.perms.gate.warning': '⚠️ Berechtigungsabfragen sind DEAKTIVIERT. WebBrain wird auf jeder Website klicken, tippen, navigieren, JavaScript ausführen, hochladen, herunterladen, aufnehmen und zukünftige Aufgaben planen OHNE zu fragen — einschließlich auf Seiten, deren Inhalt von Angreifern kontrolliert werden kann.', @@ -716,8 +717,6 @@ export default { "st.account.payment_failed": "Deine Abonnementzahlung konnte nicht abgeschlossen werden. Aktualisiere deine Zahlungsmethode, um deinen kostenpflichtigen Tarif wieder zu nutzen.", "st.account.update_payment": "Zahlungsmethode aktualisieren", 'st.account.manage_billing': 'Abrechnung verwalten', - 'st.display.language.label': 'Sprache', - 'st.display.language.desc': 'Oberflächensprache des WebBrain-Plugins.', 'st.display.theme.label': 'Darstellung', 'st.display.theme.desc': 'Hell, Dunkel oder OS-Einstellung übernehmen.', 'st.display.theme.system': 'System', @@ -727,8 +726,8 @@ export default { 'st.display.download_directory.desc': 'Optionaler Unterordner im Browser- oder System-Download-Verzeichnis. Leer lassen, um den Systemstandard zu verwenden.', 'st.display.download_directory.placeholder': 'Systemstandard', 'st.display.download_directory.error': 'Verwenden Sie einen relativen Ordner wie WebBrain oder Work/WebBrain. Absolute Pfade und „.." sind nicht erlaubt.', - 'st.display.search.placeholder': 'Allgemeine Einstellungen durchsuchen', - 'st.display.search.empty': 'Keine passenden allgemeinen Einstellungen.', + 'st.display.search.placeholder': 'Einstellungen durchsuchen', + 'st.display.search.empty': 'Keine passenden Einstellungen.', 'st.display.advanced': 'Erweitert', ...getApocalypseModeCopy('de'), ...getEmergencyBoxCopy('de'), @@ -784,20 +783,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatischer Screenshot', "st.display.auto_screenshot.desc": "Erstellt automatisch einen Viewport-Screenshot, nachdem der Agent auf der Seite gehandelt hat, damit die ausgewählte Bildverarbeitungsroute die Änderung sehen kann. Das kostet mehr Tokens. Ist keine Bildverarbeitung verfügbar, wird die Anreicherung übersprungen und die Aufgabe mit einem Statushinweis fortgesetzt.", 'st.display.auto_screenshot.off': 'Aus', - 'st.display.auto_screenshot.navigation': 'Bei Navigation', - 'st.display.auto_screenshot.state_change': 'Bei Zustandsänderung (Standard)', + 'st.display.auto_screenshot.navigation': 'Bei Navigation (Standard)', + 'st.display.auto_screenshot.state_change': 'Bei Zustandsänderung', 'st.display.auto_screenshot.every_step': 'Bei jedem Schritt', 'st.display.tracing.label': 'Traces aufzeichnen (zum Modellvergleich)', - 'st.display.tracing.desc_html': 'Speichert jeden Durchlauf in der lokalen IndexedDB, damit Sie Modelle seitenweise inspizieren und vergleichen können. Traces öffnen →', - 'st.display.lossless_tracing.label': 'Vollständige Anforderungsdetails aufzeichnen (Debug-Stufe)', - 'st.display.lossless_tracing.desc_html': 'Speichert zusätzlich die vollständigen Prompts, Nachrichten und Tool-Schemata jeder LLM-Anfrage statt inhaltsloser Zusammenfassungen und behält bis zu 200 KB jedes Tool-Ergebnisses. Ermöglicht tiefes Debugging und die Rekonstruktion von Anfragen. Standardmäßig aus, weil es Ihren Gesprächsinhalt lokal schreibt und deutlich mehr Speicherplatz benötigt. Erfordert aktivierte Trace-Aufzeichnung.', + 'st.display.tracing.desc_html': 'Speichert jeden Durchlauf (LLM-Anfragen, Antworten, Tool-Aufrufe, Screenshots) in der lokalen IndexedDB, damit Sie Modelle nebeneinander inspizieren und vergleichen können – einschließlich der vollständigen Prompts, Nachrichten und Tool-Schemata jeder LLM-Anfrage und bis zu 200 KB jedes Tool-Ergebnisses. Öffnet sich in einem eigenen Traces-Tab. Standardmäßig aus, weil es Ihren Gesprächsinhalt lokal schreibt und deutlich mehr Speicherplatz benötigt. Traces öffnen →', 'st.display.cost_session_limit.label': 'Cloud-Kosten-Sitzungskontingent', 'st.display.cost_session_limit.desc': 'Stoppt Cloud- und OpenRouter-Durchläufe vor einem weiteren kostenpflichtigen Modellaufruf, wenn diese Sitzung das Kostenkontingent erreicht.', 'st.display.cost_total_limit.label': 'Cloud-Kosten-Gesamtkontingent', 'st.display.cost_total_limit.desc': 'Verfolgt gemeldete oder geschätzte Cloud/OpenRouter-Modellausgaben in der gesamten Erweiterung und stoppt weitere kostenpflichtige Aufrufe am Kontingent.', 'st.display.cost_reset': 'Ausgaben zurücksetzen', 'st.display.strict_secret.label': 'Strenge Geheimnisverwaltung', - 'st.display.strict_secret.desc': 'Weigert sich, Anmeldeinformationen (Passwörter, API-Schlüssel, Token, OTPs) in Zusammenfassungen oder Assistententext zu zitieren — auch wenn Sie ausdrücklich danach fragen. Nützlich, wenn Sie regelmäßig Trace-Dateien teilen oder den Bildschirm freigeben. Standardmäßig deaktiviert, damit der Agent den exakten Wert, den Sie anfordern, bei Bedarf wiedergeben kann. Aktivieren Sie es (Einstellungen → Sicherheit), wenn `done`-Zusammenfassungen ordentlich bleiben und Anmeldeinformationen nie wiederholt werden sollen.', + 'st.display.strict_secret.desc': 'Weigert sich, Anmeldeinformationen (Passwörter, API-Schlüssel, Token, OTPs) in Zusammenfassungen oder Assistententext zu zitieren — auch wenn Sie ausdrücklich danach fragen. Nützlich, wenn Sie regelmäßig Trace-Dateien teilen oder den Bildschirm freigeben. Standardmäßig deaktiviert, damit der Agent den exakten Wert, den Sie anfordern, bei Bedarf wiedergeben kann. Aktivieren Sie es, wenn `done`-Zusammenfassungen ordentlich bleiben und Anmeldeinformationen nie wiederholt werden sollen.', 'st.display.allow_local_network.label': 'Agenten den Zugriff auf das lokale Netzwerk erlauben', 'st.display.allow_local_network.desc': 'Ermöglicht es dem fetch_url-Tool des Agents, Loopback- und private/RFC1918-Adressen zu erreichen.', 'st.display.scheduled_tasks.label': 'Geplante Aufgaben', @@ -852,7 +849,7 @@ export default { 'st.providers.get_api_key': 'API-Schlüssel abrufen', 'st.providers.webbrain_note.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Anfragen werden über api.webbrain.one weitergeleitet; standardmäßig protokollieren wir Metadaten für Kontingente und Fehlerbehebung, jedoch keine Prompt-Texte, Seiteninhalte, Screenshots oder Modellantworten. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', 'st.providers.webbrain_note.privacy_link': 'Datenschutzrichtlinie', - 'st.providers.webbrain_data_use.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Solange „Bei der Verbesserung von WebBrain helfen“ standardmäßig aktiviert ist, können ausgewählte Compass-Unterhaltungen gespeichert und für Auswertung, Verbesserung, Feinabstimmung und Training verwendet werden. Deaktivieren Sie die Option unter „Allgemein → Erweitert“, um zukünftige Compass-Interaktionen davon auszuschließen. Anfragen an lokale Modelle und eigene APIs werden von WebBrain nur erfasst, wenn Sie die anbieterspezifische Option „Suchanfragen für Forschung teilen“ aktivieren. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Kostenlose wöchentliche WebBrain Compass-Nutzung ist enthalten. Solange „Bei der Verbesserung von WebBrain helfen“ standardmäßig aktiviert ist, können ausgewählte Compass-Unterhaltungen gespeichert und für Auswertung, Verbesserung, Feinabstimmung und Training verwendet werden. Deaktivieren Sie die Option unter „Einstellungen → Erweitert“, um zukünftige Compass-Interaktionen davon auszuschließen. Anfragen an lokale Modelle und eigene APIs werden von WebBrain nur erfasst, wenn Sie die anbieterspezifische Option „Suchanfragen für Forschung teilen“ aktivieren. {privacyLink}. Für mehr Nutzung abonnieren Sie unter {subscribeLink}. Verwalten Sie die Abrechnung unter {accountLink}.', 'st.providers.share_research.label': "Suchanfragen für Forschung teilen", 'st.providers.share_research.hint': "Sendet Prompts und Antworten dieses Anbieters zur Auswertung und Verbesserung an WebBrain, einschließlich des verwendeten Anbieters und Modells. Bilder und binäre Anhänge werden entfernt und Texte gekürzt; der übrige Text wird unverändert gesendet.", 'st.providers.share_research.confirm': "Suchanfragen dieses Anbieters für Forschung mit WebBrain teilen?\n\nWenn aktiviert, werden Ihre Prompts, Antworten und Tool-Interaktionen mit diesem Anbieter zusammen mit Anbieter- und Modellname zur Auswertung und Verbesserung an WebBrain gesendet. Texte werden nach dem Entfernen von Bildern und Kürzen langer Inhalte unverändert gesendet – teilen Sie daher keine sensiblen persönlichen Daten. Sie können dies jederzeit deaktivieren, um die weitere Freigabe zu stoppen.", @@ -977,7 +974,6 @@ export default { 'st.imageBudget.warning': '⚠️ Diese Einstellungen gelten für Screenshots, die für Vision erfasst werden...', // --- Screenshot redaction --- - 'st.redaction.heading': 'Screenshot-Verpixelung', 'st.redaction.toggle.label': 'Sensible Inhalte auf Screenshots verpixeln', 'st.redaction.toggle.desc': 'Bevor ein Screenshot an ein Vision-Modell gesendet wird, werden Formularfelder und Text, der wie eine E-Mail oder Telefonnummer aussieht, verwischt...', 'st.redaction.warning': '⚠️ Best-Effort und fail-open: Wenn die Verpixelung auf einer Seite nicht ausgeführt werden kann...', @@ -1270,7 +1266,7 @@ export default { "st.sync.confirm.reset": "Die verschlüsselte Cloud-Kopie durch das aktuelle WebBrain-Setup dieses Geräts ersetzen?", "st.sync.consent.legacy": "Verschlüsselte Synchronisierung aktivieren? WebBrain überträgt eine Ende-zu-Ende-verschlüsselte Kopie Ihrer Erinnerungen, des automatischen Ausfüllens Ihres Profils und der Einstellungen des API-Schlüsselanbieters an die WebBrain Compass. Chatverlauf und OAuth-Anmeldungen werden nicht synchronisiert.", "st.sync.consent.denied": "Die Berechtigung zur verschlüsselten Synchronisierung wurde nicht erteilt.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Die Seite hat sich während der Aufgabe geändert ({before} → {after}). Die Aufgabe wird fortgesetzt.", 'sp.activity.generating_answer': "Antwort wird erstellt…", 'sp.activity.retrying_response': "Antwort wird erneut versucht…", diff --git a/src/firefox/src/ui/locales/en.js b/src/firefox/src/ui/locales/en.js index 9e1c6a8309..5eea3a468c 100644 --- a/src/firefox/src/ui/locales/en.js +++ b/src/firefox/src/ui/locales/en.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Zoom extension UI out', 'sp.ui_scale.increase': 'Zoom extension UI in', 'sp.ui_scale.reset': 'Reset', - 'st.display.ui_scale.label': 'Extension UI zoom', - 'st.display.ui_scale.decrease': 'Zoom extension UI out', - 'st.display.ui_scale.increase': 'Zoom extension UI in', - 'st.display.ui_scale.reset': 'Reset', - 'st.display.ui_scale.desc': 'Resize the side panel and detached chat window without changing page zoom.', - 'st.display.ui_scale.shortcuts': 'Dedicated shortcuts: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Not assigned', - 'st.display.ui_scale.manage_shortcuts': 'Customize shortcuts', 'tool.delegate_research': 'Researching with ChatGPT', 'st.display.research_escalation.label': 'Research escalation', 'st.display.research_escalation.desc': 'When enabled, WebBrain may ask before sending an unusually complex read-only research prompt to ChatGPT. Off by default. The exact prompt is shared only after your explicit approval.', @@ -502,7 +494,7 @@ export default { 'sp.step.result_label': 'Result', 'sp.api.enabled_html': '🔓 API mutations enabled for this conversation. The agent may now use POST/PUT/PATCH/DELETE via fetch_url and execute_js when it judges API to be more reliable than UI for a step. UI-first remains the default. This flag clears when you reset the conversation.', - 'sp.permissions.disabled_html': '⚠️ Permission prompts are OFF. WebBrain will click, type, navigate, run JavaScript, upload, download, record, and schedule future work without asking first. Re-enable this from Settings → Permissions → Ask before consequential actions.', + 'sp.permissions.disabled_html': '⚠️ Permission prompts are OFF. WebBrain will click, type, navigate, run JavaScript, upload, download, record, and schedule future work without asking first. Re-enable this from the ⚠ button next to the microphone.', 'sp.permissions.button': 'Permission prompts: on', 'sp.permissions.button_off': 'Permission prompts: off', 'sp.permissions.gate_desc': 'WebBrain asks the first time it clicks, types, downloads or runs code on a site.', @@ -660,7 +652,7 @@ export default { 'ob.act.warn1': 'WebBrain may capture screenshots for planning. Avoid using agent mode on sensitive pages, such as health, finance, dating, or private account portals, unless you accept that risk.', 'ob.act.warn2': 'Web content can contain malicious prompt injections designed to manipulate AI behavior.', 'ob.act.warn3': 'Always review suggested actions and stop runs that look unexpected.', - 'ob.act.permissions_tip': 'Permission prompts are on by default. Advanced users can disable them globally with /dangerously-skip-permissions and re-enable them in Settings → Permissions.', + 'ob.act.permissions_tip': 'Permission prompts are on by default. Advanced users can disable them globally with /dangerously-skip-permissions and re-enable them from the ⚠ button next to the microphone.', 'ob.tokens.title': 'Choose a model', 'ob.tokens.body': 'WebBrain needs a language model to work. We will check for local models first. If none are available, open Settings and add a provider:', 'ob.tokens.scanning': 'Checking for local models...', @@ -686,23 +678,32 @@ export default { 'ob.btn.done': 'Get Started', 'ob.btn.skip': 'Skip for now', 'ob.btn.start': 'Start', - 'ob.cloud.body': 'WebBrain Compass is ready with a free weekly allowance. Selected Compass conversations may be retained and used to improve WebBrain while Help Improve WebBrain is on by default. You can turn it off in Settings → General.', + 'ob.cloud.body': 'WebBrain Compass is ready with a free weekly allowance. Selected Compass conversations may be retained and used to improve WebBrain while Help Improve WebBrain is on by default. You can turn it off in Settings → Advanced.', 'ob.cloud.change': 'Change', 'ob.cloud.using': 'Using WebBrain Compass. ', // --- Settings ---------------------------------------------------------- 'st.title': 'WebBrain Settings', - 'st.subtitle': 'Configure your LLM providers and preferences · v{version}', + 'st.subtitle': 'Configure how WebBrain works · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Advanced', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Speech', + 'st.tab.generative': 'Generative', + 'st.tab.decision': 'Decision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain Providers', + 'st.providers_page.subtitle': 'Choose the models WebBrain uses · v{version}', + 'st.permissions_page.title': 'WebBrain Permissions', + 'st.permissions_page.subtitle': 'Sites where WebBrain may act without asking first', 'st.tab.providers': 'Providers', 'st.tab.skills': 'Skills', 'st.tab.vision': 'Vision', - 'st.tab.multimodal': "Assistive Models", 'st.tab.memory': 'Memory', 'st.tab.profile': 'Profile', 'st.tab.account': 'Account', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Permissions', 'st.perms.gate.label': 'Ask before consequential actions', 'st.perms.gate.desc': 'Recommended. When on, WebBrain asks permission the first time it clicks, types, navigates, runs JavaScript, uploads, downloads, records, or schedules future work on a site (then remembers your choice). Turn off for fast, prompt-free use on sites you fully trust.', @@ -724,8 +725,6 @@ export default { 'st.account.update_payment': 'Update payment method', 'st.account.manage_billing': 'Manage billing', - 'st.display.language.label': 'Language', - 'st.display.language.desc': 'Interface language for the WebBrain plugin.', 'st.display.theme.label': 'Appearance', 'st.display.theme.desc': 'Light, dark, or follow your OS setting.', 'st.display.theme.system': 'System', @@ -735,8 +734,8 @@ export default { 'st.display.download_directory.desc': 'Optional subfolder inside your browser or system Downloads directory. Leave blank to use the system default.', 'st.display.download_directory.placeholder': 'System default', 'st.display.download_directory.error': 'Use a relative folder such as WebBrain or Work/WebBrain. Absolute paths and “..” are not allowed.', - 'st.display.search.placeholder': 'Search General settings', - 'st.display.search.empty': 'No General settings match.', + 'st.display.search.placeholder': 'Search settings', + 'st.display.search.empty': 'No settings match.', 'st.display.advanced': 'Advanced', ...apocalypseModeCopy, ...emergencyCopy, @@ -793,20 +792,18 @@ export default { 'st.display.auto_screenshot.label': 'Auto-screenshot', "st.display.auto_screenshot.desc": "Automatically capture a viewport screenshot after the agent acts on the page, so the selected vision route can see what changed. Costs more tokens. If vision is unavailable, enrichment is skipped and the task continues with a status notice.", 'st.display.auto_screenshot.off': 'Off', - 'st.display.auto_screenshot.navigation': 'On navigation', - 'st.display.auto_screenshot.state_change': 'On state change (default)', + 'st.display.auto_screenshot.navigation': 'On navigation (default)', + 'st.display.auto_screenshot.state_change': 'On state change', 'st.display.auto_screenshot.every_step': 'Every step', 'st.display.tracing.label': 'Record traces (for model comparison)', - 'st.display.tracing.desc_html': 'Persist every run (LLM requests, responses, tool calls, screenshots) into local IndexedDB so you can inspect and compare models side-by-side. Opens in a separate Traces tab. Off by default because it adds disk writes per step. Open Traces page →', - 'st.display.lossless_tracing.label': 'Record full request details (debug tier)', - 'st.display.lossless_tracing.desc_html': 'Also persist the full prompts, messages, and tool schemas of each LLM request instead of content-free summaries, and keep up to 200 KB of each tool result. Enables deep debugging and request reconstruction. Off by default because it writes your conversation content locally and uses much more disk. Requires Record traces to be on.', + 'st.display.tracing.desc_html': 'Persist every run (LLM requests, responses, tool calls, screenshots) into local IndexedDB so you can inspect and compare models side-by-side, including the full prompts, messages and tool schemas of each LLM request and up to 200 KB of each tool result. Opens in a separate Traces tab. Off by default because it writes your conversation content locally and uses much more disk. Open Traces page →', 'st.display.cost_session_limit.label': 'Cloud cost session allowance', 'st.display.cost_session_limit.desc': 'Stops eligible cloud and router runs before another paid model call once this session reaches the reported or estimated cost allowance. Default $10.', 'st.display.cost_total_limit.label': 'Cloud cost total allowance', 'st.display.cost_total_limit.desc': 'Tracks reported or estimated spend for eligible cloud and router model calls across the extension and stops further paid calls at the allowance.', 'st.display.cost_reset': 'Reset spend', 'st.display.strict_secret.label': 'Strict secret handling', - 'st.display.strict_secret.desc': 'Refuse to quote credentials (passwords, API keys, tokens, OTPs) in summaries or assistant text — even when you explicitly ask for them. Useful if you regularly share trace files or screen-share. Off by default so the agent can echo the exact value you ask for when you need it. Turn it on (Settings → Security) when you want `done` summaries kept tidy and credentials never repeated.', + 'st.display.strict_secret.desc': 'Refuse to quote credentials (passwords, API keys, tokens, OTPs) in summaries or assistant text — even when you explicitly ask for them. Useful if you regularly share trace files or screen-share. Off by default so the agent can echo the exact value you ask for when you need it. Turn it on when you want `done` summaries kept tidy and credentials never repeated.', 'st.display.allow_local_network.label': 'Allow agent to access local network', 'st.display.allow_local_network.desc': 'Lets the agent\'s fetch_url tool reach loopback (127.0.0.1, localhost) and private/RFC1918 addresses (10.x, 192.168.x, 172.16–31.x). Useful for local dev servers, intranet tools, or self-hosted APIs. Off by default. When off, URLs written with private or loopback IP literals and localhost names are blocked. DNS resolution is not checked, so other hostnames may still reach local addresses. Cloud-metadata IP literals (169.254.169.254) and listed metadata or *.internal/*.local hostnames stay blocked even when on.', 'st.display.scheduled_tasks.label': 'Scheduled tasks', @@ -896,7 +893,7 @@ export default { 'st.providers.compat.value.max': 'Max', 'st.providers.compat.value.system': 'System', 'st.providers.compat.value.developer': 'Developer', - 'st.providers.webbrain_data_use.body': 'Free weekly WebBrain Compass usage is included. While Help Improve WebBrain is on by default, selected Compass conversations may be retained and used for evaluation, improvement, fine-tuning, and training. Turn it off in General → Advanced to exclude future Compass interactions from those uses. Local-model and bring-your-own API requests are only collected by WebBrain when you turn on the per-provider “Share queries for research” option. {privacyLink}. For more usage, subscribe at {subscribeLink}. Manage billing at {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Free weekly WebBrain Compass usage is included. While Help Improve WebBrain is on by default, selected Compass conversations may be retained and used for evaluation, improvement, fine-tuning, and training. Turn it off in Settings → Advanced to exclude future Compass interactions from those uses. Local-model and bring-your-own API requests are only collected by WebBrain when you turn on the per-provider “Share queries for research” option. {privacyLink}. For more usage, subscribe at {subscribeLink}. Manage billing at {accountLink}.', 'st.providers.share_research.label': 'Share queries for research', 'st.providers.share_research.hint': 'Send bounded prompts, responses, tool interactions, and diagnostic trace metadata (steps, tool names, statuses, errors, and timings) from this provider to WebBrain for evaluation and improvement. Images and binary attachments are stripped; text is truncated before sharing.', 'st.providers.share_research.confirm': 'Share queries and diagnostic traces from this provider with WebBrain for research?\n\nWhen on, your prompts, responses, tool interactions, and bounded diagnostic trace metadata—including failed runs, tool names, statuses, errors, and timings—will be sent to WebBrain with the provider and model name. Screenshots and binary attachments are not uploaded. Other text is sent as-is after truncation, so avoid sharing sensitive personal data. You can turn this off at any time to stop future sharing.', @@ -1017,7 +1014,7 @@ export default { 'st.transcription.failed': 'Failed: {error}', 'st.transcription.fill_required': 'Fill in Base URL and Model first.', - // Generative Media — Assistive Models section + // Generative Media — Providers page, Generative tab 'st.imagegen.heading': "Generative Media", 'st.imagegen.desc': "Used by the generate_image agent tool to create images and other media from a text prompt with the selected provider.", 'st.imagegen.saved': 'Saved!', @@ -1044,7 +1041,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': 'Screenshot redaction', 'st.redaction.toggle.label': 'Redact sensitive content from screenshots', 'st.redaction.toggle.desc': 'Before a screenshot is sent to a vision model, blur form fields and text that looks like an email or phone number. Detection runs entirely on your device — nothing extra is transmitted.', 'st.redaction.warning': '⚠️ Best-effort and fail-open: if redaction cannot run on a page (for example right after a navigation, on PDF viewers, or on restricted browser pages), the screenshot is still sent unredacted. Detection uses DOM heuristics only — canvas-drawn text, PII inside images, or anything not recognized as a form field or email/phone text may slip through, and page text sent to the model is not redacted by this setting. It is NOT a security guarantee. For full privacy, use a local/offline model (llama.cpp, Ollama): screenshots then never leave your machine and redaction is unnecessary.', @@ -1232,7 +1228,7 @@ export default { "sp.slash.export_traces_full": "Export the complete stored trace session as JSON, including screenshots", "sp.export_traces.recording_truncated": "JSON exported with all stored records. Some content was omitted during recording and cannot be recovered by export.", "sp.slash.export_traces": "Export the tool chain (traces)", - "sp.export_traces.none": "No traces for this conversation. Enable Record traces in Settings, then run again.", + "sp.export_traces.none": "No traces for this conversation. Enable Record traces in Settings → Advanced, then run again.", "sp.export_traces.error": "Couldn't export traces.", "sp.export_traces.done": "Tool chain exported.", "sp.export_traces.no_conversation": "Nothing to export yet — start a conversation first.", @@ -1306,5 +1302,5 @@ export default { 'st.sync.confirm.reset': 'Replace the encrypted cloud copy with this device’s current WebBrain setup?', 'st.sync.consent.legacy': 'Turn on encrypted sync? WebBrain will transmit an end-to-end encrypted copy of your memories, profile autofill, and API-key provider settings to WebBrain Compass. Chat history and OAuth sign-ins are not synced.', 'st.sync.consent.denied': 'Encrypted sync permission was not granted.', - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', }; diff --git a/src/firefox/src/ui/locales/es.js b/src/firefox/src/ui/locales/es.js index 1205d0847b..bd680e708f 100644 --- a/src/firefox/src/ui/locales/es.js +++ b/src/firefox/src/ui/locales/es.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Reducir el zoom de la interfaz', 'sp.ui_scale.increase': 'Aumentar el zoom de la interfaz', 'sp.ui_scale.reset': 'Restablecer', - 'st.display.ui_scale.label': 'Zoom de la interfaz de la extensión', - 'st.display.ui_scale.decrease': 'Reducir el zoom de la interfaz', - 'st.display.ui_scale.increase': 'Aumentar el zoom de la interfaz', - 'st.display.ui_scale.reset': 'Restablecer', - 'st.display.ui_scale.desc': 'Cambia el tamaño del panel lateral y de la ventana de chat independiente sin cambiar el zoom de la página.', - 'st.display.ui_scale.shortcuts': 'Atajos exclusivos: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Sin asignar', - 'st.display.ui_scale.manage_shortcuts': 'Personalizar atajos', 'tool.delegate_research': 'Investigando con ChatGPT', 'st.display.research_escalation.label': 'Escalado de investigación', 'st.display.research_escalation.desc': 'Cuando está activado, WebBrain puede pedir permiso antes de enviar a ChatGPT una solicitud de investigación de solo lectura inusualmente compleja. Desactivado de forma predeterminada. La solicitud exacta solo se comparte tras tu aprobación explícita.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "No continuar", "sp.recipient.reason_unrequested": "WebBrain no pudo deducir de tu solicitud que deba enviarse un mensaje. La conversación abierta en {host} es con {recipient}.", "sp.recipient.reason_unnamed": "WebBrain no pudo deducir de tu solicitud quién debe recibir este mensaje. La conversación abierta en {host} es con {recipient}.", - 'st.tab.permissions': "Permisos", 'st.perms.revoke': "Revocar", 'st.perms.clear_all': "Borrar todos los permisos", 'st.perms.gate.label': "Preguntar antes de acciones importantes", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Empezar', 'ob.btn.skip': 'Omitir por ahora', 'ob.btn.start': 'Iniciar', - 'ob.cloud.body': 'WebBrain Compass está listo con una asignación semanal gratuita. Las conversaciones de Compass seleccionadas pueden conservarse y utilizarse para mejorar WebBrain mientras Ayuda a mejorar WebBrain está activado de forma predeterminada. Puedes desactivarlo en Configuración → General.', + 'ob.cloud.body': 'WebBrain Compass está listo con una asignación semanal gratuita. Las conversaciones de Compass seleccionadas pueden conservarse y utilizarse para mejorar WebBrain mientras Ayuda a mejorar WebBrain está activado de forma predeterminada. Puedes desactivarlo en Configuración → Avanzado.', 'ob.cloud.change': 'Cambiar', 'ob.cloud.using': 'Usando WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Resultado', 'sp.api.enabled_html': '🔓 Mutaciones de API habilitadas en esta conversación. El agente ahora puede usar POST/PUT/PATCH/DELETE mediante fetch_url y execute_js cuando considere que la API es más fiable que la interfaz para un paso. La interfaz sigue siendo la opción por defecto. Este indicador se desactiva al reiniciar la conversación.', - 'sp.permissions.disabled_html': '⚠️ Las solicitudes de permiso están DESACTIVADAS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará, grabará y programará trabajos futuros sin preguntar primero. Reactiva esto desde Ajustes → Permisos → Preguntar antes de acciones consecuentes.', + 'sp.permissions.disabled_html': '⚠️ Las solicitudes de permiso están DESACTIVADAS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará, grabará y programará trabajos futuros sin preguntar primero. Reactiva esto desde el botón ⚠ junto al micrófono.', 'sp.permissions.button': 'Solicitudes de permiso: activadas', 'sp.permissions.button_off': 'Solicitudes de permiso: desactivadas', 'sp.permissions.gate_desc': 'WebBrain pregunta la primera vez que hace clic, escribe, descarga o ejecuta código en un sitio.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Esperando «{selector}»', 'st.title': 'Ajustes de WebBrain', - 'st.subtitle': 'Configura tus proveedores de LLM y preferencias · v{version}', + 'st.subtitle': 'Configura cómo funciona WebBrain · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Presupuestos', + 'st.tab.advanced': 'Avanzado', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Voz', + 'st.tab.generative': 'Generativo', + 'st.tab.decision': 'Decisión', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Proveedores de WebBrain', + 'st.providers_page.subtitle': 'Elige los modelos que usa WebBrain · v{version}', + 'st.permissions_page.title': 'Permisos de WebBrain', + 'st.permissions_page.subtitle': 'Sitios donde WebBrain puede actuar sin preguntar antes', 'st.tab.providers': 'Proveedores', 'st.tab.vision': 'Visión', 'st.tab.profile': 'Perfil', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Actualizar método de pago", 'st.account.manage_billing': 'Gestionar facturación', - 'st.display.language.label': 'Idioma', - 'st.display.language.desc': 'Idioma de la interfaz del plugin WebBrain.', 'st.display.verbose.label': 'Modo detallado', 'st.display.verbose.desc': 'Muestra todos los detalles de las llamadas a herramientas, argumentos y resultados JSON sin procesar. Desactivado por defecto para una experiencia de chat más limpia.', 'st.display.selection_shortcut.label': 'Acceso directo de selección', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Captura automática', "st.display.auto_screenshot.desc": "Captura automáticamente una imagen de la ventana después de que el agente actúe en la página, para que la ruta de visión seleccionada vea qué cambió. Consume más tokens. Si la visión no está disponible, se omite el enriquecimiento y la tarea continúa con un aviso de estado.", 'st.display.auto_screenshot.off': 'Desactivada', - 'st.display.auto_screenshot.navigation': 'Al navegar', - 'st.display.auto_screenshot.state_change': 'Al cambiar de estado (por defecto)', + 'st.display.auto_screenshot.navigation': 'Al navegar (por defecto)', + 'st.display.auto_screenshot.state_change': 'Al cambiar de estado', 'st.display.auto_screenshot.every_step': 'En cada paso', 'st.display.tracing.label': 'Registrar trazas (para comparar modelos)', - 'st.display.tracing.desc_html': 'Guarda cada ejecución (peticiones al LLM, respuestas, llamadas a herramientas, capturas) en IndexedDB local para que puedas inspeccionar y comparar modelos lado a lado. Se abre en una pestaña de Trazas aparte. Desactivado por defecto porque añade escrituras en disco por paso. Abrir página de Trazas →', - 'st.display.lossless_tracing.label': 'Grabar detalles completos de la solicitud (nivel de depuración)', - 'st.display.lossless_tracing.desc_html': 'También guarda los prompts, mensajes y esquemas de herramientas completos de cada solicitud LLM en lugar de resúmenes sin contenido, y conserva hasta 200 KB de cada resultado de herramienta. Permite depuración profunda y reconstrucción de solicitudes. Desactivado por defecto porque escribe el contenido de tu conversación localmente y usa mucho más disco. Requiere que Grabar trazas esté activado.', + 'st.display.tracing.desc_html': 'Guarda cada ejecución (peticiones al LLM, respuestas, llamadas a herramientas, capturas) en IndexedDB local para que puedas inspeccionar y comparar modelos lado a lado, incluidos los prompts, mensajes y esquemas de herramientas completos de cada solicitud LLM y hasta 200 KB de cada resultado de herramienta. Se abre en una pestaña de Trazas aparte. Desactivado por defecto porque escribe el contenido de tu conversación localmente y usa mucho más disco. Abrir página de Trazas →', 'st.display.allow_local_network.label': 'Permitir al agente acceder a la red local', 'st.display.allow_local_network.desc': 'Permite que la herramienta fetch_url del agente alcance direcciones loopback (127.0.0.1, localhost) y privadas/RFC1918 (10.x, 192.168.x, 172.16–31.x). Útil para servidores de desarrollo locales, herramientas de intranet o APIs auto-alojadas. Desactivado por defecto. Al desactivarlo, se bloquean las URL escritas con IP privadas o de loopback y nombres localhost. No se comprueba la resolución DNS, por lo que otros nombres de host pueden alcanzar direcciones locales. Las IP literales de metadatos de la nube (169.254.169.254) y los nombres de metadatos incluidos en la lista o *.internal/*.local siguen bloqueados incluso al activarlo.', 'st.display.notify_sound.label': "Sonidos de notificación", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Modo de visión activado para el proveedor activo.", "sp.vision.off": "Modo de visión desactivado para el proveedor activo.", "sp.vision.error": "Falló el cambio del modo de visión: {msg}", - "st.tab.multimodal": "Modelos auxiliares", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Recomendado. Cuando está activado, WebBrain pide permiso la primera vez que hace clic, escribe, navega, ejecuta JavaScript, sube, descarga o graba en un sitio (y luego recuerda tu elección). Desactívalo para un uso rápido y sin avisos en sitios en los que confías plenamente.", "st.perms.gate.warning": "⚠️ Los avisos de permiso están DESACTIVADOS. WebBrain hará clic, escribirá, navegará, ejecutará JavaScript, subirá, descargará y grabará en cualquier sitio SIN preguntar, incluso en páginas cuyo contenido pueda estar controlado por un atacante. El contenido de la página se sigue tratando como no fiable internamente, pero nada impedirá que una instrucción inyectada desencadene una acción. Deja esto desactivado solo si confías plenamente en todos los sitios donde usas el asistente.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Predeterminado del sistema", "st.display.download_directory.error": "Usa una carpeta relativa como WebBrain o Work/WebBrain. No se permiten rutas absolutas ni “..”.", "st.display.strict_secret.label": "Manejo estricto de secretos", - "st.display.strict_secret.desc": "Se niega a citar credenciales (contraseñas, claves de API, tokens, OTPs) en resúmenes o texto del asistente, incluso cuando se las pidas explícitamente. Útil si compartes a menudo archivos de traza o tu pantalla. Desactivado por defecto para que el agente pueda repetir el valor exacto que pidas cuando lo necesites. Actívalo (Ajustes → Seguridad) cuando quieras mantener limpios los resúmenes de `done` y que las credenciales nunca se repitan.", + "st.display.strict_secret.desc": "Se niega a citar credenciales (contraseñas, claves de API, tokens, OTPs) en resúmenes o texto del asistente, incluso cuando se las pidas explícitamente. Útil si compartes a menudo archivos de traza o tu pantalla. Desactivado por defecto para que el agente pueda repetir el valor exacto que pidas cuando lo necesites. Actívalo cuando quieras mantener limpios los resúmenes de `done` y que las credenciales nunca se repitan.", "st.display.request_timeout.label": "Tiempo de espera de la petición al LLM", "st.display.request_timeout.desc": "Tiempo máximo de espera para recibir las cabeceras y para cada pausa entre fragmentos de la respuesta en streaming. Por defecto: 120 s. Auméntalo para modelos locales lentos, especialmente en CPU o con contextos grandes.", "st.providers.filter.all": "Todos", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Los mensajes se ponen en cola mientras WebBrain está ocupado. Solo /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces y /verbose pueden ejecutarse de inmediato como comandos slash.', 'tool.go_back': 'Volviendo atrás', 'tool.go_forward': 'Avanzando', - 'st.display.search.placeholder': 'Buscar en ajustes generales', - 'st.display.search.empty': 'No hay ajustes generales que coincidan.', + 'st.display.search.placeholder': 'Buscar en ajustes', + 'st.display.search.empty': 'No hay ajustes que coincidan.', 'st.display.advanced': 'Avanzado', ...getApocalypseModeCopy('es'), ...getEmergencyBoxCopy('es'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Lado mayor (ancho o alto) en píxeles de cualquier captura enviada a visión. Un tope más bajo reduce las imágenes antes de enviarlas, cortando tokens y coste. Un tope más alto mantiene la fidelidad.", "st.imageBudget.warning": "⚠️ Estos ajustes se aplican a capturas para visión (auto-captura, /screenshot, página completa, verify_form). Las imágenes guardadas manualmente a resolución completa no se ven afectadas. «Image detail» lo respetan endpoints estilo OpenAI; otros proveedores pueden ignorarlo.", - "st.redaction.heading": "Redacción de capturas de pantalla", "st.redaction.toggle.label": "Redactar contenido sensible en las capturas de pantalla", "st.redaction.toggle.desc": "Antes de enviar una captura de pantalla a un modelo de visión, difumina los campos de formulario y el texto que parezca un correo electrónico o un número de teléfono. La detección se ejecuta enteramente en tu dispositivo — no se transmite nada adicional.", "st.redaction.warning": "⚠️ Es una redacción best-effort y fail-open: si no se puede aplicar en una página (por ejemplo justo después de una navegación, en visores de PDF o en páginas restringidas del navegador), la captura se envía igualmente sin redactar. La detección usa solo heurísticas del DOM — texto dibujado en un canvas, datos personales dentro de imágenes, o cualquier cosa no reconocida como campo de formulario o texto de correo/teléfono puede pasar desapercibida, y el texto de la página enviado al modelo no se redacta con este ajuste. No es una garantía de seguridad. Para privacidad total, usa un modelo local/sin conexión (llama.cpp, Ollama): las capturas nunca saldrán de tu equipo y la redacción deja de ser necesaria.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Exportar toda la sesión de trazas guardada como JSON, incluidas las capturas", "sp.export_traces.recording_truncated": "Se exportaron todos los registros guardados como JSON. El contenido omitido durante la grabación no puede recuperarse mediante la exportación.", "sp.slash.export_traces": "Exportar la cadena de herramientas (trazas)", - "sp.export_traces.none": "No hay trazas para esta conversación. Activa «Registrar trazas» en Ajustes y vuelve a ejecutar.", + "sp.export_traces.none": "No hay trazas para esta conversación. Activa «Registrar trazas» en Ajustes → Avanzado y vuelve a ejecutar.", "sp.export_traces.error": "No se pudieron exportar las trazas.", "sp.export_traces.done": "Cadena de herramientas exportada.", "sp.export_traces.no_conversation": "Aún no hay nada que exportar: inicia una conversación primero.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Cadena de herramientas exportada. Puede faltar turnos antiguos si esta conversación tiene muchas trazas.", "st.display.help_improve.label": "Ayuda a mejorar WebBrain", "st.display.help_improve.desc_html": "Permite conservar determinadas interacciones de WebBrain Compass y utilizarlas para evaluación, mejora, ajuste fino y entrenamiento. Activado de forma predeterminada. Desactívalo para impedir que futuras interacciones de Compass se utilicen con esos fines. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API de los proveedores donde actives «Compartir consultas para investigación». Política de privacidad →", - "st.providers.webbrain_data_use.body": "Se incluye uso diario gratuito de WebBrain Compass. Mientras Ayuda a mejorar WebBrain está activado de forma predeterminada, algunas conversaciones de Compass pueden conservarse y utilizarse para evaluación, mejora, ajuste fino y entrenamiento. Desactívalo en General → Avanzado para excluir futuras interacciones de Compass de esos usos. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API cuando activas la opción «Compartir consultas para investigación» de ese proveedor. {privacyLink}. Para obtener más uso, suscríbete en {subscribeLink}. Gestiona la facturación en {accountLink}.", + "st.providers.webbrain_data_use.body": "Se incluye uso diario gratuito de WebBrain Compass. Mientras Ayuda a mejorar WebBrain está activado de forma predeterminada, algunas conversaciones de Compass pueden conservarse y utilizarse para evaluación, mejora, ajuste fino y entrenamiento. Desactívalo en Ajustes → Avanzado para excluir futuras interacciones de Compass de esos usos. WebBrain solo recopila las solicitudes de modelos locales y de tus propias API cuando activas la opción «Compartir consultas para investigación» de ese proveedor. {privacyLink}. Para obtener más uso, suscríbete en {subscribeLink}. Gestiona la facturación en {accountLink}.", 'st.providers.share_research.label': "Compartir consultas para investigación", 'st.providers.share_research.hint': "Envía los prompts y respuestas de este proveedor a WebBrain para evaluación y mejora, incluidos el proveedor y el modelo utilizados. Las imágenes y los adjuntos binarios se eliminan y el texto se trunca antes de compartir; el resto del texto se envía tal cual.", 'st.providers.share_research.confirm': "¿Compartir las consultas de este proveedor con WebBrain para investigación?\n\nSi se activa, tus prompts, respuestas e interacciones de herramientas con este proveedor se enviarán a WebBrain para evaluación y mejora, junto con el nombre del proveedor y del modelo. El texto se envía tal cual tras eliminar imágenes y truncar contenidos largos, así que evita compartir datos personales sensibles. Puedes desactivarlo en cualquier momento para detener el intercambio.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "¿Quieres menos interrupciones? «Permitir siempre» recuerda este sitio. El comando de abajo desactiva los avisos de permisos de WebBrain en todos los sitios.", "sp.perm.insert_skip_command": "Insertar /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Tu borrador no ha cambiado. Bórralo antes de insertar el comando.", - "ob.act.permissions_tip": "Los avisos de permisos están activados de forma predeterminada. Los usuarios avanzados pueden desactivarlos globalmente con /dangerously-skip-permissions y volver a activarlos en Configuración → Permisos.", + "ob.act.permissions_tip": "Los avisos de permisos están activados de forma predeterminada. Los usuarios avanzados pueden desactivarlos globalmente con /dangerously-skip-permissions y volver a activarlos desde el botón ⚠ junto al micrófono.", 'st.provider.field.cache_read_cost_per_million': "Coste estimado de lectura de caché ($ / 1M tokens)", 'st.provider.field.cache_write_cost_per_million': "Coste estimado de escritura en caché de 5 min ($ / 1M tokens)", 'st.provider.field.cache_write_1h_cost_per_million': "Coste estimado de escritura en caché de 1 h ($ / 1M tokens)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "¿Reemplazar la copia cifrada en la nube con la configuración actual de WebBrain de este dispositivo?", "st.sync.consent.legacy": "¿Activar sincronización cifrada? WebBrain transmitirá una copia cifrada de extremo a extremo de sus recuerdos, el autocompletado de perfiles y la configuración del proveedor de claves API a WebBrain Compass. El historial de chat y los inicios de sesión de OAuth no están sincronizados.", "st.sync.consent.denied": "No se concedió el permiso de sincronización cifrada.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "La página cambió mientras se ejecutaba la tarea ({before} → {after}). La tarea continúa.", 'sp.activity.generating_answer': "Generando respuesta…", 'sp.activity.retrying_response': "Reintentando respuesta…", diff --git a/src/firefox/src/ui/locales/fa.js b/src/firefox/src/ui/locales/fa.js index 62ab737984..4eebb97e8c 100644 --- a/src/firefox/src/ui/locales/fa.js +++ b/src/firefox/src/ui/locales/fa.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'کاهش بزرگ‌نمایی رابط افزونه', 'sp.ui_scale.increase': 'افزایش بزرگ‌نمایی رابط افزونه', 'sp.ui_scale.reset': 'بازنشانی', - 'st.display.ui_scale.label': 'بزرگ‌نمایی رابط کاربری افزونه', - 'st.display.ui_scale.decrease': 'کاهش بزرگ‌نمایی رابط افزونه', - 'st.display.ui_scale.increase': 'افزایش بزرگ‌نمایی رابط افزونه', - 'st.display.ui_scale.reset': 'بازنشانی', - 'st.display.ui_scale.desc': 'اندازهٔ پنل کناری و پنجرهٔ گفت‌وگوی جداگانه را بدون تغییر بزرگ‌نمایی صفحه تغییر دهید.', - 'st.display.ui_scale.shortcuts': 'میانبرهای اختصاصی: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'تنظیم نشده', - 'st.display.ui_scale.manage_shortcuts': 'سفارشی‌سازی میانبرها', 'tool.delegate_research': 'در حال پژوهش با ChatGPT', 'st.display.research_escalation.label': 'ارتقای پژوهش', 'st.display.research_escalation.desc': 'در صورت فعال بودن، WebBrain ممکن است پیش از ارسال یک درخواست پژوهشی فقط‌خواندنی و بسیار پیچیده به ChatGPT اجازه بخواهد. به‌صورت پیش‌فرض خاموش است. متن دقیق فقط پس از تأیید صریح شما به اشتراک گذاشته می‌شود.', @@ -497,7 +489,7 @@ export default { 'sp.step.result_label': "نتیجه", 'sp.api.enabled_html': "🔓 جهش های API فعال شد برای این گفتگو عامل اکنون ممکن است از POST/PUT/PATCH/DELETE از طریق fetch_url و execute_js استفاده کند، زمانی که تشخیص دهد API برای یک مرحله قابل اعتمادتر از UI است. UI-first پیش فرض باقی می ماند. وقتی مکالمه را بازنشانی می کنید، این پرچم پاک می شود.", - 'sp.permissions.disabled_html': "⚠️ درخواست‌های مجوز خاموش هستند. WebBrain کلیک می کند، تایپ می کند، پیمایش می کند، جاوا اسکریپت را اجرا می کند، آپلود می کند، دانلود می کند، ضبط می کند و کارهای آینده را بدون درخواست اولیه برنامه ریزی می کند. این را از تنظیمات → مجوزها → قبل از اقدامات بعدی بپرسید دوباره فعال کنید.", + 'sp.permissions.disabled_html': "⚠️ درخواست‌های مجوز خاموش هستند. WebBrain کلیک می کند، تایپ می کند، پیمایش می کند، جاوا اسکریپت را اجرا می کند، آپلود می کند، دانلود می کند، ضبط می کند و کارهای آینده را بدون درخواست اولیه برنامه ریزی می کند. این را از دکمهٔ ⚠ کنار میکروفون دوباره فعال کنید.", 'sp.permissions.button': 'درخواست‌های مجوز: روشن', 'sp.permissions.button_off': 'درخواست‌های مجوز: خاموش', 'sp.permissions.gate_desc': 'WebBrain اولین باری که در یک سایت کلیک می‌کند، تایپ می‌کند، فایلی دانلود می‌کند یا کدی اجرا می‌کند، اجازه می‌گیرد.', @@ -655,7 +647,7 @@ export default { 'ob.act.warn1': "WebBrain ممکن است برای برنامه ریزی اسکرین شات بگیرد. از استفاده از حالت نماینده در صفحات حساس مانند سلامت، امور مالی، دوستیابی یا پورتال های حساب خصوصی خودداری کنید، مگر اینکه این خطر را بپذیرید.", 'ob.act.warn2': "محتوای وب می‌تواند حاوی تزریق‌های بدافزار باشد که برای دستکاری رفتار هوش مصنوعی طراحی شده‌اند.", 'ob.act.warn3': "همیشه اقدامات پیشنهادی را مرور کنید و اجرای غیرمنتظره‌ای را متوقف کنید.", - 'ob.act.permissions_tip': "درخواست های مجوز به طور پیش فرض روشن هستند. کاربران پیشرفته می توانند با /dangerously-skip-permissions آنها را به صورت جهانی غیرفعال کنند و در تنظیمات → مجوزها مجدداً آنها را فعال کنند.", + 'ob.act.permissions_tip': "درخواست های مجوز به طور پیش فرض روشن هستند. کاربران پیشرفته می توانند با /dangerously-skip-permissions آنها را به صورت جهانی غیرفعال کنند و از دکمهٔ ⚠ کنار میکروفون دوباره آن‌ها را فعال کنند.", 'ob.tokens.title': "یک مدل انتخاب کنید", 'ob.tokens.body': "WebBrain برای کار کردن به یک مدل زبان نیاز دارد. ابتدا مدل های محلی را بررسی می کنیم. اگر هیچ یک در دسترس نیست، تنظیمات را باز کنید و یک ارائه دهنده اضافه کنید:", 'ob.tokens.scanning': "بررسی مدل های محلی...", @@ -681,23 +673,32 @@ export default { 'ob.btn.done': "شروع کنید", 'ob.btn.skip': "فعلا رد شوید", 'ob.btn.start': 'شروع', - 'ob.cloud.body': 'WebBrain Compass با یک بدله هفتگی رایگان آماده است. مکالمات Compass انتخابی ممکن است حفظ شوند و برای بهبود WebBrain استفاده شوند در حالی که Help Improve WebBrain به طور پیش فرض روشن است. شما می توانید آن را در Settings → General خاموش کنید.', + 'ob.cloud.body': 'WebBrain Compass با یک بدله هفتگی رایگان آماده است. مکالمات Compass انتخابی ممکن است حفظ شوند و برای بهبود WebBrain استفاده شوند در حالی که Help Improve WebBrain به طور پیش فرض روشن است. شما می توانید آن را در Settings → Advanced خاموش کنید.', 'ob.cloud.change': 'تغییر', 'ob.cloud.using': 'استفاده از WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "تنظیمات WebBrain", - 'st.subtitle': "ارائه دهندگان و تنظیمات برگزیده LLM خود را پیکربندی کنید · v{version}", + 'st.subtitle': "نحوهٔ کار WebBrain را پیکربندی کنید · v{version}", 'st.tab.display': "ژنرال", + 'st.tab.budgets': 'بودجه‌ها', + 'st.tab.advanced': 'پیشرفته', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'گفتار', + 'st.tab.generative': 'مولد', + 'st.tab.decision': 'تصمیم', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'ارائه‌دهندگان WebBrain', + 'st.providers_page.subtitle': 'مدل‌هایی را که WebBrain استفاده می‌کند انتخاب کنید · v{version}', + 'st.permissions_page.title': 'مجوزهای WebBrain', + 'st.permissions_page.subtitle': 'سایت‌هایی که WebBrain می‌تواند بدون پرسیدن در آن‌ها عمل کند', 'st.tab.providers': "ارائه دهندگان", 'st.tab.skills': "مهارت ها", 'st.tab.vision': "چشم انداز", - 'st.tab.multimodal': "مدل‌های کمکی", 'st.tab.memory': "حافظه", 'st.tab.profile': "نمایه", 'st.tab.account': "حساب", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "مجوزها", 'st.perms.gate.label': "قبل از اقدامات بعدی بپرسید", 'st.perms.gate.desc': "توصیه می شود. وقتی روشن است، WebBrain اولین باری که کلیک می‌کند، تایپ می‌کند، پیمایش می‌کند، جاوا اسکریپت را اجرا می‌کند، آپلود می‌کند، دانلود می‌کند، ضبط می‌کند، یا زمان‌بندی کار آینده در یک سایت را می‌گیرد (سپس انتخاب شما را به خاطر می‌آورد). برای استفاده سریع و بی‌سرعت در سایت‌هایی که کاملاً به آن‌ها اعتماد دارید خاموش کنید.", @@ -719,8 +720,6 @@ export default { "st.account.update_payment": "به‌روزرسانی روش پرداخت", 'st.account.manage_billing': "مدیریت صورتحساب", - 'st.display.language.label': "زبان", - 'st.display.language.desc': "زبان رابط برای افزونه WebBrain.", 'st.display.theme.label': "ظاهر", 'st.display.theme.desc': "روشن، تاریک، یا تنظیمات سیستم عامل خود را دنبال کنید.", 'st.display.theme.system': "سیستم", @@ -730,8 +729,8 @@ export default { 'st.display.download_directory.desc': "زیرپوشه اختیاری در فهرست دانلودهای مرورگر یا سیستم شما. برای استفاده از پیش فرض سیستم، آن را خالی بگذارید.", 'st.display.download_directory.placeholder': "پیش فرض سیستم", 'st.display.download_directory.error': "از یک پوشه نسبی مانند WebBrain یا Work/WebBrain استفاده کنید. مسیرهای مطلق و «..» مجاز نیستند.", - 'st.display.search.placeholder': "تنظیمات عمومی را جستجو کنید", - 'st.display.search.empty': "تنظیمات عمومی مطابقت ندارد.", + 'st.display.search.placeholder': "جستجو در تنظیمات", + 'st.display.search.empty': "هیچ تنظیمی مطابقت ندارد.", 'st.display.advanced': "پیشرفته", ...getApocalypseModeCopy('fa'), ...getEmergencyBoxCopy('fa'), @@ -787,20 +786,18 @@ export default { 'st.display.auto_screenshot.label': "اسکرین شات خودکار", "st.display.auto_screenshot.desc": "پس از اقدام عامل روی صفحه، به‌طور خودکار از نمای صفحه عکس بگیرید تا مسیر بینایی انتخاب‌شده تغییرات را ببیند. این کار توکن بیشتری مصرف می‌کند. اگر بینایی در دسترس نباشد، غنی‌سازی رد می‌شود و کار با یک اعلان وضعیت ادامه می‌یابد.", 'st.display.auto_screenshot.off': "خاموش", - 'st.display.auto_screenshot.navigation': "در ناوبری", - 'st.display.auto_screenshot.state_change': "در تغییر وضعیت (پیش‌فرض)", + 'st.display.auto_screenshot.navigation': "در ناوبری (پیش‌فرض)", + 'st.display.auto_screenshot.state_change': "در تغییر وضعیت", 'st.display.auto_screenshot.every_step': "هر قدم", 'st.display.tracing.label': "ثبت ردیابی (برای مقایسه مدل)", - 'st.display.tracing.desc_html': "هر اجرا (درخواست‌های LLM، پاسخ‌ها، تماس‌های ابزار، تصاویر صفحه) را در IndexedDB محلی ادامه دهید تا بتوانید مدل‌ها را در کنار یکدیگر بررسی و مقایسه کنید. در یک برگه Traces جداگانه باز می شود. به‌طور پیش‌فرض خاموش است زیرا نوشته‌های دیسک را در هر مرحله اضافه می‌کند. باز کردن صفحه Traces →", - 'st.display.lossless_tracing.label': 'ثبت جزئیات کامل درخواست (لایه اشکالزدایی)', - 'st.display.lossless_tracing.desc_html': 'همچنین پرامپتها، پیامها و ساختار ابزارهای کامل هر درخواست LLM را بهجای خلاصههای بدون محتوا ذخیره میکند و تا ۲۰۰ کیلوبایت از هر نتیجه ابزار را نگه میدارد. اشکالزدایی عمیق و بازسازی درخواست را ممکن میسازد. بهصورت پیشفرض خاموش است زیرا محتوای گفتوگوی شما را محلی مینویسد و فضای دیسک بسیار بیشتری مصرف میکند. نیازمند فعال بودن ضبط ردگیری است.', + 'st.display.tracing.desc_html': "هر اجرا (درخواست‌های LLM، پاسخ‌ها، فراخوانی‌های ابزار، تصاویر صفحه) را در IndexedDB محلی ذخیره کنید تا بتوانید مدل‌ها را کنار هم بررسی و مقایسه کنید، از جمله پرامپت‌ها، پیام‌ها و ساختار کامل ابزارهای هر درخواست LLM و تا ۲۰۰ کیلوبایت از هر نتیجهٔ ابزار. در یک برگهٔ Traces جداگانه باز می‌شود. به‌طور پیش‌فرض خاموش است زیرا محتوای گفت‌وگوی شما را به‌صورت محلی می‌نویسد و فضای دیسک بسیار بیشتری مصرف می‌کند. باز کردن صفحه Traces →", 'st.display.cost_session_limit.label': "کمک هزینه جلسه هزینه ابر", 'st.display.cost_session_limit.desc': "هنگامی که این جلسه به میزان هزینه گزارش شده یا تخمین زده شده رسید، ابر را متوقف می کند و OpenRouter قبل از تماس مدل پولی دیگر اجرا می شود. پیش فرض 10 دلار.", 'st.display.cost_total_limit.label': "هزینه کل کمک هزینه", 'st.display.cost_total_limit.desc': "هزینه‌های گزارش‌شده یا تخمینی مدل ابر/OpenRouter را در سراسر برنامه افزودنی ردیابی می‌کند و تماس‌های پولی بیشتر را با کمک هزینه متوقف می‌کند. ارائه دهندگان محلی به حساب نمی آیند.", 'st.display.cost_reset': "بازنشانی هزینه", 'st.display.strict_secret.label': "برخورد محرمانه دقیق", - 'st.display.strict_secret.desc': "از نقل قول اعتبارنامه ها (گذرواژه، کلیدهای API، نشانه ها، OTPها) در خلاصه ها یا متن دستیار خودداری کنید - حتی زمانی که صریحاً آنها را درخواست می کنید. اگر به طور منظم فایل های ردیابی یا اشتراک گذاری صفحه را به اشتراک می گذارید مفید است. به‌طور پیش‌فرض خاموش است تا نماینده بتواند در صورت نیاز مقدار دقیقی را که درخواست می‌کنید بازگو کند. وقتی می‌خواهید خلاصه‌های `done` مرتب بمانند و اعتبارنامه‌ها هرگز تکرار نشوند، آن را روشن کنید (تنظیمات ← امنیت).", + 'st.display.strict_secret.desc': "از نقل قول اعتبارنامه ها (گذرواژه، کلیدهای API، نشانه ها، OTPها) در خلاصه ها یا متن دستیار خودداری کنید - حتی زمانی که صریحاً آنها را درخواست می کنید. اگر به طور منظم فایل های ردیابی یا اشتراک گذاری صفحه را به اشتراک می گذارید مفید است. به‌طور پیش‌فرض خاموش است تا نماینده بتواند در صورت نیاز مقدار دقیقی را که درخواست می‌کنید بازگو کند. وقتی می‌خواهید خلاصه‌های `done` مرتب بمانند و اعتبارنامه‌ها هرگز تکرار نشوند، آن را روشن کنید.", 'st.display.allow_local_network.label': "به عامل اجازه دسترسی به شبکه محلی را بدهید", 'st.display.allow_local_network.desc': "به ابزار fetch_url عامل اجازه می‌دهد به آدرس‌های Loopback (127.0.0.1، localhost) و خصوصی/RFC1918 (10.x، 192.168.x، 172.16–31.x) دسترسی پیدا کند. برای سرورهای توسعه دهنده محلی، ابزارهای اینترانت یا APIهای خود میزبان مفید است. به‌طور پیش‌فرض خاموش است. وقتی خاموش است، URLهایی که در آن‌ها IP خصوصی یا Loopback به‌صورت مستقیم نوشته شده و نام‌های localhost مسدود می‌شوند. نتیجهٔ DNS بررسی نمی‌شود، پس نام‌های میزبان دیگر ممکن است به آدرس‌های محلی برسند. IPهای مستقیم ابردادهٔ ابری (169.254.169.254) و نام‌های فهرست‌شدهٔ ابرداده یا *.internal/*.local حتی در صورت روشن بودن مسدود می‌مانند.", 'st.display.scheduled_tasks.label': "وظایف برنامه ریزی شده", @@ -890,7 +887,7 @@ export default { 'st.providers.compat.value.max': "حداکثر", 'st.providers.compat.value.system': "سیستم", 'st.providers.compat.value.developer': "توسعه دهنده", - 'st.providers.webbrain_data_use.body': "استفاده روزانه رایگان از WebBrain Compass گنجانده شده است. در حالی که Help Improve WebBrain به طور پیش‌فرض روشن است، مکالمات انتخابی Compass ممکن است حفظ شوند و برای ارزیابی، بهبود، تنظیم دقیق و آموزش استفاده شوند. آن را در عمومی ← پیشرفته خاموش کنید تا تعاملات Compass آینده را از این کاربردها حذف کنید. WebBrain درخواست‌های مدل محلی و API شخصی شما را فقط زمانی جمع‌آوری می‌کند که گزینه «اشتراک‌گذاری پرسش‌ها برای پژوهش» همین ارائه‌دهنده را روشن کنید. {privacyLink}. برای استفاده بیشتر، در {subscribeLink} مشترک شوید. صورتحساب را در {accountLink} مدیریت کنید.", + 'st.providers.webbrain_data_use.body': "استفاده روزانه رایگان از WebBrain Compass گنجانده شده است. در حالی که Help Improve WebBrain به طور پیش‌فرض روشن است، مکالمات انتخابی Compass ممکن است حفظ شوند و برای ارزیابی، بهبود، تنظیم دقیق و آموزش استفاده شوند. آن را در تنظیمات ← پیشرفته خاموش کنید تا تعاملات Compass آینده را از این کاربردها حذف کنید. WebBrain درخواست‌های مدل محلی و API شخصی شما را فقط زمانی جمع‌آوری می‌کند که گزینه «اشتراک‌گذاری پرسش‌ها برای پژوهش» همین ارائه‌دهنده را روشن کنید. {privacyLink}. برای استفاده بیشتر، در {subscribeLink} مشترک شوید. صورتحساب را در {accountLink} مدیریت کنید.", 'st.providers.share_research.label': "اشتراک‌گذاری پرسش‌ها برای پژوهش", 'st.providers.share_research.hint': "اعلان‌ها و پاسخ‌های این ارائه‌دهنده را به‌همراه نام ارائه‌دهنده و مدل استفاده‌شده برای ارزیابی و بهبود به WebBrain ارسال می‌کند. تصاویر و پیوست‌های باینری پیش از اشتراک حذف و متن کوتاه می‌شود؛ متن باقی‌مانده بدون تغییر ارسال می‌شود.", 'st.providers.share_research.confirm': "پرسش‌های این ارائه‌دهنده برای پژوهش با WebBrain به اشتراک گذاشته شود؟\n\nهنگام فعال بودن، اعلان‌ها، پاسخ‌ها و تعامل‌های ابزار شما با این ارائه‌دهنده به‌همراه نام ارائه‌دهنده و مدل برای ارزیابی و بهبود به WebBrain ارسال می‌شود. متن پس از حذف تصاویر و کوتاه‌سازی محتوای طولانی بدون تغییر ارسال می‌شود، پس از اشتراک داده‌های شخصی حساس خودداری کنید. می‌توانید هر زمان آن را خاموش کنید تا اشتراک آینده متوقف شود.", @@ -1035,7 +1032,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "ویرایش اسکرین شات", 'st.redaction.toggle.label': "محتوای حساس را از روی اسکرین شات ها ویرایش کنید", 'st.redaction.toggle.desc': "قبل از ارسال اسکرین شات به مدل بینایی، فیلدها و متنی را که شبیه ایمیل یا شماره تلفن است محو کنید. تشخیص به طور کامل بر روی دستگاه شما اجرا می شود - هیچ چیز اضافی منتقل نمی شود.", 'st.redaction.warning': "⚠️ بهترین تلاش و باز کردن شکست: اگر ویرایش در یک صفحه اجرا نشود (مثلاً بلافاصله پس از پیمایش، در بینندگان PDF یا در صفحات مرورگر محدود شده)، تصویر صفحه همچنان بدون ویرایش ارسال می‌شود. تشخیص فقط از روش‌های اکتشافی DOM استفاده می‌کند - متن بوم کشیده، PII داخل تصاویر، یا هر چیزی که به‌عنوان فیلد فرم یا متن ایمیل/تلفن شناسایی نمی‌شود ممکن است از بین برود، و متن صفحه ارسال‌شده به مدل با این تنظیم ویرایش نمی‌شود. این یک تضمین امنیتی نیست. برای حفظ حریم خصوصی کامل، از یک مدل محلی/آفلاین (llama.cpp، Ollama) استفاده کنید: تصاویر صفحه‌نمایش هرگز از دستگاه خود خارج نمی‌شوند و ویرایش غیرضروری است.", @@ -1223,7 +1219,7 @@ export default { "sp.slash.export_traces_full": "صدور تمام نشست ردگیری ذخیره‌شده به صورت JSON، شامل تصاویر صفحه", "sp.export_traces.recording_truncated": "تمام رکوردهای ذخیره‌شده به صورت JSON صادر شدند. محتوای حذف‌شده هنگام ضبط با صدور قابل بازیابی نیست.", "sp.slash.export_traces": "صادرات زنجیره ابزار (ردیابی)", - "sp.export_traces.none": "هیچ اثری برای این گفتگو وجود ندارد. ضبط ردیابی را در تنظیمات فعال کنید، سپس دوباره اجرا کنید.", + "sp.export_traces.none": "هیچ اثری برای این گفتگو وجود ندارد. ضبط ردیابی را در تنظیمات ← پیشرفته فعال کنید، سپس دوباره اجرا کنید.", "sp.export_traces.error": "ردیابی صادر نشد.", "sp.export_traces.done": "زنجیره ابزار صادر شد.", "sp.export_traces.no_conversation": "هنوز چیزی برای صادرات وجود ندارد - ابتدا یک مکالمه را شروع کنید.", @@ -1297,7 +1293,7 @@ export default { "st.sync.confirm.reset": "کپی ابری رمزگذاری شده با راه‌اندازی فعلی WebBrain این دستگاه جایگزین شود؟", "st.sync.consent.legacy": "همگام سازی رمزگذاری شده روشن شود؟ WebBrain یک نسخه رمزگذاری شده سرتاسر از خاطرات، تکمیل خودکار نمایه و تنظیمات ارائه دهنده کلید API شما را به WebBrain Compass منتقل می کند. سابقه گپ و ورود به سیستم OAuth همگام سازی نمی شوند.", "st.sync.consent.denied": "مجوز همگام‌سازی رمزگذاری شده داده نشد.", - 'st.providers.webgpu_note.body': '{modelLink} بدون هیچ نقطهٔ پایانی API کاملاً در Chrome اجرا می‌شود. آن را در Settings > Providers > WebGPU یا حالت Apocalypse دانلود کنید، سپس از کنترل nuclear در standalone chat استفاده کنید.', + 'st.providers.webgpu_note.body': '{modelLink} بدون هیچ نقطهٔ پایانی API کاملاً در Chrome اجرا می‌شود. آن را در Providers > WebGPU یا حالت Apocalypse دانلود کنید، سپس از کنترل nuclear در standalone chat استفاده کنید.', 'sp.monitor.navigation': "صفحه هنگام اجرای کار تغییر کرد ({before} → {after}). کار ادامه می‌یابد.", 'sp.activity.generating_answer': "در حال تولید پاسخ…", 'sp.activity.retrying_response': "در حال تلاش دوباره برای پاسخ…", diff --git a/src/firefox/src/ui/locales/fr.js b/src/firefox/src/ui/locales/fr.js index 175a270a62..f83e4886db 100644 --- a/src/firefox/src/ui/locales/fr.js +++ b/src/firefox/src/ui/locales/fr.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Réduire le zoom de l’interface', 'sp.ui_scale.increase': 'Augmenter le zoom de l’interface', 'sp.ui_scale.reset': 'Réinitialiser', - 'st.display.ui_scale.label': 'Zoom de l’interface de l’extension', - 'st.display.ui_scale.decrease': 'Réduire le zoom de l’interface', - 'st.display.ui_scale.increase': 'Augmenter le zoom de l’interface', - 'st.display.ui_scale.reset': 'Réinitialiser', - 'st.display.ui_scale.desc': 'Redimensionne le panneau latéral et la fenêtre de chat détachée sans modifier le zoom de la page.', - 'st.display.ui_scale.shortcuts': 'Raccourcis dédiés : {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Non attribué', - 'st.display.ui_scale.manage_shortcuts': 'Personnaliser les raccourcis', 'tool.delegate_research': 'Recherche avec ChatGPT', 'st.display.research_escalation.label': 'Escalade de recherche', 'st.display.research_escalation.desc': 'Lorsque cette option est activée, WebBrain peut demander votre accord avant d’envoyer à ChatGPT une requête de recherche en lecture seule particulièrement complexe. Désactivé par défaut. La requête exacte n’est partagée qu’après votre accord explicite.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Ne pas continuer", "sp.recipient.reason_unrequested": "WebBrain n’a pas pu déduire de votre demande qu’un message doit être envoyé. La conversation ouverte sur {host} est avec {recipient}.", "sp.recipient.reason_unnamed": "WebBrain n’a pas pu déduire de votre demande qui doit recevoir ce message. La conversation ouverte sur {host} est avec {recipient}.", - 'st.tab.permissions': "Autorisations", 'st.perms.revoke': "Révoquer", 'st.perms.clear_all': "Effacer toutes les autorisations", 'st.perms.gate.label': "Demander avant les actions importantes", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Commencer', 'ob.btn.skip': 'Ignorer pour le moment', 'ob.btn.start': 'Démarrer', - 'ob.cloud.body': 'WebBrain Compass est prêt avec une allocation hebdomadairene gratuite. Les conversations Compass sélectionnées peuvent être conservées et utilisées pour améliorer WebBrain tant que Aider à améliorer WebBrain est activé par défaut. Vous pouvez le désactiver dans Paramètres → Général.', + 'ob.cloud.body': 'WebBrain Compass est prêt avec une allocation hebdomadairene gratuite. Les conversations Compass sélectionnées peuvent être conservées et utilisées pour améliorer WebBrain tant que Aider à améliorer WebBrain est activé par défaut. Vous pouvez le désactiver dans Paramètres → Avancé.', 'ob.cloud.change': 'Changer', 'ob.cloud.using': 'Utilisation de WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Résultat', 'sp.api.enabled_html': '🔓 Mutations d\'API activées pour cette conversation. L\'agent peut désormais utiliser POST/PUT/PATCH/DELETE via fetch_url et execute_js quand il juge l\'API plus fiable que l\'interface pour une étape. L\'interface reste privilégiée par défaut. Ce drapeau s\'efface quand vous réinitialisez la conversation.', - 'sp.permissions.disabled_html': '⚠️ Les demandes d\'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera, enregistrera et planifiera des travaux futurs sans demander au préalable. Réactivez cette option depuis Paramètres → Autorisations → Demander avant les actions importantes.', + 'sp.permissions.disabled_html': "⚠️ Les demandes d'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera, enregistrera et planifiera des travaux futurs sans demander au préalable. Réactivez cette option depuis le bouton ⚠ à côté du micro.", 'sp.permissions.button': 'Demandes d\'autorisation : activées', 'sp.permissions.button_off': 'Demandes d\'autorisation : désactivées', 'sp.permissions.gate_desc': 'WebBrain demande la première fois qu\'il clique, saisit, télécharge ou exécute du code sur un site.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Attente de « {selector} »', 'st.title': 'Paramètres WebBrain', - 'st.subtitle': 'Configurez vos fournisseurs de LLM et vos préférences · v{version}', + 'st.subtitle': 'Configurez le fonctionnement de WebBrain · v{version}', 'st.tab.display': 'Général', + 'st.tab.budgets': 'Budgets', + 'st.tab.advanced': 'Avancé', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Parole', + 'st.tab.generative': 'Génératif', + 'st.tab.decision': 'Décision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Fournisseurs WebBrain', + 'st.providers_page.subtitle': 'Choisissez les modèles utilisés par WebBrain · v{version}', + 'st.permissions_page.title': 'Autorisations WebBrain', + 'st.permissions_page.subtitle': 'Sites où WebBrain peut agir sans demander d’abord', 'st.tab.providers': 'Fournisseurs', 'st.tab.vision': 'Vision', 'st.tab.profile': 'Profil', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Mettre à jour le moyen de paiement", 'st.account.manage_billing': 'Gérer la facturation', - 'st.display.language.label': 'Langue', - 'st.display.language.desc': 'Langue de l\'interface de l\'extension WebBrain.', 'st.display.verbose.label': 'Mode détaillé', 'st.display.verbose.desc': 'Affiche tous les détails des appels d\'outils, les arguments et les résultats JSON bruts. Désactivé par défaut pour un chat plus épuré.', 'st.display.selection_shortcut.label': 'Raccourci de sélection', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Capture automatique', "st.display.auto_screenshot.desc": "Capture automatiquement une image de la fenêtre après une action de l’agent sur la page, afin que la route de vision sélectionnée voie ce qui a changé. Cela consomme plus de jetons. Si la vision est indisponible, l’enrichissement est ignoré et la tâche continue avec un avis d’état.", 'st.display.auto_screenshot.off': 'Désactivée', - 'st.display.auto_screenshot.navigation': 'À la navigation', - 'st.display.auto_screenshot.state_change': 'Au changement d\'état (par défaut)', + 'st.display.auto_screenshot.navigation': 'À la navigation (par défaut)', + 'st.display.auto_screenshot.state_change': "Au changement d'état", 'st.display.auto_screenshot.every_step': 'À chaque étape', 'st.display.tracing.label': 'Enregistrer les traces (pour comparer des modèles)', - 'st.display.tracing.desc_html': 'Conserve chaque exécution (requêtes LLM, réponses, appels d\'outils, captures) dans IndexedDB local pour pouvoir inspecter et comparer les modèles côte à côte. S\'ouvre dans un onglet Traces distinct. Désactivé par défaut car cela ajoute des écritures disque à chaque étape. Ouvrir la page Traces →', - 'st.display.lossless_tracing.label': 'Enregistrer les détails complets des requêtes (niveau débogage)', - 'st.display.lossless_tracing.desc_html': 'Conserve aussi les prompts, messages et schémas d\'outils complets de chaque requête LLM au lieu de résumés sans contenu, et garde jusqu\'à 200 Ko de chaque résultat d\'outil. Permet un débogage approfondi et la reconstruction des requêtes. Désactivé par défaut car cela écrit localement le contenu de votre conversation et utilise beaucoup plus d\'espace disque. Nécessite que l\'enregistrement des traces soit activé.', + 'st.display.tracing.desc_html': "Conserve chaque exécution (requêtes LLM, réponses, appels d'outils, captures) dans IndexedDB local pour pouvoir inspecter et comparer les modèles côte à côte, y compris les prompts, messages et schémas d'outils complets de chaque requête LLM et jusqu'à 200 Ko de chaque résultat d'outil. S'ouvre dans un onglet Traces distinct. Désactivé par défaut car cela écrit localement le contenu de votre conversation et utilise beaucoup plus d'espace disque. Ouvrir la page Traces →", 'st.display.allow_local_network.label': 'Autoriser l\'agent à accéder au réseau local', 'st.display.allow_local_network.desc': 'Permet à l\'outil fetch_url de l\'agent d\'atteindre les adresses loopback (127.0.0.1, localhost) et privées/RFC1918 (10.x, 192.168.x, 172.16–31.x). Utile pour les serveurs de dev locaux, outils intranet ou API auto-hébergées. Désactivé par défaut. Lorsqu’il est désactivé, les URL contenant une adresse IP privée ou de boucle locale écrite directement et les noms localhost sont bloqués. La résolution DNS n’est pas vérifiée : d’autres noms peuvent encore atteindre des adresses locales. Les adresses IP littérales de métadonnées cloud (169.254.169.254) et les noms de métadonnées répertoriés ou *.internal/*.local restent bloqués même lorsqu’il est activé.', 'st.display.notify_sound.label': "Sons de notification", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Mode vision activé pour le fournisseur actif.", "sp.vision.off": "Mode vision désactivé pour le fournisseur actif.", "sp.vision.error": "Échec du basculement de la vision : {msg}", - "st.tab.multimodal": "Modèles auxiliaires", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Recommandé. Lorsque activé, WebBrain demande l'autorisation la première fois qu'il clique, saisit du texte, navigue, exécute du JavaScript, téléverse, télécharge ou enregistre sur un site (puis mémorise votre choix). Désactivez-le pour une utilisation rapide et sans invite sur les sites en lesquels vous avez pleinement confiance.", "st.perms.gate.warning": "⚠️ Les demandes d'autorisation sont DÉSACTIVÉES. WebBrain cliquera, saisira du texte, naviguera, exécutera du JavaScript, téléversera, téléchargera et enregistrera sur n'importe quel site SANS demander — y compris sur des pages dont le contenu peut être contrôlé par un attaquant. Le contenu des pages reste traité comme non fiable en interne, mais rien n'empêchera une instruction injectée de déclencher une action. Ne laissez ceci désactivé que si vous avez pleinement confiance en chaque site sur lequel vous utilisez l'assistant.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Valeur par défaut du système", "st.display.download_directory.error": "Utilisez un dossier relatif comme WebBrain ou Work/WebBrain. Les chemins absolus et « .. » ne sont pas autorisés.", "st.display.strict_secret.label": "Gestion stricte des secrets", - "st.display.strict_secret.desc": "Refuse de citer les identifiants (mots de passe, clés d'API, jetons, OTPs) dans les résumés ou le texte de l'assistant — même lorsque vous le demandez explicitement. Utile si vous partagez régulièrement des fichiers de trace ou votre écran. Désactivé par défaut afin que l'agent puisse répéter la valeur exacte que vous demandez lorsque vous en avez besoin. Activez-le (Paramètres → Sécurité) lorsque vous voulez garder les résumés `done` propres et que les identifiants ne soient jamais répétés.", + "st.display.strict_secret.desc": "Refuse de citer les identifiants (mots de passe, clés d'API, jetons, OTPs) dans les résumés ou le texte de l'assistant — même lorsque vous le demandez explicitement. Utile si vous partagez régulièrement des fichiers de trace ou votre écran. Désactivé par défaut afin que l'agent puisse répéter la valeur exacte que vous demandez lorsque vous en avez besoin. Activez-le lorsque vous voulez garder les résumés `done` propres et que les identifiants ne soient jamais répétés.", "st.display.request_timeout.label": "Délai d'attente des requêtes LLM", "st.display.request_timeout.desc": "Attente maximale des en-têtes de réponse et de chaque pause entre les fragments de réponse en streaming. Par défaut : 120 s. Augmentez cette durée pour les modèles locaux lents, surtout sur CPU ou avec un contexte volumineux.", "st.providers.filter.all": "Tous", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Les messages sont mis en file d\'attente pendant que WebBrain est occupé. Seuls /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces et /verbose peuvent s\'exécuter immédiatement comme commandes slash.', 'tool.go_back': 'Revenir en arrière', 'tool.go_forward': 'Aller en avant', - 'st.display.search.placeholder': 'Rechercher dans les paramètres généraux', - 'st.display.search.empty': 'Aucun paramètre général correspondant.', + 'st.display.search.placeholder': 'Rechercher dans les paramètres', + 'st.display.search.empty': 'Aucun paramètre correspondant.', 'st.display.advanced': 'Avancé', ...getApocalypseModeCopy('fr'), ...getEmergencyBoxCopy('fr'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Plus grand côté (largeur ou hauteur) en pixels pour toute capture envoyée à la vision. Un plafond plus bas réduit les images avant envoi, ce qui coupe tokens et coût. Un plafond plus haut conserve la fidélité.", "st.imageBudget.warning": "⚠️ Ces réglages s’appliquent aux captures pour la vision (auto-capture, /screenshot, page entière, verify_form). Les images enregistrées manuellement en pleine résolution ne sont pas affectées. « Image detail » est respecté par les endpoints de type OpenAI ; d’autres fournisseurs peuvent l’ignorer.", - "st.redaction.heading": "Floutage des captures d'écran", "st.redaction.toggle.label": "Flouter le contenu sensible dans les captures d'écran", "st.redaction.toggle.desc": "Avant qu'une capture d'écran soit envoyée à un modèle de vision, floute les champs de formulaire et le texte qui ressemble à un e-mail ou un numéro de téléphone. La détection s'exécute entièrement sur votre appareil — rien de plus n'est transmis.", "st.redaction.warning": "⚠️ Meilleur effort et fail-open : si le floutage ne peut pas s'exécuter sur une page (par exemple juste après une navigation, dans les visionneuses PDF, ou sur des pages restreintes du navigateur), la capture est quand même envoyée non floutée. La détection utilise uniquement des heuristiques DOM — texte dessiné sur un canvas, données personnelles dans des images, ou tout ce qui n'est pas reconnu comme champ de formulaire ou texte e-mail/téléphone peut passer inaperçu, et le texte de la page envoyé au modèle n'est pas flouté par ce réglage. Ce n'est PAS une garantie de sécurité. Pour une confidentialité totale, utilisez un modèle local/hors ligne (llama.cpp, Ollama) : les captures ne quittent alors jamais votre machine et le floutage devient inutile.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Exporter toute la session de traces enregistrée en JSON, captures comprises", "sp.export_traces.recording_truncated": "Tous les enregistrements sauvegardés ont été exportés en JSON. Le contenu omis lors de l’enregistrement ne peut pas être récupéré par l’export.", "sp.slash.export_traces": "Exporter la chaîne d'outils (traces)", - "sp.export_traces.none": "Aucune trace pour cette conversation. Activez « Enregistrer les traces » dans les paramètres, puis relancez.", + "sp.export_traces.none": "Aucune trace pour cette conversation. Activez « Enregistrer les traces » dans Paramètres → Avancé, puis relancez.", "sp.export_traces.error": "Impossible d'exporter les traces.", "sp.export_traces.done": "Chaîne d'outils exportée.", "sp.export_traces.no_conversation": "Rien à exporter pour l'instant — commencez une conversation d'abord.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Chaîne d'outils exportée. Des tours plus anciens peuvent manquer si cette conversation a beaucoup de traces.", "st.display.help_improve.label": "Aider à améliorer WebBrain", "st.display.help_improve.desc_html": "Autorise la conservation de certaines interactions WebBrain Compass et leur utilisation pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Activé par défaut. Désactivez cette option pour empêcher que les futures interactions Compass soient utilisées à ces fins. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que pour les fournisseurs où vous activez « Partager les requêtes pour la recherche ». Politique de confidentialité →", - "st.providers.webbrain_data_use.body": "Une utilisation quotidienne gratuite de WebBrain Compass est incluse. Tant que Aider à améliorer WebBrain est activé par défaut, certaines conversations Compass peuvent être conservées et utilisées pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Désactivez cette option dans Général → Avancé pour exclure les futures interactions Compass de ces usages. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que si vous activez l’option « Partager les requêtes pour la recherche » de ce fournisseur. {privacyLink}. Pour davantage d’utilisation, abonnez-vous sur {subscribeLink}. Gérez la facturation sur {accountLink}.", + "st.providers.webbrain_data_use.body": "Une utilisation quotidienne gratuite de WebBrain Compass est incluse. Tant que Aider à améliorer WebBrain est activé par défaut, certaines conversations Compass peuvent être conservées et utilisées pour l’évaluation, l’amélioration, l’ajustement fin et l’entraînement. Désactivez cette option dans Paramètres → Avancé pour exclure les futures interactions Compass de ces usages. Les requêtes des modèles locaux et de vos propres API ne sont collectées par WebBrain que si vous activez l’option « Partager les requêtes pour la recherche » de ce fournisseur. {privacyLink}. Pour davantage d’utilisation, abonnez-vous sur {subscribeLink}. Gérez la facturation sur {accountLink}.", 'st.providers.share_research.label': "Partager les requêtes pour la recherche", 'st.providers.share_research.hint': "Envoie les prompts et les réponses de ce fournisseur à WebBrain pour évaluation et amélioration, y compris le fournisseur et le modèle utilisés. Les images et pièces jointes binaires sont supprimées et le texte est tronqué avant partage ; le texte restant est envoyé tel quel.", 'st.providers.share_research.confirm': "Partager les requêtes de ce fournisseur avec WebBrain pour la recherche ?\n\nSi activé, vos prompts, réponses et interactions d’outils avec ce fournisseur seront envoyés à WebBrain pour évaluation et amélioration, avec le nom du fournisseur et du modèle. Le texte est envoyé tel quel après suppression des images et troncation des contenus longs : évitez donc de partager des données personnelles sensibles. Vous pouvez désactiver cette option à tout moment pour arrêter le partage.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Vous voulez moins d’interruptions ? « Toujours autoriser » mémorise ce site. La commande ci-dessous désactive les demandes d’autorisation de WebBrain sur tous les sites.", "sp.perm.insert_skip_command": "Insérer /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Votre brouillon reste inchangé. Effacez-le avant d’insérer la commande.", - "ob.act.permissions_tip": "Les demandes d’autorisation sont activées par défaut. Les utilisateurs avancés peuvent les désactiver partout avec /dangerously-skip-permissions et les réactiver dans Paramètres → Autorisations.", + "ob.act.permissions_tip": "Les demandes d’autorisation sont activées par défaut. Les utilisateurs avancés peuvent les désactiver partout avec /dangerously-skip-permissions et les réactiver depuis le bouton ⚠ à côté du micro.", 'st.provider.field.cache_read_cost_per_million': "Coût estimé de lecture du cache ($ / 1M tokens)", 'st.provider.field.cache_write_cost_per_million': "Coût estimé d’écriture du cache (5 min) ($ / 1M tokens)", 'st.provider.field.cache_write_1h_cost_per_million': "Coût estimé d’écriture du cache (1 h) ($ / 1M tokens)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Remplacer la copie cloud cryptée par la configuration WebBrain actuelle de cet appareil ?", "st.sync.consent.legacy": "Activer la synchronisation chiffrée ? WebBrain transmettra une copie cryptée de bout en bout de vos souvenirs, du remplissage automatique de votre profil et des paramètres du fournisseur de clé API à WebBrain Compass. L'historique des discussions et les connexions OAuth ne sont pas synchronisés.", "st.sync.consent.denied": "L'autorisation de synchronisation chiffrée n'a pas été accordée.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "La page a changé pendant la tâche ({before} → {after}). La tâche continue.", 'sp.activity.generating_answer': "Génération de la réponse…", 'sp.activity.retrying_response': "Nouvelle tentative de réponse…", diff --git a/src/firefox/src/ui/locales/he.js b/src/firefox/src/ui/locales/he.js index a8ebd08cff..bf26df8ffa 100644 --- a/src/firefox/src/ui/locales/he.js +++ b/src/firefox/src/ui/locales/he.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'הקטנת תצוגת ממשק התוסף', 'sp.ui_scale.increase': 'הגדלת תצוגת ממשק התוסף', 'sp.ui_scale.reset': 'איפוס', - 'st.display.ui_scale.label': 'הגדלת ממשק התוסף', - 'st.display.ui_scale.decrease': 'הקטנת תצוגת ממשק התוסף', - 'st.display.ui_scale.increase': 'הגדלת תצוגת ממשק התוסף', - 'st.display.ui_scale.reset': 'איפוס', - 'st.display.ui_scale.desc': 'שינוי גודל הסרגל הצדדי וחלון הצ׳אט הנפרד בלי לשנות את תצוגת הדף.', - 'st.display.ui_scale.shortcuts': 'קיצורי דרך ייעודיים: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'לא הוקצה', - 'st.display.ui_scale.manage_shortcuts': 'התאמת קיצורי דרך', 'tool.delegate_research': 'חוקר עם ChatGPT', 'st.display.research_escalation.label': 'הסלמת מחקר', 'st.display.research_escalation.desc': 'כאשר האפשרות מופעלת, WebBrain עשוי לבקש אישור לפני שליחת בקשת מחקר מורכבת לקריאה בלבד אל ChatGPT. כבוי כברירת מחדל. הבקשה המדויקת משותפת רק לאחר אישור מפורש שלך.', @@ -482,7 +474,7 @@ export default { "sp.step.input_label": "קלט", "sp.step.result_label": "תוצאה", "sp.api.enabled_html": "🔓 שינויי API מופעלים בשיחה הזו. הסוכן יכול כעת להשתמש בבקשות POST/PUT/PATCH/DELETE דרך fetch_url ו-execute_js כאשר הוא מעריך שה-API אמין יותר מממשק המשתמש בשלב מסוים. ממשק המשתמש נשאר ברירת המחדל. הדגל נמחק בעת איפוס השיחה.", - "sp.permissions.disabled_html": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בלי לשאול תחילה. ניתן להפעיל אותן מחדש דרך הגדרות ← הרשאות ← בקש אישור לפני פעולות משמעותיות.", + "sp.permissions.disabled_html": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בלי לשאול תחילה. ניתן להפעיל אותן מחדש דרך הכפתור ⚠ ליד המיקרופון.", "sp.permissions.button": "בקשות הרשאה: מופעלות", "sp.permissions.button_off": "בקשות הרשאה: כבויות", "sp.permissions.gate_desc": "WebBrain שואל בפעם הראשונה שהוא לוחץ, מקליד, מוריד קבצים או מריץ קוד באתר.", @@ -632,16 +624,26 @@ export default { "ob.btn.done": "התחל", "ob.btn.skip": "דלג לעת עתה", 'ob.btn.start': 'התחל', - 'ob.cloud.body': 'WebBrain Compass מוכן עם הקצבה שבועית חינםית. שיחות Compass נבחרות עשויות להישמר ולשמש לשיפור WebBrain בזמן ש- Help Improve WebBrain מופעל כברירת מחדל. אתה יכול לכבות את זה בהגדרות ← כללי.', + 'ob.cloud.body': 'WebBrain Compass מוכן עם הקצבה שבועית חינםית. שיחות Compass נבחרות עשויות להישמר ולשמש לשיפור WebBrain בזמן ש- Help Improve WebBrain מופעל כברירת מחדל. אתה יכול לכבות את זה בהגדרות ← מתקדם.', 'ob.cloud.change': 'שינוי', 'ob.cloud.using': 'שימוש ב-WebBrain Compass.', "st.title": "הגדרות WebBrain", - "st.subtitle": "הגדר ספקי LLM והעדפות · גרסה {version}", + "st.subtitle": "הגדר את אופן הפעולה של WebBrain · גרסה {version}", "st.tab.display": "כללי", + "st.tab.budgets": "תקציבים", + "st.tab.advanced": "מִתקַדֵם", + "st.tab.llm": "LLM", + "st.tab.speech": "דיבור", + "st.tab.generative": "גנרטיבי", + "st.tab.decision": "החלטות", + "st.tab.safesocial": "SafeSocial", + "st.providers_page.title": "ספקי WebBrain", + "st.providers_page.subtitle": "בחר את המודלים ש-WebBrain משתמש בהם · גרסה {version}", + "st.permissions_page.title": "הרשאות WebBrain", + "st.permissions_page.subtitle": "אתרים שבהם WebBrain רשאי לפעול בלי לשאול קודם", "st.tab.providers": "ספקים", "st.tab.skills": "מיומנויות", "st.tab.vision": "ראייה", - "st.tab.multimodal": "מודלים מסייעים", 'sp.slash.workflow_editor': "עורך תהליכי עבודה", "sp.slash.workflows": "הצגה וניהול של תהליכי עבודה שמורים", "sp.slash.teach": "הקלטת הפעולות שלך כתהליך עבודה שמור", @@ -679,7 +681,6 @@ export default { "st.tab.profile": "פרופיל", "st.tab.account": "חשבון", "st.tab.captcha": "CAPTCHA", - "st.tab.permissions": "הרשאות", "st.perms.gate.label": "שאל לפני פעולות בעלות השפעה", "st.perms.gate.desc": "מומלץ. כאשר האפשרות מופעלת, WebBrain מבקש רשות בפעם הראשונה שהוא לוחץ, מקליד, מנווט, מריץ JavaScript, מעלה או מוריד קבצים, מקליט או מתזמן עבודה עתידית באתר, ולאחר מכן זוכר את בחירתך. כבה רק לשימוש מהיר ללא בקשות באתרים שאתה בוטח בהם לחלוטין.", "st.perms.gate.warning": "⚠️ בקשות ההרשאה כבויות. WebBrain ילחץ, יקליד, ינווט, יריץ JavaScript, יעלה ויוריד קבצים, יקליט ויתזמן עבודה עתידית בכל אתר בלי לשאול — גם בדפים שתוקף עשוי לשלוט בתוכן שלהם. תוכן הדף עדיין מטופל פנימית כלא-מהימן, אך דבר לא יעצור הוראה מוזרקת מלגרום לפעולה. השאר אפשרות זו כבויה רק אם אתה בוטח לחלוטין בכל אתר שבו נעשה שימוש בסוכן.", @@ -698,8 +699,6 @@ export default { "st.account.payment_failed": "לא ניתן היה להשלים את התשלום עבור המינוי. עדכנו את אמצעי התשלום כדי לשחזר את התוכנית בתשלום.", "st.account.update_payment": "עדכון אמצעי התשלום", "st.account.manage_billing": "ניהול חיוב", - "st.display.language.label": "שפה", - "st.display.language.desc": "שפת הממשק של תוסף WebBrain.", "st.display.theme.label": "מראה", "st.display.theme.desc": "בחר ערכת נושא בהירה, כהה או לפי הגדרת מערכת ההפעלה.", "st.display.theme.system": "מערכת", @@ -709,8 +708,8 @@ export default { "st.display.download_directory.desc": "תיקיית משנה אופציונלית בתוך תיקיית ההורדות של הדפדפן או המערכת. השאירו ריק כדי להשתמש בברירת המחדל של המערכת.", "st.display.download_directory.placeholder": "ברירת המחדל של המערכת", "st.display.download_directory.error": "השתמשו בתיקייה יחסית כמו WebBrain או Work/WebBrain. נתיבים מוחלטים ו-”..“ אינם מותרים.", - "st.display.search.placeholder": "חפש בהגדרות כלליות", - "st.display.search.empty": "אין הגדרות כלליות תואמות.", + "st.display.search.placeholder": "חפש בהגדרות", + "st.display.search.empty": "אין הגדרות תואמות.", "st.display.advanced": "מִתקַדֵם", ...getApocalypseModeCopy('he'), ...getEmergencyBoxCopy('he'), @@ -764,20 +763,18 @@ export default { "st.display.auto_screenshot.label": "צילום מסך אוטומטי", "st.display.auto_screenshot.desc": "צלם אוטומטית צילום מסך של אזור התצוגה לאחר שהסוכן פועל בדף, כדי שמסלול הראייה שנבחר יוכל לראות מה השתנה. הפעולה צורכת יותר אסימונים. אם הראייה אינה זמינה, ההעשרה מדולגת והמשימה ממשיכה עם הודעת מצב.", "st.display.auto_screenshot.off": "כבוי", - "st.display.auto_screenshot.navigation": "על ניווט", - "st.display.auto_screenshot.state_change": "בשינוי מצב (ברירת מחדל)", + "st.display.auto_screenshot.navigation": "על ניווט (ברירת מחדל)", + "st.display.auto_screenshot.state_change": "בשינוי מצב", "st.display.auto_screenshot.every_step": "כל צעד", "st.display.tracing.label": "הקלטת עקבות (להשוואת מודלים)", - "st.display.tracing.desc_html": "תתמיד בכל ריצה (LLM בקשות, תגובות, קריאות לכלים, צילומי מסך) לתוך IndexedDB המקומי כדי שתוכל לבדוק ולהשוות מודלים זה לצד זה. נפתח בלשונית Traces נפרדת. כבוי כברירת מחדל מכיוון שהוא מוסיף כתיבה בדיסק בכל שלב. פתח את דף העקבות →", - "st.display.lossless_tracing.label": "רישום פרטי בקשה מלאים (שכבת דיבאג)", - "st.display.lossless_tracing.desc_html": "שומר גם את ההנחיות, ההודעות והמבנים המלאים של כל בקשת LLM במקום סיכומים חסרי תוכן, ומחזיק עד 200KB מכל תוצאת כלי. מאפשר ניפוי שגיאות מעמיק ושחזור בקשות. כבוי כברירת מחדל משום שהוא כותב את תוכן השיחה שלך מקומית ומשתמש בהרבה יותר מקום. דורש שהקלטת מעקב תהיה פעילה.", + "st.display.tracing.desc_html": "שומר כל ריצה (בקשות LLM, תגובות, קריאות לכלים, צילומי מסך) ב-IndexedDB המקומי כדי שתוכל לבדוק ולהשוות מודלים זה לצד זה, כולל ההנחיות, ההודעות ומבני הכלים המלאים של כל בקשת LLM ועד 200KB מכל תוצאת כלי. נפתח בלשונית Traces נפרדת. כבוי כברירת מחדל משום שהוא כותב את תוכן השיחה שלך מקומית ומשתמש בהרבה יותר מקום. פתח את דף העקבות →", "st.display.cost_session_limit.label": "קצבת הפגישה בעלות ענן", "st.display.cost_session_limit.desc": "מפסיק ענן ו OpenRouter פועל לפני שיחת מודל בתשלום נוספת ברגע שההפעלה הזו מגיעה לקצבת העלות המדווחת או המשוערת. ברירת מחדל 10 $.", "st.display.cost_total_limit.label": "הקצבה כוללת של עלות ענן", "st.display.cost_total_limit.desc": "עוקבים מדווחים או ענן משוער/OpenRouter הוצאה של הדגם ברחבי השלוחה ומפסיקה שיחות נוספות בתשלום בקצבה. ספקים מקומיים אינם נספרים.", "st.display.cost_reset": "אפס את ההוצאה", "st.display.strict_secret.label": "טיפול סודי קפדני", - "st.display.strict_secret.desc": "מנע ציטוט של פרטי גישה (סיסמאות, מפתחות API, אסימונים וקודים חד-פעמיים) בסיכומים או בתשובות — גם אם ביקשת אותם במפורש. שימושי בעת שיתוף עקבות או מסך. כבוי כברירת מחדל כדי שהסוכן יוכל לחזור על הערך המדויק שביקשת כשתצטרך אותו. הפעל אותו (הגדרות ← אבטחה) כשאתה רוצה שסיכומי `done` יישארו מסודרים ופרטי גישה לא יחזרו על עצמם.", + "st.display.strict_secret.desc": "מנע ציטוט של פרטי גישה (סיסמאות, מפתחות API, אסימונים וקודים חד-פעמיים) בסיכומים או בתשובות — גם אם ביקשת אותם במפורש. שימושי בעת שיתוף עקבות או מסך. כבוי כברירת מחדל כדי שהסוכן יוכל לחזור על הערך המדויק שביקשת כשתצטרך אותו. הפעל אותו כשאתה רוצה שסיכומי `done` יישארו מסודרים ופרטי גישה לא יחזרו על עצמם.", "st.display.allow_local_network.label": "אפשר לסוכן לגשת לרשת המקומית", "st.display.allow_local_network.desc": "נותן לסוכן fetch_url לולאה חוזרת של כלי הגעה (127.0.0.1, localhost) ו-private/RFC1918 כתובות (10.x, 192.168.x, 172.16–31.x). שימושי עבור שרתי פיתוח מקומיים, כלי אינטראנט או ממשקי API מתארחים בעצמם. כבוי כברירת מחדל. כשהוא כבוי, כתובות URL שבהן נכתבה ישירות כתובת IP פרטית או loopback ושמות localhost נחסמים. פתרון DNS אינו נבדק, ולכן שמות מארח אחרים עדיין עשויים להגיע לכתובות מקומיות. כתובות IP ישירות של מטא־נתוני ענן (169.254.169.254) ושמות מטא־נתונים שברשימה או *.internal/*.local נשארים חסומים גם כשהאפשרות מופעלת.", "st.display.scheduled_tasks.label": "משימות מתוזמנות", @@ -1099,7 +1096,6 @@ export default { "st.imageBudget.maxDimension.desc": "הצלע הארוכה (רוחב או גובה) בפיקסלים לכל צילום שנשלח לראייה. תקרה נמוכה יותר מקטינה תמונות לפני השליחה ומורידה טוקנים ועלות. תקרה גבוהה יותר שומרת נאמנות.", "st.imageBudget.warning": "⚠️ ההגדרות האלה חלות על צילומים לראייה (צילום אוטומטי, /screenshot, עמוד מלא, verify_form). תמונות שנשמרו ידנית ברזולוציה מלאה אינן מושפעות. «Image detail» מכובד על ידי נקודות קצה בסגנון OpenAI; ספקים אחרים עשויים להתעלם.", - "st.redaction.heading": "טשטוש צילומי מסך", "st.redaction.toggle.label": "טשטש תוכן רגיש בצילומי מסך", "st.redaction.toggle.desc": "לפני שצילום מסך נשלח למודל ראייה, מטשטש שדות טופס וטקסט שנראה כמו אימייל או מספר טלפון. הזיהוי פועל כולו במכשיר שלך — שום דבר נוסף לא מועבר.", "st.redaction.warning": "⚠️ זהו טשטוש במאמץ סביר (best-effort) מסוג fail-open: אם הטשטוש לא יכול לפעול בדף מסוים (למשל מיד אחרי ניווט, בצפייה בקבצי PDF, או בדפי דפדפן מוגבלים), צילום המסך עדיין יישלח ללא טשטוש. הזיהוי מסתמך רק על היוריסטיקות DOM — טקסט המצויר על canvas, מידע אישי בתוך תמונות, או כל דבר שלא מזוהה כשדה טופס או כטקסט אימייל/טלפון עלול לחמוק, וטקסט הדף הנשלח למודל אינו מטושטש על ידי הגדרה זו. זו אינה ערבות אבטחה. לפרטיות מלאה, השתמש במודל מקומי/לא מקוון (llama.cpp, Ollama): כך צילומי מסך לעולם לא יעזבו את המכשיר שלך והטשטוש כבר לא יידרש.", @@ -1113,7 +1109,7 @@ export default { "sp.slash.export_traces_full": "ייצוא כל סשן המעקב השמור כ־JSON, כולל צילומי מסך", "sp.export_traces.recording_truncated": "כל הרשומות השמורות יוצאו כ־JSON. תוכן שהושמט בזמן ההקלטה אינו ניתן לשחזור באמצעות ייצוא.", "sp.slash.export_traces": "ייצוא שרשרת הכלים (מעקבים)", - "sp.export_traces.none": "אין מעקבים לשיחה זו. הפעילו את «הקלטת מעקבים» בהגדרות והריצו שוב.", + "sp.export_traces.none": "אין מעקבים לשיחה זו. הפעילו את «הקלטת מעקבים» בהגדרות ← מתקדם והריצו שוב.", "sp.export_traces.error": "לא ניתן לייצא מעקבים.", "sp.export_traces.done": "שרשרת הכלים יוצאה.", "sp.export_traces.no_conversation": "אין עדיין מה לייצא — התחילו שיחה קודם.", @@ -1121,7 +1117,7 @@ export default { "sp.export_traces.truncated": "שרשרת הכלים יוצאה. תורות ישנות עשויות לחסר אם לשיחה יש הרבה מעקבים.", "st.display.help_improve.label": "עזרה בשיפור WebBrain", "st.display.help_improve.desc_html": "אפשרו לשמור אינטראקציות נבחרות עם WebBrain Compass ולהשתמש בהן להערכה, שיפור, כוונון עדין ואימון. מופעל כברירת מחדל. כבו כדי למנוע שימוש באינטראקציות Compass עתידיות למטרות אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק מספקים שבהם הפעלתם את «שיתוף שאילתות למחקר». מדיניות פרטיות →", - "st.providers.webbrain_data_use.body": "שימוש יומי חינמי ב-WebBrain Compass כלול. כאשר ״עזרה בשיפור WebBrain״ מופעלת כברירת מחדל, ייתכן ששיחות Compass נבחרות יישמרו וישמשו להערכה, שיפור, כוונון עדין ואימון. כבו את האפשרות ב״כללי ← מִתקַדֵם״ כדי להחריג אינטראקציות Compass עתידיות משימושים אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק כאשר אתם מפעילים את האפשרות «שיתוף שאילתות למחקר» של ספק זה. {privacyLink}. לשימוש נוסף, הירשמו דרך {subscribeLink}. נהלו את החיוב דרך {accountLink}.", + "st.providers.webbrain_data_use.body": "שימוש יומי חינמי ב-WebBrain Compass כלול. כאשר ״עזרה בשיפור WebBrain״ מופעלת כברירת מחדל, ייתכן ששיחות Compass נבחרות יישמרו וישמשו להערכה, שיפור, כוונון עדין ואימון. כבו את האפשרות ב״הגדרות ← מִתקַדֵם״ כדי להחריג אינטראקציות Compass עתידיות משימושים אלה. WebBrain אוסף בקשות למודלים מקומיים ול-API שלכם רק כאשר אתם מפעילים את האפשרות «שיתוף שאילתות למחקר» של ספק זה. {privacyLink}. לשימוש נוסף, הירשמו דרך {subscribeLink}. נהלו את החיוב דרך {accountLink}.", 'st.providers.share_research.label': "שיתוף שאילתות למחקר", 'st.providers.share_research.hint': "שולח את ההנחיות והתשובות של ספק זה ל-WebBrain להערכה ולשיפור, כולל הספק והמודל ששימשו. תמונות וקבצים בינאריים מוסרים והטקסט נחתך לפני השיתוף; הטקסט הנותר נשלח כפי שהוא.", 'st.providers.share_research.confirm': "לשתף את השאילתות של ספק זה עם WebBrain למחקר?\n\nכאשר מופעל, ההנחיות, התשובות ואינטראקציות הכלים שלך עם ספק זה יישלחו ל-WebBrain להערכה ולשיפור, יחד עם שם הספק והמודל. הטקסט נשלח כפי שהוא לאחר הסרת תמונות וקיצוץ תוכן ארוך, לכן הימנעו משיתוף מידע אישי רגיש. ניתן לכבות בכל עת כדי להפסיק את השיתוף.", @@ -1167,7 +1163,7 @@ export default { "sp.perm.skip_hint": "רוצה פחות הפרעות? ״אפשר תמיד״ זוכר את האתר הזה. הפקודה שלמטה משביתה את בקשות ההרשאה של WebBrain בכל האתרים.", "sp.perm.insert_skip_command": "הוספת /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "הטיוטה שלך לא השתנתה. יש לנקות אותה לפני הוספת הפקודה.", - "ob.act.permissions_tip": "בקשות הרשאה מופעלות כברירת מחדל. משתמשים מתקדמים יכולים להשבית אותן בכל האתרים באמצעות /dangerously-skip-permissions ולהפעיל אותן מחדש דרך הגדרות ← הרשאות.", + "ob.act.permissions_tip": "בקשות הרשאה מופעלות כברירת מחדל. משתמשים מתקדמים יכולים להשבית אותן בכל האתרים באמצעות /dangerously-skip-permissions ולהפעיל אותן מחדש דרך הכפתור ⚠ ליד המיקרופון.", 'st.provider.field.cache_read_cost_per_million': "עלות משוערת לקריאה מהמטמון ($ / מיליון אסימונים)", 'st.provider.field.cache_write_cost_per_million': "עלות משוערת לכתיבה למטמון ל-5 דקות ($ / מיליון אסימונים)", 'st.provider.field.cache_write_1h_cost_per_million': "עלות משוערת לכתיבה למטמון לשעה ($ / מיליון אסימונים)", @@ -1229,7 +1225,7 @@ export default { "st.sync.confirm.reset": "האם להחליף את עותק הענן המוצפן בהגדרות WebBrain הנוכחיות של המכשיר הזה?", "st.sync.consent.legacy": "להפעיל סנכרון מוצפן? WebBrain ישדר עותק מוצפן מקצה לקצה של הזיכרונות, המילוי האוטומטי של הפרופיל והגדרות ספק מפתח ה-API שלך ל-WebBrain Compass. היסטוריית הצ'אט וכניסות OAuth אינן מסונכרנות.", "st.sync.consent.denied": "הרשאת סנכרון מוצפן לא ניתנה.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "הדף השתנה בזמן שהמשימה פעלה ({before} → {after}). ממשיכים במשימה.", 'sp.activity.generating_answer': "יוצר תשובה…", 'sp.activity.retrying_response': "מנסה שוב להשיב…", diff --git a/src/firefox/src/ui/locales/hi.js b/src/firefox/src/ui/locales/hi.js index 2235cbdf1d..4149bdcd8d 100644 --- a/src/firefox/src/ui/locales/hi.js +++ b/src/firefox/src/ui/locales/hi.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'एक्सटेंशन UI को छोटा करें', 'sp.ui_scale.increase': 'एक्सटेंशन UI को बड़ा करें', 'sp.ui_scale.reset': 'रीसेट', - 'st.display.ui_scale.label': 'एक्सटेंशन UI ज़ूम', - 'st.display.ui_scale.decrease': 'एक्सटेंशन UI को छोटा करें', - 'st.display.ui_scale.increase': 'एक्सटेंशन UI को बड़ा करें', - 'st.display.ui_scale.reset': 'रीसेट', - 'st.display.ui_scale.desc': 'पेज का ज़ूम बदले बिना साइड पैनल और अलग चैट विंडो का आकार बदलें।', - 'st.display.ui_scale.shortcuts': 'समर्पित शॉर्टकट: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'निर्धारित नहीं', - 'st.display.ui_scale.manage_shortcuts': 'शॉर्टकट कस्टमाइज़ करें', 'tool.delegate_research': 'ChatGPT से शोध हो रहा है', 'st.display.research_escalation.label': 'शोध एस्केलेशन', 'st.display.research_escalation.desc': 'सक्षम होने पर, WebBrain असामान्य रूप से जटिल केवल-पढ़ने योग्य शोध प्रॉम्प्ट को ChatGPT पर भेजने से पहले अनुमति मांग सकता है। डिफ़ॉल्ट रूप से बंद। सटीक प्रॉम्प्ट केवल आपकी स्पष्ट स्वीकृति के बाद साझा किया जाता है।', @@ -497,7 +489,7 @@ export default { 'sp.step.result_label': "नतीजा", 'sp.api.enabled_html': "🔓 एपीआई म्यूटेशन सक्षम इस बातचीत के लिए. जब एजेंट किसी चरण के लिए एपीआई को यूआई से अधिक विश्वसनीय मानता है तो वह अब Fetch_url औरexecute_js के माध्यम से POST/PUT/PATCH/DELETE का उपयोग कर सकता है। यूआई-प्रथम डिफ़ॉल्ट रहता है। जब आप वार्तालाप को रीसेट करते हैं तो यह ध्वज साफ़ हो जाता है।", - 'sp.permissions.disabled_html': "⚠️ अनुमति संकेत बंद हैं. WebBrain पहले पूछे बिना क्लिक करेगा, टाइप करेगा, नेविगेट करेगा, जावास्क्रिप्ट चलाएगा, अपलोड करेगा, डाउनलोड करेगा, रिकॉर्ड करेगा और भविष्य के काम को शेड्यूल करेगा। सेटिंग्स → अनुमतियाँ → परिणामी कार्रवाई से पहले पूछें से इसे पुनः सक्षम करें।", + 'sp.permissions.disabled_html': "⚠️ अनुमति संकेत बंद हैं. WebBrain पहले पूछे बिना क्लिक करेगा, टाइप करेगा, नेविगेट करेगा, जावास्क्रिप्ट चलाएगा, अपलोड करेगा, डाउनलोड करेगा, रिकॉर्ड करेगा और भविष्य के काम को शेड्यूल करेगा। माइक्रोफ़ोन के पास वाले ⚠ बटन से इसे फिर से सक्षम करें।", 'sp.permissions.button': 'अनुमति संकेत: चालू', 'sp.permissions.button_off': 'अनुमति संकेत: बंद', 'sp.permissions.gate_desc': 'किसी साइट पर पहली बार क्लिक करने, टाइप करने, डाउनलोड करने या कोड चलाने से पहले WebBrain पूछता है।', @@ -655,7 +647,7 @@ export default { 'ob.act.warn1': "WebBrain योजना बनाने के लिए स्क्रीनशॉट कैप्चर कर सकता है। स्वास्थ्य, वित्त, डेटिंग या निजी खाता पोर्टल जैसे संवेदनशील पेजों पर एजेंट मोड का उपयोग करने से बचें, जब तक कि आप उस जोखिम को स्वीकार नहीं करते।", 'ob.act.warn2': "वेब सामग्री में एआई व्यवहार में हेरफेर करने के लिए डिज़ाइन किए गए दुर्भावनापूर्ण प्रॉम्प्ट इंजेक्शन हो सकते हैं।", 'ob.act.warn3': "हमेशा सुझाई गई कार्रवाइयों की समीक्षा करें और अप्रत्याशित दिखने वाले रन रोकें।", - 'ob.act.permissions_tip': "अनुमति संकेत डिफ़ॉल्ट रूप से चालू हैं. उन्नत उपयोगकर्ता उन्हें /dangerously-skip-permissions के साथ विश्व स्तर पर अक्षम कर सकते हैं और सेटिंग्स → अनुमतियाँ में उन्हें पुनः सक्षम कर सकते हैं।", + 'ob.act.permissions_tip': "अनुमति संकेत डिफ़ॉल्ट रूप से चालू हैं. उन्नत उपयोगकर्ता उन्हें /dangerously-skip-permissions के साथ विश्व स्तर पर अक्षम कर सकते हैं और माइक्रोफ़ोन के पास वाले ⚠ बटन से उन्हें फिर से सक्षम कर सकते हैं।", 'ob.tokens.title': "एक मॉडल चुनें", 'ob.tokens.body': "WebBrain को काम करने के लिए एक भाषा मॉडल की आवश्यकता है। हम पहले स्थानीय मॉडलों की जांच करेंगे। यदि कोई उपलब्ध नहीं है, तो सेटिंग्स खोलें और एक प्रदाता जोड़ें:", 'ob.tokens.scanning': "स्थानीय मॉडलों की जाँच की जा रही है...", @@ -681,23 +673,32 @@ export default { 'ob.btn.done': "आरंभ करें", 'ob.btn.skip': "अभी के लिए छोड़ें", 'ob.btn.start': 'प्रारंभ', - 'ob.cloud.body': 'WebBrain Compass एक निःशुल्क साप्ताहिक भत्ते के साथ तैयार है। चयनित Compass बातचीत बनाए रखी जा सकती है और WebBrain में सुधार के लिए उपयोग की जा सकती है जबकि Help Improve WebBrain डिफ़ॉल्ट रूप से चालू है। आप इसे Settings → General में बंद कर सकते हैं।', + 'ob.cloud.body': 'WebBrain Compass एक निःशुल्क साप्ताहिक भत्ते के साथ तैयार है। चयनित Compass बातचीत बनाए रखी जा सकती है और WebBrain में सुधार के लिए उपयोग की जा सकती है जबकि Help Improve WebBrain डिफ़ॉल्ट रूप से चालू है। आप इसे Settings → Advanced में बंद कर सकते हैं।', 'ob.cloud.change': 'बदलें', 'ob.cloud.using': 'WebBrain Compass का उपयोग कर रहा है।', // --- Settings ---------------------------------------------------------- 'st.title': "WebBrain सेटिंग्स", - 'st.subtitle': "अपने एलएलएम प्रदाताओं और प्राथमिकताओं को कॉन्फ़िगर करें · v{version}", + 'st.subtitle': "WebBrain के काम करने का तरीका कॉन्फ़िगर करें · v{version}", 'st.tab.display': "सामान्य", + 'st.tab.budgets': 'बजट', + 'st.tab.advanced': 'उन्नत', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'वाक्', + 'st.tab.generative': 'जनरेटिव', + 'st.tab.decision': 'निर्णय', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain प्रदाता', + 'st.providers_page.subtitle': 'WebBrain द्वारा उपयोग किए जाने वाले मॉडल चुनें · v{version}', + 'st.permissions_page.title': 'WebBrain अनुमतियाँ', + 'st.permissions_page.subtitle': 'वे साइटें जहाँ WebBrain पहले पूछे बिना काम कर सकता है', 'st.tab.providers': "प्रदाता", 'st.tab.skills': "कौशल", 'st.tab.vision': "दृष्टि", - 'st.tab.multimodal': "सहायक मॉडल", 'st.tab.memory': "स्मृति", 'st.tab.profile': "प्रोफाइल", 'st.tab.account': "खाता", 'st.tab.captcha': "कैप्चा", - 'st.tab.permissions': "अनुमतियाँ", 'st.perms.gate.label': "परिणामी कार्रवाई से पहले पूछें", 'st.perms.gate.desc': "अनुशंसित. चालू होने पर, WebBrain पहली बार किसी साइट पर क्लिक करने, टाइप करने, नेविगेट करने, जावास्क्रिप्ट चलाने, अपलोड करने, डाउनलोड करने, रिकॉर्ड करने या भविष्य के काम को शेड्यूल करने पर अनुमति मांगता है (फिर आपकी पसंद को याद करता है)। उन साइटों पर तेज़, त्वरित-मुक्त उपयोग के लिए बंद करें जिन पर आप पूरी तरह भरोसा करते हैं।", @@ -719,8 +720,6 @@ export default { "st.account.update_payment": "भुगतान विधि अपडेट करें", 'st.account.manage_billing': "बिलिंग प्रबंधित करें", - 'st.display.language.label': "भाषा", - 'st.display.language.desc': "WebBrain प्लगइन के लिए इंटरफ़ेस भाषा।", 'st.display.theme.label': "दिखावट", 'st.display.theme.desc': "प्रकाश, अंधेरा, या अपनी ओएस सेटिंग का पालन करें।", 'st.display.theme.system': "सिस्टम", @@ -730,8 +729,8 @@ export default { 'st.display.download_directory.desc': "आपके ब्राउज़र या सिस्टम डाउनलोड निर्देशिका के अंदर वैकल्पिक सबफ़ोल्डर। सिस्टम डिफ़ॉल्ट का उपयोग करने के लिए खाली छोड़ दें.", 'st.display.download_directory.placeholder': "सिस्टम डिफ़ॉल्ट", 'st.display.download_directory.error': "WebBrain या Work/WebBrain जैसे संबंधित फ़ोल्डर का उपयोग करें। पूर्ण पथ और \"..\" की अनुमति नहीं है।", - 'st.display.search.placeholder': "सामान्य सेटिंग्स खोजें", - 'st.display.search.empty': "कोई सामान्य सेटिंग मेल नहीं खाती.", + 'st.display.search.placeholder': "सेटिंग्स खोजें", + 'st.display.search.empty': "कोई सेटिंग मेल नहीं खाती.", 'st.display.advanced': "उन्नत", ...getApocalypseModeCopy('hi'), ...getEmergencyBoxCopy('hi'), @@ -787,20 +786,18 @@ export default { 'st.display.auto_screenshot.label': "ऑटो-स्क्रीनशॉट", "st.display.auto_screenshot.desc": "एजेंट के पेज पर कार्य करने के बाद अपने-आप व्यूपोर्ट स्क्रीनशॉट लें, ताकि चुना गया विज़न मार्ग बदलाव देख सके। इसमें अधिक टोकन लगते हैं। विज़न उपलब्ध न होने पर संवर्धन छोड़ दिया जाता है और कार्य स्थिति सूचना के साथ जारी रहता है।", 'st.display.auto_screenshot.off': "बंद", - 'st.display.auto_screenshot.navigation': "नेविगेशन पर", - 'st.display.auto_screenshot.state_change': "राज्य परिवर्तन पर (डिफ़ॉल्ट)", + 'st.display.auto_screenshot.navigation': "नेविगेशन पर (डिफ़ॉल्ट)", + 'st.display.auto_screenshot.state_change': "राज्य परिवर्तन पर", 'st.display.auto_screenshot.every_step': "हर कदम", 'st.display.tracing.label': "रिकॉर्ड निशान (मॉडल तुलना के लिए)", - 'st.display.tracing.desc_html': "प्रत्येक रन (एलएलएम अनुरोध, प्रतिक्रिया, टूल कॉल, स्क्रीनशॉट) को स्थानीय IndexedDB में जारी रखें ताकि आप साथ-साथ मॉडलों का निरीक्षण और तुलना कर सकें। एक अलग ट्रेसेस टैब में खुलता है। डिफ़ॉल्ट रूप से बंद है क्योंकि यह प्रति चरण डिस्क राइट जोड़ता है। ट्रेस पेज खोलें →", - 'st.display.lossless_tracing.label': 'पूर्ण अनुरोध विवरण रिकॉर्ड करें (डीबग स्तर)', - 'st.display.lossless_tracing.desc_html': 'प्रत्येक LLM अनुरोध के पूर्ण प्रॉम्प्ट, संदेश और टूल स्कीमा को बिना सामग्री वाले सारांशों के बजाय सहेजता है, और प्रत्येक टूल परिणाम का 200 KB तक रखता है। गहन डीबगिंग और अनुरोध पुनर्निर्माण सक्षम करता है। डिफ़ॉल्ट रूप से बंद क्योंकि यह आपकी बातचीत की सामग्री को स्थानीय रूप से लिखता है और बहुत अधिक डिस्क उपयोग करता है। ट्रेस रिकॉर्डिंग चालू होना आवश्यक है।', + 'st.display.tracing.desc_html': "प्रत्येक रन (LLM अनुरोध, प्रतिक्रियाएँ, टूल कॉल, स्क्रीनशॉट) को स्थानीय IndexedDB में सहेजें ताकि आप मॉडलों को साथ-साथ जाँच और तुलना कर सकें — प्रत्येक LLM अनुरोध के पूर्ण प्रॉम्प्ट, संदेश और टूल स्कीमा तथा प्रत्येक टूल परिणाम के 200 KB तक सहित। एक अलग ट्रेसेस टैब में खुलता है। डिफ़ॉल्ट रूप से बंद क्योंकि यह आपकी बातचीत की सामग्री को स्थानीय रूप से लिखता है और बहुत अधिक डिस्क उपयोग करता है। ट्रेस पेज खोलें →", 'st.display.cost_session_limit.label': "क्लाउड लागत सत्र भत्ता", 'st.display.cost_session_limit.desc': "एक बार जब यह सत्र रिपोर्ट की गई या अनुमानित लागत भत्ता तक पहुंच जाता है, तो क्लाउड रुक जाता है और OpenRouter किसी अन्य भुगतान मॉडल कॉल से पहले चलता है। डिफ़ॉल्ट $10.", 'st.display.cost_total_limit.label': "क्लाउड लागत कुल भत्ता", 'st.display.cost_total_limit.desc': "ट्रैक रिपोर्ट किए गए या अनुमानित क्लाउड/OpenRouter मॉडल पूरे एक्सटेंशन में खर्च होते हैं और भत्ते पर आगे भुगतान किए गए कॉल को रोकते हैं। स्थानीय प्रदाताओं की गणना नहीं की जाती है.", 'st.display.cost_reset': "व्यय रीसेट करें", 'st.display.strict_secret.label': "सख्त गुप्त संचालन", - 'st.display.strict_secret.desc': "सारांश या सहायक पाठ में क्रेडेंशियल (पासवर्ड, एपीआई कुंजी, टोकन, ओटीपी) उद्धृत करने से इनकार करें - भले ही आप स्पष्ट रूप से उनके लिए पूछें। उपयोगी यदि आप नियमित रूप से ट्रेस फ़ाइलें या स्क्रीन-शेयर साझा करते हैं। डिफ़ॉल्ट रूप से बंद, ताकि एजेंट ज़रूरत पड़ने पर आपके द्वारा पूछा गया सटीक मान दोहरा सके। जब आप चाहते हैं कि `done` सारांश व्यवस्थित रहें और क्रेडेंशियल कभी न दोहराए जाएँ, तो इसे चालू करें (सेटिंग्स → सुरक्षा)।", + 'st.display.strict_secret.desc': "सारांश या सहायक पाठ में क्रेडेंशियल (पासवर्ड, एपीआई कुंजी, टोकन, ओटीपी) उद्धृत करने से इनकार करें - भले ही आप स्पष्ट रूप से उनके लिए पूछें। उपयोगी यदि आप नियमित रूप से ट्रेस फ़ाइलें या स्क्रीन-शेयर साझा करते हैं। डिफ़ॉल्ट रूप से बंद, ताकि एजेंट ज़रूरत पड़ने पर आपके द्वारा पूछा गया सटीक मान दोहरा सके। जब आप चाहते हैं कि `done` सारांश व्यवस्थित रहें और क्रेडेंशियल कभी न दोहराए जाएँ, तो इसे चालू करें।", 'st.display.allow_local_network.label': "एजेंट को स्थानीय नेटवर्क तक पहुंचने की अनुमति दें", 'st.display.allow_local_network.desc': "एजेंट के फ़ेच_यूआरएल टूल को लूपबैक (127.0.0.1, localhost) और निजी/RFC1918 पते (10.x, 192.168.x, 172.16–31.x) तक पहुंचने देता है। स्थानीय डेव सर्वर, इंट्रानेट टूल या स्वयं-होस्टेड एपीआई के लिए उपयोगी। डिफ़ॉल्ट रूप से बंद। बंद होने पर सीधे निजी या लूपबैक IP पते वाले URL और localhost नाम अवरुद्ध होते हैं। DNS रिज़ॉल्यूशन की जाँच नहीं होती, इसलिए अन्य होस्टनाम स्थानीय पतों तक पहुँच सकते हैं। क्लाउड-मेटाडेटा के सीधे IP पते (169.254.169.254) और सूचीबद्ध मेटाडेटा या *.internal/*.local होस्टनाम चालू होने पर भी अवरुद्ध रहते हैं।", 'st.display.scheduled_tasks.label': "निर्धारित कार्य", @@ -890,7 +887,7 @@ export default { 'st.providers.compat.value.max': "अधिकतम", 'st.providers.compat.value.system': "सिस्टम", 'st.providers.compat.value.developer': "डेवलपर", - 'st.providers.webbrain_data_use.body': "मुफ़्त दैनिक WebBrain Compass उपयोग शामिल है। जबकि हेल्प इम्प्रूव WebBrain डिफ़ॉल्ट रूप से चालू है, चयनित Compass वार्तालापों को बनाए रखा जा सकता है और मूल्यांकन, सुधार, फाइन-ट्यूनिंग और प्रशिक्षण के लिए उपयोग किया जा सकता है। उन उपयोगों से भविष्य के Compass इंटरैक्शन को बाहर करने के लिए इसे सामान्य → उन्नत में बंद करें। WebBrain स्थानीय-मॉडल और आपके स्वयं के API अनुरोध केवल तभी एकत्र करता है जब आप उस प्रदाता का “अनुसंधान हेतु क्वेरी साझा करें” विकल्प चालू करते हैं। {privacyLink}. अधिक उपयोग के लिए, {subscribeLink} पर सदस्यता लें। {accountLink} पर बिलिंग प्रबंधित करें।", + 'st.providers.webbrain_data_use.body': "मुफ़्त दैनिक WebBrain Compass उपयोग शामिल है। जबकि हेल्प इम्प्रूव WebBrain डिफ़ॉल्ट रूप से चालू है, चयनित Compass वार्तालापों को बनाए रखा जा सकता है और मूल्यांकन, सुधार, फाइन-ट्यूनिंग और प्रशिक्षण के लिए उपयोग किया जा सकता है। उन उपयोगों से भविष्य के Compass इंटरैक्शन को बाहर करने के लिए इसे सेटिंग्स → उन्नत में बंद करें। WebBrain स्थानीय-मॉडल और आपके स्वयं के API अनुरोध केवल तभी एकत्र करता है जब आप उस प्रदाता का “अनुसंधान हेतु क्वेरी साझा करें” विकल्प चालू करते हैं। {privacyLink}. अधिक उपयोग के लिए, {subscribeLink} पर सदस्यता लें। {accountLink} पर बिलिंग प्रबंधित करें।", 'st.providers.share_research.label': "अनुसंधान हेतु क्वेरी साझा करें", 'st.providers.share_research.hint': "इस प्रदाता के प्रॉम्प और प्रतिक्रियाएँ मूल्यांकन और सुधार हेतु WebBrain को भेजता है, जिसमें प्रयुक्त प्रदाता और मॉडल शामिल हैं। साझा करने से पहले चित्र और बाइनरी अनुलग्नक हटाए जाते हैं और पाठ छोटा किया जाता है; शेष पाठ ज्यों-का-त्यों भेजा जाता है।", 'st.providers.share_research.confirm': "क्या इस प्रदाता की क्वेरी अनुसंधान हेतु WebBrain के साथ साझा करें?\n\nचालू होने पर, इस प्रदाता के साथ आपके प्रॉम्प, प्रतिक्रियाएँ और टूल इंटरैक्शन प्रदाता और मॉडल के नाम सहित मूल्यांकन और सुधार हेतु WebBrain को भेजे जाएँगे। चित्र हटाने और लंबी सामग्री छोटा करने के बाद पाठ ज्यों-का-त्यों भेजा जाता है, इसलिए संवेदनशील व्यक्तिगत डेटा साझा करने से बचें। भविष्य में साझा करना रोकने हेतु आप इसे कभी भी बंद कर सकते हैं।", @@ -1035,7 +1032,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "स्क्रीनशॉट संशोधन", 'st.redaction.toggle.label': "स्क्रीनशॉट से संवेदनशील सामग्री को संपादित करें", 'st.redaction.toggle.desc': "विज़न मॉडल पर स्क्रीनशॉट भेजने से पहले, फॉर्म फ़ील्ड और टेक्स्ट को धुंधला कर दें जो ईमेल या फ़ोन नंबर जैसा दिखता है। डिटेक्शन पूरी तरह से आपके डिवाइस पर चलता है - अतिरिक्त कुछ भी प्रसारित नहीं होता है।", 'st.redaction.warning': "⚠️ सर्वश्रेष्ठ-प्रयास और असफल-ओपन: यदि किसी पृष्ठ पर संपादन नहीं चल सकता है (उदाहरण के लिए नेविगेशन के ठीक बाद, पीडीएफ दर्शकों पर, या प्रतिबंधित ब्राउज़र पृष्ठों पर), तो स्क्रीनशॉट अभी भी बिना संपादित किए भेजा जाता है। डिटेक्शन केवल DOM ह्यूरिस्टिक्स का उपयोग करता है - कैनवास-तैयार पाठ, छवियों के अंदर पीआईआई, या फॉर्म फ़ील्ड या ईमेल/फोन टेक्स्ट के रूप में पहचानी नहीं गई कोई भी चीज़ फिसल सकती है, और मॉडल को भेजा गया पेज टेक्स्ट इस सेटिंग द्वारा संपादित नहीं किया जाता है। यह कोई सुरक्षा गारंटी नहीं है. पूर्ण गोपनीयता के लिए, स्थानीय/ऑफ़लाइन मॉडल (llama.cpp, Ollama) का उपयोग करें: स्क्रीनशॉट कभी भी आपकी मशीन को नहीं छोड़ते हैं और संपादन अनावश्यक है।", @@ -1223,7 +1219,7 @@ export default { "sp.slash.export_traces_full": "स्क्रीनशॉट सहित पूरा सहेजा गया ट्रेस सत्र JSON के रूप में निर्यात करें", "sp.export_traces.recording_truncated": "सभी सहेजे गए रिकॉर्ड JSON में निर्यात हो गए। रिकॉर्डिंग के दौरान छोड़ी गई सामग्री निर्यात से वापस नहीं मिल सकती।", "sp.slash.export_traces": "उपकरण श्रृंखला (निशान) निर्यात करें", - "sp.export_traces.none": "इस बातचीत का कोई निशान नहीं. सेटिंग्स में रिकॉर्ड ट्रेस सक्षम करें, फिर से चलाएँ।", + "sp.export_traces.none": "इस बातचीत का कोई निशान नहीं. सेटिंग्स → उन्नत में रिकॉर्ड ट्रेस सक्षम करें, फिर से चलाएँ।", "sp.export_traces.error": "निशान निर्यात नहीं किए जा सके.", "sp.export_traces.done": "टूल श्रृंखला निर्यात की गई.", "sp.export_traces.no_conversation": "अभी तक निर्यात करने के लिए कुछ भी नहीं है - पहले बातचीत शुरू करें।", @@ -1297,7 +1293,7 @@ export default { "st.sync.confirm.reset": "क्या एन्क्रिप्टेड क्लाउड कॉपी को इस डिवाइस के मौजूदा WebBrain सेटअप से बदलना है?", "st.sync.consent.legacy": "एन्क्रिप्टेड सिंक चालू करें? WebBrain आपकी यादों, प्रोफ़ाइल ऑटोफ़िल और API-कुंजी प्रदाता सेटिंग्स की एंड-टू-एंड एन्क्रिप्टेड कॉपी WebBrain Compass को भेजेगा। चैट इतिहास और OAuth साइन-इन सिंक नहीं किए जाते।", "st.sync.consent.denied": "एन्क्रिप्टेड सिंक अनुमति नहीं दी गई थी.", - 'st.providers.webgpu_note.body': '{modelLink} बिना किसी API एंडपॉइंट के पूरी तरह Chrome में चलता है। इसे Settings > Providers > WebGPU या Apocalypse Mode में डाउनलोड करें, फिर standalone chat में nuclear control का उपयोग करें।', + 'st.providers.webgpu_note.body': '{modelLink} बिना किसी API एंडपॉइंट के पूरी तरह Chrome में चलता है। इसे Providers > WebGPU या Apocalypse Mode में डाउनलोड करें, फिर standalone chat में nuclear control का उपयोग करें।', 'sp.monitor.navigation': "काम चलने के दौरान पेज बदल गया ({before} → {after})। काम जारी है।", 'sp.activity.generating_answer': "उत्तर तैयार हो रहा है…", 'sp.activity.retrying_response': "उत्तर के लिए फिर प्रयास हो रहा है…", diff --git a/src/firefox/src/ui/locales/id.js b/src/firefox/src/ui/locales/id.js index 979380c871..3232573899 100644 --- a/src/firefox/src/ui/locales/id.js +++ b/src/firefox/src/ui/locales/id.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Perkecil UI ekstensi', 'sp.ui_scale.increase': 'Perbesar UI ekstensi', 'sp.ui_scale.reset': 'Atur ulang', - 'st.display.ui_scale.label': 'Zoom UI ekstensi', - 'st.display.ui_scale.decrease': 'Perkecil UI ekstensi', - 'st.display.ui_scale.increase': 'Perbesar UI ekstensi', - 'st.display.ui_scale.reset': 'Atur ulang', - 'st.display.ui_scale.desc': 'Ubah ukuran panel samping dan jendela chat terpisah tanpa mengubah zoom halaman.', - 'st.display.ui_scale.shortcuts': 'Pintasan khusus: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Belum ditetapkan', - 'st.display.ui_scale.manage_shortcuts': 'Sesuaikan pintasan', 'tool.delegate_research': 'Meneliti dengan ChatGPT', 'st.display.research_escalation.label': 'Eskalasi riset', 'st.display.research_escalation.desc': 'Jika diaktifkan, WebBrain dapat meminta izin sebelum mengirim prompt riset hanya-baca yang sangat kompleks ke ChatGPT. Nonaktif secara default. Prompt yang persis sama hanya dibagikan setelah persetujuan eksplisit Anda.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Jangan lanjutkan", "sp.recipient.reason_unrequested": "WebBrain tidak dapat memastikan dari permintaan Anda bahwa pesan harus dikirim. Percakapan yang terbuka di {host} adalah dengan {recipient}.", "sp.recipient.reason_unnamed": "WebBrain tidak dapat memastikan dari permintaan Anda siapa yang harus menerima pesan ini. Percakapan yang terbuka di {host} adalah dengan {recipient}.", - 'st.tab.permissions': "Izin", 'st.perms.revoke': "Cabut", 'st.perms.clear_all': "Hapus semua izin", 'st.perms.gate.label': "Tanya sebelum tindakan penting", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Mulai', 'ob.btn.skip': 'Lewati dulu', 'ob.btn.start': 'Mulai', - 'ob.cloud.body': 'WebBrain Compass siap dengan alokasi mingguan gratis. Percakapan Compass yang dipilih dapat disimpan dan digunakan untuk meningkatkan WebBrain selama Bantu Tingkatkan WebBrain aktif secara default. Anda dapat mematikannya di Pengaturan → Umum.', + 'ob.cloud.body': 'WebBrain Compass siap dengan alokasi mingguan gratis. Percakapan Compass yang dipilih dapat disimpan dan digunakan untuk meningkatkan WebBrain selama Bantu Tingkatkan WebBrain aktif secara default. Anda dapat mematikannya di Pengaturan → Lanjutan.', 'ob.cloud.change': 'Ubah', 'ob.cloud.using': 'Menggunakan WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Hasil', 'sp.api.enabled_html': '🔓 Perubahan melalui API diaktifkan untuk percakapan ini. Agen kini dapat menggunakan POST/PUT/PATCH/DELETE melalui fetch_url dan execute_js bila menilai API lebih andal daripada UI untuk suatu langkah. UI tetap menjadi pilihan utama secara bawaan. Flag ini akan terhapus saat Anda mereset percakapan.', - 'sp.permissions.disabled_html': '⚠️ Pertanyaan izin dimatikan. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, merekam, dan menjadwalkan pekerjaan mendatang tanpa bertanya terlebih dahulu. Aktifkan kembali dari Pengaturan → Izin → Tanya sebelum tindakan penting.', + 'sp.permissions.disabled_html': '⚠️ Pertanyaan izin dimatikan. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, merekam, dan menjadwalkan pekerjaan mendatang tanpa bertanya terlebih dahulu. Aktifkan kembali dari tombol ⚠ di samping mikrofon.', 'sp.permissions.button': 'Permintaan izin: aktif', 'sp.permissions.button_off': 'Permintaan izin: nonaktif', 'sp.permissions.gate_desc': 'WebBrain bertanya saat pertama kali mengklik, mengetik, mengunduh, atau menjalankan kode di sebuah situs.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Menunggu "{selector}"', 'st.title': 'Pengaturan WebBrain', - 'st.subtitle': 'Konfigurasikan penyedia LLM dan preferensi · v{version}', + 'st.subtitle': 'Konfigurasikan cara kerja WebBrain · v{version}', 'st.tab.display': 'Umum', + 'st.tab.budgets': 'Anggaran', + 'st.tab.advanced': 'Lanjutan', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Ucapan', + 'st.tab.generative': 'Generatif', + 'st.tab.decision': 'Keputusan', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Penyedia WebBrain', + 'st.providers_page.subtitle': 'Pilih model yang digunakan WebBrain · v{version}', + 'st.permissions_page.title': 'Izin WebBrain', + 'st.permissions_page.subtitle': 'Situs tempat WebBrain boleh bertindak tanpa bertanya dulu', 'st.tab.providers': 'Penyedia', 'st.tab.vision': 'Visi', 'st.tab.profile': 'Profil', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Perbarui metode pembayaran", 'st.account.manage_billing': 'Kelola penagihan', - 'st.display.language.label': 'Bahasa', - 'st.display.language.desc': 'Bahasa antarmuka untuk plugin WebBrain.', 'st.display.verbose.label': 'Mode terperinci', 'st.display.verbose.desc': 'Tampilkan detail lengkap pemanggilan alat, argumen, dan hasil JSON mentah. Nonaktif secara bawaan demi tampilan obrolan yang lebih bersih.', 'st.display.selection_shortcut.label': 'Pintasan pilihan', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Tangkapan layar otomatis', "st.display.auto_screenshot.desc": "Ambil tangkapan layar viewport secara otomatis setelah agen bertindak pada halaman, agar rute visi yang dipilih dapat melihat perubahan. Ini memakai lebih banyak token. Jika visi tidak tersedia, pengayaan dilewati dan tugas berlanjut dengan pemberitahuan status.", 'st.display.auto_screenshot.off': 'Nonaktif', - 'st.display.auto_screenshot.navigation': 'Saat navigasi', - 'st.display.auto_screenshot.state_change': 'Saat perubahan status (bawaan)', + 'st.display.auto_screenshot.navigation': 'Saat navigasi (bawaan)', + 'st.display.auto_screenshot.state_change': 'Saat perubahan status', 'st.display.auto_screenshot.every_step': 'Setiap langkah', 'st.display.tracing.label': 'Rekam jejak (untuk perbandingan model)', - 'st.display.tracing.desc_html': 'Simpan setiap proses (permintaan LLM, respons, pemanggilan alat, tangkapan layar) ke IndexedDB lokal sehingga Anda dapat memeriksa dan membandingkan model berdampingan. Membuka tab Jejak terpisah. Nonaktif secara bawaan karena menambah penulisan disk per langkah. Buka halaman Jejak →', - 'st.display.lossless_tracing.label': 'Rekam detail lengkap permintaan (tingkat debug)', - 'st.display.lossless_tracing.desc_html': 'Juga menyimpan prompt, pesan, dan skema alat lengkap dari setiap permintaan LLM alih-alih ringkasan tanpa konten, dan menyimpan hingga 200 KB setiap hasil alat. Memungkinkan debug mendalam dan rekonstruksi permintaan. Nonaktif secara default karena menulis konten percakapan Anda secara lokal dan memakai disk jauh lebih banyak. Memerlukan perekaman trace aktif.', + 'st.display.tracing.desc_html': 'Simpan setiap proses (permintaan LLM, respons, pemanggilan alat, tangkapan layar) ke IndexedDB lokal sehingga Anda dapat memeriksa dan membandingkan model berdampingan, termasuk prompt, pesan, dan skema alat lengkap dari setiap permintaan LLM serta hingga 200 KB setiap hasil alat. Membuka tab Jejak terpisah. Nonaktif secara bawaan karena menulis konten percakapan Anda secara lokal dan memakai disk jauh lebih banyak. Buka halaman Jejak →', 'st.display.allow_local_network.label': 'Izinkan agen mengakses jaringan lokal', 'st.display.allow_local_network.desc': 'Memungkinkan alat fetch_url agen menjangkau loopback (127.0.0.1, localhost) dan alamat privat/RFC1918 (10.x, 192.168.x, 172.16–31.x). Berguna untuk server pengembangan lokal, alat intranet, atau API yang di-host sendiri. Nonaktif secara bawaan. Saat nonaktif, URL dengan alamat IP privat atau loopback yang ditulis langsung dan nama localhost diblokir. Resolusi DNS tidak diperiksa, sehingga nama host lain masih dapat menjangkau alamat lokal. IP literal metadata cloud (169.254.169.254) dan nama metadata dalam daftar atau *.internal/*.local tetap diblokir meskipun diaktifkan.', 'st.display.notify_sound.label': "Suara notifikasi", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Mode visi diaktifkan untuk penyedia aktif.", "sp.vision.off": "Mode visi dinonaktifkan untuk penyedia aktif.", "sp.vision.error": "Pengalihan visi gagal: {msg}", - "st.tab.multimodal": "Model Pendukung", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Disarankan. Saat aktif, WebBrain meminta izin pertama kali ia mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, atau merekam pada sebuah situs (lalu mengingat pilihan Anda). Matikan untuk penggunaan cepat tanpa konfirmasi pada situs yang sepenuhnya Anda percayai.", "st.perms.gate.warning": "⚠️ Konfirmasi izin NONAKTIF. WebBrain akan mengeklik, mengetik, menavigasi, menjalankan JavaScript, mengunggah, mengunduh, dan merekam pada situs apa pun TANPA bertanya — termasuk pada halaman yang kontennya mungkin dikendalikan penyerang. Konten halaman tetap diperlakukan sebagai tidak tepercaya secara internal, tetapi tidak ada yang akan mencegah instruksi yang disisipkan memicu sebuah tindakan. Biarkan nonaktif hanya jika Anda sepenuhnya memercayai setiap situs tempat Anda memakai asisten ini.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Bawaan sistem", "st.display.download_directory.error": "Gunakan folder relatif seperti WebBrain atau Work/WebBrain. Jalur absolut dan “..” tidak diizinkan.", "st.display.strict_secret.label": "Penanganan rahasia ketat", - "st.display.strict_secret.desc": "Menolak mengutip kredensial (kata sandi, kunci API, token, OTP) dalam ringkasan atau teks asisten — bahkan saat Anda memintanya secara eksplisit. Berguna jika Anda kerap berbagi berkas jejak atau berbagi layar. Nonaktif secara bawaan sehingga agen dapat mengulang nilai persis yang Anda minta saat Anda membutuhkannya. Aktifkan (Pengaturan → Keamanan) jika Anda ingin ringkasan `done` tetap rapi dan kredensial tidak pernah diulang.", + "st.display.strict_secret.desc": "Menolak mengutip kredensial (kata sandi, kunci API, token, OTP) dalam ringkasan atau teks asisten — bahkan saat Anda memintanya secara eksplisit. Berguna jika Anda kerap berbagi berkas jejak atau berbagi layar. Nonaktif secara bawaan sehingga agen dapat mengulang nilai persis yang Anda minta saat Anda membutuhkannya. Aktifkan jika Anda ingin ringkasan `done` tetap rapi dan kredensial tidak pernah diulang.", "st.display.request_timeout.label": "Batas waktu permintaan LLM", "st.display.request_timeout.desc": "Batas waktu menunggu header respons dan setiap jeda antarbagian respons streaming. Bawaan: 120 detik. Naikkan untuk model lokal yang lambat, terutama pada CPU atau dengan konteks besar.", "st.providers.filter.all": "Semua", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Pesan dimasukkan ke antrean saat WebBrain sibuk. Hanya /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, dan /verbose yang dapat langsung berjalan sebagai perintah slash.', 'tool.go_back': 'Kembali', 'tool.go_forward': 'Maju', - 'st.display.search.placeholder': 'Cari pengaturan Umum', - 'st.display.search.empty': 'Tidak ada pengaturan Umum yang cocok.', + 'st.display.search.placeholder': 'Cari pengaturan', + 'st.display.search.empty': 'Tidak ada pengaturan yang cocok.', 'st.display.advanced': 'Lanjutan', ...getApocalypseModeCopy('id'), ...getEmergencyBoxCopy('id'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Sisi terpanjang (lebar atau tinggi) dalam piksel untuk setiap tangkapan yang dikirim ke visi. Batas lebih kecil mengecilkan gambar sebelum dikirim, mengurangi token dan biaya. Batas lebih besar menjaga fidelitas.", "st.imageBudget.warning": "⚠️ Pengaturan ini berlaku untuk tangkapan untuk visi (tangkapan otomatis, /screenshot, halaman penuh, verify_form). Gambar resolusi penuh yang disimpan manual tidak terpengaruh. «Image detail» dihormati endpoint bergaya OpenAI; penyedia lain mungkin mengabaikannya.", - "st.redaction.heading": "Penyamaran tangkapan layar", "st.redaction.toggle.label": "Samarkan konten sensitif pada tangkapan layar", "st.redaction.toggle.desc": "Sebelum tangkapan layar dikirim ke model visi, WebBrain mengaburkan kolom formulir dan teks yang terlihat seperti email atau nomor telepon. Pendeteksian berjalan sepenuhnya di perangkat Anda — tidak ada yang dikirim ekstra.", "st.redaction.warning": "⚠️ Ini bersifat best-effort dan fail-open: jika penyamaran tidak bisa berjalan di suatu halaman (misalnya tepat setelah navigasi, di penampil PDF, atau di halaman browser yang dibatasi), tangkapan layar tetap dikirim tanpa disamarkan. Pendeteksian hanya menggunakan heuristik DOM — teks yang digambar di canvas, informasi pribadi di dalam gambar, atau apa pun yang tidak dikenali sebagai kolom formulir atau teks email/telepon bisa saja lolos, dan teks halaman yang dikirim ke model tidak disamarkan oleh pengaturan ini. Ini BUKAN jaminan keamanan. Untuk privasi penuh, gunakan model lokal/offline (llama.cpp, Ollama): tangkapan layar tidak akan pernah meninggalkan perangkat Anda dan penyamaran pun jadi tidak diperlukan.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Ekspor seluruh sesi jejak tersimpan sebagai JSON, termasuk tangkapan layar", "sp.export_traces.recording_truncated": "Semua catatan tersimpan telah diekspor sebagai JSON. Konten yang dihilangkan saat perekaman tidak dapat dipulihkan melalui ekspor.", "sp.slash.export_traces": "Ekspor rantai alat (jejak)", - "sp.export_traces.none": "Tidak ada jejak untuk percakapan ini. Aktifkan Rekam jejak di Pengaturan, lalu jalankan lagi.", + "sp.export_traces.none": "Tidak ada jejak untuk percakapan ini. Aktifkan Rekam jejak di Pengaturan → Lanjutan, lalu jalankan lagi.", "sp.export_traces.error": "Tidak dapat mengekspor jejak.", "sp.export_traces.done": "Rantai alat diekspor.", "sp.export_traces.no_conversation": "Belum ada yang diekspor — mulai percakapan dulu.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Rantai alat diekspor. Giliran lama mungkin hilang jika percakapan ini punya banyak jejak.", "st.display.help_improve.label": "Bantu Tingkatkan WebBrain", "st.display.help_improve.desc_html": "Izinkan interaksi WebBrain Compass tertentu disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Aktif secara default. Nonaktifkan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri dari penyedia tempat Anda mengaktifkan “Bagikan kueri untuk riset”. Kebijakan privasi →", - "st.providers.webbrain_data_use.body": "Penggunaan harian gratis WebBrain Compass sudah termasuk. Saat Bantu Tingkatkan WebBrain aktif secara default, percakapan Compass tertentu dapat disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Nonaktifkan di Umum → Lanjutan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri jika Anda mengaktifkan opsi “Bagikan kueri untuk riset” penyedia ini. {privacyLink}. Untuk penggunaan lebih banyak, berlangganan di {subscribeLink}. Kelola penagihan di {accountLink}.", + "st.providers.webbrain_data_use.body": "Penggunaan harian gratis WebBrain Compass sudah termasuk. Saat Bantu Tingkatkan WebBrain aktif secara default, percakapan Compass tertentu dapat disimpan dan digunakan untuk evaluasi, peningkatan, penyempurnaan, dan pelatihan. Nonaktifkan di Pengaturan → Lanjutan agar interaksi Compass mendatang tidak digunakan untuk tujuan tersebut. WebBrain hanya mengumpulkan permintaan model lokal dan API Anda sendiri jika Anda mengaktifkan opsi “Bagikan kueri untuk riset” penyedia ini. {privacyLink}. Untuk penggunaan lebih banyak, berlangganan di {subscribeLink}. Kelola penagihan di {accountLink}.", 'st.providers.share_research.label': "Bagikan kueri untuk riset", 'st.providers.share_research.hint': "Mengirim prompt dan respons dari penyedia ini ke WebBrain untuk evaluasi dan peningkatan, termasuk penyedia dan model yang digunakan. Gambar dan lampiran biner dihapus dan teks dipotong sebelum dibagikan; sisa teks dikirim apa adanya.", 'st.providers.share_research.confirm': "Bagikan kueri dari penyedia ini dengan WebBrain untuk riset?\n\nJika aktif, prompt, respons, dan interaksi alat Anda dengan penyedia ini akan dikirim ke WebBrain untuk evaluasi dan peningkatan, beserta nama penyedia dan model. Teks dikirim apa adanya setelah gambar dihapus dan konten panjang dipotong, jadi hindari membagikan data pribadi yang sensitif. Anda dapat mematikannya kapan saja untuk menghentikan berbagi.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Ingin lebih sedikit gangguan? “Selalu izinkan” mengingat situs ini. Perintah di bawah menonaktifkan permintaan izin WebBrain di semua situs.", "sp.perm.insert_skip_command": "Sisipkan /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Draf Anda tidak berubah. Kosongkan sebelum menyisipkan perintah.", - "ob.act.permissions_tip": "Permintaan izin aktif secara default. Pengguna tingkat lanjut dapat menonaktifkannya secara global dengan /dangerously-skip-permissions dan mengaktifkannya kembali di Pengaturan → Izin.", + "ob.act.permissions_tip": "Permintaan izin aktif secara default. Pengguna tingkat lanjut dapat menonaktifkannya secara global dengan /dangerously-skip-permissions dan mengaktifkannya kembali dari tombol ⚠ di samping mikrofon.", 'st.provider.field.cache_read_cost_per_million': "Perkiraan biaya baca cache ($ / 1 juta token)", 'st.provider.field.cache_write_cost_per_million': "Perkiraan biaya tulis cache 5 menit ($ / 1 juta token)", 'st.provider.field.cache_write_1h_cost_per_million': "Perkiraan biaya tulis cache 1 jam ($ / 1 juta token)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Ganti salinan cloud terenkripsi dengan pengaturan WebBrain perangkat ini saat ini?", "st.sync.consent.legacy": "Aktifkan sinkronisasi terenkripsi? WebBrain akan mengirimkan salinan memori Anda yang terenkripsi ujung ke ujung, pengisian otomatis profil, dan pengaturan penyedia kunci API ke WebBrain Compass. Riwayat obrolan dan proses masuk OAuth tidak disinkronkan.", "st.sync.consent.denied": "Izin sinkronisasi terenkripsi tidak diberikan.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Halaman berubah saat tugas berjalan ({before} → {after}). Tugas dilanjutkan.", 'sp.activity.generating_answer': "Membuat jawaban…", 'sp.activity.retrying_response': "Mencoba ulang jawaban…", diff --git a/src/firefox/src/ui/locales/ja.js b/src/firefox/src/ui/locales/ja.js index 4902105ff8..94dd24fa19 100644 --- a/src/firefox/src/ui/locales/ja.js +++ b/src/firefox/src/ui/locales/ja.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '拡張機能 UI を縮小', 'sp.ui_scale.increase': '拡張機能 UI を拡大', 'sp.ui_scale.reset': 'リセット', - 'st.display.ui_scale.label': '拡張機能 UI のズーム', - 'st.display.ui_scale.decrease': '拡張機能 UI を縮小', - 'st.display.ui_scale.increase': '拡張機能 UI を拡大', - 'st.display.ui_scale.reset': 'リセット', - 'st.display.ui_scale.desc': 'ページのズームを変更せずに、サイドパネルと独立したチャットウィンドウのサイズを変更します。', - 'st.display.ui_scale.shortcuts': '専用ショートカット: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': '未設定', - 'st.display.ui_scale.manage_shortcuts': 'ショートカットをカスタマイズ', 'tool.delegate_research': 'ChatGPTで調査中', 'st.display.research_escalation.label': '調査のエスカレーション', 'st.display.research_escalation.desc': '有効にすると、WebBrainは非常に複雑な読み取り専用の調査プロンプトをChatGPTへ送信する前に許可を求めることがあります。デフォルトではオフです。正確なプロンプトは、明示的な承認後にのみ共有されます。', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "続行しない", "sp.recipient.reason_unrequested": "WebBrain はリクエストから、メッセージを送るべきかどうか判断できませんでした。{host} で開いている会話の相手は {recipient} です。", "sp.recipient.reason_unnamed": "WebBrain はリクエストから、このメッセージを誰に送るか判断できませんでした。{host} で開いている会話の相手は {recipient} です。", - 'st.tab.permissions': "権限", 'st.perms.revoke': "取り消す", 'st.perms.clear_all': "すべての権限を消去", 'st.perms.gate.label': "重要な操作の前に確認する", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '開始', 'ob.btn.skip': '今はスキップ', 'ob.btn.start': '開始', - 'ob.cloud.body': 'WebBrain Compassは1週間あたりの無料割り当てで準備できています。選択したCompass会話は、WebBrainの改善支援がデフォルトでオンになっている間、WebBrainの改善のために保存および使用される可能性があります。設定 → 一般でオフにできます。', + 'ob.cloud.body': 'WebBrain Compassは1週間あたりの無料割り当てで準備できています。選択したCompass会話は、WebBrainの改善支援がデフォルトでオンになっている間、WebBrainの改善のために保存および使用される可能性があります。設定 → 詳細設定でオフにできます。', 'ob.cloud.change': '変更', 'ob.cloud.using': 'WebBrain Compassを使用しています。', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '結果', 'sp.api.enabled_html': '🔓 この会話で API による変更が有効 になりました。エージェントは UI より API のほうが確実だと判断したとき、fetch_url と execute_js で POST/PUT/PATCH/DELETE を使えるようになります。UI 優先という基本方針は変わりません。このフラグは会話をリセットするとクリアされます。', - 'sp.permissions.disabled_html': '⚠️ 権限の確認がオフです。 WebBrain は確認なしにクリック、入力、移動、JavaScript の実行、アップロード、ダウンロード、録画、将来の作業のスケジュールを行います。設定 → 権限 → 重要な操作の前に確認する から再有効にしてください。', + 'sp.permissions.disabled_html': '⚠️ 権限の確認がオフです。 WebBrain は確認なしにクリック、入力、移動、JavaScript の実行、アップロード、ダウンロード、録画、将来の作業のスケジュールを行います。マイクの横の ⚠ ボタンから再び有効にしてください。', 'sp.permissions.button': '権限の確認: オン', 'sp.permissions.button_off': '権限の確認: オフ', 'sp.permissions.gate_desc': 'サイトで初めてクリック、入力、ダウンロード、コードの実行を行う前に WebBrain が確認します。', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': '「{selector}」を待機', 'st.title': 'WebBrain 設定', - 'st.subtitle': 'LLM プロバイダーと設定を構成 · v{version}', + 'st.subtitle': 'WebBrain の動作を設定 · v{version}', 'st.tab.display': '一般', + 'st.tab.budgets': '予算', + 'st.tab.advanced': '詳細設定', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '音声', + 'st.tab.generative': '生成', + 'st.tab.decision': '判定', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain プロバイダー', + 'st.providers_page.subtitle': 'WebBrain が使うモデルを選択 · v{version}', + 'st.permissions_page.title': 'WebBrain の権限', + 'st.permissions_page.subtitle': 'WebBrain が確認せずに操作できるサイト', 'st.tab.providers': 'プロバイダー', 'st.tab.vision': '画像認識', 'st.tab.profile': 'プロフィール', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "支払い方法を更新", 'st.account.manage_billing': '請求を管理', - 'st.display.language.label': '言語', - 'st.display.language.desc': 'WebBrain プラグインのインターフェース言語です。', 'st.display.verbose.label': '詳細モード', 'st.display.verbose.desc': 'ツール呼び出しの詳細・引数・生の JSON 結果をすべて表示します。チャットをすっきり見せるため、デフォルトはオフです。', 'st.display.selection_shortcut.label': '選択ショートカット', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': '自動スクリーンショット', "st.display.auto_screenshot.desc": "エージェントがページを操作した後にビューポートのスクリーンショットを自動取得し、選択された画像認識ルートで変化を確認できるようにします。トークン消費が増えます。画像認識が利用できない場合は補足処理を省略し、状態通知を表示してタスクを続行します。", 'st.display.auto_screenshot.off': 'オフ', - 'st.display.auto_screenshot.navigation': '遷移時', - 'st.display.auto_screenshot.state_change': '状態変化時(デフォルト)', + 'st.display.auto_screenshot.navigation': '遷移時(デフォルト)', + 'st.display.auto_screenshot.state_change': '状態変化時', 'st.display.auto_screenshot.every_step': '毎ステップ', 'st.display.tracing.label': 'トレースを記録(モデル比較用)', - 'st.display.tracing.desc_html': 'すべての実行(LLM リクエスト、レスポンス、ツール呼び出し、スクリーンショット)をローカルの IndexedDB に保存し、モデルを並べて検査・比較できるようにします。別の「トレース」タブで開きます。毎ステップで書き込みが増えるためデフォルトはオフです。トレースページを開く →', - 'st.display.lossless_tracing.label': 'リクエストの完全な詳細を記録(デバッグ層)', - 'st.display.lossless_tracing.desc_html': '各LLMリクエストの完全なプロンプト・メッセージ・ツールスキーマを、内容を含まない要約の代わりに保存し、各ツール結果を最大200KB保持します。深いデバッグとリクエスト再構築が可能になります。会話内容をローカルに書き込み、ディスク消費が大幅に増えるため、既定ではオフです。トレース記録の有効化が必要です。', + 'st.display.tracing.desc_html': 'すべての実行(LLM リクエスト、レスポンス、ツール呼び出し、スクリーンショット)をローカルの IndexedDB に保存し、モデルを並べて検査・比較できるようにします。各 LLM リクエストの完全なプロンプト・メッセージ・ツールスキーマと、各ツール結果の最大 200KB も保存されます。別の「トレース」タブで開きます。会話内容をローカルに書き込み、ディスク消費が大幅に増えるため、既定ではオフです。トレースページを開く →', 'st.display.allow_local_network.label': 'エージェントにローカルネットワークへのアクセスを許可', 'st.display.allow_local_network.desc': 'エージェントの fetch_url ツールがループバック(127.0.0.1、localhost)やプライベート/RFC1918 アドレス(10.x、192.168.x、172.16–31.x)に届くようになります。ローカル開発サーバー、社内ツール、セルフホスト API に便利です。デフォルトはオフです。オフの場合、プライベート IP やループバック IP を直接記述した URL と localhost のホスト名をブロックします。DNS の名前解決は確認しないため、別のホスト名からローカルアドレスに接続できる場合があります。クラウドメタデータの IP リテラル(169.254.169.254)と、指定のメタデータ名または *.internal/*.local はオンでもブロックされます。', 'st.display.notify_sound.label': "通知サウンド", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "アクティブなプロバイダーで画像認識モードを有効にしました。", "sp.vision.off": "アクティブなプロバイダーで画像認識モードを無効にしました。", "sp.vision.error": "画像認識の切り替えに失敗しました: {msg}", - "st.tab.multimodal": "補助モデル", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "推奨。オンにすると、WebBrain はサイトで初めてクリック・入力・移動・JavaScript の実行・アップロード・ダウンロード・録画を行うときに権限を尋ねます(その後はあなたの選択を記憶します)。完全に信頼できるサイトで、確認なしに素早く使いたい場合はオフにしてください。", "st.perms.gate.warning": "⚠️ 権限の確認がオフです。WebBrain はあらゆるサイトで確認なしにクリック・入力・移動・JavaScript の実行・アップロード・ダウンロード・録画を行います — 内容が攻撃者に操作されている可能性のあるページでも同様です。ページの内容は内部的には引き続き信頼できないものとして扱われますが、注入された指示が操作を引き起こすのを止めるものは何もありません。アシスタントを使うすべてのサイトを完全に信頼できる場合にのみ、これをオフのままにしてください。", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "システムの既定値", "st.display.download_directory.error": "WebBrain や Work/WebBrain のような相対フォルダーを指定してください。絶対パスと「..」は使用できません。", "st.display.strict_secret.label": "資格情報の厳格な取り扱い", - "st.display.strict_secret.desc": "要約やアシスタントの文章の中で資格情報(パスワード、API キー、トークン、OTP)を引用することを、たとえ明示的に求めた場合でも拒否します。トレースファイルを共有したり画面を共有したりすることが多い場合に便利です。デフォルトはオフなので、必要なときにエージェントがあなたが求めた正確な値をそのまま返せます。`done` の要約をすっきり保ち、資格情報を決して繰り返さないようにしたい場合は、有効にしてください(設定 → セキュリティ)。", + "st.display.strict_secret.desc": "要約やアシスタントの文章の中で資格情報(パスワード、API キー、トークン、OTP)を引用することを、たとえ明示的に求めた場合でも拒否します。トレースファイルを共有したり画面を共有したりすることが多い場合に便利です。デフォルトはオフなので、必要なときにエージェントがあなたが求めた正確な値をそのまま返せます。`done` の要約をすっきり保ち、資格情報を決して繰り返さないようにしたい場合は、有効にしてください。", "st.display.request_timeout.label": "LLM リクエストのタイムアウト", "st.display.request_timeout.desc": "応答ヘッダーの受信と、ストリーミング応答の各部分の間で待機できる最大時間です。デフォルトは120秒です。ローカルモデルが遅い場合、特にCPUで実行する場合やコンテキストが大きい場合は、時間を長くしてください。", "st.providers.filter.all": "すべて", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain がビジーの間、メッセージはキューに入ります。/help、/progress、/btw、/scratchpad、/memory、/schedule --list、/watch、/dangerously-skip-permissions、/screenshot、/export、/export --traces、/verbose だけがスラッシュコマンドとしてすぐに実行できます。', 'tool.go_back': '戻る', 'tool.go_forward': '進む', - 'st.display.search.placeholder': '一般設定を検索', - 'st.display.search.empty': '一致する一般設定はありません。', + 'st.display.search.placeholder': '設定を検索', + 'st.display.search.empty': '一致する設定はありません。', 'st.display.advanced': '詳細設定', ...getApocalypseModeCopy('ja'), ...getEmergencyBoxCopy('ja'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "ビジョンに送るスクリーンショットの長辺(幅または高さ)のピクセル上限。上限を下げると送信前に縮小しトークンとコストを削減。上げると忠実度を保ちます。", "st.imageBudget.warning": "⚠️ これらの設定はビジョン用のスクリーンショット(自動撮影、/screenshot、全ページ、verify_form)に適用されます。手動で保存したフル解像度画像には影響しません。「Image detail」は OpenAI 系エンドポイントで尊重され、他のプロバイダでは無視されることがあります。", - "st.redaction.heading": "スクリーンショットの黒塗り", "st.redaction.toggle.label": "スクリーンショット内の機密情報を黒塗りする", "st.redaction.toggle.desc": "スクリーンショットをビジョンモデルに送信する前に、フォーム項目やメールアドレス・電話番号らしきテキストにモザイクをかけます。検出はすべて端末内で行われ、追加で送信されるデータはありません。", "st.redaction.warning": "⚠️ これはベストエフォートかつフェイルオープンな処理です。ページ上で黒塗り処理が実行できない場合(ナビゲーション直後、PDFビューア、制限されたブラウザページなど)、スクリーンショットは黒塗りされないまま送信されます。検出はDOMヒューリスティックのみに基づいており、canvasに描画されたテキスト、画像内の個人情報、フォーム項目やメール/電話のテキストと認識されないものは見逃される可能性があります。またモデルに送られるページの本文テキストはこの設定では黒塗りされません。これはセキュリティ上の保証ではありません。完全なプライバシーが必要な場合は、ローカル/オフラインモデル(llama.cpp、Ollamaなど)を使用してください。その場合スクリーンショットは端末から一切出ないため、黒塗りは不要になります。", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "スクリーンショットを含む保存済みトレースセッション全体をJSONでエクスポート", "sp.export_traces.recording_truncated": "保存済みの全記録をJSONでエクスポートしました。記録時に省略された内容はエクスポートでは復元できません。", "sp.slash.export_traces": "ツールチェーンをエクスポート(トレース)", - "sp.export_traces.none": "この会話のトレースがありません。設定で「トレースを記録」をオンにして、もう一度実行してください。", + "sp.export_traces.none": "この会話のトレースがありません。設定 → 詳細設定で「トレースを記録」をオンにして、もう一度実行してください。", "sp.export_traces.error": "トレースをエクスポートできませんでした。", "sp.export_traces.done": "ツールチェーンを書き出しました。", "sp.export_traces.no_conversation": "まだ書き出すものがありません — 先に会話を始めてください。", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "ツールチェーンを書き出しました。この会話にトレースが多い場合、古いターンが欠けることがあります。", "st.display.help_improve.label": "WebBrain の改善に協力する", "st.display.help_improve.desc_html": "選択された WebBrain Compass の操作を保持し、評価、改善、微調整、トレーニングに使用することを許可します。既定でオンです。今後の Compass 操作がこれらの目的に使用されないようにするにはオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、「研究のためにクエリを共有」をオンにしたプロバイダーからのみWebBrainが収集します。プライバシーポリシー →", - "st.providers.webbrain_data_use.body": "WebBrain Compass には毎日の無料利用枠が含まれます。「WebBrain の改善に協力する」は既定でオンであり、選択された Compass の会話が保持され、評価、改善、微調整、トレーニングに使用される場合があります。今後の Compass 操作をこれらの用途から除外するには、一般 → 詳細設定でオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、このプロバイダーの「研究のためにクエリを共有」オプションをオンにした場合のみWebBrainが収集します。{privacyLink}。追加利用は {subscribeLink} で購読してください。請求は {accountLink} で管理できます。", + "st.providers.webbrain_data_use.body": "WebBrain Compass には毎日の無料利用枠が含まれます。「WebBrain の改善に協力する」は既定でオンであり、選択された Compass の会話が保持され、評価、改善、微調整、トレーニングに使用される場合があります。今後の Compass 操作をこれらの用途から除外するには、設定 → 詳細設定でオフにしてください。ローカルモデルやご自身のAPIへのリクエストは、このプロバイダーの「研究のためにクエリを共有」オプションをオンにした場合のみWebBrainが収集します。{privacyLink}。追加利用は {subscribeLink} で購読してください。請求は {accountLink} で管理できます。", 'st.providers.share_research.label': "研究のためにクエリを共有", 'st.providers.share_research.hint': "このプロバイダーのプロンプトと応答を、使用したプロバイダーとモデル名とともに評価・改善のためWebBrainに送信します。画像やバイナリ添付は共有前に除去され、テキストは切り詰められます。残りのテキストはそのまま送信されます。", 'st.providers.share_research.confirm': "このプロバイダーのクエリを研究のためにWebBrainと共有しますか?\n\nオンにすると、このプロバイダーとのプロンプト、応答、ツール操作がプロバイダー名・モデル名とともに評価・改善のためWebBrainに送信されます。テキストは画像除去・長い内容の切り詰め後にそのまま送信されるため、機密の個人情報を共有しないでください。オフにすればいつでも今後の共有を停止できます。", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "中断を減らしますか?「常に許可」はこのサイトを記憶します。以下のコマンドは、すべてのサイトで WebBrain の許可確認を無効にします。", "sp.perm.insert_skip_command": "/dangerously-skip-permissions を入力", "sp.perm.skip_hint_draft": "下書きは変更されていません。コマンドを入力する前に消去してください。", - "ob.act.permissions_tip": "許可確認は既定で有効です。上級ユーザーは /dangerously-skip-permissions ですべてのサイトの確認を無効にし、設定 → 権限から再び有効にできます。", + "ob.act.permissions_tip": "許可確認は既定で有効です。上級ユーザーは /dangerously-skip-permissions ですべてのサイトの確認を無効にし、マイクの横の ⚠ ボタンから再び有効にできます。", 'st.provider.field.cache_read_cost_per_million': "キャッシュ読み取りの推定費用($ / 100万トークン)", 'st.provider.field.cache_write_cost_per_million': "5分キャッシュ書き込みの推定費用($ / 100万トークン)", 'st.provider.field.cache_write_1h_cost_per_million': "1時間キャッシュ書き込みの推定費用($ / 100万トークン)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "暗号化されたクラウド コピーをこのデバイスの現在の WebBrain セットアップに置き換えますか?", "st.sync.consent.legacy": "暗号化された同期をオンにしますか? WebBrain は、エンドツーエンドで暗号化された思い出、プロファイルの自動入力、API キー プロバイダー設定のコピーを WebBrain Compass に送信します。チャット履歴と OAuth サインインは同期されません。", "st.sync.consent.denied": "暗号化された同期権限が付与されませんでした。", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "タスク実行中にページが変わりました({before} → {after})。タスクを続行します。", 'sp.activity.generating_answer': "回答を生成中…", 'sp.activity.retrying_response': "回答を再試行中…", diff --git a/src/firefox/src/ui/locales/ko.js b/src/firefox/src/ui/locales/ko.js index 0c26dd3aac..aba6023953 100644 --- a/src/firefox/src/ui/locales/ko.js +++ b/src/firefox/src/ui/locales/ko.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '확장 프로그램 UI 축소', 'sp.ui_scale.increase': '확장 프로그램 UI 확대', 'sp.ui_scale.reset': '초기화', - 'st.display.ui_scale.label': '확장 프로그램 UI 확대/축소', - 'st.display.ui_scale.decrease': '확장 프로그램 UI 축소', - 'st.display.ui_scale.increase': '확장 프로그램 UI 확대', - 'st.display.ui_scale.reset': '초기화', - 'st.display.ui_scale.desc': '페이지 확대/축소는 변경하지 않고 사이드 패널과 별도 채팅 창의 크기를 조정합니다.', - 'st.display.ui_scale.shortcuts': '전용 단축키: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': '지정되지 않음', - 'st.display.ui_scale.manage_shortcuts': '단축키 사용자 지정', 'tool.delegate_research': 'ChatGPT로 조사 중', 'st.display.research_escalation.label': '조사 에스컬레이션', 'st.display.research_escalation.desc': '활성화하면 WebBrain이 매우 복잡한 읽기 전용 조사 프롬프트를 ChatGPT에 보내기 전에 허가를 요청할 수 있습니다. 기본값은 꺼짐입니다. 정확한 프롬프트는 명시적으로 승인한 후에만 공유됩니다.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "계속하지 않기", "sp.recipient.reason_unrequested": "WebBrain이 요청에서 메시지를 보내야 하는지 판단하지 못했습니다. {host}에서 열려 있는 대화 상대는 {recipient}입니다.", "sp.recipient.reason_unnamed": "WebBrain이 요청에서 이 메시지를 누구에게 보낼지 판단하지 못했습니다. {host}에서 열려 있는 대화 상대는 {recipient}입니다.", - 'st.tab.permissions': "권한", 'st.perms.revoke': "취소", 'st.perms.clear_all': "모든 권한 지우기", 'st.perms.gate.label': "중요한 작업 전에 확인", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '시작하기', 'ob.btn.skip': '지금은 건너뛰기', 'ob.btn.start': '시작', - 'ob.cloud.body': 'WebBrain Compass는 무료 주간 할당량으로 준비되어 있습니다. 선택된 Compass 대화는 WebBrain 개선 도움말이 기본적으로 켜져 있는 동안 WebBrain 개선을 위해 저장 및 사용될 수 있습니다. 설정 → 일반에서 끌 수 있습니다.', + 'ob.cloud.body': 'WebBrain Compass는 무료 주간 할당량으로 준비되어 있습니다. 선택된 Compass 대화는 WebBrain 개선 도움말이 기본적으로 켜져 있는 동안 WebBrain 개선을 위해 저장 및 사용될 수 있습니다. 설정 → 고급에서 끌 수 있습니다.', 'ob.cloud.change': '변경', 'ob.cloud.using': 'WebBrain Compass를 사용 중입니다.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '결과', 'sp.api.enabled_html': '🔓 이 대화에서 API 변경이 허용되었습니다. 에이전트는 이제 UI보다 API가 더 안정적이라고 판단할 때 fetch_url과 execute_js를 통해 POST/PUT/PATCH/DELETE를 사용할 수 있습니다. 기본적으로는 UI 우선 방침을 유지합니다. 이 플래그는 대화를 초기화하면 해제됩니다.', - 'sp.permissions.disabled_html': '⚠️ 권한 확인이 꺼져 있습니다. WebBrain은 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화, 예약 작업을 미리 묻지 않고 수행합니다. 설정 → 권한 → 중요 작업 전에 확인에서 다시 활성화하세요.', + 'sp.permissions.disabled_html': '⚠️ 권한 확인이 꺼져 있습니다. WebBrain은 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화, 예약 작업을 미리 묻지 않고 수행합니다. 마이크 옆의 ⚠ 버튼에서 다시 활성화하세요.', 'sp.permissions.button': '권한 확인: 켜짐', 'sp.permissions.button_off': '권한 확인: 꺼짐', 'sp.permissions.gate_desc': 'WebBrain은 사이트에서 처음으로 클릭, 입력, 다운로드 또는 코드 실행을 할 때 확인을 요청합니다.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': '"{selector}" 대기', 'st.title': 'WebBrain 설정', - 'st.subtitle': 'LLM 제공자와 설정을 구성합니다 · v{version}', + 'st.subtitle': 'WebBrain의 동작 방식을 구성합니다 · v{version}', 'st.tab.display': '일반', + 'st.tab.budgets': '예산', + 'st.tab.advanced': '고급', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '음성', + 'st.tab.generative': '생성', + 'st.tab.decision': '결정', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain 제공자', + 'st.providers_page.subtitle': 'WebBrain이 사용할 모델을 선택합니다 · v{version}', + 'st.permissions_page.title': 'WebBrain 권한', + 'st.permissions_page.subtitle': 'WebBrain이 먼저 묻지 않고 작업할 수 있는 사이트', 'st.tab.providers': '제공자', 'st.tab.vision': '비전', 'st.tab.profile': '프로필', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "결제 수단 업데이트", 'st.account.manage_billing': '청구 관리', - 'st.display.language.label': '언어', - 'st.display.language.desc': 'WebBrain 플러그인의 인터페이스 언어입니다.', 'st.display.verbose.label': '상세 모드', 'st.display.verbose.desc': '도구 호출의 상세 내용, 인수, 원본 JSON 결과를 모두 표시합니다. 기본적으로는 끔으로 깔끔한 채팅 환경을 제공합니다.', 'st.display.selection_shortcut.label': '선택 바로가기', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': '자동 스크린샷', "st.display.auto_screenshot.desc": "에이전트가 페이지에서 동작한 뒤 뷰포트 스크린샷을 자동으로 캡처하여 선택된 비전 경로가 변경 사항을 볼 수 있게 합니다. 토큰을 더 사용합니다. 비전을 사용할 수 없으면 보강을 건너뛰고 상태 알림과 함께 작업을 계속합니다.", 'st.display.auto_screenshot.off': '끔', - 'st.display.auto_screenshot.navigation': '이동 시', - 'st.display.auto_screenshot.state_change': '상태 변경 시 (기본값)', + 'st.display.auto_screenshot.navigation': '이동 시 (기본값)', + 'st.display.auto_screenshot.state_change': '상태 변경 시', 'st.display.auto_screenshot.every_step': '매 단계', 'st.display.tracing.label': '트레이스 기록 (모델 비교용)', - 'st.display.tracing.desc_html': '모든 실행(LLM 요청, 응답, 도구 호출, 스크린샷)을 로컬 IndexedDB에 보관하여 모델을 나란히 검사하고 비교할 수 있게 합니다. 별도의 트레이스 탭에서 열립니다. 매 단계마다 디스크 쓰기가 늘어나므로 기본값은 꺼짐입니다. 트레이스 페이지 열기 →', - 'st.display.lossless_tracing.label': '요청 전체 세부정보 기록(디버그 계층)', - 'st.display.lossless_tracing.desc_html': '각 LLM 요청의 전체 프롬프트·메시지·도구 스키마를 내용 없는 요약 대신 저장하고, 각 도구 결과를 최대 200KB까지 보관합니다. 심층 디버깅과 요청 재구성이 가능합니다. 대화 내용을 로컬에 기록하고 디스크를 훨씬 더 사용하므로 기본적으로 꺼져 있습니다. 트레이스 기록이 켜져 있어야 합니다.', + 'st.display.tracing.desc_html': '모든 실행(LLM 요청, 응답, 도구 호출, 스크린샷)을 로컬 IndexedDB에 보관하여 모델을 나란히 검사하고 비교할 수 있게 합니다. 각 LLM 요청의 전체 프롬프트·메시지·도구 스키마와 각 도구 결과를 최대 200KB까지 함께 저장합니다. 별도의 트레이스 탭에서 열립니다. 대화 내용을 로컬에 기록하고 디스크를 훨씬 더 사용하므로 기본적으로 꺼져 있습니다. 트레이스 페이지 열기 →', 'st.display.allow_local_network.label': '에이전트의 로컬 네트워크 접근 허용', 'st.display.allow_local_network.desc': '에이전트의 fetch_url 도구가 루프백(127.0.0.1, localhost)과 사설/RFC1918 주소(10.x, 192.168.x, 172.16–31.x)에 접근할 수 있게 합니다. 로컬 개발 서버, 인트라넷 도구, 자체 호스팅 API에 유용합니다. 기본값은 끔입니다. 꺼져 있으면 사설 또는 루프백 IP를 직접 적은 URL과 localhost 이름을 차단합니다. DNS 해석은 확인하지 않으므로 다른 호스트명은 로컬 주소에 접근할 수 있습니다. 클라우드 메타데이터 IP 리터럴(169.254.169.254)과 목록에 있는 메타데이터 이름 또는 *.internal/*.local은 켜져 있어도 차단됩니다.', 'st.display.notify_sound.label': "알림 소리", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "활성 제공자에서 비전 모드가 활성화되었습니다.", "sp.vision.off": "활성 제공자에서 비전 모드가 비활성화되었습니다.", "sp.vision.error": "비전 전환에 실패했습니다: {msg}", - "st.tab.multimodal": "보조 모델", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "권장됩니다. 켜져 있으면 WebBrain이 사이트에서 처음으로 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드 또는 녹화할 때 권한을 요청합니다(이후 선택을 기억합니다). 완전히 신뢰하는 사이트에서 확인 없이 빠르게 사용하려면 끄세요.", "st.perms.gate.warning": "⚠️ 권한 확인이 꺼져 있습니다. WebBrain이 어떤 사이트에서든 — 콘텐츠가 공격자에 의해 조작될 수 있는 페이지를 포함해 — 묻지 않고 클릭, 입력, 이동, JavaScript 실행, 업로드, 다운로드, 녹화를 수행합니다. 페이지 콘텐츠는 내부적으로 여전히 신뢰할 수 없는 것으로 취급되지만, 주입된 지시가 동작을 유발하는 것을 막을 수는 없습니다. 어시스턴트를 사용하는 모든 사이트를 완전히 신뢰하는 경우에만 끈 채로 두세요.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "시스템 기본값", "st.display.download_directory.error": "WebBrain 또는 Work/WebBrain 같은 상대 폴더를 사용하세요. 절대 경로와 “..”는 허용되지 않습니다.", "st.display.strict_secret.label": "엄격한 비밀 정보 처리", - "st.display.strict_secret.desc": "요약이나 어시스턴트 텍스트에 자격 증명(비밀번호, API 키, 토큰, OTP)을 인용하기를 거부합니다 — 명시적으로 요청하더라도 마찬가지입니다. 트레이스 파일을 자주 공유하거나 화면을 공유한다면 유용합니다. 기본값은 꺼짐: 필요할 때 에이전트가 요청한 정확한 값을 그대로 알려줄 수 있습니다. `done` 요약을 깔끔하게 유지하고 자격 증명이 반복되지 않게 하려면 켜세요 (설정 → 보안).", + "st.display.strict_secret.desc": "요약이나 어시스턴트 텍스트에 자격 증명(비밀번호, API 키, 토큰, OTP)을 인용하기를 거부합니다 — 명시적으로 요청하더라도 마찬가지입니다. 트레이스 파일을 자주 공유하거나 화면을 공유한다면 유용합니다. 기본값은 꺼짐: 필요할 때 에이전트가 요청한 정확한 값을 그대로 알려줄 수 있습니다. `done` 요약을 깔끔하게 유지하고 자격 증명이 반복되지 않게 하려면 켜세요.", "st.display.request_timeout.label": "LLM 요청 시간 제한", "st.display.request_timeout.desc": "응답 헤더 수신과 스트리밍 응답의 각 청크 사이에 기다리는 최대 시간입니다. 기본값: 120초. 로컬 모델이 느리면, 특히 CPU에서 실행하거나 컨텍스트가 큰 경우 이 시간을 늘리세요.", "st.providers.filter.all": "전체", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain이 사용 중일 때 메시지는 대기열에 추가됩니다. /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, /verbose만 슬래시 명령으로 즉시 실행할 수 있습니다.', 'tool.go_back': '뒤로 가기', 'tool.go_forward': '앞으로 가기', - 'st.display.search.placeholder': '일반 설정 검색', - 'st.display.search.empty': '일치하는 일반 설정이 없습니다.', + 'st.display.search.placeholder': '설정 검색', + 'st.display.search.empty': '일치하는 설정이 없습니다.', 'st.display.advanced': '고급', ...getApocalypseModeCopy('ko'), ...getEmergencyBoxCopy('ko'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "비전으로 보내는 스크린샷의 긴 변(너비 또는 높이) 픽셀 상한. 낮은 상한은 전송 전 축소로 토큰·비용을 줄이고, 높은 상한은 충실도를 유지합니다.", "st.imageBudget.warning": "⚠️ 이 설정은 비전용 스크린샷(자동 캡처, /screenshot, 전체 페이지, verify_form)에 적용됩니다. 수동으로 저장한 전체 해상도 이미지는 영향을 받지 않습니다. «Image detail»은 OpenAI 스타일 엔드포인트에서 적용되며 다른 제공자는 무시할 수 있습니다.", - "st.redaction.heading": "스크린샷 마스킹", "st.redaction.toggle.label": "스크린샷의 민감한 콘텐츠 마스킹", "st.redaction.toggle.desc": "스크린샷을 비전 모델로 보내기 전에 양식 필드와 이메일이나 전화번호처럼 보이는 텍스트를 흐리게 처리합니다. 감지는 전적으로 사용자 기기에서 실행되며, 추가로 전송되는 데이터는 없습니다.", "st.redaction.warning": "⚠️ 이 기능은 최선을 다하는(best-effort) 방식이며 fail-open입니다. 마스킹이 페이지에서 실행될 수 없는 경우(예: 탐색 직후, PDF 뷰어, 제한된 브라우저 페이지 등) 스크린샷은 마스킹되지 않은 채로 그대로 전송됩니다. 감지는 DOM 휴리스틱만 사용하므로 캔버스에 그려진 텍스트, 이미지 안의 개인정보, 양식 필드나 이메일/전화번호 텍스트로 인식되지 않는 항목은 놓칠 수 있으며, 모델로 전송되는 페이지 텍스트는 이 설정으로 마스킹되지 않습니다. 이는 보안을 보장하는 기능이 아닙니다. 완전한 프라이버시가 필요하다면 로컬/오프라인 모델(llama.cpp, Ollama)을 사용하세요. 이 경우 스크린샷이 기기를 벗어나지 않으므로 마스킹 자체가 필요하지 않습니다.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "스크린샷을 포함한 저장된 전체 추적 세션을 JSON으로 내보내기", "sp.export_traces.recording_truncated": "저장된 모든 기록을 JSON으로 내보냈습니다. 기록 중 누락된 내용은 내보내기로 복구할 수 없습니다.", "sp.slash.export_traces": "도구 체인 내보내기(트레이스)", - "sp.export_traces.none": "이 대화에 대한 트레이스가 없습니다. 설정에서 '트레이스 기록'을 켜고 다시 실행하세요.", + "sp.export_traces.none": "이 대화에 대한 트레이스가 없습니다. 설정 → 고급에서 '트레이스 기록'을 켜고 다시 실행하세요.", "sp.export_traces.error": "트레이스를 내보낼 수 없습니다.", "sp.export_traces.done": "도구 체인을 내보냈습니다.", "sp.export_traces.no_conversation": "아직 내보낼 내용이 없습니다 — 먼저 대화를 시작하세요.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "도구 체인을 내보냈습니다. 이 대화에 트레이스가 많으면 이전 턴이 빠질 수 있습니다.", "st.display.help_improve.label": "WebBrain 개선에 참여", "st.display.help_improve.desc_html": "선택된 WebBrain Compass 상호작용을 보관하고 평가, 개선, 미세 조정 및 학습에 사용하도록 허용합니다. 기본적으로 켜져 있습니다. 향후 Compass 상호작용이 이러한 목적으로 사용되지 않도록 하려면 끄세요. 로컬 모델 및 자체 API 요청은 “연구를 위해 쿼리 공유”를 켜 제공업체에 한해 WebBrain이 수집합니다. 개인정보 처리방침 →", - "st.providers.webbrain_data_use.body": "WebBrain Compass에는 일일 무료 사용량이 포함됩니다. ‘WebBrain 개선에 참여’가 기본적으로 켜져 있는 동안 선택된 Compass 대화가 보관되어 평가, 개선, 미세 조정 및 학습에 사용될 수 있습니다. 향후 Compass 상호작용을 이러한 사용에서 제외하려면 일반 → 고급에서 끄세요. 로컬 모델 및 자체 API 요청은 이 제공업체의 “연구를 위해 쿼리 공유” 옵션을 켜 경우에만 WebBrain이 수집합니다. {privacyLink}. 더 많은 사용량이 필요하면 {subscribeLink}에서 구독하세요. 청구는 {accountLink}에서 관리하세요.", + "st.providers.webbrain_data_use.body": "WebBrain Compass에는 일일 무료 사용량이 포함됩니다. ‘WebBrain 개선에 참여’가 기본적으로 켜져 있는 동안 선택된 Compass 대화가 보관되어 평가, 개선, 미세 조정 및 학습에 사용될 수 있습니다. 향후 Compass 상호작용을 이러한 사용에서 제외하려면 설정 → 고급에서 끄세요. 로컬 모델 및 자체 API 요청은 이 제공업체의 “연구를 위해 쿼리 공유” 옵션을 켜 경우에만 WebBrain이 수집합니다. {privacyLink}. 더 많은 사용량이 필요하면 {subscribeLink}에서 구독하세요. 청구는 {accountLink}에서 관리하세요.", 'st.providers.share_research.label': "연구를 위해 쿼리 공유", 'st.providers.share_research.hint': "이 제공업체의 프롬프트와 응답을 사용된 제공업체 및 모델과 함께 평가 및 개선을 위해 WebBrain에 전송합니다. 이미지와 바이너리 첨부파일은 공유 전에 제거되고 텍스트는 잘립니다. 나머지 텍스트는 그대로 전송됩니다.", 'st.providers.share_research.confirm': "이 제공업체의 쿼리를 연구를 위해 WebBrain과 공유하시겠습니까?\n\n켜면 이 제공업체와의 프롬프트, 응답, 도구 상호작용이 제공업체 및 모델 이름과 함께 평가 및 개선을 위해 WebBrain에 전송됩니다. 텍스트는 이미지 제거 및 긴 내용 자르기 후 그대로 전송되므로 민감한 개인정보는 공유하지 마세요. 언제든지 꺼서 이후 공유를 중단할 수 있습니다.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "방해를 줄이고 싶으신가요? “항상 허용”은 이 사이트를 기억합니다. 아래 명령은 모든 사이트에서 WebBrain 권한 확인을 끕니다.", "sp.perm.insert_skip_command": "/dangerously-skip-permissions 입력", "sp.perm.skip_hint_draft": "초안은 변경되지 않았습니다. 명령을 입력하기 전에 비워 주세요.", - "ob.act.permissions_tip": "권한 확인은 기본적으로 켜져 있습니다. 고급 사용자는 /dangerously-skip-permissions로 모든 사이트의 확인을 끄고 설정 → 권한에서 다시 켤 수 있습니다.", + "ob.act.permissions_tip": "권한 확인은 기본적으로 켜져 있습니다. 고급 사용자는 /dangerously-skip-permissions로 모든 사이트의 확인을 끄고 마이크 옆의 ⚠ 버튼에서 다시 켤 수 있습니다.", 'st.provider.field.cache_read_cost_per_million': "캐시 읽기 예상 비용($ / 100만 토큰)", 'st.provider.field.cache_write_cost_per_million': "5분 캐시 쓰기 예상 비용($ / 100만 토큰)", 'st.provider.field.cache_write_1h_cost_per_million': "1시간 캐시 쓰기 예상 비용($ / 100만 토큰)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "암호화된 클라우드 사본을 이 기기의 현재 WebBrain 설정으로 바꾸시겠습니까?", "st.sync.consent.legacy": "암호화된 동기화를 사용하시겠습니까? WebBrain은 추억, 프로필 자동 완성 및 API 키 제공자 설정의 엔드 투 엔드 암호화 사본을 WebBrain Compass로 전송합니다. 채팅 기록과 OAuth 로그인은 동기화되지 않습니다.", "st.sync.consent.denied": "암호화된 동기화 권한이 부여되지 않았습니다.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "작업 실행 중 페이지가 변경되었습니다({before} → {after}). 작업을 계속합니다.", 'sp.activity.generating_answer': "답변 생성 중…", 'sp.activity.retrying_response': "답변 다시 시도 중…", diff --git a/src/firefox/src/ui/locales/ms.js b/src/firefox/src/ui/locales/ms.js index 8a43d444cd..655b788d21 100644 --- a/src/firefox/src/ui/locales/ms.js +++ b/src/firefox/src/ui/locales/ms.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Kecilkan UI sambungan', 'sp.ui_scale.increase': 'Besarkan UI sambungan', 'sp.ui_scale.reset': 'Tetapkan semula', - 'st.display.ui_scale.label': 'Zum UI sambungan', - 'st.display.ui_scale.decrease': 'Kecilkan UI sambungan', - 'st.display.ui_scale.increase': 'Besarkan UI sambungan', - 'st.display.ui_scale.reset': 'Tetapkan semula', - 'st.display.ui_scale.desc': 'Ubah saiz panel sisi dan tetingkap sembang berasingan tanpa mengubah zum halaman.', - 'st.display.ui_scale.shortcuts': 'Pintasan khusus: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Tidak ditetapkan', - 'st.display.ui_scale.manage_shortcuts': 'Sesuaikan pintasan', 'tool.delegate_research': 'Menyelidik dengan ChatGPT', 'st.display.research_escalation.label': 'Eskalasi penyelidikan', 'st.display.research_escalation.desc': 'Apabila diaktifkan, WebBrain mungkin meminta izin sebelum menghantar gesaan penyelidikan baca sahaja yang luar biasa kompleks kepada ChatGPT. Dimatikan secara lalai. Gesaan tepat hanya dikongsi selepas kelulusan jelas anda.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Jangan teruskan", "sp.recipient.reason_unrequested": "WebBrain tidak dapat memastikan daripada permintaan anda bahawa mesej perlu dihantar. Perbualan yang terbuka di {host} adalah dengan {recipient}.", "sp.recipient.reason_unnamed": "WebBrain tidak dapat memastikan daripada permintaan anda siapa yang patut menerima mesej ini. Perbualan yang terbuka di {host} adalah dengan {recipient}.", - 'st.tab.permissions': "Kebenaran", 'st.perms.revoke': "Batalkan", 'st.perms.clear_all': "Kosongkan semua kebenaran", 'st.perms.gate.label': "Tanya sebelum tindakan penting", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Mula', 'ob.btn.skip': 'Langkau buat masa ini', 'ob.btn.start': 'Mula', - 'ob.cloud.body': 'WebBrain Compass sedia dengan elaun mingguan percuma. Perbincangan Compass yang dipilih boleh disimpan dan digunakan untuk meningkatkan WebBrain semasa Bantu Tingkatkan WebBrain didayakan secara lalai. Anda boleh mematikannya di Tetapan → Umum.', + 'ob.cloud.body': 'WebBrain Compass sedia dengan elaun mingguan percuma. Perbincangan Compass yang dipilih boleh disimpan dan digunakan untuk meningkatkan WebBrain semasa Bantu Tingkatkan WebBrain didayakan secara lalai. Anda boleh mematikannya di Tetapan → Lanjutan.', 'ob.cloud.change': 'Tukar', 'ob.cloud.using': 'Menggunakan WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Keputusan', 'sp.api.enabled_html': '🔓 Pengubahan API diaktifkan untuk perbualan ini. Ejen kini boleh menggunakan POST/PUT/PATCH/DELETE melalui fetch_url dan execute_js apabila ia menilai API lebih boleh dipercayai berbanding UI untuk sesuatu langkah. UI tetap menjadi pilihan utama secara lalai. Bendera ini akan dikosongkan apabila anda menetapkan semula perbualan.', - 'sp.permissions.disabled_html': '⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun, merakam, dan menjadualkan kerja masa hadapan tanpa bertanya terlebih dahulu. Aktifkan semula ini dari Tetapan → Kebenaran → Tanya sebelum tindakan penting.', + 'sp.permissions.disabled_html': '⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun, merakam, dan menjadualkan kerja masa hadapan tanpa bertanya terlebih dahulu. Aktifkan semula ini dari butang ⚠ di sebelah mikrofon.', 'sp.permissions.button': 'Gesaan kebenaran: hidup', 'sp.permissions.button_off': 'Gesaan kebenaran: mati', 'sp.permissions.gate_desc': 'WebBrain bertanya kali pertama ia mengklik, menaip, memuat turun atau menjalankan kod di sesebuah tapak.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Menunggu "{selector}"', 'st.title': 'Tetapan WebBrain', - 'st.subtitle': 'Konfigurasi pembekal LLM dan keutamaan anda · v{version}', + 'st.subtitle': 'Konfigurasi cara WebBrain berfungsi · v{version}', 'st.tab.display': 'Umum', + 'st.tab.budgets': 'Bajet', + 'st.tab.advanced': 'Lanjutan', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Pertuturan', + 'st.tab.generative': 'Generatif', + 'st.tab.decision': 'Keputusan', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Pembekal WebBrain', + 'st.providers_page.subtitle': 'Pilih model yang digunakan WebBrain · v{version}', + 'st.permissions_page.title': 'Kebenaran WebBrain', + 'st.permissions_page.subtitle': 'Tapak tempat WebBrain boleh bertindak tanpa bertanya dahulu', 'st.tab.providers': 'Pembekal', 'st.tab.vision': 'Penglihatan', 'st.tab.profile': 'Profil', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Kemas kini kaedah pembayaran", 'st.account.manage_billing': 'Urus pengebilan', - 'st.display.language.label': 'Bahasa', - 'st.display.language.desc': 'Bahasa antara muka untuk pemalam WebBrain.', 'st.display.verbose.label': 'Mod terperinci', 'st.display.verbose.desc': 'Tunjukkan butiran penuh panggilan alat, argumen, dan hasil JSON mentah. Dimatikan secara lalai untuk pengalaman sembang yang lebih bersih.', 'st.display.selection_shortcut.label': 'Pintasan pilihan', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Tangkapan skrin auto', "st.display.auto_screenshot.desc": "Tangkap tangkapan skrin viewport secara automatik selepas ejen bertindak pada halaman supaya laluan penglihatan yang dipilih dapat melihat perubahan. Ini menggunakan lebih banyak token. Jika penglihatan tidak tersedia, pengayaan dilangkau dan tugas diteruskan dengan notis status.", 'st.display.auto_screenshot.off': 'Mati', - 'st.display.auto_screenshot.navigation': 'Apabila navigasi', - 'st.display.auto_screenshot.state_change': 'Apabila keadaan berubah (lalai)', + 'st.display.auto_screenshot.navigation': 'Apabila navigasi (lalai)', + 'st.display.auto_screenshot.state_change': 'Apabila keadaan berubah', 'st.display.auto_screenshot.every_step': 'Setiap langkah', 'st.display.tracing.label': 'Rakam jejak (untuk perbandingan model)', - 'st.display.tracing.desc_html': 'Simpan setiap larian (permintaan LLM, respons, panggilan alat, tangkapan skrin) ke dalam IndexedDB tempatan supaya anda boleh memeriksa dan membandingkan model secara bersebelahan. Dibuka dalam tab Jejak yang berasingan. Dimatikan secara lalai kerana ia menambah penulisan cakera pada setiap langkah. Buka halaman Jejak →', - 'st.display.lossless_tracing.label': 'Rekod butiran penuh permintaan (peringkat debug)', - 'st.display.lossless_tracing.desc_html': 'Juga menyimpan prompt, mesej, dan skema alatan penuh bagi setiap permintaan LLM dan bukannya ringkasan tanpa kandungan, serta mengekalkan sehingga 200 KB bagi setiap hasil alatan. Membolehkan penyahpepijatan mendalam dan pembinaan semula permintaan. Dimatikan secara lalai kerana menulis kandungan perbualan anda secara setempat dan menggunakan lebih banyak cakera. Memerlukan rakaman jejak dihidupkan.', + 'st.display.tracing.desc_html': 'Simpan setiap larian (permintaan LLM, respons, panggilan alat, tangkapan skrin) ke dalam IndexedDB tempatan supaya anda boleh memeriksa dan membandingkan model secara bersebelahan, termasuk prompt, mesej dan skema alatan penuh bagi setiap permintaan LLM serta sehingga 200 KB bagi setiap hasil alatan. Dibuka dalam tab Jejak yang berasingan. Dimatikan secara lalai kerana menulis kandungan perbualan anda secara setempat dan menggunakan lebih banyak cakera. Buka halaman Jejak →', 'st.display.allow_local_network.label': 'Benarkan ejen mengakses rangkaian tempatan', 'st.display.allow_local_network.desc': 'Membenarkan alat fetch_url ejen mencapai loopback (127.0.0.1, localhost) dan alamat peribadi/RFC1918 (10.x, 192.168.x, 172.16–31.x). Berguna untuk pelayan pembangunan tempatan, alat intranet, atau API yang dihos sendiri. Dimatikan secara lalai. Apabila dimatikan, URL yang menggunakan IP peribadi atau loopback secara langsung dan nama localhost disekat. Resolusi DNS tidak diperiksa, jadi nama hos lain masih boleh mencapai alamat tempatan. IP literal metadata awan (169.254.169.254) dan nama metadata yang disenaraikan atau *.internal/*.local kekal disekat walaupun dihidupkan.', 'st.display.notify_sound.label': "Bunyi pemberitahuan", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Mod penglihatan didayakan untuk pembekal aktif.", "sp.vision.off": "Mod penglihatan dinyahaktifkan untuk pembekal aktif.", "sp.vision.error": "Togol penglihatan gagal: {msg}", - "st.tab.multimodal": "Model Bantuan", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Disyorkan. Apabila dihidupkan, WebBrain meminta kebenaran kali pertama ia mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun atau merakam pada sesuatu laman (kemudian mengingati pilihan anda). Matikan untuk penggunaan pantas tanpa gesaan pada laman yang anda percayai sepenuhnya.", "st.perms.gate.warning": "⚠️ Gesaan kebenaran DIMATIKAN. WebBrain akan mengklik, menaip, menavigasi, menjalankan JavaScript, memuat naik, memuat turun dan merakam pada mana-mana laman TANPA bertanya — termasuk pada halaman yang kandungannya mungkin dikawal oleh penyerang. Kandungan halaman masih dianggap tidak dipercayai secara dalaman, tetapi tiada apa-apa akan menghalang arahan yang disuntik daripada mencetuskan tindakan. Biarkan ini dimatikan hanya jika anda mempercayai sepenuhnya setiap laman tempat anda menggunakan pembantu ini.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Lalai sistem", "st.display.download_directory.error": "Gunakan folder relatif seperti WebBrain atau Work/WebBrain. Laluan mutlak dan “..” tidak dibenarkan.", "st.display.strict_secret.label": "Pengendalian rahsia ketat", - "st.display.strict_secret.desc": "Enggan memetik kelayakan (kata laluan, kunci API, token, OTP) dalam ringkasan atau teks pembantu — walaupun apabila anda secara jelas memintanya. Berguna jika anda kerap berkongsi fail jejak atau berkongsi skrin. Dimatikan secara lalai supaya ejen boleh mengulangi nilai tepat yang anda minta apabila anda memerlukannya. Hidupkannya (Tetapan → Keselamatan) apabila anda mahu ringkasan `done` kekal kemas dan kelayakan tidak pernah diulangi.", + "st.display.strict_secret.desc": "Enggan memetik kelayakan (kata laluan, kunci API, token, OTP) dalam ringkasan atau teks pembantu — walaupun apabila anda secara jelas memintanya. Berguna jika anda kerap berkongsi fail jejak atau berkongsi skrin. Dimatikan secara lalai supaya ejen boleh mengulangi nilai tepat yang anda minta apabila anda memerlukannya. Hidupkannya apabila anda mahu ringkasan `done` kekal kemas dan kelayakan tidak pernah diulangi.", "st.display.request_timeout.label": "Tamat masa permintaan LLM", "st.display.request_timeout.desc": "Masa menunggu maksimum untuk pengepala respons dan setiap jeda antara bahagian respons penstriman. Lalai: 120 saat. Tambahkan masa ini untuk model tempatan yang perlahan, terutamanya pada CPU atau dengan konteks besar.", "st.providers.filter.all": "Semua", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Mesej dimasukkan ke giliran semasa WebBrain sibuk. Hanya /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, dan /verbose boleh berjalan serta-merta sebagai arahan slash.', 'tool.go_back': 'Kembali', 'tool.go_forward': 'Maju', - 'st.display.search.placeholder': 'Cari tetapan Umum', - 'st.display.search.empty': 'Tiada tetapan Umum yang sepadan.', + 'st.display.search.placeholder': 'Cari tetapan', + 'st.display.search.empty': 'Tiada tetapan yang sepadan.', 'st.display.advanced': 'Lanjutan', ...getApocalypseModeCopy('ms'), ...getEmergencyBoxCopy('ms'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Sisi terpanjang (lebar atau tinggi) dalam piksel untuk mana-mana tangkapan yang dihantar ke visi. Had lebih kecil mengecilkan imej sebelum dihantar, mengurangkan token dan kos. Had lebih besar mengekalkan ketepatan.", "st.imageBudget.warning": "⚠️ Tetapan ini digunakan pada tangkapan untuk visi (tangkapan auto, /screenshot, halaman penuh, verify_form). Imej resolusi penuh yang disimpan secara manual tidak terjejas. «Image detail» dihormati oleh endpoint gaya OpenAI; pembekal lain mungkin mengabaikannya.", - "st.redaction.heading": "Penyamaran tangkapan skrin", "st.redaction.toggle.label": "Samarkan kandungan sensitif dalam tangkapan skrin", "st.redaction.toggle.desc": "Sebelum tangkapan skrin dihantar ke model visi, medan borang dan teks yang kelihatan seperti e-mel atau nombor telefon akan dikaburkan. Pengesanan berjalan sepenuhnya pada peranti anda — tiada apa-apa tambahan dihantar.", "st.redaction.warning": "⚠️ Ini bersifat usaha terbaik (best-effort) dan fail-open: jika penyamaran tidak dapat berjalan pada sesuatu halaman (contohnya sejurus selepas navigasi, dalam pemapar PDF, atau pada halaman pelayar yang dihadkan), tangkapan skrin tetap dihantar tanpa disamarkan. Pengesanan hanya menggunakan heuristik DOM — teks yang dilukis pada canvas, maklumat peribadi dalam imej, atau apa-apa yang tidak dikenali sebagai medan borang atau teks e-mel/telefon mungkin terlepas, dan teks halaman yang dihantar kepada model tidak disamarkan oleh tetapan ini. Ini BUKAN jaminan keselamatan. Untuk privasi sepenuhnya, gunakan model tempatan/luar talian (llama.cpp, Ollama): tangkapan skrin tidak akan meninggalkan peranti anda dan penyamaran menjadi tidak diperlukan.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Eksport seluruh sesi jejak tersimpan sebagai JSON, termasuk tangkapan skrin", "sp.export_traces.recording_truncated": "Semua rekod tersimpan telah dieksport sebagai JSON. Kandungan yang ditinggalkan semasa rakaman tidak dapat dipulihkan melalui eksport.", "sp.slash.export_traces": "Eksport rantaian alat (jejak)", - "sp.export_traces.none": "Tiada jejak untuk perbualan ini. Hidupkan Rakam jejak dalam Tetapan, kemudian jalankan semula.", + "sp.export_traces.none": "Tiada jejak untuk perbualan ini. Hidupkan Rakam jejak dalam Tetapan → Lanjutan, kemudian jalankan semula.", "sp.export_traces.error": "Tidak dapat mengeksport jejak.", "sp.export_traces.done": "Rantaian alat dieksport.", "sp.export_traces.no_conversation": "Tiada lagi yang dieksport — mulakan perbualan dahulu.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Rantaian alat dieksport. Giliran lama mungkin hilang jika perbualan ini mempunyai banyak jejak.", "st.display.help_improve.label": "Bantu Tingkatkan WebBrain", "st.display.help_improve.desc_html": "Benarkan interaksi WebBrain Compass terpilih disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Dihidupkan secara lalai. Matikan untuk menghalang interaksi Compass pada masa hadapan daripada digunakan bagi tujuan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri daripada penyedia yang anda hidupkan “Kongsi pertanyaan untuk penyelidikan”. Dasar privasi →", - "st.providers.webbrain_data_use.body": "Penggunaan harian percuma WebBrain Compass disertakan. Semasa Bantu Tingkatkan WebBrain dihidupkan secara lalai, perbualan Compass terpilih mungkin disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Matikan di Umum → Lanjutan untuk mengecualikan interaksi Compass pada masa hadapan daripada penggunaan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri jika anda menghidupkan opsyen “Kongsi pertanyaan untuk penyelidikan” penyedia ini. {privacyLink}. Untuk penggunaan tambahan, langgan di {subscribeLink}. Urus pengebilan di {accountLink}.", + "st.providers.webbrain_data_use.body": "Penggunaan harian percuma WebBrain Compass disertakan. Semasa Bantu Tingkatkan WebBrain dihidupkan secara lalai, perbualan Compass terpilih mungkin disimpan dan digunakan untuk penilaian, penambahbaikan, penalaan halus dan latihan. Matikan di Tetapan → Lanjutan untuk mengecualikan interaksi Compass pada masa hadapan daripada penggunaan tersebut. WebBrain hanya mengumpul permintaan model setempat dan API anda sendiri jika anda menghidupkan opsyen “Kongsi pertanyaan untuk penyelidikan” penyedia ini. {privacyLink}. Untuk penggunaan tambahan, langgan di {subscribeLink}. Urus pengebilan di {accountLink}.", 'st.providers.share_research.label': "Kongsi pertanyaan untuk penyelidikan", 'st.providers.share_research.hint': "Menghantar gesaan dan respons daripada penyedia ini kepada WebBrain untuk penilaian dan penambahbaikan, termasuk penyedia dan model yang digunakan. Imej dan lampiran binari dibuang dan teks dipangkas sebelum dikongsi; baki teks dihantar seadanya.", 'st.providers.share_research.confirm': "Kongsi pertanyaan daripada penyedia ini dengan WebBrain untuk penyelidikan?\n\nJika dihidupkan, gesaan, respons dan interaksi alat anda dengan penyedia ini akan dihantar kepada WebBrain untuk penilaian dan penambahbaikan, berserta nama penyedia dan model. Teks dihantar seadanya selepas imej dibuang dan kandungan panjang dipangkas, jadi elakkan berkongsi data peribadi yang sensitif. Anda boleh mematikannya pada bila-bila masa untuk menghentikan perkongsian.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Mahukan lebih sedikit gangguan? “Sentiasa benarkan” mengingati laman ini. Perintah di bawah mematikan permintaan izin WebBrain di semua laman.", "sp.perm.insert_skip_command": "Sisipkan /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Draf anda tidak berubah. Kosongkannya sebelum menyisipkan perintah.", - "ob.act.permissions_tip": "Permintaan izin dihidupkan secara lalai. Pengguna lanjutan boleh mematikannya secara global dengan /dangerously-skip-permissions dan menghidupkannya semula di Tetapan → Izin.", + "ob.act.permissions_tip": "Permintaan izin dihidupkan secara lalai. Pengguna lanjutan boleh mematikannya secara global dengan /dangerously-skip-permissions dan menghidupkannya semula dari butang ⚠ di sebelah mikrofon.", 'st.provider.field.cache_read_cost_per_million': "Anggaran kos bacaan cache ($ / 1 juta token)", 'st.provider.field.cache_write_cost_per_million': "Anggaran kos tulis cache 5 minit ($ / 1 juta token)", 'st.provider.field.cache_write_1h_cost_per_million': "Anggaran kos tulis cache 1 jam ($ / 1 juta token)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Gantikan salinan awan yang disulitkan dengan persediaan WebBrain semasa peranti ini?", "st.sync.consent.legacy": "Hidupkan penyegerakan yang disulitkan? WebBrain akan menghantar salinan memori anda yang disulitkan hujung ke hujung, autolengkap profil dan tetapan pembekal kunci API ke WebBrain Compass. Sejarah sembang dan log masuk OAuth tidak disegerakkan.", "st.sync.consent.denied": "Kebenaran penyegerakan yang disulitkan tidak diberikan.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Halaman berubah semasa tugas berjalan ({before} → {after}). Tugas diteruskan.", 'sp.activity.generating_answer': "Menjana jawapan…", 'sp.activity.retrying_response': "Mencuba semula jawapan…", diff --git a/src/firefox/src/ui/locales/nl.js b/src/firefox/src/ui/locales/nl.js index 5d50120118..cec6d0625e 100644 --- a/src/firefox/src/ui/locales/nl.js +++ b/src/firefox/src/ui/locales/nl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Extensie-interface uitzoomen', 'sp.ui_scale.increase': 'Extensie-interface inzoomen', 'sp.ui_scale.reset': 'Resetten', - 'st.display.ui_scale.label': 'Zoom van extensie-interface', - 'st.display.ui_scale.decrease': 'Extensie-interface uitzoomen', - 'st.display.ui_scale.increase': 'Extensie-interface inzoomen', - 'st.display.ui_scale.reset': 'Resetten', - 'st.display.ui_scale.desc': 'Pas het formaat van het zijpaneel en het losse chatvenster aan zonder de paginazoom te wijzigen.', - 'st.display.ui_scale.shortcuts': 'Speciale sneltoetsen: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Niet toegewezen', - 'st.display.ui_scale.manage_shortcuts': 'Sneltoetsen aanpassen', 'tool.delegate_research': 'Onderzoeken met ChatGPT', 'st.display.research_escalation.label': 'Onderzoeksescalatie', 'st.display.research_escalation.desc': 'Indien ingeschakeld kan WebBrain toestemming vragen voordat een ongewoon complexe alleen-lezen onderzoeksprompt naar ChatGPT wordt gestuurd. Standaard uitgeschakeld. De exacte prompt wordt alleen gedeeld na uw uitdrukkelijke goedkeuring.', @@ -663,21 +655,30 @@ export default { 'ob.btn.done': 'Aan de slag', 'ob.btn.skip': 'Nu overslaan', 'ob.btn.start': 'Starten', - 'ob.cloud.body': 'WebBrain Compass is klaar met een gratis wekelijkse quotum. Geselecteerde Compass-gesprekken kunnen worden bewaard en gebruikt om WebBrain te verbeteren terwijl Help WebBrain verbeteren standaard is ingeschakeld. U kunt dit uitschakelen in Instellingen → Algemeen.', + 'ob.cloud.body': 'WebBrain Compass is klaar met een gratis wekelijkse quotum. Geselecteerde Compass-gesprekken kunnen worden bewaard en gebruikt om WebBrain te verbeteren terwijl Help WebBrain verbeteren standaard is ingeschakeld. U kunt dit uitschakelen in Instellingen → Geavanceerd.', 'ob.cloud.change': 'Wijzigen', 'ob.cloud.using': 'WebBrain Compass gebruiken.', 'st.title': 'WebBrain Instellingen', - 'st.subtitle': 'Configureer uw LLM-providers en voorkeuren · v{version}', + 'st.subtitle': 'Configureer hoe WebBrain werkt · v{version}', 'st.tab.display': 'Algemeen', + 'st.tab.budgets': 'Budgetten', + 'st.tab.advanced': 'Geavanceerd', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Spraak', + 'st.tab.generative': 'Generatief', + 'st.tab.decision': 'Beslissing', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain-providers', + 'st.providers_page.subtitle': 'Kies de modellen die WebBrain gebruikt · v{version}', + 'st.permissions_page.title': 'WebBrain-machtigingen', + 'st.permissions_page.subtitle': 'Sites waar WebBrain zonder eerst te vragen mag handelen', 'st.tab.providers': 'Providers', 'st.tab.skills': 'Vaardigheden', 'st.tab.vision': 'Visie', - 'st.tab.multimodal': "Ondersteunende modellen", 'st.tab.memory': 'Geheugen', 'st.tab.profile': 'Profiel', 'st.tab.account': 'Account', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Machtigingen', 'st.perms.gate.label': 'Vragen voor gevolghebbende acties', 'st.perms.gate.desc': 'Aanbevolen. Wanneer ingeschakeld, vraagt WebBrain om toestemming de eerste keer dat...', 'st.perms.gate.warning': '⚠️ Machtigingsvragen zijn UIT...', @@ -696,8 +697,6 @@ export default { "st.account.payment_failed": "Je abonnementsbetaling kon niet worden voltooid. Werk je betaalmethode bij om je betaalde abonnement te herstellen.", "st.account.update_payment": "Betaalmethode bijwerken", 'st.account.manage_billing': 'Facturering beheren', - 'st.display.language.label': 'Taal', - 'st.display.language.desc': 'Interfacetaal voor de WebBrain-plug-in.', 'st.display.theme.label': 'Weergave', 'st.display.theme.desc': 'Licht, donker of volg uw OS-instelling.', 'st.display.theme.system': 'Systeem', @@ -707,8 +706,8 @@ export default { 'st.display.download_directory.desc': 'Optionele submap binnen uw browser- of systeemdownloadmap...', 'st.display.download_directory.placeholder': 'Standaard', 'st.display.download_directory.error': 'Gebruik een relatieve map zoals WebBrain of Work/WebBrain...', - 'st.display.search.placeholder': 'Zoek in Algemene instellingen', - 'st.display.search.empty': 'Geen algemene instellingen gevonden.', + 'st.display.search.placeholder': 'Zoek in instellingen', + 'st.display.search.empty': 'Geen instellingen gevonden.', 'st.display.advanced': 'Geavanceerd', ...getApocalypseModeCopy('nl'), ...getEmergencyBoxCopy('nl'), @@ -764,20 +763,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatische schermafbeelding', "st.display.auto_screenshot.desc": "Maak automatisch een schermafbeelding van de viewport nadat de agent op de pagina heeft gehandeld, zodat de gekozen visieroute de wijziging kan zien. Dit kost meer tokens. Als visie niet beschikbaar is, wordt de verrijking overgeslagen en gaat de taak verder met een statusmelding.", 'st.display.auto_screenshot.off': 'Uit', - 'st.display.auto_screenshot.navigation': 'Bij navigatie', - 'st.display.auto_screenshot.state_change': 'Bij statustwijziging (standaard)', + 'st.display.auto_screenshot.navigation': 'Bij navigatie (standaard)', + 'st.display.auto_screenshot.state_change': 'Bij statustwijziging', 'st.display.auto_screenshot.every_step': 'Elke stap', 'st.display.tracing.label': 'Traces opslaan (voor modelvergelijking)', - 'st.display.tracing.desc_html': 'Sla elke uitvoering op in lokale IndexedDB... Traces openen →', - 'st.display.lossless_tracing.label': 'Volledige verzoekdetails opnemen (debuglaag)', - 'st.display.lossless_tracing.desc_html': 'Bewaart ook de volledige prompts, berichten en tool-schema\'s van elk LLM-verzoek in plaats van inhoudsloze samenvattingen, en houdt tot 200 KB van elk toolresultaat. Maakt diepgaand debuggen en reconstructie van verzoeken mogelijk. Standaard uit omdat het de inhoud van uw gesprek lokaal opslaat en veel meer schijfruimte gebruikt. Vereist dat tracerecordering aan staat.', + 'st.display.tracing.desc_html': "Slaat elke uitvoering (LLM-verzoeken, antwoorden, tool-aanroepen, screenshots) op in lokale IndexedDB, zodat u modellen naast elkaar kunt inspecteren en vergelijken, inclusief de volledige prompts, berichten en tool-schema's van elk LLM-verzoek en tot 200 KB van elk toolresultaat. Opent in een apart Traces-tabblad. Standaard uit omdat het de inhoud van uw gesprek lokaal opslaat en veel meer schijfruimte gebruikt. Traces openen →", 'st.display.cost_session_limit.label': 'Cloudkostensessietegoed', 'st.display.cost_session_limit.desc': 'Stopt cloud- en OpenRouter-uitvoeringen voordat nog een betaald modelaanroep plaatsvindt...', 'st.display.cost_total_limit.label': 'Cloudkostentotaaltegoed', 'st.display.cost_total_limit.desc': 'Volgt gerapporteerde of geschatte cloud-/OpenRouter-modeluitgaven...', 'st.display.cost_reset': 'Uitgaven resetten', 'st.display.strict_secret.label': 'Strikte geheimhouding', - 'st.display.strict_secret.desc': 'Weiger om inloggegevens (wachtwoorden, API-sleutels, tokens, OTP\'s) te citeren in samenvattingen of assistenttekst — zelfs wanneer je er expliciet om vraagt. Handig als je regelmatig tracebestanden deelt of het scherm deelt. Standaard uit, zodat de agent de exacte waarde kan herhalen die je opvraagt wanneer je die nodig hebt. Schakel het in (Instellingen → Beveiliging) wanneer je wilt dat `done`-samenvattingen netjes blijven en inloggegevens nooit worden herhaald.', + 'st.display.strict_secret.desc': "Weiger om inloggegevens (wachtwoorden, API-sleutels, tokens, OTP's) te citeren in samenvattingen of assistenttekst — zelfs wanneer je er expliciet om vraagt. Handig als je regelmatig tracebestanden deelt of het scherm deelt. Standaard uit, zodat de agent de exacte waarde kan herhalen die je opvraagt wanneer je die nodig hebt. Schakel het in wanneer je wilt dat `done`-samenvattingen netjes blijven en inloggegevens nooit worden herhaald.", 'st.display.allow_local_network.label': 'Sta agent toe om lokaal netwerk te bereiken', 'st.display.allow_local_network.desc': 'Staat het fetch_url-gereedschap van de agent toe om loopback- en privé-/RFC1918-adressen te bereiken...', 'st.display.scheduled_tasks.label': 'Geplande taken', @@ -939,7 +936,6 @@ export default { 'st.imageBudget.maxDimension.label': 'Max afbeeldingsdimensie', 'st.imageBudget.maxDimension.desc': 'Grootste zijde (breedte of hoogte) in pixels...', 'st.imageBudget.warning': '⚠️ Deze instellingen gelden voor schermafbeeldingen vastgelegd voor visie...', - 'st.redaction.heading': 'Schermafbeeldingreductie', 'st.redaction.toggle.label': 'Gevoelige inhoud onleesbaar maken op schermafbeeldingen', 'st.redaction.toggle.desc': 'Voordat een schermafbeelding naar een viemodel wordt verzonden, maak formuliervelden onleesbaar...', 'st.redaction.warning': '⚠️ Op basis van inschatting en faalt open...', @@ -1159,7 +1155,7 @@ export default { 'st.providers.compat.value.max': 'Max', 'st.providers.compat.value.system': 'Systeem', 'st.providers.compat.value.developer': 'Ontwikkelaar', - 'st.providers.webbrain_data_use.body': 'Gratis wekelijks WebBrain Compass-gebruik is inbegrepen. Zolang „Help WebBrain verbeteren“ standaard is ingeschakeld, kunnen geselecteerde Compass-gesprekken worden bewaard en gebruikt voor evaluatie, verbetering, fine-tuning en training. Schakel dit uit onder Algemeen → Geavanceerd om toekomstige Compass-interacties van dit gebruik uit te sluiten. Verzoeken aan lokale modellen en je eigen API worden door WebBrain alleen verzameld wanneer je de provideroptie “Query’s delen voor onderzoek” inschakelt. {privacyLink}. Abonneer u voor meer gebruik via {subscribeLink}. Beheer facturering via {accountLink}.', + 'st.providers.webbrain_data_use.body': 'Gratis wekelijks WebBrain Compass-gebruik is inbegrepen. Zolang „Help WebBrain verbeteren“ standaard is ingeschakeld, kunnen geselecteerde Compass-gesprekken worden bewaard en gebruikt voor evaluatie, verbetering, fine-tuning en training. Schakel dit uit onder Instellingen → Geavanceerd om toekomstige Compass-interacties van dit gebruik uit te sluiten. Verzoeken aan lokale modellen en je eigen API worden door WebBrain alleen verzameld wanneer je de provideroptie “Query’s delen voor onderzoek” inschakelt. {privacyLink}. Abonneer u voor meer gebruik via {subscribeLink}. Beheer facturering via {accountLink}.', 'st.providers.share_research.label': "Query’s delen voor onderzoek", 'st.providers.share_research.hint': "Verzendt prompts en antwoorden van deze provider naar WebBrain voor evaluatie en verbetering, inclusief de gebruikte provider en het model. Afbeeldingen en binaire bijlagen worden verwijderd en tekst wordt ingekort vóór het delen; de resterende tekst wordt ongewijzigd verzonden.", 'st.providers.share_research.confirm': "Query’s van deze provider delen met WebBrain voor onderzoek?\n\nIndien ingeschakeld worden je prompts, antwoorden en toolinteracties met deze provider samen met de provider- en modelnaam naar WebBrain verzonden voor evaluatie en verbetering. Tekst wordt ongewijzigd verzonden na het verwijderen van afbeeldingen en het inkorten van lange inhoud; deel dus geen gevoelige persoonsgegevens. Je kunt dit op elk moment uitschakelen om verder delen te stoppen.", @@ -1250,7 +1246,7 @@ export default { "st.sync.confirm.reset": "De gecodeerde cloudkopie vervangen door de huidige WebBrain-installatie van dit apparaat?", "st.sync.consent.legacy": "Versleutelde synchronisatie inschakelen? WebBrain verzendt een end-to-end gecodeerde kopie van uw herinneringen, automatisch aanvullen van profielen en API-sleutelproviderinstellingen naar WebBrain Compass. Chatgeschiedenis en OAuth-aanmeldingen worden niet gesynchroniseerd.", "st.sync.consent.denied": "Er is geen versleutelde synchronisatietoestemming verleend.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "De pagina is gewijzigd terwijl de taak actief was ({before} → {after}). De taak wordt voortgezet.", 'sp.activity.generating_answer': "Antwoord wordt gegenereerd…", 'sp.activity.retrying_response': "Antwoord opnieuw proberen…", diff --git a/src/firefox/src/ui/locales/pl.js b/src/firefox/src/ui/locales/pl.js index 38279d2399..eb155e019e 100644 --- a/src/firefox/src/ui/locales/pl.js +++ b/src/firefox/src/ui/locales/pl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Pomniejsz interfejs rozszerzenia', 'sp.ui_scale.increase': 'Powiększ interfejs rozszerzenia', 'sp.ui_scale.reset': 'Resetuj', - 'st.display.ui_scale.label': 'Powiększenie interfejsu rozszerzenia', - 'st.display.ui_scale.decrease': 'Pomniejsz interfejs rozszerzenia', - 'st.display.ui_scale.increase': 'Powiększ interfejs rozszerzenia', - 'st.display.ui_scale.reset': 'Resetuj', - 'st.display.ui_scale.desc': 'Zmień rozmiar panelu bocznego i osobnego okna czatu bez zmieniania powiększenia strony.', - 'st.display.ui_scale.shortcuts': 'Dedykowane skróty: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Nie przypisano', - 'st.display.ui_scale.manage_shortcuts': 'Dostosuj skróty', 'tool.delegate_research': 'Badanie z ChatGPT', 'st.display.research_escalation.label': 'Eskalacja badań', 'st.display.research_escalation.desc': 'Po włączeniu WebBrain może poprosić o zgodę przed wysłaniem do ChatGPT wyjątkowo złożonego polecenia badawczego tylko do odczytu. Domyślnie wyłączone. Dokładne polecenie jest udostępniane wyłącznie po wyraźnej zgodzie użytkownika.', @@ -383,7 +375,7 @@ export default { 'sp.step.input_label': 'Wejście', 'sp.step.result_label': 'Wynik', 'sp.api.enabled_html': '🔓 Modyfikacje API włączone dla tej rozmowy. Agent może teraz używać POST/PUT/PATCH/DELETE przez fetch_url i execute_js, gdy uzna API za bardziej niezawodne niż interfejs dla danego kroku. Domyślnie nadal preferowany jest interfejs. Ta flaga jest czyszczona po zresetowaniu rozmowy.', - 'sp.permissions.disabled_html': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania bez pytania. Włącz ponownie w Ustawienia → Uprawnienia → Pytaj przed istotnymi działaniami.', + 'sp.permissions.disabled_html': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania bez pytania. Włącz ponownie przyciskiem ⚠ obok mikrofonu.', 'sp.permissions.button': 'Pytania o uprawnienia: włączone', 'sp.permissions.button_off': 'Pytania o uprawnienia: wyłączone', 'sp.permissions.gate_desc': 'WebBrain pyta za pierwszym razem, gdy klika, pisze, pobiera pliki lub uruchamia kod na stronie.', @@ -521,19 +513,28 @@ export default { 'ob.btn.done': 'Rozpocznij', 'ob.btn.skip': 'Pomiń na razie', 'ob.btn.start': 'Rozpocznij', - 'ob.cloud.body': 'WebBrain Compass jest gotowy z bezpłatnym tygodniowym przydziałem. Wybrane rozmowy Compass mogą być zachowane i użyte do ulepszenia WebBrain, dopóki Pomóż ulepszyć WebBrain jest domyślnie włączony. Możesz to wyłączyć w Ustawienia → Ogólne.', + 'ob.cloud.body': 'WebBrain Compass jest gotowy z bezpłatnym tygodniowym przydziałem. Wybrane rozmowy Compass mogą być zachowane i użyte do ulepszenia WebBrain, dopóki Pomóż ulepszyć WebBrain jest domyślnie włączony. Możesz to wyłączyć w Ustawienia → Zaawansowane.', 'ob.cloud.change': 'Zmień', 'ob.cloud.using': 'Korzystanie z WebBrain Compass.', 'st.title': 'Ustawienia WebBrain', - 'st.subtitle': 'Skonfiguruj dostawców LLM i preferencje · v{version}', + 'st.subtitle': 'Skonfiguruj działanie WebBrain · v{version}', 'st.tab.display': 'Ogólne', + 'st.tab.budgets': 'Budżety', + 'st.tab.advanced': 'Zaawansowane', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Mowa', + 'st.tab.generative': 'Generatywne', + 'st.tab.decision': 'Decyzje', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Dostawcy WebBrain', + 'st.providers_page.subtitle': 'Wybierz modele, których używa WebBrain · v{version}', + 'st.permissions_page.title': 'Uprawnienia WebBrain', + 'st.permissions_page.subtitle': 'Witryny, w których WebBrain może działać bez pytania', 'st.tab.providers': 'Dostawcy', 'st.tab.vision': 'Wizja', - 'st.tab.multimodal': "Modele pomocnicze", 'st.tab.profile': 'Profil', 'st.tab.account': 'Konto', 'st.tab.captcha': 'CAPTCHA', - 'st.tab.permissions': 'Uprawnienia', 'st.perms.gate.label': 'Pytaj przed istotnymi działaniami', 'st.perms.gate.desc': 'Zalecane. Po włączeniu WebBrain pyta o pozwolenie przy pierwszym kliknięciu, pisaniu, nawigacji, uruchomieniu JavaScriptu, przesyłaniu, pobieraniu, nagrywaniu lub planowaniu przyszłych działań na stronie (a następnie zapamiętuje Twój wybór). Wyłącz, aby szybko korzystać bez pytań na stronach, którym w pełni ufasz.', 'st.perms.gate.warning': '⚠️ Pytania o uprawnienia są WYŁĄCZONE. WebBrain będzie klikać, pisać, nawigować, uruchamiać JavaScript, przesyłać, pobierać, nagrywać i planować przyszłe działania na każdej stronie BEZ pytania — w tym na stronach, których treść może być kontrolowana przez atakującego. Treść strony jest nadal wewnętrznie traktowana jako niezaufana, ale nic nie powstrzyma wstrzykniętego polecenia przed wywołaniem działania. Zostaw to wyłączone tylko, jeśli w pełni ufasz każdej stronie, na której używasz asystenta.', @@ -552,8 +553,6 @@ export default { "st.account.payment_failed": "Nie udało się zrealizować płatności za subskrypcję. Zaktualizuj metodę płatności, aby przywrócić płatny plan.", "st.account.update_payment": "Zaktualizuj metodę płatności", 'st.account.manage_billing': 'Zarządzaj rozliczeniami', - 'st.display.language.label': 'Język', - 'st.display.language.desc': 'Język interfejsu wtyczki WebBrain.', 'st.display.theme.label': 'Wygląd', 'st.display.theme.desc': 'Jasny, ciemny lub zgodny z ustawieniem systemu.', 'st.display.theme.system': 'Systemowy', @@ -576,20 +575,18 @@ export default { 'st.display.auto_screenshot.label': 'Automatyczny zrzut ekranu', "st.display.auto_screenshot.desc": "Automatycznie przechwytuj zrzut widocznego obszaru po działaniu agenta na stronie, aby wybrana trasa wizyjna mogła zobaczyć zmianę. Zużywa to więcej tokenów. Jeśli wizja jest niedostępna, wzbogacanie jest pomijane, a zadanie jest kontynuowane z komunikatem o stanie.", 'st.display.auto_screenshot.off': 'Wyłączone', - 'st.display.auto_screenshot.navigation': 'Przy nawigacji', - 'st.display.auto_screenshot.state_change': 'Przy zmianie stanu (domyślnie)', + 'st.display.auto_screenshot.navigation': 'Przy nawigacji (domyślnie)', + 'st.display.auto_screenshot.state_change': 'Przy zmianie stanu', 'st.display.auto_screenshot.every_step': 'Przy każdym kroku', 'st.display.tracing.label': 'Rejestruj ślady (do porównywania modeli)', - 'st.display.tracing.desc_html': 'Zapisuj każde wykonanie (żądania LLM, odpowiedzi, wywołania narzędzi, zrzuty ekranu) w lokalnej bazie IndexedDB, aby móc je analizować i porównywać modele obok siebie. Otwiera się w osobnej karcie Ślady. Domyślnie wyłączone, ponieważ dodaje zapisy na dysk przy każdym kroku. Otwórz stronę Ślady →', - 'st.display.lossless_tracing.label': 'Zapisuj pełne szczegóły żądań (poziom debugowania)', - 'st.display.lossless_tracing.desc_html': 'Zapisuje również pełne prompty, wiadomości i schematy narzędzi każdego żądania LLM zamiast podsumowań bez treści oraz przechowuje do 200 KB każdego wyniku narzędzia. Umożliwia głębokie debugowanie i rekonstrukcję żądań. Wyłączone domyślnie, ponieważ zapisuje treść rozmowy lokalnie i zużywa znacznie więcej miejsca. Wymaga włączonego zapisu śladów.', + 'st.display.tracing.desc_html': 'Zapisuj każde wykonanie (żądania LLM, odpowiedzi, wywołania narzędzi, zrzuty ekranu) w lokalnej bazie IndexedDB, aby móc analizować i porównywać modele obok siebie, wraz z pełnymi promptami, wiadomościami i schematami narzędzi każdego żądania LLM oraz do 200 KB każdego wyniku narzędzia. Otwiera się w osobnej karcie Ślady. Domyślnie wyłączone, ponieważ zapisuje treść rozmowy lokalnie i zużywa znacznie więcej miejsca. Otwórz stronę Ślady →', 'st.display.cost_session_limit.label': 'Limit kosztów chmury na sesję', 'st.display.cost_session_limit.desc': 'Zatrzymuje wykonania w chmurze i OpenRouter przed kolejnym płatnym wywołaniem modelu, gdy ta sesja osiągnie zgłoszony lub szacowany limit kosztów. Domyślnie 10 USD.', 'st.display.cost_total_limit.label': 'Całkowity limit kosztów chmury', 'st.display.cost_total_limit.desc': 'Śledzi zgłoszone lub szacowane wydatki na modele chmury/OpenRouter w całym rozszerzeniu i zatrzymuje dalsze płatne wywołania po osiągnięciu limitu. Dostawcy lokalni nie są liczeni.', 'st.display.cost_reset': 'Zresetuj wydatki', 'st.display.strict_secret.label': 'Ścisłe traktowanie sekretów', - 'st.display.strict_secret.desc': 'Odmawiaj cytowania poświadczeń (hasła, klucze API, tokeny, kody OTP) w podsumowaniach lub tekście asystenta — nawet gdy o nie wprost poprosisz. Przydatne, jeśli regularnie udostępniasz pliki śladów lub ekran. Domyślnie wyłączone, dzięki czemu agent może powtórzyć dokładną wartość, o którą poprosisz, gdy jej potrzebujesz. Włącz je (Ustawienia → Bezpieczeństwo), gdy chcesz, aby podsumowania `done` pozostały uporządkowane, a poświadczenia nigdy nie były powtarzane.', + 'st.display.strict_secret.desc': 'Odmawiaj cytowania poświadczeń (hasła, klucze API, tokeny, kody OTP) w podsumowaniach lub tekście asystenta — nawet gdy o nie wprost poprosisz. Przydatne, jeśli regularnie udostępniasz pliki śladów lub ekran. Domyślnie wyłączone, dzięki czemu agent może powtórzyć dokładną wartość, o którą poprosisz, gdy jej potrzebujesz. Włącz je, gdy chcesz, aby podsumowania `done` pozostały uporządkowane, a poświadczenia nigdy nie były powtarzane.', 'st.display.allow_local_network.label': 'Zezwól agentowi na dostęp do sieci lokalnej', 'st.display.allow_local_network.desc': 'Pozwala narzędziu fetch_url agenta sięgać do pętli zwrotnej (127.0.0.1, localhost) i adresów prywatnych/RFC1918 (10.x, 192.168.x, 172.16–31.x). Przydatne dla lokalnych serwerów deweloperskich, narzędzi intranetowych lub samodzielnie hostowanych API. Domyślnie wyłączone. Gdy opcja jest wyłączona, blokowane są URL z wpisanym bezpośrednio prywatnym adresem IP lub adresem pętli zwrotnej oraz nazwy localhost. Rozwiązywanie DNS nie jest sprawdzane, więc inne nazwy hostów mogą nadal prowadzić do adresów lokalnych. Dosłowne adresy IP metadanych chmury (169.254.169.254) i nazwy metadanych z listy lub *.internal/*.local pozostają zablokowane także po włączeniu.', 'st.display.scheduled_tasks.label': 'Zaplanowane zadania', @@ -889,8 +886,8 @@ export default { 'sp.slash.busy_only_oob': 'Wiadomości są kolejkowane, gdy WebBrain jest zajęty. Tylko /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces i /verbose mogą uruchamiać się od razu jako polecenia slash.', 'tool.go_back': 'Cofanie', 'tool.go_forward': 'Przechodzenie do przodu', - 'st.display.search.placeholder': 'Szukaj w ustawieniach ogólnych', - 'st.display.search.empty': 'Brak pasujących ustawień ogólnych.', + 'st.display.search.placeholder': 'Szukaj w ustawieniach', + 'st.display.search.empty': 'Brak pasujących ustawień.', 'st.display.advanced': 'Zaawansowane', ...getApocalypseModeCopy('pl'), ...getEmergencyBoxCopy('pl'), @@ -1138,7 +1135,6 @@ export default { "st.imageBudget.maxDimension.desc": "Najdłuższy bok (szerokość lub wysokość) w pikselach dla każdego zrzutu wysyłanego do vision. Niższy limit zmniejsza obrazy przed wysłaniem, tnąc tokeny i koszt. Wyższy limit zachowuje wierność.", "st.imageBudget.warning": "⚠️ Te ustawienia dotyczą zrzutów na vision (auto-zrzut, /screenshot, cała strona, verify_form). Ręcznie zapisane obrazy w pełnej rozdzielczości nie są objęte. «Image detail» honorują endpointy w stylu OpenAI; inni dostawcy mogą to ignorować.", - "st.redaction.heading": "Redakcja zrzutów ekranu", "st.redaction.toggle.label": "Redaguj poufną treść na zrzutach ekranu", "st.redaction.toggle.desc": "Zanim zrzut ekranu zostanie wysłany do modelu wizyjnego, rozmywa pola formularzy oraz tekst wyglądający jak e-mail lub numer telefonu. Wykrywanie działa całkowicie na Twoim urządzeniu — nic dodatkowego nie jest przesyłane.", "st.redaction.warning": "⚠️ To redakcja typu best-effort i fail-open: jeśli redakcja nie może zadziałać na danej stronie (np. tuż po nawigacji, w przeglądarkach PDF lub na ograniczonych stronach przeglądarki), zrzut ekranu i tak zostanie wysłany bez redakcji. Wykrywanie opiera się wyłącznie na heurystykach DOM — tekst narysowany na canvasie, dane osobowe wewnątrz obrazów lub cokolwiek nierozpoznanego jako pole formularza czy tekst e-mail/telefon może zostać pominięte, a tekst strony wysyłany do modelu nie jest redagowany przez to ustawienie. To NIE jest gwarancja bezpieczeństwa. Dla pełnej prywatności użyj lokalnego/offline'owego modelu (llama.cpp, Ollama): wtedy zrzuty ekranu nigdy nie opuszczają Twojego urządzenia, a redakcja przestaje być potrzebna.", @@ -1152,7 +1148,7 @@ export default { "sp.slash.export_traces_full": "Eksportuj całą zapisaną sesję śledzenia jako JSON, wraz ze zrzutami ekranu", "sp.export_traces.recording_truncated": "Wyeksportowano wszystkie zapisane rekordy jako JSON. Treści pominiętych podczas rejestrowania nie można odzyskać przez eksport.", "sp.slash.export_traces": "Eksportuj łańcuch narzędzi (ślady)", - "sp.export_traces.none": "Brak śladów dla tej rozmowy. Włącz „Rejestruj ślady\" w Ustawieniach i uruchom ponownie.", + "sp.export_traces.none": "Brak śladów dla tej rozmowy. Włącz „Rejestruj ślady\" w Ustawieniach → Zaawansowane i uruchom ponownie.", "sp.export_traces.error": "Nie udało się wyeksportować śladów.", "sp.export_traces.done": "Wyeksportowano łańcuch narzędzi.", "sp.export_traces.no_conversation": "Nie ma jeszcze nic do eksportu — najpierw rozpocznij rozmowę.", @@ -1160,7 +1156,7 @@ export default { "sp.export_traces.truncated": "Wyeksportowano łańcuch narzędzi. Starsze tury mogą brakować, jeśli ta rozmowa ma wiele śladów.", "st.display.help_improve.label": "Pomóż ulepszać WebBrain", "st.display.help_improve.desc_html": "Zezwól na przechowywanie wybranych interakcji z WebBrain Compass i używanie ich do oceny, ulepszania, dostrajania i trenowania. Domyślnie włączone. Wyłącz, aby przyszłe interakcje Compass nie były używane do tych celów. WebBrain zbiera żądania modeli lokalnych i własnych API wyłącznie od dostawców, u których włączysz „Udostępniaj zapytania do badań”. Polityka prywatności →", - "st.providers.webbrain_data_use.body": "Darmowe dzienne korzystanie z WebBrain Compass jest wliczone. Gdy opcja „Pomóż ulepszać WebBrain” jest domyślnie włączona, wybrane rozmowy Compass mogą być przechowywane i używane do oceny, ulepszania, dostrajania i trenowania. Wyłącz ją w Ogólne → Zaawansowane, aby wykluczyć przyszłe interakcje Compass z tych zastosowań. WebBrain zbiera żądania modeli lokalnych i własnych API tylko wtedy, gdy włączysz opcję „Udostępniaj zapytania do badań” dla danego dostawcy. {privacyLink}. Aby korzystać więcej, subskrybuj na {subscribeLink}. Zarządzaj rozliczeniami na {accountLink}.", + "st.providers.webbrain_data_use.body": "Darmowe dzienne korzystanie z WebBrain Compass jest wliczone. Gdy opcja „Pomóż ulepszać WebBrain” jest domyślnie włączona, wybrane rozmowy Compass mogą być przechowywane i używane do oceny, ulepszania, dostrajania i trenowania. Wyłącz ją w Ustawienia → Zaawansowane, aby wykluczyć przyszłe interakcje Compass z tych zastosowań. WebBrain zbiera żądania modeli lokalnych i własnych API tylko wtedy, gdy włączysz opcję „Udostępniaj zapytania do badań” dla danego dostawcy. {privacyLink}. Aby korzystać więcej, subskrybuj na {subscribeLink}. Zarządzaj rozliczeniami na {accountLink}.", 'st.providers.share_research.label': "Udostępniaj zapytania do badań", 'st.providers.share_research.hint': "Wysyła prompty i odpowiedzi tego dostawcy do WebBrain w celu oceny i ulepszania, wraz z nazwą dostawcy i modelu. Obrazy i załączniki binarne są usuwane, a tekst jest przycinany przed udostępnieniem; pozostały tekst jest wysyłany bez zmian.", 'st.providers.share_research.confirm': "Udostępniać zapytania tego dostawcy WebBrain do badań?\n\nPo włączeniu Twoje prompty, odpowiedzi i interakcje narzędzi z tym dostawcą będą wysyłane do WebBrain w celu oceny i ulepszania, wraz z nazwą dostawcy i modelu. Tekst jest wysyłany bez zmian po usunięciu obrazów i przycięciu długich treści, dlatego unikaj udostępniania wrażliwych danych osobowych. Możesz to w każdej chwili wyłączyć, aby zatrzymać udostępnianie.", @@ -1175,7 +1171,7 @@ export default { "sp.perm.skip_hint": "Chcesz mniej przerw? „Zawsze zezwalaj” zapamiętuje tę witrynę. Poniższe polecenie wyłącza pytania WebBrain o uprawnienia we wszystkich witrynach.", "sp.perm.insert_skip_command": "Wstaw /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Szkic pozostał bez zmian. Wyczyść go przed wstawieniem polecenia.", - "ob.act.permissions_tip": "Pytania o uprawnienia są domyślnie włączone. Zaawansowani użytkownicy mogą wyłączyć je globalnie poleceniem /dangerously-skip-permissions i ponownie włączyć w Ustawienia → Uprawnienia.", + "ob.act.permissions_tip": "Pytania o uprawnienia są domyślnie włączone. Zaawansowani użytkownicy mogą wyłączyć je globalnie poleceniem /dangerously-skip-permissions i ponownie włączyć przyciskiem ⚠ obok mikrofonu.", 'st.provider.field.cache_read_cost_per_million': "Szacowany koszt odczytu z pamięci podręcznej ($ / 1M tokenów)", 'st.provider.field.cache_write_cost_per_million': "Szacowany koszt zapisu do pamięci podręcznej (5 min) ($ / 1M tokenów)", 'st.provider.field.cache_write_1h_cost_per_million': "Szacowany koszt zapisu do pamięci podręcznej (1 godz.) ($ / 1M tokenów)", @@ -1237,7 +1233,7 @@ export default { "st.sync.confirm.reset": "Zastąpić zaszyfrowaną kopię w chmurze bieżącą konfiguracją WebBrain tego urządzenia?", "st.sync.consent.legacy": "Włączyć szyfrowaną synchronizację? WebBrain prześle kompleksowo zaszyfrowaną kopię Twoich wspomnień, autouzupełniania profilu i ustawień dostawcy klucza API do WebBrain Compass. Historia czatów i logowania OAuth nie są synchronizowane.", "st.sync.consent.denied": "Nie przyznano zezwolenia na szyfrowaną synchronizację.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Strona zmieniła się podczas wykonywania zadania ({before} → {after}). Zadanie jest kontynuowane.", 'sp.activity.generating_answer': "Generowanie odpowiedzi…", 'sp.activity.retrying_response': "Ponawianie odpowiedzi…", diff --git a/src/firefox/src/ui/locales/pt.js b/src/firefox/src/ui/locales/pt.js index 3771257b90..3057b15bf1 100644 --- a/src/firefox/src/ui/locales/pt.js +++ b/src/firefox/src/ui/locales/pt.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Reduzir o zoom da interface', 'sp.ui_scale.increase': 'Aumentar o zoom da interface', 'sp.ui_scale.reset': 'Redefinir', - 'st.display.ui_scale.label': 'Zoom da interface da extensão', - 'st.display.ui_scale.decrease': 'Reduzir o zoom da interface', - 'st.display.ui_scale.increase': 'Aumentar o zoom da interface', - 'st.display.ui_scale.reset': 'Redefinir', - 'st.display.ui_scale.desc': 'Redimensiona o painel lateral e a janela de chat independente sem alterar o zoom da página.', - 'st.display.ui_scale.shortcuts': 'Atalhos dedicados: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Não atribuído', - 'st.display.ui_scale.manage_shortcuts': 'Personalizar atalhos', 'tool.delegate_research': 'Pesquisando com ChatGPT', 'st.display.research_escalation.label': 'Escalonamento de pesquisa', 'st.display.research_escalation.desc': 'Quando ativado, o WebBrain pode pedir permissão antes de enviar ao ChatGPT uma solicitação de pesquisa somente leitura incomumente complexa. Desativado por padrão. A solicitação exata só é compartilhada após sua aprovação explícita.', @@ -497,7 +489,7 @@ export default { 'sp.step.result_label': "Resultado", 'sp.api.enabled_html': "🔓 Mutações de API ativadas para esta conversa. O agente agora pode usar POST/PUT/PATCH/DELETE via fetch_url e execute_js quando julgar que a API é mais confiável do que a UI para uma etapa. UI-first continua sendo o padrão. Esse sinalizador é apagado quando você reinicia a conversa.", - 'sp.permissions.disabled_html': "⚠️ Os prompts de permissão estão DESATIVADOS. WebBrain clicará, digitará, navegará, executará JavaScript, fará upload, baixará, gravará e agendará trabalhos futuros sem perguntar primeiro. Reative isso em Configurações → Permissões → Perguntar antes de ações consequentes.", + 'sp.permissions.disabled_html': "⚠️ Os prompts de permissão estão DESATIVADOS. WebBrain clicará, digitará, navegará, executará JavaScript, fará upload, baixará, gravará e agendará trabalhos futuros sem perguntar primeiro. Reative isso no botão ⚠ ao lado do microfone.", 'sp.permissions.button': 'Prompts de permissão: ativados', 'sp.permissions.button_off': 'Prompts de permissão: desativados', 'sp.permissions.gate_desc': 'O WebBrain pergunta na primeira vez que clica, digita, baixa arquivos ou executa código em um site.', @@ -655,7 +647,7 @@ export default { 'ob.act.warn1': "WebBrain pode capturar capturas de tela para planejamento. Evite usar o modo agente em páginas confidenciais, como portais de saúde, finanças, namoro ou contas privadas, a menos que você aceite esse risco.", 'ob.act.warn2': "O conteúdo da Web pode conter injeções de alerta maliciosas projetadas para manipular o comportamento da IA.", 'ob.act.warn3': "Sempre revise as ações sugeridas e interrompa execuções que pareçam inesperadas.", - 'ob.act.permissions_tip': "Os prompts de permissão estão ativados por padrão. Usuários avançados podem desativá-los globalmente com /dangerously-skip-permissions e reativá-los em Configurações → Permissões.", + 'ob.act.permissions_tip': "Os prompts de permissão estão ativados por padrão. Usuários avançados podem desativá-los globalmente com /dangerously-skip-permissions e reativá-los no botão ⚠ ao lado do microfone.", 'ob.tokens.title': "Escolha um modelo", 'ob.tokens.body': "WebBrain precisa de um modelo de linguagem para funcionar. Verificaremos primeiro os modelos locais. Se nenhum estiver disponível, abra Configurações e adicione um provedor:", 'ob.tokens.scanning': "Verificando modelos locais...", @@ -681,23 +673,32 @@ export default { 'ob.btn.done': "Comece", 'ob.btn.skip': "Pular por enquanto", 'ob.btn.start': 'Iniciar', - 'ob.cloud.body': 'WebBrain Compass está pronto com uma alocação semanal gratuita. Conversas selecionadas do Compass podem ser retidas e usadas para melhorar o WebBrain enquanto Ajuda a Melhorar o WebBrain está ativado por padrão. Você pode desativá-lo em Configurações → Geral.', + 'ob.cloud.body': 'WebBrain Compass está pronto com uma alocação semanal gratuita. Conversas selecionadas do Compass podem ser retidas e usadas para melhorar o WebBrain enquanto Ajuda a Melhorar o WebBrain está ativado por padrão. Você pode desativá-lo em Configurações → Avançado.', 'ob.cloud.change': 'Alterar', 'ob.cloud.using': 'Usando WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "Configurações WebBrain", - 'st.subtitle': "Configure seus provedores e preferências de LLM · v{version}", + 'st.subtitle': "Configure como o WebBrain funciona · v{version}", 'st.tab.display': "Geral", + 'st.tab.budgets': 'Orçamentos', + 'st.tab.advanced': 'Avançado', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Fala', + 'st.tab.generative': 'Generativo', + 'st.tab.decision': 'Decisão', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Provedores do WebBrain', + 'st.providers_page.subtitle': 'Escolha os modelos que o WebBrain usa · v{version}', + 'st.permissions_page.title': 'Permissões do WebBrain', + 'st.permissions_page.subtitle': 'Sites onde o WebBrain pode agir sem perguntar antes', 'st.tab.providers': "Provedores", 'st.tab.skills': "Habilidades", 'st.tab.vision': "Visão", - 'st.tab.multimodal': "Modelos auxiliares", 'st.tab.memory': "Memória", 'st.tab.profile': "Perfil", 'st.tab.account': "Conta", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "Permissões", 'st.perms.gate.label': "Pergunte antes de ações consequentes", 'st.perms.gate.desc': "Recomendado. Quando ativado, WebBrain pede permissão na primeira vez que clica, digita, navega, executa JavaScript, carrega, baixa, registra ou agenda trabalhos futuros em um site (depois lembra sua escolha). Desligue para uso rápido e gratuito em sites em que você confia totalmente.", @@ -719,8 +720,6 @@ export default { "st.account.update_payment": "Atualizar método de pagamento", 'st.account.manage_billing': "Gerenciar faturamento", - 'st.display.language.label': "Idioma", - 'st.display.language.desc': "Linguagem de interface para o plugin WebBrain.", 'st.display.theme.label': "Aparência", 'st.display.theme.desc': "Claro, escuro ou siga a configuração do seu sistema operacional.", 'st.display.theme.system': "Sistema", @@ -730,8 +729,8 @@ export default { 'st.display.download_directory.desc': "Subpasta opcional dentro do seu navegador ou diretório de downloads do sistema. Deixe em branco para usar o padrão do sistema.", 'st.display.download_directory.placeholder': "Padrão do sistema", 'st.display.download_directory.error': "Use uma pasta relativa como WebBrain ou Work/WebBrain. Caminhos absolutos e “..” não são permitidos.", - 'st.display.search.placeholder': "Pesquisar configurações gerais", - 'st.display.search.empty': "Nenhuma configuração geral corresponde.", + 'st.display.search.placeholder': "Pesquisar configurações", + 'st.display.search.empty': "Nenhuma configuração corresponde.", 'st.display.advanced': "Avançado", ...getApocalypseModeCopy('pt'), ...getEmergencyBoxCopy('pt'), @@ -787,20 +786,18 @@ export default { 'st.display.auto_screenshot.label': "Captura de tela automática", "st.display.auto_screenshot.desc": "Capture automaticamente a janela de visualização depois que o agente atuar na página, para que a rota de visão selecionada veja o que mudou. Isso consome mais tokens. Se a visão estiver indisponível, o enriquecimento será ignorado e a tarefa continuará com um aviso de status.", 'st.display.auto_screenshot.off': "Desligado", - 'st.display.auto_screenshot.navigation': "Na navegação", - 'st.display.auto_screenshot.state_change': "Na mudança de estado (padrão)", + 'st.display.auto_screenshot.navigation': "Na navegação (padrão)", + 'st.display.auto_screenshot.state_change': "Na mudança de estado", 'st.display.auto_screenshot.every_step': "Cada passo", 'st.display.tracing.label': "Registrar rastreamentos (para comparação de modelos)", - 'st.display.tracing.desc_html': "Persista cada execução (solicitações LLM, respostas, chamadas de ferramentas, capturas de tela) no IndexedDB local para que você possa inspecionar e comparar modelos lado a lado. Abre em uma guia Traces separada. Desativado por padrão porque adiciona gravações de disco por etapa. Abra a página Traces →", - 'st.display.lossless_tracing.label': 'Registrar detalhes completos da solicitação (nível de depuração)', - 'st.display.lossless_tracing.desc_html': 'Também persiste os prompts, mensagens e esquemas de ferramentas completos de cada solicitação LLM em vez de resumos sem conteúdo, e mantém até 200 KB de cada resultado de ferramenta. Permite depuração profunda e reconstrução de solicitações. Desativado por padrão porque grava o conteúdo da sua conversa localmente e usa muito mais disco. Exige que o registro de rastros esteja ativado.', + 'st.display.tracing.desc_html': "Persista cada execução (solicitações LLM, respostas, chamadas de ferramentas, capturas de tela) no IndexedDB local para que você possa inspecionar e comparar modelos lado a lado, incluindo os prompts, mensagens e esquemas de ferramentas completos de cada solicitação LLM e até 200 KB de cada resultado de ferramenta. Abre em uma guia Traces separada. Desativado por padrão porque grava o conteúdo da sua conversa localmente e usa muito mais disco. Abra a página Traces →", 'st.display.cost_session_limit.label': "Subsídio de sessão de custo na nuvem", 'st.display.cost_session_limit.desc': "Interrompe a nuvem e OpenRouter é executado antes de outra chamada de modelo pago quando esta sessão atinge o limite de custo relatado ou estimado. Padrão $ 10.", 'st.display.cost_total_limit.label': "Permissão total de custos de nuvem", 'st.display.cost_total_limit.desc': "Rastreia os gastos relatados ou estimados do modelo de nuvem/OpenRouter em todo o ramal e interrompe outras chamadas pagas no limite. Os provedores locais não são contabilizados.", 'st.display.cost_reset': "Redefinir gastos", 'st.display.strict_secret.label': "Tratamento estrito de segredos", - 'st.display.strict_secret.desc': "Recuse-se a citar credenciais (senhas, chaves de API, tokens, OTPs) em resumos ou textos de assistente – mesmo quando você as solicitar explicitamente. Útil se você compartilha regularmente arquivos de rastreamento ou compartilhamento de tela. Desativado por padrão para que o agente possa repetir o valor exato que você pedir quando precisar. Ative-o (Configurações → Segurança) quando quiser manter os resumos `done` organizados e evitar que credenciais sejam repetidas.", + 'st.display.strict_secret.desc': "Recuse-se a citar credenciais (senhas, chaves de API, tokens, OTPs) em resumos ou textos de assistente – mesmo quando você as solicitar explicitamente. Útil se você compartilha regularmente arquivos de rastreamento ou compartilhamento de tela. Desativado por padrão para que o agente possa repetir o valor exato que você pedir quando precisar. Ative-o quando quiser manter os resumos `done` organizados e evitar que credenciais sejam repetidas.", 'st.display.allow_local_network.label': "Permitir que o agente acesse a rede local", 'st.display.allow_local_network.desc': "Permite que a ferramenta fetch_url do agente alcance loopback (127.0.0.1, localhost) e endereços privados/RFC1918 (10.x, 192.168.x, 172.16–31.x). Útil para servidores de desenvolvimento locais, ferramentas de intranet ou APIs auto-hospedadas. Desativado por padrão. Quando desativado, URLs com IPs privados ou de loopback escritos diretamente e nomes localhost são bloqueados. A resolução DNS não é verificada, então outros nomes de host ainda podem alcançar endereços locais. IPs literais de metadados da nuvem (169.254.169.254) e nomes de metadados listados ou *.internal/*.local continuam bloqueados mesmo quando ativado.", 'st.display.scheduled_tasks.label': "Tarefas agendadas", @@ -890,7 +887,7 @@ export default { 'st.providers.compat.value.max': "Máx.", 'st.providers.compat.value.system': "Sistema", 'st.providers.compat.value.developer': "Desenvolvedor", - 'st.providers.webbrain_data_use.body': "O uso diário gratuito do WebBrain Compass está incluído. Embora Ajudar a melhorar WebBrain esteja ativado por padrão, conversas selecionadas no Compass podem ser retidas e usadas para avaliação, melhoria, ajuste fino e treinamento. Desative-o em Geral → Avançado para excluir futuras interações no Compass desses usos. A WebBrain só coleta solicitações de modelos locais e de suas próprias APIs quando você ativa a opção “Compartilhar consultas para pesquisa” desse provedor. {privacyLink}. Para mais uso, assine em {subscribeLink}. Gerencie o faturamento em {accountLink}.", + 'st.providers.webbrain_data_use.body': "O uso diário gratuito do WebBrain Compass está incluído. Embora Ajudar a melhorar WebBrain esteja ativado por padrão, conversas selecionadas no Compass podem ser retidas e usadas para avaliação, melhoria, ajuste fino e treinamento. Desative-o em Configurações → Avançado para excluir futuras interações no Compass desses usos. A WebBrain só coleta solicitações de modelos locais e de suas próprias APIs quando você ativa a opção “Compartilhar consultas para pesquisa” desse provedor. {privacyLink}. Para mais uso, assine em {subscribeLink}. Gerencie o faturamento em {accountLink}.", 'st.providers.share_research.label': "Compartilhar consultas para pesquisa", 'st.providers.share_research.hint': "Envia os prompts e respostas deste provedor à WebBrain para avaliação e melhoria, incluindo o provedor e o modelo usados. Imagens e anexos binários são removidos e o texto é truncado antes do compartilhamento; o restante do texto é enviado como está.", 'st.providers.share_research.confirm': "Compartilhar as consultas deste provedor com a WebBrain para pesquisa?\n\nQuando ativado, seus prompts, respostas e interações de ferramentas com este provedor serão enviados à WebBrain para avaliação e melhoria, junto com o nome do provedor e do modelo. O texto é enviado como está após remover imagens e truncar conteúdos longos, portanto evite compartilhar dados pessoais sensíveis. Você pode desativar a qualquer momento para interromper o compartilhamento.", @@ -1035,7 +1032,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "Redação de captura de tela", 'st.redaction.toggle.label': "Editar conteúdo confidencial de capturas de tela", 'st.redaction.toggle.desc': "Antes de uma captura de tela ser enviada para um modelo de visão, desfoque os campos do formulário e o texto que se parece com um e-mail ou número de telefone. A detecção é executada inteiramente no seu dispositivo – nada extra é transmitido.", 'st.redaction.warning': "⚠️ Melhor esforço e falha na abertura: se a redação não puder ser executada em uma página (por exemplo, logo após uma navegação, em visualizadores de PDF ou em páginas restritas do navegador), a captura de tela ainda será enviada sem edição. A detecção usa apenas heurística DOM – texto desenhado em tela, PII dentro de imagens ou qualquer coisa não reconhecida como um campo de formulário ou texto de e-mail/telefone pode passar despercebido e o texto da página enviado ao modelo não é editado por esta configuração. NÃO é uma garantia de segurança. Para total privacidade, use um modelo local/offline (llama.cpp, Ollama): as capturas de tela nunca saem da sua máquina e a redação é desnecessária.", @@ -1223,7 +1219,7 @@ export default { "sp.slash.export_traces_full": "Exportar toda a sessão de rastreamento salva como JSON, incluindo capturas de tela", "sp.export_traces.recording_truncated": "Todos os registros salvos foram exportados como JSON. O conteúdo omitido durante a gravação não pode ser recuperado pela exportação.", "sp.slash.export_traces": "Exportar a cadeia de ferramentas (traços)", - "sp.export_traces.none": "Não há vestígios desta conversa. Habilite Gravar rastreamentos em Configurações e execute novamente.", + "sp.export_traces.none": "Não há vestígios desta conversa. Habilite Gravar rastreamentos em Configurações → Avançado e execute novamente.", "sp.export_traces.error": "Não foi possível exportar rastreamentos.", "sp.export_traces.done": "Cadeia de ferramentas exportada.", "sp.export_traces.no_conversation": "Nada para exportar ainda – inicie uma conversa primeiro.", @@ -1297,7 +1293,7 @@ export default { "st.sync.confirm.reset": "Substituir a cópia criptografada na nuvem pela configuração atual do WebBrain deste dispositivo?", "st.sync.consent.legacy": "Ativar a sincronização criptografada? O WebBrain transmitirá uma cópia criptografada de ponta a ponta de suas memórias, preenchimento automático de perfil e configurações do provedor de chave API para o WebBrain Compass. O histórico de bate-papo e os logins do OAuth não são sincronizados.", "st.sync.consent.denied": "A permissão de sincronização criptografada não foi concedida.", - 'st.providers.webgpu_note.body': '{modelLink} é executado inteiramente no Chrome, sem endpoint de API. Baixe-o em Settings > Providers > WebGPU ou no Modo Apocalipse e use o controle nuclear no standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} é executado inteiramente no Chrome, sem endpoint de API. Baixe-o em Providers > WebGPU ou no Modo Apocalipse e use o controle nuclear no standalone chat.', 'sp.monitor.navigation': "A página mudou enquanto a tarefa estava em execução ({before} → {after}). A tarefa continua.", 'sp.activity.generating_answer': "Gerando resposta…", 'sp.activity.retrying_response': "Tentando novamente a resposta…", diff --git a/src/firefox/src/ui/locales/ru.js b/src/firefox/src/ui/locales/ru.js index 7ecf35c259..98e1562670 100644 --- a/src/firefox/src/ui/locales/ru.js +++ b/src/firefox/src/ui/locales/ru.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Уменьшить интерфейс расширения', 'sp.ui_scale.increase': 'Увеличить интерфейс расширения', 'sp.ui_scale.reset': 'Сбросить', - 'st.display.ui_scale.label': 'Масштаб интерфейса расширения', - 'st.display.ui_scale.decrease': 'Уменьшить интерфейс расширения', - 'st.display.ui_scale.increase': 'Увеличить интерфейс расширения', - 'st.display.ui_scale.reset': 'Сбросить', - 'st.display.ui_scale.desc': 'Изменяет размер боковой панели и отдельного окна чата, не меняя масштаб страницы.', - 'st.display.ui_scale.shortcuts': 'Специальные сочетания клавиш: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Не назначено', - 'st.display.ui_scale.manage_shortcuts': 'Настроить сочетания клавиш', 'tool.delegate_research': 'Исследование в ChatGPT', 'st.display.research_escalation.label': 'Эскалация исследований', 'st.display.research_escalation.desc': 'Если функция включена, WebBrain может запросить разрешение перед отправкой в ChatGPT необычно сложного исследовательского запроса только для чтения. По умолчанию выключено. Точный запрос передаётся только после вашего явного согласия.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Не продолжать", "sp.recipient.reason_unrequested": "WebBrain не смог понять из вашего запроса, что нужно отправить сообщение. Открытый диалог на {host}: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain не смог понять из вашего запроса, кому отправить это сообщение. Открытый диалог на {host}: {recipient}.", - 'st.tab.permissions': "Разрешения", 'st.perms.revoke': "Отозвать", 'st.perms.clear_all': "Очистить все разрешения", 'st.perms.gate.label': "Спрашивать перед важными действиями", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Начать', 'ob.btn.skip': 'Пропустить пока', 'ob.btn.start': 'Начать', - 'ob.cloud.body': 'WebBrain Compass готов с бесплатным дневным лимитом. Выбранные разговоры Compass могут быть сохранены и использованы для улучшения WebBrain, пока Помощь в улучшении WebBrain включена по умолчанию. Вы можете отключить это в Настройки → Основное.', + 'ob.cloud.body': 'WebBrain Compass готов с бесплатным дневным лимитом. Выбранные разговоры Compass могут быть сохранены и использованы для улучшения WebBrain, пока Помощь в улучшении WebBrain включена по умолчанию. Вы можете отключить это в Настройки → Расширенные.', 'ob.cloud.change': 'Изменить', 'ob.cloud.using': 'Используется WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Результат', 'sp.api.enabled_html': '🔓 Изменения через API включены для этого диалога. Агент теперь может использовать POST/PUT/PATCH/DELETE через fetch_url и execute_js, если посчитает API надёжнее интерфейса. По умолчанию используется интерфейс. Этот флаг сбрасывается при очистке диалога.', - 'sp.permissions.disabled_html': '⚠️ Запросы разрешений отключены. WebBrain будет нажимать, печатать, переходить, запускать JavaScript, загружать, скачивать, записывать и запланировывать будущие задачи без предварительного запроса. Включите снова в Настройки → Разрешения → Спрашивать перед важными действиями.', + 'sp.permissions.disabled_html': '⚠️ Запросы разрешений отключены. WebBrain будет нажимать, печатать, переходить, запускать JavaScript, загружать, скачивать, записывать и запланировывать будущие задачи без предварительного запроса. Включите снова кнопкой ⚠ рядом с микрофоном.', 'sp.permissions.button': 'Запросы разрешений: включены', 'sp.permissions.button_off': 'Запросы разрешений: отключены', 'sp.permissions.gate_desc': 'WebBrain спрашивает, когда впервые нажимает, вводит текст, скачивает файлы или запускает код на сайте.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Ожидание «{selector}»', 'st.title': 'Настройки WebBrain', - 'st.subtitle': 'Настройте провайдеров LLM и параметры · v{version}', + 'st.subtitle': 'Настройте работу WebBrain · v{version}', 'st.tab.display': 'Общие', + 'st.tab.budgets': 'Бюджеты', + 'st.tab.advanced': 'Расширенные', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Речь', + 'st.tab.generative': 'Генерация', + 'st.tab.decision': 'Решения', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Провайдеры WebBrain', + 'st.providers_page.subtitle': 'Выберите модели, которые использует WebBrain · v{version}', + 'st.permissions_page.title': 'Разрешения WebBrain', + 'st.permissions_page.subtitle': 'Сайты, где WebBrain может действовать, не спрашивая заранее', 'st.tab.providers': 'Провайдеры', 'st.tab.vision': 'Зрение', 'st.tab.profile': 'Профиль', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Обновить способ оплаты", 'st.account.manage_billing': 'Управление оплатой', - 'st.display.language.label': 'Язык', - 'st.display.language.desc': 'Язык интерфейса плагина WebBrain.', 'st.display.verbose.label': 'Подробный режим', 'st.display.verbose.desc': 'Показывать полные детали вызовов инструментов, аргументы и сырой JSON-результат. По умолчанию выключено для более чистого чата.', 'st.display.selection_shortcut.label': 'Быстрое действие для выделения', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Авто-скриншот', "st.display.auto_screenshot.desc": "Автоматически делайте снимок области просмотра после действий агента, чтобы выбранный маршрут обработки изображений видел изменения. Это расходует больше токенов. Если зрение недоступно, обогащение пропускается, а задача продолжается с уведомлением о состоянии.", 'st.display.auto_screenshot.off': 'Выкл.', - 'st.display.auto_screenshot.navigation': 'При навигации', - 'st.display.auto_screenshot.state_change': 'При изменении состояния (по умолчанию)', + 'st.display.auto_screenshot.navigation': 'При навигации (по умолчанию)', + 'st.display.auto_screenshot.state_change': 'При изменении состояния', 'st.display.auto_screenshot.every_step': 'Каждый шаг', 'st.display.tracing.label': 'Записывать трассы (для сравнения моделей)', - 'st.display.tracing.desc_html': 'Сохранять каждый запуск (LLM-запросы, ответы, вызовы инструментов, скриншоты) в локальную IndexedDB, чтобы можно было разбирать и сравнивать модели бок о бок. Открывается в отдельной вкладке «Трассы». По умолчанию выключено, потому что добавляет запись на диск на каждом шаге. Открыть страницу трасс →', - 'st.display.lossless_tracing.label': 'Записывать полные детали запросов (отладочный уровень)', - 'st.display.lossless_tracing.desc_html': 'Также сохраняет полные промпты, сообщения и схемы инструментов каждого LLM-запроса вместо кратких сводок без содержимого, и хранит до 200 КБ каждого результата инструмента. Позволяет глубокую отладку и восстановление запросов. Выключено по умолчанию, так как записывает содержимое вашего диалога локально и занимает заметно больше места. Требует включённой записи трасс.', + 'st.display.tracing.desc_html': 'Сохранять каждый запуск (LLM-запросы, ответы, вызовы инструментов, скриншоты) в локальную IndexedDB, чтобы можно было разбирать и сравнивать модели бок о бок, включая полные промпты, сообщения и схемы инструментов каждого LLM-запроса и до 200 КБ каждого результата инструмента. Открывается в отдельной вкладке «Трассы». По умолчанию выключено, так как записывает содержимое вашего диалога локально и занимает заметно больше места. Открыть страницу трасс →', 'st.display.allow_local_network.label': 'Разрешить агенту доступ к локальной сети', 'st.display.allow_local_network.desc': 'Разрешает инструменту fetch_url агента обращаться к loopback (127.0.0.1, localhost) и частным адресам RFC1918 (10.x, 192.168.x, 172.16–31.x). Полезно для локальных серверов разработки, интранет-инструментов и self-hosted API. По умолчанию выключено. В этом состоянии блокируются URL с явно записанными частными или loopback IP-адресами и имена localhost. Результат DNS не проверяется, поэтому другие имена хостов могут вести к локальным адресам. IP-адреса метаданных облака, записанные явно (169.254.169.254), и перечисленные имена метаданных или *.internal/*.local остаются заблокированы даже при включении.', 'st.display.notify_sound.label': "Звуки уведомлений", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Режим зрения включён для активного провайдера.", "sp.vision.off": "Режим зрения выключен для активного провайдера.", "sp.vision.error": "Не удалось переключить зрение: {msg}", - "st.tab.multimodal": "Вспомогательные модели", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Рекомендуется. Когда включено, WebBrain спрашивает разрешение при первом нажатии, вводе, переходе, запуске JavaScript, загрузке, скачивании или записи на сайте (а затем запоминает ваш выбор). Выключите для быстрой работы без запросов на сайтах, которым вы полностью доверяете.", "st.perms.gate.warning": "⚠️ Запросы на разрешения ВЫКЛЮЧЕНЫ. WebBrain будет нажимать, вводить текст, переходить, запускать JavaScript, загружать, скачивать и записывать на любом сайте БЕЗ запроса — в том числе на страницах, содержимое которых может контролироваться злоумышленником. Содержимое страниц по-прежнему считается недоверенным внутри системы, но ничто не помешает внедрённой инструкции запустить действие. Оставляйте это выключенным, только если полностью доверяете каждому сайту, на котором используете ассистента.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Системное значение", "st.display.download_directory.error": "Используйте относительную папку, например WebBrain или Work/WebBrain. Абсолютные пути и «..» не допускаются.", "st.display.strict_secret.label": "Строгая обработка секретов", - "st.display.strict_secret.desc": "Отказываться цитировать учётные данные (пароли, API-ключи, токены, OTP) в сводках или тексте ассистента — даже когда вы явно об этом просите. Полезно, если вы регулярно делитесь файлами трасс или демонстрируете экран. По умолчанию выключено, чтобы агент мог при необходимости повторять точное значение, которое вы запросите. Включите (Настройки → Безопасность), когда хотите, чтобы сводки `done` оставались аккуратными, а учётные данные никогда не повторялись.", + "st.display.strict_secret.desc": "Отказываться цитировать учётные данные (пароли, API-ключи, токены, OTP) в сводках или тексте ассистента — даже когда вы явно об этом просите. Полезно, если вы регулярно делитесь файлами трасс или демонстрируете экран. По умолчанию выключено, чтобы агент мог при необходимости повторять точное значение, которое вы запросите. Включите, когда хотите, чтобы сводки `done` оставались аккуратными, а учётные данные никогда не повторялись.", "st.display.request_timeout.label": "Тайм-аут запроса к LLM", "st.display.request_timeout.desc": "Максимальное время ожидания заголовков ответа и каждой паузы между фрагментами потокового ответа. По умолчанию: 120 с. Увеличьте его для медленных локальных моделей, особенно на CPU или с большим контекстом.", "st.providers.filter.all": "Все", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Пока WebBrain занят, сообщения ставятся в очередь. Только /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces и /verbose могут запускаться сразу как slash-команды.', 'tool.go_back': 'Назад', 'tool.go_forward': 'Вперёд', - 'st.display.search.placeholder': 'Поиск в общих настройках', - 'st.display.search.empty': 'Нет совпадений в общих настройках.', + 'st.display.search.placeholder': 'Поиск в настройках', + 'st.display.search.empty': 'Нет совпадающих настроек.', 'st.display.advanced': 'Расширенные', ...getApocalypseModeCopy('ru'), ...getEmergencyBoxCopy('ru'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Наибольшая сторона (ширина или высота) в пикселях для любого скриншота, отправляемого в vision. Меньший предел сжимает изображения до отправки, снижая токены и стоимость. Больший предел сохраняет точность.", "st.imageBudget.warning": "⚠️ Эти настройки применяются к скриншотам для vision (авто-скриншот, /screenshot, вся страница, verify_form). Вручную сохранённые изображения в полном разрешении не затрагиваются. «Image detail» учитывается endpoint’ами в стиле OpenAI; другие провайдеры могут игнорировать.", - "st.redaction.heading": "Редактирование скриншотов", "st.redaction.toggle.label": "Скрывать чувствительный контент на скриншотах", "st.redaction.toggle.desc": "Перед отправкой скриншота модели зрения размывает поля форм и текст, похожий на email или номер телефона. Обнаружение выполняется полностью на вашем устройстве — ничего лишнего не передаётся.", "st.redaction.warning": "⚠️ Работает по принципу «максимум усилий» и fail-open: если редактирование не может выполниться на странице (например, сразу после перехода, в просмотрщиках PDF или на ограниченных страницах браузера), скриншот всё равно отправляется неотредактированным. Обнаружение использует только эвристики DOM — текст, нарисованный на canvas, персональные данные внутри изображений или что-либо, не распознанное как поле формы или текст email/телефона, может остаться незамеченным, а текст страницы, отправляемый модели, этой настройкой не редактируется. Это НЕ гарантия безопасности. Для полной приватности используйте локальную/офлайн-модель (llama.cpp, Ollama): тогда скриншоты вообще не покидают ваше устройство и редактирование не требуется.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Экспортировать всю сохранённую сессию трассировки в JSON, включая снимки экрана", "sp.export_traces.recording_truncated": "Все сохранённые записи экспортированы в JSON. Содержимое, пропущенное при записи, невозможно восстановить экспортом.", "sp.slash.export_traces": "Экспорт цепочки инструментов (трассировки)", - "sp.export_traces.none": "Нет трассировок для этого разговора. Включите «Записывать трассировки» в настройках и запустите снова.", + "sp.export_traces.none": "Нет трассировок для этого разговора. Включите «Записывать трассировки» в разделе Настройки → Расширенные и запустите снова.", "sp.export_traces.error": "Не удалось экспортировать трассировки.", "sp.export_traces.done": "Цепочка инструментов экспортирована.", "sp.export_traces.no_conversation": "Пока нечего экспортировать — сначала начните разговор.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Цепочка инструментов экспортирована. Старые ходы могут отсутствовать, если у разговора много трассировок.", "st.display.help_improve.label": "Помогать улучшать WebBrain", "st.display.help_improve.desc_html": "Разрешить хранить отдельные взаимодействия с WebBrain Compass и использовать их для оценки, улучшения, тонкой настройки и обучения. Включено по умолчанию. Отключите, чтобы будущие взаимодействия с Compass не использовались для этих целей. WebBrain собирает запросы к локальным моделям и вашим собственным API только от провайдеров, у которых вы включили «Делиться запросами для исследований». Политика конфиденциальности →", - "st.providers.webbrain_data_use.body": "Включён бесплатный ежедневный объём WebBrain Compass. Пока параметр «Помогать улучшать WebBrain» включён по умолчанию, отдельные разговоры в Compass могут храниться и использоваться для оценки, улучшения, тонкой настройки и обучения. Отключите его в разделе «Общие → Расширенные», чтобы исключить будущие взаимодействия с Compass из такого использования. WebBrain собирает запросы к локальным моделям и вашим собственным API, только когда вы включаете опцию «Делиться запросами для исследований» для этого провайдера. {privacyLink}. Для большего объёма оформите подписку на {subscribeLink}. Управляйте оплатой на {accountLink}.", + "st.providers.webbrain_data_use.body": "Включён бесплатный ежедневный объём WebBrain Compass. Пока параметр «Помогать улучшать WebBrain» включён по умолчанию, отдельные разговоры в Compass могут храниться и использоваться для оценки, улучшения, тонкой настройки и обучения. Отключите его в разделе «Настройки → Расширенные», чтобы исключить будущие взаимодействия с Compass из такого использования. WebBrain собирает запросы к локальным моделям и вашим собственным API, только когда вы включаете опцию «Делиться запросами для исследований» для этого провайдера. {privacyLink}. Для большего объёма оформите подписку на {subscribeLink}. Управляйте оплатой на {accountLink}.", 'st.providers.share_research.label': "Делиться запросами для исследований", 'st.providers.share_research.hint': "Отправляет запросы и ответы этого провайдера в WebBrain для оценки и улучшения, включая сведения об используемом провайдере и модели. Изображения и бинарные вложения удаляются, а текст сокращается перед отправкой; остальной текст отправляется как есть.", 'st.providers.share_research.confirm': "Делиться запросами этого провайдера с WebBrain для исследований?\n\nПри включении ваши запросы, ответы и взаимодействия с инструментами этого провайдера будут отправляться в WebBrain для оценки и улучшения вместе с названием провайдера и модели. Текст отправляется как есть после удаления изображений и сокращения длинного содержимого, поэтому не передавайте чувствительные персональные данные. Вы можете отключить это в любое время, чтобы прекратить передачу.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Хотите меньше прерываний? «Всегда разрешать» запоминает этот сайт. Команда ниже отключает запросы разрешений WebBrain на всех сайтах.", "sp.perm.insert_skip_command": "Вставить /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Черновик не изменён. Очистите его перед вставкой команды.", - "ob.act.permissions_tip": "Запросы разрешений включены по умолчанию. Опытные пользователи могут отключить их глобально командой /dangerously-skip-permissions и снова включить в Настройки → Разрешения.", + "ob.act.permissions_tip": "Запросы разрешений включены по умолчанию. Опытные пользователи могут отключить их глобально командой /dangerously-skip-permissions и снова включить кнопкой ⚠ рядом с микрофоном.", 'st.provider.field.cache_read_cost_per_million': "Расчётная стоимость чтения из кэша ($ / 1 млн токенов)", 'st.provider.field.cache_write_cost_per_million': "Расчётная стоимость записи в кэш на 5 минут ($ / 1 млн токенов)", 'st.provider.field.cache_write_1h_cost_per_million': "Расчётная стоимость записи в кэш на 1 час ($ / 1 млн токенов)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Заменить зашифрованную облачную копию текущей настройкой WebBrain этого устройства?", "st.sync.consent.legacy": "Включить шифрованную синхронизацию? WebBrain передаст сквозную зашифрованную копию ваших воспоминаний, автозаполнение профиля и настройки поставщика ключей API в WebBrain Compass. История чата и входы по OAuth не синхронизируются.", "st.sync.consent.denied": "Разрешение на зашифрованную синхронизацию не предоставлено.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Страница изменилась во время выполнения задачи ({before} → {after}). Задача продолжается.", 'sp.activity.generating_answer': "Формирование ответа…", 'sp.activity.retrying_response': "Повторная попытка ответа…", diff --git a/src/firefox/src/ui/locales/th.js b/src/firefox/src/ui/locales/th.js index 477e1fa375..25e51d5d79 100644 --- a/src/firefox/src/ui/locales/th.js +++ b/src/firefox/src/ui/locales/th.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'ย่อ UI ของส่วนขยาย', 'sp.ui_scale.increase': 'ขยาย UI ของส่วนขยาย', 'sp.ui_scale.reset': 'รีเซ็ต', - 'st.display.ui_scale.label': 'ซูม UI ของส่วนขยาย', - 'st.display.ui_scale.decrease': 'ย่อ UI ของส่วนขยาย', - 'st.display.ui_scale.increase': 'ขยาย UI ของส่วนขยาย', - 'st.display.ui_scale.reset': 'รีเซ็ต', - 'st.display.ui_scale.desc': 'ปรับขนาดแผงด้านข้างและหน้าต่างแชตแบบแยก โดยไม่เปลี่ยนการซูมหน้าเว็บ', - 'st.display.ui_scale.shortcuts': 'แป้นพิมพ์ลัดเฉพาะ: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'ยังไม่ได้กำหนด', - 'st.display.ui_scale.manage_shortcuts': 'ปรับแต่งแป้นพิมพ์ลัด', 'tool.delegate_research': 'กำลังค้นคว้าด้วย ChatGPT', 'st.display.research_escalation.label': 'การส่งต่อการค้นคว้า', 'st.display.research_escalation.desc': 'เมื่อเปิดใช้ WebBrain อาจขออนุญาตก่อนส่งพรอมต์ค้นคว้าแบบอ่านอย่างเดียวที่ซับซ้อนเป็นพิเศษไปยัง ChatGPT ปิดไว้ตามค่าเริ่มต้น พรอมต์ที่ตรงกันจะถูกแชร์หลังจากคุณอนุมัติอย่างชัดเจนเท่านั้น', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "ไม่ดำเนินการ", "sp.recipient.reason_unrequested": "WebBrain ไม่แน่ใจจากคำขอของคุณว่าต้องส่งข้อความ บทสนทนาที่เปิดอยู่บน {host} คือกับ {recipient}", "sp.recipient.reason_unnamed": "WebBrain ไม่แน่ใจจากคำขอของคุณว่าใครควรได้รับข้อความนี้ บทสนทนาที่เปิดอยู่บน {host} คือกับ {recipient}", - 'st.tab.permissions': "สิทธิ์", 'st.perms.revoke': "เพิกถอน", 'st.perms.clear_all': "ล้างสิทธิ์ทั้งหมด", 'st.perms.gate.label': "ถามก่อนการดำเนินการสำคัญ", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'เริ่มต้น', 'ob.btn.skip': 'ข้ามไปก่อน', 'ob.btn.start': 'เริ่ม', - 'ob.cloud.body': 'WebBrain Compass พร้อมพร้อมกับการจัดสรรรายสัปดาห์ฟรี บทสนทนา Compass ที่เลือกอาจถูกเก็บและใช้เพื่อปรับปรุง WebBrain ในขณะที่ช่วยปรับปรุง WebBrain เปิดใช้งานตามค่าเริ่มต้น คุณสามารถปิดได้ในการตั้งค่า → ทั่วไป', + 'ob.cloud.body': 'WebBrain Compass พร้อมพร้อมกับการจัดสรรรายสัปดาห์ฟรี บทสนทนา Compass ที่เลือกอาจถูกเก็บและใช้เพื่อปรับปรุง WebBrain ในขณะที่ช่วยปรับปรุง WebBrain เปิดใช้งานตามค่าเริ่มต้น คุณสามารถปิดได้ในการตั้งค่า → ขั้นสูง', 'ob.cloud.change': 'เปลี่ยน', 'ob.cloud.using': 'กำลังใช้ WebBrain Compass', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'ผลลัพธ์', 'sp.api.enabled_html': '🔓 เปิดการแก้ไขผ่าน API สำหรับการสนทนานี้แล้ว เอเจนต์สามารถใช้ POST/PUT/PATCH/DELETE ผ่าน fetch_url และ execute_js เมื่อพิจารณาว่า API น่าเชื่อถือกว่า UI สำหรับขั้นตอนหนึ่ง โดย UI ยังคงเป็นค่าเริ่มต้น แฟล็กนี้จะถูกล้างเมื่อคุณรีเซ็ตการสนทนา', - 'sp.permissions.disabled_html': '⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด บันทึก และจัดงานในอนาคตโดยไม่ถามก่อน เปิดใช้งานอีกครั้งได้จาก การตั้งค่า → สิทธิ์ → ถามก่อนการดำเนินการสำคัญ', + 'sp.permissions.disabled_html': '⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด บันทึก และจัดงานในอนาคตโดยไม่ถามก่อน เปิดใช้งานอีกครั้งได้จากปุ่ม ⚠ ข้างไมโครโฟน', 'sp.permissions.button': 'การถามสิทธิ์: เปิด', 'sp.permissions.button_off': 'การถามสิทธิ์: ปิด', 'sp.permissions.gate_desc': 'WebBrain จะถามก่อนครั้งแรกที่คลิก พิมพ์ ดาวน์โหลด หรือเรียกใช้โค้ดบนเว็บไซต์', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'รอ “{selector}”', 'st.title': 'การตั้งค่า WebBrain', - 'st.subtitle': 'ตั้งค่าผู้ให้บริการ LLM และการตั้งค่า · v{version}', + 'st.subtitle': 'ตั้งค่าการทำงานของ WebBrain · v{version}', 'st.tab.display': 'ทั่วไป', + 'st.tab.budgets': 'งบประมาณ', + 'st.tab.advanced': 'ขั้นสูง', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'เสียงพูด', + 'st.tab.generative': 'เชิงสร้างสรรค์', + 'st.tab.decision': 'การตัดสินใจ', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'ผู้ให้บริการ WebBrain', + 'st.providers_page.subtitle': 'เลือกโมเดลที่ WebBrain ใช้ · v{version}', + 'st.permissions_page.title': 'สิทธิ์ของ WebBrain', + 'st.permissions_page.subtitle': 'เว็บไซต์ที่ WebBrain ดำเนินการได้โดยไม่ต้องถามก่อน', 'st.tab.providers': 'ผู้ให้บริการ', 'st.tab.vision': 'การมองเห็น', 'st.tab.profile': 'โปรไฟล์', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "อัปเดตวิธีชำระเงิน", 'st.account.manage_billing': 'จัดการการเรียกเก็บเงิน', - 'st.display.language.label': 'ภาษา', - 'st.display.language.desc': 'ภาษาของหน้าจอปลั๊กอิน WebBrain', 'st.display.verbose.label': 'โหมดละเอียด', 'st.display.verbose.desc': 'แสดงรายละเอียดการเรียกใช้เครื่องมือเต็ม อาร์กิวเมนต์ และผลลัพธ์ JSON ดิบ ปิดเป็นค่าเริ่มต้นเพื่อประสบการณ์แชตที่สะอาดขึ้น', 'st.display.selection_shortcut.label': 'ทางลัดสำหรับข้อความที่เลือก', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'จับภาพหน้าจออัตโนมัติ', "st.display.auto_screenshot.desc": "จับภาพหน้าจอของวิวพอร์ตโดยอัตโนมัติหลังจากเอเจนต์ทำงานบนหน้า เพื่อให้เส้นทางการมองเห็นที่เลือกเห็นการเปลี่ยนแปลง การทำงานนี้ใช้โทเค็นมากขึ้น หากการมองเห็นไม่พร้อมใช้งาน ระบบจะข้ามการเสริมข้อมูลและทำงานต่อพร้อมแจ้งสถานะ", 'st.display.auto_screenshot.off': 'ปิด', - 'st.display.auto_screenshot.navigation': 'เมื่อมีการนำทาง', - 'st.display.auto_screenshot.state_change': 'เมื่อสถานะเปลี่ยน (ค่าเริ่มต้น)', + 'st.display.auto_screenshot.navigation': 'เมื่อมีการนำทาง (ค่าเริ่มต้น)', + 'st.display.auto_screenshot.state_change': 'เมื่อสถานะเปลี่ยน', 'st.display.auto_screenshot.every_step': 'ทุกขั้น', 'st.display.tracing.label': 'บันทึกการติดตาม (เพื่อเปรียบเทียบโมเดล)', - 'st.display.tracing.desc_html': 'จัดเก็บทุกการทำงาน (คำขอ LLM, การตอบกลับ, การเรียกใช้เครื่องมือ, ภาพหน้าจอ) ลงใน IndexedDB ในเครื่อง เพื่อให้คุณตรวจสอบและเปรียบเทียบโมเดลแบบเคียงข้างกันได้ จะเปิดในแท็บ Traces แยกต่างหาก ปิดเป็นค่าเริ่มต้นเพราะเพิ่มการเขียนดิสก์ในทุกขั้น เปิดหน้า Traces →', - 'st.display.lossless_tracing.label': 'บันทึกรายละเอียดคำขอทั้งหมด (ระดับดีบัก)', - 'st.display.lossless_tracing.desc_html': 'จัดเก็บพรอมต์ ข้อความ และโครงสร้างเครื่องมือแบบเต็มของแต่ละคำขอ LLM แทนสรุปที่ไม่มีเนื้อหา และเก็บผลลัพธ์เครื่องมือแต่ละรายการสูงสุด 200 KB เปิดใช้งานการดีบักเชิงลึกและการสร้างคำขอใหม่ ปิดโดยค่าเริ่มต้นเพราะเขียนเนื้อหาสนทนาของคุณในเครื่องและใช้พื้นที่ดิสก์มากกว่ามาก ต้องเปิดการบันทึกเทรซ', + 'st.display.tracing.desc_html': 'จัดเก็บทุกการทำงาน (คำขอ LLM, การตอบกลับ, การเรียกใช้เครื่องมือ, ภาพหน้าจอ) ลงใน IndexedDB ในเครื่อง เพื่อให้คุณตรวจสอบและเปรียบเทียบโมเดลแบบเคียงข้างกันได้ รวมถึงพรอมต์ ข้อความ และโครงสร้างเครื่องมือแบบเต็มของแต่ละคำขอ LLM และผลลัพธ์เครื่องมือแต่ละรายการสูงสุด 200 KB จะเปิดในแท็บ Traces แยกต่างหาก ปิดเป็นค่าเริ่มต้นเพราะเขียนเนื้อหาสนทนาของคุณในเครื่องและใช้พื้นที่ดิสก์มากกว่ามาก เปิดหน้า Traces →', 'st.display.allow_local_network.label': 'อนุญาตให้เอเจนต์เข้าถึงเครือข่ายภายใน', 'st.display.allow_local_network.desc': 'ให้เครื่องมือ fetch_url ของเอเจนต์เข้าถึง loopback (127.0.0.1, localhost) และที่อยู่ส่วนตัว/RFC1918 (10.x, 192.168.x, 172.16–31.x) มีประโยชน์สำหรับเซิร์ฟเวอร์พัฒนาภายใน เครื่องมืออินทราเน็ต หรือ API ที่โฮสต์เอง ปิดเป็นค่าเริ่มต้น เมื่อปิด จะบล็อก URL ที่ระบุ IP ส่วนตัวหรือ loopback โดยตรงและชื่อ localhost ไม่มีการตรวจสอบผลการแปลงชื่อ DNS ดังนั้นชื่อโฮสต์อื่นอาจยังเข้าถึงที่อยู่ภายในได้ IP เมตาดาตาคลาวด์ที่ระบุโดยตรง (169.254.169.254) และชื่อเมตาดาตาในรายการหรือ *.internal/*.local ยังคงถูกบล็อกแม้เปิดไว้', 'st.display.notify_sound.label': "เสียงแจ้งเตือน", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "โหมดการมองเห็น เปิดใช้งานแล้ว สำหรับผู้ให้บริการที่ใช้งานอยู่", "sp.vision.off": "โหมดการมองเห็น ปิดใช้งานแล้ว สำหรับผู้ให้บริการที่ใช้งานอยู่", "sp.vision.error": "สลับโหมดการมองเห็นไม่สำเร็จ: {msg}", - "st.tab.multimodal": "โมเดลเสริม", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "แนะนำ เมื่อเปิด WebBrain จะขออนุญาตในครั้งแรกที่คลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด หรือบันทึกบนเว็บไซต์ (จากนั้นจะจดจำตัวเลือกของคุณ) ปิดไว้เพื่อใช้งานได้รวดเร็วโดยไม่ต้องถาม บนเว็บไซต์ที่คุณไว้วางใจเต็มที่", "st.perms.gate.warning": "⚠️ การถามสิทธิ์ถูกปิดอยู่ WebBrain จะคลิก พิมพ์ นำทาง รัน JavaScript อัปโหลด ดาวน์โหลด และบันทึกบนเว็บไซต์ใด ๆ โดยไม่ถาม — รวมถึงหน้าที่เนื้อหาอาจถูกควบคุมโดยผู้โจมตี เนื้อหาของหน้ายังถูกปฏิบัติเสมือนไม่น่าเชื่อถือภายในระบบ แต่ไม่มีอะไรหยุดคำสั่งที่ถูกแทรกเข้ามาไม่ให้กระตุ้นการกระทำได้ ปิดไว้เฉพาะเมื่อคุณไว้วางใจทุกเว็บไซต์ที่ใช้ผู้ช่วยนี้เต็มที่", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "ค่าเริ่มต้นของระบบ", "st.display.download_directory.error": "ใช้โฟลเดอร์แบบสัมพัทธ์ เช่น WebBrain หรือ Work/WebBrain ไม่อนุญาตพาธแบบสัมบูรณ์และ “..”", "st.display.strict_secret.label": "การจัดการความลับอย่างเข้มงวด", - "st.display.strict_secret.desc": "ปฏิเสธการอ้างอิงข้อมูลรับรอง (รหัสผ่าน คีย์ API โทเค็น OTP) ในบทสรุปหรือข้อความของผู้ช่วย — แม้คุณจะขอโดยตรง มีประโยชน์หากคุณแชร์ไฟล์ trace หรือแชร์หน้าจอเป็นประจำ ปิดเป็นค่าเริ่มต้น เพื่อให้เอเจนต์สามารถแสดงค่าที่แน่นอนที่คุณร้องขอออกมาได้เมื่อคุณต้องการ เปิดใช้งาน (การตั้งค่า → ความปลอดภัย) เมื่อคุณต้องการให้บทสรุป `done` เรียบร้อยและไม่มีการอ้างอิงข้อมูลรับรองซ้ำ", + "st.display.strict_secret.desc": "ปฏิเสธการอ้างอิงข้อมูลรับรอง (รหัสผ่าน คีย์ API โทเค็น OTP) ในบทสรุปหรือข้อความของผู้ช่วย — แม้คุณจะขอโดยตรง มีประโยชน์หากคุณแชร์ไฟล์ trace หรือแชร์หน้าจอเป็นประจำ ปิดเป็นค่าเริ่มต้น เพื่อให้เอเจนต์สามารถแสดงค่าที่แน่นอนที่คุณร้องขอออกมาได้เมื่อคุณต้องการ เปิดใช้งาน เมื่อคุณต้องการให้บทสรุป `done` เรียบร้อยและไม่มีการอ้างอิงข้อมูลรับรองซ้ำ", "st.display.request_timeout.label": "เวลารอคำขอ LLM", "st.display.request_timeout.desc": "เวลารอสูงสุดสำหรับส่วนหัวของการตอบกลับและแต่ละช่วงหยุดระหว่างส่วนของคำตอบแบบสตรีม ค่าเริ่มต้น: 120 วินาที เพิ่มเวลานี้สำหรับโมเดลในเครื่องที่ทำงานช้า โดยเฉพาะเมื่อใช้ CPU หรือบริบทขนาดใหญ่", "st.providers.filter.all": "ทั้งหมด", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'ข้อความจะถูกเข้าคิวขณะที่ WebBrain ไม่ว่าง เฉพาะ /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces และ /verbose เท่านั้นที่เรียกใช้ได้ทันทีในฐานะคำสั่ง slash', 'tool.go_back': 'กำลังย้อนกลับ', 'tool.go_forward': 'กำลังไปข้างหน้า', - 'st.display.search.placeholder': 'ค้นหาการตั้งค่าทั่วไป', - 'st.display.search.empty': 'ไม่พบการตั้งค่าทั่วไปที่ตรงกัน', + 'st.display.search.placeholder': 'ค้นหาการตั้งค่า', + 'st.display.search.empty': 'ไม่พบการตั้งค่าที่ตรงกัน', 'st.display.advanced': 'ขั้นสูง', ...getApocalypseModeCopy('th'), ...getEmergencyBoxCopy('th'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "ด้านที่ยาวที่สุด (กว้างหรือสูง) เป็นพิกเซลของภาพที่ส่งไปวิชัน เพดานต่ำกว่าจะย่อภาพก่อนส่ง ลดโทเคนและต้นทุน เพดานสูงกว่าคงความคมชัด", "st.imageBudget.warning": "⚠️ การตั้งค่าเหล่านี้ใช้กับภาพสำหรับวิชัน (จับอัตโนมัติ, /screenshot, ทั้งหน้า, verify_form) รูปความละเอียดเต็มที่บันทึกด้วยตนเองไม่ได้รับผลกระทบ «Image detail» เคารพโดย endpoint แบบ OpenAI ผู้ให้บริการอื่นอาจละเว้น", - "st.redaction.heading": "การเบลอภาพหน้าจอ", "st.redaction.toggle.label": "เบลอเนื้อหาที่ละเอียดอ่อนในภาพหน้าจอ", "st.redaction.toggle.desc": "ก่อนส่งภาพหน้าจอไปยังโมเดลวิชั่น ระบบจะเบลอช่องฟอร์มและข้อความที่ดูเหมือนอีเมลหรือหมายเลขโทรศัพท์ การตรวจจับทำงานทั้งหมดบนอุปกรณ์ของคุณ — ไม่มีการส่งข้อมูลเพิ่มเติมใดๆ", "st.redaction.warning": "⚠️ ฟีเจอร์นี้เป็นแบบ best-effort และ fail-open: หากการเบลอไม่สามารถทำงานบนหน้าใดหน้าหนึ่งได้ (เช่น ทันทีหลังการนำทาง ในตัวแสดง PDF หรือบนหน้าเบราว์เซอร์ที่ถูกจำกัด) ภาพหน้าจอจะยังคงถูกส่งไปโดยไม่ถูกเบลอ การตรวจจับใช้เพียงหลักการ DOM heuristics เท่านั้น — ข้อความที่วาดบน canvas ข้อมูลส่วนบุคคลในรูปภาพ หรือสิ่งใดก็ตามที่ไม่ถูกจดจำว่าเป็นช่องฟอร์มหรือข้อความอีเมล/โทรศัพท์ อาจหลุดรอดไปได้ และข้อความในหน้าเว็บที่ส่งไปยังโมเดลก็ไม่ถูกเบลอโดยการตั้งค่านี้ นี่ไม่ใช่การรับประกันด้านความปลอดภัย หากต้องการความเป็นส่วนตัวอย่างเต็มที่ ให้ใช้โมเดลภายในเครื่อง/ออฟไลน์ (llama.cpp, Ollama) เพราะภาพหน้าจอจะไม่ออกจากเครื่องของคุณเลย และไม่จำเป็นต้องเบลออีกต่อไป", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "ส่งออกเซสชันการติดตามที่บันทึกไว้ทั้งหมดเป็น JSON รวมภาพหน้าจอ", "sp.export_traces.recording_truncated": "ส่งออกข้อมูลที่บันทึกไว้ทั้งหมดเป็น JSON แล้ว เนื้อหาที่ละเว้นระหว่างการบันทึกไม่สามารถกู้คืนด้วยการส่งออกได้", "sp.slash.export_traces": "ส่งออกลำดับการทำงานของเครื่องมือ (trace)", - "sp.export_traces.none": "ไม่มี trace สำหรับการสนทนานี้ เปิด «บันทึก trace» ในการตั้งค่า แล้วเรียกใช้อีกครั้ง", + "sp.export_traces.none": "ไม่มี trace สำหรับการสนทนานี้ เปิด «บันทึก trace» ในการตั้งค่า → ขั้นสูง แล้วเรียกใช้อีกครั้ง", "sp.export_traces.error": "ไม่สามารถส่งออก trace ได้", "sp.export_traces.done": "ส่งออกลำดับเครื่องมือแล้ว", "sp.export_traces.no_conversation": "ยังไม่มีอะไรให้ส่งออก — เริ่มการสนทนาก่อน", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "ส่งออกลำดับเครื่องมือแล้ว เทิร์นเก่าอาจหายถ้าการสนทนานี้มี trace มาก", "st.display.help_improve.label": "ช่วยปรับปรุง WebBrain", "st.display.help_improve.desc_html": "อนุญาตให้เก็บการโต้ตอบกับ WebBrain Compass บางรายการและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก โดยเปิดไว้เป็นค่าเริ่มต้น ปิดตัวเลือกนี้เพื่อไม่ให้การโต้ตอบกับ Compass ในอนาคตถูกใช้เพื่อวัตถุประสงค์เหล่านี้ WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะจากผู้ให้บริการที่คุณเปิด “แชร์คำค้นเพื่อการวิจัย” เท่านั้น นโยบายความเป็นส่วนตัว →", - "st.providers.webbrain_data_use.body": "WebBrain Compass มีโควตาใช้งานฟรีรายวัน ขณะที่ “ช่วยปรับปรุง WebBrain” เปิดไว้เป็นค่าเริ่มต้น การสนทนา Compass บางรายการอาจถูกเก็บและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก ปิดได้ที่ ทั่วไป → ขั้นสูง เพื่อไม่ให้การโต้ตอบ Compass ในอนาคตถูกใช้ในลักษณะดังกล่าว WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะเมื่อคุณเปิดตัวเลือก “แชร์คำค้นเพื่อการวิจัย” ของผู้ให้บริการรายนี้ {privacyLink} หากต้องการใช้งานเพิ่ม สมัครที่ {subscribeLink} จัดการการเรียกเก็บเงินที่ {accountLink}", + "st.providers.webbrain_data_use.body": "WebBrain Compass มีโควตาใช้งานฟรีรายวัน ขณะที่ “ช่วยปรับปรุง WebBrain” เปิดไว้เป็นค่าเริ่มต้น การสนทนา Compass บางรายการอาจถูกเก็บและใช้เพื่อการประเมิน การปรับปรุง การปรับละเอียด และการฝึก ปิดได้ที่ การตั้งค่า → ขั้นสูง เพื่อไม่ให้การโต้ตอบ Compass ในอนาคตถูกใช้ในลักษณะดังกล่าว WebBrain จะเก็บคำขอโมเดลในเครื่องและ API ของคุณเองเฉพาะเมื่อคุณเปิดตัวเลือก “แชร์คำค้นเพื่อการวิจัย” ของผู้ให้บริการรายนี้ {privacyLink} หากต้องการใช้งานเพิ่ม สมัครที่ {subscribeLink} จัดการการเรียกเก็บเงินที่ {accountLink}", 'st.providers.share_research.label': "แชร์คำค้นเพื่อการวิจัย", 'st.providers.share_research.hint': "ส่งพรอมต์และการตอบกลับจากผู้ให้บริการรายนี้ไปยัง WebBrain เพื่อประเมินและปรับปรุง รวมถึงชื่อผู้ให้บริการและโมเดลที่ใช้ รูปภาพและไฟล์แนบไบนารีจะถูกลบออกและข้อความจะถูกตัดทอนก่อนแชร์ ข้อความที่เหลือจะถูกส่งไปตามที่เป็น", 'st.providers.share_research.confirm': "แชร์คำค้นจากผู้ให้บริการรายนี้กับ WebBrain เพื่อการวิจัยหรือไม่?\n\nเมื่อเปิดใช้ พรอมต์ การตอบกลับ และการโต้ตอบเครื่องมือของคุณกับผู้ให้บริการรายนี้จะถูกส่งไปยัง WebBrain เพื่อประเมินและปรับปรุง พร้อมชื่อผู้ให้บริการและโมเดล ข้อความจะถูกส่งตามที่เป็นหลังลบรูปภาพและตัดทอนเนื้อหายาว ดังนั้นโปรดหลีกเลี่ยงการแชร์ข้อมูลส่วนบุคคลที่ละเอียดอ่อน คุณสามารถปิดได้ทุกเมื่อเพื่อหยุดการแชร์ในอนาคต", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "ต้องการให้ขัดจังหวะน้อยลงไหม? “อนุญาตเสมอ” จะจดจำเว็บไซต์นี้ คำสั่งด้านล่างจะปิดการถามสิทธิ์ของ WebBrain ในทุกเว็บไซต์", "sp.perm.insert_skip_command": "แทรก /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "แบบร่างของคุณยังไม่เปลี่ยน โปรดล้างก่อนแทรกคำสั่ง", - "ob.act.permissions_tip": "การถามสิทธิ์เปิดอยู่ตามค่าเริ่มต้น ผู้ใช้ขั้นสูงสามารถปิดทั่วโลกด้วย /dangerously-skip-permissions และเปิดอีกครั้งได้ที่ การตั้งค่า → สิทธิ์", + "ob.act.permissions_tip": "การถามสิทธิ์เปิดอยู่ตามค่าเริ่มต้น ผู้ใช้ขั้นสูงสามารถปิดทั่วโลกด้วย /dangerously-skip-permissions และเปิดอีกครั้งได้จากปุ่ม ⚠ ข้างไมโครโฟน", 'st.provider.field.cache_read_cost_per_million': "ค่าอ่านแคชโดยประมาณ ($ / 1 ล้านโทเค็น)", 'st.provider.field.cache_write_cost_per_million': "ค่าการเขียนแคช 5 นาทีโดยประมาณ ($ / 1 ล้านโทเค็น)", 'st.provider.field.cache_write_1h_cost_per_million': "ค่าการเขียนแคช 1 ชั่วโมงโดยประมาณ ($ / 1 ล้านโทเค็น)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "แทนที่สำเนาบนคลาวด์ที่เข้ารหัสด้วยการตั้งค่า WebBrain ปัจจุบันของอุปกรณ์นี้หรือไม่", "st.sync.consent.legacy": "เปิดการซิงค์ที่เข้ารหัสไหม WebBrain จะส่งสำเนาความทรงจำของคุณ การกรอกโปรไฟล์อัตโนมัติ และการตั้งค่าผู้ให้บริการคีย์ API ที่เข้ารหัสจากต้นทางถึงปลายทางไปยัง WebBrain Compass ประวัติการแชทและการลงชื่อเข้าใช้ OAuth จะไม่ซิงค์กัน", "st.sync.consent.denied": "ไม่ได้รับสิทธิ์การซิงค์ที่เข้ารหัส", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "หน้าเว็บเปลี่ยนระหว่างที่งานกำลังทำงาน ({before} → {after}) งานจะดำเนินต่อ", 'sp.activity.generating_answer': "กำลังสร้างคำตอบ…", 'sp.activity.retrying_response': "กำลังลองตอบอีกครั้ง…", diff --git a/src/firefox/src/ui/locales/tl.js b/src/firefox/src/ui/locales/tl.js index 9e07c18d65..dd5363bcb4 100644 --- a/src/firefox/src/ui/locales/tl.js +++ b/src/firefox/src/ui/locales/tl.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Bawasan ang zoom ng UI ng extension', 'sp.ui_scale.increase': 'Dagdagan ang zoom ng UI ng extension', 'sp.ui_scale.reset': 'I-reset', - 'st.display.ui_scale.label': 'Pag-zoom ng UI ng extension', - 'st.display.ui_scale.decrease': 'Bawasan ang zoom ng UI ng extension', - 'st.display.ui_scale.increase': 'Dagdagan ang zoom ng UI ng extension', - 'st.display.ui_scale.reset': 'I-reset', - 'st.display.ui_scale.desc': 'Baguhin ang laki ng side panel at hiwalay na chat window nang hindi binabago ang page zoom.', - 'st.display.ui_scale.shortcuts': 'Mga nakatalagang shortcut: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Hindi nakatalaga', - 'st.display.ui_scale.manage_shortcuts': 'I-customize ang mga shortcut', 'tool.delegate_research': 'Nagsasaliksik gamit ang ChatGPT', 'st.display.research_escalation.label': 'Pag-escalate ng pananaliksik', 'st.display.research_escalation.desc': 'Kapag pinagana, maaaring humingi ng pahintulot ang WebBrain bago magpadala ng napakakomplikadong read-only na prompt sa pananaliksik sa ChatGPT. Naka-off bilang default. Ibinabahagi lamang ang eksaktong prompt pagkatapos ng iyong tahasang pag-apruba.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Huwag ituloy", "sp.recipient.reason_unrequested": "Hindi matiyak ng WebBrain mula sa iyong kahilingan na dapat magpadala ng mensahe. Ang bukas na usapan sa {host} ay kay {recipient}.", "sp.recipient.reason_unnamed": "Hindi matiyak ng WebBrain mula sa iyong kahilingan kung sino ang dapat makatanggap ng mensaheng ito. Ang bukas na usapan sa {host} ay kay {recipient}.", - 'st.tab.permissions': "Mga pahintulot", 'st.perms.revoke': "Bawiin", 'st.perms.clear_all': "I-clear ang lahat ng pahintulot", 'st.perms.gate.label': "Magtanong bago ang mahahalagang aksyon", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Magsimula', 'ob.btn.skip': 'Laktawan muna', 'ob.btn.start': 'Magsimula', - 'ob.cloud.body': 'Ang WebBrain Compass ay handa na may libreng araw-araw na alokasyon. Ang mga napiling Compass na usapan ay maaaring manatili at gamitin upang mapahusay ang WebBrain habang ang Tulong sa Pagsasapa ng WebBrain ay naka-on sa default. Maaari mong ito sa Settings → General.', + 'ob.cloud.body': 'Ang WebBrain Compass ay handa na may libreng araw-araw na alokasyon. Ang mga napiling Compass na usapan ay maaaring manatili at gamitin upang mapahusay ang WebBrain habang ang Tulong sa Pagsasapa ng WebBrain ay naka-on sa default. Maaari mong ito sa Settings → Advanced.', 'ob.cloud.change': 'Baguhin', 'ob.cloud.using': 'Gumagamit ng WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Resulta', 'sp.api.enabled_html': '🔓 Naka-enable ang mga pagbabago sa API para sa pag-uusap na ito. Maaari nang gamitin ng ahente ang POST/PUT/PATCH/DELETE sa pamamagitan ng fetch_url at execute_js kapag sa tingin niyang mas maaasahan ang API kaysa UI para sa isang hakbang. UI-first pa rin ang default. Maaaclear ang flag na ito kapag ni-reset mo ang pag-uusap.', - 'sp.permissions.disabled_html': '⚠️ Naka-off ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, magre-record, at mag-iiskedyul ng mga gawaing hinaharap ang WebBrain nang hindi nagtatanong. I-enable muli mula sa Settings → Pahintulot → Magtanong bago ang mahahalagang aksyon.', + 'sp.permissions.disabled_html': '⚠️ Naka-off ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, magre-record, at mag-iiskedyul ng mga gawaing hinaharap ang WebBrain nang hindi nagtatanong. I-enable muli mula sa ⚠ button sa tabi ng mikropono.', 'sp.permissions.button': 'Mga prompt ng pahintulot: naka-on', 'sp.permissions.button_off': 'Mga prompt ng pahintulot: naka-off', 'sp.permissions.gate_desc': 'Nagtatanong ang WebBrain sa unang beses na ito ay mag-click, mag-type, mag-download o magpatakbo ng code sa isang site.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Naghihintay sa "{selector}"', 'st.title': 'Mga Setting ng WebBrain', - 'st.subtitle': 'I-configure ang iyong mga LLM provider at preference · v{version}', + 'st.subtitle': 'I-configure kung paano gumagana ang WebBrain · v{version}', 'st.tab.display': 'General', + 'st.tab.budgets': 'Mga Badyet', + 'st.tab.advanced': 'Advanced', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Pagsasalita', + 'st.tab.generative': 'Generative', + 'st.tab.decision': 'Decision', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Mga Provider ng WebBrain', + 'st.providers_page.subtitle': 'Piliin ang mga model na ginagamit ng WebBrain · v{version}', + 'st.permissions_page.title': 'Mga Pahintulot ng WebBrain', + 'st.permissions_page.subtitle': 'Mga site kung saan puwedeng kumilos ang WebBrain nang hindi muna nagtatanong', 'st.tab.providers': 'Mga Provider', 'st.tab.vision': 'Bisyon', 'st.tab.profile': 'Profile', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "I-update ang paraan ng pagbabayad", 'st.account.manage_billing': 'Pamahalaan ang pagsingil', - 'st.display.language.label': 'Wika', - 'st.display.language.desc': 'Wika ng interface para sa WebBrain plugin.', 'st.display.verbose.label': 'Verbose Mode', 'st.display.verbose.desc': 'Ipakita ang buong detalye ng mga tool call, argument, at raw JSON na resulta. Naka-off bilang default para sa mas malinis na chat experience.', 'st.display.selection_shortcut.label': 'Shortcut sa pagpili', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Auto-screenshot', "st.display.auto_screenshot.desc": "Awtomatikong kumuha ng screenshot ng viewport pagkatapos kumilos ang ahente sa pahina para makita ng napiling vision route ang pagbabago. Mas maraming token ang gagamitin nito. Kung walang vision, lalaktawan ang enrichment at magpapatuloy ang gawain na may status notice.", 'st.display.auto_screenshot.off': 'Naka-off', - 'st.display.auto_screenshot.navigation': 'Kapag nag-navigate', - 'st.display.auto_screenshot.state_change': 'Kapag nagbago ang state (default)', + 'st.display.auto_screenshot.navigation': 'Kapag nag-navigate (default)', + 'st.display.auto_screenshot.state_change': 'Kapag nagbago ang state', 'st.display.auto_screenshot.every_step': 'Bawat hakbang', 'st.display.tracing.label': 'I-record ang mga trace (para sa paghahambing ng modelo)', - 'st.display.tracing.desc_html': 'I-save ang bawat run (mga LLM request, response, tool call, screenshot) sa lokal na IndexedDB para maaari mong suriin at ihambing ang mga modelo nang magkatabi. Bumubukas sa hiwalay na Traces tab. Naka-off bilang default dahil nagdadagdag ito ng disk writes kada hakbang. Buksan ang Traces page →', - 'st.display.lossless_tracing.label': 'Itala ang buong detalye ng kahilingan (antas ng debug)', - 'st.display.lossless_tracing.desc_html': 'Iniimbak din ang buong prompt, mensahe, at schema ng tool ng bawat LLM request sa halip na buod na walang nilalaman, at nagpapanatili ng hanggang 200 KB ng bawat resulta ng tool. Nagbibigay-daan sa malalim na pag-debug at muling pagbuo ng request. Naka-off bilang default dahil isinusulat nito ang nilalaman ng iyong usapan nang lokal at gumagamit ng mas malaking disk. Nangangailangan ng naka-on na pag-record ng trace.', + 'st.display.tracing.desc_html': 'I-save ang bawat run (mga LLM request, response, tool call, screenshot) sa lokal na IndexedDB para masuri at maihambing mo ang mga modelo nang magkatabi, kasama ang buong prompt, mensahe, at schema ng tool ng bawat LLM request at hanggang 200 KB ng bawat resulta ng tool. Bumubukas sa hiwalay na Traces tab. Naka-off bilang default dahil isinusulat nito ang nilalaman ng iyong usapan nang lokal at gumagamit ng mas malaking disk. Buksan ang Traces page →', 'st.display.allow_local_network.label': 'Pahintulutan ang ahente na ma-access ang lokal na network', 'st.display.allow_local_network.desc': 'Hinahayaan ang fetch_url tool ng ahente na maabot ang loopback (127.0.0.1, localhost) at mga private/RFC1918 address (10.x, 192.168.x, 172.16–31.x). Mainam para sa mga lokal na dev server, intranet tool, o self-hosted API. Naka-off bilang default. Kapag naka-off, naka-block ang mga URL na may direktang nakasulat na private o loopback IP at mga pangalang localhost. Hindi sinusuri ang DNS resolution, kaya maaari pa ring makarating sa lokal na address ang ibang hostname. Naka-block pa rin kahit naka-on ang literal na cloud-metadata IP (169.254.169.254) at mga nakalistang metadata o *.internal/*.local hostname.', 'st.display.notify_sound.label': "Mga tunog ng abiso", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Vision mode naka-enable para sa aktibong provider.", "sp.vision.off": "Vision mode naka-disable para sa aktibong provider.", "sp.vision.error": "Nabigo ang vision toggle: {msg}", - "st.tab.multimodal": "Mga Pantulong na Modelo", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Inirerekomenda. Kapag naka-on, humihingi ng pahintulot ang WebBrain sa unang pagkakataong mag-click, mag-type, mag-navigate, magpatakbo ng JavaScript, mag-upload, mag-download, o mag-record ito sa isang site (at saka tinatandaan ang iyong pinili). I-off para sa mabilis at walang prompt na paggamit sa mga site na lubos mong pinagkakatiwalaan.", "st.perms.gate.warning": "⚠️ Naka-OFF ang mga prompt ng pahintulot. Mag-cli-click, magta-type, magna-navigate, magpapatakbo ng JavaScript, mag-aupload, mag-dadownload, at magre-record ang WebBrain sa anumang site nang HINDI nagtatanong — kasama na ang mga pahinang ang nilalaman ay maaaring kontrolado ng attacker. Itinuturing pa ring untrusted ang nilalaman ng pahina sa loob, ngunit walang pipigil sa isang injected na tagubilin na mag-trigger ng aksyon. Iwang naka-off lamang ito kung lubos mong pinagkakatiwalaan ang bawat site na ginagamitan mo ng assistant.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Default ng system", "st.display.download_directory.error": "Gumamit ng relative na folder tulad ng WebBrain o Work/WebBrain. Hindi pinapayagan ang absolute path at “..”.", "st.display.strict_secret.label": "Mahigpit na paghawak ng lihim", - "st.display.strict_secret.desc": "Tanggihang i-quote ang mga kredensyal (password, API key, token, OTPs) sa mga summary o teksto ng assistant — kahit hayagan mong hilingin ang mga ito. Mainam kung madalas kang magbahagi ng trace files o screen-share. Naka-off bilang default para maulit ng ahente ang eksaktong halaga na hihilingin mo kapag kailangan mo ito. I-on ito (Settings → Security) kapag nais mong manatiling malinis ang mga `done` na summary at hindi na maulit ang mga kredensyal.", + "st.display.strict_secret.desc": "Tanggihang i-quote ang mga kredensyal (password, API key, token, OTPs) sa mga summary o teksto ng assistant — kahit hayagan mong hilingin ang mga ito. Mainam kung madalas kang magbahagi ng trace files o screen-share. Naka-off bilang default para maulit ng ahente ang eksaktong halaga na hihilingin mo kapag kailangan mo ito. I-on ito kapag nais mong manatiling malinis ang mga `done` na summary at hindi na maulit ang mga kredensyal.", "st.display.request_timeout.label": "Timeout ng LLM request", "st.display.request_timeout.desc": "Pinakamatagal na paghihintay sa mga header ng tugon at sa bawat pagitan ng mga bahagi ng streaming na tugon. Default: 120 segundo. Dagdagan ito para sa mababagal na lokal na modelo, lalo na kung gumagamit ng CPU o malaking konteksto.", "st.providers.filter.all": "Lahat", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Nakapila ang mga mensahe habang abala ang WebBrain. Tanging /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces, at /verbose ang maaaring tumakbo agad bilang mga slash command.', 'tool.go_back': 'Bumabalik', 'tool.go_forward': 'Sumusulong', - 'st.display.search.placeholder': 'Maghanap sa General na mga setting', - 'st.display.search.empty': 'Walang tugmang General na mga setting.', + 'st.display.search.placeholder': 'Maghanap sa mga setting', + 'st.display.search.empty': 'Walang tugmang setting.', 'st.display.advanced': 'Advanced', ...getApocalypseModeCopy('tl'), ...getEmergencyBoxCopy('tl'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Pinakamahabang gilid (lapad o taas) sa pixels para sa anumang screenshot na ipinapadala sa vision. Mas mababang cap ay nagpapaliit ng imahe bago ipadala, binabawasan ang token at gastos. Mas mataas na cap ay nagpapanatili ng fidelity.", "st.imageBudget.warning": "⚠️ Naaangkop ang mga setting na ito sa screenshot para sa vision (auto-screenshot, /screenshot, buong page, verify_form). Hindi apektado ang manu-manong naka-save na full-resolution na imahe. Iginagalang ang «Image detail» ng OpenAI-style endpoints; maaaring balewalain ng ibang provider.", - "st.redaction.heading": "Pagbura sa mga screenshot", "st.redaction.toggle.label": "Burahin ang sensitibong nilalaman sa mga screenshot", "st.redaction.toggle.desc": "Bago ipadala ang isang screenshot sa isang vision model, binuburahin nito ang mga form field at tekstong mukhang email o numero ng telepono. Tumatakbo ang detection nang buo sa iyong device — walang karagdagang ipinapadala.", "st.redaction.warning": "⚠️ Best-effort at fail-open ito: kung hindi matakbo ang pagbura sa isang page (halimbawa, agad pagkatapos mag-navigate, sa mga PDF viewer, o sa mga restricted browser page), ipapadala pa rin ang screenshot nang hindi nabura. Gumagamit lang ang detection ng DOM heuristics — puwedeng makalusot ang tekstong iginuhit sa canvas, personal na impormasyon sa loob ng mga larawan, o anumang hindi nakikilalang form field o email/phone text, at hindi binubura ng setting na ito ang text ng page na ipinapadala sa model. Hindi ito garantiya ng seguridad. Para sa ganap na privacy, gumamit ng local/offline model (llama.cpp, Ollama): hindi na aalis sa iyong device ang mga screenshot at hindi na kailangan ang pagbura.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "I-export ang buong naka-save na trace session bilang JSON, kasama ang mga screenshot", "sp.export_traces.recording_truncated": "Na-export bilang JSON ang lahat ng naka-save na tala. Hindi maibabalik sa pag-export ang nilalamang hindi naisama habang nagre-record.", "sp.slash.export_traces": "I-export ang tool chain (mga trace)", - "sp.export_traces.none": "Walang trace para sa usapang ito. I-on ang Record traces sa Settings, pagkatapos ay patakbuhin muli.", + "sp.export_traces.none": "Walang trace para sa usapang ito. I-on ang Record traces sa Settings → Advanced, pagkatapos ay patakbuhin muli.", "sp.export_traces.error": "Hindi ma-export ang mga trace.", "sp.export_traces.done": "Na-export na ang tool chain.", "sp.export_traces.no_conversation": "Wala pang mae-export — magsimula muna ng usapan.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Na-export ang tool chain. Maaaring mawala ang mga lumang turn kung marami ang trace ng usapang ito.", "st.display.help_improve.label": "Tumulong na Pahusayin ang WebBrain", "st.display.help_improve.desc_html": "Payagan ang piling interaksyon sa WebBrain Compass na mapanatili at magamit para sa pagsusuri, pagpapahusay, fine-tuning, at training. Naka-on bilang default. I-off ito upang hindi magamit ang mga susunod na interaksyon sa Compass para sa mga layuning iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API mula sa mga provider kung saan mo binuksan ang “Ibahagi ang mga query para sa pananaliksik”. Patakaran sa privacy →", - "st.providers.webbrain_data_use.body": "Kasama ang libreng pang-araw-araw na paggamit ng WebBrain Compass. Habang naka-on bilang default ang Tumulong na Pahusayin ang WebBrain, maaaring panatilihin at gamitin ang piling pag-uusap sa Compass para sa pagsusuri, pagpapahusay, fine-tuning, at training. I-off ito sa General → Advanced upang hindi maisama ang mga susunod na interaksyon sa Compass sa mga paggamit na iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API kapag binuksan mo ang opsyong “Ibahagi ang mga query para sa pananaliksik” ng provider na ito. {privacyLink}. Para sa higit pang paggamit, mag-subscribe sa {subscribeLink}. Pamahalaan ang billing sa {accountLink}.", + "st.providers.webbrain_data_use.body": "Kasama ang libreng pang-araw-araw na paggamit ng WebBrain Compass. Habang naka-on bilang default ang Tumulong na Pahusayin ang WebBrain, maaaring panatilihin at gamitin ang piling pag-uusap sa Compass para sa pagsusuri, pagpapahusay, fine-tuning, at training. I-off ito sa Settings → Advanced upang hindi maisama ang mga susunod na interaksyon sa Compass sa mga paggamit na iyon. Kinokolekta lang ng WebBrain ang mga kahilingan sa lokal na modelo at sarili mong API kapag binuksan mo ang opsyong “Ibahagi ang mga query para sa pananaliksik” ng provider na ito. {privacyLink}. Para sa higit pang paggamit, mag-subscribe sa {subscribeLink}. Pamahalaan ang billing sa {accountLink}.", 'st.providers.share_research.label': "Ibahagi ang mga query para sa pananaliksik", 'st.providers.share_research.hint': "Ipinapadala ang mga prompt at tugon mula sa provider na ito sa WebBrain para sa pagsusuri at pagpapabuti, kabilang ang provider at modelong ginamit. Tinatanggal ang mga larawan at binary na attachment at pinuputol ang teksto bago ibahagi; ang natitirang teksto ay ipinapadala nang apa adanya.", 'st.providers.share_research.confirm': "Ibabahagi ba ang mga query mula sa provider na ito sa WebBrain para sa pananaliksik?\n\nKapag naka-on, ang iyong mga prompt, tugon, at interaksyon sa tool sa provider na ito ay ipapadala sa WebBrain para sa pagsusuri at pagpapabuti, kasama ang pangalan ng provider at modelo. Ipinapadala ang teksto nang apa adanya pagkatapos tanggalin ang mga larawan at putulin ang mahahabang nilalaman, kaya iwasang magbahagi ng sensitibong personal na datos. Maaari mo itong patayin anumang oras upang ihinto ang pagbabahagi.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Gusto mo ng mas kaunting pagkaantala? Tinatandaan ng “Palaging payagan” ang site na ito. Ino-off ng command sa ibaba ang mga permission prompt ng WebBrain sa lahat ng site.", "sp.perm.insert_skip_command": "Ilagay ang /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Hindi binago ang draft mo. I-clear ito bago ilagay ang command.", - "ob.act.permissions_tip": "Naka-on bilang default ang mga permission prompt. Maaaring i-off ng advanced users ang mga ito sa lahat ng site gamit ang /dangerously-skip-permissions at i-on muli sa Settings → Permissions.", + "ob.act.permissions_tip": "Naka-on bilang default ang mga permission prompt. Maaaring i-off ng advanced users ang mga ito sa lahat ng site gamit ang /dangerously-skip-permissions at i-on muli mula sa ⚠ button sa tabi ng mikropono.", 'st.provider.field.cache_read_cost_per_million': "Tinatayang gastos sa pagbasa ng cache ($ / 1M token)", 'st.provider.field.cache_write_cost_per_million': "Tinatayang gastos sa 5 minutong pagsulat ng cache ($ / 1M token)", 'st.provider.field.cache_write_1h_cost_per_million': "Tinatayang gastos sa 1 oras na pagsulat ng cache ($ / 1M token)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Palitan ang naka-encrypt na cloud copy ng kasalukuyang setup ng WebBrain ng device na ito?", "st.sync.consent.legacy": "I-on ang naka-encrypt na pag-sync? Magpapadala ang WebBrain ng end-to-end na naka-encrypt na kopya ng iyong mga alaala, profile autofill, at API-key na mga setting ng provider sa WebBrain Compass. Hindi naka-sync ang history ng chat at OAuth sign-in.", "st.sync.consent.denied": "Hindi ibinigay ang naka-encrypt na pahintulot sa pag-sync.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Nagbago ang pahina habang tumatakbo ang gawain ({before} → {after}). Nagpapatuloy ang gawain.", 'sp.activity.generating_answer': "Bumubuo ng sagot…", 'sp.activity.retrying_response': "Sinusubukang muli ang sagot…", diff --git a/src/firefox/src/ui/locales/tr.js b/src/firefox/src/ui/locales/tr.js index 306c3e6c40..231cbe3362 100644 --- a/src/firefox/src/ui/locales/tr.js +++ b/src/firefox/src/ui/locales/tr.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Uzantı arayüzünü uzaklaştır', 'sp.ui_scale.increase': 'Uzantı arayüzünü yakınlaştır', 'sp.ui_scale.reset': 'Sıfırla', - 'st.display.ui_scale.label': 'Uzantı arayüzü yakınlaştırması', - 'st.display.ui_scale.decrease': 'Uzantı arayüzünü uzaklaştır', - 'st.display.ui_scale.increase': 'Uzantı arayüzünü yakınlaştır', - 'st.display.ui_scale.reset': 'Sıfırla', - 'st.display.ui_scale.desc': 'Sayfa yakınlaştırmasını değiştirmeden yan paneli ve ayrı sohbet penceresini yeniden boyutlandırın.', - 'st.display.ui_scale.shortcuts': 'Özel kısayollar: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Atanmamış', - 'st.display.ui_scale.manage_shortcuts': 'Kısayolları özelleştir', 'tool.delegate_research': 'ChatGPT ile araştırılıyor', 'st.display.research_escalation.label': 'Araştırmayı devretme', 'st.display.research_escalation.desc': 'Etkinleştirildiğinde WebBrain, olağandışı derecede karmaşık salt okunur bir araştırma istemini ChatGPT’ye göndermeden önce izin isteyebilir. Varsayılan olarak kapalıdır. İstemin tam metni yalnızca açık onayınızdan sonra paylaşılır.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Devam etme", "sp.recipient.reason_unrequested": "WebBrain isteğinden bir mesaj gönderilmesi gerektiğini anlayamadı. {host} üzerinde açık olan sohbet: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain isteğinden bu mesajın kime gideceğini anlayamadı. {host} üzerinde açık olan sohbet: {recipient}.", - 'st.tab.permissions': "İzinler", 'st.tab.skills': 'Skills', 'st.perms.revoke': "Kaldır", 'st.perms.clear_all': "Tüm izinleri temizle", @@ -274,7 +265,7 @@ export default { 'ob.btn.done': 'Başlayın', 'ob.btn.skip': 'Şimdilik atla', 'ob.btn.start': 'Başla', - 'ob.cloud.body': 'WebBrain Compass haftalık ücretsiz payla hazır. Seçilen Compass konuşmaları, WebBrain\'i Geliştir Yardımı varsayılan olarak açıkken WebBrain\'i geliştirmek için saklanabilir ve kullanılabilir. Bunu Ayarlar → Genel olarak kapatabilirsiniz.', + 'ob.cloud.body': "WebBrain Compass haftalık ücretsiz payla hazır. Seçilen Compass konuşmaları, WebBrain'i Geliştir Yardımı varsayılan olarak açıkken WebBrain'i geliştirmek için saklanabilir ve kullanılabilir. Bunu Ayarlar → Gelişmiş bölümünden kapatabilirsiniz.", 'ob.cloud.change': 'Değiştir', 'ob.cloud.using': 'WebBrain Compass kullanılıyor.', @@ -370,7 +361,7 @@ export default { 'sp.step.result_label': 'Sonuç', 'sp.api.enabled_html': '🔓 Bu konuşma için API mutasyonları etkin. Aracı artık bir adım için API\'nin arayüzden daha güvenilir olduğuna karar verirse fetch_url ve execute_js üzerinden POST/PUT/PATCH/DELETE kullanabilir. Varsayılan yine arayüz öncelikli kalır. Bu bayrak konuşmayı sıfırladığında temizlenir.', - 'sp.permissions.disabled_html': '⚠️ İzin istemleri KAPALI. WebBrain, izin istemeden tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek, kaydı başlatacak ve gelecek görevler zamanlayacaktır. Bunu Ayarlar → İzinler → Önemli işlemlerden önce sor seçeneğinden yeniden etkinleştirin.', + 'sp.permissions.disabled_html': '⚠️ İzin istemleri KAPALI. WebBrain, izin istemeden tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek, kaydı başlatacak ve gelecek görevler zamanlayacaktır. Bunu mikrofonun yanındaki ⚠ düğmesinden yeniden etkinleştirin.', 'sp.permissions.button': 'İzin istemleri: açık', 'sp.permissions.button_off': 'İzin istemleri: kapalı', 'sp.permissions.gate_desc': 'WebBrain bir sitede ilk kez tıklarken, yazarken, indirirken veya kod çalıştırırken izin ister.', @@ -443,8 +434,19 @@ export default { 'tool.wait_for_element.selector': '«{selector}» bekleniyor', 'st.title': 'WebBrain Ayarları', - 'st.subtitle': 'LLM sağlayıcılarını ve tercihleri yapılandır · v{version}', + 'st.subtitle': "WebBrain'in nasıl çalıştığını yapılandır · v{version}", 'st.tab.display': 'Genel', + 'st.tab.budgets': 'Bütçeler', + 'st.tab.advanced': 'Gelişmiş', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Konuşma', + 'st.tab.generative': 'Üretken', + 'st.tab.decision': 'Karar', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain Sağlayıcıları', + 'st.providers_page.subtitle': "WebBrain'in kullandığı modelleri seç · v{version}", + 'st.permissions_page.title': 'WebBrain İzinleri', + 'st.permissions_page.subtitle': "WebBrain'in önce sormadan işlem yapabileceği siteler", 'st.tab.providers': 'Sağlayıcılar', 'st.tab.vision': 'Görme', 'st.tab.profile': 'Profil', @@ -460,8 +462,6 @@ export default { 'st.account.update_payment': 'Ödeme yöntemini güncelle', 'st.account.manage_billing': 'Faturalandırmayı yönet', - 'st.display.language.label': 'Dil', - 'st.display.language.desc': 'WebBrain eklentisinin arayüz dili.', 'st.display.verbose.label': 'Ayrıntılı mod', 'st.display.verbose.desc': 'Tüm araç çağrı ayrıntılarını, argümanları ve ham JSON sonuçlarını gösterir. Daha temiz bir sohbet deneyimi için varsayılan olarak kapalıdır.', 'st.display.selection_shortcut.label': 'Seçim kısayolu', @@ -475,13 +475,11 @@ export default { 'st.display.auto_screenshot.label': 'Otomatik ekran görüntüsü', "st.display.auto_screenshot.desc": "Aracı sayfada işlem yaptıktan sonra görüntüleme alanının ekran görüntüsünü otomatik olarak alır; böylece seçilen görüntü rotası değişikliği görebilir. Daha fazla token tüketir. Görüntü işleme kullanılamıyorsa zenginleştirme atlanır ve görev bir durum bildirimiyle devam eder.", 'st.display.auto_screenshot.off': 'Kapalı', - 'st.display.auto_screenshot.navigation': 'Gezinmede', - 'st.display.auto_screenshot.state_change': 'Durum değiştiğinde (varsayılan)', + 'st.display.auto_screenshot.navigation': 'Gezinmede (varsayılan)', + 'st.display.auto_screenshot.state_change': 'Durum değiştiğinde', 'st.display.auto_screenshot.every_step': 'Her adımda', 'st.display.tracing.label': 'İzleri kaydet (model karşılaştırması için)', - 'st.display.tracing.desc_html': 'Her çalışmayı (LLM istekleri, yanıtlar, araç çağrıları, ekran görüntüleri) yerel IndexedDB\'de saklar, böylece modelleri yan yana inceleyip karşılaştırabilirsin. Ayrı bir İzler sekmesinde açılır. Her adımda diske yazdığı için varsayılan olarak kapalıdır. İzler sayfasını aç →', - 'st.display.lossless_tracing.label': 'Tüm istek ayrıntılarını kaydet (hata ayıklama katmanı)', - 'st.display.lossless_tracing.desc_html': 'Her LLM isteğinin tam prompt, mesaj ve araç şemalarını içeriksiz özetler yerine de kalıcı olarak kaydeder ve her araç sonucundan en fazla 200 KB tutar. Derin hata ayıklama ve istek yeniden yapılandırmasını sağlar. Varsayılan olarak kapalıdır çünkü konuşma içeriğinizi yerel olarak yazar ve çok daha fazla disk kullanır. İz kaydının açık olmasını gerektirir.', + 'st.display.tracing.desc_html': "Her çalışmayı (LLM istekleri, yanıtlar, araç çağrıları, ekran görüntüleri) yerel IndexedDB'de saklar, böylece modelleri yan yana inceleyip karşılaştırabilirsin; her LLM isteğinin tam prompt, mesaj ve araç şemaları ile her araç sonucundan en fazla 200 KB da kaydedilir. Ayrı bir İzler sekmesinde açılır. Konuşma içeriğini yerel olarak yazdığı ve çok daha fazla disk kullandığı için varsayılan olarak kapalıdır. İzler sayfasını aç →", 'st.display.allow_local_network.label': 'Aracının yerel ağa erişmesine izin ver', 'st.display.allow_local_network.desc': 'Aracının fetch_url aracının loopback (127.0.0.1, localhost) ve özel/RFC1918 adreslerine (10.x, 192.168.x, 172.16–31.x) ulaşmasına izin verir. Yerel geliştirme sunucuları, intranet araçları veya kendi sunucundaki API\'lar için kullanışlıdır. Varsayılan olarak kapalıdır. Kapalıyken özel veya loopback IP adresi doğrudan yazılmış URL’ler ve localhost adları engellenir. DNS çözümlemesi denetlenmez; diğer ana makine adları yerel adreslere ulaşabilir. Doğrudan yazılmış bulut meta-veri IP adresleri (169.254.169.254) ile listedeki meta-veri adları veya *.internal/*.local adları açıkken de engellenir.', 'st.display.notify_sound.label': "Bildirim sesleri", @@ -691,7 +689,6 @@ export default { "sp.vision.on": "Aktif sağlayıcı için görme kipi etkin.", "sp.vision.off": "Aktif sağlayıcı için görme kipi devre dışı.", "sp.vision.error": "Görme kipi değiştirilemedi: {msg}", - "st.tab.multimodal": "Yardımcı Modeller", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Önerilir. Açıkken WebBrain, bir sitede ilk kez tıkladığında, yazdığında, gezindiğinde, JavaScript çalıştırdığında, dosya yüklediğinde, indirdiğinde veya kayıt yaptığında izin ister (sonra seçimini hatırlar). Tamamen güvendiğin sitelerde hızlı, istemsiz kullanım için kapat.", "st.perms.gate.warning": "⚠️ İzin istemleri KAPALI. WebBrain herhangi bir sitede SORMADAN tıklayacak, yazacak, gezinecek, JavaScript çalıştıracak, dosya yükleyecek, indirecek ve kayıt yapacak — içeriği saldırgan kontrolünde olabilecek sayfalar dahil. Sayfa içeriği yine de dahili olarak güvenilmez kabul edilir, ama enjekte edilmiş bir talimatın bir işlemi tetiklemesini hiçbir şey engellemez. Bunu yalnızca asistanı kullandığın her siteye tamamen güveniyorsan kapalı bırak.", @@ -709,7 +706,7 @@ export default { "st.display.download_directory.placeholder": "Sistem varsayılanı", "st.display.download_directory.error": "WebBrain veya Work/WebBrain gibi göreli bir klasör kullanın. Mutlak yollara ve “..” kullanımına izin verilmez.", "st.display.strict_secret.label": "Katı gizli bilgi işleme", - "st.display.strict_secret.desc": "Özellikle istesen bile, özetlerde veya asistan metninde kimlik bilgilerini (parolalar, API anahtarları, jetonlar, OTP'ler) aktarmayı reddet. Düzenli olarak iz dosyaları paylaşıyorsan veya ekran paylaşımı yapıyorsan kullanışlıdır. Varsayılan olarak kapalı: böylece aracı, istediğin tam değeri ihtiyacın olduğunda yineleyebilir. `done` özetlerinin derli toplu kalmasını ve kimlik bilgilerinin asla tekrarlanmamasını istiyorsan aç (Ayarlar → Güvenlik).", + "st.display.strict_secret.desc": "Özellikle istesen bile, özetlerde veya asistan metninde kimlik bilgilerini (parolalar, API anahtarları, jetonlar, OTP'ler) aktarmayı reddet. Düzenli olarak iz dosyaları paylaşıyorsan veya ekran paylaşımı yapıyorsan kullanışlıdır. Varsayılan olarak kapalı: böylece aracı, istediğin tam değeri ihtiyacın olduğunda yineleyebilir. `done` özetlerinin derli toplu kalmasını ve kimlik bilgilerinin asla tekrarlanmamasını istiyorsan aç.", "st.display.request_timeout.label": "LLM istek zaman aşımı", "st.display.request_timeout.desc": "Yanıt başlıkları ve akıştaki yanıt parçaları arasındaki her duraklama için en uzun bekleme süresi. Varsayılan: 120 saniye. Yavaş yerel modellerde, özellikle CPU üzerinde veya büyük bağlamla çalışırken bu süreyi artırın.", "st.providers.filter.all": "Tümü", @@ -906,8 +903,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain meşgulken mesajlar kuyruğa alınır. Yalnızca /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces ve /verbose slash komutları olarak hemen çalışabilir.', 'tool.go_back': 'Geri gidiliyor', 'tool.go_forward': 'İleri gidiliyor', - 'st.display.search.placeholder': 'Genel ayarları ara', - 'st.display.search.empty': 'Eşleşen Genel ayar yok.', + 'st.display.search.placeholder': 'Ayarlarda ara', + 'st.display.search.empty': 'Eşleşen ayar yok.', 'st.display.advanced': 'Gelişmiş', ...getApocalypseModeCopy('tr'), ...getEmergencyBoxCopy('tr'), @@ -1150,7 +1147,6 @@ export default { "st.imageBudget.maxDimension.desc": "Görüşe gönderilen herhangi bir ekran görüntüsünün en uzun kenarı (genişlik veya yükseklik) piksel cinsinden. Daha küçük üst sınır görüntüleri göndermeden önce küçültür, token ve maliyeti düşürür. Daha büyük üst sınır sadakati korur.", "st.imageBudget.warning": "⚠️ Bu ayarlar görüş için yakalanan ekran görüntülerine uygulanır (otomatik görüntü, /screenshot, tam sayfa, verify_form). Elle kaydedilen tam çözünürlüklü görüntüler etkilenmez. «Image detail» OpenAI tarzı uçlar tarafından uygulanır; diğer sağlayıcılar yok sayabilir.", - "st.redaction.heading": "Ekran görüntüsü sansürleme", "st.redaction.toggle.label": "Ekran görüntülerindeki hassas içeriği sansürle", "st.redaction.toggle.desc": "Bir ekran görüntüsü bir görüntü modeline gönderilmeden önce, form alanlarını ve e-posta ya da telefon numarasına benzeyen metni bulanıklaştırır. Algılama tamamen cihazınızda çalışır — fazladan hiçbir şey iletilmez.", "st.redaction.warning": "⚠️ En iyi çaba ilkesiyle çalışır ve fail-open'dır: sansürleme bir sayfada çalışamazsa (örneğin bir gezinmeden hemen sonra, PDF görüntüleyicilerde veya kısıtlı tarayıcı sayfalarında), ekran görüntüsü yine de sansürlenmeden gönderilir. Algılama yalnızca DOM sezgisel yöntemlerini kullanır — bir canvas üzerine çizilmiş metin, görsellerin içindeki kişisel veriler veya form alanı ya da e-posta/telefon metni olarak tanınmayan herhangi bir şey gözden kaçabilir; modele gönderilen sayfa metni de bu ayarla sansürlenmez. Bu bir güvenlik garantisi DEĞİLDİR. Tam gizlilik için yerel/çevrimdışı bir model kullanın (llama.cpp, Ollama): bu durumda ekran görüntüleri makinenizden hiç çıkmaz ve sansürleme gereksiz hale gelir.", @@ -1164,7 +1160,7 @@ export default { "sp.slash.export_traces_full": "Ekran görüntüleri dahil kaydedilmiş izleme oturumunun tamamını JSON olarak dışa aktar", "sp.export_traces.recording_truncated": "Kaydedilmiş tüm kayıtlar JSON olarak dışa aktarıldı. Kayıt sırasında atlanan içerikler dışa aktarılarak geri getirilemez.", "sp.slash.export_traces": "Araç zincirini dışa aktar (izler)", - "sp.export_traces.none": "Bu konuşma için iz yok. Ayarlar'da İzleri kaydet seçeneğini açıp yeniden çalıştırın.", + "sp.export_traces.none": "Bu konuşma için iz yok. Ayarlar → Gelişmiş bölümünde İzleri kaydet seçeneğini açıp yeniden çalıştırın.", "sp.export_traces.error": "İzler dışa aktarılamadı.", "sp.export_traces.done": "Araç zinciri dışa aktarıldı.", "sp.export_traces.no_conversation": "Henüz dışa aktarılacak bir şey yok — önce bir konuşma başlatın.", @@ -1172,7 +1168,7 @@ export default { "sp.export_traces.truncated": "Araç zinciri dışa aktarıldı. Bu konuşmanın çok izi varsa eski turlar eksik olabilir.", "st.display.help_improve.label": "WebBrain’i İyileştirmeye Yardım Et", "st.display.help_improve.desc_html": "Seçili WebBrain Compass etkileşimlerinin saklanmasına ve değerlendirme, iyileştirme, ince ayar ve eğitim için kullanılmasına izin verin. Varsayılan olarak açıktır. Gelecekteki Compass etkileşimlerinin bu amaçlarla kullanılmasını önlemek için kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca “Araştırma için sorguları paylaş” seçeneğini açtığınız sağlayıcılardan toplar. Gizlilik politikası →", - "st.providers.webbrain_data_use.body": "Ücretsiz günlük WebBrain Compass kullanımı dahildir. WebBrain’i İyileştirmeye Yardım Et varsayılan olarak açıkken, seçili Compass konuşmaları değerlendirme, iyileştirme, ince ayar ve eğitim için saklanabilir ve kullanılabilir. Gelecekteki Compass etkileşimlerini bu kullanımların dışında tutmak için Genel → Gelişmiş bölümünden kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca ilgili sağlayıcıda “Araştırma için sorguları paylaş” seçeneğini açtığınızda toplar. {privacyLink}. Daha fazla kullanım için {subscribeLink} adresinden abone olun. Faturalandırmayı {accountLink} adresinden yönetin.", + "st.providers.webbrain_data_use.body": "Ücretsiz günlük WebBrain Compass kullanımı dahildir. WebBrain’i İyileştirmeye Yardım Et varsayılan olarak açıkken, seçili Compass konuşmaları değerlendirme, iyileştirme, ince ayar ve eğitim için saklanabilir ve kullanılabilir. Gelecekteki Compass etkileşimlerini bu kullanımların dışında tutmak için Ayarlar → Gelişmiş bölümünden kapatın. WebBrain, yerel model ve kendi API isteklerinizi yalnızca ilgili sağlayıcıda “Araştırma için sorguları paylaş” seçeneğini açtığınızda toplar. {privacyLink}. Daha fazla kullanım için {subscribeLink} adresinden abone olun. Faturalandırmayı {accountLink} adresinden yönetin.", 'st.providers.share_research.label': "Araştırma için sorguları paylaş", 'st.providers.share_research.hint': "Bu sağlayıcının sınırlı istemlerini, yanıtlarını, araç etkileşimlerini ve tanılama izi metaverilerini (adımlar, araç adları, durumlar, hatalar ve süreler) değerlendirme amacıyla WebBrain’e gönderir. Görseller ve ikili ekler kaldırılır; metin kısaltılır.", 'st.providers.share_research.confirm': "Bu sağlayıcının sorguları ve tanılama izleri araştırma için WebBrain ile paylaşılsın mı?\n\nAçıkken istemleriniz, yanıtlarınız, araç etkileşimleriniz ve başarısız çalıştırmalar dâhil sınırlı tanılama izi metaverileri (araç adları, durumlar, hatalar ve süreler) sağlayıcı ve model adıyla birlikte gönderilir. Ekran görüntüleri ve ikili ekler yüklenmez. Diğer metin kısaltıldıktan sonra olduğu gibi gönderilir; hassas kişisel veri paylaşmamaya dikkat edin. Gelecekteki paylaşımları durdurmak için bunu istediğiniz zaman kapatabilirsiniz.", @@ -1218,7 +1214,7 @@ export default { "sp.perm.skip_hint": "Daha az kesinti mi istiyorsunuz? “Her zaman izin ver” bu siteyi hatırlar. Aşağıdaki komut, WebBrain izin istemlerini tüm sitelerde kapatır.", "sp.perm.insert_skip_command": "/dangerously-skip-permissions komutunu ekle", "sp.perm.skip_hint_draft": "Taslağınız değişmedi. Komutu eklemeden önce taslağı temizleyin.", - "ob.act.permissions_tip": "İzin istemleri varsayılan olarak açıktır. İleri düzey kullanıcılar /dangerously-skip-permissions ile bunları tüm sitelerde kapatabilir ve Ayarlar → İzinler bölümünden yeniden açabilir.", + "ob.act.permissions_tip": "İzin istemleri varsayılan olarak açıktır. İleri düzey kullanıcılar /dangerously-skip-permissions ile bunları tüm sitelerde kapatabilir ve mikrofonun yanındaki ⚠ düğmesinden yeniden açabilir.", 'st.provider.field.cache_read_cost_per_million': "Tahmini önbellek okuma maliyeti ($ / 1M token)", 'st.provider.field.cache_write_cost_per_million': "Tahmini 5 dakikalık önbellek yazma maliyeti ($ / 1M token)", 'st.provider.field.cache_write_1h_cost_per_million': "Tahmini 1 saatlik önbellek yazma maliyeti ($ / 1M token)", @@ -1280,5 +1276,5 @@ export default { "st.sync.confirm.reset": "Şifrelenmiş bulut kopyası bu cihazın mevcut WebBrain kurulumuyla değiştirilsin mi?", "st.sync.consent.legacy": "Şifreli senkronizasyon açılsın mı? WebBrain, anılarınızın, profil otomatik doldurmanızın ve API anahtarı sağlayıcı ayarlarınızın uçtan uca şifrelenmiş bir kopyasını WebBrain Compass'a iletecektir. Sohbet geçmişi ve OAuth oturum açma işlemleri senkronize edilmez.", "st.sync.consent.denied": "Şifrelenmiş senkronizasyon izni verilmedi.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', }; diff --git a/src/firefox/src/ui/locales/uk.js b/src/firefox/src/ui/locales/uk.js index fd7bbb4f46..19212dbef3 100644 --- a/src/firefox/src/ui/locales/uk.js +++ b/src/firefox/src/ui/locales/uk.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': 'Зменшити інтерфейс розширення', 'sp.ui_scale.increase': 'Збільшити інтерфейс розширення', 'sp.ui_scale.reset': 'Скинути', - 'st.display.ui_scale.label': 'Масштаб інтерфейсу розширення', - 'st.display.ui_scale.decrease': 'Зменшити інтерфейс розширення', - 'st.display.ui_scale.increase': 'Збільшити інтерфейс розширення', - 'st.display.ui_scale.reset': 'Скинути', - 'st.display.ui_scale.desc': 'Змінює розмір бічної панелі й окремого вікна чату, не змінюючи масштаб сторінки.', - 'st.display.ui_scale.shortcuts': 'Спеціальні комбінації клавіш: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Не призначено', - 'st.display.ui_scale.manage_shortcuts': 'Налаштувати комбінації клавіш', 'tool.delegate_research': 'Дослідження за допомогою ChatGPT', 'st.display.research_escalation.label': 'Ескалація досліджень', 'st.display.research_escalation.desc': 'Якщо функцію ввімкнено, WebBrain може попросити дозвіл перед надсиланням до ChatGPT надзвичайно складного дослідницького запиту лише для читання. За замовчуванням вимкнено. Точний запит передається лише після вашої явної згоди.', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "Не продовжувати", "sp.recipient.reason_unrequested": "WebBrain не зміг зрозуміти з вашого запиту, що потрібно надіслати повідомлення. Відкрита розмова на {host}: {recipient}.", "sp.recipient.reason_unnamed": "WebBrain не зміг зрозуміти з вашого запиту, кому надіслати це повідомлення. Відкрита розмова на {host}: {recipient}.", - 'st.tab.permissions': "Дозволи", 'st.perms.revoke': "Відкликати", 'st.perms.clear_all': "Очистити всі дозволи", 'st.perms.gate.label': "Питати перед важливими діями", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': 'Почати', 'ob.btn.skip': 'Пропустити зараз', 'ob.btn.start': 'Почати', - 'ob.cloud.body': 'WebBrain Compass готовий з безкоштовним тижневим лімітом. Вибрані розмови Compass можуть бути збережені та використані для покращення WebBrain, поки Допомога в покращенні WebBrain увімкнена за замовчуванням. Ви можете вимкнути це в Налаштування → Загальне.', + 'ob.cloud.body': 'WebBrain Compass готовий з безкоштовним тижневим лімітом. Вибрані розмови Compass можуть бути збережені та використані для покращення WebBrain, поки Допомога в покращенні WebBrain увімкнена за замовчуванням. Ви можете вимкнути це в Налаштування → Розширені.', 'ob.cloud.change': 'Змінити', 'ob.cloud.using': 'Використовується WebBrain Compass.', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': 'Результат', 'sp.api.enabled_html': '🔓 Зміни через API ввімкнено для цього діалогу. Агент тепер може використовувати POST/PUT/PATCH/DELETE через fetch_url та execute_js, якщо вважає API надійнішим за інтерфейс. За замовчуванням пріоритет — інтерфейс. Цей прапор скидається після очищення діалогу.', - 'sp.permissions.disabled_html': '⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме, записуватиме та заплановуватиме майбутню роботу без попереднього запиту. Увімкніть знову в Налаштуваннях → Дозволи → Питати перед важливими діями.', + 'sp.permissions.disabled_html': '⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме, записуватиме та заплановуватиме майбутню роботу без попереднього запиту. Увімкніть знову кнопкою ⚠ поруч із мікрофоном.', 'sp.permissions.button': 'Запити дозволів: увімкнено', 'sp.permissions.button_off': 'Запити дозволів: вимкнено', 'sp.permissions.gate_desc': 'WebBrain питає, коли вперше натискає, вводить текст, завантажує файли або запускає код на сайті.', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': 'Очікування «{selector}»', 'st.title': 'Налаштування WebBrain', - 'st.subtitle': 'Налаштуйте провайдерів LLM та параметри · v{version}', + 'st.subtitle': 'Налаштуйте роботу WebBrain · v{version}', 'st.tab.display': 'Загальні', + 'st.tab.budgets': 'Бюджети', + 'st.tab.advanced': 'Розширені', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Мовлення', + 'st.tab.generative': 'Генерація', + 'st.tab.decision': 'Рішення', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Провайдери WebBrain', + 'st.providers_page.subtitle': 'Виберіть моделі, які використовує WebBrain · v{version}', + 'st.permissions_page.title': 'Дозволи WebBrain', + 'st.permissions_page.subtitle': 'Сайти, де WebBrain може діяти, не питаючи спершу', 'st.tab.providers': 'Провайдери', 'st.tab.vision': 'Зір', 'st.tab.profile': 'Профіль', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "Оновити спосіб оплати", 'st.account.manage_billing': 'Керування оплатою', - 'st.display.language.label': 'Мова', - 'st.display.language.desc': 'Мова інтерфейсу плагіна WebBrain.', 'st.display.verbose.label': 'Детальний режим', 'st.display.verbose.desc': 'Показувати повні деталі викликів інструментів, аргументи та сирий JSON-результат. За замовчуванням вимкнено для чистішого чату.', 'st.display.selection_shortcut.label': 'Швидка дія для виділення', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': 'Авто-скриншот', "st.display.auto_screenshot.desc": "Автоматично робіть знімок області перегляду після дій агента, щоб вибраний маршрут обробки зображень бачив зміни. Це витрачає більше токенів. Якщо зір недоступний, збагачення пропускається, а завдання продовжується зі сповіщенням про стан.", 'st.display.auto_screenshot.off': 'Вимкнено', - 'st.display.auto_screenshot.navigation': 'Під час навігації', - 'st.display.auto_screenshot.state_change': 'При зміні стану (за замовчуванням)', + 'st.display.auto_screenshot.navigation': 'Під час навігації (за замовчуванням)', + 'st.display.auto_screenshot.state_change': 'При зміні стану', 'st.display.auto_screenshot.every_step': 'Кожен крок', 'st.display.tracing.label': 'Записувати траси (для порівняння моделей)', - 'st.display.tracing.desc_html': 'Зберігати кожен запуск (LLM-запити, відповіді, виклики інструментів, скриншоти) у локальну IndexedDB, щоб переглядати й порівнювати моделі поряд. Відкривається в окремій вкладці «Траси». За замовчуванням вимкнено, бо додає запис на диск на кожному кроці. Відкрити сторінку трас →', - 'st.display.lossless_tracing.label': 'Записувати повні деталі запитів (рівень налагодження)', - 'st.display.lossless_tracing.desc_html': 'Також зберігає повні промпти, повідомлення та схеми інструментів кожного LLM-запиту замість стислих зведень без вмісту, та тримає до 200 КБ кожного результату інструмента. Дає змогу глибокого налагодження та відтворення запитів. Вимкнено за замовчуванням, бо записує вміст вашої розмови локально та займає значно більше диска. Потребує увімкненого запису трас.', + 'st.display.tracing.desc_html': 'Зберігати кожен запуск (LLM-запити, відповіді, виклики інструментів, скриншоти) у локальну IndexedDB, щоб переглядати й порівнювати моделі поряд, включно з повними промптами, повідомленнями та схемами інструментів кожного LLM-запиту і до 200 КБ кожного результату інструмента. Відкривається в окремій вкладці «Траси». Вимкнено за замовчуванням, бо записує вміст вашої розмови локально та займає значно більше диска. Відкрити сторінку трас →', 'st.display.allow_local_network.label': 'Дозволити агенту доступ до локальної мережі', 'st.display.allow_local_network.desc': 'Дозволяє інструменту fetch_url агента звертатися до loopback (127.0.0.1, localhost) та приватних адрес RFC1918 (10.x, 192.168.x, 172.16–31.x). Корисно для локальних серверів розробки, інтранет-інструментів і self-hosted API. За замовчуванням вимкнено. У цьому стані блокуються URL із безпосередньо записаними приватними або loopback IP-адресами та імена localhost. Результат DNS не перевіряється, тому інші імена хостів можуть вести до локальних адрес. Безпосередньо записані IP-адреси метаданих хмари (169.254.169.254) і перелічені імена метаданих або *.internal/*.local залишаються заблокованими навіть після ввімкнення.', 'st.display.notify_sound.label': "Звуки сповіщень", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "Режим зору увімкнено для активного провайдера.", "sp.vision.off": "Режим зору вимкнено для активного провайдера.", "sp.vision.error": "Не вдалося перемкнути режим зору: {msg}", - "st.tab.multimodal": "Допоміжні моделі", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "Рекомендовано. Коли увімкнено, WebBrain запитує дозвіл, коли вперше натискає, друкує, переходить, запускає JavaScript, вивантажує, завантажує або записує на сайті (а потім запам'ятовує ваш вибір). Вимкніть для швидкого використання без запитів на сайтах, яким ви повністю довіряєте.", "st.perms.gate.warning": "⚠️ Запити дозволів ВИМКНЕНО. WebBrain натискатиме, друкуватиме, переходитиме, запускатиме JavaScript, вивантажуватиме, завантажуватиме й записуватиме на будь-якому сайті БЕЗ запитань — зокрема на сторінках, вміст яких може контролювати зловмисник. Вміст сторінок усе одно вважається ненадійним усередині, але ніщо не завадить впровадженій інструкції запустити дію. Залишайте це вимкненим лише якщо повністю довіряєте кожному сайту, на якому користуєтеся асистентом.", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "Системне значення", "st.display.download_directory.error": "Використовуйте відносну папку, наприклад WebBrain або Work/WebBrain. Абсолютні шляхи та «..» заборонені.", "st.display.strict_secret.label": "Суворе поводження з секретами", - "st.display.strict_secret.desc": "Відмовлятися наводити облікові дані (паролі, API-ключі, токени, OTP) у підсумках чи тексті асистента — навіть коли ви явно про них просите. Корисно, якщо ви регулярно ділитеся файлами трас або демонструєте екран. Вимкнено за замовчуванням, щоб агент міг повторити точне значення, яке ви попросите, коли воно вам потрібне. Увімкніть (Налаштування → Безпека), коли хочете, щоб підсумки `done` лишалися охайними, а облікові дані ніколи не повторювались.", + "st.display.strict_secret.desc": "Відмовлятися наводити облікові дані (паролі, API-ключі, токени, OTP) у підсумках чи тексті асистента — навіть коли ви явно про них просите. Корисно, якщо ви регулярно ділитеся файлами трас або демонструєте екран. Вимкнено за замовчуванням, щоб агент міг повторити точне значення, яке ви попросите, коли воно вам потрібне. Увімкніть, коли хочете, щоб підсумки `done` лишалися охайними, а облікові дані ніколи не повторювались.", "st.display.request_timeout.label": "Тайм-аут запиту до LLM", "st.display.request_timeout.desc": "Максимальний час очікування заголовків відповіді та кожної паузи між частинами потокової відповіді. За замовчуванням: 120 с. Збільште його для повільних локальних моделей, особливо на CPU або з великим контекстом.", "st.providers.filter.all": "Усі", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'Поки WebBrain зайнятий, повідомлення ставляться в чергу. Лише /help, /progress, /btw, /scratchpad, /memory, /schedule --list, /watch, /dangerously-skip-permissions, /screenshot, /export, /export --traces та /verbose можуть запускатися одразу як slash-команди.', 'tool.go_back': 'Назад', 'tool.go_forward': 'Вперед', - 'st.display.search.placeholder': 'Пошук у загальних налаштуваннях', - 'st.display.search.empty': 'Немає збігів у загальних налаштуваннях.', + 'st.display.search.placeholder': 'Пошук у налаштуваннях', + 'st.display.search.empty': 'Немає відповідних налаштувань.', 'st.display.advanced': 'Розширені', ...getApocalypseModeCopy('uk'), ...getEmergencyBoxCopy('uk'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "Найбільша сторона (ширина або висота) у пікселях для будь-якого знімка, надісланого у vision. Менша межа стискає зображення до надсилання, зменшуючи токени й вартість. Більша межа зберігає точність.", "st.imageBudget.warning": "⚠️ Ці налаштування застосовуються до знімків для vision (авто-знімок, /screenshot, вся сторінка, verify_form). Вручну збережені зображення в повній роздільності не зачіпаються. «Image detail» враховують endpoint’и в стилі OpenAI; інші провайдери можуть ігнорувати.", - "st.redaction.heading": "Редагування знімків екрана", "st.redaction.toggle.label": "Приховувати чутливий вміст на знімках екрана", "st.redaction.toggle.desc": "Перед надсиланням знімка екрана моделі зору розмиває поля форм і текст, схожий на email чи номер телефону. Виявлення виконується повністю на вашому пристрої — нічого зайвого не передається.", "st.redaction.warning": "⚠️ Працює за принципом «найкращих зусиль» і fail-open: якщо редагування не може виконатися на сторінці (наприклад, одразу після переходу, у переглядачах PDF або на обмежених сторінках браузера), знімок екрана все одно надсилається невідредагованим. Виявлення використовує лише евристики DOM — текст, намальований на canvas, персональні дані всередині зображень або будь-що, не розпізнане як поле форми чи текст email/телефону, може залишитися непоміченим, а текст сторінки, що надсилається моделі, цим налаштуванням не редагується. Це НЕ гарантія безпеки. Для повної приватності використовуйте локальну/офлайн-модель (llama.cpp, Ollama): тоді знімки екрана взагалі не покидають ваш пристрій і редагування стає непотрібним.", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "Експортувати весь збережений сеанс трасування у JSON, включно зі знімками екрана", "sp.export_traces.recording_truncated": "Усі збережені записи експортовано у JSON. Вміст, пропущений під час запису, неможливо відновити експортом.", "sp.slash.export_traces": "Експортувати ланцюг інструментів (трасування)", - "sp.export_traces.none": "Немає трасувань для цієї розмови. Увімкніть «Записувати трасування» в налаштуваннях і запустіть знову.", + "sp.export_traces.none": "Немає трасувань для цієї розмови. Увімкніть «Записувати трасування» у розділі Налаштування → Розширені і запустіть знову.", "sp.export_traces.error": "Не вдалося експортувати трасування.", "sp.export_traces.done": "Ланцюг інструментів експортовано.", "sp.export_traces.no_conversation": "Поки немає що експортувати — спочатку почніть розмову.", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "Ланцюг інструментів експортовано. Старі ходи можуть бути відсутні, якщо в розмові багато трасувань.", "st.display.help_improve.label": "Допомагати вдосконалювати WebBrain", "st.display.help_improve.desc_html": "Дозволити зберігати вибрані взаємодії з WebBrain Compass і використовувати їх для оцінювання, вдосконалення, тонкого налаштування та навчання. Увімкнено за замовчуванням. Вимкніть, щоб майбутні взаємодії з Compass не використовувалися для цих цілей. WebBrain збирає запити до локальних моделей і ваших власних API лише від провайдерів, у яких ви ввімкнули «Ділитися запитами для досліджень». Політика конфіденційності →", - "st.providers.webbrain_data_use.body": "Безкоштовне щоденне використання WebBrain Compass включено. Поки параметр «Допомагати вдосконалювати WebBrain» увімкнено за замовчуванням, вибрані розмови Compass можуть зберігатися й використовуватися для оцінювання, вдосконалення, тонкого налаштування та навчання. Вимкніть його в розділі «Загальні → Розширені», щоб виключити майбутні взаємодії з Compass із такого використання. WebBrain збирає запити до локальних моделей і ваших власних API, лише коли ви вмикаєте опцію «Ділитися запитами для досліджень» для цього провайдера. {privacyLink}. Для більшого обсягу оформіть підписку на {subscribeLink}. Керуйте оплатою на {accountLink}.", + "st.providers.webbrain_data_use.body": "Безкоштовне щоденне використання WebBrain Compass включено. Поки параметр «Допомагати вдосконалювати WebBrain» увімкнено за замовчуванням, вибрані розмови Compass можуть зберігатися й використовуватися для оцінювання, вдосконалення, тонкого налаштування та навчання. Вимкніть його в розділі «Налаштування → Розширені», щоб виключити майбутні взаємодії з Compass із такого використання. WebBrain збирає запити до локальних моделей і ваших власних API, лише коли ви вмикаєте опцію «Ділитися запитами для досліджень» для цього провайдера. {privacyLink}. Для більшого обсягу оформіть підписку на {subscribeLink}. Керуйте оплатою на {accountLink}.", 'st.providers.share_research.label': "Ділитися запитами для досліджень", 'st.providers.share_research.hint': "Надсилає запити й відповіді цього провайдера до WebBrain для оцінювання та вдосконалення, включно з відомостями про провайдера та модель. Зображення й бінарні вкладення вилучаються, а текст скорочується перед надсиланням; решта тексту надсилається без змін.", 'st.providers.share_research.confirm': "Ділитися запитами цього провайдера з WebBrain для досліджень?\n\nЯкщо ввімкнено, ваші запити, відповіді та взаємодії з інструментами цього провайдера надсилатимуться до WebBrain для оцінювання та вдосконалення разом із назвою провайдера й моделі. Текст надсилається без змін після вилучення зображень і скорочення довгого вмісту, тому не передавайте чутливі персональні дані. Ви можете вимкнути це будь-коли, щоб припинити надсилання.", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "Хочете менше переривань? «Завжди дозволяти» запам’ятовує цей сайт. Команда нижче вимикає запити дозволів WebBrain на всіх сайтах.", "sp.perm.insert_skip_command": "Вставити /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "Чернетку не змінено. Очистьте її перед вставленням команди.", - "ob.act.permissions_tip": "Запити дозволів увімкнено за замовчуванням. Досвідчені користувачі можуть вимкнути їх глобально командою /dangerously-skip-permissions і знову ввімкнути в Налаштування → Дозволи.", + "ob.act.permissions_tip": "Запити дозволів увімкнено за замовчуванням. Досвідчені користувачі можуть вимкнути їх глобально командою /dangerously-skip-permissions і знову ввімкнути кнопкою ⚠ поруч із мікрофоном.", 'st.provider.field.cache_read_cost_per_million': "Орієнтовна вартість читання з кешу ($ / 1 млн токенів)", 'st.provider.field.cache_write_cost_per_million': "Орієнтовна вартість запису в кеш на 5 хвилин ($ / 1 млн токенів)", 'st.provider.field.cache_write_1h_cost_per_million': "Орієнтовна вартість запису в кеш на 1 годину ($ / 1 млн токенів)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "Замінити зашифровану хмарну копію на поточні налаштування WebBrain цього пристрою?", "st.sync.consent.legacy": "Увімкнути зашифровану синхронізацію? WebBrain передасть наскрізну зашифровану копію ваших спогадів, автозаповнення профілю та налаштувань постачальника ключа API до WebBrain Compass. Історія чату та вхід OAuth не синхронізуються.", "st.sync.consent.denied": "Дозвіл на зашифровану синхронізацію не надано.", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "Сторінка змінилася під час виконання завдання ({before} → {after}). Завдання продовжується.", 'sp.activity.generating_answer': "Формування відповіді…", 'sp.activity.retrying_response': "Повторна спроба відповіді…", diff --git a/src/firefox/src/ui/locales/vi.js b/src/firefox/src/ui/locales/vi.js index 88e8de5f95..28008f5a3a 100644 --- a/src/firefox/src/ui/locales/vi.js +++ b/src/firefox/src/ui/locales/vi.js @@ -14,14 +14,6 @@ export default { 'sp.ui_scale.decrease': 'Thu nhỏ giao diện tiện ích', 'sp.ui_scale.increase': 'Phóng to giao diện tiện ích', 'sp.ui_scale.reset': 'Đặt lại', - 'st.display.ui_scale.label': 'Thu phóng giao diện tiện ích', - 'st.display.ui_scale.decrease': 'Thu nhỏ giao diện tiện ích', - 'st.display.ui_scale.increase': 'Phóng to giao diện tiện ích', - 'st.display.ui_scale.reset': 'Đặt lại', - 'st.display.ui_scale.desc': 'Thay đổi kích thước thanh bên và cửa sổ trò chuyện riêng mà không thay đổi mức thu phóng trang.', - 'st.display.ui_scale.shortcuts': 'Phím tắt riêng: {shortcuts}', - 'st.display.ui_scale.shortcuts_none': 'Chưa gán', - 'st.display.ui_scale.manage_shortcuts': 'Tùy chỉnh phím tắt', 'tool.delegate_research': 'Đang nghiên cứu với ChatGPT', 'st.display.research_escalation.label': 'Leo thang nghiên cứu', 'st.display.research_escalation.desc': 'Khi được bật, WebBrain có thể xin phép trước khi gửi một lời nhắc nghiên cứu chỉ đọc phức tạp bất thường đến ChatGPT. Tắt theo mặc định. Lời nhắc chính xác chỉ được chia sẻ sau khi bạn chấp thuận rõ ràng.', @@ -497,7 +489,7 @@ export default { 'sp.step.result_label': "kết quả", 'sp.api.enabled_html': "🔓 Đã bật đột biến API cho cuộc trò chuyện này. Hiện tại, tác nhân có thể sử dụng POST/PUT/PATCH/DELETE thông qua get_url và exec_js khi đánh giá API đáng tin cậy hơn giao diện người dùng cho một bước. UI-first vẫn là mặc định. Cờ này sẽ xóa khi bạn đặt lại cuộc trò chuyện.", - 'sp.permissions.disabled_html': "⚠️ Lời nhắc về quyền đang TẮT. WebBrain sẽ nhấp, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại và lên lịch công việc trong tương lai mà không cần hỏi trước. Kích hoạt lại tính năng này từ Cài đặt → Quyền → Hỏi trước các hành động tiếp theo.", + 'sp.permissions.disabled_html': "⚠️ Lời nhắc về quyền đang TẮT. WebBrain sẽ nhấp, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại và lên lịch công việc trong tương lai mà không cần hỏi trước. Bật lại tính năng này từ nút ⚠ bên cạnh micrô.", 'sp.permissions.button': 'Lời nhắc về quyền: bật', 'sp.permissions.button_off': 'Lời nhắc về quyền: tắt', 'sp.permissions.gate_desc': 'WebBrain sẽ hỏi lần đầu tiên nó nhấp, nhập, tải xuống hoặc chạy mã trên một trang web.', @@ -655,7 +647,7 @@ export default { 'ob.act.warn1': "WebBrain có thể chụp ảnh màn hình để lập kế hoạch. Tránh sử dụng chế độ đại lý trên các trang nhạy cảm, chẳng hạn như cổng thông tin sức khỏe, tài chính, hẹn hò hoặc tài khoản cá nhân, trừ khi bạn chấp nhận rủi ro đó.", 'ob.act.warn2': "Nội dung web có thể chứa các nội dung nhắc nhở độc hại được thiết kế để thao túng hành vi của AI.", 'ob.act.warn3': "Luôn xem xét các hành động được đề xuất và dừng các hoạt động có vẻ ngoài dự kiến.", - 'ob.act.permissions_tip': "Lời nhắc về quyền được bật theo mặc định. Người dùng nâng cao có thể vô hiệu hóa chúng trên toàn cầu bằng /dangerously-skip-permissions và bật lại chúng trong Cài đặt → Quyền.", + 'ob.act.permissions_tip': "Lời nhắc về quyền được bật theo mặc định. Người dùng nâng cao có thể vô hiệu hóa chúng trên toàn cầu bằng /dangerously-skip-permissions và bật lại chúng từ nút ⚠ bên cạnh micrô.", 'ob.tokens.title': "Chọn một mô hình", 'ob.tokens.body': "WebBrain cần một mô hình ngôn ngữ để hoạt động. Trước tiên, chúng tôi sẽ kiểm tra các mô hình địa phương. Nếu không có sẵn, hãy mở Cài đặt và thêm nhà cung cấp:", 'ob.tokens.scanning': "Đang kiểm tra các mô hình địa phương...", @@ -681,23 +673,32 @@ export default { 'ob.btn.done': "Bắt đầu", 'ob.btn.skip': "Bỏ qua bây giờ", 'ob.btn.start': 'Bắt đầu', - 'ob.cloud.body': 'WebBrain Compass đã sẵn sàng với hạn ngạch hằng tuần miễn phí. Các cuộc trò chuyện Compass được chọn có thể được giữ lại và sử dụng để cải thiện WebBrain trong khi Trợ giúp Cải thiện WebBrain được bật theo mặc định. Bạn có thể tắt nó trong Cài đặt → Chung.', + 'ob.cloud.body': 'WebBrain Compass đã sẵn sàng với hạn ngạch hằng tuần miễn phí. Các cuộc trò chuyện Compass được chọn có thể được giữ lại và sử dụng để cải thiện WebBrain trong khi Trợ giúp Cải thiện WebBrain được bật theo mặc định. Bạn có thể tắt nó trong Cài đặt → Nâng cao.', 'ob.cloud.change': 'Thay đổi', 'ob.cloud.using': 'Đang sử dụng WebBrain Compass.', // --- Settings ---------------------------------------------------------- 'st.title': "Cài đặt WebBrain", - 'st.subtitle': "Định cấu hình các nhà cung cấp và tùy chọn LLM của bạn · v{version}", + 'st.subtitle': "Định cấu hình cách WebBrain hoạt động · v{version}", 'st.tab.display': "chung", + 'st.tab.budgets': 'Ngân sách', + 'st.tab.advanced': 'Nâng cao', + 'st.tab.llm': 'LLM', + 'st.tab.speech': 'Giọng nói', + 'st.tab.generative': 'Tạo sinh', + 'st.tab.decision': 'Quyết định', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'Nhà cung cấp WebBrain', + 'st.providers_page.subtitle': 'Chọn các mô hình WebBrain sử dụng · v{version}', + 'st.permissions_page.title': 'Quyền của WebBrain', + 'st.permissions_page.subtitle': 'Các trang mà WebBrain có thể thao tác mà không cần hỏi trước', 'st.tab.providers': "Nhà cung cấp", 'st.tab.skills': "Kỹ năng", 'st.tab.vision': "Tầm nhìn", - 'st.tab.multimodal': "Mô hình hỗ trợ", 'st.tab.memory': "Bộ nhớ", 'st.tab.profile': "Hồ sơ", 'st.tab.account': "Tài khoản", 'st.tab.captcha': "CAPTCHA", - 'st.tab.permissions': "Quyền", 'st.perms.gate.label': "Hỏi trước các hành động mang tính hậu quả", 'st.perms.gate.desc': "Khuyến nghị. Khi bật, WebBrain sẽ yêu cầu quyền trong lần đầu tiên nhấp chuột, nhập, điều hướng, chạy JavaScript, tải lên, tải xuống, ghi lại hoặc lên lịch công việc trong tương lai trên một trang web (sau đó ghi nhớ lựa chọn của bạn). Tắt để sử dụng nhanh chóng, không cần nhắc nhở trên các trang web mà bạn hoàn toàn tin tưởng.", @@ -719,8 +720,6 @@ export default { "st.account.update_payment": "Cập nhật phương thức thanh toán", 'st.account.manage_billing': "Quản lý thanh toán", - 'st.display.language.label': "Ngôn ngữ", - 'st.display.language.desc': "Ngôn ngữ giao diện cho plugin WebBrain.", 'st.display.theme.label': "Ngoại hình", 'st.display.theme.desc': "Sáng, tối hoặc tuân theo cài đặt hệ điều hành của bạn.", 'st.display.theme.system': "Hệ thống", @@ -730,8 +729,8 @@ export default { 'st.display.download_directory.desc': "Thư mục con tùy chọn bên trong thư mục Tải xuống của trình duyệt hoặc hệ thống của bạn. Để trống để sử dụng mặc định của hệ thống.", 'st.display.download_directory.placeholder': "Mặc định hệ thống", 'st.display.download_directory.error': "Sử dụng thư mục tương đối như WebBrain hoặc Work/WebBrain. Đường dẫn tuyệt đối và “..” không được phép.", - 'st.display.search.placeholder': "Tìm kiếm Cài đặt chung", - 'st.display.search.empty': "Không có cài đặt chung nào khớp.", + 'st.display.search.placeholder': "Tìm kiếm cài đặt", + 'st.display.search.empty': "Không có cài đặt nào khớp.", 'st.display.advanced': "Nâng cao", ...getApocalypseModeCopy('vi'), ...getEmergencyBoxCopy('vi'), @@ -787,20 +786,18 @@ export default { 'st.display.auto_screenshot.label': "Ảnh chụp màn hình tự động", "st.display.auto_screenshot.desc": "Tự động chụp ảnh màn hình khung nhìn sau khi tác nhân thao tác trên trang để tuyến thị giác đã chọn thấy được thay đổi. Việc này tốn nhiều token hơn. Nếu thị giác không khả dụng, phần làm giàu sẽ bị bỏ qua và tác vụ tiếp tục với thông báo trạng thái.", 'st.display.auto_screenshot.off': "Tắt", - 'st.display.auto_screenshot.navigation': "Trên điều hướng", - 'st.display.auto_screenshot.state_change': "Khi thay đổi trạng thái (mặc định)", + 'st.display.auto_screenshot.navigation': "Trên điều hướng (mặc định)", + 'st.display.auto_screenshot.state_change': "Khi thay đổi trạng thái", 'st.display.auto_screenshot.every_step': "Mỗi bước", 'st.display.tracing.label': "Ghi lại dấu vết (để so sánh mô hình)", - 'st.display.tracing.desc_html': "Duy trì mọi lần chạy (yêu cầu LLM, phản hồi, lệnh gọi công cụ, ảnh chụp màn hình) vào IndexedDB cục bộ để bạn có thể kiểm tra và so sánh các mô hình song song. Mở trong tab Dấu vết riêng biệt. Tắt theo mặc định vì nó thêm ghi vào đĩa mỗi bước. Mở trang Dấu vết →", - 'st.display.lossless_tracing.label': 'Ghi lại chi tiết đầy đủ của yêu cầu (lớp gỡ lỗi)', - 'st.display.lossless_tracing.desc_html': 'Cũng lưu trữ đầy đủ prompt, tin nhắn và cấu trúc công cụ của mỗi yêu cầu LLM thay vì bản tóm tắt không nội dung, đồng thời giữ tối đa 200 KB mỗi kết quả công cụ. Cho phép gỡ lỗi sâu và dựng lại yêu cầu. Tắt theo mặc định vì ghi nội dung hội thoại cục bộ và tốn nhiều dung lượng hơn. Yêu cầu bật tính năng ghi trace.', + 'st.display.tracing.desc_html': "Lưu mọi lần chạy (yêu cầu LLM, phản hồi, lệnh gọi công cụ, ảnh chụp màn hình) vào IndexedDB cục bộ để bạn có thể kiểm tra và so sánh các mô hình song song, bao gồm đầy đủ prompt, tin nhắn và cấu trúc công cụ của mỗi yêu cầu LLM cùng tối đa 200 KB mỗi kết quả công cụ. Mở trong tab Dấu vết riêng biệt. Tắt theo mặc định vì ghi nội dung hội thoại cục bộ và tốn nhiều dung lượng hơn. Mở trang Dấu vết →", 'st.display.cost_session_limit.label': "Phụ cấp phiên chi phí đám mây", 'st.display.cost_session_limit.desc': "Dừng đám mây và OpenRouter chạy trước một lệnh gọi mô hình trả phí khác sau khi phiên này đạt đến mức chi phí được báo cáo hoặc ước tính. Mặc định là 10$.", 'st.display.cost_total_limit.label': "Tổng phụ cấp chi phí đám mây", 'st.display.cost_total_limit.desc': "Theo dõi chi tiêu được báo cáo hoặc ước tính trên đám mây/mô hình OpenRouter trên tiện ích mở rộng và dừng các cuộc gọi trả phí tiếp theo ở mức cho phép. Các nhà cung cấp địa phương không được tính.", 'st.display.cost_reset': "Đặt lại chi tiêu", 'st.display.strict_secret.label': "Xử lý bí mật nghiêm ngặt", - 'st.display.strict_secret.desc': "Từ chối trích dẫn thông tin xác thực (mật khẩu, khóa API, mã thông báo, OTP) trong bản tóm tắt hoặc văn bản trợ lý — ngay cả khi bạn yêu cầu chúng một cách rõ ràng. Hữu ích nếu bạn thường xuyên chia sẻ tệp theo dõi hoặc chia sẻ màn hình. Tắt theo mặc định để tác nhân có thể nhắc lại đúng giá trị bạn yêu cầu khi bạn cần. Bật nó (Cài đặt → Bảo mật) khi bạn muốn bản tóm tắt `done` gọn gàng và thông tin xác thực không bao giờ bị lặp lại.", + 'st.display.strict_secret.desc': "Từ chối trích dẫn thông tin xác thực (mật khẩu, khóa API, mã thông báo, OTP) trong bản tóm tắt hoặc văn bản trợ lý — ngay cả khi bạn yêu cầu chúng một cách rõ ràng. Hữu ích nếu bạn thường xuyên chia sẻ tệp theo dõi hoặc chia sẻ màn hình. Tắt theo mặc định để tác nhân có thể nhắc lại đúng giá trị bạn yêu cầu khi bạn cần. Bật nó khi bạn muốn bản tóm tắt `done` gọn gàng và thông tin xác thực không bao giờ bị lặp lại.", 'st.display.allow_local_network.label': "Cho phép đại lý truy cập mạng cục bộ", 'st.display.allow_local_network.desc': "Cho phép công cụ tìm nạp_url của tác nhân tiếp cận vòng lặp ngược (127.0.0.1, localhost) và các địa chỉ riêng tư/RFC1918 (10.x, 192.168.x, 172.16–31.x). Hữu ích cho các máy chủ phát triển cục bộ, công cụ mạng nội bộ hoặc API tự lưu trữ. Tắt theo mặc định. Khi tắt, URL ghi trực tiếp IP riêng hoặc loopback và tên localhost sẽ bị chặn. Không kiểm tra phân giải DNS, nên các tên máy chủ khác vẫn có thể dẫn tới địa chỉ cục bộ. IP trực tiếp của siêu dữ liệu đám mây (169.254.169.254) và tên siêu dữ liệu trong danh sách hoặc *.internal/*.local vẫn bị chặn ngay cả khi bật.", 'st.display.scheduled_tasks.label': "Nhiệm vụ theo lịch trình", @@ -890,7 +887,7 @@ export default { 'st.providers.compat.value.max': "Tối đa", 'st.providers.compat.value.system': "Hệ thống", 'st.providers.compat.value.developer': "Nhà phát triển", - 'st.providers.webbrain_data_use.body': "Đã bao gồm việc sử dụng WebBrain Compass miễn phí hàng ngày. Mặc dù Trợ giúp cải thiện WebBrain được bật theo mặc định, nhưng các cuộc hội thoại Compass đã chọn có thể được giữ lại và sử dụng để đánh giá, cải tiến, tinh chỉnh và đào tạo. Hãy tắt tính năng này trong Chung → Nâng cao để loại trừ các tương tác Compass trong tương lai khỏi những mục đích sử dụng đó. WebBrain chỉ thu thập yêu cầu mô hình cục bộ và API riêng của bạn khi bạn bật tùy chọn “Chia sẻ truy vấn để nghiên cứu” của nhà cung cấp này. {privacyLink}. Để sử dụng nhiều hơn, hãy đăng ký tại {subscribeLink}. Quản lý thanh toán tại {accountLink}.", + 'st.providers.webbrain_data_use.body': "Đã bao gồm việc sử dụng WebBrain Compass miễn phí hàng ngày. Mặc dù Trợ giúp cải thiện WebBrain được bật theo mặc định, nhưng các cuộc hội thoại Compass đã chọn có thể được giữ lại và sử dụng để đánh giá, cải tiến, tinh chỉnh và đào tạo. Hãy tắt tính năng này trong Cài đặt → Nâng cao để loại trừ các tương tác Compass trong tương lai khỏi những mục đích sử dụng đó. WebBrain chỉ thu thập yêu cầu mô hình cục bộ và API riêng của bạn khi bạn bật tùy chọn “Chia sẻ truy vấn để nghiên cứu” của nhà cung cấp này. {privacyLink}. Để sử dụng nhiều hơn, hãy đăng ký tại {subscribeLink}. Quản lý thanh toán tại {accountLink}.", 'st.providers.share_research.label': "Chia sẻ truy vấn để nghiên cứu", 'st.providers.share_research.hint': "Gửi prompt và phản hồi của nhà cung cấp này tới WebBrain để đánh giá và cải thiện, bao gồm nhà cung cấp và mô hình đã dùng. Hình ảnh và tệp đính kèm nhị phân bị loại bỏ và văn bản bị cắt ngắn trước khi chia sẻ; phần văn bản còn lại được gửi nguyên văn.", 'st.providers.share_research.confirm': "Chia sẻ truy vấn của nhà cung cấp này với WebBrain để nghiên cứu?\n\nKhi bật, prompt, phản hồi và tương tác công cụ của bạn với nhà cung cấp này sẽ được gửi tới WebBrain để đánh giá và cải thiện, cùng tên nhà cung cấp và mô hình. Văn bản được gửi nguyên văn sau khi loại ảnh và cắt ngắn nội dung dài, vì vậy hãy tránh chia sẻ dữ liệu cá nhân nhạy cảm. Bạn có thể tắt bất cứ lúc nào để dừng chia sẻ.", @@ -1035,7 +1032,6 @@ export default { // Screenshot redaction (issue #312): local, best-effort PII blurring that // runs in-browser before any screenshot reaches a vision model. - 'st.redaction.heading': "Chỉnh sửa ảnh chụp màn hình", 'st.redaction.toggle.label': "Biên tập lại nội dung nhạy cảm từ ảnh chụp màn hình", 'st.redaction.toggle.desc': "Trước khi ảnh chụp màn hình được gửi tới mô hình trực quan, hãy làm mờ các trường biểu mẫu và văn bản trông giống như email hoặc số điện thoại. Quá trình phát hiện chạy hoàn toàn trên thiết bị của bạn — không có gì được truyền đi thêm.", 'st.redaction.warning': "⚠️ Nỗ lực tối đa và không mở được: nếu quá trình biên tập không thể chạy trên một trang (ví dụ: ngay sau khi điều hướng, trên trình xem PDF hoặc trên các trang trình duyệt bị hạn chế), ảnh chụp màn hình vẫn được gửi ở trạng thái chưa được biên tập. Tính năng phát hiện chỉ sử dụng phương pháp phỏng đoán DOM — văn bản được vẽ bằng canvas, PII bên trong hình ảnh hoặc bất kỳ nội dung nào không được nhận dạng dưới dạng trường biểu mẫu hoặc văn bản email/điện thoại có thể lọt qua và văn bản trang được gửi tới mô hình không bị loại bỏ bởi cài đặt này. Nó KHÔNG phải là một đảm bảo an ninh. Để có được sự riêng tư hoàn toàn, hãy sử dụng mô hình cục bộ/ngoại tuyến (llama.cpp, Ollama): ảnh chụp màn hình sau đó không bao giờ rời khỏi máy của bạn và việc chỉnh sửa là không cần thiết.", @@ -1223,7 +1219,7 @@ export default { "sp.slash.export_traces_full": "Xuất toàn bộ phiên theo dõi đã lưu dưới dạng JSON, gồm cả ảnh chụp màn hình", "sp.export_traces.recording_truncated": "Đã xuất mọi bản ghi đã lưu dưới dạng JSON. Nội dung bị bỏ qua trong lúc ghi không thể khôi phục bằng cách xuất.", "sp.slash.export_traces": "Xuất chuỗi công cụ (dấu vết)", - "sp.export_traces.none": "Không có dấu vết cho cuộc trò chuyện này. Bật Ghi dấu vết trong Cài đặt rồi chạy lại.", + "sp.export_traces.none": "Không có dấu vết cho cuộc trò chuyện này. Bật Ghi dấu vết trong Cài đặt → Nâng cao rồi chạy lại.", "sp.export_traces.error": "Không thể xuất dấu vết.", "sp.export_traces.done": "Chuỗi công cụ đã xuất khẩu.", "sp.export_traces.no_conversation": "Chưa có gì để xuất - trước tiên hãy bắt đầu cuộc trò chuyện.", @@ -1297,7 +1293,7 @@ export default { "st.sync.confirm.reset": "Thay thế bản sao đám mây được mã hóa bằng thiết lập WebBrain hiện tại của thiết bị này?", "st.sync.consent.legacy": "Bật đồng bộ hóa được mã hóa? WebBrain sẽ truyền bản sao được mã hóa nối đầu các ký ức của bạn, tự động điền hồ sơ và cài đặt nhà cung cấp khóa API tới WebBrain Compass. Lịch sử trò chuyện và thông tin đăng nhập OAuth không được đồng bộ hóa.", "st.sync.consent.denied": "Quyền đồng bộ hóa được mã hóa không được cấp.", - 'st.providers.webgpu_note.body': '{modelLink} chạy hoàn toàn trong Chrome mà không cần điểm cuối API. Tải mô hình trong Settings > Providers > WebGPU hoặc Chế độ Apocalypse, rồi dùng nút nuclear trong standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} chạy hoàn toàn trong Chrome mà không cần điểm cuối API. Tải mô hình trong Providers > WebGPU hoặc Chế độ Apocalypse, rồi dùng nút nuclear trong standalone chat.', 'sp.monitor.navigation': "Trang đã thay đổi khi tác vụ đang chạy ({before} → {after}). Tiếp tục tác vụ.", 'sp.activity.generating_answer': "Đang tạo câu trả lời…", 'sp.activity.retrying_response': "Đang thử lại câu trả lời…", diff --git a/src/firefox/src/ui/locales/zh.js b/src/firefox/src/ui/locales/zh.js index 21b23ec077..81c7df16d2 100644 --- a/src/firefox/src/ui/locales/zh.js +++ b/src/firefox/src/ui/locales/zh.js @@ -16,14 +16,6 @@ export default { 'sp.ui_scale.decrease': '缩小插件界面', 'sp.ui_scale.increase': '放大插件界面', 'sp.ui_scale.reset': '重置', - 'st.display.ui_scale.label': '插件界面缩放', - 'st.display.ui_scale.decrease': '缩小插件界面', - 'st.display.ui_scale.increase': '放大插件界面', - 'st.display.ui_scale.reset': '重置', - 'st.display.ui_scale.desc': '调整侧栏和独立聊天窗口的大小,不影响网页缩放。', - 'st.display.ui_scale.shortcuts': '专用快捷键:{shortcuts}', - 'st.display.ui_scale.shortcuts_none': '未设置', - 'st.display.ui_scale.manage_shortcuts': '自定义快捷键', 'tool.delegate_research': '正在使用 ChatGPT 进行研究', 'st.display.research_escalation.label': '研究升级', 'st.display.research_escalation.desc': '启用后,WebBrain 可能会在向 ChatGPT 发送异常复杂的只读研究提示词前征求许可。默认关闭。只有在您明确批准后,才会共享提示词原文。', @@ -117,7 +109,6 @@ export default { "sp.unverified.dont": "不继续", "sp.recipient.reason_unrequested": "WebBrain 无法从你的请求中确定需要发送消息。{host} 上打开的对话对象是 {recipient}。", "sp.recipient.reason_unnamed": "WebBrain 无法从你的请求中确定这条消息要发给谁。{host} 上打开的对话对象是 {recipient}。", - 'st.tab.permissions': "权限", 'st.perms.revoke': "撤销", 'st.perms.clear_all': "清除所有权限", 'st.perms.gate.label': "执行重要操作前询问", @@ -238,7 +229,7 @@ export default { 'ob.btn.done': '开始使用', 'ob.btn.skip': '暂时跳过', 'ob.btn.start': '开始', - 'ob.cloud.body': 'WebBrain Compass 已准备好每周免费配额。选定的 Compass 对话可能会被保留并用于改进 WebBrain,而帮助改进 WebBrain 默认情况下处于开启状态。您可以在设置 → 常规中将其关闭。', + 'ob.cloud.body': 'WebBrain Compass 已准备好每周免费配额。选定的 Compass 对话可能会被保留并用于改进 WebBrain,而帮助改进 WebBrain 默认情况下处于开启状态。您可以在设置 → 高级中将其关闭。', 'ob.cloud.change': '更改', 'ob.cloud.using': '正在使用 WebBrain Compass。', @@ -329,7 +320,7 @@ export default { 'sp.step.result_label': '结果', 'sp.api.enabled_html': '🔓 本次会话已启用 API 变更。当代理判断 API 比界面更可靠时,可以通过 fetch_url 和 execute_js 使用 POST/PUT/PATCH/DELETE。默认仍优先使用界面。重置会话后此标志会清除。', - 'sp.permissions.disabled_html': '⚠️ 权限提示已关闭。WebBrain 将在不询问的情况下点击、输入、导航、运行 JavaScript、上传、下载、录制以及安排后续任务。请在设置 → 权限 → 执行重要操作前询问中重新启用。', + 'sp.permissions.disabled_html': '⚠️ 权限提示已关闭。WebBrain 将在不询问的情况下点击、输入、导航、运行 JavaScript、上传、下载、录制以及安排后续任务。请通过麦克风旁的 ⚠ 按钮重新启用。', 'sp.permissions.button': '权限提示:开启', 'sp.permissions.button_off': '权限提示:关闭', 'sp.permissions.gate_desc': 'WebBrain 首次在某个网站上点击、输入、下载或运行代码前会先询问。', @@ -402,8 +393,19 @@ export default { 'tool.wait_for_element.selector': '等待「{selector}」', 'st.title': 'WebBrain 设置', - 'st.subtitle': '配置你的 LLM 提供商和偏好 · v{version}', + 'st.subtitle': '配置 WebBrain 的工作方式 · v{version}', 'st.tab.display': '通用', + 'st.tab.budgets': '预算', + 'st.tab.advanced': '高级', + 'st.tab.llm': 'LLM', + 'st.tab.speech': '语音', + 'st.tab.generative': '生成', + 'st.tab.decision': '决策', + 'st.tab.safesocial': 'SafeSocial', + 'st.providers_page.title': 'WebBrain 提供商', + 'st.providers_page.subtitle': '选择 WebBrain 使用的模型 · v{version}', + 'st.permissions_page.title': 'WebBrain 权限', + 'st.permissions_page.subtitle': 'WebBrain 无需先询问即可操作的网站', 'st.tab.providers': '提供商', 'st.tab.vision': '视觉', 'st.tab.profile': '个人资料', @@ -419,8 +421,6 @@ export default { "st.account.update_payment": "更新付款方式", 'st.account.manage_billing': '管理账单', - 'st.display.language.label': '语言', - 'st.display.language.desc': 'WebBrain 插件的界面语言。', 'st.display.verbose.label': '详细模式', 'st.display.verbose.desc': '显示完整的工具调用详情、参数和原始 JSON 结果。默认关闭,以获得更清爽的聊天体验。', 'st.display.selection_shortcut.label': '划词快捷操作', @@ -434,13 +434,11 @@ export default { 'st.display.auto_screenshot.label': '自动截图', "st.display.auto_screenshot.desc": "代理对页面操作后自动截取视口截图,让所选视觉路由看到变化。会消耗更多 token。如果视觉不可用,将跳过视觉增强,并显示状态通知后继续任务。", 'st.display.auto_screenshot.off': '关闭', - 'st.display.auto_screenshot.navigation': '导航时', - 'st.display.auto_screenshot.state_change': '状态变化时(默认)', + 'st.display.auto_screenshot.navigation': '导航时(默认)', + 'st.display.auto_screenshot.state_change': '状态变化时', 'st.display.auto_screenshot.every_step': '每一步', 'st.display.tracing.label': '记录轨迹(用于模型对比)', - 'st.display.tracing.desc_html': '将每次运行(LLM 请求、响应、工具调用、截图)持久化到本地 IndexedDB,以便并排查看和对比模型。在独立的轨迹页打开。因为每步都会写盘,默认关闭。打开轨迹页 →', - 'st.display.lossless_tracing.label': '记录完整请求详情(调试档)', - 'st.display.lossless_tracing.desc_html': '同时持久化每次 LLM 请求的完整提示词、消息与工具结构(而非无内容摘要),并保留每个工具结果最多 200 KB。支持深度调试与请求重建。默认关闭,因为会在本地写入对话内容并占用更多磁盘。需要先开启记录轨迹。', + 'st.display.tracing.desc_html': '将每次运行(LLM 请求、响应、工具调用、截图)持久化到本地 IndexedDB,以便并排查看和对比模型,包括每次 LLM 请求的完整提示词、消息与工具结构,以及每个工具结果最多 200 KB。在独立的轨迹页打开。默认关闭,因为会在本地写入对话内容并占用更多磁盘。打开轨迹页 →', 'st.display.allow_local_network.label': '允许代理访问本地网络', 'st.display.allow_local_network.desc': '允许代理的 fetch_url 工具访问回环(127.0.0.1、localhost)和私有/RFC1918 地址(10.x、192.168.x、172.16–31.x)。用于本地开发服务器、内网工具或自托管 API。默认关闭。关闭时会阻止直接写有私有或回环 IP 地址的 URL 以及 localhost 主机名。不检查 DNS 解析,因此其他主机名仍可能连接到本地地址。即使开启,云元数据的 IP 字面量(169.254.169.254)以及列表中的元数据主机名或 *.internal/*.local 主机名仍会被阻止。', 'st.display.notify_sound.label': "通知提示音", @@ -647,7 +645,6 @@ export default { "sp.vision.on": "已为当前提供商启用视觉模式。", "sp.vision.off": "已为当前提供商禁用视觉模式。", "sp.vision.error": "视觉模式切换失败:{msg}", - "st.tab.multimodal": "辅助模型", "st.tab.captcha": "CAPTCHA", "st.perms.gate.desc": "推荐开启。开启后,WebBrain 首次在某站点点击、输入、导航、运行 JavaScript、上传、下载或录制时会请求权限(随后记住你的选择)。在你完全信任的站点上可关闭,以便快速、免提示地使用。", "st.perms.gate.warning": "⚠️ 权限提示已关闭。WebBrain 将在任何站点上点击、输入、导航、运行 JavaScript、上传、下载和录制而无需询问 —— 包括内容可能被攻击者控制的页面。页面内容在内部仍被视为不可信,但没有任何机制能阻止被注入的指令触发操作。只有当你完全信任使用本助手的每一个站点时,才将其保持关闭。", @@ -665,7 +662,7 @@ export default { "st.display.download_directory.placeholder": "系统默认值", "st.display.download_directory.error": "请使用 WebBrain 或 Work/WebBrain 这样的相对文件夹。不允许使用绝对路径或“..”。", "st.display.strict_secret.label": "严格的机密处理", - "st.display.strict_secret.desc": "拒绝在总结或助手文本中引用凭据(密码、API 密钥、令牌、OTP)—— 即使你明确要求也是如此。如果你经常分享轨迹文件或共享屏幕,这会很有用。默认关闭,这样当你需要时,代理可以复述你要求的确切值。当你希望 `done` 总结保持整洁且凭据不被重复显示时,请开启它(设置 → 安全)。", + "st.display.strict_secret.desc": "拒绝在总结或助手文本中引用凭据(密码、API 密钥、令牌、OTP)—— 即使你明确要求也是如此。如果你经常分享轨迹文件或共享屏幕,这会很有用。默认关闭,这样当你需要时,代理可以复述你要求的确切值。当你希望 `done` 总结保持整洁且凭据不被重复显示时,请开启它。", "st.display.request_timeout.label": "LLM 请求超时", "st.display.request_timeout.desc": "等待响应头以及流式响应中每次数据块间隔的最长时间。默认:120秒。本地模型较慢时,尤其在CPU上运行或上下文较大时,请延长此时间。", "st.providers.filter.all": "全部", @@ -897,8 +894,8 @@ export default { 'sp.slash.busy_only_oob': 'WebBrain 忙碌时,消息会排队。只有 /help、/progress、/btw、/scratchpad、/memory、/schedule --list、/watch、/dangerously-skip-permissions、/screenshot、/export、/export --traces 和 /verbose 可以作为斜杠命令立即运行。', 'tool.go_back': '返回', 'tool.go_forward': '前进', - 'st.display.search.placeholder': '搜索通用设置', - 'st.display.search.empty': '没有匹配的通用设置。', + 'st.display.search.placeholder': '搜索设置', + 'st.display.search.empty': '没有匹配的设置。', 'st.display.advanced': '高级', ...getApocalypseModeCopy('zh'), ...getEmergencyBoxCopy('zh'), @@ -1146,7 +1143,6 @@ export default { "st.imageBudget.maxDimension.desc": "发送给视觉的任何截图的最长边(宽或高),单位为像素。更小的上限会在发送前缩小图像,降低 token 与成本;更大的上限保留保真度。", "st.imageBudget.warning": "⚠️ 这些设置适用于为视觉捕获的截图(自动截图、/screenshot、整页、verify_form)。手动保存的全分辨率图像不受影响。「Image detail」由 OpenAI 风格端点遵循;其他提供商可能忽略。", - "st.redaction.heading": "截图打码", "st.redaction.toggle.label": "对截图中的敏感内容进行打码", "st.redaction.toggle.desc": "在截图发送给视觉模型之前,对表单字段以及看起来像邮箱或电话号码的文本进行打码模糊处理。检测完全在你的设备上运行——不会额外传输任何内容。", "st.redaction.warning": "⚠️ 这是尽力而为且失败开放(fail-open)的处理:如果打码功能在某个页面上无法运行(例如刚导航完成之后、在 PDF 查看器中,或在受限的浏览器页面上),截图仍会以未打码的原样发送。检测仅使用 DOM 启发式方法——canvas 上绘制的文字、图片中的个人信息,或任何未被识别为表单字段或邮箱/电话文本的内容都可能被遗漏,发送给模型的页面文本也不会被此设置打码。这不是安全保证。若需要完全的隐私保护,请使用本地/离线模型(llama.cpp、Ollama):这样截图将永远不会离开你的设备,也就不再需要打码。", @@ -1160,7 +1156,7 @@ export default { "sp.slash.export_traces_full": "将完整的已保存跟踪会话导出为 JSON,包括截图", "sp.export_traces.recording_truncated": "已将所有保存的记录导出为 JSON。录制时省略的内容无法通过导出恢复。", "sp.slash.export_traces": "导出工具链(跟踪)", - "sp.export_traces.none": "此对话没有跟踪记录。请在设置中开启「记录跟踪」,然后重新运行。", + "sp.export_traces.none": "此对话没有跟踪记录。请在设置 → 高级中开启「记录跟踪」,然后重新运行。", "sp.export_traces.error": "无法导出跟踪。", "sp.export_traces.done": "工具链已导出。", "sp.export_traces.no_conversation": "暂无可导出内容 — 请先开始对话。", @@ -1168,7 +1164,7 @@ export default { "sp.export_traces.truncated": "工具链已导出。如果此对话有很多跟踪记录,较早的回合可能缺失。", "st.display.help_improve.label": "帮助改进 WebBrain", "st.display.help_improve.desc_html": "允许保留选定的 WebBrain Compass 交互,并将其用于评估、改进、微调和训练。此选项默认开启。关闭后,未来的 Compass 交互将不会用于这些用途。WebBrain 仅会收集您开启了“共享查询以用于研究”的服务商的本地模型和自备 API 请求。隐私政策 →", - "st.providers.webbrain_data_use.body": "WebBrain Compass 包含每日免费用量。帮助改进 WebBrain 默认开启时,选定的 Compass 对话可能会被保留,并用于评估、改进、微调和训练。可在“常规 → 高级”中关闭,以排除未来的 Compass 交互。仅当您开启此服务商的“共享查询以用于研究”选项时,WebBrain 才会收集本地模型和自备 API 请求。{privacyLink}。如需更多用量,请在 {subscribeLink} 订阅。在 {accountLink} 管理账单。", + "st.providers.webbrain_data_use.body": "WebBrain Compass 包含每日免费用量。帮助改进 WebBrain 默认开启时,选定的 Compass 对话可能会被保留,并用于评估、改进、微调和训练。可在“设置 → 高级”中关闭,以排除未来的 Compass 交互。仅当您开启此服务商的“共享查询以用于研究”选项时,WebBrain 才会收集本地模型和自备 API 请求。{privacyLink}。如需更多用量,请在 {subscribeLink} 订阅。在 {accountLink} 管理账单。", 'st.providers.share_research.label': "共享查询以用于研究", 'st.providers.share_research.hint': "将此服务商的提示词和回复连同所用的服务商及模型发送给 WebBrain,用于评估与改进。共享前会去除图片和二进制附件并截断文本;其余文本将按原样发送。", 'st.providers.share_research.confirm': "要与 WebBrain 共享此服务商的查询以用于研究吗?\n\n开启后,您与此服务商的提示词、回复和工具交互将连同服务商及模型名称发送给 WebBrain,用于评估与改进。文本在去除图片并截断过长内容后按原样发送,因此请避免共享敏感个人信息。您可以随时关闭以停止今后的共享。", @@ -1214,7 +1210,7 @@ export default { "sp.perm.skip_hint": "想减少打断?“始终允许”会记住此网站。下面的命令会在所有网站上关闭 WebBrain 权限提示。", "sp.perm.insert_skip_command": "插入 /dangerously-skip-permissions", "sp.perm.skip_hint_draft": "草稿未更改。请先清空草稿再插入命令。", - "ob.act.permissions_tip": "权限提示默认开启。高级用户可使用 /dangerously-skip-permissions 在所有网站上关闭提示,并在设置 → 权限中重新开启。", + "ob.act.permissions_tip": "权限提示默认开启。高级用户可使用 /dangerously-skip-permissions 在所有网站上关闭提示,并通过麦克风旁的 ⚠ 按钮重新开启。", 'st.provider.field.cache_read_cost_per_million': "估算缓存读取费用($ / 100 万 token)", 'st.provider.field.cache_write_cost_per_million': "估算 5 分钟缓存写入费用($ / 100 万 token)", 'st.provider.field.cache_write_1h_cost_per_million': "估算 1 小时缓存写入费用($ / 100 万 token)", @@ -1276,7 +1272,7 @@ export default { "st.sync.confirm.reset": "使用该设备当前的 WebBrain 设置替换加密的云副本?", "st.sync.consent.legacy": "开启加密同步? WebBrain 会将您的记忆、个人资料自动填充和 API 密钥提供商设置的端到端加密副本传输到 WebBrain Compass。聊天历史记录和 OAuth 登录不同步。", "st.sync.consent.denied": "未授予加密同步权限。", - 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Settings > Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', + 'st.providers.webgpu_note.body': '{modelLink} runs entirely in Chrome with no API endpoint. Download it in Providers > WebGPU or Apocalypse Mode, then use the nuclear control in standalone chat.', 'sp.monitor.navigation': "任务运行期间页面发生了变化({before} → {after})。正在继续任务。", 'sp.activity.generating_answer': "正在生成回答…", 'sp.activity.retrying_response': "正在重试回答…", diff --git a/src/firefox/src/ui/permissions.html b/src/firefox/src/ui/permissions.html new file mode 100644 index 0000000000..2f7300b7e5 --- /dev/null +++ b/src/firefox/src/ui/permissions.html @@ -0,0 +1,55 @@ + + + + + + WebBrain Permissions + + + + + +
+
+

+

+
+ +
+ +
+
+
+
+
+
+
+ +
+ + +
+
+ +
+
+ + + + diff --git a/src/firefox/src/ui/providers.html b/src/firefox/src/ui/providers.html new file mode 100644 index 0000000000..e130765bf0 --- /dev/null +++ b/src/firefox/src/ui/providers.html @@ -0,0 +1,334 @@ + + + + + + WebBrain Providers + + + + + + +
+
+

+

+
+ +
+ + + +
+
+ +
+
+ +
+

+ + +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+ +
+

+ + +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+ +
+

+ + +

+
+
+
+ + +
+
+ + +
+
+ + +
+ + + +
+ + +
+
+ + + +
+
+
+
+ +
+

+ + +

+
+

+ +
+ +
+ + + +
+
+

+ + + +

+ + + + +
+ + + +
+
+ +
+
+
+ +
+

+
+
+
+
+
+
+ +
+

+

+
+ + +
+
+ +
+ + 95% +
+
+
+
+ +
+
+

+
+
+ + +
+
+
+ + + + + + + + diff --git a/src/firefox/src/ui/settings-tabs.js b/src/firefox/src/ui/settings-tabs.js index be33030a88..e8cdf9ec53 100644 --- a/src/firefox/src/ui/settings-tabs.js +++ b/src/firefox/src/ui/settings-tabs.js @@ -1,12 +1,35 @@ -// Tab switcher for settings.html. Kept out of an inline - + @@ -1410,9 +16,13 @@

-

+

+ + + + @@ -1425,29 +35,24 @@

- - - + -
-
- - -
-
-
-
-
- -
+ + + +
+

+
@@ -1459,20 +64,6 @@

-
-
-
-
-
- -
-
- - 100% - - -
-
@@ -1531,22 +122,6 @@

-
-
-
50
-
-
- -
-
-
-
120s
-
-
- -
@@ -1559,6 +134,22 @@

+
+
+
+
+
+ +
+
+
+ +
+

+
@@ -1590,783 +181,81 @@

-
-
+
60s
+
- +

- -
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
Notification sounds
-
Play a distinct sound for plans awaiting review and a short chime for completion or clarification. No sound when you cancel a run.
-
- -
-
-
-
-
-
- -
-
-
-
Flash tabs for alerts
-
Blink a background tab’s title and icon when a plan is ready for review or a task finishes. Plans use a ⚠️ icon.
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
60s
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
- -
-

Firefox trusted automation (experimental)

-

Use a local companion for browser dialogs, trusted clicks and typing, and file uploads. Requires Node.js 22+ and Firefox started with remote automation enabled.

-

Install the companion using node firefox-companion/install.mjs from the WebBrain checkout. Restart Firefox with --remote-debugging-port 9222. Keep the connection on this computer.

- -
- -

-
-
-

-

- -
-
-

CapSolver

- -
-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
- -
-
-

2Captcha

- -
-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
- -
- -

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
- -
-
-

SolveCaptcha

- -
-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
- -
-
-

Anti-Captcha

- -
-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
-
-
-

NopeCHA

- -
-

-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
-
-
-

NoneCap

- -
-

-

-

-
- - -
-
- - - -
-
-
- -
- - -
-
-
-
-
- - +
+
+
+
-
-
-
- -
-
- -
-
- -
-

- - -

-
-
-
- - -
-
- - -
-
- - -
-
- - - -
-
-
- -

-
-
- -
- - -
-
- -
- - -
-
- -
- - + + -
- -
-
- -

-
-
+
-
-
+
50
+
- -
-
-
- -

- - -

-
-
-
- - -
-
- - -
-
- - -
-
- - - -
-
-
- -

- - -

-
-
-
- - -
-
- - -
-
- - -
- - - -
- - -
-
- - - +
-
-
- -

- - -

-
-

- -
- -
- - - -
-
-

- - - -

- - -
@@ -2571,24 +460,195 @@

-
-
-
-
-
-
-
- -
- +
+

+
+
+

+

+ +
+
+

CapSolver

+ +
+

+

+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+
+ +
+
+

2Captcha

+ +
+

+

+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+
+ +
+ +

+

+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+
+ +
+
+

SolveCaptcha

+ +
+

+

+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+
-
-
-
@@ -2641,6 +701,236 @@

+
+

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
Notification sounds
+
Play a distinct sound for plans awaiting review and a short chime for completion or clarification. No sound when you cancel a run.
+
+ +
+
+
+
+
+
+ +
+
+
+
Flash tabs for alerts
+
Blink a background tab’s title and icon when a plan is ready for review or a task finishes. Plans use a ⚠️ icon.
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ +
+

Firefox trusted automation (experimental)

+

Use a local companion for browser dialogs, trusted clicks and typing, and file uploads. Requires Node.js 22+ and Firefox started with remote automation enabled.

+

Install the companion using node firefox-companion/install.mjs from the WebBrain checkout. Restart Firefox with --remote-debugging-port 9222. Keep the connection on this computer.

+ +
+ +

+
+
+
+ @@ -2648,6 +938,5 @@

- diff --git a/src/firefox/src/ui/settings.js b/src/firefox/src/ui/settings.js index 6c899ad5d7..c5a11f2d1c 100644 --- a/src/firefox/src/ui/settings.js +++ b/src/firefox/src/ui/settings.js @@ -3,22 +3,19 @@ import { normalizeLeanModeSetting } from '../agent/lean-mode.js'; import { D1_MODEL_ID } from '../providers/d1-config.js'; import { initD1Settings } from './d1-settings.js'; /** - * WebBrain Settings Page — provider configuration + display settings. + * WebBrain Settings pages — settings.html (preferences, budgets, memory, + * skills, CAPTCHA, Bridge, advanced), providers.html (the chat provider and + * the assistive models) and permissions.html (site permissions). + * + * One controller serves all three pages: each section below wires itself up + * only when its markup is on the current page. */ -import { t, getLocale, setLocale, LANGUAGES } from './i18n.js'; +import { t } from './i18n.js'; import { escapeHtml } from './utils.js'; import { MEDIA_PROVIDERS, mediaProvider, validateMediaConfig } from '../agent/media-config.js'; import { RESEARCH_DATA_COLLECTION } from '../trace/research-consent.js'; import { THEME_MODES, applyMode, loadMode, watch } from './theme.js'; -import { - UI_SCALE_LEVELS, - UI_SCALE_STORAGE_KEY, - loadUiScale, - nextUiScale, - normalizeUiScale, - saveUiScale, -} from './ui-scale.js'; import { renderSkillMarkdown } from './skill-markdown.js'; import { CAPABILITY_LABEL } from '../agent/permission-gate.js'; import { @@ -85,13 +82,11 @@ const SUBSCRIPTION_GUIDE_PRODUCTS = Object.freeze({ // Version shown in the subtitle. Kept here so it only needs one update per // release; the subtitle string itself is translated. -const EXT_VERSION = '42.0.6'; +const EXT_VERSION = '42.1.0'; const providersContainer = document.getElementById('providers'); -const displaySettings = document.getElementById('display-settings'); const generalSearchInput = document.getElementById('input-general-search'); const generalSearchEmpty = document.getElementById('general-search-empty'); -const advancedSettings = document.querySelector('.advanced-settings'); const apocalypseModeLink = document.getElementById('apocalypse-mode-link'); const apocalypseModeStatus = document.getElementById('apocalypse-mode-status'); const verboseToggle = document.getElementById('toggle-verbose'); @@ -131,7 +126,6 @@ const completionConfettiToggle = document.getElementById('toggle-completion-conf const completionFlashTabToggle = document.getElementById('toggle-completion-flash-tab'); const tracingToggle = document.getElementById('toggle-tracing'); const feedbackDiagnosticsToggle = document.getElementById('toggle-feedback-diagnostics'); -const losslessTracingToggle = document.getElementById('toggle-lossless-tracing'); const strictSecretToggle = document.getElementById('toggle-strict-secret'); const strictGuardsToggle = document.getElementById('toggle-strict-guards'); const leanModeSelect = document.getElementById('select-lean-mode'); @@ -244,7 +238,18 @@ function activeProviderIsCompass() { const config = providersData?.[activeProviderId]; return !!activeProviderId && (providerDefinitionId(activeProviderId) === 'webbrain_cloud' || config?.providerName === 'webbrain-cloud'); } +// The Strict Secret Mode switch is on settings.html and the decision card on +// providers.html, so the card follows the stored setting, not the switch. +let strictSecretModeOn = false; +if (globalThis.browser?.storage?.onChanged) { + browser.storage.onChanged.addListener((changes, area) => { + if (area !== 'local' || !changes.strictSecretMode) return; + strictSecretModeOn = changes.strictSecretMode.newValue === true; + syncDecisionStatus(); + }); +} function syncDecisionStatus() { + if (!decisionModeInputs.length) return; const mode = selectedDecisionMode(); for (const description of document.querySelectorAll('[data-decision-mode-desc]')) description.hidden = description.dataset.decisionModeDesc !== mode; const configured = document.getElementById('decision-configured'); @@ -257,7 +262,7 @@ function syncDecisionStatus() { status.hidden = mode !== 'auto'; if (mode !== 'auto') return; // Strict Secret Mode keeps page content away from every decision model, so Auto has nothing to use. - const strict = strictSecretToggle?.checked === true; + const strict = strictSecretModeOn; const compass = !strict && activeProviderIsCompass(); const key = strict ? 'st.decision.status.strict' : compass ? 'st.decision.status.compass' : 'st.decision.status.none_firefox'; status.dataset.i18n = key; @@ -291,14 +296,7 @@ const systemOneBrowserToggle = document.getElementById('toggle-system-one-browse const btnTestSystemOne = document.getElementById('btn-test-system-one'); const btnClearSystemOne = document.getElementById('btn-clear-system-one'); const systemOneTestResult = document.getElementById('test-system-one'); -const languageSelect = document.getElementById('select-language'); const themeSelect = document.getElementById('select-theme'); -const settingsUiScaleDecrease = document.getElementById('settings-ui-scale-decrease'); -const settingsUiScaleValue = document.getElementById('settings-ui-scale-value'); -const settingsUiScaleIncrease = document.getElementById('settings-ui-scale-increase'); -const settingsUiScaleReset = document.getElementById('settings-ui-scale-reset'); -const settingsUiScaleShortcuts = document.getElementById('settings-ui-scale-shortcuts'); -const settingsUiScaleManageShortcuts = document.getElementById('settings-ui-scale-manage-shortcuts'); const downloadDirectoryInput = document.getElementById('input-download-directory'); const subtitleEl = document.getElementById('subtitle'); @@ -306,99 +304,36 @@ const subtitleEl = document.getElementById('subtitle'); // Loaded from browser.storage.local (canonical) with a localStorage mirror // kept in sync by theme.js — so the FOUC bootstrap in always has the // latest mode on next page open. watch() keeps every open extension page -// (this settings tab + the side panel) in sync if any one of them flips it. +// (the settings pages + the side panel) in sync if any one of them flips it. +// Only settings.html has the picker; the other pages still follow changes. let currentThemeMode = 'system'; -if (themeSelect) { - loadMode().then((mode) => { - currentThemeMode = mode; - themeSelect.value = mode; - applyMode(mode, { syncStorage: false }); // already loaded, just paint - }); - themeSelect.addEventListener('change', async () => { - const mode = THEME_MODES.includes(themeSelect.value) ? themeSelect.value : 'system'; - currentThemeMode = mode; - await applyMode(mode); - }); - watch(() => currentThemeMode); - // If another Settings tab or the side panel flips the theme, watch() - // already re-paints this page — but the closure variable and the select - // value won't update on their own. Without this, the picker drifts out - // of sync and a later OS-theme flip can re-apply the stale 'system'. - if (globalThis.browser?.storage?.onChanged) { - browser.storage.onChanged.addListener((changes, area) => { - if (area !== 'local' || !changes.themeMode) return; - const next = changes.themeMode.newValue; - if (!THEME_MODES.includes(next)) return; - currentThemeMode = next; - if (themeSelect.value !== next) themeSelect.value = next; - }); - } -} - -let currentSettingsUiScale = 100; -let settingsUiScaleReady = false; - -function renderSettingsUiScale(value) { - currentSettingsUiScale = normalizeUiScale(value); - settingsUiScaleReady = true; - if (settingsUiScaleValue) settingsUiScaleValue.textContent = `${currentSettingsUiScale}%`; - if (settingsUiScaleDecrease) settingsUiScaleDecrease.disabled = currentSettingsUiScale === UI_SCALE_LEVELS[0]; - if (settingsUiScaleIncrease) settingsUiScaleIncrease.disabled = currentSettingsUiScale === UI_SCALE_LEVELS[UI_SCALE_LEVELS.length - 1]; -} - -// Serialized so each step reads the scale rendered by the step before it: -// holding Enter on a focused +/- button repeats faster than the storage write -// resolves, and an unqueued step would keep re-reading the same stale scale. -let settingsUiScaleWriteQueue = Promise.resolve(); - -function changeSettingsUiScale(action) { - if (!settingsUiScaleReady) return Promise.resolve(); - const write = settingsUiScaleWriteQueue.then(async () => { - const next = nextUiScale(currentSettingsUiScale, action); - await saveUiScale(browser.storage.local, next); - renderSettingsUiScale(next); - }); - // Keep the chain alive after a rejected write while still handing the - // failure to this caller. - settingsUiScaleWriteQueue = write.catch(() => {}); - return write; -} - -loadUiScale(browser.storage.local).then(renderSettingsUiScale); -if (settingsUiScaleDecrease) settingsUiScaleDecrease.disabled = true; -if (settingsUiScaleIncrease) settingsUiScaleIncrease.disabled = true; -settingsUiScaleDecrease?.addEventListener('click', () => changeSettingsUiScale('decrease').catch(() => {})); -settingsUiScaleIncrease?.addEventListener('click', () => changeSettingsUiScale('increase').catch(() => {})); -settingsUiScaleReset?.addEventListener('click', () => changeSettingsUiScale('reset').catch(() => {})); -browser.storage.onChanged.addListener((changes, area) => { - if (area === 'local' && changes[UI_SCALE_STORAGE_KEY]) { - renderSettingsUiScale(changes[UI_SCALE_STORAGE_KEY].newValue); - } +loadMode().then((mode) => { + currentThemeMode = mode; + if (themeSelect) themeSelect.value = mode; + applyMode(mode, { syncStorage: false }); // already loaded, just paint }); - -const UI_SCALE_COMMAND_NAMES = ['decrease-ui-scale', 'increase-ui-scale', 'reset-ui-scale']; - -async function refreshUiScaleShortcuts() { - if (!settingsUiScaleShortcuts) return; - const commands = await browser.commands.getAll(); - const shortcuts = UI_SCALE_COMMAND_NAMES.map((name) => commands.find((command) => command.name === name)?.shortcut) - .filter(Boolean); - const summary = shortcuts.length ? shortcuts.join(' · ') : t('st.display.ui_scale.shortcuts_none'); - settingsUiScaleShortcuts.textContent = t('st.display.ui_scale.shortcuts', { shortcuts: summary }); -} - -refreshUiScaleShortcuts().catch(() => {}); -window.addEventListener('focus', () => refreshUiScaleShortcuts().catch(() => {})); -settingsUiScaleManageShortcuts?.addEventListener('click', async () => { - if (browser.commands.openShortcutSettings) { - await browser.commands.openShortcutSettings(); - } else { - await browser.tabs.create({ url: 'about:addons' }); - } +themeSelect?.addEventListener('change', async () => { + const mode = THEME_MODES.includes(themeSelect.value) ? themeSelect.value : 'system'; + currentThemeMode = mode; + await applyMode(mode); }); +watch(() => currentThemeMode); +// If another Settings tab or the side panel flips the theme, watch() +// already re-paints this page — but the closure variable and the select +// value won't update on their own. Without this, the picker drifts out +// of sync and a later OS-theme flip can re-apply the stale 'system'. +if (globalThis.browser?.storage?.onChanged) { + browser.storage.onChanged.addListener((changes, area) => { + if (area !== 'local' || !changes.themeMode) return; + const next = changes.themeMode.newValue; + if (!THEME_MODES.includes(next)) return; + currentThemeMode = next; + if (themeSelect && themeSelect.value !== next) themeSelect.value = next; + }); +} function renderSubtitle() { - if (subtitleEl) subtitleEl.textContent = t('st.subtitle', { version: EXT_VERSION }); + if (subtitleEl) subtitleEl.textContent = t(subtitleEl.dataset.subtitleKey || 'st.subtitle', { version: EXT_VERSION }); } renderSubtitle(); @@ -428,69 +363,52 @@ function searchTextForGeneralItem(item) { return normalizeGeneralSearchText(`${item.textContent || ''} ${keyedText}`); } +// The search hides rows with a class of its own and leaves the hidden +// attribute to the code that owns each row, so clearing a search cannot bring +// back a card that is hidden for another reason (a managed CAPTCHA card, say). function setGeneralSearchHidden(item, hidden) { - item.hidden = hidden; item.classList.toggle('general-search-hidden', hidden); } +// The search box covers the tabs marked data-search (General, Budgets, +// CAPTCHA and Advanced). With a query, those tabs show together and keep only +// their matching rows; settings-tabs.js clears the query when a tab is picked. +const searchPanels = Array.from(document.querySelectorAll('.tab-panel[data-search]')); + function filterGeneralSettings() { - if (!displaySettings || !generalSearchInput) return; + if (!generalSearchInput || !searchPanels.length) return; const query = normalizeGeneralSearchText(generalSearchInput.value); - const visibleItems = Array.from(displaySettings.children) - .filter((el) => el.classList?.contains('setting-row')); - const advancedBody = advancedSettings?.querySelector('.advanced-settings-body'); - const advancedItems = advancedBody - ? Array.from(advancedBody.children).filter((el) => el.classList?.contains('setting-row') || el.classList?.contains('provider-card')) - : []; - - let visibleMatches = 0; - let advancedMatches = 0; - visibleItems.forEach((item) => { - const matches = !query || searchTextForGeneralItem(item).includes(query); - setGeneralSearchHidden(item, !!query && !matches); - if (matches) visibleMatches += 1; - }); - advancedItems.forEach((item) => { - const matches = !query || searchTextForGeneralItem(item).includes(query); - setGeneralSearchHidden(item, !!query && !matches); - if (matches) advancedMatches += 1; - }); - - if (advancedSettings) { - setGeneralSearchHidden(advancedSettings, !!query && advancedMatches === 0); - if (query && advancedMatches > 0) advancedSettings.open = true; + document.body.classList.toggle('settings-searching', !!query); + let totalMatches = 0; + for (const panel of searchPanels) { + const scope = panel.querySelector('[data-search-scope]') || panel; + let panelMatches = 0; + for (const item of Array.from(scope.children)) { + const matches = !query || (!item.hidden && searchTextForGeneralItem(item).includes(query)); + setGeneralSearchHidden(item, !!query && !matches); + if (matches) panelMatches += 1; + } + setGeneralSearchHidden(panel, !!query && panelMatches === 0); + totalMatches += panelMatches; } if (generalSearchEmpty) { - generalSearchEmpty.hidden = !query || (visibleMatches + advancedMatches) > 0; + generalSearchEmpty.hidden = !query || totalMatches > 0; } } -if (generalSearchInput) { - generalSearchInput.addEventListener('input', filterGeneralSettings); -} +generalSearchInput?.addEventListener('input', filterGeneralSettings); -if (languageSelect) { - languageSelect.innerHTML = LANGUAGES.map((l) => ``).join(''); - languageSelect.value = getLocale(); - languageSelect.addEventListener('change', async () => { - await setLocale(languageSelect.value); - renderSubtitle(); - refreshUiScaleShortcuts().catch(() => {}); - filterGeneralSettings(); - renderProviders(); - }); - document.addEventListener('wb-locale-changed', () => { - languageSelect.value = getLocale(); - renderSubtitle(); - refreshUiScaleShortcuts().catch(() => {}); - filterGeneralSettings(); - if (providersContainer) renderProviders(); - renderSkills(); - renderPermissions(); - refreshProfileSyncState(); - refreshApocalypseModeStatus(); - }); -} +// The language is chosen in the side panel; i18n.js re-translates the static +// markup, and this re-renders what the script writes itself. +document.addEventListener('wb-locale-changed', () => { + renderSubtitle(); + filterGeneralSettings(); + renderProviders(); + renderSkills(); + renderPermissions(); + if (profileSyncStatus) refreshProfileSyncState(); + refreshApocalypseModeStatus(); +}); globalThis.addEventListener('focus', () => refreshApocalypseModeStatus()); let providersData = {}; @@ -657,24 +575,27 @@ async function init() { browser.storage.local.remove(['authToken', 'authEmail', 'authDefaultModel']).catch(() => {}); // Load display settings - const stored = await browser.storage.local.get([...DECISION_SETTINGS_KEYS, 'verboseMode', 'composerDeliveryMode', 'selectionShortcutEnabled', AUTO_GROUP_TABS_KEY, 'helpImproveWebBrain', 'screenshotFallback', 'maxAgentSteps', 'autoScreenshot', 'useSiteAdapters', 'researchEscalationEnabled', 'researchEscalationEngine', 'voiceInputEnabled', 'alwaysAllowApiMutations', 'apiMutationObserverEnabled', 'openaiAskStreamingEnabled', 'planBeforeActMode', 'planBeforeAct', 'planReviewMode', 'planReviewConfidenceThreshold', DOWNLOAD_DIRECTORY_STORAGE_KEY, 'notifySound', 'completionConfetti', 'completionFlashTab', 'tracingEnabled', 'feedbackDiagnosticsEnabled', 'losslessTrace', 'strictSecretMode', 'strictGuards', 'leanMode', 'agentAllowLocalNetwork', 'scheduledTasksEnabled', 'scheduledRequireConsequentialConfirmation', 'systemOneEnabled', 'systemOneWatchEnabled', 'systemOneCompletionEnabled', 'systemOneFastClassifications', 'systemOneFastBrowser', 'systemOneWatchThreshold', 'systemOneCompletionThreshold', 'typesafeApiKey', 'providerFilter', 'requestTimeoutMs', 'clarifyTimeoutSec', 'clarifyTimeoutSemanticsV2', 'clarifyTimeoutPolicy', 'costAllowanceSessionUsd', 'costAllowanceTotalUsd', 'meteredProviderCostSpentUsd', 'screenshotRedaction', 'imageDetail', 'maxScreenshotsPerTurn', 'maxImageDimension']); + const stored = await browser.storage.local.get([...DECISION_SETTINGS_KEYS, 'verboseMode', 'composerDeliveryMode', 'selectionShortcutEnabled', AUTO_GROUP_TABS_KEY, 'helpImproveWebBrain', 'screenshotFallback', 'maxAgentSteps', 'autoScreenshot', 'useSiteAdapters', 'researchEscalationEnabled', 'researchEscalationEngine', 'voiceInputEnabled', 'alwaysAllowApiMutations', 'apiMutationObserverEnabled', 'openaiAskStreamingEnabled', 'planBeforeActMode', 'planBeforeAct', 'planReviewMode', 'planReviewConfidenceThreshold', DOWNLOAD_DIRECTORY_STORAGE_KEY, 'notifySound', 'completionConfetti', 'completionFlashTab', 'tracingEnabled', 'feedbackDiagnosticsEnabled', 'strictSecretMode', 'strictGuards', 'leanMode', 'agentAllowLocalNetwork', 'scheduledTasksEnabled', 'scheduledRequireConsequentialConfirmation', 'systemOneEnabled', 'systemOneWatchEnabled', 'systemOneCompletionEnabled', 'systemOneFastClassifications', 'systemOneFastBrowser', 'systemOneWatchThreshold', 'systemOneCompletionThreshold', 'typesafeApiKey', 'providerFilter', 'requestTimeoutMs', 'clarifyTimeoutSec', 'clarifyTimeoutSemanticsV2', 'clarifyTimeoutPolicy', 'costAllowanceSessionUsd', 'costAllowanceTotalUsd', 'meteredProviderCostSpentUsd', 'screenshotRedaction', 'imageDetail', 'maxScreenshotsPerTurn', 'maxImageDimension']); if (typeof stored.providerFilter === 'string' && ['all','active','local','cloud','router'].includes(stored.providerFilter)) { providerFilter = stored.providerFilter; } - verboseToggle.checked = stored.verboseMode || false; + strictSecretModeOn = stored.strictSecretMode === true; + if (verboseToggle) verboseToggle.checked = stored.verboseMode || false; if (composerDeliveryModeSelect) { composerDeliveryModeSelect.value = stored.composerDeliveryMode === 'steer' ? 'steer' : 'queue'; } if (selectionShortcutToggle) selectionShortcutToggle.checked = stored.selectionShortcutEnabled !== false; if (autoGroupTabsToggle) autoGroupTabsToggle.checked = stored[AUTO_GROUP_TABS_KEY] !== false; if (helpImproveToggle) helpImproveToggle.checked = stored.helpImproveWebBrain !== false; // on by default - screenshotToggle.checked = stored.screenshotFallback ?? true; // on by default - if (isUnlimitedMaxAgentSteps(stored.maxAgentSteps)) { - maxStepsRange.value = MAX_AGENT_STEPS_UNLIMITED_SENTINEL; - stepsValueLabel.textContent = '∞'; - } else { - maxStepsRange.value = boundedMaxAgentSteps(stored.maxAgentSteps); - stepsValueLabel.textContent = maxStepsRange.value; + if (screenshotToggle) screenshotToggle.checked = stored.screenshotFallback ?? true; // on by default + if (maxStepsRange && stepsValueLabel) { + if (isUnlimitedMaxAgentSteps(stored.maxAgentSteps)) { + maxStepsRange.value = MAX_AGENT_STEPS_UNLIMITED_SENTINEL; + stepsValueLabel.textContent = '∞'; + } else { + maxStepsRange.value = boundedMaxAgentSteps(stored.maxAgentSteps); + stepsValueLabel.textContent = maxStepsRange.value; + } } // requestTimeoutMs is stored in milliseconds, displayed as seconds. if (requestTimeoutRange && requestTimeoutValueLabel) { @@ -708,7 +629,9 @@ async function init() { if (clarifyTimeoutPolicySelect) { clarifyTimeoutPolicySelect.value = stored.clarifyTimeoutPolicy === 'safe' ? 'safe' : 'finish'; } - if (autoScreenshotSelect) autoScreenshotSelect.value = stored.autoScreenshot || 'state_change'; + // On navigation (default) captures after the agent opens a page, not after + // every click or keystroke. + if (autoScreenshotSelect) autoScreenshotSelect.value = stored.autoScreenshot || 'navigation'; if (imageDetailSelect) imageDetailSelect.value = stored.imageDetail || 'auto'; if (maxScreenshotsSelect) maxScreenshotsSelect.value = String(stored.maxScreenshotsPerTurn != null ? stored.maxScreenshotsPerTurn : 0); if (maxImageDimensionSelect) maxImageDimensionSelect.value = String(stored.maxImageDimension || 1568); @@ -730,14 +653,9 @@ async function init() { if (notifySoundToggle) notifySoundToggle.checked = stored.notifySound ?? true; if (completionConfettiToggle) completionConfettiToggle.checked = stored.completionConfetti ?? true; if (completionFlashTabToggle) completionFlashTabToggle.checked = stored.completionFlashTab ?? true; + // One switch records traces with full request details, or neither. if (tracingToggle) tracingToggle.checked = stored.tracingEnabled === true; if (feedbackDiagnosticsToggle) feedbackDiagnosticsToggle.checked = stored.feedbackDiagnosticsEnabled !== false; - if (losslessTracingToggle) { - losslessTracingToggle.checked = stored.losslessTrace === true; - // Lossless recording only means something when tracing is on; mirror the - // disabled state so the disclosure reads honestly. - losslessTracingToggle.disabled = tracingToggle?.checked !== true; - } const sessionLimit = normalizeCostAmount(stored.costAllowanceSessionUsd); const totalLimit = normalizeCostAmount(stored.costAllowanceTotalUsd); const totalSpent = normalizeCostAmount(stored.meteredProviderCostSpentUsd, 0); @@ -752,37 +670,41 @@ async function init() { if (scheduledConfirmToggle) scheduledConfirmToggle.checked = stored.scheduledRequireConsequentialConfirmation !== false; // The On fields show the configuration On uses: a profile in On as it is // stored, any other with On's defaults. - const storedDecisionMode = resolveDecisionMode(stored); - setDecisionMode(storedDecisionMode); - const decisionConfig = resolveDecisionConfig(storedDecisionMode === 'on' ? stored : { ...stored, [DECISION_MODE_KEY]: 'on' }); - decisionProviderInput.value = previousDecisionProvider = decisionConfig.provider; - decisionModelInput.value = decisionConfig.model; - decisionEndpointInput.value = stored.decisionBaseUrl || 'http://127.0.0.1:8009'; - decisionVisionInput.value = stored.decisionVisionMode || 'auto'; - decisionVisionSupported = stored.decisionVisionSupported === true; - decisionThresholdInput.value = String(decisionConfig.threshold * 100); - await refreshD1Settings(); - decisionKeyDrafts.set('typesafe', stored.typesafeApiKey || ''); - decisionKeyDrafts.set('openrouter', stored.decisionApiKey || ''); - decisionKeyDrafts.set('local', stored.decisionLocalApiKey || ''); - document.getElementById('decision-endpoint-field').hidden = decisionConfig.provider !== 'local'; - decisionDoneToggle.checked = decisionConfig.features.done; - if (systemOneWatchToggle) systemOneWatchToggle.checked = decisionConfig.features.watch; - if (systemOneClassificationsToggle) systemOneClassificationsToggle.checked = decisionConfig.features.classifications; - if (systemOneBrowserToggle) systemOneBrowserToggle.checked = decisionConfig.features.browser; - if (systemOneCompletionToggle) systemOneCompletionToggle.checked = decisionConfig.features.completion; - if (systemOneApiKeyInput) systemOneApiKeyInput.value = decisionConfig.apiKey; - if (systemOneWatchThresholdRange) systemOneWatchThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneWatchThreshold) * 100); - if (systemOneCompletionThresholdRange) systemOneCompletionThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneCompletionThreshold) * 100); - syncDecisionStatus(); - updateSystemOneThresholdLabels(); + if (decisionProviderInput) { + const storedDecisionMode = resolveDecisionMode(stored); + setDecisionMode(storedDecisionMode); + const decisionConfig = resolveDecisionConfig(storedDecisionMode === 'on' ? stored : { ...stored, [DECISION_MODE_KEY]: 'on' }); + decisionProviderInput.value = previousDecisionProvider = decisionConfig.provider; + decisionModelInput.value = decisionConfig.model; + decisionEndpointInput.value = stored.decisionBaseUrl || 'http://127.0.0.1:8009'; + decisionVisionInput.value = stored.decisionVisionMode || 'auto'; + decisionVisionSupported = stored.decisionVisionSupported === true; + decisionThresholdInput.value = String(decisionConfig.threshold * 100); + await refreshD1Settings(); + decisionKeyDrafts.set('typesafe', stored.typesafeApiKey || ''); + decisionKeyDrafts.set('openrouter', stored.decisionApiKey || ''); + decisionKeyDrafts.set('local', stored.decisionLocalApiKey || ''); + document.getElementById('decision-endpoint-field').hidden = decisionConfig.provider !== 'local'; + decisionDoneToggle.checked = decisionConfig.features.done; + if (systemOneWatchToggle) systemOneWatchToggle.checked = decisionConfig.features.watch; + if (systemOneClassificationsToggle) systemOneClassificationsToggle.checked = decisionConfig.features.classifications; + if (systemOneBrowserToggle) systemOneBrowserToggle.checked = decisionConfig.features.browser; + if (systemOneCompletionToggle) systemOneCompletionToggle.checked = decisionConfig.features.completion; + if (systemOneApiKeyInput) systemOneApiKeyInput.value = decisionConfig.apiKey; + if (systemOneWatchThresholdRange) systemOneWatchThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneWatchThreshold) * 100); + if (systemOneCompletionThresholdRange) systemOneCompletionThresholdRange.value = String(normalizeSystemOneThreshold(stored.systemOneCompletionThreshold) * 100); + syncDecisionStatus(); + updateSystemOneThresholdLabels(); + } // Load vision model config - const visionStored = await browser.storage.local.get(['visionModel']); - const vision = visionStored.visionModel || {}; - visionBaseUrlInput.value = vision.baseUrl || ''; - visionApiKeyInput.value = vision.apiKey || ''; - visionModelInput.value = vision.model || ''; + if (visionBaseUrlInput) { + const visionStored = await browser.storage.local.get(['visionModel']); + const vision = visionStored.visionModel || {}; + visionBaseUrlInput.value = vision.baseUrl || ''; + visionApiKeyInput.value = vision.apiKey || ''; + visionModelInput.value = vision.model || ''; + } // Load transcription service config. Same shape as visionModel; used by // recorder/host.js → transcribe.js when transcribing recorded audio. @@ -816,11 +738,16 @@ async function init() { await initScreenshotRedactionToggle(); await refreshApocalypseModeStatus(); - // Load providers - const res = await sendToBackground('get_providers'); - providersData = res.providers; - activeProviderId = res.active; - renderProviders(); + // Load providers. The decision card's Auto status reads the active one too. + if (providersContainer || decisionModeInputs.length) { + const res = await sendToBackground('get_providers'); + providersData = res.providers; + activeProviderId = res.active; + renderProviders(); + syncDecisionStatus(); + } + // Tooling (UI tests, docs screenshots) waits for this before reading the page. + document.documentElement.dataset.settingsReady = 'true'; } // --- Site permissions (capability × origin grants) --- @@ -1338,7 +1265,7 @@ downloadDirectoryInput?.addEventListener('change', async () => { await browser.storage.local.set({ [DOWNLOAD_DIRECTORY_STORAGE_KEY]: directory }).catch(() => {}); }); -verboseToggle.addEventListener('change', async () => { +verboseToggle?.addEventListener('change', async () => { await browser.storage.local.set({ verboseMode: verboseToggle.checked }).catch(() => {}); }); @@ -1354,15 +1281,15 @@ helpImproveToggle?.addEventListener('change', async () => { await browser.storage.local.set({ helpImproveWebBrain: helpImproveToggle.checked }).catch(() => {}); }); -screenshotToggle.addEventListener('change', async () => { +screenshotToggle?.addEventListener('change', async () => { await browser.storage.local.set({ screenshotFallback: screenshotToggle.checked }).catch(() => {}); }); -maxStepsRange.addEventListener('input', () => { +maxStepsRange?.addEventListener('input', () => { stepsValueLabel.textContent = Number(maxStepsRange.value) === MAX_AGENT_STEPS_UNLIMITED_SENTINEL ? '∞' : maxStepsRange.value; }); -maxStepsRange.addEventListener('change', async () => { +maxStepsRange?.addEventListener('change', async () => { await browser.storage.local.set({ maxAgentSteps: Number(maxStepsRange.value) === MAX_AGENT_STEPS_UNLIMITED_SENTINEL ? 0 @@ -1503,19 +1430,11 @@ completionFlashTabToggle?.addEventListener('change', async () => { await browser.storage.local.set({ completionFlashTab: completionFlashTabToggle.checked }).catch(() => {}); }); +// Record traces is one switch for both trace tiers: on records every run with +// its full request details (losslessTrace), off records neither. tracingToggle?.addEventListener('change', async () => { - await browser.storage.local.set({ tracingEnabled: tracingToggle.checked }).catch(() => {}); - if (losslessTracingToggle) { - losslessTracingToggle.disabled = tracingToggle.checked !== true; - if (!tracingToggle.checked) { - losslessTracingToggle.checked = false; - await browser.storage.local.set({ losslessTrace: false }).catch(() => {}); - } - } -}); - -losslessTracingToggle?.addEventListener('change', async () => { - await browser.storage.local.set({ losslessTrace: losslessTracingToggle.checked }).catch(() => {}); + const enabled = tracingToggle.checked; + await browser.storage.local.set({ tracingEnabled: enabled, losslessTrace: enabled }).catch(() => {}); }); feedbackDiagnosticsToggle?.addEventListener('change', async () => { @@ -1740,7 +1659,7 @@ function flashVisionResult(className, text) { setTimeout(() => resultEl.classList.remove('show'), 2000); } -btnSaveVision.addEventListener('click', async () => { +btnSaveVision?.addEventListener('click', async () => { const baseUrl = normalizeOpenAICompatibleBaseUrl(visionBaseUrlInput.value); const apiKey = visionApiKeyInput.value.trim(); const model = visionModelInput.value.trim(); @@ -1758,7 +1677,7 @@ btnSaveVision.addEventListener('click', async () => { flashVisionResult('ok', t('st.vision.saved')); }); -btnTestVision.addEventListener('click', async () => { +btnTestVision?.addEventListener('click', async () => { const baseUrl = normalizeOpenAICompatibleBaseUrl(visionBaseUrlInput.value); const apiKey = visionApiKeyInput.value.trim(); const model = visionModelInput.value.trim(); @@ -1788,7 +1707,7 @@ btnTestVision.addEventListener('click', async () => { } }); -btnClearVision.addEventListener('click', async () => { +btnClearVision?.addEventListener('click', async () => { visionBaseUrlInput.value = ''; visionApiKeyInput.value = ''; visionModelInput.value = ''; @@ -2010,8 +1929,15 @@ function renderProfileSyncState(state) { if (profileSyncStatus) profileSyncStatus.textContent = describeProfileSyncState(state || {}); } async function refreshProfileSyncState() { const state = await sendToBackground('profile_sync_state').catch(e => ({ status: 'error', error: e.message })); renderProfileSyncState(state); return state; } -async function reloadProfileSyncData() { const stored = await browser.storage.local.get(['profileEnabled', 'profileText', 'visionModel', 'transcriptionModel', 'imageGenModel']); if (profileEnabledToggle) profileEnabledToggle.checked = !!stored.profileEnabled; if (profileTextArea) profileTextArea.value = stored.profileText || ''; const vision = stored.visionModel || {}; visionBaseUrlInput.value = vision.baseUrl || ''; visionApiKeyInput.value = vision.apiKey || ''; visionModelInput.value = vision.model || ''; const transcription = stored.transcriptionModel || {}; if (transcriptionBaseUrlInput) transcriptionBaseUrlInput.value = transcription.baseUrl || ''; if (transcriptionApiKeyInput) transcriptionApiKeyInput.value = transcription.apiKey || ''; if (transcriptionModelInput) transcriptionModelInput.value = transcription.model || ''; const imageGen = stored.imageGenModel || {}; if (imageGenApiKeyInput) imageGenApiKeyInput.value = imageGen.apiKey || ''; if (imageGenModelInput) imageGenModelInput.value = imageGen.model || ''; updateMultimodalDetectedProvider('vision'); updateMultimodalDetectedProvider('transcription'); await loadUserMemorySettings(); const res = await sendToBackground('get_providers'); providersData = res.providers; activeProviderId = res.active; renderProviders(); } +async function reloadProfileSyncData() { const stored = await browser.storage.local.get(['profileEnabled', 'profileText', 'visionModel', 'transcriptionModel', 'imageGenModel']); if (profileEnabledToggle) profileEnabledToggle.checked = !!stored.profileEnabled; if (profileTextArea) profileTextArea.value = stored.profileText || ''; const vision = stored.visionModel || {}; if (visionBaseUrlInput) { visionBaseUrlInput.value = vision.baseUrl || ''; visionApiKeyInput.value = vision.apiKey || ''; visionModelInput.value = vision.model || ''; } const transcription = stored.transcriptionModel || {}; if (transcriptionBaseUrlInput) transcriptionBaseUrlInput.value = transcription.baseUrl || ''; if (transcriptionApiKeyInput) transcriptionApiKeyInput.value = transcription.apiKey || ''; if (transcriptionModelInput) transcriptionModelInput.value = transcription.model || ''; const imageGen = stored.imageGenModel || {}; if (imageGenApiKeyInput) imageGenApiKeyInput.value = imageGen.apiKey || ''; if (imageGenModelInput) imageGenModelInput.value = imageGen.model || ''; updateMultimodalDetectedProvider('vision'); updateMultimodalDetectedProvider('transcription'); await loadUserMemorySettings(); if (!providersContainer) return; const res = await sendToBackground('get_providers'); providersData = res.providers; activeProviderId = res.active; renderProviders(); } async function requestProfileSyncDataConsent() { const permissions = await browser.permissions.getAll(); if (!Object.hasOwn(permissions, 'data_collection')) return window.confirm(t('st.sync.consent.legacy')); return browser.permissions.request({ data_collection: ['personallyIdentifyingInfo', 'authenticationInfo', 'personalCommunications', 'websiteContent', 'technicalAndInteraction'] }); } +// Profile sync runs from Settings, but what it pulls also fills the Providers +// page. Settings pages open in other tabs reload what they show, so a Save +// there cannot write stale values over the synced ones. +const settingsPagesChannel = typeof BroadcastChannel === 'function' ? new BroadcastChannel('webbrain-settings-pages') : null; +settingsPagesChannel?.addEventListener('message', (event) => { + if (event.data?.type === 'profile-sync-data-changed') reloadProfileSyncData().catch(() => {}); +}); function profileSyncButtonRestore(button, pendingLabel) { if (!button) return () => {}; const previousDisabled = button.disabled; @@ -2025,7 +1951,10 @@ async function profileSyncAction(action, data = {}, options = {}) { try { if (options.pending) showProfileSyncResult(true, options.pending); const result = await sendToBackground(action, data); - if (['profile_sync_unlock', 'profile_sync_now', 'profile_sync_reset'].includes(action)) await reloadProfileSyncData(); + if (['profile_sync_unlock', 'profile_sync_now', 'profile_sync_reset'].includes(action)) { + settingsPagesChannel?.postMessage({ type: 'profile-sync-data-changed' }); + await reloadProfileSyncData(); + } showProfileSyncResult(true, options.success || t('st.sync.result.updated')); await refreshProfileSyncState(); return result; @@ -2046,7 +1975,7 @@ btnProfileSyncLock?.addEventListener('click', () => profileSyncAction('profile_s btnProfileSyncChange?.addEventListener('click', async () => { const oldPassword = window.prompt(t('st.sync.prompt.current_password')); if (!oldPassword) return; let newPassword; try { newPassword = promptConfirmedSyncPassword(); } catch (e) { showProfileSyncResult(false, e.message); return; } if (newPassword) await profileSyncAction('profile_sync_change_password', { oldPassword, newPassword }).catch(() => {}); }); btnProfileSyncDisable?.addEventListener('click', () => { if (window.confirm(t('st.sync.confirm.disable'))) profileSyncAction('profile_sync_disable').catch(() => {}); }); btnProfileSyncReset?.addEventListener('click', async () => { if (!window.confirm(t('st.sync.confirm.reset'))) return; let password; try { password = promptConfirmedSyncPassword(t('st.sync.prompt.replacement_password')); } catch (e) { showProfileSyncResult(false, e.message); return; } if (password) await profileSyncAction('profile_sync_reset', { password }).catch(() => {}); }); -refreshProfileSyncState(); +if (profileSyncStatus) refreshProfileSyncState(); // Persisted to browser.storage.local in plaintext; the agent picks the // changes up via the storage.onChanged listener in background.js and @@ -2191,6 +2120,7 @@ function renderUserMemoryRecords(records = []) { } async function loadUserMemorySettings() { + if (!userMemoryList) return; const res = await sendToBackground('get_user_memory').catch((error) => ({ ok: false, error: error.message })); if (!res?.ok) { renderUserMemoryRecords([]); @@ -2841,6 +2771,7 @@ async function refreshWebbrainPaymentNotice() { } function renderProviders() { + if (!providersContainer) return; providersContainer.innerHTML = ''; syncDecisionStatus(); diff --git a/src/firefox/src/ui/sidepanel.js b/src/firefox/src/ui/sidepanel.js index 855c33ce1d..a1fa3f00a3 100644 --- a/src/firefox/src/ui/sidepanel.js +++ b/src/firefox/src/ui/sidepanel.js @@ -217,7 +217,7 @@ if (globalThis.browser?.storage?.onChanged) { function openProviderSettings() { try { - browser.tabs.create({ url: browser.runtime.getURL('src/ui/settings.html#providers') }); + browser.tabs.create({ url: browser.runtime.getURL('src/ui/providers.html#llm') }); } catch { browser.runtime.openOptionsPage(); } @@ -346,7 +346,7 @@ if (globalThis.browser?.storage?.onChanged) { if (!providerStatus) return; providerStatus.textContent = ''; const changeLink = document.createElement('a'); - changeLink.href = browser.runtime.getURL('src/ui/settings.html#providers'); + changeLink.href = browser.runtime.getURL('src/ui/providers.html#llm'); changeLink.target = '_blank'; changeLink.rel = 'noopener noreferrer'; changeLink.textContent = t('ob.cloud.change'); @@ -1981,7 +1981,7 @@ browser.storage.onChanged.addListener((changes) => { }); -// Composer switch for the same storage-backed gate as Settings → Permissions and +// Composer switch for the same storage-backed gate as the permissions page and // /dangerously-skip-permissions. Turning prompts off posts the command's // persistent notice. A permission card already waiting is left for the user to // answer: a display switch must never approve a pending action on its own. @@ -2215,7 +2215,7 @@ function closePermissionGatePopover() { } async function openPermissionsSettingsPage() { - const url = browser.runtime.getURL('src/ui/settings.html#permissions'); + const url = browser.runtime.getURL('src/ui/permissions.html'); try { await browser.tabs.create({ url }); } catch { @@ -8483,7 +8483,7 @@ async function loadProviders() { } async function openProvidersSettingsPage() { - const url = browser.runtime.getURL('src/ui/settings.html#providers'); + const url = browser.runtime.getURL('src/ui/providers.html#llm'); try { await browser.tabs.create({ url }); } catch { @@ -12754,7 +12754,7 @@ function parseCostAllowanceError(content) { return { scope: match[1].toLowerCase() === 'this session' ? 'session' : 'total', limitUsd, - message: content.replace(/\s*Increase or reset the allowance in Settings\.\s*$/i, '').trim(), + message: content.replace(/\s*Increase or reset the allowance in Settings(?: → Budgets)?\.\s*$/i, '').trim(), }; } diff --git a/test/README.md b/test/README.md index 8922e3d5d4..6d11fb73e8 100644 --- a/test/README.md +++ b/test/README.md @@ -120,7 +120,7 @@ workflow itself. ### First run -No providers are configured yet. The runner opens the Settings page; add a provider + API key there, close the browser, re-run. Or run `npm run test:anonymous -- --setup` just to open Settings without trying to execute. +No providers are configured yet. The runner opens the Providers page; add a provider + API key there, close the browser, re-run. Or run `npm run test:anonymous -- --setup` just to open the Providers page without trying to execute. ### Scenarios @@ -136,7 +136,7 @@ Only anonymous/public sites here. Signed-in scenarios (Gmail, GitHub issue filin ```bash npm run test:anonymous # all scenarios npm run test:anonymous -- --scenario=arxiv-attention-title # just one -npm run test:anonymous -- --setup # open settings only +npm run test:anonymous -- --setup # open the Providers page only ``` Headed by default so you can watch runs and intervene. Budget ≈ 10–30 seconds per scenario + LLM tokens per the configured provider. diff --git a/test/anonymous/run.mjs b/test/anonymous/run.mjs index a10096452a..67a861f2dd 100644 --- a/test/anonymous/run.mjs +++ b/test/anonymous/run.mjs @@ -73,8 +73,8 @@ async function main() { }); if (!providerCheck.ok) { console.log(`\n No active provider configured (${providerCheck.reason}).`); - console.log(` Opening Settings — enable a provider, set it active, then close the browser and re-run.`); - await context.newPage().then(p => p.goto(`chrome-extension://${extensionId}/src/ui/settings.html`)); + console.log(` Opening Providers — enable a provider, set it active, then close the browser and re-run.`); + await context.newPage().then(p => p.goto(`chrome-extension://${extensionId}/src/ui/providers.html`)); if (interactiveSetup) { console.log(' Waiting for the browser to close...'); await context.waitForEvent('close', { timeout: 0 }); diff --git a/test/captcha-settings-ui.mjs b/test/captcha-settings-ui.mjs index 62171df7f0..f02d7f5f0a 100644 --- a/test/captcha-settings-ui.mjs +++ b/test/captcha-settings-ui.mjs @@ -48,10 +48,11 @@ try { }, { build, lang }); const openSettings = async () => { - await page.goto(`${origin}/src/${build}/src/ui/settings.html#display`); + // The solvers have their own tab in Settings. + await page.goto(`${origin}/src/${build}/src/ui/settings.html#captcha`); await page.reload(); - await page.waitForFunction(() => testRequests.some(r => r.action === 'get_providers')); - await page.locator('details.advanced-settings').first().locator(':scope > summary').click(); + await page.waitForFunction(() => document.documentElement.dataset.settingsReady === 'true'); + assert.equal(await page.locator('.tab-btn.active').getAttribute('data-tab'), 'captcha'); }; await openSettings(); const card = page.locator('#captcha-card'); @@ -142,8 +143,23 @@ try { assert.equal(await page.evaluate(name => testStore[name], enabledName), true); } await page.evaluate(() => chrome.storage.local.set({ webbrainCloudManaged: true })); - await openSettings(); + // A managed browser has no keys to set: its CAPTCHA tab steps aside, and + // neither a search nor a language change brings the card back. + await page.goto(`${origin}/src/${build}/src/ui/settings.html#captcha`); + await page.reload(); + await page.waitForFunction(() => document.documentElement.dataset.settingsReady === 'true'); + assert.equal(await page.locator('.tab-btn.active').getAttribute('data-tab'), 'display', 'a managed CAPTCHA deep link lands on General'); + assert.equal(await page.locator('.tab-btn[data-tab="captcha"]').isVisible(), false, 'managed settings hide the CAPTCHA tab'); assert.equal(await card.isVisible(), false, 'managed settings keep broker-only UI'); + await page.locator('#input-general-search').fill('CapSolver'); + assert.equal(await page.locator('[data-panel="captcha"]').isVisible(), false, 'search leaves the managed CAPTCHA card out'); + assert.equal(await page.locator('#general-search-empty').isVisible(), true, 'nothing else matches the solver name'); + await page.locator('#input-general-search').fill(''); + const otherLang = lang === 'en' ? 'de' : 'en'; + await page.evaluate(code => chrome.storage.local.set({ wbLocale: code }), otherLang); + await page.waitForFunction(code => document.documentElement.lang === code, otherLang); + assert.equal(await card.evaluate(el => el.hidden), true, 'a cleared search or a language change keeps the managed card hidden'); + assert.equal(await page.locator('.tab-btn[data-tab="captcha"]').isVisible(), false); assert.deepEqual(errors, []); await page.close(); console.log(`PASS ${build} ${lang} ${width}: settings, validation, independent consent, persistence, balance, and managed mode`); diff --git a/test/clarify-timeout-policy.mjs b/test/clarify-timeout-policy.mjs index 7c300dda96..bee92ff780 100644 --- a/test/clarify-timeout-policy.mjs +++ b/test/clarify-timeout-policy.mjs @@ -1,4 +1,4 @@ -// Settings → General → "When a question times out": 'finish' (default) keeps +// Settings → Budgets → "When a question times out": 'finish' (default) keeps // an unattended run moving, 'safe' takes the safe first option. Questions // about the short list of consequential actions always take the safe answer, // and so does a question the model did not classify as consequence 'none'. @@ -298,7 +298,7 @@ for (const { build, Agent, policy, Capability } of builds) { const api = build === 'chrome' ? 'chrome' : 'browser'; assert.match(settingsHtml, /