diff --git a/packages/experimental/client-ui-perf/README.i18n.yaml b/packages/experimental/client-ui-perf/README.i18n.yaml index cb9d0534e0..bd702825d2 100644 --- a/packages/experimental/client-ui-perf/README.i18n.yaml +++ b/packages/experimental/client-ui-perf/README.i18n.yaml @@ -24,8 +24,8 @@ en: e001601f2f9779b1 zh: 077d3703b8c82774 /deepseek-ai-dsh-experimental-client-ui-perf/understand-the-implementation: - en: 80c2978c6b7ddd6b - zh: bd4376c4227f70c1 + en: d02927ce3b537962 + zh: 4d0b9ba1ec299a1a /deepseek-ai-dsh-experimental-client-ui-perf/further-exploration: en: 285cfe1d7a99af34 zh: fbcee76e0c2f20fb @@ -36,8 +36,8 @@ en: 7605bb868f93b4a8 zh: 184ca10ce6680499 /deepseek-ai-dsh-experimental-client-ui-perf/known-limitations-and-deferred-work: - en: e1dde4c057483bd0 - zh: ba1434160270c08a + en: 24c5100faa25e5e2 + zh: 32eb34792b910607 /deepseek-ai-dsh-experimental-client-ui-perf/known-limitations-and-deferred-work/dev-note: en: 3518dbaf30fb19a6 zh: 73565f0bcc32a364 diff --git a/packages/experimental/client-ui-perf/README.md b/packages/experimental/client-ui-perf/README.md index 65a8962e23..6eef8a8674 100644 --- a/packages/experimental/client-ui-perf/README.md +++ b/packages/experimental/client-ui-perf/README.md @@ -60,7 +60,7 @@ Six Conversation Definitions fold the event window into nodes for one view targe | `src/client/perf-totals.ts` | Whole-session totals from the host stats and token-usage projections | | `src/client/perf-snapshot-builder.ts` | The `perf` view target builder | | `src/client/PerfView.tsx` | Scrollport with scroll-to-top paging, table, totals and event rows, time bars, step/tool/answer details, copy controls, and the prompt image pill with its preview and viewer | -| `src/client/locales.ts` | Every visible string; Chinese and Japanese are translated, while German, Spanish, French, Portuguese, and Russian currently ship the English fallback | +| `src/client/locales.ts` | Every visible string in all eight shipped languages | The footer switches control the totals row, event rows, and the context basis, and the footer stays pinned above the composer while the table scrolls. `Show context delta` is off by default; when on, every turn and step shows its prompt-size change against the previous measured value in that scope, with negative deltas (for example after compaction) in the error colour. An expanded step row fills the Trigger column with its start timestamp (`MM-DD HH:MM:SS.mmm`; the tooltip carries the full `YYYY-MM-DD HH:MM:SS.mmm`) and any gap of at least one second since the previous step; sub-second scheduler noise is hidden. A step carrying a model answer is expandable: clicking its row opens a detail row that renders the answer as Markdown through the shared Chat primitive, capped at 16,000 characters with a truncation notice. @@ -101,7 +101,6 @@ No effect. The package never constructs a model request and never mutates a prom - **Not mounted by the default product.** The Web bundle refuses experimental packages by rule; the optional Developer tools bundle (`@deepseek-ai/dsh-experimental-inspector-profile`) mounts this view, or a profile can add the row explicitly. - **Trimmed windows lose start times.** When the loaded window begins mid-step, first-token, model time, and total time cannot be derived; the row says `start unknown` instead of estimating. - **Code-Mode dispatches merge by root-call context.** Inner calls carry no turn or step, so each root call opens its own context keyed by the root call id, and the builder merges its dispatches into the step that owns the runner. A window that lost the dispatch start still merges the calls but cannot show their measured duration. -- **Five shipped locales fall back to English.** German, Spanish, French, Portuguese, and Russian dictionaries and metadata ship now so shipped-language gates pass, but their strings are currently English copies. - **Older-page retries are explicit.** A page request reports `grew`, `exhausted`, or `retry`; when Chat or Trajectory owns the Session's in-flight page, the Statistics trigger stays visible instead of marking history exhausted or throwing. - **Known limitation: no whole-session wall projection.** The totals row substitutes model time + tool time because the host projections expose no whole-session wall clock. The tool segment sums paired call durations, so parallel calls can make that split look longer than a non-overlapping wall interval. This is recorded here; the view does not change host logic to fill the gap. - **Browser evidence is a test-only overlay.** Package tests cover folding, aggregation, formatting, and the jsdom table; `apps/web/tests/client-ui-perf-panel.e2e.ts` mounts the plugin through a test-only overlay over the shipped Web surface and compares a committed ARIA golden. No recorded-session scenario exists. diff --git a/packages/experimental/client-ui-perf/README.zh.md b/packages/experimental/client-ui-perf/README.zh.md index 0b636a9308..4740cd1b44 100644 --- a/packages/experimental/client-ui-perf/README.zh.md +++ b/packages/experimental/client-ui-perf/README.zh.md @@ -60,7 +60,7 @@ kind: "package-reference" | `src/client/perf-totals.ts` | 从宿主 stats 与 tokenUsage projection 生成全量合计 | | `src/client/perf-snapshot-builder.ts` | `perf` 视图目标的增量 builder | | `src/client/PerfView.tsx` | 表格、合计/事件行、时间条、步骤/工具/回答详情、复制按钮,以及提问图片标签、预览与看图器 | -| `src/client/locales.ts` | 全部可见文案;中、日已翻译,德、西、法、葡、俄当前使用英文 fallback | +| `src/client/locales.ts` | 全部可见文案,覆盖 8 种 shipped 语言 | 页脚的开关控制合计行、事件行与上下文口径,滚表格时页脚钉在输入框上方。「显示上下文增量」默认关闭;打开后每轮/每步显示相对同范围内上一个已测值的提示词大小变化,负增量(例如压缩后)用错误色显示。展开的步骤行在「触发」列显示该步开始时间戳(`MM-DD HH:MM:SS.mmm`,tooltip 为完整的 `YYYY-MM-DD HH:MM:SS.mmm`),以及距上一步至少一秒的空闲;亚秒级调度噪声不显示。带模型回答的步骤也可以展开:点击该行会打开详情行,通过共享的 Chat Markdown 原语渲染回答,最多保留 16,000 字符并提示截断。 @@ -101,7 +101,6 @@ kind: "package-reference" - **默认产品不挂载。** Web 包按规则拒绝引用 experimental 包;可选的「开发者工具」组合包(`@deepseek-ai/dsh-experimental-inspector-profile`)会挂载本视图,也可以由 profile 显式添加。 - **窗口被截断时没有起始时刻。** 已加载窗口从半步中间开始时,首 token、模型用时和总用时都推导不出来;行上标「起止未知」,不估算。 - **Code-Mode 内层调用按根调用上下文并回步骤。** 内层调用不带 turn/step,因此每个根调用各自开一个以 root call id 为键的上下文,由 builder 把它的派发并回持有 runner 的那一步。窗口里丢了派发起点时仍会合并调用,但无法给出它们各自的实测耗时。 -- **五种 shipped locale 仍使用英文 fallback。** 德、西、法、葡、俄的字典和 metadata 目前是英文副本,先满足 shipped-language 门禁;这些语言下的界面文案仍为英文。 - **更早历史的加载结果显式区分重试。** 页面请求只返回 `grew`、`exhausted` 或 `retry`;如果 Chat 或轨迹视图正在加载同一个 Session 的页,统计视图会保留加载按钮,而不是误报历史已耗尽或抛出错误。 - **已知限制:没有整段墙钟 projection。** 合计行的总用时用模型用时 + 工具用时替代,因为宿主 projection 没有整段墙钟;工具段是逐调用求和,并行调用会让这段显得比非重叠墙钟更长。这里作为已知限制记录,插件不为此改动宿主逻辑。 - **浏览器证据是仅测试用的 overlay。** 包级测试覆盖折叠、汇总、格式化与 jsdom 表格;`apps/web/tests/client-ui-perf-panel.e2e.ts` 用仅测试用的 overlay 把插件挂到真实 Web 面上,并比对提交的 ARIA golden。由于还没有任何 shipped profile 挂载本包,暂无录制会话场景。 diff --git a/packages/experimental/client-ui-perf/src/client/locales.ts b/packages/experimental/client-ui-perf/src/client/locales.ts index 2e1ed01adb..e40a0cc2b2 100644 --- a/packages/experimental/client-ui-perf/src/client/locales.ts +++ b/packages/experimental/client-ui-perf/src/client/locales.ts @@ -568,922 +568,907 @@ export const ja: Record = { 'steps.matched': '{count} ステップが {tool} を使用', } -/** Spanish dictionary; ships the English fallback until translated. */ +/** Spanish dictionary. */ export const es: Record = { - 'view.perf': 'Statistics', - 'column.scope': 'Turn / step', - 'column.scope.title': 'A turn row holds the turn total; click a row to expand or collapse its steps', - 'column.prompt': 'Trigger', - 'column.prompt.title': 'What opened this turn: a human prompt shows its text, automation shows a source badge', - 'trigger.agent-message': 'Agent message', - 'trigger.team-message': 'Team message', - 'trigger.schedule': 'Scheduled', + 'view.perf': 'Estadísticas', + 'column.scope': 'Turno / paso', + 'column.scope.title': 'La fila de un turno contiene su total; haz clic en una fila para expandir o contraer sus pasos', + 'column.prompt': 'Disparador', + 'column.prompt.title': 'Qué abrió este turno: un prompt humano muestra su texto y una automatización muestra una etiqueta de origen', + 'trigger.agent-message': 'Mensaje del agente', + 'trigger.team-message': 'Mensaje del equipo', + 'trigger.schedule': 'Programado', 'trigger.webhook': 'Webhook', - 'trigger.tool-jobs': 'Background job', - 'trigger.cordis-host-runner': 'Plugin run', - 'trigger.subagent-settled': 'Subagent finished', - 'trigger.goal': 'Goal round', - 'trigger.context': 'Context wake', - 'trigger.other': 'Automated turn', - 'column.did': 'Execution', - 'column.did.title': 'Tools this step called and how often; a step without tool calls previews its answer text', - 'column.context': 'Context', - 'column.context.title': 'usage input tokens + cache read + cache write', - 'column.output': 'Output', - 'column.output.title': 'usage output tokens of the step', - 'column.cache': 'Cache hit', - 'column.cache.title': 'cache read ÷ (input + cache read + cache write): the share of the prompt served from cache', - 'cache.detail': 'cache read {read} · input {input} · cache write {write}', - 'column.ttft': 'First token', - 'column.ttft.title': 'step start to the first output fragment (TTFT)', - 'column.model': 'Model time', - 'column.model.title': 'step start to the settled reply (includes the first-token delay)', - 'column.tps': 'Output speed', - 'column.tps.title': 'output tokens ÷ generation seconds (TPS, tok/s)', - 'column.tool': 'Tool time', - 'column.tool.title': 'sum of every tool call up to its result inside the step; calls without a result are excluded', - 'column.time': 'Total time', - 'column.time.title': 'total split: light blue first token, blue generation, orange tool calls, gray everything else. Bar length uses a square-root scale; steps compare only with steps of the same turn, turns with turns', - 'turn.label': 'Turn {turn}', - 'step.label': 'Step {step}', - 'step.toggle.aria': 'Expand or collapse the tool details of step {step}', - 'step.partial': 'start unknown', - 'step.started.title': 'Step started at {time}', - 'compaction.label': 'Compaction', - 'compaction.running': 'Compacting…', - 'compaction.shadowed': 'Pruned {tokens} tokens of history', - 'compaction.summary': 'Summary {chars} chars', - 'compaction.title': "Compaction runs are shown separately and excluded from the turn's step totals", - 'event.show': 'Show event rows (incl. compaction)', - 'context.delta.show': 'Show context delta', - 'context.delta.title': 'Prompt delta against the previous measured step in the turn; negative means the context shrank (for example after compaction)', - 'event.request-header': 'Request header', - 'event.system-prompt': 'System prompt', - 'event.tool-set': 'Tool set change', - 'event.context-prune': 'Context prune', - 'event.request-context': 'Request context', - 'event.model-retry': 'Model retry', - 'event.model-attempt': 'Model attempt', - 'event.context-refresh': 'Context refresh', - 'event.approval': 'Approval', - 'event.context.detail': '{provider} / {model} · prompt mode {mode}', - 'event.retry.detail': 'retry {retry} · wait {delay}', - 'event.attempt.detail': 'Model attempt without a committed message', - 'event.refresh.detail': '{source} · {chars} chars', + 'trigger.tool-jobs': 'Tarea en segundo plano', + 'trigger.cordis-host-runner': 'Ejecución de plugin', + 'trigger.subagent-settled': 'Subagente finalizado', + 'trigger.goal': 'Ronda de objetivo', + 'trigger.context': 'Reactivación por contexto', + 'trigger.other': 'Turno automatizado', + 'column.did': 'Ejecución', + 'column.did.title': 'Herramientas que llamó este paso y con qué frecuencia; un paso sin llamadas a herramientas muestra un extracto del texto de su respuesta', + 'column.context': 'Contexto', + 'column.context.title': 'tokens de entrada de usage + lectura de caché + escritura de caché', + 'column.output': 'Salida', + 'column.output.title': 'tokens de salida de usage en el paso', + 'column.cache': 'Acierto de caché', + 'column.cache.title': 'lectura de caché ÷ (entrada + lectura de caché + escritura de caché): la proporción del prompt servida desde la caché', + 'cache.detail': 'lectura de caché {read} · entrada {input} · escritura de caché {write}', + 'column.ttft': 'Primer token', + 'column.ttft.title': 'inicio del paso hasta el primer fragmento de salida (TTFT)', + 'column.model': 'Tiempo del modelo', + 'column.model.title': 'inicio del paso hasta la respuesta completa (incluye la latencia del primer token)', + 'column.tps': 'Velocidad de salida', + 'column.tps.title': 'tokens de salida ÷ segundos de generación (TPS, tok/s)', + 'column.tool': 'Tiempo de herramientas', + 'column.tool.title': 'suma del tiempo de cada llamada a herramienta hasta su resultado dentro del paso; las llamadas sin resultado no cuentan', + 'column.time': 'Tiempo total', + 'column.time.title': 'desglose del total: azul claro el primer token, azul la generación, naranja las llamadas a herramientas y gris el resto. La longitud de la barra usa una escala de raíz cuadrada; los pasos solo se comparan con pasos del mismo turno y los turnos entre sí', + 'turn.label': 'Turno {turn}', + 'step.label': 'Paso {step}', + 'step.toggle.aria': 'Expandir o contraer los detalles de herramientas del paso {step}', + 'step.partial': 'inicio desconocido', + 'step.started.title': 'El paso comenzó a las {time}', + 'compaction.label': 'Compactación', + 'compaction.running': 'Compactando…', + 'compaction.shadowed': 'Se recortaron {tokens} tokens del historial', + 'compaction.summary': 'Resumen de {chars} caracteres', + 'compaction.title': 'Las ejecuciones de compactación se muestran por separado y quedan fuera de los totales de pasos del turno', + 'event.show': 'Mostrar filas de eventos (incl. compactación)', + 'context.delta.show': 'Mostrar delta de contexto', + 'context.delta.title': 'Delta del prompt respecto al paso medido anterior del turno; un valor negativo indica que el contexto se redujo (por ejemplo, tras una compactación)', + 'event.request-header': 'Encabezado de la solicitud', + 'event.system-prompt': 'Prompt del sistema', + 'event.tool-set': 'Cambio del conjunto de herramientas', + 'event.context-prune': 'Recorte de contexto', + 'event.request-context': 'Contexto de la solicitud', + 'event.model-retry': 'Reintento de modelo', + 'event.model-attempt': 'Intento de modelo', + 'event.context-refresh': 'Actualización de contexto', + 'event.approval': 'Aprobación', + 'event.context.detail': '{provider} / {model} · modo de prompt {mode}', + 'event.retry.detail': 'reintento {retry} · espera {delay}', + 'event.attempt.detail': 'Intento de modelo sin mensaje confirmado', + 'event.refresh.detail': '{source} · {chars} caracteres', 'event.approval.detail': '{tool} · {status}', - 'event.source.runtime': 'runtime context', - 'event.source.time': 'time context', - 'event.approval.asked': 'waiting', - 'event.approval.allowed': 'allowed once', - 'event.approval.rejected': 'rejected', - 'event.approval.cancelled': 'cancelled', - 'event.approval.unavailable': 'unavailable', - 'event.title': 'Non-step event rows: request, prompt, tool-set, retry, context-refresh, approval, and prune changes excluded from the turn step totals', - 'event.reason.initial': 'initial', - 'event.reason.resume': 'resume', - 'event.reason.change': 'change', - 'event.reason.series': 'new series', - 'event.header.detail': '{reason} · {tools} tools', - 'event.series': 'new series', - 'event.system.append': 'append', - 'event.system.replace': 'replace', - 'event.system.clear': 'clear', - 'event.system.detail': '{action} · {chars} chars', - 'event.tools.added': 'added {tools}', - 'event.tools.removed': 'removed {tools}', - 'event.prune.detail': 'pruned {tokens} tokens', - - - 'step.partial.title': 'This step\'s start and end events are not in the current event window (trimmed while the tab reconnected or the window was rebuilt), so first-token, model time and total have no start to subtract from; reloading the tab reassembles from the full window', - 'state.running': 'running', - 'state.interrupted': 'interrupted', - 'state.cacheMiss': 'cache miss', - 'state.cacheMiss.title': 'The prompt barely hit the cache: usually the first request after a restart or a session resume, paid at full input price', - 'state.aborted': 'unsettled', - 'state.aborted.title': 'The step closed without a settled reply (usually cancelled or failed)', - 'unknown': 'not recorded', - 'partial': '{count} tool calls have no result yet; this is the lower bound of known time', - 'empty': 'No measurable step in the current window.', - 'loadOlder': 'Load earlier', - 'loadOlder.loading': 'Loading earlier turns…', - 'loadOlder.done': 'Beginning of history reached', - 'loadOlder.failed': 'Load failed, retry', - 'summary': '{turns} turns · {steps} steps', - 'table.showTotals': 'Show total row', - 'contextMode.label': 'Context basis', - 'contextMode.latest': 'Latest', - 'contextMode.latest.title': "Turn rows show the last measured step's prompt size (final context); the total row stays cumulative", - 'contextMode.cumulative': 'Cumulative', - 'contextMode.cumulative.title': "Turn rows show the sum of prompt sizes across the turn's steps (cumulative processing); the total row stays cumulative", - 'totals.full': 'Whole-session total', - 'totals.full.title': 'Totals for the complete session; total time is model time + tool time (no inter-turn gaps)', - 'totals.window': 'Window total', - 'totals.window.title': 'Totals for the turns loaded in this window; the context cell is cumulative across steps', - - 'expand.all': 'Expand all', - 'collapse.all': 'Collapse all', - 'turn.expand': 'Show', - 'turn.collapse': 'Hide', - 'turn.toggle.title': 'Expand or collapse the steps of this turn', - 'turn.toggle.aria': 'Expand or collapse turn {turn}', - 'did.answer': 'answer', - 'did.working': 'generating', - 'did.aborted': 'no answer', - 'did.more': '{count} more', - 'did.rest': '{count} more calls', - 'did.title': '{calls} calls: {tools}', - 'did.retry': 'retried {count}×', - 'did.lines': '{lines} lines', - 'did.lines.unit': 'lines', - 'did.chars': '{chars} chars', - 'did.output': '→ {chars} chars', - 'did.total': '{chars} characters of tool output in this step; they become part of the next prompt', - 'detail.show': 'details', - 'detail.hide': 'hide', - 'detail.title': 'Click this row to expand or collapse the tool details', - 'detail.calls': '{count} tool calls', - 'detail.answer': 'Answer', - 'detail.answer.truncated': 'Answer is long; only the first 16,000 chars are kept', - 'detail.code.title': 'Code block', - 'detail.code.wrap': 'Wrap lines', - 'detail.code.unwrap': 'Do not wrap', - 'detail.footnotes': 'Footnotes', - 'detail.copy': 'Copy', - 'detail.copy.title': 'Copy this text', - 'detail.copied': 'Copied', - 'detail.copyFailed': 'Copy failed', - 'detail.chars': '{chars} chars', - 'detail.lines': '{lines} lines', - 'detail.file': 'file', - 'detail.diff': 'change', - 'detail.emptyBody': 'This call left no text', - 'detail.hidden': '{count} more calls are not listed (at most {limit} per step)', - 'detail.args': 'raw arguments', - 'detail.wrap': 'Wrap', - 'detail.wrap.title': 'Wrap long lines instead of scrolling sideways', - 'detail.raw.title': 'Show the raw JSON arguments', - 'detail.lineCap': 'Showing the first {shown} of {total} lines', - 'detail.truncated': 'Too long: only the first {chars} characters are kept', - 'tool.failed': '{count} failed', - 'tool.failed.title': '{count} tool calls in this step returned an error result', - 'bar.ttft': 'first token {value}', - 'bar.gen': 'generation {value}', - 'bar.tool': 'tool calls {value}', - 'bar.rest': 'other {value}', + 'event.source.runtime': 'contexto de ejecución', + 'event.source.time': 'contexto de tiempo', + 'event.approval.asked': 'en espera', + 'event.approval.allowed': 'permitido una vez', + 'event.approval.rejected': 'rechazado', + 'event.approval.cancelled': 'cancelado', + 'event.approval.unavailable': 'no disponible', + 'event.title': 'Filas de eventos que no son pasos: cambios de solicitud, prompt, conjunto de herramientas, reintento, actualización de contexto, aprobación y recorte, que quedan fuera de los totales de pasos del turno', + 'event.reason.initial': 'inicial', + 'event.reason.resume': 'reanudación', + 'event.reason.change': 'cambio', + 'event.reason.series': 'nueva serie', + 'event.header.detail': '{reason} · {tools} herramientas', + 'event.series': 'nueva serie', + 'event.system.append': 'añadido', + 'event.system.replace': 'reemplazado', + 'event.system.clear': 'vaciado', + 'event.system.detail': '{action} · {chars} caracteres', + 'event.tools.added': 'añadidas {tools}', + 'event.tools.removed': 'eliminadas {tools}', + 'event.prune.detail': 'recortados {tokens} tokens', + 'step.partial.title': 'Los eventos de inicio y fin de este paso no están en la ventana de eventos actual (se recortaron al reconectar la pestaña o reconstruir la ventana), así que no hay un inicio desde el que calcular el primer token, el tiempo de modelo ni el tiempo total; al recargar la pestaña se reconstruye desde la ventana completa', + 'state.running': 'en curso', + 'state.interrupted': 'interrumpido', + 'state.cacheMiss': 'fallo de caché', + 'state.cacheMiss.title': 'El prompt apenas acertó en la caché: normalmente es la primera solicitud tras un reinicio o una reanudación de sesión, y su entrada se cobra a precio completo', + 'state.aborted': 'sin concluir', + 'state.aborted.title': 'El paso terminó sin una respuesta completa (normalmente cancelado o fallido)', + 'unknown': 'sin registro', + 'partial': '{count} llamadas a herramientas aún no tienen resultado; este es el límite inferior del tiempo conocido', + 'empty': 'No hay pasos medibles en la ventana actual.', + 'loadOlder': 'Cargar anteriores', + 'loadOlder.loading': 'Cargando turnos anteriores…', + 'loadOlder.done': 'Se alcanzó el inicio del historial', + 'loadOlder.failed': 'Error al cargar, reintentar', + 'summary': '{turns} turnos · {steps} pasos', + 'table.showTotals': 'Mostrar fila de totales', + 'contextMode.label': 'Base del contexto', + 'contextMode.latest': 'Último', + 'contextMode.latest.title': 'Las filas de cada turno muestran el tamaño de prompt del último paso medido (contexto final); la fila de totales sigue siendo acumulada', + 'contextMode.cumulative': 'Acumulado', + 'contextMode.cumulative.title': 'Las filas de cada turno muestran la suma de los tamaños de prompt de los pasos del turno (procesamiento acumulado); la fila de totales sigue siendo acumulada', + 'totals.full': 'Total de toda la sesión', + 'totals.full.title': 'Totales de la sesión completa; el tiempo total es tiempo de modelo + tiempo de herramientas (sin huecos entre turnos)', + 'totals.window': 'Total de la ventana', + 'totals.window.title': 'Totales de los turnos cargados en esta ventana; la celda de contexto es acumulada entre pasos', + 'expand.all': 'Expandir todo', + 'collapse.all': 'Contraer todo', + 'turn.expand': 'Mostrar', + 'turn.collapse': 'Ocultar', + 'turn.toggle.title': 'Expandir o contraer los pasos de este turno', + 'turn.toggle.aria': 'Expandir o contraer el turno {turn}', + 'did.answer': 'respuesta', + 'did.working': 'generando', + 'did.aborted': 'sin respuesta', + 'did.more': '{count} más', + 'did.rest': '{count} llamadas más', + 'did.title': '{calls} llamadas: {tools}', + 'did.retry': 'reintentado {count}×', + 'did.lines': '{lines} líneas', + 'did.lines.unit': 'líneas', + 'did.chars': '{chars} caracteres', + 'did.output': '→ {chars} caracteres', + 'did.total': '{chars} caracteres de salida de herramientas en este paso; pasan a formar parte del siguiente prompt', + 'detail.show': 'detalles', + 'detail.hide': 'ocultar', + 'detail.title': 'Haz clic en esta fila para expandir o contraer los detalles de herramientas', + 'detail.calls': '{count} llamadas a herramientas', + 'detail.answer': 'Respuesta', + 'detail.answer.truncated': 'La respuesta es larga; solo se conservan los primeros 16.000 caracteres', + 'detail.code.title': 'Bloque de código', + 'detail.code.wrap': 'Ajustar líneas', + 'detail.code.unwrap': 'No ajustar', + 'detail.footnotes': 'Notas al pie', + 'detail.copy': 'Copiar', + 'detail.copy.title': 'Copiar este texto', + 'detail.copied': 'Copiado', + 'detail.copyFailed': 'Error al copiar', + 'detail.chars': '{chars} caracteres', + 'detail.lines': '{lines} líneas', + 'detail.file': 'archivo', + 'detail.diff': 'cambio', + 'detail.emptyBody': 'Esta llamada no dejó texto', + 'detail.hidden': 'Hay {count} llamadas más sin listar (máximo {limit} por paso)', + 'detail.args': 'argumentos originales', + 'detail.wrap': 'Ajustar', + 'detail.wrap.title': 'Ajusta las líneas largas en lugar de desplazarte en horizontal', + 'detail.raw.title': 'Mostrar los argumentos JSON originales', + 'detail.lineCap': 'Mostrando las primeras {shown} de {total} líneas', + 'detail.truncated': 'Demasiado largo: solo se conservan los primeros {chars} caracteres', + 'tool.failed': '{count} con error', + 'tool.failed.title': '{count} llamadas a herramientas de este paso devolvieron un error', + 'bar.ttft': 'primer token {value}', + 'bar.gen': 'generación {value}', + 'bar.tool': 'llamadas a herramientas {value}', + 'bar.rest': 'resto {value}', 'bar.wall': 'total {value}', - 'bar.running': 'not finished yet: this is elapsed time', - 'bar.gap': 'gap since previous step {value}', - 'bar.start': 'started {clock}', - 'turn.started': 'this turn started at {time}', - 'turn.images': '{count} images', - 'imagePreview.hint': 'Hover or focus to preview this turn\'s images; click to open the full image', - 'imagePreview.dialog': 'Image preview', - 'imagePreview.open': 'View image {index} of {count}', - 'imagePreview.alt': 'Image {index}', - 'imagePreview.loading': 'Loading image…', - 'imagePreview.failed': 'Image failed to load', - 'imagePreview.retry': 'Retry', - 'imagePreview.close': 'Close image preview', - 'steps.total': '{total} steps', - 'steps.tail': 'newest {limit} only', - 'steps.all': 'Show all {total} steps', - 'steps.filter': 'Only {tool}', - 'steps.clear': 'Clear filter', - 'steps.matched': '{count} steps used {tool}', + 'bar.running': 'aún sin terminar: este es el tiempo transcurrido', + 'bar.gap': 'intervalo desde el paso anterior {value}', + 'bar.start': 'inicio {clock}', + 'turn.started': 'este turno comenzó a las {time}', + 'turn.images': '{count} imágenes', + 'imagePreview.hint': 'Pasa el cursor o enfoca para previsualizar las imágenes de este turno; haz clic para abrir la imagen completa', + 'imagePreview.dialog': 'Vista previa de imagen', + 'imagePreview.open': 'Ver imagen {index} de {count}', + 'imagePreview.alt': 'Imagen {index}', + 'imagePreview.loading': 'Cargando imagen…', + 'imagePreview.failed': 'No se pudo cargar la imagen', + 'imagePreview.retry': 'Reintentar', + 'imagePreview.close': 'Cerrar vista previa de imagen', + 'steps.total': '{total} pasos', + 'steps.tail': 'solo los {limit} más recientes', + 'steps.all': 'Mostrar los {total} pasos', + 'steps.filter': 'Solo {tool}', + 'steps.clear': 'Quitar filtro', + 'steps.matched': '{count} pasos usaron {tool}', } -/** French dictionary; ships the English fallback until translated. */ +/** French dictionary. */ export const fr: Record = { - 'view.perf': 'Statistics', - 'column.scope': 'Turn / step', - 'column.scope.title': 'A turn row holds the turn total; click a row to expand or collapse its steps', - 'column.prompt': 'Trigger', - 'column.prompt.title': 'What opened this turn: a human prompt shows its text, automation shows a source badge', - 'trigger.agent-message': 'Agent message', - 'trigger.team-message': 'Team message', - 'trigger.schedule': 'Scheduled', + 'view.perf': 'Statistiques', + 'column.scope': 'Tour / étape', + 'column.scope.title': 'Une ligne de tour contient le total du tour ; cliquez sur une ligne pour développer ou réduire ses étapes', + 'column.prompt': 'Déclencheur', + 'column.prompt.title': 'Ce qui a ouvert ce tour : une invite humaine affiche son texte, une automatisation affiche un badge de source', + 'trigger.agent-message': 'Message de l\'agent', + 'trigger.team-message': 'Message d\'équipe', + 'trigger.schedule': 'Planifié', 'trigger.webhook': 'Webhook', - 'trigger.tool-jobs': 'Background job', - 'trigger.cordis-host-runner': 'Plugin run', - 'trigger.subagent-settled': 'Subagent finished', - 'trigger.goal': 'Goal round', - 'trigger.context': 'Context wake', - 'trigger.other': 'Automated turn', - 'column.did': 'Execution', - 'column.did.title': 'Tools this step called and how often; a step without tool calls previews its answer text', - 'column.context': 'Context', - 'column.context.title': 'usage input tokens + cache read + cache write', - 'column.output': 'Output', - 'column.output.title': 'usage output tokens of the step', - 'column.cache': 'Cache hit', - 'column.cache.title': 'cache read ÷ (input + cache read + cache write): the share of the prompt served from cache', - 'cache.detail': 'cache read {read} · input {input} · cache write {write}', - 'column.ttft': 'First token', - 'column.ttft.title': 'step start to the first output fragment (TTFT)', - 'column.model': 'Model time', - 'column.model.title': 'step start to the settled reply (includes the first-token delay)', - 'column.tps': 'Output speed', - 'column.tps.title': 'output tokens ÷ generation seconds (TPS, tok/s)', - 'column.tool': 'Tool time', - 'column.tool.title': 'sum of every tool call up to its result inside the step; calls without a result are excluded', - 'column.time': 'Total time', - 'column.time.title': 'total split: light blue first token, blue generation, orange tool calls, gray everything else. Bar length uses a square-root scale; steps compare only with steps of the same turn, turns with turns', - 'turn.label': 'Turn {turn}', - 'step.label': 'Step {step}', - 'step.toggle.aria': 'Expand or collapse the tool details of step {step}', - 'step.partial': 'start unknown', - 'step.started.title': 'Step started at {time}', - 'compaction.label': 'Compaction', - 'compaction.running': 'Compacting…', - 'compaction.shadowed': 'Pruned {tokens} tokens of history', - 'compaction.summary': 'Summary {chars} chars', - 'compaction.title': "Compaction runs are shown separately and excluded from the turn's step totals", - 'event.show': 'Show event rows (incl. compaction)', - 'context.delta.show': 'Show context delta', - 'context.delta.title': 'Prompt delta against the previous measured step in the turn; negative means the context shrank (for example after compaction)', - 'event.request-header': 'Request header', - 'event.system-prompt': 'System prompt', - 'event.tool-set': 'Tool set change', - 'event.context-prune': 'Context prune', - 'event.request-context': 'Request context', - 'event.model-retry': 'Model retry', - 'event.model-attempt': 'Model attempt', - 'event.context-refresh': 'Context refresh', - 'event.approval': 'Approval', - 'event.context.detail': '{provider} / {model} · prompt mode {mode}', - 'event.retry.detail': 'retry {retry} · wait {delay}', - 'event.attempt.detail': 'Model attempt without a committed message', - 'event.refresh.detail': '{source} · {chars} chars', + 'trigger.tool-jobs': 'Tâche en arrière-plan', + 'trigger.cordis-host-runner': 'Exécution de plugin', + 'trigger.subagent-settled': 'Sous-agent terminé', + 'trigger.goal': 'Tour d\'objectif', + 'trigger.context': 'Réveil du contexte', + 'trigger.other': 'Tour automatique', + 'column.did': 'Exécution', + 'column.did.title': 'Outils appelés par cette étape et leur nombre ; une étape sans appel d\'outil affiche un aperçu du texte de sa réponse', + 'column.context': 'Contexte', + 'column.context.title': 'jetons d\'entrée usage + lecture du cache + écriture du cache', + 'column.output': 'Sortie', + 'column.output.title': 'jetons de sortie usage de l\'étape', + 'column.cache': 'Taux de cache', + 'column.cache.title': 'lecture du cache ÷ (entrée + lecture du cache + écriture du cache) : part de l\'invite servie depuis le cache', + 'cache.detail': 'lecture du cache {read} · entrée {input} · écriture du cache {write}', + 'column.ttft': 'Premier jeton', + 'column.ttft.title': 'début de l\'étape jusqu\'au premier fragment de sortie (TTFT)', + 'column.model': 'Temps du modèle', + 'column.model.title': 'début de l\'étape jusqu\'à la réponse finalisée (inclut le délai du premier jeton)', + 'column.tps': 'Vitesse de sortie', + 'column.tps.title': 'jetons de sortie ÷ secondes de génération (TPS, tok/s)', + 'column.tool': 'Temps des outils', + 'column.tool.title': 'somme des durées de chaque appel d\'outil de l\'étape jusqu\'à son résultat ; les appels sans résultat sont exclus', + 'column.time': 'Temps total', + 'column.time.title': 'répartition du total : bleu clair premier jeton, bleu génération, orange appels d\'outils, gris tout le reste. La longueur de la barre suit une échelle de racine carrée ; les étapes ne se comparent qu\'aux étapes du même tour, les tours entre eux', + 'turn.label': 'Tour {turn}', + 'step.label': 'Étape {step}', + 'step.toggle.aria': 'Développer ou réduire les détails des outils de l\'étape {step}', + 'step.partial': 'début inconnu', + 'step.started.title': 'Étape commencée à {time}', + 'compaction.label': 'Compactage', + 'compaction.running': 'Compactage…', + 'compaction.shadowed': '{tokens} jetons d\'historique retirés', + 'compaction.summary': 'Résumé de {chars} caractères', + 'compaction.title': 'Les exécutions de compactage sont affichées séparément et exclues des totaux d\'étapes du tour', + 'event.show': 'Afficher les lignes d\'événements (y compris le compactage)', + 'context.delta.show': 'Afficher le delta de contexte', + 'context.delta.title': 'Écart de l\'invite par rapport à l\'étape mesurée précédente du tour ; une valeur négative signifie que le contexte a diminué (par exemple après un compactage)', + 'event.request-header': 'En-tête de demande', + 'event.system-prompt': 'Invite système', + 'event.tool-set': 'Changement de jeu d\'outils', + 'event.context-prune': 'Élagage du contexte', + 'event.request-context': 'Contexte de la demande', + 'event.model-retry': 'Nouvelle tentative du modèle', + 'event.model-attempt': 'Tentative du modèle', + 'event.context-refresh': 'Rafraîchissement du contexte', + 'event.approval': 'Approbation', + 'event.context.detail': '{provider} / {model} · mode d\'invite {mode}', + 'event.retry.detail': 'réessai {retry} · attente {delay}', + 'event.attempt.detail': 'Tentative du modèle sans message validé', + 'event.refresh.detail': '{source} · {chars} caractères', 'event.approval.detail': '{tool} · {status}', - 'event.source.runtime': 'runtime context', - 'event.source.time': 'time context', - 'event.approval.asked': 'waiting', - 'event.approval.allowed': 'allowed once', - 'event.approval.rejected': 'rejected', - 'event.approval.cancelled': 'cancelled', - 'event.approval.unavailable': 'unavailable', - 'event.title': 'Non-step event rows: request, prompt, tool-set, retry, context-refresh, approval, and prune changes excluded from the turn step totals', + 'event.source.runtime': 'contexte d\'exécution', + 'event.source.time': 'contexte temporel', + 'event.approval.asked': 'en attente', + 'event.approval.allowed': 'autorisé une fois', + 'event.approval.rejected': 'refusé', + 'event.approval.cancelled': 'annulé', + 'event.approval.unavailable': 'indisponible', + 'event.title': 'Lignes d\'événements hors étapes (demande, invite, jeu d\'outils, réessai, rafraîchissement du contexte, approbation et élagage), exclues des totaux d\'étapes du tour', 'event.reason.initial': 'initial', - 'event.reason.resume': 'resume', - 'event.reason.change': 'change', - 'event.reason.series': 'new series', - 'event.header.detail': '{reason} · {tools} tools', - 'event.series': 'new series', - 'event.system.append': 'append', - 'event.system.replace': 'replace', - 'event.system.clear': 'clear', - 'event.system.detail': '{action} · {chars} chars', - 'event.tools.added': 'added {tools}', - 'event.tools.removed': 'removed {tools}', - 'event.prune.detail': 'pruned {tokens} tokens', - - - 'step.partial.title': 'This step\'s start and end events are not in the current event window (trimmed while the tab reconnected or the window was rebuilt), so first-token, model time and total have no start to subtract from; reloading the tab reassembles from the full window', - 'state.running': 'running', - 'state.interrupted': 'interrupted', - 'state.cacheMiss': 'cache miss', - 'state.cacheMiss.title': 'The prompt barely hit the cache: usually the first request after a restart or a session resume, paid at full input price', - 'state.aborted': 'unsettled', - 'state.aborted.title': 'The step closed without a settled reply (usually cancelled or failed)', - 'unknown': 'not recorded', - 'partial': '{count} tool calls have no result yet; this is the lower bound of known time', - 'empty': 'No measurable step in the current window.', - 'loadOlder': 'Load earlier', - 'loadOlder.loading': 'Loading earlier turns…', - 'loadOlder.done': 'Beginning of history reached', - 'loadOlder.failed': 'Load failed, retry', - 'summary': '{turns} turns · {steps} steps', - 'table.showTotals': 'Show total row', - 'contextMode.label': 'Context basis', - 'contextMode.latest': 'Latest', - 'contextMode.latest.title': "Turn rows show the last measured step's prompt size (final context); the total row stays cumulative", - 'contextMode.cumulative': 'Cumulative', - 'contextMode.cumulative.title': "Turn rows show the sum of prompt sizes across the turn's steps (cumulative processing); the total row stays cumulative", - 'totals.full': 'Whole-session total', - 'totals.full.title': 'Totals for the complete session; total time is model time + tool time (no inter-turn gaps)', - 'totals.window': 'Window total', - 'totals.window.title': 'Totals for the turns loaded in this window; the context cell is cumulative across steps', - - 'expand.all': 'Expand all', - 'collapse.all': 'Collapse all', - 'turn.expand': 'Show', - 'turn.collapse': 'Hide', - 'turn.toggle.title': 'Expand or collapse the steps of this turn', - 'turn.toggle.aria': 'Expand or collapse turn {turn}', - 'did.answer': 'answer', - 'did.working': 'generating', - 'did.aborted': 'no answer', - 'did.more': '{count} more', - 'did.rest': '{count} more calls', - 'did.title': '{calls} calls: {tools}', - 'did.retry': 'retried {count}×', - 'did.lines': '{lines} lines', - 'did.lines.unit': 'lines', - 'did.chars': '{chars} chars', - 'did.output': '→ {chars} chars', - 'did.total': '{chars} characters of tool output in this step; they become part of the next prompt', - 'detail.show': 'details', - 'detail.hide': 'hide', - 'detail.title': 'Click this row to expand or collapse the tool details', - 'detail.calls': '{count} tool calls', - 'detail.answer': 'Answer', - 'detail.answer.truncated': 'Answer is long; only the first 16,000 chars are kept', - 'detail.code.title': 'Code block', - 'detail.code.wrap': 'Wrap lines', - 'detail.code.unwrap': 'Do not wrap', - 'detail.footnotes': 'Footnotes', - 'detail.copy': 'Copy', - 'detail.copy.title': 'Copy this text', - 'detail.copied': 'Copied', - 'detail.copyFailed': 'Copy failed', - 'detail.chars': '{chars} chars', - 'detail.lines': '{lines} lines', - 'detail.file': 'file', - 'detail.diff': 'change', - 'detail.emptyBody': 'This call left no text', - 'detail.hidden': '{count} more calls are not listed (at most {limit} per step)', - 'detail.args': 'raw arguments', - 'detail.wrap': 'Wrap', - 'detail.wrap.title': 'Wrap long lines instead of scrolling sideways', - 'detail.raw.title': 'Show the raw JSON arguments', - 'detail.lineCap': 'Showing the first {shown} of {total} lines', - 'detail.truncated': 'Too long: only the first {chars} characters are kept', - 'tool.failed': '{count} failed', - 'tool.failed.title': '{count} tool calls in this step returned an error result', - 'bar.ttft': 'first token {value}', - 'bar.gen': 'generation {value}', - 'bar.tool': 'tool calls {value}', - 'bar.rest': 'other {value}', + 'event.reason.resume': 'reprise', + 'event.reason.change': 'changement', + 'event.reason.series': 'nouvelle série', + 'event.header.detail': '{reason} · {tools} outils', + 'event.series': 'nouvelle série', + 'event.system.append': 'ajout', + 'event.system.replace': 'remplacement', + 'event.system.clear': 'effacement', + 'event.system.detail': '{action} · {chars} caractères', + 'event.tools.added': 'ajout de {tools}', + 'event.tools.removed': 'retrait de {tools}', + 'event.prune.detail': '{tokens} jetons élagués', + 'step.partial.title': 'Les événements de début et de fin de cette étape ne figurent pas dans la fenêtre d\'événements actuelle (tronquée lors de la reconnexion de l\'onglet ou de la reconstruction de la fenêtre) ; le premier jeton, le temps du modèle et le temps total n\'ont donc pas de début à soustraire. Rechargez l\'onglet pour reconstituer la fenêtre complète.', + 'state.running': 'en cours', + 'state.interrupted': 'interrompu', + 'state.cacheMiss': 'échec de cache', + 'state.cacheMiss.title': 'L\'invite n\'a pratiquement pas été servie par le cache : généralement la première requête après un redémarrage ou une reprise de session, facturée au plein tarif des jetons d\'entrée', + 'state.aborted': 'non finalisé', + 'state.aborted.title': 'L\'étape s\'est terminée sans réponse finalisée (généralement annulée ou en échec)', + 'unknown': 'non enregistré', + 'partial': '{count} appels d\'outils n\'ont pas encore de résultat ; il s\'agit de la borne inférieure du temps connu', + 'empty': 'Aucune étape mesurable dans la fenêtre actuelle.', + 'loadOlder': 'Charger plus tôt', + 'loadOlder.loading': 'Chargement des tours précédents…', + 'loadOlder.done': 'Début de l\'historique atteint', + 'loadOlder.failed': 'Échec du chargement, réessayer', + 'summary': '{turns} tours · {steps} étapes', + 'table.showTotals': 'Afficher la ligne de total', + 'contextMode.label': 'Base du contexte', + 'contextMode.latest': 'Dernier', + 'contextMode.latest.title': 'Les lignes de tour affichent la taille de l\'invite de la dernière étape mesurée (contexte final) ; la ligne de total reste cumulative', + 'contextMode.cumulative': 'Cumulatif', + 'contextMode.cumulative.title': 'Les lignes de tour affichent la somme des tailles d\'invite des étapes du tour (traitement cumulé) ; la ligne de total reste cumulative', + 'totals.full': 'Total de la session', + 'totals.full.title': 'Totaux de la session complète ; le temps total est le temps du modèle + le temps des outils (sans les écarts entre tours)', + 'totals.window': 'Total de la fenêtre', + 'totals.window.title': 'Totaux des tours chargés dans cette fenêtre ; la cellule de contexte est cumulative sur les étapes', + 'expand.all': 'Tout développer', + 'collapse.all': 'Tout réduire', + 'turn.expand': 'Afficher', + 'turn.collapse': 'Masquer', + 'turn.toggle.title': 'Développer ou réduire les étapes de ce tour', + 'turn.toggle.aria': 'Développer ou réduire le tour {turn}', + 'did.answer': 'réponse', + 'did.working': 'génération', + 'did.aborted': 'sans réponse', + 'did.more': '{count} de plus', + 'did.rest': '{count} appels de plus', + 'did.title': '{calls} appels : {tools}', + 'did.retry': 'réessayé {count}×', + 'did.lines': '{lines} lignes', + 'did.lines.unit': 'lignes', + 'did.chars': '{chars} caractères', + 'did.output': '→ {chars} caractères', + 'did.total': '{chars} caractères de sortie d\'outil dans cette étape ; ils feront partie de la prochaine invite', + 'detail.show': 'détails', + 'detail.hide': 'masquer', + 'detail.title': 'Cliquez sur cette ligne pour développer ou réduire les détails des outils', + 'detail.calls': '{count} appels d\'outils', + 'detail.answer': 'Réponse', + 'detail.answer.truncated': 'La réponse est longue ; seuls les 16 000 premiers caractères sont conservés', + 'detail.code.title': 'Bloc de code', + 'detail.code.wrap': 'Activer le retour à la ligne', + 'detail.code.unwrap': 'Désactiver le retour à la ligne', + 'detail.footnotes': 'Notes de bas de page', + 'detail.copy': 'Copier', + 'detail.copy.title': 'Copier ce texte', + 'detail.copied': 'Copié', + 'detail.copyFailed': 'Échec de la copie', + 'detail.chars': '{chars} caractères', + 'detail.lines': '{lines} lignes', + 'detail.file': 'fichier', + 'detail.diff': 'modification', + 'detail.emptyBody': 'Cet appel n\'a laissé aucun texte', + 'detail.hidden': '{count} autres appels ne sont pas listés ({limit} au maximum par étape)', + 'detail.args': 'arguments bruts', + 'detail.wrap': 'Retour à la ligne', + 'detail.wrap.title': 'Afficher les longues lignes sur plusieurs lignes au lieu de défiler horizontalement', + 'detail.raw.title': 'Afficher les arguments JSON bruts', + 'detail.lineCap': 'Affichage de {shown} lignes sur {total}', + 'detail.truncated': 'Trop long : seuls les {chars} premiers caractères sont conservés', + 'tool.failed': '{count} en échec', + 'tool.failed.title': '{count} appels d\'outils de cette étape ont renvoyé un résultat d\'erreur', + 'bar.ttft': 'premier jeton {value}', + 'bar.gen': 'génération {value}', + 'bar.tool': 'appels d\'outils {value}', + 'bar.rest': 'autre {value}', 'bar.wall': 'total {value}', - 'bar.running': 'not finished yet: this is elapsed time', - 'bar.gap': 'gap since previous step {value}', - 'bar.start': 'started {clock}', - 'turn.started': 'this turn started at {time}', + 'bar.running': 'pas encore terminé : il s\'agit du temps écoulé', + 'bar.gap': 'écart depuis l\'étape précédente {value}', + 'bar.start': 'commencé à {clock}', + 'turn.started': 'ce tour a commencé à {time}', 'turn.images': '{count} images', - 'imagePreview.hint': 'Hover or focus to preview this turn\'s images; click to open the full image', - 'imagePreview.dialog': 'Image preview', - 'imagePreview.open': 'View image {index} of {count}', + 'imagePreview.hint': 'Survolez ou placez le focus pour prévisualiser les images de ce tour ; cliquez pour ouvrir l\'image en grand', + 'imagePreview.dialog': 'Aperçu de l\'image', + 'imagePreview.open': 'Voir l\'image {index} sur {count}', 'imagePreview.alt': 'Image {index}', - 'imagePreview.loading': 'Loading image…', - 'imagePreview.failed': 'Image failed to load', - 'imagePreview.retry': 'Retry', - 'imagePreview.close': 'Close image preview', - 'steps.total': '{total} steps', - 'steps.tail': 'newest {limit} only', - 'steps.all': 'Show all {total} steps', - 'steps.filter': 'Only {tool}', - 'steps.clear': 'Clear filter', - 'steps.matched': '{count} steps used {tool}', + 'imagePreview.loading': 'Chargement de l\'image…', + 'imagePreview.failed': 'Échec du chargement de l\'image', + 'imagePreview.retry': 'Réessayer', + 'imagePreview.close': 'Fermer l\'aperçu de l\'image', + 'steps.total': '{total} étapes', + 'steps.tail': 'seulement les {limit} plus récentes', + 'steps.all': 'Afficher les {total} étapes', + 'steps.filter': 'Uniquement {tool}', + 'steps.clear': 'Effacer le filtre', + 'steps.matched': '{count} étapes ont utilisé {tool}', } -/** German dictionary; ships the English fallback until translated. */ +/** German dictionary. */ export const de: Record = { - 'view.perf': 'Statistics', - 'column.scope': 'Turn / step', - 'column.scope.title': 'A turn row holds the turn total; click a row to expand or collapse its steps', - 'column.prompt': 'Trigger', - 'column.prompt.title': 'What opened this turn: a human prompt shows its text, automation shows a source badge', - 'trigger.agent-message': 'Agent message', - 'trigger.team-message': 'Team message', - 'trigger.schedule': 'Scheduled', + 'view.perf': 'Statistik', + 'column.scope': 'Runde / Schritt', + 'column.scope.title': 'Eine Rundenzeile enthält die Summe der Runde; Zeile anklicken, um ihre Schritte ein- oder auszuklappen', + 'column.prompt': 'Auslöser', + 'column.prompt.title': 'Was diese Runde ausgelöst hat: ein menschlicher Prompt zeigt seinen Text, eine Automatisierung zeigt ein Quellen-Badge', + 'trigger.agent-message': 'Agentennachricht', + 'trigger.team-message': 'Teamnachricht', + 'trigger.schedule': 'Geplant', 'trigger.webhook': 'Webhook', - 'trigger.tool-jobs': 'Background job', - 'trigger.cordis-host-runner': 'Plugin run', - 'trigger.subagent-settled': 'Subagent finished', - 'trigger.goal': 'Goal round', - 'trigger.context': 'Context wake', - 'trigger.other': 'Automated turn', - 'column.did': 'Execution', - 'column.did.title': 'Tools this step called and how often; a step without tool calls previews its answer text', - 'column.context': 'Context', - 'column.context.title': 'usage input tokens + cache read + cache write', - 'column.output': 'Output', - 'column.output.title': 'usage output tokens of the step', - 'column.cache': 'Cache hit', - 'column.cache.title': 'cache read ÷ (input + cache read + cache write): the share of the prompt served from cache', - 'cache.detail': 'cache read {read} · input {input} · cache write {write}', - 'column.ttft': 'First token', - 'column.ttft.title': 'step start to the first output fragment (TTFT)', - 'column.model': 'Model time', - 'column.model.title': 'step start to the settled reply (includes the first-token delay)', - 'column.tps': 'Output speed', - 'column.tps.title': 'output tokens ÷ generation seconds (TPS, tok/s)', - 'column.tool': 'Tool time', - 'column.tool.title': 'sum of every tool call up to its result inside the step; calls without a result are excluded', - 'column.time': 'Total time', - 'column.time.title': 'total split: light blue first token, blue generation, orange tool calls, gray everything else. Bar length uses a square-root scale; steps compare only with steps of the same turn, turns with turns', - 'turn.label': 'Turn {turn}', - 'step.label': 'Step {step}', - 'step.toggle.aria': 'Expand or collapse the tool details of step {step}', - 'step.partial': 'start unknown', - 'step.started.title': 'Step started at {time}', - 'compaction.label': 'Compaction', - 'compaction.running': 'Compacting…', - 'compaction.shadowed': 'Pruned {tokens} tokens of history', - 'compaction.summary': 'Summary {chars} chars', - 'compaction.title': "Compaction runs are shown separately and excluded from the turn's step totals", - 'event.show': 'Show event rows (incl. compaction)', - 'context.delta.show': 'Show context delta', - 'context.delta.title': 'Prompt delta against the previous measured step in the turn; negative means the context shrank (for example after compaction)', - 'event.request-header': 'Request header', - 'event.system-prompt': 'System prompt', - 'event.tool-set': 'Tool set change', - 'event.context-prune': 'Context prune', - 'event.request-context': 'Request context', - 'event.model-retry': 'Model retry', - 'event.model-attempt': 'Model attempt', - 'event.context-refresh': 'Context refresh', - 'event.approval': 'Approval', - 'event.context.detail': '{provider} / {model} · prompt mode {mode}', - 'event.retry.detail': 'retry {retry} · wait {delay}', - 'event.attempt.detail': 'Model attempt without a committed message', - 'event.refresh.detail': '{source} · {chars} chars', + 'trigger.tool-jobs': 'Hintergrundjob', + 'trigger.cordis-host-runner': 'Plugin-Lauf', + 'trigger.subagent-settled': 'Subagent beendet', + 'trigger.goal': 'Zielrunde', + 'trigger.context': 'Kontext-Reaktivierung', + 'trigger.other': 'Automatische Runde', + 'column.did': 'Ausführung', + 'column.did.title': 'Welche Werkzeuge dieser Schritt wie oft aufgerufen hat; ein Schritt ohne Werkzeugaufrufe zeigt eine Vorschau seines Antworttexts', + 'column.context': 'Kontext', + 'column.context.title': 'Usage-Eingabetoken + Cache-Lesen + Cache-Schreiben', + 'column.output': 'Ausgabe', + 'column.output.title': 'Usage-Ausgabetoken des Schritts', + 'column.cache': 'Cache-Treffer', + 'column.cache.title': 'Cache-Lesen ÷ (Eingabe + Cache-Lesen + Cache-Schreiben): der Anteil des Prompts, der aus dem Cache bedient wurde', + 'cache.detail': 'Cache-Lesen {read} · Eingabe {input} · Cache-Schreiben {write}', + 'column.ttft': 'Erstes Token', + 'column.ttft.title': 'Vom Schrittbeginn bis zum ersten Ausgabefragment (TTFT)', + 'column.model': 'Modellzeit', + 'column.model.title': 'Vom Schrittbeginn bis zur abgeschlossenen Antwort (inklusive Verzögerung bis zum ersten Token)', + 'column.tps': 'Ausgabetempo', + 'column.tps.title': 'Ausgabetoken ÷ Generierungssekunden (TPS, tok/s)', + 'column.tool': 'Werkzeugzeit', + 'column.tool.title': 'Summe der Dauer jedes Werkzeugaufrufs im Schritt bis zu seinem Ergebnis; Aufrufe ohne Ergebnis zählen nicht', + 'column.time': 'Gesamtzeit', + 'column.time.title': 'Aufteilung der Gesamtzeit: hellblau erstes Token, blau Generierung, orange Werkzeugaufrufe, grau alles Übrige. Die Balkenlänge folgt einer Quadratwurzel-Skala; Schritte werden nur mit Schritten derselben Runde verglichen, Runden mit Runden', + 'turn.label': 'Runde {turn}', + 'step.label': 'Schritt {step}', + 'step.toggle.aria': 'Werkzeugdetails von Schritt {step} ein- oder ausklappen', + 'step.partial': 'Beginn unbekannt', + 'step.started.title': 'Schritt begann um {time}', + 'compaction.label': 'Komprimierung', + 'compaction.running': 'Komprimierung läuft…', + 'compaction.shadowed': 'Verlauf um {tokens} Token gekürzt', + 'compaction.summary': 'Zusammenfassung {chars} Zeichen', + 'compaction.title': 'Komprimierungsläufe werden separat angezeigt und nicht in die Schrittsummen der Runde eingerechnet', + 'event.show': 'Ereigniszeilen anzeigen (inkl. Komprimierung)', + 'context.delta.show': 'Kontextdelta anzeigen', + 'context.delta.title': 'Prompt-Delta gegenüber dem vorigen gemessenen Schritt der Runde; negativ bedeutet, dass der Kontext geschrumpft ist (zum Beispiel nach einer Komprimierung)', + 'event.request-header': 'Anfrage-Header', + 'event.system-prompt': 'System-Prompt', + 'event.tool-set': 'Werkzeugset-Änderung', + 'event.context-prune': 'Kontextkürzung', + 'event.request-context': 'Anfragekontext', + 'event.model-retry': 'Modellwiederholung', + 'event.model-attempt': 'Modellversuch', + 'event.context-refresh': 'Kontextaktualisierung', + 'event.approval': 'Genehmigung', + 'event.context.detail': '{provider} / {model} · Prompt-Modus {mode}', + 'event.retry.detail': 'Wiederholung {retry} · Wartezeit {delay}', + 'event.attempt.detail': 'Modellversuch ohne festgeschriebene Nachricht', + 'event.refresh.detail': '{source} · {chars} Zeichen', 'event.approval.detail': '{tool} · {status}', - 'event.source.runtime': 'runtime context', - 'event.source.time': 'time context', - 'event.approval.asked': 'waiting', - 'event.approval.allowed': 'allowed once', - 'event.approval.rejected': 'rejected', - 'event.approval.cancelled': 'cancelled', - 'event.approval.unavailable': 'unavailable', - 'event.title': 'Non-step event rows: request, prompt, tool-set, retry, context-refresh, approval, and prune changes excluded from the turn step totals', - 'event.reason.initial': 'initial', - 'event.reason.resume': 'resume', - 'event.reason.change': 'change', - 'event.reason.series': 'new series', - 'event.header.detail': '{reason} · {tools} tools', - 'event.series': 'new series', - 'event.system.append': 'append', - 'event.system.replace': 'replace', - 'event.system.clear': 'clear', - 'event.system.detail': '{action} · {chars} chars', - 'event.tools.added': 'added {tools}', - 'event.tools.removed': 'removed {tools}', - 'event.prune.detail': 'pruned {tokens} tokens', - - - 'step.partial.title': 'This step\'s start and end events are not in the current event window (trimmed while the tab reconnected or the window was rebuilt), so first-token, model time and total have no start to subtract from; reloading the tab reassembles from the full window', - 'state.running': 'running', - 'state.interrupted': 'interrupted', - 'state.cacheMiss': 'cache miss', - 'state.cacheMiss.title': 'The prompt barely hit the cache: usually the first request after a restart or a session resume, paid at full input price', - 'state.aborted': 'unsettled', - 'state.aborted.title': 'The step closed without a settled reply (usually cancelled or failed)', - 'unknown': 'not recorded', - 'partial': '{count} tool calls have no result yet; this is the lower bound of known time', - 'empty': 'No measurable step in the current window.', - 'loadOlder': 'Load earlier', - 'loadOlder.loading': 'Loading earlier turns…', - 'loadOlder.done': 'Beginning of history reached', - 'loadOlder.failed': 'Load failed, retry', - 'summary': '{turns} turns · {steps} steps', - 'table.showTotals': 'Show total row', - 'contextMode.label': 'Context basis', - 'contextMode.latest': 'Latest', - 'contextMode.latest.title': "Turn rows show the last measured step's prompt size (final context); the total row stays cumulative", - 'contextMode.cumulative': 'Cumulative', - 'contextMode.cumulative.title': "Turn rows show the sum of prompt sizes across the turn's steps (cumulative processing); the total row stays cumulative", - 'totals.full': 'Whole-session total', - 'totals.full.title': 'Totals for the complete session; total time is model time + tool time (no inter-turn gaps)', - 'totals.window': 'Window total', - 'totals.window.title': 'Totals for the turns loaded in this window; the context cell is cumulative across steps', - - 'expand.all': 'Expand all', - 'collapse.all': 'Collapse all', - 'turn.expand': 'Show', - 'turn.collapse': 'Hide', - 'turn.toggle.title': 'Expand or collapse the steps of this turn', - 'turn.toggle.aria': 'Expand or collapse turn {turn}', - 'did.answer': 'answer', - 'did.working': 'generating', - 'did.aborted': 'no answer', - 'did.more': '{count} more', - 'did.rest': '{count} more calls', - 'did.title': '{calls} calls: {tools}', - 'did.retry': 'retried {count}×', - 'did.lines': '{lines} lines', - 'did.lines.unit': 'lines', - 'did.chars': '{chars} chars', - 'did.output': '→ {chars} chars', - 'did.total': '{chars} characters of tool output in this step; they become part of the next prompt', - 'detail.show': 'details', - 'detail.hide': 'hide', - 'detail.title': 'Click this row to expand or collapse the tool details', - 'detail.calls': '{count} tool calls', - 'detail.answer': 'Answer', - 'detail.answer.truncated': 'Answer is long; only the first 16,000 chars are kept', - 'detail.code.title': 'Code block', - 'detail.code.wrap': 'Wrap lines', - 'detail.code.unwrap': 'Do not wrap', - 'detail.footnotes': 'Footnotes', - 'detail.copy': 'Copy', - 'detail.copy.title': 'Copy this text', - 'detail.copied': 'Copied', - 'detail.copyFailed': 'Copy failed', - 'detail.chars': '{chars} chars', - 'detail.lines': '{lines} lines', - 'detail.file': 'file', - 'detail.diff': 'change', - 'detail.emptyBody': 'This call left no text', - 'detail.hidden': '{count} more calls are not listed (at most {limit} per step)', - 'detail.args': 'raw arguments', - 'detail.wrap': 'Wrap', - 'detail.wrap.title': 'Wrap long lines instead of scrolling sideways', - 'detail.raw.title': 'Show the raw JSON arguments', - 'detail.lineCap': 'Showing the first {shown} of {total} lines', - 'detail.truncated': 'Too long: only the first {chars} characters are kept', - 'tool.failed': '{count} failed', - 'tool.failed.title': '{count} tool calls in this step returned an error result', - 'bar.ttft': 'first token {value}', - 'bar.gen': 'generation {value}', - 'bar.tool': 'tool calls {value}', - 'bar.rest': 'other {value}', - 'bar.wall': 'total {value}', - 'bar.running': 'not finished yet: this is elapsed time', - 'bar.gap': 'gap since previous step {value}', - 'bar.start': 'started {clock}', - 'turn.started': 'this turn started at {time}', - 'turn.images': '{count} images', - 'imagePreview.hint': 'Hover or focus to preview this turn\'s images; click to open the full image', - 'imagePreview.dialog': 'Image preview', - 'imagePreview.open': 'View image {index} of {count}', - 'imagePreview.alt': 'Image {index}', - 'imagePreview.loading': 'Loading image…', - 'imagePreview.failed': 'Image failed to load', - 'imagePreview.retry': 'Retry', - 'imagePreview.close': 'Close image preview', - 'steps.total': '{total} steps', - 'steps.tail': 'newest {limit} only', - 'steps.all': 'Show all {total} steps', - 'steps.filter': 'Only {tool}', - 'steps.clear': 'Clear filter', - 'steps.matched': '{count} steps used {tool}', + 'event.source.runtime': 'Laufzeitkontext', + 'event.source.time': 'Zeitkontext', + 'event.approval.asked': 'Wartet', + 'event.approval.allowed': 'Einmal zugelassen', + 'event.approval.rejected': 'Abgelehnt', + 'event.approval.cancelled': 'Abgebrochen', + 'event.approval.unavailable': 'Nicht verfügbar', + 'event.title': 'Ereigniszeilen außerhalb der Schritte: Änderungen an Anfrage, Prompt, Werkzeugset, Wiederholungen, Kontextaktualisierung, Genehmigungen und Kürzungen, die nicht in die Schrittsummen der Runde einfließen', + 'event.reason.initial': 'Initial', + 'event.reason.resume': 'Fortsetzung', + 'event.reason.change': 'Änderung', + 'event.reason.series': 'Neue Serie', + 'event.header.detail': '{reason} · {tools} Werkzeuge', + 'event.series': 'Neue Serie', + 'event.system.append': 'Anhängen', + 'event.system.replace': 'Ersetzen', + 'event.system.clear': 'Leeren', + 'event.system.detail': '{action} · {chars} Zeichen', + 'event.tools.added': '{tools} hinzugefügt', + 'event.tools.removed': '{tools} entfernt', + 'event.prune.detail': '{tokens} Token gekürzt', + 'step.partial.title': 'Die Start- und Endereignisse dieses Schritts liegen nicht im aktuellen Ereignisfenster (beim Wiederverbinden des Tabs oder beim Neuaufbau des Fensters abgeschnitten). Daher fehlt für erstes Token, Modellzeit und Gesamtzeit der Startpunkt zum Abziehen; beim Neuladen des Tabs wird alles aus dem vollständigen Fenster neu zusammengesetzt', + 'state.running': 'Läuft', + 'state.interrupted': 'Unterbrochen', + 'state.cacheMiss': 'Kein Cache-Treffer', + 'state.cacheMiss.title': 'Der Prompt hat den Cache kaum getroffen: meist die erste Anfrage nach einem Neustart oder einer Sitzungsfortsetzung, zum vollen Eingabepreis abgerechnet', + 'state.aborted': 'Nicht abgeschlossen', + 'state.aborted.title': 'Der Schritt endete ohne abgeschlossene Antwort (meist abgebrochen oder fehlgeschlagen)', + 'unknown': 'Nicht aufgezeichnet', + 'partial': '{count} Werkzeugaufrufe haben noch kein Ergebnis; das ist die Untergrenze der bekannten Zeit', + 'empty': 'Im aktuellen Fenster gibt es keinen messbaren Schritt.', + 'loadOlder': 'Frühere Runden laden', + 'loadOlder.loading': 'Frühere Runden werden geladen…', + 'loadOlder.done': 'Anfang des Verlaufs erreicht', + 'loadOlder.failed': 'Laden fehlgeschlagen, erneut versuchen', + 'summary': '{turns} Runden · {steps} Schritte', + 'table.showTotals': 'Summenzeile anzeigen', + 'contextMode.label': 'Kontextbasis', + 'contextMode.latest': 'Aktuell', + 'contextMode.latest.title': 'Rundenzeilen zeigen die Prompt-Größe des letzten gemessenen Schritts (endgültiger Kontext); die Summenzeile bleibt kumulativ', + 'contextMode.cumulative': 'Kumulativ', + 'contextMode.cumulative.title': 'Rundenzeilen zeigen die Summe der Prompt-Größen über die Schritte der Runde (kumulierte Verarbeitung); die Summenzeile bleibt kumulativ', + 'totals.full': 'Gesamtsumme der Sitzung', + 'totals.full.title': 'Summen für die gesamte Sitzung; Gesamtzeit ist Modellzeit + Werkzeugzeit (ohne Lücken zwischen Runden)', + 'totals.window': 'Summe des Fensters', + 'totals.window.title': 'Summen für die in diesem Fenster geladenen Runden; die Kontextzelle ist über die Schritte kumuliert', + 'expand.all': 'Alle ausklappen', + 'collapse.all': 'Alle einklappen', + 'turn.expand': 'Anzeigen', + 'turn.collapse': 'Ausblenden', + 'turn.toggle.title': 'Die Schritte dieser Runde ein- oder ausklappen', + 'turn.toggle.aria': 'Runde {turn} ein- oder ausklappen', + 'did.answer': 'Antwort', + 'did.working': 'Wird generiert', + 'did.aborted': 'Keine Antwort', + 'did.more': '{count} weitere', + 'did.rest': '{count} weitere Aufrufe', + 'did.title': '{calls} Aufrufe: {tools}', + 'did.retry': '{count}× wiederholt', + 'did.lines': '{lines} Zeilen', + 'did.lines.unit': 'Zeilen', + 'did.chars': '{chars} Zeichen', + 'did.output': '→ {chars} Zeichen', + 'did.total': '{chars} Zeichen Werkzeugausgabe in diesem Schritt; sie fließen in den nächsten Prompt ein', + 'detail.show': 'Details', + 'detail.hide': 'Ausblenden', + 'detail.title': 'Diese Zeile anklicken, um die Werkzeugdetails ein- oder auszublenden', + 'detail.calls': '{count} Werkzeugaufrufe', + 'detail.answer': 'Antwort', + 'detail.answer.truncated': 'Die Antwort ist lang; nur die ersten 16.000 Zeichen werden behalten', + 'detail.code.title': 'Codeblock', + 'detail.code.wrap': 'Zeilen umbrechen', + 'detail.code.unwrap': 'Nicht umbrechen', + 'detail.footnotes': 'Fußnoten', + 'detail.copy': 'Kopieren', + 'detail.copy.title': 'Diesen Text kopieren', + 'detail.copied': 'Kopiert', + 'detail.copyFailed': 'Kopieren fehlgeschlagen', + 'detail.chars': '{chars} Zeichen', + 'detail.lines': '{lines} Zeilen', + 'detail.file': 'Datei', + 'detail.diff': 'Änderung', + 'detail.emptyBody': 'Dieser Aufruf hat keinen Text hinterlassen', + 'detail.hidden': '{count} weitere Aufrufe werden nicht aufgeführt (höchstens {limit} pro Schritt)', + 'detail.args': 'Rohargumente', + 'detail.wrap': 'Umbrechen', + 'detail.wrap.title': 'Lange Zeilen umbrechen statt seitlich zu scrollen', + 'detail.raw.title': 'Die rohen JSON-Argumente anzeigen', + 'detail.lineCap': 'Die ersten {shown} von {total} Zeilen werden angezeigt', + 'detail.truncated': 'Zu lang: nur die ersten {chars} Zeichen werden behalten', + 'tool.failed': '{count} fehlgeschlagen', + 'tool.failed.title': '{count} Werkzeugaufrufe in diesem Schritt haben ein Fehlerergebnis zurückgegeben', + 'bar.ttft': 'Erstes Token {value}', + 'bar.gen': 'Generierung {value}', + 'bar.tool': 'Werkzeugaufrufe {value}', + 'bar.rest': 'Sonstiges {value}', + 'bar.wall': 'Gesamt {value}', + 'bar.running': 'Noch nicht beendet: das ist die verstrichene Zeit', + 'bar.gap': 'Lücke seit dem vorigen Schritt {value}', + 'bar.start': 'Gestartet {clock}', + 'turn.started': 'Diese Runde begann um {time}', + 'turn.images': '{count} Bilder', + 'imagePreview.hint': 'Mit dem Mauszeiger auf die Zeile zeigen oder sie fokussieren, um die Bilder dieser Runde als Vorschau zu sehen; klicken, um das vollständige Bild zu öffnen', + 'imagePreview.dialog': 'Bildvorschau', + 'imagePreview.open': 'Bild {index} von {count} anzeigen', + 'imagePreview.alt': 'Bild {index}', + 'imagePreview.loading': 'Bild wird geladen…', + 'imagePreview.failed': 'Bild konnte nicht geladen werden', + 'imagePreview.retry': 'Erneut versuchen', + 'imagePreview.close': 'Bildvorschau schließen', + 'steps.total': '{total} Schritte', + 'steps.tail': 'Nur die neuesten {limit} anzeigen', + 'steps.all': 'Alle {total} Schritte anzeigen', + 'steps.filter': 'Nur {tool}', + 'steps.clear': 'Filter löschen', + 'steps.matched': '{count} Schritte haben {tool} verwendet', } -/** Russian dictionary; ships the English fallback until translated. */ +/** Russian dictionary. */ export const ru: Record = { - 'view.perf': 'Statistics', - 'column.scope': 'Turn / step', - 'column.scope.title': 'A turn row holds the turn total; click a row to expand or collapse its steps', - 'column.prompt': 'Trigger', - 'column.prompt.title': 'What opened this turn: a human prompt shows its text, automation shows a source badge', - 'trigger.agent-message': 'Agent message', - 'trigger.team-message': 'Team message', - 'trigger.schedule': 'Scheduled', + 'view.perf': 'Статистика', + 'column.scope': 'Ход / шаг', + 'column.scope.title': 'В строке хода — итог по этому ходу; нажмите на строку, чтобы развернуть или свернуть шаги', + 'column.prompt': 'Триггер', + 'column.prompt.title': 'Что запустило этот ход: у промпта человека показывается текст, у автоматического запуска — метка источника', + 'trigger.agent-message': 'Сообщение агента', + 'trigger.team-message': 'Сообщение команды', + 'trigger.schedule': 'По расписанию', 'trigger.webhook': 'Webhook', - 'trigger.tool-jobs': 'Background job', - 'trigger.cordis-host-runner': 'Plugin run', - 'trigger.subagent-settled': 'Subagent finished', - 'trigger.goal': 'Goal round', - 'trigger.context': 'Context wake', - 'trigger.other': 'Automated turn', - 'column.did': 'Execution', - 'column.did.title': 'Tools this step called and how often; a step without tool calls previews its answer text', - 'column.context': 'Context', - 'column.context.title': 'usage input tokens + cache read + cache write', - 'column.output': 'Output', - 'column.output.title': 'usage output tokens of the step', - 'column.cache': 'Cache hit', - 'column.cache.title': 'cache read ÷ (input + cache read + cache write): the share of the prompt served from cache', - 'cache.detail': 'cache read {read} · input {input} · cache write {write}', - 'column.ttft': 'First token', - 'column.ttft.title': 'step start to the first output fragment (TTFT)', - 'column.model': 'Model time', - 'column.model.title': 'step start to the settled reply (includes the first-token delay)', - 'column.tps': 'Output speed', - 'column.tps.title': 'output tokens ÷ generation seconds (TPS, tok/s)', - 'column.tool': 'Tool time', - 'column.tool.title': 'sum of every tool call up to its result inside the step; calls without a result are excluded', - 'column.time': 'Total time', - 'column.time.title': 'total split: light blue first token, blue generation, orange tool calls, gray everything else. Bar length uses a square-root scale; steps compare only with steps of the same turn, turns with turns', - 'turn.label': 'Turn {turn}', - 'step.label': 'Step {step}', - 'step.toggle.aria': 'Expand or collapse the tool details of step {step}', - 'step.partial': 'start unknown', - 'step.started.title': 'Step started at {time}', - 'compaction.label': 'Compaction', - 'compaction.running': 'Compacting…', - 'compaction.shadowed': 'Pruned {tokens} tokens of history', - 'compaction.summary': 'Summary {chars} chars', - 'compaction.title': "Compaction runs are shown separately and excluded from the turn's step totals", - 'event.show': 'Show event rows (incl. compaction)', - 'context.delta.show': 'Show context delta', - 'context.delta.title': 'Prompt delta against the previous measured step in the turn; negative means the context shrank (for example after compaction)', - 'event.request-header': 'Request header', - 'event.system-prompt': 'System prompt', - 'event.tool-set': 'Tool set change', - 'event.context-prune': 'Context prune', - 'event.request-context': 'Request context', - 'event.model-retry': 'Model retry', - 'event.model-attempt': 'Model attempt', - 'event.context-refresh': 'Context refresh', - 'event.approval': 'Approval', - 'event.context.detail': '{provider} / {model} · prompt mode {mode}', - 'event.retry.detail': 'retry {retry} · wait {delay}', - 'event.attempt.detail': 'Model attempt without a committed message', - 'event.refresh.detail': '{source} · {chars} chars', + 'trigger.tool-jobs': 'Фоновая задача', + 'trigger.cordis-host-runner': 'Запуск плагина', + 'trigger.subagent-settled': 'Субагент завершён', + 'trigger.goal': 'Раунд цели', + 'trigger.context': 'Пробуждение по контексту', + 'trigger.other': 'Автоматический ход', + 'column.did': 'Выполнение', + 'column.did.title': 'Инструменты, вызванные на этом шаге, и число вызовов; шаг без вызовов инструментов показывает начало ответа', + 'column.context': 'Контекст', + 'column.context.title': 'входные токены usage + чтение кэша + запись кэша', + 'column.output': 'Вывод', + 'column.output.title': 'выходные токены usage за шаг', + 'column.cache': 'Попадание в кэш', + 'column.cache.title': 'чтение кэша ÷ (вход + чтение кэша + запись кэша): доля промпта, отданная из кэша', + 'cache.detail': 'чтение кэша {read} · вход {input} · запись кэша {write}', + 'column.ttft': 'Первый токен', + 'column.ttft.title': 'от начала шага до первого фрагмента вывода (TTFT)', + 'column.model': 'Время модели', + 'column.model.title': 'от начала шага до готового ответа (включая задержку первого токена)', + 'column.tps': 'Скорость вывода', + 'column.tps.title': 'выходные токены ÷ секунды генерации (TPS, tok/s)', + 'column.tool': 'Время инструментов', + 'column.tool.title': 'сумма времени от каждого вызова инструмента до его результата внутри шага; вызовы без результата не учитываются', + 'column.time': 'Общее время', + 'column.time.title': 'разбивка общего времени: голубой — первый токен, синий — генерация, оранжевый — вызовы инструментов, серый — остальное. Длина полосы в масштабе квадратного корня; шаги сравниваются только с шагами своего хода, ходы — с ходами', + 'turn.label': 'Ход {turn}', + 'step.label': 'Шаг {step}', + 'step.toggle.aria': 'Развернуть или свернуть подробности инструментов шага {step}', + 'step.partial': 'начало неизвестно', + 'step.started.title': 'Шаг начался в {time}', + 'compaction.label': 'Сжатие', + 'compaction.running': 'Сжатие…', + 'compaction.shadowed': 'Сжато {tokens} токенов истории', + 'compaction.summary': 'Сводка {chars} символов', + 'compaction.title': 'Вызовы сжатия показываются отдельно и не входят в итоги шагов хода', + 'event.show': 'Показывать строки событий (включая сжатие)', + 'context.delta.show': 'Показывать прирост контекста', + 'context.delta.title': 'Прирост промпта относительно предыдущего измеренного шага в этом ходе; отрицательное значение означает, что контекст уменьшился (например, после сжатия)', + 'event.request-header': 'Заголовок запроса', + 'event.system-prompt': 'Системный промпт', + 'event.tool-set': 'Изменение набора инструментов', + 'event.context-prune': 'Обрезка контекста', + 'event.request-context': 'Контекст запроса', + 'event.model-retry': 'Повтор запроса к модели', + 'event.model-attempt': 'Попытка запроса к модели', + 'event.context-refresh': 'Обновление контекста', + 'event.approval': 'Одобрение', + 'event.context.detail': '{provider} / {model} · режим промпта {mode}', + 'event.retry.detail': 'повтор {retry} · ожидание {delay}', + 'event.attempt.detail': 'Попытка запроса к модели без зафиксированного сообщения', + 'event.refresh.detail': '{source} · {chars} символов', 'event.approval.detail': '{tool} · {status}', - 'event.source.runtime': 'runtime context', - 'event.source.time': 'time context', - 'event.approval.asked': 'waiting', - 'event.approval.allowed': 'allowed once', - 'event.approval.rejected': 'rejected', - 'event.approval.cancelled': 'cancelled', - 'event.approval.unavailable': 'unavailable', - 'event.title': 'Non-step event rows: request, prompt, tool-set, retry, context-refresh, approval, and prune changes excluded from the turn step totals', - 'event.reason.initial': 'initial', - 'event.reason.resume': 'resume', - 'event.reason.change': 'change', - 'event.reason.series': 'new series', - 'event.header.detail': '{reason} · {tools} tools', - 'event.series': 'new series', - 'event.system.append': 'append', - 'event.system.replace': 'replace', - 'event.system.clear': 'clear', - 'event.system.detail': '{action} · {chars} chars', - 'event.tools.added': 'added {tools}', - 'event.tools.removed': 'removed {tools}', - 'event.prune.detail': 'pruned {tokens} tokens', - - - 'step.partial.title': 'This step\'s start and end events are not in the current event window (trimmed while the tab reconnected or the window was rebuilt), so first-token, model time and total have no start to subtract from; reloading the tab reassembles from the full window', - 'state.running': 'running', - 'state.interrupted': 'interrupted', - 'state.cacheMiss': 'cache miss', - 'state.cacheMiss.title': 'The prompt barely hit the cache: usually the first request after a restart or a session resume, paid at full input price', - 'state.aborted': 'unsettled', - 'state.aborted.title': 'The step closed without a settled reply (usually cancelled or failed)', - 'unknown': 'not recorded', - 'partial': '{count} tool calls have no result yet; this is the lower bound of known time', - 'empty': 'No measurable step in the current window.', - 'loadOlder': 'Load earlier', - 'loadOlder.loading': 'Loading earlier turns…', - 'loadOlder.done': 'Beginning of history reached', - 'loadOlder.failed': 'Load failed, retry', - 'summary': '{turns} turns · {steps} steps', - 'table.showTotals': 'Show total row', - 'contextMode.label': 'Context basis', - 'contextMode.latest': 'Latest', - 'contextMode.latest.title': "Turn rows show the last measured step's prompt size (final context); the total row stays cumulative", - 'contextMode.cumulative': 'Cumulative', - 'contextMode.cumulative.title': "Turn rows show the sum of prompt sizes across the turn's steps (cumulative processing); the total row stays cumulative", - 'totals.full': 'Whole-session total', - 'totals.full.title': 'Totals for the complete session; total time is model time + tool time (no inter-turn gaps)', - 'totals.window': 'Window total', - 'totals.window.title': 'Totals for the turns loaded in this window; the context cell is cumulative across steps', - - 'expand.all': 'Expand all', - 'collapse.all': 'Collapse all', - 'turn.expand': 'Show', - 'turn.collapse': 'Hide', - 'turn.toggle.title': 'Expand or collapse the steps of this turn', - 'turn.toggle.aria': 'Expand or collapse turn {turn}', - 'did.answer': 'answer', - 'did.working': 'generating', - 'did.aborted': 'no answer', - 'did.more': '{count} more', - 'did.rest': '{count} more calls', - 'did.title': '{calls} calls: {tools}', - 'did.retry': 'retried {count}×', - 'did.lines': '{lines} lines', - 'did.lines.unit': 'lines', - 'did.chars': '{chars} chars', - 'did.output': '→ {chars} chars', - 'did.total': '{chars} characters of tool output in this step; they become part of the next prompt', - 'detail.show': 'details', - 'detail.hide': 'hide', - 'detail.title': 'Click this row to expand or collapse the tool details', - 'detail.calls': '{count} tool calls', - 'detail.answer': 'Answer', - 'detail.answer.truncated': 'Answer is long; only the first 16,000 chars are kept', - 'detail.code.title': 'Code block', - 'detail.code.wrap': 'Wrap lines', - 'detail.code.unwrap': 'Do not wrap', - 'detail.footnotes': 'Footnotes', - 'detail.copy': 'Copy', - 'detail.copy.title': 'Copy this text', - 'detail.copied': 'Copied', - 'detail.copyFailed': 'Copy failed', - 'detail.chars': '{chars} chars', - 'detail.lines': '{lines} lines', - 'detail.file': 'file', - 'detail.diff': 'change', - 'detail.emptyBody': 'This call left no text', - 'detail.hidden': '{count} more calls are not listed (at most {limit} per step)', - 'detail.args': 'raw arguments', - 'detail.wrap': 'Wrap', - 'detail.wrap.title': 'Wrap long lines instead of scrolling sideways', - 'detail.raw.title': 'Show the raw JSON arguments', - 'detail.lineCap': 'Showing the first {shown} of {total} lines', - 'detail.truncated': 'Too long: only the first {chars} characters are kept', - 'tool.failed': '{count} failed', - 'tool.failed.title': '{count} tool calls in this step returned an error result', - 'bar.ttft': 'first token {value}', - 'bar.gen': 'generation {value}', - 'bar.tool': 'tool calls {value}', - 'bar.rest': 'other {value}', - 'bar.wall': 'total {value}', - 'bar.running': 'not finished yet: this is elapsed time', - 'bar.gap': 'gap since previous step {value}', - 'bar.start': 'started {clock}', - 'turn.started': 'this turn started at {time}', - 'turn.images': '{count} images', - 'imagePreview.hint': 'Hover or focus to preview this turn\'s images; click to open the full image', - 'imagePreview.dialog': 'Image preview', - 'imagePreview.open': 'View image {index} of {count}', - 'imagePreview.alt': 'Image {index}', - 'imagePreview.loading': 'Loading image…', - 'imagePreview.failed': 'Image failed to load', - 'imagePreview.retry': 'Retry', - 'imagePreview.close': 'Close image preview', - 'steps.total': '{total} steps', - 'steps.tail': 'newest {limit} only', - 'steps.all': 'Show all {total} steps', - 'steps.filter': 'Only {tool}', - 'steps.clear': 'Clear filter', - 'steps.matched': '{count} steps used {tool}', + 'event.source.runtime': 'контекст среды выполнения', + 'event.source.time': 'временной контекст', + 'event.approval.asked': 'ожидание', + 'event.approval.allowed': 'разрешено один раз', + 'event.approval.rejected': 'отклонено', + 'event.approval.cancelled': 'отменено', + 'event.approval.unavailable': 'недоступно', + 'event.title': 'Строки событий вне шагов: изменения запроса, промпта, набора инструментов, повторов, обновления контекста, одобрений и обрезки — не входят в итоги шагов хода', + 'event.reason.initial': 'начальный', + 'event.reason.resume': 'возобновление', + 'event.reason.change': 'изменение', + 'event.reason.series': 'новая серия', + 'event.header.detail': '{reason} · инструментов: {tools}', + 'event.series': 'новая серия', + 'event.system.append': 'дополнение', + 'event.system.replace': 'замена', + 'event.system.clear': 'очистка', + 'event.system.detail': '{action} · {chars} символов', + 'event.tools.added': 'добавлено {tools}', + 'event.tools.removed': 'удалено {tools}', + 'event.prune.detail': 'обрезано {tokens} токенов', + 'step.partial.title': 'События начала и конца этого шага отсутствуют в текущем окне событий (обрезаны при переподключении вкладки или пересборке окна), поэтому для первого токена, времени модели и общего времени нет точки отсчёта; перезагрузка вкладки соберёт данные заново из полного окна', + 'state.running': 'выполняется', + 'state.interrupted': 'прервано', + 'state.cacheMiss': 'промах кэша', + 'state.cacheMiss.title': 'Промпт этого шага почти не попал в кэш: так обычно бывает у первого запроса после перезапуска или возобновления сеанса; вход тарифицируется по полной цене', + 'state.aborted': 'не завершено', + 'state.aborted.title': 'Шаг завершился без готового ответа (обычно отменён или завершился ошибкой)', + 'unknown': 'не записано', + 'partial': 'Вызовов без результата: {count}; это нижняя граница известного времени', + 'empty': 'В текущем окне нет шагов, которые можно измерить.', + 'loadOlder': 'Загрузить более ранние', + 'loadOlder.loading': 'Загрузка более ранних ходов…', + 'loadOlder.done': 'Достигнуто начало истории', + 'loadOlder.failed': 'Не удалось загрузить, повторите', + 'summary': 'Ходов: {turns} · шагов: {steps}', + 'table.showTotals': 'Показывать строку итогов', + 'contextMode.label': 'Учёт контекста', + 'contextMode.latest': 'Последний', + 'contextMode.latest.title': 'Строки ходов показывают размер промпта последнего измеренного шага (итоговый контекст); строка итогов всегда накопительная', + 'contextMode.cumulative': 'Накопительный', + 'contextMode.cumulative.title': 'Строки ходов показывают сумму размеров промптов шагов хода (накопительная обработка); строка итогов всегда накопительная', + 'totals.full': 'Итог всего сеанса', + 'totals.full.title': 'Итоги по всему сеансу; общее время — время модели + время инструментов (без промежутков между ходами)', + 'totals.window': 'Итог окна', + 'totals.window.title': 'Итоги по ходам, загруженным в это окно; контекст — накопительно по шагам', + 'expand.all': 'Развернуть все', + 'collapse.all': 'Свернуть все', + 'turn.expand': 'Показать', + 'turn.collapse': 'Скрыть', + 'turn.toggle.title': 'Развернуть или свернуть шаги этого хода', + 'turn.toggle.aria': 'Развернуть или свернуть ход {turn}', + 'did.answer': 'ответ', + 'did.working': 'генерация', + 'did.aborted': 'без ответа', + 'did.more': 'ещё {count}', + 'did.rest': 'и ещё {count}', + 'did.title': 'Вызовов: {calls} · {tools}', + 'did.retry': 'повторов: {count}', + 'did.lines': '{lines} стр.', + 'did.lines.unit': 'стр.', + 'did.chars': '{chars} симв.', + 'did.output': '→ {chars} симв.', + 'did.total': 'Вывод инструментов на этом шаге — {chars} символов; он войдёт в следующий промпт', + 'detail.show': 'подробности', + 'detail.hide': 'скрыть', + 'detail.title': 'Нажмите на строку, чтобы развернуть или свернуть подробности инструментов', + 'detail.calls': 'вызовов инструментов: {count}', + 'detail.answer': 'Ответ', + 'detail.answer.truncated': 'Ответ слишком длинный; сохранены только первые 16 000 символов', + 'detail.code.title': 'Блок кода', + 'detail.code.wrap': 'Переносить строки', + 'detail.code.unwrap': 'Не переносить', + 'detail.footnotes': 'Сноски', + 'detail.copy': 'Копировать', + 'detail.copy.title': 'Скопировать этот текст', + 'detail.copied': 'Скопировано', + 'detail.copyFailed': 'Не удалось скопировать', + 'detail.chars': '{chars} симв.', + 'detail.lines': '{lines} стр.', + 'detail.file': 'файл', + 'detail.diff': 'изменение', + 'detail.emptyBody': 'У этого вызова нет текста', + 'detail.hidden': 'Не показано вызовов: {count} (не более {limit} на шаг)', + 'detail.args': 'исходные аргументы', + 'detail.wrap': 'Перенос', + 'detail.wrap.title': 'Переносить длинные строки вместо горизонтальной прокрутки', + 'detail.raw.title': 'Показать исходные аргументы JSON', + 'detail.lineCap': 'Показаны первые {shown} из {total} строк', + 'detail.truncated': 'Слишком длинно: сохранены только первые {chars} символов', + 'tool.failed': 'ошибок: {count}', + 'tool.failed.title': 'На этом шаге вызовов инструментов с ошибкой: {count}', + 'bar.ttft': 'первый токен {value}', + 'bar.gen': 'генерация {value}', + 'bar.tool': 'вызовы инструментов {value}', + 'bar.rest': 'остальное {value}', + 'bar.wall': 'всего {value}', + 'bar.running': 'ещё не завершено: это прошедшее время', + 'bar.gap': 'от предыдущего шага {value}', + 'bar.start': 'начало в {clock}', + 'turn.started': 'этот ход начался в {time}', + 'turn.images': '{count} фото', + 'imagePreview.hint': 'Наведите курсор или перейдите фокусом, чтобы посмотреть изображения этого хода; нажмите, чтобы открыть изображение целиком', + 'imagePreview.dialog': 'Просмотр изображения', + 'imagePreview.open': 'Открыть изображение {index} из {count}', + 'imagePreview.alt': 'Изображение {index}', + 'imagePreview.loading': 'Загрузка изображения…', + 'imagePreview.failed': 'Не удалось загрузить изображение', + 'imagePreview.retry': 'Повторить', + 'imagePreview.close': 'Закрыть просмотр изображения', + 'steps.total': 'Шагов: {total}', + 'steps.tail': 'Только последние шаги ({limit})', + 'steps.all': 'Показать все шаги ({total})', + 'steps.filter': 'Только {tool}', + 'steps.clear': 'Сбросить фильтр', + 'steps.matched': 'Шагов с {tool}: {count}', } -/** Portuguese dictionary; ships the English fallback until translated. */ +/** Portuguese dictionary. */ export const pt: Record = { - 'view.perf': 'Statistics', - 'column.scope': 'Turn / step', - 'column.scope.title': 'A turn row holds the turn total; click a row to expand or collapse its steps', - 'column.prompt': 'Trigger', - 'column.prompt.title': 'What opened this turn: a human prompt shows its text, automation shows a source badge', - 'trigger.agent-message': 'Agent message', - 'trigger.team-message': 'Team message', - 'trigger.schedule': 'Scheduled', + 'view.perf': 'Estatísticas', + 'column.scope': 'Turno / etapa', + 'column.scope.title': 'A linha do turno mostra o total do turno; clique em uma linha para expandir ou recolher suas etapas', + 'column.prompt': 'Gatilho', + 'column.prompt.title': 'O que abriu este turno: um prompt humano mostra o texto; uma automação mostra uma etiqueta de origem', + 'trigger.agent-message': 'Mensagem do agente', + 'trigger.team-message': 'Mensagem da equipe', + 'trigger.schedule': 'Agendado', 'trigger.webhook': 'Webhook', - 'trigger.tool-jobs': 'Background job', - 'trigger.cordis-host-runner': 'Plugin run', - 'trigger.subagent-settled': 'Subagent finished', - 'trigger.goal': 'Goal round', - 'trigger.context': 'Context wake', - 'trigger.other': 'Automated turn', - 'column.did': 'Execution', - 'column.did.title': 'Tools this step called and how often; a step without tool calls previews its answer text', - 'column.context': 'Context', - 'column.context.title': 'usage input tokens + cache read + cache write', - 'column.output': 'Output', - 'column.output.title': 'usage output tokens of the step', - 'column.cache': 'Cache hit', - 'column.cache.title': 'cache read ÷ (input + cache read + cache write): the share of the prompt served from cache', - 'cache.detail': 'cache read {read} · input {input} · cache write {write}', - 'column.ttft': 'First token', - 'column.ttft.title': 'step start to the first output fragment (TTFT)', - 'column.model': 'Model time', - 'column.model.title': 'step start to the settled reply (includes the first-token delay)', - 'column.tps': 'Output speed', - 'column.tps.title': 'output tokens ÷ generation seconds (TPS, tok/s)', - 'column.tool': 'Tool time', - 'column.tool.title': 'sum of every tool call up to its result inside the step; calls without a result are excluded', - 'column.time': 'Total time', - 'column.time.title': 'total split: light blue first token, blue generation, orange tool calls, gray everything else. Bar length uses a square-root scale; steps compare only with steps of the same turn, turns with turns', - 'turn.label': 'Turn {turn}', - 'step.label': 'Step {step}', - 'step.toggle.aria': 'Expand or collapse the tool details of step {step}', - 'step.partial': 'start unknown', - 'step.started.title': 'Step started at {time}', - 'compaction.label': 'Compaction', - 'compaction.running': 'Compacting…', - 'compaction.shadowed': 'Pruned {tokens} tokens of history', - 'compaction.summary': 'Summary {chars} chars', - 'compaction.title': "Compaction runs are shown separately and excluded from the turn's step totals", - 'event.show': 'Show event rows (incl. compaction)', - 'context.delta.show': 'Show context delta', - 'context.delta.title': 'Prompt delta against the previous measured step in the turn; negative means the context shrank (for example after compaction)', - 'event.request-header': 'Request header', - 'event.system-prompt': 'System prompt', - 'event.tool-set': 'Tool set change', - 'event.context-prune': 'Context prune', - 'event.request-context': 'Request context', - 'event.model-retry': 'Model retry', - 'event.model-attempt': 'Model attempt', - 'event.context-refresh': 'Context refresh', - 'event.approval': 'Approval', - 'event.context.detail': '{provider} / {model} · prompt mode {mode}', - 'event.retry.detail': 'retry {retry} · wait {delay}', - 'event.attempt.detail': 'Model attempt without a committed message', - 'event.refresh.detail': '{source} · {chars} chars', + 'trigger.tool-jobs': 'Tarefa em segundo plano', + 'trigger.cordis-host-runner': 'Execução de plugin', + 'trigger.subagent-settled': 'Subagente concluído', + 'trigger.goal': 'Rodada de objetivo', + 'trigger.context': 'Reativação de contexto', + 'trigger.other': 'Turno automático', + 'column.did': 'Execução', + 'column.did.title': 'Ferramentas chamadas nesta etapa e com que frequência; uma etapa sem chamadas de ferramenta mostra uma prévia do texto da resposta', + 'column.context': 'Contexto', + 'column.context.title': 'Tokens de entrada do uso + leitura de cache + gravação de cache', + 'column.output': 'Saída', + 'column.output.title': 'Tokens de saída do uso da etapa', + 'column.cache': 'Acerto de cache', + 'column.cache.title': 'Leitura de cache ÷ (entrada + leitura de cache + gravação de cache): a parte do prompt atendida pelo cache', + 'cache.detail': 'Leitura de cache {read} · entrada {input} · gravação de cache {write}', + 'column.ttft': 'Primeiro token', + 'column.ttft.title': 'Início da etapa até o primeiro fragmento de saída (TTFT)', + 'column.model': 'Tempo do modelo', + 'column.model.title': 'Início da etapa até a resposta concluída (inclui o atraso do primeiro token)', + 'column.tps': 'Velocidade de saída', + 'column.tps.title': 'Tokens de saída ÷ segundos de geração (TPS, tok/s)', + 'column.tool': 'Tempo de ferramenta', + 'column.tool.title': 'Soma de cada chamada de ferramenta até o resultado, dentro da etapa; chamadas sem resultado ficam de fora', + 'column.time': 'Tempo total', + 'column.time.title': 'Divisão do total: azul-claro primeiro token, azul geração, laranja chamadas de ferramenta, cinza todo o resto. O comprimento da barra usa escala de raiz quadrada; etapas só se comparam com etapas do mesmo turno, turnos com turnos', + 'turn.label': 'Turno {turn}', + 'step.label': 'Etapa {step}', + 'step.toggle.aria': 'Expandir ou recolher os detalhes de ferramentas da etapa {step}', + 'step.partial': 'início desconhecido', + 'step.started.title': 'Etapa iniciada às {time}', + 'compaction.label': 'Compactação', + 'compaction.running': 'Compactando…', + 'compaction.shadowed': '{tokens} tokens de histórico podados', + 'compaction.summary': 'Resumo de {chars} caracteres', + 'compaction.title': 'As execuções de compactação aparecem separadas e ficam fora dos totais das etapas do turno', + 'event.show': 'Mostrar linhas de evento (incl. compactação)', + 'context.delta.show': 'Mostrar delta de contexto', + 'context.delta.title': 'Delta do prompt em relação à etapa medida anterior no turno; negativo significa que o contexto diminuiu (por exemplo, após a compactação)', + 'event.request-header': 'Cabeçalho da solicitação', + 'event.system-prompt': 'Prompt do sistema', + 'event.tool-set': 'Mudança no conjunto de ferramentas', + 'event.context-prune': 'Poda de contexto', + 'event.request-context': 'Contexto da solicitação', + 'event.model-retry': 'Nova tentativa do modelo', + 'event.model-attempt': 'Tentativa do modelo', + 'event.context-refresh': 'Atualização de contexto', + 'event.approval': 'Aprovação', + 'event.context.detail': '{provider} / {model} · modo de prompt {mode}', + 'event.retry.detail': 'nova tentativa {retry} · espera {delay}', + 'event.attempt.detail': 'Tentativa do modelo sem mensagem confirmada', + 'event.refresh.detail': '{source} · {chars} caracteres', 'event.approval.detail': '{tool} · {status}', - 'event.source.runtime': 'runtime context', - 'event.source.time': 'time context', - 'event.approval.asked': 'waiting', - 'event.approval.allowed': 'allowed once', - 'event.approval.rejected': 'rejected', - 'event.approval.cancelled': 'cancelled', - 'event.approval.unavailable': 'unavailable', - 'event.title': 'Non-step event rows: request, prompt, tool-set, retry, context-refresh, approval, and prune changes excluded from the turn step totals', - 'event.reason.initial': 'initial', - 'event.reason.resume': 'resume', - 'event.reason.change': 'change', - 'event.reason.series': 'new series', - 'event.header.detail': '{reason} · {tools} tools', - 'event.series': 'new series', - 'event.system.append': 'append', - 'event.system.replace': 'replace', - 'event.system.clear': 'clear', - 'event.system.detail': '{action} · {chars} chars', - 'event.tools.added': 'added {tools}', - 'event.tools.removed': 'removed {tools}', - 'event.prune.detail': 'pruned {tokens} tokens', - - - 'step.partial.title': 'This step\'s start and end events are not in the current event window (trimmed while the tab reconnected or the window was rebuilt), so first-token, model time and total have no start to subtract from; reloading the tab reassembles from the full window', - 'state.running': 'running', - 'state.interrupted': 'interrupted', - 'state.cacheMiss': 'cache miss', - 'state.cacheMiss.title': 'The prompt barely hit the cache: usually the first request after a restart or a session resume, paid at full input price', - 'state.aborted': 'unsettled', - 'state.aborted.title': 'The step closed without a settled reply (usually cancelled or failed)', - 'unknown': 'not recorded', - 'partial': '{count} tool calls have no result yet; this is the lower bound of known time', - 'empty': 'No measurable step in the current window.', - 'loadOlder': 'Load earlier', - 'loadOlder.loading': 'Loading earlier turns…', - 'loadOlder.done': 'Beginning of history reached', - 'loadOlder.failed': 'Load failed, retry', - 'summary': '{turns} turns · {steps} steps', - 'table.showTotals': 'Show total row', - 'contextMode.label': 'Context basis', - 'contextMode.latest': 'Latest', - 'contextMode.latest.title': "Turn rows show the last measured step's prompt size (final context); the total row stays cumulative", - 'contextMode.cumulative': 'Cumulative', - 'contextMode.cumulative.title': "Turn rows show the sum of prompt sizes across the turn's steps (cumulative processing); the total row stays cumulative", - 'totals.full': 'Whole-session total', - 'totals.full.title': 'Totals for the complete session; total time is model time + tool time (no inter-turn gaps)', - 'totals.window': 'Window total', - 'totals.window.title': 'Totals for the turns loaded in this window; the context cell is cumulative across steps', - - 'expand.all': 'Expand all', - 'collapse.all': 'Collapse all', - 'turn.expand': 'Show', - 'turn.collapse': 'Hide', - 'turn.toggle.title': 'Expand or collapse the steps of this turn', - 'turn.toggle.aria': 'Expand or collapse turn {turn}', - 'did.answer': 'answer', - 'did.working': 'generating', - 'did.aborted': 'no answer', - 'did.more': '{count} more', - 'did.rest': '{count} more calls', - 'did.title': '{calls} calls: {tools}', - 'did.retry': 'retried {count}×', - 'did.lines': '{lines} lines', - 'did.lines.unit': 'lines', - 'did.chars': '{chars} chars', - 'did.output': '→ {chars} chars', - 'did.total': '{chars} characters of tool output in this step; they become part of the next prompt', - 'detail.show': 'details', - 'detail.hide': 'hide', - 'detail.title': 'Click this row to expand or collapse the tool details', - 'detail.calls': '{count} tool calls', - 'detail.answer': 'Answer', - 'detail.answer.truncated': 'Answer is long; only the first 16,000 chars are kept', - 'detail.code.title': 'Code block', - 'detail.code.wrap': 'Wrap lines', - 'detail.code.unwrap': 'Do not wrap', - 'detail.footnotes': 'Footnotes', - 'detail.copy': 'Copy', - 'detail.copy.title': 'Copy this text', - 'detail.copied': 'Copied', - 'detail.copyFailed': 'Copy failed', - 'detail.chars': '{chars} chars', - 'detail.lines': '{lines} lines', - 'detail.file': 'file', - 'detail.diff': 'change', - 'detail.emptyBody': 'This call left no text', - 'detail.hidden': '{count} more calls are not listed (at most {limit} per step)', - 'detail.args': 'raw arguments', - 'detail.wrap': 'Wrap', - 'detail.wrap.title': 'Wrap long lines instead of scrolling sideways', - 'detail.raw.title': 'Show the raw JSON arguments', - 'detail.lineCap': 'Showing the first {shown} of {total} lines', - 'detail.truncated': 'Too long: only the first {chars} characters are kept', - 'tool.failed': '{count} failed', - 'tool.failed.title': '{count} tool calls in this step returned an error result', - 'bar.ttft': 'first token {value}', - 'bar.gen': 'generation {value}', - 'bar.tool': 'tool calls {value}', - 'bar.rest': 'other {value}', + 'event.source.runtime': 'Contexto de execução', + 'event.source.time': 'Contexto de tempo', + 'event.approval.asked': 'Aguardando', + 'event.approval.allowed': 'Permitido uma vez', + 'event.approval.rejected': 'Rejeitado', + 'event.approval.cancelled': 'Cancelado', + 'event.approval.unavailable': 'Indisponível', + 'event.title': 'Linhas de evento que não são etapas: mudanças de solicitação, prompt, conjunto de ferramentas, nova tentativa, atualização de contexto, aprovação e poda são excluídas dos totais das etapas do turno', + 'event.reason.initial': 'Inicial', + 'event.reason.resume': 'Retomada', + 'event.reason.change': 'Mudança', + 'event.reason.series': 'Nova série', + 'event.header.detail': '{reason} · {tools} ferramentas', + 'event.series': 'Nova série', + 'event.system.append': 'Acréscimo', + 'event.system.replace': 'Substituição', + 'event.system.clear': 'Limpeza', + 'event.system.detail': '{action} · {chars} caracteres', + 'event.tools.added': 'adicionadas: {tools}', + 'event.tools.removed': 'removidas: {tools}', + 'event.prune.detail': '{tokens} tokens podados', + 'step.partial.title': 'Os eventos de início e fim desta etapa não estão na janela de eventos atual (foram cortados quando a aba se reconectou ou a janela foi reconstruída), então o primeiro token, o tempo do modelo e o total não têm um início para subtrair; recarregar a aba remonta os dados a partir da janela completa', + 'state.running': 'Em execução', + 'state.interrupted': 'Interrompido', + 'state.cacheMiss': 'Falha de cache', + 'state.cacheMiss.title': 'O prompt quase não usou o cache: normalmente é a primeira solicitação após uma reinicialização ou retomada de sessão, paga pelo preço integral de entrada', + 'state.aborted': 'Não concluído', + 'state.aborted.title': 'A etapa terminou sem uma resposta concluída (geralmente cancelada ou com falha)', + 'unknown': 'não registrado', + 'partial': '{count} chamadas de ferramenta ainda estão sem resultado; este é o limite inferior do tempo conhecido', + 'empty': 'Nenhuma etapa mensurável na janela atual.', + 'loadOlder': 'Carregar anteriores', + 'loadOlder.loading': 'Carregando turnos anteriores…', + 'loadOlder.done': 'Início do histórico alcançado', + 'loadOlder.failed': 'Falha ao carregar, tentar novamente', + 'summary': '{turns} turnos · {steps} etapas', + 'table.showTotals': 'Mostrar linha de total', + 'contextMode.label': 'Base do contexto', + 'contextMode.latest': 'Mais recente', + 'contextMode.latest.title': 'As linhas de turno mostram o tamanho do prompt da última etapa medida (contexto final); a linha de total continua cumulativa', + 'contextMode.cumulative': 'Cumulativo', + 'contextMode.cumulative.title': 'As linhas de turno mostram a soma dos tamanhos de prompt das etapas do turno (processamento cumulativo); a linha de total continua cumulativa', + 'totals.full': 'Total da sessão inteira', + 'totals.full.title': 'Totais da sessão completa; o tempo total é tempo do modelo + tempo de ferramenta (sem lacunas entre turnos)', + 'totals.window': 'Total da janela', + 'totals.window.title': 'Totais dos turnos carregados nesta janela; a célula de contexto é cumulativa entre as etapas', + 'expand.all': 'Expandir tudo', + 'collapse.all': 'Recolher tudo', + 'turn.expand': 'Mostrar', + 'turn.collapse': 'Ocultar', + 'turn.toggle.title': 'Expandir ou recolher as etapas deste turno', + 'turn.toggle.aria': 'Expandir ou recolher o turno {turn}', + 'did.answer': 'resposta', + 'did.working': 'gerando', + 'did.aborted': 'sem resposta', + 'did.more': 'mais {count}', + 'did.rest': 'mais {count} chamadas', + 'did.title': '{calls} chamadas: {tools}', + 'did.retry': 'repetida {count}×', + 'did.lines': '{lines} linhas', + 'did.lines.unit': 'linhas', + 'did.chars': '{chars} caracteres', + 'did.output': '→ {chars} caracteres', + 'did.total': '{chars} caracteres de saída de ferramentas nesta etapa; eles passam a fazer parte do próximo prompt', + 'detail.show': 'detalhes', + 'detail.hide': 'ocultar', + 'detail.title': 'Clique nesta linha para expandir ou recolher os detalhes de ferramentas', + 'detail.calls': '{count} chamadas de ferramenta', + 'detail.answer': 'Resposta', + 'detail.answer.truncated': 'A resposta é longa; apenas os primeiros 16.000 caracteres são mantidos', + 'detail.code.title': 'Bloco de código', + 'detail.code.wrap': 'Quebrar linhas', + 'detail.code.unwrap': 'Não quebrar', + 'detail.footnotes': 'Notas de rodapé', + 'detail.copy': 'Copiar', + 'detail.copy.title': 'Copiar este texto', + 'detail.copied': 'Copiado', + 'detail.copyFailed': 'Falha ao copiar', + 'detail.chars': '{chars} caracteres', + 'detail.lines': '{lines} linhas', + 'detail.file': 'arquivo', + 'detail.diff': 'alteração', + 'detail.emptyBody': 'Esta chamada não deixou texto', + 'detail.hidden': 'mais {count} chamadas não são listadas (no máximo {limit} por etapa)', + 'detail.args': 'argumentos brutos', + 'detail.wrap': 'Quebrar', + 'detail.wrap.title': 'Quebrar linhas longas em vez de rolar para o lado', + 'detail.raw.title': 'Mostrar os argumentos JSON brutos', + 'detail.lineCap': 'Mostrando as primeiras {shown} de {total} linhas', + 'detail.truncated': 'Muito longo: apenas os primeiros {chars} caracteres são mantidos', + 'tool.failed': '{count} com falha', + 'tool.failed.title': '{count} chamadas de ferramenta nesta etapa retornaram erro', + 'bar.ttft': 'primeiro token {value}', + 'bar.gen': 'geração {value}', + 'bar.tool': 'chamadas de ferramenta {value}', + 'bar.rest': 'outros {value}', 'bar.wall': 'total {value}', - 'bar.running': 'not finished yet: this is elapsed time', - 'bar.gap': 'gap since previous step {value}', - 'bar.start': 'started {clock}', - 'turn.started': 'this turn started at {time}', - 'turn.images': '{count} images', - 'imagePreview.hint': 'Hover or focus to preview this turn\'s images; click to open the full image', - 'imagePreview.dialog': 'Image preview', - 'imagePreview.open': 'View image {index} of {count}', - 'imagePreview.alt': 'Image {index}', - 'imagePreview.loading': 'Loading image…', - 'imagePreview.failed': 'Image failed to load', - 'imagePreview.retry': 'Retry', - 'imagePreview.close': 'Close image preview', - 'steps.total': '{total} steps', - 'steps.tail': 'newest {limit} only', - 'steps.all': 'Show all {total} steps', - 'steps.filter': 'Only {tool}', - 'steps.clear': 'Clear filter', - 'steps.matched': '{count} steps used {tool}', + 'bar.running': 'ainda não terminou: este é o tempo decorrido', + 'bar.gap': 'intervalo desde a etapa anterior {value}', + 'bar.start': 'iniciado às {clock}', + 'turn.started': 'este turno começou às {time}', + 'turn.images': '{count} imagens', + 'imagePreview.hint': 'Passe o mouse ou foque para pré-visualizar as imagens deste turno; clique para abrir a imagem completa', + 'imagePreview.dialog': 'Pré-visualização de imagem', + 'imagePreview.open': 'Ver imagem {index} de {count}', + 'imagePreview.alt': 'Imagem {index}', + 'imagePreview.loading': 'Carregando imagem…', + 'imagePreview.failed': 'Falha ao carregar a imagem', + 'imagePreview.retry': 'Tentar novamente', + 'imagePreview.close': 'Fechar pré-visualização de imagem', + 'steps.total': '{total} etapas', + 'steps.tail': 'apenas as {limit} mais recentes', + 'steps.all': 'Mostrar todas as {total} etapas', + 'steps.filter': 'Apenas {tool}', + 'steps.clear': 'Limpar filtro', + 'steps.matched': '{count} etapas usaram {tool}', }