{{ t('ui.dash.as_of') }} {{ clock(loadedAt) }} {{ t('ui.dash.refresh_note') }}
{{ t('ui.rates.as_of') }} {{ rateAsOf }}
{{ t(failureScope==='service'?'ui.failure.event_basis_service':'ui.failure.event_basis') }}
{{ t('ui.failure.unknown_title',{n:unknownView.total}) }}
{{ t('ui.failure.unknown_note') }}
{{ t('ui.failure.loading') }}
{{ rowTime(r) }}{{ r.machine_code }}{{ r.reason }}
{{ t('ui.dash.empty') }}
{{ unknownView.page }} / {{ Math.max(1,Math.ceil(unknownView.groups/20)) }}
{{ winName(tableMinutes) }}
{{ selectedWindow.rate==null?'—':selectedWindow.rate.toFixed(1) }}%
{{ judgeChip.text }}
{{ t('ui.failure.fraction',{n:fmt(selectedWindow.failures||0),base:fmt(selectedWindow.base||0)}) }}
{{ t('ui.failure.contribution',{u:selectedWindow.user,s:selectedWindow.system,ur:selectedWindow.user_rate==null?'—':selectedWindow.user_rate+'%',sr:selectedWindow.system_rate==null?'—':selectedWindow.system_rate+'%'}) }}
{{ spark.from }}{{ t('ui.dash.trend_12h') }}{{ spark.to }}
{{ t('ui.dash.by_account') }}
{{ t('ui.common.empty_accounts') }}
{{ t('ui.service.causes') }}
{{ t('ui.dash.empty') }}
{{ t('ui.dash.other_windows') }}
{{ t('ui.common.filter') }}
{{ t('ui.words.time') }}
{{ t('ui.words.user') }}
{{ t('ui.dash.col_acct') }}
{{ t('ui.words.model') }}
{{ t('ui.dash.col_err') }}
{{ t('ui.dash.col_n') }}
{{ hourRange(r.last_at) }}
{{ t('ui.failure.events') }} {{ tbl.hours[hourKey(r.last_at)].failures }} / {{ t('ui.failure.base') }} {{ fmt(tbl.hours[hourKey(r.last_at)].base) }}
{{ failureTitle }} {{ tbl.hours[hourKey(r.last_at)].rate===null?'—':tbl.hours[hourKey(r.last_at)].rate.toFixed(1)+'%' }}
{{ rowTime(r) }}{{ r.machine_code }}
{{ r.email||r.username||'?' }}
{{ r.username }}
{{ acctName(a) }}+{{ r.accounts.length-2 }}{{ t('ui.dash.no_account') }}
{{ r.model||'-' }}
{{ chips[r.side] }} · {{ short[r.label]||r.label }}{{ r.model||'-' }} · {{ codeText(r) }} · {{ r.reason }}
×{{ r.n }}1
{{ t('ui.dash.empty') }}
{{ t('ui.failure.truncated') }}
{{ t('ui.dash.acct_card', {win: winName(tableMinutes)}) }}{{ t('ui.dash.sched_count', {a: ov.accounts.filter(a=>a.schedulable&&a.status==='active').length, b: ov.accounts.length}) }}
{{ t('ui.words.account') }}
{{ t('ui.dash.col_frac') }}
{{ t('ui.dash.col_rate') }}
{{ acctLabel(a.name, a.account_id) }} {{ t('ui.words.unsched') }}{{ a.status }}
{{ acctSub(a) }}
{{ a.base ? (a.up+' / '+fmt(a.base)) : '—' }}
{{ a.rate===null?'—':a.rate.toFixed(1)+'%' }}
{{ t('ui.common.empty_accounts') }}
{{ t('ui.service.causes') }}
{{ chips[r.side] }}{{ labels[r.label]||r.label }}{{ r.n }}
{{ t('ui.dash.empty') }}
{{ t(failureScope==='service'?'ui.service.user_card':'ui.dash.user_card', {win: winName(tableMinutes)}) }}
{{ t('ui.words.user') }}
{{ t('ui.dash.col_frac') }}
{{ t('ui.dash.col_rate') }}
{{ userMain(u) }}
{{ userNick(u) }} · {{ t('ui.dash.mainly') }} {{ short[u.top_label]||u.top_label }} · {{ t('ui.failure.events') }} {{ u.failures }}
{{ u.base ? (u.failures+' / '+fmt(u.base)) : '—' }}
{{ u.rate===null?'—':u.rate.toFixed(u.rate>=10?0:1)+'%' }}
{{ t('ui.dash.empty') }}
{{ t('ui.words.machine') }}
{{ c.t }}
{{ t('ui.failure.breakdown_title') }}
{{ m.code }}{{ m.name }}
{{ rateTxt(m.summary[c.k]) }}
{{ fracTxt(m.summary[c.k]) }}
{{ userTxt(m.summary[rateKey]) }}
{{ t('ui.rates.total_row', {n: rates.data.total.n}) }}
{{ rateTxt(rates.data.total.summary[c.k]) }}
{{ fracTxt(rates.data.total.summary[c.k]) }}
{{ userTxt(rates.data.total.summary[rateKey]) }}
{{ t('ui.rates.empty') }}
{{ t('ui.common.total_items', {n: rateRows.length}) }}
{{ hourTable?hourTable.title:t('ui.rates.heat_hour') }}
{{ t('ui.words.machine') }}
{{ c }}
{{ r.code }}
{{ s?hpct(s):'' }}
{{ t('ui.rates.total_row', {n: hourTable.n}) }}
{{ s?hpct(s):'' }}
{{ ratePicked.length ? t('ui.rates.heat_empty') : t('ui.rates.no_pick') }}
{{ t('ui.usage.sub', {tz: tzName, t: usage.synced_at?tmL(usage.synced_at):'—'}) }}
{{ t('ui.words.user') }}
{{ t('ui.usage.col_mg') }}
{{ i+1 }}{{ u.who }}
{{ u.machines.join(' ') }}
${{ fmtMoney(u.totals[r].actual) }}
{{ t('ui.usage.requests', {n: fmt(u.totals[r].requests)}) }} · {{ fmtTok(u.totals[r].tokens) }}
{{ t('ui.usage.empty') }}
{{ t('ui.common.total_items', {n: usage.top.length}) }}
{{ t('ui.usage.col_mu') }}
{{ m.code }} {{ m.tail }}
${{ fmtMoney(m.totals[r].actual) }}
{{ u._i }}{{ u.email||u.username||('#'+u.user_id) }}
{{ u.email && u.username ? u.username : '' }}
${{ fmtMoney(u.totals[r].actual) }}
{{ t('ui.usage.requests', {n: fmt(u.totals[r].requests)}) }}
{{ t('ui.usage.empty_machine') }}
{{ t('ui.usage.empty') }}
{{ t('ui.settings.nav_machines') }}
{{ m.name }} sub2api {{ m.sub2api_version }}{{ t('ui.words.mstate_disabled') }}
{{ m.site_url||'-' }} · {{ m.ssh_user }}@{{ m.ssh_host }}:{{ m.ssh_port }}
{{ fmt(m.ok_24h) }}{{ t('ui.machines.ok_24h') }}
{{ fmt(m.err_24h) }}{{ t('ui.machines.err_24h') }}
{{ m.up_24h }}{{ t('ui.machines.up_24h') }}
{{ mstateText(m) }} · {{ mpollText(m) }}
{{ t('ui.machines.egress', {ip: m.egress_ip, t: m.egress_ip_at?tmL(m.egress_ip_at):'—'}) }}
{{ t('ui.machines.egress_none') }}
{{ t('ui.machines.hostkey') }} {{ m.hostkey_fp }}
{{ t('ui.machines.key_set') }}{{ t('ui.machines.key_unset') }}
{{ t('ui.machines.empty') }}
{{ t('ui.settings.nav_channels') }}
{{ t('ui.machines.f_name') }}
{{ t('ui.notify.c_type') }}
{{ t('ui.notify.col_config') }}
{{ t('ui.accounts.col_state') }}
{{ c.name }}
{{ c.type==='telegram'?'Telegram':t('ui.notify.type_feishu') }}
{{ c.type==='telegram'?('chat '+c.config.chat_id):(c.config.webhook_url||'') }}
{{ c.enabled?t('ui.common.enabled'):t('ui.common.disabled') }}
{{ t('ui.notify.empty_channels') }}
{{ t('ui.settings.sec_rules') }}
{{ t('ui.settings.g_collect') }}
{{ t('ui.settings.g_digest') }}
{{ t('ui.settings.g_expiry_ai') }}
{{ t('ui.notify.security') }}
{{ t('ui.notify.pk_col') }}
{{ t('ui.notify.pk_created') }}
{{ t('ui.notify.pk_last') }}
{{ k.name }} {{ t('ui.notify.pk_synced') }}
{{ k.transports||'—' }}
{{ tmL(k.created_at) }}
{{ k.last_used_at?tmL(k.last_used_at):t('ui.notify.pk_unused') }}
{{ t('ui.notify.pk_empty') }}
{{ t('ui.notify.pk_unsupported_pre') }} {{ auth.rp_origin||('https://'+auth.rp_id) }} {{ t('ui.notify.pk_unsupported_post') }}
{{ t('ui.notify.sessions') }}
{{ t('ui.notify.ss_method') }}
IP
{{ t('ui.notify.ss_last') }}
{{ t('ui.notify.ss_exp') }}
{{ s.method==='passkey'?(t('ui.notify.ss_passkey')+(s.label?' · '+s.label:'')):t('ui.notify.ss_pw') }} {{ t('ui.notify.ss_current') }}
{{ s.ip }}
{{ tmL(s.last_seen_at) }}
{{ tmL(s.expires_at) }}
{{ t('ui.notify.log') }}
{{ t('ui.words.time') }}
{{ t('ui.notify.log_kind') }}
{{ t('ui.words.machine') }}
{{ t('ui.notify.log_channel') }}
{{ t('ui.notify.log_result') }}
{{ tmL(n.created_at) }}
{{ kindName(n.kind) }}
{{ n.machine_name||'-' }}
{{ n.channel_name||'-' }}
{{ n.ok?t('ui.common.ok'):t('ui.common.fail') }} {{ n.detail }}
{{ t('ui.notify.log_empty') }}
{{ t('ui.settings.sec_digest') }}
{{ dg.text }}