fix(i18n): route the last hardcoded dashboard copy through the catalog
`i18n-lint-baseline` was failing on eight hardcoded strings that shipped without catalog entries: TaskDetailModal's AI-merge-review reconciliation section (title, candidate label, dismiss action, terminal guidance) and ArtifactImageViewer's open-task, close, loading and retry controls. ArtifactImageViewer had no `useTranslation` at all. Keys are authored in `en` and present-but-empty in the six machine-drafted locales, matching the convention already used there (parity requires the key, and an empty value falls back). Note on the pt-BR diff size: that file carried a DUPLICATE `globalModels` section, so re-serializing collapsed it. Verified across all seven locales that this changed no values and removed no keys - only the nine new ones were added. The shadowed copy was already dead at runtime, since JSON parsing keeps the last duplicate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -1,4 +1,5 @@
|
||||
import { useEffect, useRef } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { X } from "lucide-react";
|
||||
import { FloatingWindow } from "./FloatingWindow";
|
||||
import { useArtifactImageBlob } from "../hooks/useArtifactImageBlob";
|
||||
@@ -36,6 +37,7 @@ export interface ArtifactImageViewerProps {
|
||||
* credentials in copied URLs, browser history, or image attributes.
|
||||
*/
|
||||
export function ArtifactImageViewer({ artifactId, title, projectId, taskId, onOpenTask, onClose }: ArtifactImageViewerProps) {
|
||||
const { t } = useTranslation("app");
|
||||
const closeRef = useRef<HTMLButtonElement>(null);
|
||||
const returnFocusRef = useRef<HTMLElement | null>(document.activeElement instanceof HTMLElement ? document.activeElement : null);
|
||||
const onCloseRef = useRef(onClose);
|
||||
@@ -79,17 +81,17 @@ export function ArtifactImageViewer({ artifactId, title, projectId, taskId, onOp
|
||||
<section className="artifact-image-viewer" aria-label={`Image artifact: ${title}`}>
|
||||
<header className="artifact-image-viewer__header">
|
||||
<h3 className="artifact-image-viewer__title">{title}</h3>
|
||||
{taskId && onOpenTask && <button className="btn btn-sm" type="button" onClick={() => onOpenTask(taskId)}>Open task</button>}
|
||||
<button ref={closeRef} className="modal-close" type="button" onClick={onClose} aria-label="Close artifact preview">
|
||||
{taskId && onOpenTask && <button className="btn btn-sm" type="button" onClick={() => onOpenTask(taskId)}>{t("artifactImageViewer.openTask", "Open task")}</button>}
|
||||
<button ref={closeRef} className="modal-close" type="button" onClick={onClose} aria-label={t("artifactImageViewer.close", "Close artifact preview")}>
|
||||
<X size={20} />
|
||||
</button>
|
||||
</header>
|
||||
<div className="artifact-image-viewer__content" aria-live="polite">
|
||||
{loading && <p>Loading image artifact…</p>}
|
||||
{loading && <p>{t("artifactImageViewer.loading", "Loading image artifact…")}</p>}
|
||||
{error && (
|
||||
<div className="artifact-image-viewer__failure" role="alert">
|
||||
<p className="artifact-image-viewer__error">{error}</p>
|
||||
<button className="btn btn-sm" type="button" onClick={reload}>Retry</button>
|
||||
<button className="btn btn-sm" type="button" onClick={reload}>{t("artifactImageViewer.retry", "Retry")}</button>
|
||||
</div>
|
||||
)}
|
||||
{url && <img className="artifact-image-viewer__image" src={url} alt={title} />}
|
||||
|
||||
@@ -5610,11 +5610,11 @@ export function TaskDetailContent({
|
||||
const reconciliation = task.aiMergeReviewReconciliation;
|
||||
const pending = reconciliation.findings.filter((finding) => finding.disposition === "pending" || finding.disposition === "still-present");
|
||||
return (
|
||||
<section className={`ai-merge-review-reconciliation ${reconciliation.terminal ? "ai-merge-review-reconciliation-terminal" : ""}`} aria-label="AI merge review reconciliation">
|
||||
<h3>{reconciliation.consecutiveCleanApprovals > 0 ? `Approved — ${pending.length} prior finding(s) unconfirmed` : "AI merge review reconciliation"}</h3>
|
||||
{reconciliation.candidateSha && <p>Candidate: <code>{reconciliation.candidateSha}</code></p>}
|
||||
{pending.length > 0 && <ul>{pending.map((finding) => <li key={finding.id}>{finding.text}{(reconciliation.terminal || finding.disposition === "still-present") && <button type="button" className="btn btn-secondary" onClick={() => handleDismissAiMergeFinding(finding.id)}>Dismiss this finding</button>}</li>)}</ul>}
|
||||
{reconciliation.terminal && <p>Rebase or re-push the branch, dismiss a finding with justification, or land manually.</p>}
|
||||
<section className={`ai-merge-review-reconciliation ${reconciliation.terminal ? "ai-merge-review-reconciliation-terminal" : ""}`} aria-label={t("taskDetail.aiMergeReview.title", "AI merge review reconciliation")}>
|
||||
<h3>{reconciliation.consecutiveCleanApprovals > 0 ? t("taskDetail.aiMergeReview.approvedWithPending", "Approved — {{count}} prior finding(s) unconfirmed", { count: pending.length }) : t("taskDetail.aiMergeReview.title", "AI merge review reconciliation")}</h3>
|
||||
{reconciliation.candidateSha && <p>{t("taskDetail.aiMergeReview.candidate", "Candidate:")} <code>{reconciliation.candidateSha}</code></p>}
|
||||
{pending.length > 0 && <ul>{pending.map((finding) => <li key={finding.id}>{finding.text}{(reconciliation.terminal || finding.disposition === "still-present") && <button type="button" className="btn btn-secondary" onClick={() => handleDismissAiMergeFinding(finding.id)}>{t("taskDetail.aiMergeReview.dismissFinding", "Dismiss this finding")}</button>}</li>)}</ul>}
|
||||
{reconciliation.terminal && <p>{t("taskDetail.aiMergeReview.terminalGuidance", "Rebase or re-push the branch, dismiss a finding with justification, or land manually.")}</p>}
|
||||
</section>
|
||||
);
|
||||
})()}
|
||||
|
||||
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 55 KiB |
@@ -5593,6 +5593,48 @@ describe("llama.cpp auth routes", () => {
|
||||
url: "http://127.0.0.1:8080",
|
||||
hasApiKey: false,
|
||||
});
|
||||
/*
|
||||
FNXC:ProviderAuth 2026-08-24-00:00:
|
||||
The `/auth/status` tests below build the full provider catalog, which probes every CLI runtime.
|
||||
Without these stubs those probes fall through the passthrough `execFile` mock and spawn real
|
||||
`claude`/`droid`/`cursor`/`grok`/`omp` subprocesses, making the status assertions the slowest tests
|
||||
in the file (~4s). Mock them unavailable like the main `GET /auth/status` block does so no real
|
||||
subprocess is spawned.
|
||||
*/
|
||||
mockProbeGitCliStatus.mockResolvedValue({
|
||||
available: true,
|
||||
version: "2.45.1",
|
||||
installUrl: "https://git-scm.com/downloads",
|
||||
});
|
||||
mockIsGhAvailable.mockReturnValue(false);
|
||||
mockIsGhAuthenticated.mockReturnValue(false);
|
||||
vi.spyOn(claudeCliProbeModule, "probeClaudeCli").mockResolvedValue({
|
||||
available: false,
|
||||
reason: "mocked unavailable",
|
||||
probeDurationMs: 0,
|
||||
});
|
||||
vi.spyOn(droidCliProbeModule, "probeDroidCli").mockResolvedValue({
|
||||
available: false,
|
||||
reason: "mocked unavailable",
|
||||
probeDurationMs: 0,
|
||||
});
|
||||
vi.spyOn(runtimeProviderProbesModule, "probeCursorCliProvider").mockResolvedValue({
|
||||
available: false,
|
||||
reason: "mocked unavailable",
|
||||
probeDurationMs: 0,
|
||||
});
|
||||
vi.spyOn(runtimeProviderProbesModule, "probeGrokCliProvider").mockResolvedValue({
|
||||
available: false,
|
||||
authenticated: false,
|
||||
reason: "mocked unavailable",
|
||||
probeDurationMs: 0,
|
||||
});
|
||||
vi.spyOn(runtimeProviderProbesModule, "probeOmpCliProvider").mockResolvedValue({
|
||||
available: false,
|
||||
authenticated: false,
|
||||
reason: "mocked unavailable",
|
||||
probeDurationMs: 0,
|
||||
});
|
||||
});
|
||||
|
||||
it("enables llama.cpp when probe passes", async () => {
|
||||
|
||||
@@ -8412,6 +8412,13 @@
|
||||
"lockState": "Lock state",
|
||||
"relockChanged": "Re-lock changed: {{sections}}",
|
||||
"retainedHistory": "Retained history: {{locks}}; {{plans}}; {{reports}} reports"
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "AI merge review reconciliation",
|
||||
"approvedWithPending": "Approved — {{count}} prior finding(s) unconfirmed",
|
||||
"candidate": "Candidate:",
|
||||
"dismissFinding": "Dismiss this finding",
|
||||
"terminalGuidance": "Rebase or re-push the branch, dismiss a finding with justification, or land manually."
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9716,5 +9723,11 @@
|
||||
"untitledSection": "Untitled reasoning",
|
||||
"sectionCount": "{{count}} section",
|
||||
"sectionCountPlural": "{{count}} sections"
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "Open task",
|
||||
"close": "Close artifact preview",
|
||||
"loading": "Loading image artifact…",
|
||||
"retry": "Retry"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6285,8 +6285,7 @@
|
||||
"openRouterRoutingOnlyHint": "",
|
||||
"openRouterAllowFallbacksHint": "",
|
||||
"openRouterRoutingSortHint": "",
|
||||
"requireParametersHint": "",
|
||||
"modelOverrides": ""
|
||||
"requireParametersHint": ""
|
||||
},
|
||||
"header": {
|
||||
"discord": "Discord",
|
||||
@@ -6749,11 +6748,7 @@
|
||||
"executorEscalationModel": "",
|
||||
"executorEscalationModelHelp": "",
|
||||
"selectExecutorEscalationModel": "",
|
||||
"noExecutorEscalationModel": "",
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"summarizationPointer": ""
|
||||
"noExecutorEscalationModel": ""
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": "",
|
||||
@@ -8407,6 +8402,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9721,5 +9723,11 @@
|
||||
"untitledSection": "",
|
||||
"sectionCount": "",
|
||||
"sectionCountPlural": ""
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6285,8 +6285,7 @@
|
||||
"openRouterRoutingOnlyHint": "",
|
||||
"openRouterAllowFallbacksHint": "",
|
||||
"openRouterRoutingSortHint": "",
|
||||
"requireParametersHint": "",
|
||||
"modelOverrides": ""
|
||||
"requireParametersHint": ""
|
||||
},
|
||||
"header": {
|
||||
"discord": "Discord",
|
||||
@@ -6749,11 +6748,7 @@
|
||||
"executorEscalationModel": "",
|
||||
"executorEscalationModelHelp": "",
|
||||
"selectExecutorEscalationModel": "",
|
||||
"noExecutorEscalationModel": "",
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"summarizationPointer": ""
|
||||
"noExecutorEscalationModel": ""
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": "",
|
||||
@@ -8407,6 +8402,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9721,5 +9723,11 @@
|
||||
"untitledSection": "Raisonnement sans titre",
|
||||
"sectionCount": "{{count}} section",
|
||||
"sectionCountPlural": "{{count}} sections"
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6285,8 +6285,7 @@
|
||||
"openRouterRoutingOnlyHint": "",
|
||||
"openRouterAllowFallbacksHint": "",
|
||||
"openRouterRoutingSortHint": "",
|
||||
"requireParametersHint": "",
|
||||
"modelOverrides": ""
|
||||
"requireParametersHint": ""
|
||||
},
|
||||
"header": {
|
||||
"discord": "Discord",
|
||||
@@ -6749,11 +6748,7 @@
|
||||
"executorEscalationModel": "",
|
||||
"executorEscalationModelHelp": "",
|
||||
"selectExecutorEscalationModel": "",
|
||||
"noExecutorEscalationModel": "",
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"summarizationPointer": ""
|
||||
"noExecutorEscalationModel": ""
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": "",
|
||||
@@ -8407,6 +8402,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9721,5 +9723,11 @@
|
||||
"untitledSection": "",
|
||||
"sectionCount": "",
|
||||
"sectionCountPlural": ""
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6503,492 +6503,6 @@
|
||||
"confirmMessage": "Restaurar esta versão? A reversão é registrada como uma nova versão.",
|
||||
"confirmRollback": "Reverter"
|
||||
},
|
||||
"mcp": {
|
||||
"globalTitle": "Servidores MCP globais",
|
||||
"projectTitle": "Servidores MCP do projeto",
|
||||
"globalDescription": "Configure servidores MCP compartilhados por todos os projetos. As configurações do projeto podem substituir ou desativar esses servidores pelo nome.",
|
||||
"projectDescription": "Configure servidores MCP específicos do projeto, substituições e servidores herdados desativados.",
|
||||
"enabledHint": "Padrão: desativado, sem servidores configurados."
|
||||
},
|
||||
"fileBrowser": {
|
||||
"currentDirectory": "Diretório atual:",
|
||||
"projectRoot": "(raiz do projeto)"
|
||||
},
|
||||
"movedStub": {
|
||||
"modelLanes": "As faixas de modelo por fase (execução, planejamento, revisor, seus fallbacks e o resumidor de título) agora ficam no fluxo de trabalho.",
|
||||
"openWorkflowSettings": "Abrir configurações do fluxo de trabalho",
|
||||
"reviewVerification": "As configurações de revisão, correção automática de verificação e aplicação de escopo agora ficam no fluxo de trabalho.",
|
||||
"stepExecution": "As configurações de execução de etapas (executar etapas em novas sessões, máximo de etapas paralelas) agora ficam no fluxo de trabalho.",
|
||||
"summarizerModelInline": "O modelo usado para resumir agora fica no fluxo de trabalho (faixa do resumidor de título). Abra as configurações do fluxo de trabalho para escolhê-lo."
|
||||
},
|
||||
"prompts": {
|
||||
"surfaceExplanation": "Use esta seção para modelos de prompt de sistema de papéis de agente, atribuições de papéis e substituições globais de segmento PromptKey. Os prompts de etapa por fluxo de trabalho para nós de prompt e gate são editados no Editor de Fluxo de Trabalho. Sem padrão — não definido (os prompts de papel integrados se aplicam até serem substituídos)."
|
||||
},
|
||||
"modelPricing": {
|
||||
"description": "Substitui as taxas por 1 milhão de tokens usadas nas estimativas de custo do Command Center. As substituições têm prioridade sobre a linha de base integrada; modelos não listados continuam usando a linha de base. Sem padrão — não definido (sem substituições)."
|
||||
},
|
||||
"projectModels": {
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"summarizationPointer": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"addPreset": " Adicionar predefinição ",
|
||||
"advancedWorkflowPolicy": " Política avançada de fluxo de trabalho ",
|
||||
"aIMergeCommitSummaries": " Resumos de commit de merge por IA ",
|
||||
"aITitleAndGitCommitMessageSummarization": " Resumo de título e mensagem de commit do Git por IA ",
|
||||
"automaticallyCompactContextWhenApproachingThisTokenCount": "Compacta o contexto automaticamente ao se aproximar desta contagem de tokens. Deixe em branco para não haver limite (compactação apenas em erros de overflow). Defina um número para compactar proativamente ao atingir essa contagem de tokens. Sem padrão — não definido (sem limite).",
|
||||
"autoSelectPresetBasedOnTaskSize": " Selecionar predefinição automaticamente com base no tamanho da tarefa ",
|
||||
"autoSummarizeLongDescriptionsAsTitles": " Resumir automaticamente títulos de tarefas ",
|
||||
"taskOutputLanguage": "AI-authored task language",
|
||||
"taskOutputLanguageHelp": "Choose the language for AI-authored task plans, titles, steps, summaries, and recommendations. No stored default — unset resolves English. Changes apply to new generation sessions only.",
|
||||
"taskOutputLanguageEnglish": "English (default)",
|
||||
"taskOutputLanguageInput": "User input language",
|
||||
"taskOutputLanguageInterface": "Fusion interface language",
|
||||
"configuredPresets": "Predefinições configuradas",
|
||||
"configuresTheModelUsedForTwoShortSummary": " Configura o modelo usado em duas tarefas de resumo curto: gerar automaticamente títulos de tarefa a partir de descrições longas e gerar resumos de commit de merge a partir dos commits das etapas e das estatísticas de diff. ",
|
||||
"defaultWorkflowModelLaneActions": "Ações padrão das faixas de modelo do fluxo de trabalho",
|
||||
"defaultWorkflowModelLanes": "Faixas de modelo padrão do fluxo de trabalho",
|
||||
"delete": " Excluir ",
|
||||
"edit": " Editar ",
|
||||
"executorModel": "Modelo do executor",
|
||||
"executorEscalationModel": "Modelo de escalonamento do executor",
|
||||
"executorEscalationModelHelp": "Modelo alternativo usado quando as novas tentativas de falha de ferramenta se esgotam. Sem padrão — não definido significa nenhum modelo alternativo; configure a política de escalonamento e um destino de nó opcional em Agendamento.",
|
||||
"selectExecutorEscalationModel": "Selecione um modelo de escalonamento",
|
||||
"noExecutorEscalationModel": "Nenhum modelo de escalonamento",
|
||||
"fallsBackTo": " Recorre a: ",
|
||||
"loadingAvailableModels": "Carregando modelos disponíveis…",
|
||||
"loadingWorkflowModelLanes": "Carregando faixas de modelo do fluxo de trabalho…",
|
||||
"modelLanes": "Faixas de modelo",
|
||||
"modelPresets": "Predefinições de modelo",
|
||||
"name": "Nome",
|
||||
"noCap": "Sem limite",
|
||||
"noModelsAvailableConfigureAuthenticationBeforeSelectingWorkflow": " Nenhum modelo disponível. Configure a autenticação antes de selecionar as faixas de modelo do fluxo de trabalho. ",
|
||||
"noModelsAvailableConfigureAuthenticationFirst": " Nenhum modelo disponível. Configure a autenticação primeiro. ",
|
||||
"noModelsAvailableConfigureAuthenticationFirst2": "Nenhum modelo disponível. Configure a autenticação primeiro.",
|
||||
"noPreset": "Nenhuma predefinição",
|
||||
"noPresetsConfiguredYet": "Nenhuma predefinição configurada ainda.",
|
||||
"openAProjectToEditWorkflowModelLanes": "Abra um projeto para editar as faixas de modelo do fluxo de trabalho.",
|
||||
"overrideGlobalModelSettingsAtTheProjectLevel": " Substitui as configurações globais de modelo no nível do projeto. Cada faixa controla um contexto específico de uso de IA. Faixas não definidas herdam da faixa global correspondente. O modelo padrão do projeto é o fallback para este projeto quando uma faixa mais específica não está definida. ",
|
||||
"presetEditor": "Editor de predefinições",
|
||||
"reset": " Redefinir ",
|
||||
"resetToDefaultNoCap": "Redefinir para o padrão (sem limite)",
|
||||
"resetToInheritFromGlobal": "Redefinir para herdar do global",
|
||||
"resetToInheritFromWorkflow": "Redefinir para herdar do fluxo de trabalho",
|
||||
"reviewerModel": "Modelo do revisor",
|
||||
"theseProjectOverridesApplyToTheActiveDefault": " Essas substituições do projeto se aplicam ao fluxo de trabalho padrão ativo. ",
|
||||
"tokenCap": "Limite de tokens",
|
||||
"useDefault": "Usar padrão",
|
||||
"useWorkflowDefault": "Usar padrão do fluxo de trabalho",
|
||||
"whenEnabledMergeCommitMessagesIncludeAnAI": " Quando ativado, as mensagens de commit de merge incluem um assunto gerado por IA além de um resumo no corpo (narrativa + tópicos + estatísticas de diff), em vez de apenas listar os assuntos dos commits das etapas. Usa o modelo de resumo de título. Padrão: ativado. ",
|
||||
"whenEnabledTasksCreatedWithoutATitleBut": " Quando ativado, toda descrição não vazia criada sem título recebe automaticamente um título gerado por IA (máximo de 60 caracteres). Títulos explícitos são preservados e solicitações manuais ou explícitas continuam disponíveis quando desativado. O mesmo modelo também é usado para resumos de commits de merge e títulos de issues de rastreamento do GitHub. Padrão: desativado. ",
|
||||
"autoSelectModelPresetHint": "Padrão: desativado.",
|
||||
"prTitlePromptInstructionsHelp": "Orienta o título gerado por IA ao criar um PR. Deixe em branco para usar o prompt padrão de metadados do PR. Sem padrão — não definido.",
|
||||
"prDescriptionPromptInstructionsHelp": "Orienta o resumo, as alterações e as seções de teste gerados por IA ao criar um PR. Deixe em branco para usar o prompt padrão de metadados do PR. Sem padrão — não definido.",
|
||||
"chatHeading": "Chat",
|
||||
"chatDescription": "Escolha o destino padrão para novos chats diretos e se o Novo Chat deve perguntar ou usar esse padrão imediatamente.",
|
||||
"chatNewSessionMode": "Comportamento do Novo Chat",
|
||||
"chatNewSessionModePrompt": "Perguntar o modelo a cada vez",
|
||||
"chatNewSessionModeAlwaysDefault": "Sempre usar o padrão configurado",
|
||||
"chatNewSessionModeHelp": "O modo de pergunta abre o Novo Chat com este padrão pré-selecionado. O modo sempre-padrão pula a caixa de diálogo quando o padrão configurado está completo.",
|
||||
"chatDefaultKind": "Destino padrão do chat",
|
||||
"chatDefaultKindModel": "Modelo",
|
||||
"chatDefaultKindAgent": "Agente",
|
||||
"chatDefaultModel": "Modelo padrão do chat",
|
||||
"selectChatDefaultModel": "Selecione um modelo padrão do chat",
|
||||
"chatDefaultModelHelp": "No modo Modelo, o Novo Chat usa o agente de chat integrado do Fusion com este par provedor/modelo. Deixe em branco para recorrer à pergunta.",
|
||||
"chatDefaultAgent": "Agente padrão do chat",
|
||||
"loadingAgents": "Carregando agentes…",
|
||||
"selectChatDefaultAgent": "Selecione um agente padrão do chat",
|
||||
"chatDefaultAgentEmpty": "Ainda não há agentes disponíveis para este projeto.",
|
||||
"chatDefaultAgentHelp": "No modo Agente, o Novo Chat inicia um chat direto com o agente durável selecionado.",
|
||||
"chatDefaultReset": "Redefinir padrão do Chat"
|
||||
},
|
||||
"globalModels": {
|
||||
"modelOverrides": "",
|
||||
"allow": "allow",
|
||||
"commaSeparatedValuesSentToOpenRouterModelSync": "Valores separados por vírgula enviados à sincronização de modelos do OpenRouter. Sem padrão — não definido (sem filtro).",
|
||||
"controlsHowMuchReasoningEffortTheAIModel": "Controla o quanto de esforço de raciocínio o modelo de IA usa. Níveis mais altos produzem melhores resultados, mas custam mais. Sem padrão — não definido (aplica-se o esforço padrão do próprio modelo).",
|
||||
"default": "Padrão",
|
||||
"default2": "default",
|
||||
"defaultAIModelUsedForTaskExecutionWhen": "Modelo de IA padrão usado na execução de tarefas quando nenhuma substituição por tarefa está definida. "Usar padrão" permite que o mecanismo escolha automaticamente. Sem padrão — não definido.",
|
||||
"defaultModel": "Modelo padrão",
|
||||
"deny": "deny",
|
||||
"fallbackModel": "Modelo de fallback",
|
||||
"flowAndPublishesThemUnderTheOpencodeGo": " e os publica sob o provedor opencode-go nos seletores de modelo. Padrão: ativado. ",
|
||||
"fusion": "Fusion",
|
||||
"globalBaselineModelsForEachAIRoleProject": " Modelos de referência globais para cada função de IA. As configurações do projeto podem substituí-los por projeto. ",
|
||||
"httpsRunfusionAi": "https://runfusion.ai",
|
||||
"latency": "latency",
|
||||
"leaveEmptyToOmitThisHeaderDefaultFusion": "Deixe em branco para omitir este cabeçalho. Sem padrão — não definido (o Fusion usa o título \"Fusion\" como fallback quando não definido).",
|
||||
"leaveEmptyToOmitThisHeaderDefaultHttps": "Deixe em branco para omitir este cabeçalho. Sem padrão — não definido (o Fusion usa https://runfusion.ai como fallback quando não definido).",
|
||||
"modelLanes": "Faixas de modelo",
|
||||
"noFallback": "Sem fallback",
|
||||
"openaiAnthropic": "openai, anthropic",
|
||||
"openRouterAdvanced": "OpenRouter avançado",
|
||||
"openRouterAllowFallbacks": "OpenRouter: permitir fallbacks",
|
||||
"openRouterHTTPReferer": "OpenRouter HTTP-Referer",
|
||||
"openRouterOutputModalitiesFilter": "Filtro output_modalities do OpenRouter",
|
||||
"openRouterRoutingIgnore": "OpenRouter: ignorar roteamento",
|
||||
"openRouterRoutingOnly": "OpenRouter: somente roteamento",
|
||||
"openRouterRoutingOrder": "OpenRouter: ordem de roteamento",
|
||||
"openRouterRoutingSort": "OpenRouter: classificação de roteamento",
|
||||
"openRouterSupportedParametersFilter": "Filtro supported_parameters do OpenRouter",
|
||||
"openRouterXTitle": "OpenRouter X-Title",
|
||||
"price": "price",
|
||||
"providerName": "provider-name",
|
||||
"requireParameters": " Exigir parâmetros ",
|
||||
"startupModelSync": "Sincronização de modelos na inicialização",
|
||||
"syncOpencodeGoModelListAtStartup": " Sincronizar lista de modelos do opencode-go na inicialização ",
|
||||
"syncOpenRouterModelListAtStartup": " Sincronizar lista de modelos do OpenRouter na inicialização ",
|
||||
"text": "text",
|
||||
"thinkingEffort": "Esforço de raciocínio",
|
||||
"throughput": "throughput",
|
||||
"toolsStructuredOutputs": "tools, structured_outputs",
|
||||
"usedAutomaticallyIfThePrimaryDefaultModelHits": "Usado automaticamente se o modelo padrão principal encontrar um erro do provedor passível de nova tentativa, como limitação de taxa ou sobrecarga. Sem padrão — não definido.",
|
||||
"useDefault": "Usar padrão",
|
||||
"whenEnabledStartupFetchesTheLatestAvailableModels": " Quando ativado, a inicialização busca os modelos mais recentes disponíveis na API do OpenRouter para que os seletores de modelo sempre incluam o catálogo mais atual. Padrão: ativado. ",
|
||||
"syncOrcaRouterModelListAtStartup": " Sincronizar lista de modelos do OrcaRouter na inicialização ",
|
||||
"whenEnabledStartupFetchesTheLatestOrcaRouterModels": " Quando ativado, a inicialização busca os modelos mais recentes disponíveis na API do OrcaRouter para que os seletores de modelo incluam o catálogo do OrcaRouter. Padrão: ativado. ",
|
||||
"whenEnabledStartupRefreshesModelsThroughTheLocal": " Quando ativado, a inicialização atualiza os modelos por meio do fluxo local do ",
|
||||
"commaSeparatedValuesSentToOpenRouterModelSyncOutputModalities": "Valores separados por vírgula enviados à sincronização de modelos do OpenRouter. Sem padrão — não definido (sem filtro).",
|
||||
"openRouterRoutingOrderHint": "Sem padrão — não definido (aplica-se a ordem de roteamento padrão do próprio OpenRouter).",
|
||||
"openRouterRoutingIgnoreHint": "Sem padrão — não definido (nenhum provedor ignorado).",
|
||||
"openRouterRoutingOnlyHint": "Sem padrão — não definido (sem restrição de provedor).",
|
||||
"openRouterAllowFallbacksHint": "Sem padrão — não definido (aplica-se o comportamento padrão de fallback do próprio OpenRouter).",
|
||||
"openRouterRoutingSortHint": "Sem padrão — não definido (aplica-se a classificação padrão do próprio OpenRouter).",
|
||||
"requireParametersHint": "Padrão: desativado."
|
||||
},
|
||||
"appearance": {
|
||||
"hideAISessionNotificationBanners": "Ocultar banners de notificação de sessão de IA",
|
||||
"language": "Idioma",
|
||||
"languageAuto": "Automático",
|
||||
"languageAutoHint": "Seguir o idioma do navegador",
|
||||
"suppressTheLdquoNeedsYourInputRdquoBanner": "Ocultar o banner “precisa da sua entrada” que aparece quando sessões de IA estão aguardando entrada ou falharam.",
|
||||
"title": "Aparência",
|
||||
"openTasksInRightSidebarHelp": "Quando ativado, os cartões de tarefa do quadro abrem os detalhes na barra lateral direita quando ela estiver disponível; os estados mobile e de barra lateral oculta mantêm o painel de tarefa completo. Padrão: desativado.",
|
||||
"openMobileTasksInPopupHelp": "Quando ativado, cliques comuns em cartões de tarefa do quadro e na lista de Tarefas do dock direito abrem o popup de tarefa existente, mantendo o quadro ou a lista visível. Aberturas via deep-tab e outras formas de abertura de tarefa mantêm o comportamento atual. Padrão: desativado.",
|
||||
"taskPopupsBoardListOnly": "Manter os popups de tarefa na visualização em que foram abertos",
|
||||
"taskPopupsBoardListOnlyHelp": "Quando ativado, cada popup de detalhes de tarefa aberto aparece somente na visualização em que foi aberto. Trocar de visualização o oculta sem fechá-lo; voltar o restaura na mesma posição. Padrão: ativado.",
|
||||
"taskDetailChatFirstHelp": "Desativado por padrão: os detalhes da tarefa listam Atividade primeiro, e aberturas de tarefas não concluídas sem aba especificada caem em Atividade. Ative para restaurar a ordem/padrão com Chat primeiro; links diretos para o Chat continuam funcionando de qualquer forma.",
|
||||
"showCostBadgeOnCards": "Mostrar selos de custo nos cartões de tarefa",
|
||||
"showCostBadgeOnCardsHelp": "Padrão: desativado. Quando ativado, os cartões do quadro mostram o custo do modelo derivado ao lado do tempo de execução; quando o preço não está disponível, isso é indicado — e tarefas sem uso de tokens não mostram selo."
|
||||
},
|
||||
"search": {
|
||||
"allSections": "Mostrando todas as seções de configurações",
|
||||
"clear": "Limpar busca de configurações",
|
||||
"label": "Buscar configurações",
|
||||
"moreResults": "{{count}} a mais — continue digitando para refinar",
|
||||
"navigationLabel": "Navegação de configurações",
|
||||
"noMobileOptions": "Nenhuma seção corresponde a esta busca.",
|
||||
"noResults": "Nenhuma seção de configurações corresponde a \"{{query}}\".",
|
||||
"placeholder": "Buscar por configuração ou seção",
|
||||
"resultCount_one": "{{count}} seção correspondente",
|
||||
"resultCount_other": "{{count}} seções correspondentes",
|
||||
"settingResultCount_one": "{{count}} configuração correspondente",
|
||||
"settingResultCount_other": "{{count}} configurações correspondentes"
|
||||
},
|
||||
"globalGeneral": {
|
||||
"andShowsUpdateNoticesInTheCLIAnd": " e mostra avisos de atualização na CLI e no painel. A frequência é definida pela opção abaixo. Padrão: ativado. ",
|
||||
"autoReloadDashboardOnVersionChange": " Recarregar o painel automaticamente quando a versão mudar ",
|
||||
"checkForThe": " Verificar o ",
|
||||
"checkForUpdatesAutomatically": " Verificar atualizações automaticamente ",
|
||||
"cLIBinaryOnPATH": " binário da CLI no PATH ",
|
||||
"cLIBySpawning": " CLI executando",
|
||||
"controlsHowOftenTheDashboardReFetchesThe": " Controla a frequência com que o painel busca novamente o registro do npm. Use o controle de versão + atualização no cabeçalho para acionar uma verificação imediata a qualquer momento. Padrão: diário. ",
|
||||
"dailyRecommended": "Diário (recomendado)",
|
||||
"disableThisIfYourLocalDevProcessIs": ". Desative esta opção se o seu processo de desenvolvimento local for a fonte da verdade e você não quiser que um binário desatualizado instalado globalmente seja executado durante a verificação. Padrão: ativado. ",
|
||||
"frequency": "Frequência",
|
||||
"general": "Geral",
|
||||
"globalDefaultTrackingRepo": "Repositório de rastreamento padrão global",
|
||||
"reportRoadmapDedupeEnabled": "Deduplicação global do roadmap público",
|
||||
"reportRoadmapDedupeEnabledHelp": "Serve de reserva para projetos que não definem uma preferência de deduplicação do roadmap público. Sem padrão — não definido (os projetos usam ativado por padrão).",
|
||||
"reportRoadmapLabel": "Rótulo global do roadmap público",
|
||||
"reportRoadmapLabelHelp": "Rótulo de reserva para issues abertas do roadmap público quando um projeto não define o seu. Sem padrão — não definido (os projetos usam roadmap por padrão).",
|
||||
"reportRoadmapRepo": "Repositório global do roadmap público (opcional)",
|
||||
"reportRoadmapRepoHelp": "owner/repositório do GitHub de reserva para issues do roadmap público. Se não definido, usa o repositório de rastreamento. Sem padrão — não definido.",
|
||||
"leaveBothThinkingTogglesOffToKeepThe": " Deixe as duas opções de pensamento desativadas para manter o comportamento padrão original. Isso controla apenas as ",
|
||||
"manualOnlyNeverAutoCheck": "Somente manual — nunca verificar automaticamente",
|
||||
"onStartupOncePerServerLaunch": "Na inicialização — uma vez por execução do servidor",
|
||||
"ownerRepo": "owner/repo",
|
||||
"projectsInheritThisValueWhenTheyDoNot": "Os projetos herdam este valor quando não definem um repositório de rastreamento padrão próprio. Sem padrão — não definido.",
|
||||
"rowsAndDoesNotAffectAssistantTextOr": " linhas persistidas e não afeta o texto do assistente nem as linhas de ferramentas. Padrão: desativado tanto para agentes permanentes quanto efêmeros. ",
|
||||
"saveAIThinkingForEphemeralTaskWorkerAgents": " Salvar o pensamento da IA para agentes efêmeros / de execução de tarefas ",
|
||||
"saveAIThinkingForPermanentAgents": " Salvar o pensamento da IA para agentes permanentes ",
|
||||
"saveAIThinkingLogs": "Salvar logs de pensamento da IA",
|
||||
"saveToolOutputInAgentLogs": " Salvar a saída das ferramentas nos logs do agente ",
|
||||
"agentToolOutputLimit": " Limite de saída das ferramentas do agente ",
|
||||
"agentToolOutputLimitHint": " Número máximo de caracteres retornados de cada resultado de ferramenta injetado pelo motor. Quando não definido, herda o padrão do motor de 16.000 caracteres. Deixe em branco para usar o padrão. ",
|
||||
"noLimitOnAgentToolOutput": " Sem limite para a saída das ferramentas do agente ",
|
||||
"noLimitOnAgentToolOutputHint": " Desativa o limitador compartilhado de saída das ferramentas. Um único resultado de ferramenta pode consumir toda a janela de contexto do agente. Padrão: desativado; quando não definido, o orçamento herda o padrão do motor de 16.000 caracteres. ",
|
||||
"enableProactiveTaskChat": " Ativar atualizações proativas no chat da tarefa ",
|
||||
"enableProactiveTaskChatHint": " Quando ativado, o chat da tarefa relata o progresso das etapas, falhas, revisões e reversões em tempo real. Padrão: desativado. ",
|
||||
"updates": "Atualizações",
|
||||
"weekly": "Semanal",
|
||||
"whenDisabledToolRowsAreStillLoggedBut": " Quando desativado, as linhas de ferramentas continuam sendo registradas, mas os payloads detalhados das ferramentas são omitidos. Payloads de ferramentas muito grandes ainda podem ser cortados mesmo quando isso permanece ativado. Padrão: desativado. ",
|
||||
"whenEnabledDefaultTheDashboardAutomaticallyReloadsWhen": " Quando ativado (padrão), o painel recarrega automaticamente ao detectar uma nova versão de build — seja por rebuilds do servidor ou atualizações do service worker. Desative isso para permanecer na versão atual até atualizar manualmente. Padrão: ativado. ",
|
||||
"whenEnabledFusionChecksNpmForNewVersions": " Quando ativado, o Fusion verifica o npm em busca de novas versões de",
|
||||
"whenEnabledTheDashboardProbesForAGlobally": " Quando ativado, o painel verifica se existe, instalado globalmente, um",
|
||||
"gitLabEnabledHint": "Os valores globais de URL e token do GitLab servem de reserva para projetos que não definem os próprios valores. Sem padrão — não definido (o estado não definido se comporta como ativado até ser explicitamente desativado).",
|
||||
"gitLabInstanceUrlHint": "Em branco, usa o padrão GitLab.com. Os projetos herdam esta URL de GitLab autogerenciado, a menos que definam seu próprio valor no projeto. Sem padrão — não definido.",
|
||||
"gitLabApiBaseUrlHint": "Em branco, deriva de <instance>/api/v4. Substitua apenas para gateways de API do GitLab autogerenciado que usem uma URL absoluta http:// ou https:// diferente. Sem padrão — não definido.",
|
||||
"gitLabTokenTypeHint": "Sem padrão — não definido (o seletor usa token de acesso pessoal como reserva até que você escolha outra opção).",
|
||||
"gitLabAuthTokenHint": "Os projetos herdam este valor de reserva apenas quando não definem um token do GitLab próprio. Operações somente leitura exigem read_api ou api; ações de escrita exigem api; tokens de projeto/grupo continuam limitados pela associação ao recurso. Sem padrão — não definido.",
|
||||
"dismissModalsByClickingOutsideHint": " Quando ativado, clicar ou tocar no fundo de um modal fecha o modal. Padrão: desativado, para evitar fechamentos acidentais. ",
|
||||
"skipConfirmationDialogs": " Pular caixas de confirmação para ações críticas ",
|
||||
"skipConfirmationDialogsHint": " Quando ativado, ações destrutivas como excluir uma tarefa ou redefinir o progresso são executadas imediatamente, sem confirmação. Padrão: desativado",
|
||||
"releaseChannel": "Canal de lançamento",
|
||||
"releaseChannelHelp": "Stable segue os lançamentos oficiais. Beta segue pré-lançamentos gerados a partir da main e também recebe cada lançamento stable assim que ele ultrapassa o beta. Voltar para Stable nunca faz downgrade. Padrão: stable.",
|
||||
"autoUpdateAndRestart": " Atualizar e reiniciar automaticamente ",
|
||||
"autoUpdateAndRestartHelp": "Quando ativado, o Fusion instala automaticamente as atualizações disponíveis no canal de lançamento selecionado e reinicia para aplicá-las. Requer um processo supervisor pai (o padrão para `fn dashboard`); hosts iniciados com --no-supervise pulam a instalação. Padrão: desativado.",
|
||||
"autoUpdateEnabled": "",
|
||||
"autoUpdateEnabledHelp": "",
|
||||
"autoRestartAfterUpdate": "",
|
||||
"autoRestartAfterUpdateHelp": "",
|
||||
"channelStable": "Stable (recomendado)",
|
||||
"channelBeta": "Beta — builds iniciais da main",
|
||||
"quickAddSubmitOnEnter": "",
|
||||
"quickAddSubmitOnEnterHint": ""
|
||||
},
|
||||
"nodeSync": {
|
||||
"alwaysAsk": "Sempre perguntar",
|
||||
"automaticallySynchronizeSettingsBetweenThisNodeAndConnected": "Sincroniza automaticamente as configurações entre este nó e os nós remotos conectados. Padrão: desativado.",
|
||||
"conflictResolution": "Resolução de conflitos",
|
||||
"enableAutomaticSettingsSync": " Ativar sincronização automática de configurações ",
|
||||
"every15Minutes": "A cada 15 minutos",
|
||||
"every1Hour": "A cada 1 hora",
|
||||
"every30Minutes": "A cada 30 minutos",
|
||||
"every5Minutes": "A cada 5 minutos",
|
||||
"includeAPIKeysAndOAuthTokensInSync": "Inclui chaves de API e tokens OAuth nas operações de sincronização. Padrão: desativado.",
|
||||
"keepLocal": "Manter local",
|
||||
"keepRemote": "Manter remoto",
|
||||
"lastWriteWins": "A última gravação prevalece",
|
||||
"nodeSync": "Sincronização de nós",
|
||||
"syncInterval": "Intervalo de sincronização",
|
||||
"syncModelAuthCredentials": " Sincronizar credenciais de autenticação de modelo ",
|
||||
"workflowSettingsNotSynced": "As configurações de fluxo de trabalho ainda não são sincronizadas entre nós.",
|
||||
"syncIntervalHint": "Padrão: a cada 15 minutos.",
|
||||
"conflictResolutionHint": "Padrão: a última gravação prevalece."
|
||||
},
|
||||
"nodeRouting": {
|
||||
"blockExecution": "Bloquear execução",
|
||||
"configureHowTasksAreRoutedToExecutionNodes": "Configure como as tarefas são roteadas para os nós de execução.",
|
||||
"defaultExecutionNode": "Nó de execução padrão",
|
||||
"fallBackToLocal": "Retornar ao local",
|
||||
"localExecutionNoDefaultNode": "Execução local (sem nó padrão)",
|
||||
"nodeRouting": "Roteamento de nós",
|
||||
"selectedNode": "Nó selecionado:",
|
||||
"theseSettingsApplyAtTheProjectLevel": "Essas configurações se aplicam no nível do projeto.",
|
||||
"unavailableNodePolicy": "Política de nó indisponível",
|
||||
"usedWhenATaskHasNoNodeOverride": "Usado quando uma tarefa não tem substituição de nó. O status do nó é exibido para uma seleção de roteamento mais segura. Sem padrão — não definido (execução local).",
|
||||
"unavailableNodePolicyHint": "Padrão: bloquear execução."
|
||||
},
|
||||
"reset": {
|
||||
"button": "Redefinir configurações",
|
||||
"buttonShort": "Redefinir",
|
||||
"buttonTitle": "Redefinir configurações para os padrões",
|
||||
"dialogAriaLabel": "Redefinir configurações",
|
||||
"dialogTitle": "Redefinir configurações",
|
||||
"dialogBody": "Escolha o que redefinir para os padrões. Isso não pode ser desfeito.",
|
||||
"resetMenuAction": "Redefinir este menu ({{section}})",
|
||||
"resetAllProjectAction": "Redefinir todas as configurações do projeto",
|
||||
"menuResetSuccess": "As configurações de {{section}} foram redefinidas para os padrões",
|
||||
"allProjectResetSuccess": "Todas as configurações do projeto foram redefinidas para os padrões"
|
||||
},
|
||||
"commands": {
|
||||
"buildCommand": "Comando de build",
|
||||
"commands": "Comandos",
|
||||
"commandUsedToBuildTheProjectInjectedInto": "Comando usado para fazer o build do projeto — injetado nas especificações de tarefas geradas. Sem padrão — não definido.",
|
||||
"commandUsedToRunTestsInjectedIntoGenerated": "Comando usado para executar os testes — injetado nas especificações de tarefas geradas. Sem padrão — não definido.",
|
||||
"eGPnpmBuild": "ex.: pnpm build",
|
||||
"eGPnpmTest": "ex.: pnpm test",
|
||||
"testCommand": "Comando de teste"
|
||||
},
|
||||
"runtimesRuntimes": {
|
||||
"hermesRuntime": "Hermes Runtime",
|
||||
"openClawRuntime": "OpenClaw Runtime",
|
||||
"paperclipRuntime": "Paperclip Runtime"
|
||||
},
|
||||
"experimental": {
|
||||
"experimentalFeatures": "Recursos experimentais",
|
||||
"experimentalFeaturesAreEarlyCapabilitiesThatAreNot": " Recursos experimentais são funcionalidades iniciais que ainda não estão totalmente estáveis. Ative-os para testar novas funcionalidades, mas esteja ciente de que podem mudar ou ser removidos. Padrão: desativado para cada feature flag abaixo. ",
|
||||
"featureFlags": "Feature Flags"
|
||||
},
|
||||
"plugins": {
|
||||
"fusionPlugins": " Plugins do Fusion ",
|
||||
"piExtensions": " Extensões Pi ",
|
||||
"pluginManagerType": "Tipo de gerenciador de plugins",
|
||||
"plugins": "Plugins"
|
||||
},
|
||||
"agentPermissions": {
|
||||
"agentPermissions": "Permissões do agente",
|
||||
"agentProvisioningApprovals": "Aprovações de provisionamento de agente",
|
||||
"configureProjectLevelApprovalBehaviorForDurableProvisioning": " Configure o comportamento de aprovação em nível de projeto para ferramentas de provisionamento durável (fn_agent_create/fn_agent_delete). Padrão: nenhuma política de aprovação configurada (vazio). ",
|
||||
"perAgentSettingsOverrideProjectDefaultsEachCategory": "Os padrões do projeto se aplicam a agentes permanentes, workers de tarefas efêmeros e workers executores de fallback, a menos que uma substituição por agente seja definida. Regras exatas de ferramentas se combinam com a opção legada de criação de tarefa efêmera. Padrão: não definido — toda categoria de ação permite por padrão até que uma categoria seja explicitamente restringida."
|
||||
},
|
||||
"authentication": {
|
||||
"enterAPIKey": "Digite a chave de API",
|
||||
"key": "Chave: "
|
||||
},
|
||||
"actions": {
|
||||
"cancel": "Cancelar",
|
||||
"save": "Salvar"
|
||||
},
|
||||
"database": {
|
||||
"embeddedConnectionCapHelp": "Número máximo de conexões do servidor para o PostgreSQL integrado do Fusion. Aplicado após reiniciar o Fusion. Intervalo: 32–2.000. Não definido por padrão — o Fusion escolhe 500, ou 150 no Windows, onde cada conexão é um processo separado e limites mais altos podem travar os backends. O PostgreSQL externo usa o limite de conexões do seu provedor.",
|
||||
"embeddedConnectionCap": "Limite de conexões do PostgreSQL integrado",
|
||||
"embeddedConnectionCapError": "Informe um valor entre 32 e 2.000.",
|
||||
"advanced": "Configurações avançadas de banco de dados",
|
||||
"embeddedConnectionCapPlaceholder": "auto"
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": " Aceitar rotas ",
|
||||
"advancedNamedTunnel": "Avançado (Named Tunnel)",
|
||||
"advancedSettings": "Configurações avançadas",
|
||||
"authenticatedURL": "URL autenticada:",
|
||||
"authLinks": "Links de autenticação",
|
||||
"authLinkTokenType": "Tipo de token do link de autenticação",
|
||||
"automaticallyRestoreTunnelOnStartupIfItWas": "Restaura automaticamente o túnel na inicialização se ele estava em execução quando foi parado pela última vez. Padrão: desativado.",
|
||||
"cloudflare": "Cloudflare",
|
||||
"cloudflaredInstalled": "cloudflared instalado com sucesso",
|
||||
"cloudflaredIsInstalled": "cloudflared está instalado",
|
||||
"cloudflaredIsNotInstalled": "cloudflared não está instalado",
|
||||
"cloudflaredMustBeInstalledToStartTheTunnel": "É necessário instalar o cloudflared para iniciar o túnel",
|
||||
"enableShortLivedTokens": " Ativar tokens de curta duração ",
|
||||
"expiresAt": " · Expira em {{expiresAt}}",
|
||||
"external": "Externo ",
|
||||
"externalTunnelQRCode": "QR code do túnel externo",
|
||||
"generateQR": "Gerar QR",
|
||||
"generateShortLivedToken": "Gerar token de curta duração",
|
||||
"httpsYourDomainExample": "https://your-domain.example",
|
||||
"ifHomebrewIsUnavailable": "Se o Homebrew não estiver disponível: ",
|
||||
"ingressURL": "URL do ingress",
|
||||
"installCloudflared": "Instalar cloudflared",
|
||||
"installing": "Instalando…",
|
||||
"lastShortLivedTokenExpiresAt": "O último token de curta duração expira em ",
|
||||
"manualInstall": "Instalação manual: ",
|
||||
"ms": "ms)",
|
||||
"namedTunnelModeEnabled": "Modo Named Tunnel ativado — configure o nome do túnel, o token e a URL do ingress abaixo.",
|
||||
"noExpiry": " · Sem expiração",
|
||||
"persistentToken": "Token persistente",
|
||||
"persistentTokenRegenerated": "Token persistente regenerado",
|
||||
"qRSVGMarkup": "Marcação SVG do QR",
|
||||
"regeneratePersistentToken": "Regenerar token persistente",
|
||||
"rememberLastRunningState": " Lembrar último estado de execução ",
|
||||
"remoteAccess": "Acesso remoto",
|
||||
"remoteAccessCode": "Código de acesso remoto:",
|
||||
"remoteAccessQRCode": "QR code de acesso remoto",
|
||||
"remoteProvider": "Provedor remoto",
|
||||
"restarting": "Reiniciando…",
|
||||
"scanThisQRCodeOnYourPhone": "Escaneie este QR code no seu celular",
|
||||
"scanToConnect": "Escaneie para conectar:",
|
||||
"scanToOpen": "Escaneie para abrir:",
|
||||
"selectAProviderAboveToConfigureRemoteAccess": "Selecione um provedor acima para configurar o acesso remoto.",
|
||||
"shortLivedToken": "Token de curta duração",
|
||||
"shortLivedTokenGenerated": "Token de curta duração gerado",
|
||||
"shortLivedTTLMs": "TTL de curta duração (ms)",
|
||||
"showURL": "Mostrar URL",
|
||||
"startFresh": "Começar do zero",
|
||||
"starting": "Iniciando…",
|
||||
"startTunnel": "Iniciar túnel",
|
||||
"stopping": "Parando…",
|
||||
"stopTunnel": "Parar túnel",
|
||||
"tailnetURL": "URL da tailnet:",
|
||||
"tailscale": "Tailscale",
|
||||
"tailscaleFunnelWillExposeThisDashboardOnYour": "O Tailscale Funnel vai expor este painel na URL pública ",
|
||||
"tokenType": " Tipo de token: ",
|
||||
"tunnelDetected": " túnel detectado",
|
||||
"tunnelName": "Nome do túnel",
|
||||
"tunnelRestarted": "Túnel remoto reiniciado",
|
||||
"tunnelStarted": "Túnel remoto iniciado",
|
||||
"tunnelStopped": "Túnel remoto parado",
|
||||
"tunnelToken": "Token do túnel",
|
||||
"uRLAndQRGenerationUseTheSelectedToken": " A geração de URL e QR usa o tipo de token selecionado. ",
|
||||
"uRLNoHostnameOrPortConfigurationNeeded": " da sua tailnet — não é necessário configurar hostname ou porta.",
|
||||
"useExisting": "Usar existente",
|
||||
"usingQuickTunnel": "Usando o Quick Tunnel — cria automaticamente uma URL aleatória em trycloudflare.com, sem necessidade de conta. Padrão: ativado.",
|
||||
"installationFailed": "Falha na instalação",
|
||||
"acceptRoutesHint": "Padrão: desativado.",
|
||||
"shortLivedEnabledHint": "Padrão: desativado.",
|
||||
"shortLivedTtlMsHint": "Padrão: 900000 (15 minutos).",
|
||||
"cloudflareTunnelURL": "",
|
||||
"tunnelURL": ""
|
||||
},
|
||||
"worktrees": {
|
||||
"allowSilentSiblingBranchRenameDuringExecutorConflicts": " Permitir renomeação silenciosa de branch irmã durante conflitos do executor ",
|
||||
"alsoRebaseOntoLocalDefaultBranchHEAD": " Também fazer rebase no HEAD da branch padrão local ",
|
||||
"and": " e ",
|
||||
"andCanHidePriorCommitsFromTheDefault": " e pode ocultar commits anteriores do fluxo de recuperação padrão. Padrão: desativado. ",
|
||||
"autoDetectFusionBinWorktrunkOrPATH": "detecção automática (~/.fusion/bin/worktrunk ou $PATH)",
|
||||
"awaitingApproval": "Aguardando aprovação — abra Aprovações para continuar.",
|
||||
"branchCollisionSilentlyForksWorkOntoSiblingBranches": " bifurca silenciosamente o trabalho para branches irmãs como ",
|
||||
"browse": " Procurar ",
|
||||
"browseWorktreesDirectory": "Procurar diretório de worktrees",
|
||||
"closeParenPeriod": ").",
|
||||
"defaultsTo": ". O padrão é ",
|
||||
"defaultsToWorktreesLeaveEmptyUnlessOverriding": "O padrão é .worktrees — deixe em branco a menos que queira sobrescrever",
|
||||
"disabledByDefaultOptInWhenEnabledFusion": " Desativado por padrão (opcional). Quando ativado, o Fusion delega ao ",
|
||||
"discouragedThisRestoresTheLegacyBehaviorWhereA": " Não recomendado. Isso restaura o comportamento legado em que uma colisão de branch ativa do ",
|
||||
"enableWorktrunkAndRequestApprovalToInstallThe": "Ative o worktrunk e solicite aprovação para instalar o release fixado.",
|
||||
"enableWorktrunkIntegration": " Ativar integração com o worktrunk ",
|
||||
"failAndPauseTheTaskDefault": "Falhar e pausar a tarefa (padrão)",
|
||||
"fallBackToFusionsNativeWorktreeBackend": "Recorrer ao backend nativo de worktree do Fusion",
|
||||
"forWorktreeCreateSyncPruneAndRemoveOperations": " as operações de criação, sincronização, limpeza e remoção de worktree, seguindo a estrutura de diretórios do worktrunk. ",
|
||||
"inAdditionToTheRemoteRebaseAboveAlso": " Além do rebase remoto acima, também é feito o rebase da branch da tarefa sobre o HEAD da branch padrão local (rootDir). Isso identifica tarefas irmãs que sofreram merge localmente mas ainda não passaram por push — sem isso, duas tarefas simultâneas em que uma exclui código podem fazer com que a outra reintroduza esse código silenciosamente pela estratégia de fallback. Ativado por padrão; desative apenas se causar problemas no seu fluxo de trabalho. ",
|
||||
"installedAt": " instalado em ",
|
||||
"installTheWorktrunkBinaryBelowToEnableThis": "Instale o binário do worktrunk abaixo para ativar esta integração.",
|
||||
"installWorktrunk": "Instalar binário do worktrunk",
|
||||
"keepsProgressMovingBySwitchingToFusionApos": " mantém o progresso em andamento ao alternar para o backend de worktree integrado do Fusion. ",
|
||||
"limitsTotalGitWorktreesIncludingInReviewTasks": "Limita o total de worktrees do git, incluindo tarefas em revisão. Padrão: 4.",
|
||||
"maxWorktrees": "Máximo de worktrees",
|
||||
"worktreeLimitEnabled": "Limitar worktrees simultâneas",
|
||||
"worktreeLimitEnabledHelp": "Quando ativado, o Máximo de worktrees limita quantas tarefas podem ocupar uma worktree ao mesmo tempo. Quando desativado, o Máximo de tarefas simultâneas passa a ser o único limite. De qualquer forma, as tarefas sempre são executadas em sua própria worktree do git — isso não muda onde o trabalho é executado. Padrão: ativado.",
|
||||
"offByDefaultOptInWhenEnabledCompleted": "Desativado por padrão (opcional). Quando ativado, as worktrees de tarefas concluídas voltam para um pool ocioso em vez de serem excluídas, preservando caches de build para uma inicialização mais rápida. Mutuamente exclusivo com a nomeação de worktree por ID da tarefa.",
|
||||
"recycleNotApplicableWithTaskIdNaming": "Não disponível com a nomeação de worktree por ID da tarefa — esse modo fixa cada tarefa ao seu próprio diretório de worktree, o que é mutuamente exclusivo com o pool de reciclagem. Altere a nomeação para Aleatório ou Título da tarefa para ativar a reciclagem.",
|
||||
"openApprovals": "Abrir aprovações",
|
||||
"optionalLeaveBlankToAutoResolveFusionWill": "Opcional. Deixe em branco para resolução automática; o Fusion vai oferecer para instalar no primeiro uso.",
|
||||
"optionalSupports": " Opcional. Compatível com ",
|
||||
"pnpmInstallFrozenLockfile": "pnpm install --frozen-lockfile",
|
||||
"randomNamesEGSwiftFalcon": "Nomes aleatórios (ex.: swift-falcon)",
|
||||
"rebaseFromRemoteBeforeMerge": " Rebase do remoto antes do merge ",
|
||||
"rebaseRemote": "Remoto para rebase",
|
||||
"recycleWorktrees": " Reciclar worktrees ",
|
||||
"selectWorktreesDir": "Selecionar diretório de worktrees",
|
||||
"shellCommandToRunInEachNewWorktree": "Comando de shell a ser executado em cada nova worktree após a criação. Sem padrão — não definido.",
|
||||
"stopsOnWorktrunkErrorsForExplicitOperatorRecovery": " interrompe diante de erros do worktrunk para recuperação explícita pelo operador; ",
|
||||
"taskIDEGFN042": "ID da tarefa (ex.: FN-042)",
|
||||
"taskTitleEGFixLoginBug": "Título da tarefa (ex.: fix-login-bug)",
|
||||
"tryAgain": "Tentar novamente",
|
||||
"useGitDefault": "Usar padrão do git",
|
||||
"whenEnabledTheMergerFetchesFromTheConfigured": "Quando ativado, o merger busca (fetch) no remoto configurado e faz o rebase da branch da tarefa sobre a ponta mais recente da branch padrão antes do merge — capturando pushes simultâneos de outros colaboradores ou workers do Fusion. Quaisquer conflitos revelados pelo rebase seguem para o pipeline existente de resolução inteligente/IA. Padrão: ativado.",
|
||||
"whenUnsetOnlyAffectsNewlyCreatedWorktrees": " quando não definido. Afeta apenas worktrees recém-criadas. ",
|
||||
"whichRemoteToFetchForThePreMerge": " De qual remoto buscar (fetch) para o rebase pré-merge. \"Usar padrão do git\" recorre ao remoto configurado para a branch padrão (normalmente ",
|
||||
"worktreeInitCommand": "Comando de inicialização de worktree",
|
||||
"worktreeNamingStyle": "Estilo de nomeação de worktree",
|
||||
"worktrees": "Worktrees",
|
||||
"worktreesDirectory": "Diretório de worktrees",
|
||||
"worktrunk": " worktrunk ",
|
||||
"worktrunkBinaryPath": "Caminho do binário do worktrunk",
|
||||
"worktrunkFailureBehavior": "Comportamento em caso de falha do worktrunk",
|
||||
"worktrunkIntegration": "Integração com o worktrunk",
|
||||
"worktreesPickerNote": "Navegue até a pasta onde o Fusion deve criar as worktrees das tarefas e selecione o diretório atual.",
|
||||
"showWorktreeGroupingHelp": "Desativado por padrão. Quando ativado, as colunas de WIP e de processamento sempre agrupam as tarefas por worktree e exibem os nomes das worktrees, incluindo colunas de processamento no modo fluxo de trabalho.",
|
||||
"copyFilesHelp": "Opcional. Arquivos comuns relativos à raiz do repositório são copiados para worktrees novas ou reaproveitadas do pool antes da execução dos comandos de inicialização. Arquivos ou diretórios ausentes são ignorados sem expor o conteúdo. Padrão: vazio (nenhum arquivo copiado).",
|
||||
"namingStyleNotApplicableWhenRecycling": "O estilo de nomeação não se aplica ao reciclar worktrees — as worktrees do pool mantêm os nomes existentes. \"ID da tarefa\" não está disponível aqui porque worktrees fixadas a uma tarefa são mutuamente exclusivas com a reciclagem; desative Reciclar worktrees para usá-lo.",
|
||||
"howToNameFreshWorktreeDirectories": "Como nomear novos diretórios de worktree. Aplica-se apenas quando a reciclagem está desativada. \"ID da tarefa\" também fixa cada tarefa ao seu próprio diretório de worktree durante todo o seu ciclo de vida (mutuamente exclusivo com a reciclagem). Padrão: aleatório."
|
||||
},
|
||||
"configVersions": {
|
||||
"title": "Versões de configuração",
|
||||
"description": "Restaura qualquer versão de configuração do projeto registrada.",
|
||||
"loading": "Carregando versões…",
|
||||
"loadError": "Não foi possível carregar as versões de configuração",
|
||||
"rollbackError": "Não foi possível reverter a configuração",
|
||||
"empty": "Ainda não há versões de configuração.",
|
||||
"rollback": "Reverter",
|
||||
"rollingBack": "Revertendo…",
|
||||
"confirmTitle": "Reverter a configuração?",
|
||||
"confirmMessage": "Restaurar esta versão? A reversão é registrada como uma nova versão.",
|
||||
"confirmRollback": "Reverter"
|
||||
},
|
||||
"mcp": {
|
||||
"globalTitle": "Servidores MCP globais",
|
||||
"projectTitle": "Servidores MCP do projeto",
|
||||
@@ -7243,6 +6757,39 @@
|
||||
"quickAddSubmitOnEnter": "",
|
||||
"quickAddSubmitOnEnterHint": ""
|
||||
},
|
||||
"nodeSync": {
|
||||
"alwaysAsk": "Sempre perguntar",
|
||||
"automaticallySynchronizeSettingsBetweenThisNodeAndConnected": "Sincroniza automaticamente as configurações entre este nó e os nós remotos conectados. Padrão: desativado.",
|
||||
"conflictResolution": "Resolução de conflitos",
|
||||
"enableAutomaticSettingsSync": " Ativar sincronização automática de configurações ",
|
||||
"every15Minutes": "A cada 15 minutos",
|
||||
"every1Hour": "A cada 1 hora",
|
||||
"every30Minutes": "A cada 30 minutos",
|
||||
"every5Minutes": "A cada 5 minutos",
|
||||
"includeAPIKeysAndOAuthTokensInSync": "Inclui chaves de API e tokens OAuth nas operações de sincronização. Padrão: desativado.",
|
||||
"keepLocal": "Manter local",
|
||||
"keepRemote": "Manter remoto",
|
||||
"lastWriteWins": "A última gravação prevalece",
|
||||
"nodeSync": "Sincronização de nós",
|
||||
"syncInterval": "Intervalo de sincronização",
|
||||
"syncModelAuthCredentials": " Sincronizar credenciais de autenticação de modelo ",
|
||||
"workflowSettingsNotSynced": "As configurações de fluxo de trabalho ainda não são sincronizadas entre nós.",
|
||||
"syncIntervalHint": "Padrão: a cada 15 minutos.",
|
||||
"conflictResolutionHint": "Padrão: a última gravação prevalece."
|
||||
},
|
||||
"nodeRouting": {
|
||||
"blockExecution": "Bloquear execução",
|
||||
"configureHowTasksAreRoutedToExecutionNodes": "Configure como as tarefas são roteadas para os nós de execução.",
|
||||
"defaultExecutionNode": "Nó de execução padrão",
|
||||
"fallBackToLocal": "Retornar ao local",
|
||||
"localExecutionNoDefaultNode": "Execução local (sem nó padrão)",
|
||||
"nodeRouting": "Roteamento de nós",
|
||||
"selectedNode": "Nó selecionado:",
|
||||
"theseSettingsApplyAtTheProjectLevel": "Essas configurações se aplicam no nível do projeto.",
|
||||
"unavailableNodePolicy": "Política de nó indisponível",
|
||||
"usedWhenATaskHasNoNodeOverride": "Usado quando uma tarefa não tem substituição de nó. O status do nó é exibido para uma seleção de roteamento mais segura. Sem padrão — não definido (execução local).",
|
||||
"unavailableNodePolicyHint": "Padrão: bloquear execução."
|
||||
},
|
||||
"notifications": {
|
||||
"accessTokenOptional": "Token de acesso (opcional)",
|
||||
"agentClarification": "Esclarecimento do agente",
|
||||
@@ -8865,6 +8412,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -10169,5 +9723,11 @@
|
||||
"untitledSection": "",
|
||||
"sectionCount": "",
|
||||
"sectionCountPlural": ""
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6285,8 +6285,7 @@
|
||||
"openRouterRoutingOnlyHint": "",
|
||||
"openRouterAllowFallbacksHint": "",
|
||||
"openRouterRoutingSortHint": "",
|
||||
"requireParametersHint": "",
|
||||
"modelOverrides": ""
|
||||
"requireParametersHint": ""
|
||||
},
|
||||
"header": {
|
||||
"discord": "Discord",
|
||||
@@ -6749,11 +6748,7 @@
|
||||
"executorEscalationModel": "",
|
||||
"executorEscalationModelHelp": "",
|
||||
"selectExecutorEscalationModel": "",
|
||||
"noExecutorEscalationModel": "",
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"summarizationPointer": ""
|
||||
"noExecutorEscalationModel": ""
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": "",
|
||||
@@ -8407,6 +8402,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9721,5 +9723,11 @@
|
||||
"untitledSection": "",
|
||||
"sectionCount": "",
|
||||
"sectionCountPlural": ""
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6285,8 +6285,7 @@
|
||||
"openRouterRoutingOnlyHint": "",
|
||||
"openRouterAllowFallbacksHint": "",
|
||||
"openRouterRoutingSortHint": "",
|
||||
"requireParametersHint": "",
|
||||
"modelOverrides": ""
|
||||
"requireParametersHint": ""
|
||||
},
|
||||
"header": {
|
||||
"discord": "Discord",
|
||||
@@ -6749,11 +6748,7 @@
|
||||
"executorEscalationModel": "",
|
||||
"executorEscalationModelHelp": "",
|
||||
"selectExecutorEscalationModel": "",
|
||||
"noExecutorEscalationModel": "",
|
||||
"modelOverrides": "",
|
||||
"projectLanesSubheading": "",
|
||||
"workflowLanesSubheading": "",
|
||||
"summarizationPointer": ""
|
||||
"noExecutorEscalationModel": ""
|
||||
},
|
||||
"remote": {
|
||||
"acceptRoutes": "",
|
||||
@@ -8407,6 +8402,13 @@
|
||||
"lockState": "",
|
||||
"relockChanged": "",
|
||||
"retainedHistory": ""
|
||||
},
|
||||
"aiMergeReview": {
|
||||
"title": "",
|
||||
"approvedWithPending": "",
|
||||
"candidate": "",
|
||||
"dismissFinding": "",
|
||||
"terminalGuidance": ""
|
||||
}
|
||||
},
|
||||
"taskDocuments": {
|
||||
@@ -9721,5 +9723,11 @@
|
||||
"untitledSection": "",
|
||||
"sectionCount": "",
|
||||
"sectionCountPlural": ""
|
||||
},
|
||||
"artifactImageViewer": {
|
||||
"openTask": "",
|
||||
"close": "",
|
||||
"loading": "",
|
||||
"retry": ""
|
||||
}
|
||||
}
|
||||
|
||||