Files
openclaw-config/cache/control-ui-assets/d08fd045b9cb86d13f0b4aa403c8a06ddcd32e533058ae463245169e5cff5e85/assets/control-ui-core-Br5DB0Zj.js
T

1108 lines
354 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./zh-CN-BDyHCHaR.js","./rolldown-runtime-DkW27tQK.js","./zh-TW-bniZU45R.js","./pt-BR-q1CxtPN7.js","./de-CsWCVeir.js","./es-gnNoOceK.js","./ja-JP-ofw9hrwQ.js","./ko-EhrHl2qd.js","./fr-C_P7mm2_.js","./hi-CSbbtGy_.js","./ar-DX3Bj1-2.js","./it-BO5kiNQ2.js","./tr-kvZ06KIs.js","./uk-zO5ZpLm2.js","./id-D2zrqmdp.js","./pl-JXP7ECuq.js","./th-BM4ZX7It.js","./vi-BbZwfy0a.js","./nl-CbGcre6k.js","./fa-BWFMf9T6.js","./ru-C0I-R-aJ.js","./github-link-hovercard.runtime-CDrMcW--.js","./control-ui-foundation-CeFMP1Ly.js","./control-ui-core-pH6nakZ-.js","./lit-runtime-BEtFSUCp.js","./control-ui-core-DGVkFhVB.js","./gateway-runtime-DUNO4Mi1.js","./control-ui-core-C8H8-RSs.css","./control-ui-boot-wpHCbPL9.js","./control-ui-boot-gfE6fZcA.js","./portaled-hovercard-Cn6SxKYU.js"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ei as t,Fi as n,Mt as r,Nn as i,Nr as a,Ot as o,Pr as s,c,er as l,l as ee,nr as u,wn as d}from"./control-ui-foundation-CeFMP1Ly.js";import{Q as f,U as te,W as ne,Y as re,Z as ie,_r as ae,dl as oe,dr as se,fl as ce,fr as le,fs as ue,gr as de,hl as fe,hr as pe,i as me,lr as he,ml as p,mr as ge,ms as _e,pl as ve,pr as ye,q as be}from"./control-ui-core-pH6nakZ-.js";import{G as m,J as h,W as g,X as _,Z as v,at as y,et as xe,lt as b}from"./lit-runtime-BEtFSUCp.js";import{$n as Se,Dn as Ce,Nt as we,Pt as Te,Tn as Ee,Un as De,qn as Oe,tr as ke,zn as Ae}from"./control-ui-core-DGVkFhVB.js";var je,Me,Ne,Pe;function Fe(){return(Fe=e((()=>{je={menuLabel:`Agent menu`,agents:`Agents`,switchAgent:`Switch agent`,working:`Working…`,ready:`Ready to chat`,whatCanAgentDo:`What can {name} do?`,help:`Help`,getHelp:`Get help`,getApps:`Get the apps`,discord:`Discord community`,viewChangelog:`View changelog`,agentSettings:`Agent settings`},Me={label:`Agent scope`,allAgents:`All agents`},Ne={pinToSwitcher:`Pin to switcher`,unpinFromSwitcher:`Unpin from switcher`},Pe={title:`Identity`,subtitle:`Name, emoji, and avatar shown in chats and the sidebar.`,name:`Display name`,namePlaceholder:`Agent name`,emoji:`Emoji`,chooseImage:`Choose image…`,replaceImage:`Replace image…`,imageUnusable:`That image can't be used. Pick an image file up to 2 MB.`,fileHint:`Saving mirrors identity fields to IDENTITY.md; configured values take precedence.`}})))()}var Ie;function Le(){return(Le=e((()=>{Fe(),Ie={capacityMeter:{workerSlots:`{used} of {total} slots busy`,unavailable:`Slot utilization unavailable`,execHost:`Codex exec`},common:{health:`Health`,ok:`OK`,yes:`Yes`,no:`No`,default:`Default`,active:`Active`,loading:`Loading…`,gatewayStarting:`Gateway starting…`,refreshing:`Refreshing…`,offline:`Offline`,connect:`Connect`,connected:`Connected`,refresh:`Refresh`,retry:`Retry`,staleData:`Showing stale data.`,reload:`Reload`,reset:`Reset`,restore:`Restore`,unarchive:`Unarchive`,undo:`Undo`,probe:`Probe`,call:`Call`,confirm:`Confirm`,dontAskAgain:`Don't ask me again`,cancel:`Cancel`,close:`Close`,previous:`Previous`,next:`Next`,continue:`Continue`,back:`Back`,create:`Create`,copy:`Copy`,copied:`Copied!`,copyFailed:`Copy failed`,copyCode:`Copy code`,copyTable:`Copy table`,expandTable:`Expand table`,expandedTable:`Expanded table`,closeTable:`Close expanded table`,resizeSplitView:`Resize split view`,delete:`Delete`,remove:`Remove`,dismiss:`Dismiss`,dismissAndDontShowAgain:`Dismiss and don't show again`,unselect:`Unselect`,enabled:`Enabled`,disabled:`Disabled`,failed:`Failed`,none:`none`,na:`n/a`,never:`never`,justNow:`just now`,now:`now`,unknown:`Unknown`,configured:`Configured`,running:`Running`,linked:`Linked`,mode:`Mode`,system:`System`,light:`Light`,dark:`Dark`,baseUrl:`Base URL`,lastStart:`Last start`,lastProbe:`Last probe`,lastConnect:`Last connect`,lastMessage:`Last message`,authAge:`Auth age`,credential:`Credential`,audience:`Audience`,publicKey:`Public Key`,probeOk:`Probe ok`,probeFailed:`Probe failed`,reloadConfig:`Reload Config`,loadConfig:`Load config`,loadApprovals:`Load approvals`,settingsSections:`Settings sections`,version:`Version`,docs:`Docs`,learnMore:`Learn more`,colorMode:`Color mode`,colorModeOption:`Color mode: {mode}`,search:`Search`,save:`Save`,saving:`Saving…`,saveAndPublish:`Save & Publish`,importing:`Importing…`,importFromRelays:`Import from Relays`,showAdvanced:`Show Advanced`,hideAdvanced:`Hide Advanced`,unsavedChanges:`You have unsaved changes`,working:`Working…`,showQr:`Show QR`,relink:`Relink`,waitForScan:`Wait for scan`,logout:`Logout`,skipToMainContent:`Skip to main content`},focus:{unsupported:`This focused view is not supported.`},shortcutsOverlay:{title:`Keyboard shortcuts`,sections:{general:`General`,chat:`Chat`,panels:`Panels`,sidebar:`Sidebar`,imageViewer:`Image viewer`,approvals:`Approvals`},labels:{commandPalette:`Open command palette`,keyboardShortcuts:`Show keyboard shortcuts`,toggleSidebar:`Toggle sidebar`,debugOverlay:`Toggle debug overlay`,appearanceSettings:`Open appearance settings`,startNewSession:`Start new session (from the new-session page)`,closeDialog:`Close dialog or exit settings`,sendMessage:`Send message`,newline:`Insert new line`,steerImmediately:`Steer active response`,historyRecall:`Browse sent message history`,transcriptSearch:`Search conversation`,clearReply:`Clear reply`,stopResponse:`Stop active response`,cancelDictation:`Cancel dictation`,saveQueuedMessage:`Save queued message`,toggleSessionSelect:`Select multiple sessions`,extendSessionSelect:`Extend session selection`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,zoomReset:`Reset zoom`,terminalPanel:`Toggle terminal panel`,workspaceFiles:`Toggle workspace files`,approveOnce:`Approve once`,approveAlways:`Always allow`,denyApproval:`Deny approval`}},optionCard:{recommended:`Recommended`,skip:`Skip for now`},nativeLinkMenu:{label:`Link actions`,openInline:`Open in Sidebar`,openExternal:`Open in Default Browser`,copy:`Copy Link`},browserLinkPreferences:{openInControlUi:`Open links in Control UI browser`},filePreview:{label:`Support files`,listLabel:`Files`,searchPlaceholder:`Search files…`,readOnly:`read-only`,emptyTitle:`No files match`,emptySubtitle:`Try another file name or content search.`,copyFile:`Copy file`,fileCount:`{count} files`,filteredFileCount:`{count}/{total} files`,noMatches:`No files match.`,navigate:`navigate`,kind:{text:`Text`,shell:`Shell`,file:`File`}},mcpApp:{title:`MCP App`,unavailable:`MCP App unavailable: {error}`,errors:{gatewayUnavailable:`MCP App gateway unavailable`,mountUnavailable:`MCP App mount unavailable`,sandboxTimedOut:`MCP App sandbox timed out`,sandboxUnavailable:`MCP App sandbox unavailable`,initializationTimedOut:`MCP App initialization timed out`,requestFailed:`Request failed`,invalidSandboxUrl:`MCP App sandbox URL is invalid`}},githubPreview:{coAuthors:`Co-authored by {logins}`,loading:`Loading GitHub details…`,unavailable:`GitHub preview unavailable`,states:{merged:`Merged`,draft:`Draft`,open:`Open`,closed:`Closed`,notPlanned:`Not planned`},file:`{count} file`,files:`{count} files`,comment:`{count} comment`,comments:`{count} comments`,pullRequest:`pull request`,issue:`issue`,ariaLabel:`{state} {kind} {repo} #{number}: {title}, by {author}`},sessionHovercard:{ariaLabel:`Session information`,moreParticipants:`+{count}`,moreParticipantsLabel:`{count} more participants`,projectLabel:`Project`,workspaceLabel:`Workspace`,branchLabel:`Branch`,runsOn:`Runs on {providerId} · {profileId}`,more:`+{count} more`,changedFile:`{count} file`,changedFiles:`{count} files`,pullRequestLabel:`Pull request #{number}, {state}`,pullRequestAuthorLabel:`Opened by {login}`,states:{open:`Open`,draft:`Draft`,merged:`Merged`,closed:`Closed`},checks:{passing:`CI checks passing`,failing:`CI checks failing`,pending:`CI checks running`}},sessionProgressCard:{title:`Progress`,composerTitle:`Task progress`,shortCount:`{completed} of {total}`,noteLabel:`Progress note`,dismiss:`Dismiss progress card`,dismissFailed:`Could not dismiss the progress card. Try again.`,widgetLabel:`Session progress`,widgetLoading:`Loading session progress…`,widgetEmpty:`No progress card yet`,widgetUnavailable:`Session progress is unavailable.`,widgetAccessDenied:`Select a session you can access or change sharing for this session.`,countLabel:`{completed} of {total} completed`,activity:{updated:`Updated {time}`,completed:`Completed {time}`,failed:`Failed {time}`,stopped:`Stopped {time}`},outcome:{completed:`Completed`,failed:`Failed`,stopped:`Stopped`},stepLabel:`{step}, {status}`,status:{completed:`completed`,failed:`failed`,inProgress:`in progress`,paused:`paused`,pending:`pending`,stopped:`stopped`},receipt:{updating:`Updating progress`,failed:`Progress update failed`,updated:`Progress updated — {completed}/{total} · {current}`,noteUpdated:`Progress note updated`,cleared:`Progress cleared`}},channels:{lastError:`Last error`,refreshingStaleSnapshot:`Refreshing channel status in the background; showing the last successful snapshot.`,hub:{connectedTitle:`Connected channels`,addTitle:`Add a channel`,addSubtitle:`Pick a service and follow the guided setup.`,updatedAgo:`Updated {ago}`,noneConnected:`No channels connected yet. Pick one below to get started.`,partialSnapshot:`Some channel checks did not finish before the UI budget.`,stateRunning:`Running`,stateConfigured:`Configured`,stateAttention:`Needs attention`,setUp:`Set up`,guidedSetup:`Guided step-by-step setup`,openDetails:`Open details`,lastMessageAgo:`Last message {ago}`,browseAllTitle:`More channels…`,browseAllSubtitle:`Browse every available channel, including installable plugins.`,runSetup:`Run setup`,adminRequired:`Browsing only. Channel setup requires operator.admin access.`,saveBeforeSetup:`You have unsaved channel config changes. Save or reload them before running guided setup.`},pairing:{title:`DM access requests`,subtitle:`Review people waiting to send direct messages to pairing-protected channels.`,channelFilter:`Channel`,accountFilter:`Account`,allChannels:`All channels`,allAccounts:`All accounts`,approve:`Approve`,dismiss:`Dismiss`,approveAria:`Approve {sender} for {channel}, account {account}`,dismissAria:`Dismiss {sender} for {channel}, account {account}`,requested:`Requested {ago}`,expires:`Expires {ago}`,senderDetails:`Sender details`,missingPermission:`This connection does not have operator.pairing access, so DM requests cannot be reviewed.`,noAccounts:`No configured channel accounts use DM sender pairing.`,noRequests:`No pending DM access requests.`,noFilteredRequests:`No pending requests match these filters.`,limits:`Requests expire after {minutes} minutes. Each channel account can hold up to {count} pending requests.`,detailTitle:`DM access`,detailSubtitle:`People must be approved before their direct messages reach the agent.`,pendingCount:`{count} pending`,noPending:`No pending requests`,review:`Review requests`,approveDialogTitle:`Approve DM access`,dismissDialogTitle:`Dismiss DM access request`,approveExplanation:`This lets the sender talk to the agent in direct messages. It does not grant group access.`,dismissExplanation:`This removes the current request but does not block the sender. They can request access again later.`,notifyRequester:`Notify the requester after approval`,makeCommandOwner:`Also make this sender the first command owner`,commandOwnerHelp:`Command owners can run privileged commands and approve dangerous actions. This option is only available while no owner is configured.`,commandOwnerNeedsAdmin:`No command owner is configured. This connection needs operator.admin to assign the first owner.`,approvedNotice:`DM access approved.`,approvedOwnerNotice:`DM access approved and the first command owner was configured.`,approvedNotificationFailedNotice:`DM access approved, but the requester notification could not be delivered.`,approvedOwnerFailedNotice:`DM access approved, but the first command owner could not be configured.`,approvedFollowupsFailedNotice:`DM access approved, but requester notification and command-owner setup both failed.`,dismissedNotice:`DM access request dismissed. The sender can request access again.`},setup:{dialogLabel:`Set up {channel}`,title:`Set up {channel}`,genericTitle:`a channel`,subtitle:`Guided channel setup`,starting:`Starting setup…`,working:`Working…`,sessionExpired:`This setup session expired after the Gateway restarted. Close this dialog, then start channel setup again.`,continue:`Continue`,finish:`Finish`,copyText:`Copy`,openLink:`Open link`,viewDocs:`View docs`,doneTitle:`Channel configured`,doneBody:`Configuration saved. The gateway reloads the channel automatically; check its card for live status.`,doneNoChangesTitle:`No changes made`,doneNoChangesBody:`Setup finished without configuring a channel. Nothing was saved.`,whatsappScanTitle:`Link WhatsApp by scanning the QR code`,whatsappScanHelp:`On your phone, open WhatsApp → Settings → Linked devices → Link a device, then scan this code.`,whatsappQrLoading:`Generating QR code…`,whatsappQrHint:`Click Show QR to generate a pairing code.`,whatsappQrAlt:`WhatsApp QR`,whatsappLinked:`WhatsApp is linked and ready.`,regenerateQr:`New QR code`,linkLater:`Link later`},config:{schemaUnavailable:`Schema unavailable. Use Raw.`,channelSchemaUnavailable:`Channel config schema unavailable.`,loadingSchema:`Loading config schema…`},generic:{subtitle:`Channel status and configuration.`},discord:{title:`Discord`,subtitle:`Bot status and channel configuration.`},googleChat:{title:`Google Chat`,subtitle:`Chat API webhook status and channel configuration.`},imessage:{title:`iMessage`,subtitle:`macOS bridge status and channel configuration.`},signal:{title:`Signal`,subtitle:`signal-cli status and channel configuration.`},slack:{title:`Slack`,subtitle:`Socket mode status and channel configuration.`},telegram:{title:`Telegram`,subtitle:`Bot status and channel configuration.`},whatsapp:{title:`WhatsApp`,subtitle:`Link WhatsApp Web and monitor connection health.`,phoneNumber:`Phone number`,loggedOut:`Logged out.`,logoutConfirmTitle:`Log out of WhatsApp account {accountId}?`,logoutConfirmMessage:`Logging out of account {accountId} stops its listener and deletes its saved credentials.`,logoutNotCleared:`No stored WhatsApp session was cleared. It may already be absent, or its auth directory may require manual cleanup.`},gatewayUrlConfirmation:{title:`Change Gateway URL`,subtitle:`This will reconnect to a different gateway server`,warning:`Only confirm if you trust this URL. Malicious URLs can compromise your system.`},nostr:{title:`Nostr`,subtitle:`Decentralized DMs via Nostr relays (NIP-04).`,profile:`Profile`,editProfile:`Edit Profile`,profilePicture:`Profile picture`,noProfile:`No profile set.`,noProfileHint:`Click "Edit Profile" to add your name, bio, and avatar.`,name:`Name`,displayName:`Display Name`,about:`About`,advanced:`Advanced`,profilePicturePreview:`Profile picture preview`,account:`Account`,username:`Username`,usernameHelp:`Short username (e.g., satoshi)`,bio:`Bio`,bioPlaceholder:`Tell people about yourself...`,bioHelp:`A brief bio or description`,displayNameHelp:`Your full display name`,avatarUrl:`Avatar URL`,avatarHelp:`HTTPS URL to your profile picture`,bannerUrl:`Banner URL`,bannerHelp:`HTTPS URL to a banner image`,website:`Website`,websiteHelp:`Your personal website`,nip05Identifier:`NIP-05 Identifier`,nip05Help:`Verifiable identifier (e.g., you@domain.com)`,lightningAddress:`Lightning Address`,lightningHelp:`Lightning address for tips (LUD-16)`,placeholders:{username:`satoshi`,displayName:`Satoshi Nakamoto`,avatarUrl:`https://example.com/avatar.jpg`,bannerUrl:`https://example.com/banner.jpg`,website:`https://example.com`,nip05:`you@example.com`,lightningAddress:`you@getalby.com`},notices:{timeout:`Request timed out after 30 seconds; the server may still have applied the change — check the profile before retrying.`,operationFailed:`{prefix}: {error}`,updateFailed:`Profile update failed`,updateFailedStatus:`Profile update failed ({status})`,publishFailed:`Profile publish failed on all relays.`,published:`Profile published to relays.`,importFailed:`Profile import failed`,importFailedStatus:`Profile import failed ({status})`,importedFromRelays:`Profile imported from relays. Review and publish.`,imported:`Profile imported. Review and publish.`}}},lazyView:{errorTitle:`Panel failed to load`,genericSubtitle:`Something went wrong while loading this panel.`,staleTitle:`A new version is available`,staleSubtitle:`OpenClaw was updated in the background. Reload to get the latest panel.`,reloading:`Reloading…`,retry:`Retry`,stylesFailed:`Styles failed to load, so the page may look broken.`},updates:{adminRequired:`Administrator access is required to change update settings or start an update.`,campaign:{countdown:`Updating in {time}`,waitingForIdle:`Waiting for active work · forced update in {time}`,held:`Update held · resumes in {time}`,applying:`Applying update…`},holdOneHour:`Hold 1 h`,reviewUpdate:`Review update`,confirm:{message:`Installs the available update on the connected Gateway and restarts it.`,macMessage:`Hands this update to the OpenClaw Mac app, which installs it and restarts the Gateway it manages.`,impact:`Running sessions are interrupted and this Control UI disconnects until the Gateway is back.`,versions:`Installed {installed} · Available {available}`,versionsBehind:`Installed {installed} · {available}`,action:`Update and restart`,macAction:`Update Mac app and restart`},target:{version:`v{version}`,commitBehind:`{count} commit behind`,commitsBehind:`{count} commits behind`},sidebar:{campaignTarget:`{status} · {target}`,updating:`Updating Gateway…`,availableTitle:`Update available`,availableSummary:`A newer revision is ready.`,blockedTitle:`Update blocked`,blockedSummary:`The selected revision could not be applied to this checkout.`,blockedWaiting:`Blocked · waiting for active work · {target}`,waitingForIdle:`Waiting for active work`},dialog:{installing:`Installing the update on the Gateway. It restarts once the install finishes.`,restarting:`The Gateway is restarting. This page disconnects and reconnects on its own.`,notStarted:"The update request went unanswered. Try again, or run `openclaw update` in the terminal."},channel:{stable:`Stable`,beta:`Beta`,dev:`Dev`,extendedStable:`Extended stable`},installKind:{package:`Package`,git:`Git checkout`,unknown:`Unknown`},page:{intro:`Manage the connected Gateway's release channel and update policy.`,buildTitle:`Current build`,gatewayVersion:`Gateway version`,controlUiCommit:`Control UI commit`,builtAt:`Built`,installedAt:`Installed`,installedAtUnknown:`Unknown · recorded after the next successful update`,lastCommitAt:`Last commit`,installKind:`Install type`,policyTitle:`Update policy`,channel:`Release channel`,channelDescription:`Choose which OpenClaw release track this Gateway follows.`,automaticUpdates:`Automatic updates`,automaticUpdatesDescription:`Schedule available updates automatically. Dev auto-updates apply to git checkouts.`,devPackageAutomaticHint:`Automatic dev updates require a source (git) install. This install is a package install — use stable or beta for automatic updates.`,extendedStableAutomaticHint:`Extended stable reports available releases but never installs them automatically.`,statusTitle:`Update status`,scheduleStatus:`Status`,commits:`Commits`,available:`Update available {target}`,upToDate:`Up to date`,statusUnavailable:`Update status unavailable`,gitCommitAhead:`{count} commit ahead of tracked upstream`,gitCommitsAhead:`{count} commits ahead of tracked upstream`,gitDiverged:`Diverged · {ahead} ahead, {behind} behind`,gitFetchFailed:`Could not fetch the tracked upstream`,gitNoUpstream:`No tracked upstream is configured`,gitComparisonFailed:`Could not compare this checkout with its tracked upstream`,updateNow:`Update now`,updateNowDescription:`Install the available update and restart the Gateway.`,latestAttempt:`Latest update attempt`,attemptedAt:`Attempted`,attemptTarget:`Target`,installedIdentity:`Installed`,attemptInstallKind:`Attempt install type`,attemptReason:`Reason code`,failedStep:`Failure details`,viewDetails:`View details`,recoveryActions:`Recovery`,checkStatus:`Check status`,retryUpdate:`Retry update`,troubleshoot:`Troubleshoot updates`,cliFallback:`CLI fallback`,showCliFallback:`Show terminal commands`},coalescedRestart:`Update installed. A gateway restart is already in progress; status will refresh after it reconnects.`,error:`Update error: {error}`,status:`Update {status}: {reason}. {guidance}`,verificationFailed:`Update installed but running version did not change — restart may have been blocked.`,verificationFailedWithVersions:`Update installed but running version did not change — restart may have been blocked. Expected v{expectedVersion}, running v{actualVersion}.`,verificationFailedWithIdentity:`Update finished, but the running install does not match the expected revision. Expected {expected}, running {actual}.`,handoffTimeout:"Update handoff started, but completion was not reported after reconnect. Run `openclaw update status` for the final result.",outcomeUnknown:"The update request may have been accepted, but the Gateway did not report a final result after reconnect. Run `openclaw update status` before retrying.",failureReasons:{dirty:`Commit or stash changes, then retry.`,noUpstream:`Set an upstream branch, then retry.`,notGitInstall:"Not a git checkout. Run `openclaw update` from the CLI for a global reinstall.",notOpenclawRoot:`Run the update from an OpenClaw checkout or use the CLI global reinstall path.`,depsInstallFailed:`Dependency install failed. Fix the install error and retry.`,buildFailed:`Build failed. Fix the build error and retry.`,buildDirty:`The selected revision's build changed checkout files. Retry with a revision that includes its generated artifacts.`,uiBuildFailed:`The control UI rebuild failed. Fix the UI build error and retry.`,globalInstallFailed:`The global package install did not verify on disk. Retry or reinstall from the CLI.`,restartDisabled:`The update was not applied because gateway restarts are disabled. Enable restarts in config, then retry.`,restartUnavailable:`This global install cannot be safely replaced while restarts are disabled and no supervisor is present.`,restartUnhealthy:`The replacement process never became healthy. The previous process stayed up so you can recover.`,restartRevisionMismatch:`The restarted Gateway is running a different revision. Check the service install root and retry.`,restartRevisionUnavailable:`The restarted Gateway could not report its revision. Check the service install root and logs before retrying.`,alreadyCurrent:`This checkout is already at its tracked upstream revision.`,managedServiceHandoffAlreadyRunning:`Another managed update is already running. Wait for it to complete, then refresh update status.`,doctorFailed:"Doctor repair failed. Run `openclaw doctor --non-interactive` and retry.",managedServiceHandoffFailed:"The update helper stopped before finishing. Run `openclaw update` in the terminal to see why.",managedServiceHandoffSpawnFailed:"The Gateway could not start the update helper. Run `openclaw update` in the terminal instead.",managedServiceHandoffParentTimeout:"The Gateway stayed up too long for the update helper. Start the update again, or run `openclaw update`.",default:`See the gateway logs for the exact failure and retry once the cause is fixed.`},failedAtStep:`The update failed at {step}: {cause}.`,succeededVersion:`Gateway updated to v{version}.`,succeededCommit:`Gateway updated · now on {sha}.`,succeeded:`Gateway updated and restarted.`},devices:{readOnly:{pairingRequired:`Browsing only. Device changes require operator.pairing access.`,adminRequired:`Browsing only. Exec approvals and node bindings require operator.admin access.`,pairingAndAdminRequired:`Browsing only. Device changes require operator.pairing; exec approvals and node bindings require operator.admin.`},pairing:{button:`Pair device`,adminRequired:`Administrator access is required to create setup codes.`,title:`Pair a device`,subtitle:`Create a secure setup for a mobile app or node host.`,noApp:`Don't have the app yet?`,getApps:`Get the apps`,generating:`Creating a secure setup code…`,accessTitle:`Setup type`,fullAccess:`Full access (recommended)`,fullAccessHint:`Device capabilities plus complete Gateway controls, including settings and upgrades.`,limitedAccess:`Limited access`,limitedAccessHint:`Device capabilities, chat, and approvals without administrative controls.`,nodeAccess:`Node host`,nodeAccessHint:`Connect a computer as a command and capability host.`,generateCode:`Create setup code`,transportLimitedTitle:`Limited for network safety`,transportLimitedHint:`This Gateway URL uses plaintext ws://. Use wss:// or Tailscale Serve, then create a new code for full access.`,failed:`Could not create a setup code.`,statusFailed:`Could not verify whether pairing completed.`,loadFailed:`Could not load the pairing dialog. Check your connection and try again.`,qrAlt:`OpenClaw mobile pairing QR code`,qrUnavailable:`QR unavailable. Copy the setup code instead.`,copySetupCode:`Copy setup code`,nodeExpiresIn:`This setup link expires in {time}.`,nodeExpired:`This setup link has expired. Create a new one.`,newCode:`New code`,showSetupCode:`Show setup code`,pending:`Device requests waiting for review: {count}`,review:`Review`,waiting:`Official OpenClaw mobile apps connect automatically after scanning.`,pairedTitle:`Device paired`,deliveryUncertainTitle:`Pairing delivery could not be confirmed`,deliveryUncertainHint:`The setup code is retired, but the device may not have received its credential. Check Manage devices, remove the device if needed, then create a new code.`,fullAccessSummary:`Full access`,nodeAccessSummary:`Node access`,done:`Done`,expiredTitle:`Setup code expired`,generateNewCode:`Generate new code`,nodeWaiting:`Run the command on the device, then review its pairing request here.`,help:`Pairing help`,helpNewTab:`Pairing help (opens in a new tab)`,manageDevices:`Manage devices`},binding:{loadConfigHint:`Load config to edit bindings.`,formModeHint:`Switch the Config tab to Form mode to edit bindings here.`,execNodeBinding:`Exec node binding`,execNodeBindingSubtitle:`Pin agents to a specific node when using exec host=node.`,defaultBinding:`Default binding`,defaultBindingHint:`Used when agents do not override a node binding.`,node:`Node`,anyNode:`Any node`,noNodes:`No nodes with system.run available.`,noAgents:`No agents found.`,defaultAgent:`default agent`,agent:`agent`,usesDefault:`uses default ({node})`,override:`override: {node}`,binding:`Binding`,useDefault:`Use default`,any:`any`},inventory:{title:`Paired devices`,summaryConnected:`{connected} of {total} connected`,summaryPending:`{count} awaiting approval`,cleanupStale:`Clean up {count} stale`,pendingApproval:`Pending approval`,empty:`No paired devices.`,connectedWithoutPairing:`Connected without pairing`,olderPairing:`{count} older pairing of {name}`,olderPairings:`{count} older pairings of {name}`,autoPaired:`auto-paired`,versionDrift:`version drift`,versionDriftTitle:`Device {nodeVersion}; Gateway {gatewayVersion}. Update the older component to align the fleet.`,workerVersion:`Worker {version}`,workerMissing:`worker missing`,workerMissingTitle:`The Gateway-managed worker bundle is missing. Start a new session on this device to reinstall it.`,manualWake:`manual wake required`,manualWakeTitle:`The Gateway cannot wake an offline Windows device. Start the machine or restore its network connection.`,approvalNeeded:`approval needed`,inputAgo:`input {time} ago`,seen:`seen {time}`,approved:`approved {time}`,details:`Details`,deviceId:`Device ID: {id}`,remoteIp:`Remote IP: {ip}`,scopes:`scopes: {scopes}`,tokens:`Tokens`,capabilities:`Capabilities`,commands:`Commands`,offline:`offline`,approve:`Approve`,reject:`Reject`,remove:`Remove`,removeName:`Remove {name}`,removePromptTitle:`Remove {name}?`,removePromptBody:`This device must pair again before it can reconnect.`,removeStalePromptTitle:`Remove {count} stale pairings?`,removeStalePromptTitleOne:`Remove 1 stale pairing?`,removeStalePromptBody:`Affected clients re-pair silently on their next connection.`,rejectDevicePromptTitle:`Reject this device pairing request?`,rejectNodePromptTitle:`Reject this node pairing request?`,rejectPromptBody:`The client must send a new pairing request before it can connect.`,revokePromptTitle:`Revoke the {role} token?`,revokePromptBody:`This token stops working immediately and cannot be restored.`,rotatePromptTitle:`New {role} token`,rotatePromptBody:`Copy this token now and store it securely. It is shown once and cannot be recovered.`,rotateAcknowledge:`I saved this token`,rotateDismissHint:`This dialog stays open until you confirm the token is saved.`,rotateWithheldTitle:`Token rotated · {device}`,rotateWithheldNext:`It will reconnect with the new token automatically — nothing else to do.`,rotateWithheldException:`If it doesn't reconnect on its own, pair it again.`,rotateWithheldNote:`For security, the new token is only revealed on the device itself.`,gateway:`gateway`,unpaired:`unpaired`,unknownClient:`unknown client`,revoked:`revoked`,active:`active`,rotate:`Rotate`,revoke:`Revoke`,none:`none`,rolesAndScopes:`roles: {roles} · scopes: {scopes}`,scopeUpgrade:`scope upgrade requires approval`,roleUpgrade:`role upgrade requires approval`,reapproval:`reconnect details changed; approval required`,newPairing:`new device pairing request`,repair:`repair`,requestedAt:`{note} · requested {time}`,requestedAccess:`requested: {access}`,approvedAccess:`approved now: {access}`},execApprovals:{title:`Exec approvals`,subtitlePrefix:`Allowlist and approval policy for`,loadHint:`Load exec approvals to edit allowlists.`,hostNativePolicy:`Host-native policy`,hostNativeHint:`Read-only here. Edit from the companion app or CLI.`,native:`Native`,defaultAction:`Default action`,rule:`{count} rule`,rules:`{count} rules`,allShells:`all shells`,off:`off`,on:`on`,target:`Target`,targetHint:`Gateway edits local approvals; node edits the selected node.`,host:`Host`,gateway:`Gateway`,node:`Node`,selectNode:`Select node`,noNodes:`No nodes advertise exec approvals yet.`,scope:`Scope`,defaults:`Defaults`,security:`Security`,defaultSecurity:`Default security mode.`,defaultValue:`Default: {value}.`,mode:`Mode`,useDefaultValue:`Use default ({value})`,ask:`Ask`,defaultPrompt:`Default prompt policy.`,askFallback:`Ask fallback`,promptUnavailable:`Applied when the UI prompt is unavailable.`,fallback:`Fallback`,autoAllowSkills:`Auto-allow skill CLIs`,autoAllowSkillsHint:`Allow skill executables listed by the Gateway.`,usingDefault:`Using default ({value}).`,override:`Override ({value}).`,useDefault:`Use default`,allowlist:`Allowlist`,allowlistHint:`Case-insensitive glob patterns.`,addPattern:`Add pattern`,emptyAllowlist:`No allowlist entries yet.`,newPattern:`New pattern`,lastUsed:`Last used: {time}`,pattern:`Pattern`,remove:`Remove`,options:{deny:`Deny`,allowlist:`Allowlist`,full:`Full`,off:`Off`,onMiss:`On miss`,always:`Always`}}},worktrees:{adminRequired:`Browsing only. Worktree changes require operator.admin access.`,newWorktree:`New worktree`,ownerManual:`Manual`,ownerSession:`Session`,ownerWorkboard:`Workboard`,title:`Managed Worktrees`,subtitle:`Isolated repository checkouts owned by OpenClaw.`,cleanNow:`Clean up now`,name:`Name`,repo:`Repository`,empty:`No managed worktrees.`,restorable:`Restorable`,restore:`Restore`,confirmDelete:`Snapshot and delete {name}?`,confirmForceDelete:`Snapshot failed: {error}
Delete without a snapshot?`},agentChip:je,agentScope:Me,newSession:{title:`New session`,hint:`Pick where this session works, then say what to do.`,agent:`Agent`,agents:`Agents`,where:`Where`,environments:`Environments`,gateway:`Gateway · local`,gatewayNamed:`Gateway · {name}`,cloudWorker:`Cloud · {profile}`,cloudWorkerMachine:`{profile} · {machine}`,cloudWorkerProvider:`Cloud worker provider: {provider}`,cloudRequiresWorktree:`Cloud needs a Git checkout`,cloudRuntimeUnsupported:`The {runtime} runtime does not support cloud workers.`,cloudProfileRuntimeUnsupported:`The {runtime} runtime cannot use this cloud worker. Choose a compatible cloud worker or run locally.`,deviceRuntimeUnsupported:`This runtime does not support paired devices`,cloudRecoveryUnavailable:`Cloud workers are unavailable because this connection does not support task recovery. Reconnect or update the Gateway.`,placementStartFailed:`The session was created, but runner startup failed: {error}`,placementSyncsFolder:`Syncs {folder} to the selected runner`,folder:`Folder`,folderPlaceholder:`Agent workspace`,yourDevices:`Your devices`,autoDevice:`Auto`,autoDeviceSub:`Least-busy device`,autoDeviceSubEligible:`First eligible device`,noSessionHosts:`No session hosts are paired. Connect a machine with session hosting enabled.`,neverConnected:`Never connected`,offlineFor:`Offline for {duration}`,lastSeen:`Last seen {time}`,deviceUnavailable:`Device unavailable. Reconnect it and try again.`,sessionHostingDisabled:`Session hosting is disabled. Run openclaw connect --service --session-host on the device.`,deviceCapacityUnavailable:`Worker capacity is unavailable. Restart the device session host and try again.`,deviceNoSlots:`No worker slots are available. Wait for a slot or pick another device.`,nodeUpdateRequired:`Update required: run {updateCommand}, then reconnect. For a headless node, run {restartCommand}.`,capabilityCamera:`Camera`,capabilityLocation:`Location`,capabilityTalk:`Talk`,capabilityScreenCapture:`Screen capture`,capabilityCanvas:`Canvas`,capabilityVoice:`Voice`,environmentDisposable:`Disposable`,environmentPersistent:`Persistent`,projects:`Projects`,projectsAdminHint:`Admins can register projects from Browse folders`,projectSearchPlaceholder:`Search projects or paste a Git URL`,githubProjects:`GitHub`,githubTokenHint:`No Control UI GitHub credential or shared Gateway environment token is configured; public GitHub results only.`,cloneProject:`Clone`,registerProject:`Register as project`,cloud:`Cloud`,machine:`Machine`,machineShape:`{cpu} vCPU · {memory} GB`,machineCpu:`{cpu} vCPU`,machineMemory:`{memory} GB`,machineDefault:`Default`,recentFolders:`Recent`,runsOn:`Runs on {place}`,browse:`Browse folders`,browseRequiresAdmin:`To browse outside agent workspaces, open Inbox, select Limited access, request admin, then approve in Devices.`,connectMachine:`Connect a machine…`,connectMachineTitle:`Connect a machine`,connectMachineDescription:`Run this command on the machine you want to connect.`,connectMachineGenerating:`Creating a secure connection link…`,connectMachineFailed:`Couldn't create a connection link.`,connectMachineMissingUrl:`The Gateway did not return a join URL. Update it and try again.`,connectMachineUnavailable:`Reconnect to the Gateway and try again.`,connectMachineTeamHint:`Running it pairs that machine as a device for your team.`,connectMachineSingleUse:`This link is single-use and expires soon.`,connectMachineSingleUseExpires:`This link is single-use and expires at {time}.`,connectMachineFreshCode:`Mint fresh code`,connectMachineRefreshing:`Minting…`,connectMachineManageDevices:`Manage devices`,browserUp:`Parent folder`,browserUse:`Use this folder`,browserEmpty:`No subfolders`,browserLoadFailed:`Couldn't list that folder.`,hiddenFolder:`Hidden folder`,worktree:`Worktree`,checkingGit:`Checking Git availability…`,gitCheckUnavailable:`Couldn't verify Git for this folder. Choose it again to retry.`,worktreeUnavailable:`Selected folder is not a Git checkout`,branches:`Branches`,baseBranch:`Base branch`,worktreeName:`Worktree name`,checkoutName:`Checkout name`,worktreeNamePlaceholder:`auto`,worktreeNameInvalid:`Use lowercase letters, digits, and dashes.`,incognito:`Incognito`,incognitoDescription:`Keep this session only until the Gateway restarts`,draft:`Draft`,draftDescription:`Keep this session to yourself until you publish it`,messagePlaceholder:`What should this session work on?`,dictate:`Dictate`,readingAttachment:`Reading attachment`,start:`Start session`,startInTerminal:`Start in terminal`,starting:`Starting…`,createFailed:`Couldn't create the session.`,createOutcomeUnknown:`The Gateway changed while this session was starting. Check recent sessions before starting this task again.`,cliAgentsGroup:`CLI agents`,cliAgentsUnavailable:`CLI agents unavailable`,placementSetupInterrupted:`This session's runner setup was interrupted. Check recent sessions before starting this task again.`,catalogUnavailable:`This session target is unavailable.`,restoringPreferences:`Restoring your last session setup…`,checkingPlace:`Checking the selected place…`,placementNotReady:`The selected runner isn't ready yet. Try again in a moment.`,agentsUnavailable:`No agents are available on this Gateway yet.`,nodeUnavailable:`The selected device is unavailable. Pick another place.`,terminalNeedsFolder:`Pick a folder before starting in a terminal.`,terminalCapabilityOverridesUnsupported:`Clear session capability overrides before starting in a terminal.`,what:`What`,detail:`Detail`,local:`Local`,runsDirectly:`Runs directly`,runsDirectlyNote:`Runs directly in the selected folder.`},dashboardsPage:{emptyTitle:`No dashboards yet`,emptyDescription:`Open a session and switch to the Dashboard face to add it here.`,loadError:`Could not load dashboards: {error}`,openFocusMode:`Open dashboard in focus mode`},dashboardDocument:{close:`Close dashboard`,missingSession:`No dashboard session was specified.`,notFound:`This session could not be found.`,unavailable:`Session dashboards are unavailable for this connection.`,loadFailed:`Could not load this dashboard: {error}. Check the Gateway connection and try again.`},sessionsView:{subagentPrefix:`Subagent:`,automationPrefix:`Automation:`,actionRequiresConnection:`Connect to the Gateway to change sessions.`,actionUnavailable:`This Gateway does not support this session action.`,actionRequiresRead:`This action requires operator.read access.`,actionRequiresWrite:`This action requires operator.write access.`,actionRequiresAdmin:`This action requires operator.admin access.`,deletePreservedReasons:{"owner-mismatch":`owned elsewhere`,busy:`live run or cleanup active`,"foreign-lock":`foreign Git lock`,"snapshot-failed":`OpenClaw could not create a safety snapshot`,"cleanup-failed":`cleanup failed`},draftCleanupFailed:`Session deleted; browser draft remains. Clear site data.`,title:`Sessions`,subtitle:`Browse sessions and manage per-session overrides.`,store:`Store: {path}`,active:`Updated within`,limit:`Limit`,createdBy:`Created by {name}`,ownedBy:`Owned by {name}`,archivedBy:`Archived by {name}`,viewingNow:`viewing now`,owners:`Owners`,allOwners:`All owners`,involvingMe:`Involving me`,ownerYou:`{name} (You)`,withParticipant:`with {name}`,withMoreParticipants:`+{count} more`,assignToMe:`Assign to me`,assignTo:`Assign to…`,filterControls:`Session filters`,filters:`Filters`,sourceFilters:`Session source filters`,global:`Global`,unknown:`Unknown`,sessionState:`Session state`,all:`All`,sessionArchived:`Session archived`,sessionsArchived:`Archived {count} sessions`,deleteAllArchived:`Delete all archived…`,deleteAllArchivedConfirm:`Delete {count} archived sessions and their transcripts? Any attached workers will be stopped safely first.`,activeTooltip:`Loads sessions updated in the last {count} minutes.`,limitTooltip:`Max sessions to load.`,globalTooltip:`Include global sessions.`,unknownTooltip:`Include unknown sessions.`,archivedOnlyTooltip:`Show only archived sessions.`,minutesPlaceholder:`min`,searchPlaceholder:`Filter by key, agent, label, kind…`,transcriptSearchTitle:`Search transcripts`,transcriptSearchDescription:`Find exact words or phrases in user and assistant messages across the default agent's sessions.`,transcriptSearchInputLabel:`Search session transcripts`,transcriptSearchPlaceholder:`Search exact words or phrases…`,transcriptSearchAction:`Search`,transcriptSearchClear:`Clear`,transcriptSearchRetry:`Retry`,transcriptSearchSearching:`Searching transcripts…`,transcriptSearchUnavailable:`Transcript search requires a newer Gateway.`,transcriptSearchError:`Transcript search failed`,transcriptSearchIndexing:`The transcript index is still updating. Retry to include recent messages.`,transcriptSearchEmpty:`No transcript messages match that search.`,transcriptSearchMatches:`Transcript matches: {count}`,transcriptSearchTruncated:`Showing the first 25 matches.`,user:`User`,assistant:`Assistant`,selected:`{count} selected`,deleteSelected:`Delete`,selectAllOnPage:`Select all on page`,selectSession:`Select session`,optionalPlaceholder:`(optional)`,key:`Key`,label:`Label`,kind:`Kind`,updated:`Updated`,tokens:`Tokens`,compaction:`Compaction`,goal:`Goal`,goalNote:`Goal note`,thinking:`Thinking`,fast:`Fast`,verbose:`Verbose`,reasoning:`Reasoning`,actions:`Actions`,addToWorkboard:`Add to Workboard`,openWorkboardCard:`Open Workboard card`,opensAsDashboard:`Opens as dashboard`,approvalNeeded:`Approval needed`,messageNeedsAttention:`{count} message needs attention`,messagesNeedAttention:`{count} messages need attention`,unsentDraft:`Unsent draft`,noSessions:`No sessions found.`,noActiveSessions:`No active sessions.`,noArchivedSessions:`No archived sessions.`,noSessionsMatchFilters:`No sessions match your filters.`,pagination:`{start}-{end} of {total} rows`,pageSize:`Rows per page`,rowsPerPage:`{count} per page`,showAll:`Show all`,inherit:`inherit`,offExplicit:`off (explicit)`,auto:`auto`,on:`on`,off:`off`,full:`full`,stream:`stream`,manual:`manual`,autoThreshold:`auto-threshold`,overflowRetry:`overflow retry`,timeoutRetry:`timeout retry`,tokenRange:`{before} to {after} tokens`,tokensBefore:`{count} tokens before`,tokenDeltaUnavailable:`token delta unavailable`,contextUsage:`{percent}% of context used ({used} / {context} tokens)`,contextUsageApprox:`~{percent}% of context used ({used} / {context} tokens, approximate)`,checkpoints:`{count} Checkpoints`,checkpoint:`{count} Checkpoint`,showSessionDetails:`Show session details for {count}`,hideSessionDetails:`Hide session details for {count}`,sessionDetails:`Session details`,overrides:`Overrides`,compactionHistory:`Compaction history`,status:`Status`,statusLive:`Live`,statusIdle:`Idle`,statusUnknown:`Unknown`,statusQueued:`Queued`,statusRunning:`Running`,statusDone:`Done`,statusFailed:`Failed`,statusKilled:`Killed`,statusTimeout:`Timed out`,waitingForAnswer:`Waiting for your answer`,waitingForApproval:`Waiting for approval`,runFailedReason:`Run failed: {reason}`,runErrorTimedOut:`Timed out`,runErrorUnknown:`Unknown error`,attentionRequired:`Session needs attention`,openSession:`Open session`,model:`Model`,provider:`Provider`,runtime:`Runtime`,runDuration:`Run duration`,lastActive:`Last active {time}`,surface:`Surface`,subject:`Subject`,room:`Room`,space:`Space`,sessionId:`Session ID`,activeRun:`Active run`,showChildSessions:`Show {count} child sessions for {session}`,hideChildSessions:`Hide {count} child sessions for {session}`,childSessions:`Child sessions`,showMoreChildren:`Show {count} more`,archived:`Archived`,pinned:`Pinned`,unread:`Unread`,automationAttached:`Automation attached`,incognito:`Incognito session`,cloudWorkerPlacement:`Placement: {state}`,placementWorkspaceConflict:`{placement} · 1 workspace conflict`,placementWorkspaceConflicts:`{placement} · {count} workspace conflicts`,cloudWorkerDiskWarning:`Cloud session disk space is low`,cloudWorkerDiskCritical:`Cloud session disk space is critically low`,cloudWorkerDescendantConflict:`Cloud worker child: 1 workspace conflict`,cloudWorkerDescendantConflicts:`Cloud worker children: {count} workspace conflicts`,renameSession:`Rename session`,renameSessionPrompt:`Rename session`,renameSessionMenu:`Rename…`,setIconMenu:`Set icon`,setColorMenu:`Color`,setIconColorMenu:`Icon & color`,sessionColor:`Session color: {color}`,colors:{red:`Red`,blue:`Blue`,green:`Green`,yellow:`Yellow`,purple:`Purple`,orange:`Orange`,pink:`Pink`,cyan:`Cyan`},iconEmojiSection:`Emoji`,iconGlyphSection:`Icons`,customEmojiCell:`Custom emoji…`,customEmojiTitle:`Custom emoji`,customEmojiSet:`Set`,customEmojiHint:`Any emoji works. Press {shortcut} for the system emoji picker.`,customEmojiHintNoShortcut:`Any emoji works.`,removeIcon:`Remove icon`,pinSession:`Pin session`,unpinSession:`Unpin session`,markUnread:`Mark as unread`,markRead:`Mark as read`,markUnreadCount:`Mark {count} as unread`,markReadCount:`Mark {count} as read`,forkSession:`Fork`,forkFromLastCompleted:`Fork from last completed message`,forkedSession:`Forked session`,copySessionId:`Copy session ID`,openPullRequest:`Open PR`,openInEditorMenu:`Open in`,archiveSession:`Archive session`,archiveSessionCount:`Archive {count}`,restoreSession:`Restore session`,restoreSessionCount:`Restore {count}`,moveSession:`Move session…`,moveSessionTitle:`Move session`,moveSessionDescription:`Choose where "{session}" should continue.`,moveSessionNoReplayWarning:`OpenClaw safely reconciles the current workspace before moving. Active work is never replayed.`,moveSessionActiveRunWarning:`The active turn will be interrupted. Partial output is not replayed; send the next turn again after the move.`,moveSessionAction:`Move session`,moveSessionCatalogFailed:`Could not load available destinations.`,moveSessionFailed:`Move failed`,moveSessionGatewayTarget:`Gateway`,movingSession:`Moving to {target}…`,movingSessionGeneric:`Moving session…`,stopCloudWorker:`Stop cloud worker…`,stopCloudWorkerConfirm:`Stop the cloud worker for "{session}"?`,stopCloudWorkerConfirmAction:`Stop worker`,stopCloudWorkerStale:`Gateway connection replaced before the cloud worker for "{session}" was stopped. Try again.`,deleteSessionMenu:`Delete…`,deleteSessionCount:`Delete {count}…`,deleteSessionConfirm:`Delete "{session}" and its transcript? Any attached worker will be stopped safely first.`,deleteSessionStale:`Gateway connection replaced before "{session}" was deleted. Try again.`,deleteSessionsConfirm:`Delete {count} sessions and their transcripts? Any attached workers will be stopped safely first.`,deleteSessionsStale:`Gateway connection replaced before {count} sessions were deleted. Try again.`,deleteSelectedConfirmOne:`Delete 1 session?
Stop any attached worker safely, then delete the session entry and archive its transcript.`,deleteSelectedConfirm:`Delete {count} sessions?
Stop any attached workers safely, then delete the session entries and archive their transcripts.`,groupBy:`Group by`,groupByNone:`None`,groupByCategory:`Custom groups`,groupByPerson:`Person`,showSessionPreview:`Show message preview`,showCronSessions:`Show automation sessions`,showSystemSessions:`Show system sessions`,groupByChannel:`Channel`,groupByKind:`Kind`,groupByAgent:`Agent`,groupByDate:`Date`,group:`Group`,ungrouped:`Ungrouped`,newGroup:`New group…`,newGroupPrompt:`New group name`,newGroupTitle:`New group`,newGroupCreate:`Create group`,newGroupFailed:`Could not create the group.`,newGroupStale:`Gateway connection replaced before the group was saved. Try again.`,newGroupMoveSkipped:`Group created, but the move was skipped because the list changed. Move from the row menu.`,moveToGroup:`Move session to a group`,moveToGroupMenu:`Move to group`,moveToGroupMenuCount:`Move {count} to group`,removeFromGroup:`Remove from group`,moveBackToGroups:`Move back to Groups`,groupMenu:`Group options for {group}`,newSessionInGroup:`New session in {group}`,groupDefaultsMenu:`New session defaults…`,groupDefaultsTitle:`New session defaults for "{group}"`,groupDefaultsDescription:`Choose where new sessions in this group start.`,groupDefaultsCwd:`Working directory`,groupDefaultsCwdPlaceholder:`Use the agent workspace`,groupDefaultsCwdHint:`Leave empty to use the selected agent's workspace.`,groupDefaultsMode:`Environment`,groupDefaultsLocal:`Local`,groupDefaultsWorktree:`Worktree`,groupDefaultsWorktreeHint:`Runs each session in an isolated Git worktree.`,groupDefaultsFailed:`Could not save the group defaults.`,groupDefaultsStale:`Gateway connection replaced before the defaults were saved. Try again.`,renameGroupMenu:`Rename group…`,renameGroupTitle:`Rename group "{group}"`,groupNameLabel:`Group name`,deleteGroupMenu:`Delete group…`,deleteGroupTitle:`Delete group "{group}"`,deleteGroupConfirm:`The group is removed. Its sessions move back to the session list.`,deleteGroupStale:`Gateway connection replaced before "{group}" was deleted. Try again.`,dragSessionHint:`Drag session to move between groups`,dateToday:`Today`,dateYesterday:`Yesterday`,dateThisWeek:`This week`,dateOlder:`Older`,dateNoActivity:`No activity`,groupRowCount:`{count} sessions`,groupRowCountOne:`{count} session`,loadingCheckpoints:`Loading checkpoints…`,noCheckpoints:`No compaction checkpoints recorded for this session.`,noSummary:`No summary captured.`,branchFromCheckpoint:`Branch from checkpoint`,branchCheckpointConfirm:`Create a new child session from this compacted checkpoint?`,restoreCheckpoint:`Restore checkpoint`,restoreCheckpointConfirm:`Restore this session to the selected compacted checkpoint?
This replaces the current active transcript for the session key.`},agents:{noAgents:`No agents`,createdBy:`Created by {id}`,defaults:{title:`Agent defaults`,description:`Defaults every agent inherits unless overridden.`},copyId:`Copy ID`,default:`Default`,setDefault:`Set Default`,...Ne,selectTitle:`Select an agent`,selectSubtitle:`Pick an agent to inspect its workspace and tools.`,tabs:{overview:`Overview`,files:`Files`,tools:`Tools`,skills:`Skills`,channels:`Channels`,cronJobs:`Automations`,memory:`Memory`},context:{title:`Agent Context`,workspace:`Workspace`,openFilesTab:`Open Files tab`,primaryModel:`Primary Model`,runtime:`Runtime`,thinkingDefault:`Thinking Default`,identityName:`Identity Name`,identityAvatar:`Identity Avatar`,skillsFilter:`Skills Filter`,default:`Default`,configurationSubtitle:`Workspace, identity, and model configuration.`,schedulingSubtitle:`Workspace and scheduling targets.`},identity:Pe,overview:{title:`Overview`,subtitle:`Workspace paths and identity metadata.`,selectedSkills:`{count} selected`,allSkills:`all skills`,unsavedConfig:`You have unsaved config changes.`,modelSelection:`Model Selection`,primaryModel:`Primary model`,primaryModelDefault:`Primary model (default)`,notSet:`Not set`,inheritDefault:`Inherit default`,inheritDefaultModel:`Inherit default ({model})`,fallbacks:`Fallbacks`},toolCatalog:{groups:{files:`Files`,runtime:`Runtime`,web:`Web`,memory:`Memory`,sessions:`Sessions`,ui:`UI`,messaging:`Messaging`,automation:`Automation`,nodes:`Nodes`,agents:`Agents`,media:`Media`},descriptions:{read:`Read file contents`,write:`Create or overwrite files`,edit:`Make precise edits`,applyPatch:`Patch files (OpenAI)`,exec:`Run shell commands`,process:`Manage background processes`,webSearch:`Search the web`,webFetch:`Fetch web content`,memorySearch:`Semantic search`,memoryGet:`Read memory files`,sessionsList:`List sessions`,sessionsHistory:`Session history`,sessionsSend:`Send to session`,sessionsSpawn:`Spawn sub-agent`,sessionStatus:`Session status`,browser:`Control web browser`,canvas:`Control canvases`,message:`Send messages`,cron:`Schedule tasks`,gateway:`Gateway control`,nodes:`Nodes + devices`,agentsList:`List agents`,image:`Image understanding`},profiles:{minimal:`Minimal`,coding:`Coding`,messaging:`Messaging`,full:`Full`}},skillsPanel:{title:`Skills`,subtitle:`Per-agent skill allowlist and workspace skills.`,loadConfig:`Load the gateway config to set per-agent skills.`,customAllowlist:`This agent uses a custom skill allowlist.`,inheritedAllowlist:`This agent inherits the default skill allowlist.`,allEnabled:`All skills are enabled. Disabling any skill will create a per-agent allowlist.`,loadAgent:`Load skills for this agent to view workspace-specific entries.`,filter:`Filter`,searchPlaceholder:`Search skills`,shown:`{count} shown`,empty:`No skills found.`,missing:`Missing: {items}`,reason:`Reason: {items}`,updateError:`Could not update the agent skill allowlist.`},channels:{title:`Channels`,subtitle:`Gateway-wide channel status snapshot.`,lastRefresh:`Last refresh: {time}`,loadHint:`Load channels to see live status.`,empty:`No channels found.`,connectedCount:`{connected}/{total} connected`,noAccounts:`no accounts`,configuredCount:`{count} configured`,notConfigured:`not configured`,enabledCount:`{count} enabled`,setupGuide:`Setup guide`},cronPanel:{schedulerTitle:`Scheduler`,schedulerSubtitle:`Gateway automations status.`,jobs:`Jobs`,nextWake:`Next wake`,agentJobsTitle:`Agent Automations`,agentJobsSubtitle:`Scheduled jobs targeting this agent.`,noJobs:`No jobs assigned.`,runNow:`Run Now`},files:{emptyDraft:`Empty draft`,minRead:`{count} min read`,markdownPreview:`Markdown Preview`,extensionPreview:`{ext} Preview`,preview:`Preview`,expandPreview:`Expand preview`,collapsePreview:`Collapse preview`,editFile:`Edit file`,closePreview:`Close preview`,coreFilesTitle:`Core Files`,coreFilesSubtitle:`Bootstrap persona, identity, and tool guidance.`,workspace:`Workspace`,loadHint:`Load the agent workspace files to edit core instructions.`,empty:`No files found.`,missing:`missing`,selectFile:`Select a file to edit.`,willCreateOnSave:`Will Create on Save`,liveDraftPreview:`Live Draft Preview`,savedPreview:`Saved Preview`,updated:`Updated {time}`,notCreatedYet:`Not Created Yet`,updatedUnknown:`Updated Unknown`,missingHint:`This file is missing. Saving will create it in the agent workspace.`,addFile:`Add file…`,createHint:`This file does not exist yet. Saving will create it in the agent workspace.`,content:`Content`,words:`{count} words`,lines:`lines`}},debug:{snapshotsTitle:`Snapshots`,snapshotsSubtitle:`Status, health, and heartbeat data.`,status:`Status`,health:`Health`,lastHeartbeat:`Last heartbeat`,security:{audit:`Security audit`,critical:`{count} critical`,warnings:`{count} warnings`,noCriticalIssues:`No critical issues`,info:`{count} info`,runPrefix:`Run`,runSuffix:`for details.`},manualRpcTitle:`Manual RPC`,manualRpcSubtitle:`Send a raw gateway method with JSON params.`,callFailed:`Call failed`,method:`Method`,selectMethod:`Select a method…`,paramsJson:`Params (JSON)`,modelsTitle:`Models`,modelsSubtitle:`Catalog from models.list.`,eventLogTitle:`Event Log`,eventLogSubtitle:`Latest gateway events.`,noEvents:`No events yet.`,lanes:{title:`Lanes`,subtitle:`Live command-lane capacity and queue pressure.`,lane:`Lane`,sessionLanes:`Session lanes · {count}`,active:`Active`,queued:`Queued`,group:`Group`,blocked:`Blocked`},overlay:{title:`System busyness`,eyebrow:`Live diagnostics`,openWithShortcut:`Open overlay · {shortcut}`,unavailable:`Unavailable`,lanes:`Lanes`,status:`Event loop / status`,activeRuns:`Active runs`,events:`Events`,cpu:`CPU`,memory:`Memory`,disk:`Disk`,memoryMb:`{value} MB`,loopShort:`loop {value}`,heapShort:`heap {value}`,maxShort:`max {value}`,freeShort:`{value} free`,totalShort:`{value} total`,delayP99:`Delay p99`,uptime:`Uptime`,activeRunsCount:`{count} active`,noActiveRuns:`No active runs.`}},configForm:{redactedPlaceholder:`[redacted - click reveal to view]`,sectionHelp:`Help for {section}`,advancedDivider:`Advanced`,advancedSettings:`Advanced settings`,hideValue:`Hide value`,revealValue:`Reveal value`,disableStreamToReveal:`Disable stream mode to reveal value`,storedSecretNotRevealable:`Stored secrets are never sent to the browser; enter a new value to replace it`,unsupportedType:`Unsupported type: {type}. Use Raw mode.`,structuredSecretRaw:`Structured value (SecretRef) - use Raw mode to edit`,structuredSecretFile:`Structured value (SecretRef) - edit the config file directly`,defaultValue:`Default: {value}`,usingDefault:`Using default: {value}`,select:`Select...`,enumOn:`On`,enumOff:`Off`,enumAuto:`Auto`,nullValue:`null`,jsonValue:`JSON value`,invalidJson:`Enter valid JSON before leaving this field.`,invalidString:`Enter a value that matches this setting's constraints.`,invalidNumber:`Enter a value within the allowed range and step.`,draftRejected:`This setting could not be saved. Your draft is still here.`,unsupportedArray:`Unsupported array schema. Use Raw mode.`,itemCountOne:`{count} item`,itemCount:`{count} items`,add:`Add`,noItems:`No items yet. Click "Add" to create one.`,removeItem:`Remove item`,customEntries:`Custom entries`,addEntry:`Add Entry`,noCustomEntries:`No custom entries.`,key:`Key`,removeEntry:`Remove entry`,renameRedactedBlocked:`This entry holds a stored secret. Add the new key with its value, then remove this one.`,schemaUnavailable:`Schema unavailable.`,unsupportedSchema:`Unsupported schema. Use Raw.`,unsupportedNode:`Unsupported schema node. Use Raw mode.`,noSettingsMatch:`No settings match "{query}"`,noSettingsInSection:`No settings in this section`,sections:{env:{label:`Environment Variables`,description:`Environment variables passed to the gateway process`},update:{label:`Updates`,description:`Auto-update settings and release channel`},agents:{label:`Agents`,description:`Agent configurations, models, and identities`},auth:{label:`Authentication`,description:`API keys and authentication profiles`},channels:{label:`Channels`,description:`Messaging channels (Telegram, Discord, Slack, etc.)`},messages:{label:`Messages`,description:`Message handling and routing settings`},commands:{label:`Commands`,description:`Custom slash commands`},hooks:{label:`Hooks`,description:`Webhooks and event hooks`},skills:{label:`Skills`,description:`Skill packs and capabilities`},tools:{label:`Tools`,description:`Tool configurations (browser, search, etc.)`},gateway:{label:`Gateway`,description:`Gateway server settings (port, auth, binding)`},wizard:{label:`Setup Wizard`,description:`Setup wizard state and history`},meta:{label:`Metadata`,description:`Gateway metadata and version information`},logging:{label:`Logging`,description:`Log levels and output configuration`},browser:{label:`Browser`,description:`Browser automation settings`},ui:{label:`UI`,description:`User interface preferences`},models:{label:`Models`,description:`AI model configurations and providers`},bindings:{label:`Bindings`,description:`Key bindings and shortcuts`},broadcast:{label:`Broadcast`,description:`Broadcast and notification settings`},tts:{label:`Voice`,description:`Text-to-speech output, voices, and personas`},session:{label:`Session`,description:`Session management and persistence`},cron:{label:`Automations`,description:`Scheduled tasks and automation`},discovery:{label:`Discovery`,description:`Service discovery and networking`},talk:{label:`Talk`,description:`Voice and speech settings`},plugins:{label:`Plugins`,description:`Plugin management and extensions`},diagnostics:{label:`Diagnostics`,description:`Instrumentation, OpenTelemetry, and cache-trace settings`},cli:{label:`CLI`,description:`CLI banner and startup behavior`},secrets:{label:`Secrets`,description:`Secret provider configuration`},acp:{label:`ACP`,description:`Agent Communication Protocol runtime and streaming settings`},mcp:{label:`MCP`,description:`Model Context Protocol server definitions`}}},quickSettings:{language:`Language`,model:{title:`Model & Thinking`,model:`Model`,thinking:`Thinking`,fastMode:`Fast mode`,default:`Default`,modelPolicy:`Model policy`,thinkingLevels:{off:`Off`,low:`Low`,medium:`Medium`,high:`High`},fastModes:{auto:`Auto`,fast:`Fast`,standard:`Standard`}},channels:{title:`Channels`,connect:`Connect →`},appearance:{lobsterVisits:`Lobster visits`,lobsterVisitsOn:`Drops by occasionally`,lobsterVisitsOff:`Never visits`,lobsterSounds:`Lobster sounds`,lobsterSoundsOn:`Tiny blubs when touched`,lobsterSoundsOff:`Silent`,lobsterdex:`Lobsterdex`,lobsterdexSeen:`{seen}/{total} visited`,lobsterdexFirstVisited:`{name} · first visited {date}`,lobsterdexCardFirstVisited:`First visited {date}`,lobsterdexCardShinySeen:`✦ Shiny spotted {date}`,lobsterdexCardCopyLink:`Copy link`,lobsterdexOpen:`Open Lobsterdex`},security:{intro:`Review gateway access, tool policy, device authentication, and approvals.`,title:`Security`,gatewayAuth:`Gateway auth`,execPolicy:`Exec policy`,browserEnabled:`Browser enabled`,toolProfile:`Tool profile`},system:{gatewayHost:`Gateway Host`,up:`Up {duration}`,cpu:`CPU`,memory:`Memory`,disk:`Disk`,usage:`{label} usage`,loadAverage:`Load average: {values}`,core:`{count} core`,cores:`{count} cores`,load:`load`,used:`used`,freeOf:`{free} free of {total}`,runtime:`Node {version} · PID {pid}`},personal:{browserOnly:`Stored in this browser only.`}},configPage:{themeImported:`Imported {name}.`,themeRemoved:`Custom theme removed.`},configView:{adminRequired:`Configuration changes require operator.admin access.`,channelSettings:`Channel settings`,categories:{core:`Core`,ai:`Agent Defaults`,communication:`Communication`,security:`Privacy & Security`,automation:`Automation`,infrastructure:`Infrastructure`,appearance:`Appearance`,other:`Other`},sections:{env:`Environment`,auth:`Authentication`,update:`Updates`,meta:`Meta`,logging:`Logging`,diagnostics:`Diagnostics`,cli:`CLI`,secrets:`Secrets`,agents:`Agents`,models:`Models`,skills:`Skills`,tools:`Tools`,memory:`Memory`,session:`Session`,channels:`Channels`,messages:`Messages`,broadcast:`Broadcast`,notifications:`Notifications`,talk:`Talk`,tts:`Voice`,commands:`Commands`,hooks:`Hooks`,bindings:`Bindings`,cron:`Automations`,approvals:`Approvals`,security:`Security Policy`,plugins:`Plugins`,gateway:`Gateway`,browser:`Browser`,nodeHost:`Node Host`,discovery:`Discovery`,acp:`ACP`,mcp:`MCP`,theme:`Theme`,ui:`UI`,wizard:`Setup Wizard`},themes:{claw:{label:`Claw`,description:`Chroma family`},knot:{label:`Knot`,description:`Black & red`},dash:{label:`Dash`,description:`Chocolate blueprint`},absolutely:{label:`Absolutely`,description:`Clay on graphite`},tide:{label:`Tide`,description:`Slate & steel`},beacon:{label:`Beacon`,description:`Maximum contrast`},phosphor:{label:`Phosphor`,description:`Green on glass`}},textSizes:{small:`Small`,default:`Default`,large:`Large`,xl:`XL`,xxl:`XXL`},profileSyncedHint:`Saved to your profile — follows you on every device.`,syncedHint:`Synced across your devices through the gateway.`,syncPendingHint:`Waiting to sync through the gateway.`,notifications:{title:`Push notifications`,nativeTitle:`Notifications`,unavailableHint:`Browser unsupported.`,unavailable:`Unavailable`,checking:`Checking...`,granted:`Granted`,denied:`Denied`,notRequested:`Not requested`,unsupported:`Unsupported`,subscribed:`Subscribed`,notSubscribed:`Not subscribed`,blocked:`Blocked`,ready:`Ready`,browserSupport:`Browser support`,available:`Available`,notSupported:`Not supported`,permission:`Permission`,status:`Status`,unsubscribe:`Unsubscribe`,sendTest:`Send test`,sendingTest:`Sending test…`,testOutcome:`Test notification`,testQueued:`Test notification queued`,testFailed:`Test notification failed`,subscribing:`Subscribing...`,enable:`Enable notifications`,openSystemSettings:`Open System Settings`,blockedHint:`Allow notifications in this site's browser permissions.`,nativeBlockedHint:`Allow OpenClaw in macOS System Settings > Notifications.`,iosInstallRequired:`On iPhone or iPad, use Share > Add to Home Screen, then open OpenClaw.`,accountDefaults:`Account defaults`,installedApp:`This browser or app`,deliverDevice:`Deliver to this browser or app`,notificationLabel:`Notification label`,approvalRequested:`Approval requested`,agentFinished:`Agent finished`,agentQuestion:`Agent question`,scheduledTaskFailed:`Scheduled task failed`,backgroundTaskFailed:`Background task failed`,lockScreenDetail:`Lock-screen detail`,lockScreenDetailHint:`Private hides names; detailed content is sanitized.`,private:`Private`,namesOnly:`Names only`,detailed:`Detailed`,quietHours:`Quiet hours`,quietHoursWindow:`Quiet hours window`,timeZone:`Time zone`,onlyAgents:`Only these agents`,inherit:`Use account default`,inheritDetail:`Use account detail level`,inheritQuietHours:`Use account quiet hours`,overrideAgents:`Override for this device`},appearance:{intro:`Theme, chat, and sidebar preferences for this Control UI client.`,theme:`Theme`,chooseTheme:`Choose a theme family.`,typography:`Typography`,fonts:{ui:`Interface`,chat:`Chat prose`,themeDefault:`Theme default`,themeFace:`{theme} · {face}`,system:`System`,previewCaption:`OpenClaw · A little clarity goes a long way`,previewProse:`Good typography makes room for the conversation. Choose a face that feels comfortable to read.`,previewCode:`const greeting = "Hello, world!";`},fontNotes:{"instrument-sans":`Contemporary and crisp`,geist:`Clean and precise`,"dm-sans":`Warm and versatile`,"ibm-plex-sans":`Engineered and humanist`,"space-grotesk":`Geometric with character`,"atkinson-hyperlegible":`Distinct shapes for easy reading`,fraunces:`Expressive reading serif`,lora:`Calm, literary serif`,"jetbrains-mono":`Clear, evenly spaced letters`,system:`No webfont`},accent:`Accent color`,accentHint:`Choose an accent color for buttons, highlights, and other controls.`,customAccent:`Custom color`,usingInheritedAccent:`Using inherited accent`,usingAccent:`Using {value}`,accents:{default:`Theme default`,claw:`Claw red`,coral:`Coral`,amber:`Amber`,mint:`Mint`,teal:`Teal`,blue:`Blue`,violet:`Violet`,pink:`Pink`,slate:`Slate`},importedTheme:`Imported theme`,import:`Import`,importedFrom:`Imported from tweakcn: {name}`,importHint:`Import a tweakcn theme into this browser-local slot`,importFromTweakcn:`Import from tweakcn`,tweakcnInstructions:`Open tweakcn.com, choose or create a theme, click Share, then paste the copied theme link here. Share links, editor URLs, registry URLs, theme IDs, and default theme names like amethyst-haze are accepted.`,browseTweakcn:`Browse tweakcn themes`,themeLink:`Theme link or ID`,replace:`Replace {name}`,importTheme:`Import theme`,clear:`Clear {name}`,loaded:`Loaded`,inlineHintBefore:`Click`,inlineHintAfter:`to add one browser-local tweakcn theme. In tweakcn, use Share and paste the copied link here.`,textSize:`Text size`},chatPrefs:{title:`Chat`,messageWidth:`Message width`,messageWidthHint:`Optional CSS width for the centered transcript, such as 960px, 82%, or min(1280px, 82%).`,messageWidthInvalid:`Enter a CSS width such as 960px, 82%, min(1280px, 82%), or calc(100% - 2rem).`,collapseTaskProgress:`Collapse task progress by default`,collapseTaskProgressHint:`Keep active task progress collapsed until you open it.`},sidebarPrefs:{title:`Sidebar`,hint:`Choose what appears while sessions are running.`,liveActivity:`Show live agent activity in sidebar`,liveActivityHint:`Show the latest assistant or tool activity beneath running sessions.`,deleteConfirm:`Confirm before deleting sessions`,deleteConfirmHint:`Applies to sidebar deletes. Stopping cloud workers and removing preserved worktrees always ask.`},sessionObserver:{title:`Session observer`,hint:`Summarize long-running sessions with a small utility model.`,toggle:`Session observer`,toggleHint:`Generate live status digests for subscribed Control UI sessions.`,resolvedModel:`Resolved small model`,modelAuto:`auto ({model})`,modelConfigured:`configured ({model})`,modelDisabled:`disabled`,modelUnavailable:`unavailable (no small model)`,modelPicker:`Small model`,modelPickerHint:`Used for observer digests and other short utility tasks.`,modelCatalogUnavailable:`Explicit model catalog unavailable`,auto:`Auto (provider default)`,disabled:`Disabled`,toggleNote:`Update the Control UI session observer`,modelNote:`Update the default utility model`},connection:{title:`Connection`,gateway:`Gateway`,status:`Status`,assistant:`Assistant`},root:`<root>`,itemCount:`[{count} item]`,itemCountPlural:`[{count} items]`,form:`Form`,raw:`Raw`,formUnsafeTitle:`Form view can't safely edit some fields`,rawTitle:`Edit raw JSON/JSON5 config`,rawUnavailableTitle:`Raw mode unavailable for this snapshot`,open:`Open`,applying:`Applying…`,autoSaveSaving:`Saving…`,autoSaveSaved:`Saved`,autoSavePaused:`Autosave paused after reconnect`,saveNow:`Save`,autoSaveFailed:`Save failed`,autoSaveConflict:`Settings changed elsewhere`,retry:`Retry`,applyChanges:`Apply changes`,rawDiscard:`Discard`,rawDraftBlocksApply:`Unsaved raw config edits — save or discard them in the Raw editor before restarting.`,rawDraftPendingFormTitle:`Unsaved raw config edits — save or discard them before switching to Form.`,rawDraftBlocksFormEdit:`Unsaved raw config edits could not be parsed; resolve them in the Raw editor before changing settings.`,invalidConfig:`Your configuration is invalid. Some settings may not work as expected.`,dismissWarning:`Don't remind again`,viewPendingChangesRaw:`View pending changes`,rawDiffUnavailable:`Changes detected (JSON diff not available)`,hideEnvValues:`Hide env values`,revealEnvValues:`Reveal env values`,peek:`Peek`,loadingSchema:`Loading schema…`,formUnsafeCount:`1 setting in this config can only be edited as text: {paths}`,formUnsafeCountPlural:`{count} settings in this config can only be edited as text: {paths}`,formUnsafeMore:`+{count} more`,openRawEditor:`Open Raw editor`,rawConfig:`Raw config (JSON/JSON5)`,secretCount:`{count} secret`,secretCountPlural:`{count} secrets`,redacted:`redacted`,visible:`visible`,revealSensitive:`Reveal sensitive values`,hideSensitive:`Hide sensitive values`,toggleRawRedaction:`Toggle raw config redaction`,sensitiveHidden:`{count} sensitive value hidden. Use the reveal button above to edit the raw config.`,sensitiveHiddenPlural:`{count} sensitive values hidden. Use the reveal button above to edit the raw config.`},execApproval:{scope:{standingGrant:`Always allow runs this exact command for "{automation}" without asking, until revoked (revocable)`,standingGrantDays:`Always allow runs this exact command for "{automation}" without asking, for {count} days (revocable)`,messageSend:`Sends to {count} recipient(s) via {target}`,payment:`Pays {amount} {currency} to {target}`,externalPost:`Posts externally to {target}`},expiresIn:`expires in {time}`,expired:`expired`,execApprovalNeeded:`Exec approval needed`,pluginApprovalNeeded:`Plugin approval needed`,requestedBySession:`Approval requested by session {session}`,pending:`{count} pending`,otherPending:`Other pending requests`,reviewRequest:`Review approval from {agent}: {command}`,decisionRequest:`{decision}: {command}`,agentPendingOne:`{count} pending approval`,agentPending:`{count} pending approvals`,allowOnce:`Allow once`,alwaysAllow:`Always allow`,alwaysAllowHere:`Always allow here`,allowAlwaysUnavailable:`Allow Always is unavailable for this command.`,reviewOnly:`Review only. Sign in with approval access to record a decision.`,deny:`Deny`,details:`Details`,labels:{host:`Host`,session:`Session`,cwd:`CWD`,resolved:`Resolved`,security:`Security`,ask:`Ask`}},approvalPage:{brandName:`OpenClaw`,eyebrow:`Operator approval`,loadingTitle:`Loading approval`,loadingDescription:`Checking the current approval state with the Gateway.`,unavailableTitle:`Approval unavailable`,unavailableDescription:`This approval could not be found or this device is not authorized to review it.`,connectionErrorTitle:`Connection interrupted`,connectionErrorDescription:`OpenClaw cannot confirm or record a decision while disconnected. Reconnect to check the current status.`,retry:`Retry`,execTitle:`Command approval`,pending:`Waiting for your decision`,pendingDescription:`Review the request carefully. The first answer from any surface wins.`,approvedHere:`Approved here`,deniedHere:`Denied here`,resolvedElsewhere:`Resolved elsewhere`,resolvedElsewhereDescription:`Another surface or an earlier attempt recorded the decision first.`,approved:`Approved`,denied:`Denied`,expired:`Expired`,cancelled:`Cancelled`,allowedOnceDescription:`The operation was approved for this request only.`,allowedAlwaysDescription:`The operation was approved with the always-allow decision.`,deniedDescription:`The operation was denied and will not continue.`,expiredDescription:`No decision arrived before the deadline, so the operation was denied.`,cancelledDescription:`The requesting run ended before a decision could be used.`,summaryLabel:`Summary`,commandLabel:`Command`,requestLabel:`Request details`,nodeLabel:`Node`,expiresLabel:`Expires`,resolvedLabel:`Resolved`,actionsLabel:`Approval decisions`,resolvingDecision:`Recording {decision}…`,safeToClose:`The decision is recorded. You can close this page.`,openControlUi:`Open Control UI`},agentTools:{githubTitle:`GitHub Identity`,githubSubtitle:`GitHub CLI account and Git author for local agent tools and the Codex harness.`,githubVerify:`Verify`,githubVerifying:`Verifying…`,githubConnection:`Gateway connection`,githubDisconnected:`Disconnected`,githubAccessRequired:`Access required`,githubReadRequired:`GitHub identity status requires operator.read access.`,githubAdminRequired:`Connecting, replacing, or removing a GitHub identity requires operator.admin access.`,githubAccount:`Account`,githubEffectiveAccount:`Effective account`,githubSelectedAccount:`Selected scope account`,githubEffectiveStatus:`Effective status`,githubEffectiveAuthor:`Effective Git Author`,githubEffectiveCredential:`Effective credential`,githubEffectiveAccessExpiry:`Effective access expiry`,githubEffectiveRefresh:`Effective refresh token`,githubEffectiveScopes:`Effective OAuth scopes`,githubSelectedStatus:`Selected scope status`,githubSelectedAuthor:`Selected scope Git Author`,githubSelectedCredential:`Selected scope credential`,githubSelectedAccessExpiry:`Selected scope access expiry`,githubSelectedRefresh:`Selected scope refresh token`,githubSelectedScopes:`Selected scope OAuth scopes`,githubNoAccount:`No verified account`,githubAuthor:`Git Author`,githubAuthorUnset:`Not set`,githubErrorTitle:`Error`,githubSourceDetected:`Native credentials detected on this machine`,githubSourceSystem:`Managed system identity`,githubSourceAgent:`Managed override for this agent`,githubStateVerified:`Verified`,githubStateUnverified:`Not verified`,githubStateRateLimited:`Rate limited`,githubStateUnavailable:`No credentials`,githubStateConfiguredUnavailable:`Configured, but unavailable`,githubEvidenceApi:`Confirmed via the GitHub API. Write permissions are not checked remotely.`,githubEvidenceRateLimited:`The GitHub API rate limit blocked verification — try again later.`,githubEvidenceUnverified:`The stored credentials have not been verified against GitHub yet.`,githubScope:`Applies To`,githubScopeSystemDesc:`One identity shared by every agent without an override.`,githubScopeAgentDesc:`Overrides the system identity for this agent only.`,githubSystem:`System`,githubAgentOverride:`This Agent`,githubAuthorization:`GitHub authorization`,githubStarting:`Requesting code…`,githubCancelling:`Requesting cancellation…`,githubFinishing:`Authorization is already finishing…`,githubCancelFailed:`Cancellation could not be confirmed`,githubCancelFailedHint:`Authorization is still active. Wait for it to finish or try cancellation again.`,githubRetryCancel:`Try cancel again`,githubCodeReady:`Code ready`,githubWaiting:`Waiting for approval…`,githubSlowDown:`GitHub asked us to wait longer…`,githubNetworkRetry:`Connection interrupted; retry scheduled`,githubAuthorizationHint:`Open GitHub yourself, then enter the one-time code shown here.`,githubDeviceCode:`One-time code`,githubDeviceCodeHint:`This code authorizes only the selected identity scope.`,githubExpires:`Code expires`,githubOpen:`Open github.com/login/device`,githubCopyCode:`Copy code`,githubAuthorizationFailed:`GitHub authorization failed`,githubExpired:`The one-time code expired. Connect again to request a new code.`,githubDenied:`GitHub authorization was denied. Connect again when you are ready.`,githubIncorrectCode:`GitHub rejected this device code. Connect again to request a new code.`,githubConnect:`Connect GitHub`,githubConnectHint:`Authorize GitHub without pasting a long-lived credential into the browser.`,githubPatFallback:`Personal access token`,githubPatFallbackHint:`Use a fine-grained PAT only when browser authorization is unsuitable.`,githubUsePat:`Use a PAT instead`,githubToken:`Fine-grained PAT`,githubTokenDesc:`Stored in a private managed GitHub CLI profile; only the setup handoff is removed.`,githubTokenToggle:`Toggle token visibility`,githubPasteToken:`Paste a fine-grained personal access token first.`,githubAuthorName:`Author Name`,githubAuthorEmail:`Author Email`,githubConfigure:`Save Identity`,githubCredentialKind:`Credential`,githubSelectedConfiguration:`Selected {scope} configuration`,githubConfiguredHere:`Configured here`,githubInheritedHere:`Inherited`,githubSelectedConfigured:`This scope owns its identity`,githubSelectedInherited:`This scope inherits the effective identity`,githubKindNative:`Native GitHub CLI`,githubKindPat:`Managed personal access token`,githubKindOAuth:`Managed GitHub authorization`,githubAccessExpiry:`Access expires`,githubRefresh:`Refresh token`,githubRefreshAvailable:`Available`,githubRefreshExpired:`Expired — reconnect required`,githubRefreshUnavailable:`Unavailable — reconnect required`,githubRefreshRefreshing:`Refreshing…`,githubRefreshFailed:`Refresh failed — retrying`,githubOAuthScopes:`OAuth scopes`,githubUseSystemNewRuns:`Use system for new runs`,githubUseNativeNewRuns:`Use native for new runs`,githubUseSystemConfirmTitle:`Use the system GitHub identity for new runs?`,githubUseNativeConfirmTitle:`Use the native GitHub identity for new runs?`,githubUseSystemConfirmMessage:`New runs for this agent will use the System identity. Active runs keep their current identity until they exit or restart. Revoke the GitHub authorization or PAT separately on GitHub if needed.`,githubUseNativeConfirmMessage:`New runs without an agent override will use the native GitHub identity. Active runs keep their current identity until they exit or restart. Revoke the GitHub authorization or PAT separately on GitHub if needed.`,githubAgentMutationHint:`Authorization and removal below apply to This Agent for new runs.`,githubSystemMutationHint:`Authorization and removal below apply to System for new runs.`,githubCloudNoteTitle:`Execution boundary`,githubCloudNote:`Cloud workers stay credential-free; the Gateway publishes over HTTPS without rewriting Git remotes or helpers.`,connectedSource:`Connected: {id}`,connected:`Connected`,channelSource:`Channel: {id}`,channel:`Channel`,builtIn:`Built-In`,plugin:`Plugin: {id}`,optional:`Optional`,liveNow:`Live Now`,disabledByOverride:`Disabled by agent override.`,enabledByProfile:`Enabled by the current profile.`,enabledByOverride:`Enabled by agent override.`,notIncluded:`Not included in the current profile.`,overrideOff:`Override Off`,enabled:`Enabled`,overrideOn:`Override On`,profileOff:`Profile Off`,notLive:`Not Live`,otherAgent:`Other Agent`,title:`Tool Access`,subtitle:`Profile + per-tool overrides for this agent.`,enabledSummary:`{enabled}/{total} enabled.`,enableAll:`Enable All`,disableAll:`Disable All`,loadConfig:`Load the gateway config to adjust tool profiles.`,explicitAllowlist:`This agent is using an explicit allowlist in config. Tool overrides are managed in the Config tab.`,globalAllowlist:`Global tools.allow is set. Agent overrides cannot enable tools that are globally blocked.`,loadingCatalog:`Loading runtime tool catalog…`,catalogFallback:`Could not load runtime tool catalog. Showing built-in fallback list instead.`,availableNow:`Available Right Now`,availableNowSubtitle:`What this agent can use in the current chat session.`,noSession:`no session`,switchAgent:`Switch chat to this agent to view its live runtime tools.`,loadingAvailable:`Loading available tools…`,availableError:`Could not load available tools for this session.`,noAvailable:`No tools are available for this session right now.`,moreLiveTitle:`{count} more live tools are available in the groups below.`,moreLive:`+{count} more live tools`,quickPresets:`Quick Presets`,catalogTitle:`Tool Catalog`,inherit:`Inherit`,profile:`Profile`,source:`Source`,live:`Live`,status:`Status`,profileSourceAgent:`agent override`,profileSourceGlobal:`global default`,profileSourceDefault:`default`,statusSaving:`saving…`,statusUnsaved:`unsaved`,statusSaved:`saved`,toolPreview:`Tool preview`,more:`+{count} more`,toolsOne:`{count} Tool`,tools:`{count} Tools`,enabledToolsOne:`{count} Enabled Tool`,enabledTools:`{count} Enabled Tools`,liveToolsOne:`{count} Live Tool`,liveTools:`{count} Live Tools`,access:`Access`,session:`Current Session`,disableNamed:`Disable {name}`,enableNamed:`Enable {name}`,defaultPresets:`Default Presets`,availableVia:`Available now via {source}.`,unavailableSession:`Not available in this chat session right now.`,inspectAgent:`Switch chat to this agent to inspect live availability.`,linkTool:`Link to This Tool`},skillGroups:{workspace:`Workspace Skills`,builtIn:`Built-in Skills`,installed:`Installed Skills`,extra:`Extra Skills`,other:`Other Skills`},skillsPage:{title:`Skills`,tabs:{all:`All`,ready:`Ready`,needsSetup:`Needs Setup`,disabled:`Disabled`},defaultAgent:`{name} (default)`,filterPlaceholder:`Filter installed skills`,shown:`{count} shown`,clawHub:`ClawHub`,clawHubSubtitle:`Search and install skills from the registry`,searchClawHub:`Search ClawHub skills…`,searching:`Searching…`,disconnected:`Not connected to gateway.`,empty:`No skills found.`,noClawHubResults:`No skills found on ClawHub.`,notScannedByClawHub:`Not scanned by ClawHub`,install:`Install`,installed:`Installed`,installing:`Installing…`,close:`Close`,by:`By`,latest:`Latest: v{version}`,platforms:`Platforms: {platforms}`,installNamed:`Install {name}`,notFound:`Skill not found.`,openDetails:`Open {name} details`,enabledNamed:`{name} enabled`,invalidLink:`ClawHub link invalid`,overview:`Overview`,skillCard:`Skill Card`,missingRequirements:`Missing requirements`,reason:`Reason: {reasons}`,disabled:`Disabled`,enabled:`Enabled`,apiKey:`API key`,getKey:`Get your key:`,saveKey:`Save key`,source:`Source:`,refreshing:`Refreshing…`,fullSecurityReport:`Full security report`,loadingSkillCard:`Loading Skill Card…`,skillCardNotLoaded:`Skill Card not loaded.`,verdict:{unavailable:`Unavailable`,clean:`Clean`,pending:`Pending`,blocked:`Blocked`,review:`Review`}},skillStatus:{bundled:`bundled`,eligible:`eligible`,blocked:`blocked`,disabled:`disabled`,blockedAllowlist:`blocked by allowlist`,blockedAgentFilter:`blocked by agent filter`},nav:{account:`Account`,back:`Back`,forward:`Forward`,settings:`Settings`,askOpenClaw:`Ask OpenClaw`,settingsGroupConnections:`Connections`,settingsGroupAgents:`Agents & Tools`,settingsGroupSecurity:`Privacy & Security`,settingsGroupSystem:`System`,settingsSearchLabel:`Search settings`,settingsSearchPlaceholder:`Search settings…`,settingsSearchNoResults:`No matching settings.`,settingsSearchClear:`Clear settings search`,settingsLoadFailed:`Settings navigation could not load.`,exitSettings:`Back to app`,expand:`Expand sidebar`,collapse:`Collapse sidebar`,resize:`Resize sidebar`,more:`More`,home:`Home`,pages:`Pages`,customize:`Edit pinned items`,customizeReset:`Reset pinned items`,workboardGroup:`WorkBoard`},terminal:{title:`Terminal`,toggle:`Toggle terminal`,open:`Open terminal`,openWindow:`Open terminal in new window`,hide:`Hide terminal`,resize:`Resize terminal panel`,newSession:`New terminal session`,addFiles:`Add files to terminal`,dropFiles:`Drop files to add them`,uploadProgress:`Uploading {current} of {total}`,uploadFailed:`Upload failed`,retryUpload:`Retry`,closeSession:`Close terminal session`,sessions:`Terminal sessions`,refreshSessions:`Refresh`,loadingSessions:`Loading sessions…`,noSessions:`No live terminal sessions`,currentSession:`current`,sessionAttached:`attached`,attachSession:`Attach session`,attachFailed:`Could not attach terminal session`,connecting:`Connecting to session…`,connectionTimedOut:`Session did not connect within 30 seconds.`,refreshRequired:`Control UI updated. Reload this page to continue the terminal action.`,tabLabel:`shell {n}`,tabHint:`{agent} · {cwd}`,agentOwnedBadge:`agent`,exited:`exited`,exitedCode:`exited ({code})`,detached:`detached`,dockBottom:`Dock to bottom`,dockRight:`Dock to right`,dockMain:`Fill main content area`,dockMode:`Terminal panel position`,unavailable:`The terminal is not available on this gateway.`,unusableSession:`The Gateway returned an unusable terminal session (missing {field}). The Gateway is likely older than this Control UI — update it, then retry.`,uploadTooLarge:`File exceeds the 16 MiB terminal upload limit: {file}`,uploadUnsafeCmdPath:`Cannot safely insert an uploaded path containing % or ! into cmd.exe`,uploadUnsupportedShell:`Cannot safely insert an uploaded path into unsupported shell: {shell}`},browser:{profile:`Browser profile: {profile}`,navigationBlocked:`The current browser navigation rules block this address. Select another tab or enter an allowed address.`,navigationCheckFailed:`OpenClaw couldnt verify this tabs address. Refresh to try again.`,title:`Browser`,open:`Open`,openPanel:`Open browser panel`,moreActions:`More actions`,copyUrl:`Copy URL`,openNewTab:`Open in new tab`,toggle:`Toggle browser panel`,close:`Close browser panel`,resize:`Resize browser panel`,newTab:`New tab`,closeTab:`Close tab`,untitledTab:`New tab`,back:`Back`,forward:`Forward`,reload:`Reload`,openExternal:`Open in your browser`,urlPlaceholder:`Enter a URL and press Enter`,dockBottom:`Dock to bottom`,dockRight:`Dock to right`,annotate:`Annotate page`,inspect:`Inspect element`,annotateSend:`Send to chat`,annotateUndo:`Undo`,annotateClear:`Clear`,annotateDone:`Exit annotate mode`,annotateHint:`Draw on the page, then send the markup to your chat.`,inspectName:`Name`,inspectRole:`Role`,inspectFocusable:`Focusable`,loading:`Loading page…`,notRunning:`The gateway browser is not running.`,start:`Start browser`,noChatTarget:`Open a chat session first so the annotation has somewhere to go.`,annotationLimitReached:`Remove a browser annotation before retrying (maximum 4 cards and 8,000 characters of generated context).`,inspectUnavailable:`Element inspection is disabled (browser.evaluateEnabled=false).`,annotationSent:`Annotation added to the chat composer.`,errors:{requestFailed:`Browser request failed: {error}`,screenshotPathMissing:`Browser screenshot did not return a media path.`,screenshotFetchTimedOut:`Screenshot fetch timed out.`,screenshotFetchFailed:`Screenshot fetch failed ({status}).`,screenshotReadFailed:`Screenshot read failed.`,screenshotDecodeFailed:`Screenshot decode failed.`,canvasUnavailable:`Canvas 2D context unavailable.`},annotatePrompt:{browserTarget:`Browser target: {target}`,introTitled:`I annotated the page at {url} (page-reported title: "{title}") — the attached screenshot shows my markup.`,introUntitled:`I annotated the page at {url} — the attached screenshot shows my markup.`,region:`Marked region {index}: centered around {x}% across / {y}% down, spanning about {width}% × {height}% of the view.`,moreRegions:`…plus {count} more marked region(s), all visible in the screenshot.`,elementDetail:`Marked element (page-reported): {descriptor} — {width}×{height}px at ({x}, {y}).`,outro:`Please look at the marked area and tell me what you make of it.`}},desktop:{title:`Desktop`,openWindow:`Open desktop in new window`,unavailable:`Desktop viewing is unavailable for this connection.`,toggle:`Toggle desktop panel`,hide:`Hide desktop panel`,resize:`Resize desktop panel`,dockBottom:`Dock to bottom`,dockRight:`Dock to right`,enterFullscreen:`Enter fullscreen`,exitFullscreen:`Exit fullscreen`,fullscreenUnavailable:`Fullscreen is unavailable in this browser`,pickerTitle:`Desktop sources`,thisMachine:`This machine`,refresh:`Refresh`,refreshing:`Refreshing…`,loading:`Loading desktop sources…`,empty:`No desktop-capable sources are available.`,sourceUnavailable:`The requested desktop source is unavailable. Choose another source.`,connect:`Connect`,connecting:`Connecting to desktop…`,takeControl:`Take control`,switchToViewOnly:`Switch to view only`,viewOnly:`View only`,control:`Control`,keyboard:`Keyboard`,keyboardInput:`Remote desktop keyboard input`,touchControls:`Remote desktop controls`,fit:`Fit`,fitScreen:`Fit screen`,actualSize:`Use actual size`,back:`Back`,disconnect:`Disconnect`,reconnect:`Reconnect`,passwordPrompt:`Enter the VNC password for this machine.`,passwordLabel:`VNC password`,accountPrompt:`Enter a macOS account to authenticate Screen Sharing.`,usernameLabel:`macOS username`,accountPasswordLabel:`macOS password`,controlTaken:`Another operator took control`,disconnected:`Desktop disconnected: {reason}`,closeCode:`connection closed with code {code}`,unknownReason:`unknown reason`,errors:{listFailed:`Could not load desktop sources: {error}`,fullscreenFailed:`Could not change fullscreen mode: {error}`,securityFailed:`Desktop security negotiation failed: {reason}`}},routeTitles:{modelProviders:`Models`,notifications:`Notifications`,advanced:`Advanced`},tabs:{agents:`Agents`,activity:`Activity`,apps:`Apps`,portals:`Portals`,approvals:`Approvals`,workboard:`Workboard`,worktrees:`Worktrees`,channels:`Channels`,connection:`Gateway`,sessions:`Sessions`,usage:`Usage`,cron:`Automations`,tasks:`Tasks`,skills:`Skills`,plugins:`Plugins`,skillWorkshop:`Skill Workshop`,devices:`Devices`,cloudWorkers:`Cloud workers`,chat:`Chat`,dashboards:`Dashboards`,custodian:`OpenClaw`,profile:`Profile`,communications:`Communications`,appearance:`Appearance`,lobsterdex:`Lobsterdex`,automation:`Automation`,mcp:`MCP`,memory:`Memory`,talk:`Talk`,infrastructure:`Infrastructure`,labs:`Labs`,updates:`Updates`,about:`About`,aiAgents:`Agent Defaults`,modelSetup:`Model Setup`,memoryImport:`Import Memory`,security:`Privacy & Security`,secrets:`Secrets`,debug:`Debug`,logs:`Logs`,plugin:`Plugin`},subtitles:{agents:`Workspaces, tools, identities.`,activity:`Recent sessions across people using this gateway.`,apps:`Companion apps for phone, watch, desktop, and browser.`,portals:`Live previews from agent-run applications.`,approvals:`Recent exec, plugin, and system-agent approvals.`,workboard:`Agent work queue and session handoff.`,worktrees:`Isolated agent task checkouts and recovery snapshots.`,channels:`Channels and settings.`,connection:`Gateway endpoint, credentials, and handshake status.`,sessions:`Active sessions and defaults.`,usage:`API usage and costs.`,cron:`Scheduled tasks and recurring agent runs.`,tasks:`Background tasks: subagents, automation runs, CLI.`,skills:`Skills and API keys.`,plugins:`Install and manage optional capabilities.`,skillWorkshop:`Review, refine, and apply proposals before they become live skills.`,devices:`Paired devices, pairing approvals, and exec bindings.`,cloudWorkers:`Profiles and machine sizes for cloud sessions.`,chat:`Gateway chat for quick interventions.`,dashboards:`Sessions that open on their dashboard face.`,custodian:`System setup and care.`,config:`Legacy settings route; opens Appearance.`,profile:`Your display name, avatar, and identity on this gateway.`,communications:`Messages and text-to-speech settings.`,appearance:`Theme, UI, and setup wizard settings.`,lobsterdex:`Every lobster palette that has visited this browser.`,automation:`Commands, hooks, automations, and plugins.`,mcp:`MCP servers, auth, tools, and diagnostics.`,memory:`Memory engine, search, and dreaming.`,talk:`Realtime voice: provider, model, and speaker voice.`,infrastructure:`Gateway, browser, node host, discovery, and ACP settings.`,labs:`Experimental agent and tool capabilities.`,updates:`Release channel, automatic updates, and current update status.`,about:`Control UI and connected Gateway build identity.`,aiAgents:`Global agent defaults: skills, tools, and session.`,modelSetup:`Connect a verified AI model`,modelProviders:`Default models, behavior, provider access, usage, and cost.`,memoryImport:`Bring Codex and Claude Code memory into an agent workspace.`,notifications:`Browser push notifications from your gateway.`,security:`Gateway auth, exec policy, tool profile, and approvals.`,advanced:`Every remaining config section, plus the raw file editor.`,debug:`Snapshots, events, RPC.`,logs:`Live gateway logs.`,plugin:`Plugin-provided panel.`},cloudWorkersPage:{intro:`Run agent sessions on ephemeral cloud machines instead of this gateway.`,sectionTitle:`Profiles`,sectionDescription:`Each profile defines how its provider provisions and retires a worker.`,empty:`No cloud worker profiles are configured.`,addProfile:`Add profile`,editProfile:`Edit profile`,editAction:`Edit`,deleteTitle:`Delete cloud worker profile`,deleteConfirm:`Delete profile {profile}? New cloud sessions cannot use it after restart.`,advertised:`Advertised`,restartRequired:`Restart required`,adminRequired:`Administrator access is required to manage cloud worker profiles.`,catalogFailed:`Could not load advertised profiles: {error}. Check the gateway and retry.`,providerFact:`Provider: {provider}`,backendFact:`Crabbox backend: {backend}`,classFact:`Class: {value}`,ttlFact:`Max lifetime: {value}`,idleFact:`Idle stop: {value}`,desktopFact:`Desktop: {value}`,providerList:`View supported backends`,fields:{profileId:`Profile ID`,profileIdHelp:`Use letters, numbers, hyphens, or underscores.`,backend:`Crabbox backend`,backendHelp:`The backend passed to Crabbox, such as AWS or Hetzner.`,backendPlaceholder:`hetzner`,machineClass:`Machine class`,machineClassHelp:`Enter a class accepted by the selected Crabbox backend and binary. The provider determines its effective sizing.`,ttl:`Max lifetime`,ttlHelp:`Use a positive Go duration such as 8h or 90m.`,ttlPlaceholder:`8h`,idleTimeout:`Idle stop`,idleTimeoutHelp:`Stop an unused worker after this positive Go duration.`,idleTimeoutPlaceholder:`45m`,setup:`Setup command`,setupHelp:`Optional idempotent shell command run before OpenClaw is installed.`,setupPlaceholder:`command -v node || install-node`,desktop:`Desktop`,desktopHelp:`Warm a direct or coordinator-backed AWS worker, or a coordinator-backed Hetzner worker, with node-carried Browser and Terminal access. Existing workers must be reprovisioned after this changes.`,binary:`Crabbox binary`,binaryHelp:`Optional absolute path to the Crabbox executable on the gateway.`,binaryPlaceholder:`/usr/local/bin/crabbox`,actions:`Save profile`,actionsHelp:`Saving updates the config; the gateway must restart before using it.`},errors:{title:`Profile needs attention`,profileId:`Use a profile ID that starts with a letter or number and contains only letters, numbers, hyphens, or underscores.`,profileExists:`Choose another profile ID; this one already exists.`,profileMissing:`This profile changed or was removed. Reload the page and try again.`,backend:`Enter a Crabbox backend, such as aws or hetzner.`,machineClass:`Enter a machine class of 1 to 128 characters.`,ttl:`Enter a positive Go duration for max lifetime, such as 8h or 90m.`,idleTimeout:`Enter a positive Go duration for idle stop, such as 45m.`,binary:`Enter an absolute Crabbox binary path or leave the field empty.`,saveFailed:`The profile was not saved. Reload the config and try again.`,deleteFailed:`The profile was not deleted. Reload the config and try again.`}},portalsPage:{listLabel:`Active portals`,portLabel:`Port {port}`,openNewTab:`Open in new tab`,closePortal:`Close {title}`,previewTitle:`{title} portal preview`,loading:`Loading portals…`,emptyHint:`Ask the agent to start a portal:`,promptShow:`Show me in a portal.`,promptStart:`Start the application in a portal.`,promptMakeAvailable:`Make the server available in a portal.`,unsupported:`This gateway does not support portals.`,loadFailed:`Could not load portals: {error}`,closeFailed:`Could not close the portal: {error}`,unreachableTitle:`Portal not reachable from this browser`,unreachableBody:`The Gateway is likely being accessed through a proxy or tunnel that exposes only its main port. Open this URL from a browser on the Gateway host.`,writeAccessRequiredTitle:`Write access required`,writeAccessRequiredBody:`This portal requires an operator with write access.`,retry:`Retry`},modelSetup:{missingAuth:`No provider credential is configured for this model. Set it up in Model Setup.`,heading:`Connect a verified AI model`,intro:`OpenClaw checks the AI access available on this Gateway and verifies the exact model before it enables conversations.`,required:{title:`No AI provider configured`,body:`We couldn't find a provider and model configured for this agent. Choose a supported connection; OpenClaw will test it before enabling chat.`,action:`Connect an AI provider`},connectionFailure:{title:`Configured AI needs attention`,body:`OpenClaw found the provider and model selected for this agent, but the live check failed. Your configuration is still intact. Review the credential, model access, or provider status, then verify again.`,action:`Review connection`},loading:`Checking this Gateway for available AI access…`,testing:`Testing — asking the selected model for a quick reply…`,retry:`Retry`,checkAgain:`Check again`,recovery:{unknown:`The previous activation is unresolved. You can verify and use the selected model, or check again after the setup attempt has finished. No activation will be repeated automatically.`,wait:`The previous setup attempt may still be running. Wait for its bounded setup window to finish, then choose Check again to retry.`,useCurrent:`Verify & use selected model`},verify:{title:`Selected model`,button:`Check model`,retry:`Try again`,checkAgain:`Check again`,checkingButton:`Checking…`,checking:`Checking — asking {modelRef} for a quick reply…`,ready:`Ready`,readyIn:`Ready · {latencyMs} ms`,providerUnavailable:`{provider} isnt responding.`},access:{adminRequired:`Model setup requires operator.admin access.`,gatewayTooOld:`The Gateway is running an older OpenClaw version`},candidates:{title:`Found on this Gateway`,recommended:`Recommended`,credentialsReady:`Credentials ready`,signInNeeded:`Sign-in needed`,detected:`Detected`,testAndUse:`Test & use`,retry:`Retry test`,testingButton:`Testing…`},empty:{title:`Recommended installs`,intro:`No existing AI access was detected. Install one of these tools, then check again.`},unavailable:{title:`Found, but needs attention`,signIn:`Sign in with {provider}`,useApiKey:`Use API key`},signIn:{title:`Sign in with a provider`,signIn:`Sign in`,pair:`Pair`,more:`More sign-in options`},prepare:{title:`Run a model locally`,intro:`Use a local model service or prepare a private GGUF model on this Gateway.`,ollamaButton:`Check & set up`,ollamaLabel:`Ollama`,ollamaHint:`Connect to the Ollama service on this Gateway and prepare a tools-capable model`,llamaCppLabel:`llama.cpp`,providerNotReady:`{provider} did not expose a usable local model. Review the setup result, then retry.`},manual:{title:`Connect with an API key or token`,provider:`Provider and access method`,selectProvider:`Select a provider`,selectProviderHint:`Choose where this credential comes from`,accessValue:`API key or token`,accessValueFor:`{provider} API key or token`,accessValuePlaceholder:`Paste an API key or token`,connectAndVerify:`Connect & verify`,verifyHint:`OpenClaw verifies a real model reply before marking the connection ready.`,required:`Choose a provider and enter an API key or token.`},success:{title:`Connection verified`,body:`OpenClaw received a real reply from {modelRef}. You can start chatting now.`,activeModel:`Active model`,latency:`Verified in {latencyMs} ms`,openChat:`Start chatting`,continueSetup:`Continue setup`,stayHere:`Stay in settings`,configuredModel:`Configured model`},failure:{auth:`Authentication failed`,rateLimit:`Rate limited`,billing:`Billing problem`,timeout:`Timed out`,format:`Invalid response`,unavailable:`Unavailable`,unknown:`Connection failed`},failureGuidance:{auth:`Review the provider credential or sign-in, then retry.`,rateLimit:`Wait for the provider limit to reset, then retry.`,billing:`Restore provider billing or quota, then retry.`,timeout:`The model did not finish the setup test in time. Warm it or choose a faster model, then retry.`,unavailable:`Make sure the provider service is running and reachable, then retry.`,format:`Check that the endpoint exposes a compatible chat model, then retry.`,unknown:`Review the connection details, then retry.`},errors:{requestFailed:`Model setup request failed.`,activationFailed:`The model could not be activated.`},wizard:{dialogLabel:`Provider sign-in`,prepareDialogLabel:`Local model setup`,title:`Sign in with a provider`,prepareTitle:`Set up a local model`,starting:`Starting provider sign-in…`,prepareStarting:`Starting local model setup…`,checking:`Checking your model setup…`,working:`Working…`,continue:`Continue`,submit:`Submit`,openSignIn:`Open sign-in page`,copy:`Copy`,expires:`Expires in {count} minutes`,cancelled:`Provider sign-in was cancelled.`,sessionExpired:`This setup session expired after the Gateway restarted. Close this dialog, then start model setup again.`,notComplete:`Sign-in finished, but model setup is not complete yet.`}},memoryImport:{unknownCollection:`Memory collection`,claudeCode:`Claude Code`,fileCountOne:`{count} file`,fileCount:`{count} files`,alreadyImported:`{count} existing`,ready:`Ready`,existing:`Existing`,importComplete:`Import complete`,importIncomplete:`Import incomplete`,importedCount:`{count} files imported`,importedWithIssues:`{migrated} imported · {errors} failed · {conflicts} conflicts`,reportSaved:`report saved`,recoveryFile:`Recovery file`,recoveryJournal:`Recovery journal`,itemBackup:`Item backup`,codexDescription:`Consolidated Codex memory files.`,claudeDescription:`Claude Code per-project auto-memory files.`,providerFallback:`Import assistant memory into this agent workspace.`,reviewFiles:`Review files`,notFound:`Not found`,noMemoryFound:`No importable memory found on this computer.`,source:`Source`,destination:`Destination`,selectedCount:`{count} selected`,selectAtLeastOne:`Select at least one file`,importSelected:`Import selected`,confirmTitle:`Import from {provider}?`,confirmDescription:`Copy {count} selected memory files into this agent workspace.`,confirmReplace:`Existing destination files will be backed up in the migration report before replacement.`,confirmBackup:`OpenClaw creates a verified pre-import backup before copying memory.`,confirmImport:`Import memory`,disconnected:`Connect to the gateway to import memory.`,adminRequired:`Memory import requires operator.admin access.`,title:`Import assistant memory`,subtitle:`Review Codex consolidated memory and Claude Code auto-memory before copying it into OpenClaw.`,agent:`Destination agent`,replaceExisting:`Replace existing imports`,replaceHint:`Preview conflicts again and preserve item backups before replacement.`,backfill:{title:`From past sessions`,subtitle:`Stage trusted memories from earlier agent sessions. Dreaming promotes the useful ones into long-term memory.`,dateRange:`Session date range`,dateRangeHint:`Leave either date blank to scan the full available range.`,from:`From`,to:`To`,actions:`Backfill`,preview:`Preview`,previewing:`Previewing…`,apply:`Apply`,applying:`Applying…`,rollback:`Rollback`,previewSummary:`{candidates} candidates across {days} days`,previewTruncated:`This preview shows the first bounded batch. Apply continues through the remaining candidates.`,candidateCount:`{count} candidates`,noCandidates:`No new trusted session candidates were found.`,progress:`Processed {days} days · {staged} staged`,processedCandidates:`{count} session candidates processed`,processedDayCountOne:`{count} day processed`,processedDayCount:`{count} days processed`,complete:`{count} staged; promotion happens via dreaming`,rollbackConfirmTitle:`Rollback session backfill?`,rollbackConfirmDescription:`Remove diary entries and staged memories created by session backfill for this agent.`,rollbackWarning:`Session backfill cursors are rewound, so the same candidates can be staged again.`,rollbackComplete:`Session backfill rolled back`,rollbackCounts:`{diary} diary entries and {staged} staged entries removed`,unavailable:`Session backfill is unavailable on this Gateway.`}},onboarding:{memoryImport:{title:`Bring your assistant memory with you`,body:`OpenClaw found memory from other coding assistants. Import it into your agent workspace?`,plannedCount:`{count} ready to import`,alreadyImported:`Already imported: {count}`,sourceUnavailable:`Source path unavailable`,import:`Import`,skip:`Skip`,reviewDetails:`Review details`,importingProvider:`Importing…`,providerResult:`Migrated {migrated}, skipped {skipped}`,providerIncomplete:`Migrated {migrated}, skipped {skipped}, {errors} failed, {conflicts} conflicts`,providerError:`Import failed: {error}`,connectionChanged:`Skipped: the Gateway connection changed during the import`,unknownError:`Request failed`,doneTitle:`Memory import finished`,doneBody:`Migrated {migrated}, skipped {skipped}. You can continue setting up OpenClaw.`}},custodian:{title:`OpenClaw`,subtitleCaretaker:`System setup and care.`,exitSetup:`Exit setup`,newAgent:`New agent`,hatchDraft:`Wake up, my friend!`,placeholder:`Message OpenClaw…`,sensitivePlaceholder:`Enter sensitive value…`,sensitiveReply:`Sensitive reply sent`,cancel:`Cancel`,send:`Send`,thinking:`OpenClaw is thinking`,earlier:`Earlier`,requestFailed:`OpenClaw could not reply. Try again.`,connectionChanged:`The Gateway connection changed. Retry to continue this setup.`,sessionRestarted:`{error} OpenClaw started a fresh session; earlier messages remain for context.`,unsupportedGateway:`Update the Gateway to continue setup with OpenClaw.`,panel:{title:`OpenClaw`,toggle:`Toggle Ask OpenClaw`,close:`Close Ask OpenClaw`,resize:`Resize Ask OpenClaw`,dockBottom:`Dock Ask OpenClaw at bottom`,dockRight:`Dock Ask OpenClaw at right`},history:{button:`History`,title:`Recent changes`,description:`What changed on this system, newest first.`,loading:`Loading recent changes…`,empty:`No recorded changes yet.`,requestFailed:`OpenClaw could not load change history.`,loadMore:`Load more`,loadingMore:`Loading more…`,changedPaths:`Changed paths ({count})`,invalidEdit:`This manual edit did not pass configuration validation.`,opaqueChange:`Formatting or comments changed without visible configuration path changes.`,sources:{systemAgent:`system-agent`,doctor:`doctor`,settings:`settings`,cli:`CLI`,pluginInstall:`plugin install`,manualEdit:`manual edit`,unknown:`unknown`}},nudge:{configReload:`Configuration reload stopped — ask me what happened`,channelAuth:`{channel} authentication degraded — ask me what happened`,channelDisconnected:`{channel} just disconnected — ask me what happened`,channelDegraded:`{channel} is degraded — ask me what happened`,channelFallback:`A channel`,dismiss:`Dismiss this update`,channelSetupTitle:`Reach OpenClaw outside this app`,channelSetupBody:`The web app already works. Add a channel only if you want to message OpenClaw from another service.`,channelSetupAction:`Set up a channel`,channelSetupDismiss:`Keep using the web app`,channelStatusErrorTitle:`Channel status is unavailable`,channelStatusErrorBody:`Retry the check, or keep using the web app without a channel.`}},mcpServers:{add:`Add server`,adding:`Adding…`,nameLabel:`Name`,transportLabel:`Transport`,transportStreamableHttp:`Streamable HTTP`,transportSse:`SSE`,transportStdio:`Stdio`,targetLabel:`URL or command`,nameInvalid:`Server names use letters, numbers, dots, dashes, or underscores.`,targetInvalid:`Enter a URL for HTTP transports or a valid command line for stdio.`,sessionEnableFailed:`The server was saved disabled globally, but enabling it for this session failed: {error}`,sessionChanged:`The active session changed before it could be enabled.`,sessionUnavailable:`The active session is unavailable; refresh and try again.`,nameTaken:`An MCP server named “{name}” already exists.`,missing:`MCP server “{name}” was not found in the configuration.`,missingTransport:`missing transport`,addedSuccess:`Added MCP server {name}.`,enabledSuccess:`Enabled MCP server {name}.`,disabledSuccess:`Disabled MCP server {name}.`,removedSuccess:`Removed MCP server {name}.`,configUnavailable:`Configuration is unavailable; refresh and try again.`,connectRequired:`Connect to the gateway to change MCP servers.`,adminRequired:`MCP server changes require operator.admin access.`,enable:`Enable`,disable:`Disable`,removeNamed:`Remove {name}`,working:`Working…`},mcpPage:{intro:`Connect and manage MCP servers that provide tools to OpenClaw.`,servers:`Servers`,oauth:`OAuth`,filtered:`Filtered`,configuredServers:`Configured servers`,noServers:`No MCP servers configured.`,setUpFirstServer:`Set up your first MCP server`,operatorCommands:`MCP operator commands`,operatorCommandsHint:`Status, diagnostics, auth, probing, and runtime reload.`,runtimeHint:`Edits save automatically; runtime changes apply after a gateway restart, and active agents rebuild MCP runtimes on next use.`,toolFilter:`tool filter`,parallel:`parallel`,tlsVerifyOff:`TLS verify off`,mtls:`mTLS`},talkPage:{intro:`Configure realtime voice providers, models, and speaker voices.`,voiceSection:{title:`Realtime voice`,description:`Continuous speech conversations with your agent. The pickers below write talk.realtime settings; the full form further down covers everything else.`},status:{title:`Status`,ready:`Ready`,notReady:`Not configured`,unavailable:`Unavailable`,unavailableHint:`Connect to the Gateway to check realtime voice readiness.`,activeProvider:`Active provider: {provider}`,noProvider:`No realtime voice provider is configured yet.`},provider:{title:`Provider`,description:`Auto picks the first provider with working credentials.`,auto:`Auto`},model:{title:`Model`,description:`Realtime voice model for browser Talk sessions.`,default:`Provider default`,defaultNamed:`Default ({model})`},voice:{title:`Speaker voice`,description:`Voice used for spoken replies. GPT-Live locks the voice once a call starts.`,default:`Provider default`},gptLive:{title:`GPT-Live`,hint:`GPT-Live works with a ChatGPT subscription: sign in once with “openclaw models auth login --provider openai”. No Platform API key needed for browser or Gateway-relay Talk. Delegated work can be steered while running and requires exact spoken confirmation for high-impact actions.`,ready:`Ready`}},memoryPage:{intro:`Choose how OpenClaw stores, searches, and maintains agent memory.`,tablistLabel:`Memory sections`,tabs:{overview:`Overview`,memories:`Memories`,dreams:`Dreams`,settings:`Settings`},overview:{hero:{awake:`Memory is awake`,waking:`Waking memory…`,hibernating:`Memory is hibernating`,needsAttention:`Memory needs attention`,activeDescription:`{engine} · {mode}`,loadingDescription:`Checking this agent's memory engine and dream cycle.`,offDescription:`Choose a memory engine in Settings to wake it up.`,disabledDescription:`The selected memory engine is disabled. Re-enable it in Settings.`,gatewayOffline:`The gateway is offline, so memory status is unavailable.`,hybridSearch:`hybrid search`,keywordSearch:`keyword search (no embeddings)`,openSettings:`Open Settings`,retry:`Retry`,refresh:`Refresh status`},schedule:{title:`Sleep schedule`,lightDescription:`Sorts fresh short-term notes and stages promising candidates without changing long-term memory.`,remDescription:`Reflects on themes and recurring ideas across recent activity to strengthen ranking without changing long-term memory.`,deepDescription:`Scores staged candidates, promotes the keepers into long-term memory (MEMORY.md), and writes the dream diary.`,nextRun:`next {time}`,lastRun:`last {time}`,notScheduled:`Not scheduled`,learnMore:`How dreaming works`,openDocs:`Open dreaming guide`},activity:{title:`Activity`,promotedToday:`Promoted today`,promotedTotal:`Promoted total`,shortTermCount:`Pending short-term entries`,phaseHitCount:`Phase signals`,lightPhaseHitCount:`Light-phase hits`,remPhaseHitCount:`REM-phase hits`},health:{title:`Engine health`,provider:`Provider`,embeddings:`Embeddings`,runtime:`Embedding runtime`,healthy:`Ready`,unavailable:`Unavailable`,notChecked:`Not checked`,notCheckedDescription:`Embedding readiness has not been checked yet.`,checking:`Checking…`,test:`Test`,testing:`Testing…`},shortcuts:{title:`Explore memory`,memories:`Search memories`,diary:`Read the dream diary`,settings:`Configure memory`}},memories:{searchLabel:`Search memories`,searchPlaceholder:`Search this agent's memories`,searchButton:`Search`,idle:`Search for a person, project, decision, or anything else this agent remembers.`,searching:`Searching memories…`,results:`{count} results`,empty:`No memories matched “{query}”.`,error:`Memory search failed: {message}`,retry:`Retry`,gatewayUpdateRequired:`Update the gateway to search memories from the Control UI.`,hybridSearch:`hybrid search`,keywordSearch:`keyword search`,lineRange:`lines {start}{end}`,score:`score {score}`,sourceMemory:`memory`,sourceSessions:`sessions`,fileLoading:`Loading the full memory file…`,fileError:`Could not load this memory file: {message}`,fileUnsupported:`This memory file cannot be shown as text.`},engine:{title:`Engine`,description:`Exactly one memory plugin owns the memory slot. Selecting an engine enables it and disables the others.`,rowTitle:`Memory engine`,openClawMemory:`OpenClaw Memory`,off:`Off`,unavailable:`Unavailable`,autoHint:`No engine is pinned in config, so the slot falls back to its default owner.`,explicitHint:`This engine is pinned in config under plugins.slots.memory.`,offHint:`Memory is switched off in config: plugins.slots.memory is set to none.`,catalogUnavailable:`Connect to the gateway to change the memory engine.`,changeFailed:`Could not change the memory engine`,disabledTitle:`This engine is disabled`,disabledHint:`The memory slot points at this plugin, but the plugin itself is disabled, so memory is not running.`,enable:`Enable`},addons:{title:`Add-ons`,description:`These plugins layer on top of the engine instead of competing for the slot, so any combination can run at once.`,activeMemory:{title:`Active memory`},memoryWiki:{title:`Memory wiki`},toggleAriaLabel:`Enable or disable {plugin}`,changeFailed:`Could not update {plugin}`,stateUnknown:`Unknown`,manage:`Enable or disable add-ons`,manageLink:`Open Plugins`},import:{title:`Import`,description:`Bring existing memory from other assistants into an agent workspace.`,link:`Open Memory Import`},search:{intro:`Embedding and retrieval defaults shared by every agent that has no memory override.`},dreaming:{intro:`Dreaming runs as one managed automation across every agent workspace, so these settings are global. They are owned by the {plugin} plugin.`,schedule:{title:`Schedule`,description:`When the full sweep runs and which model narrates it.`},frequency:{label:`Dreaming frequency`,help:`Cron cadence for the full dreaming sweep (light, REM, then deep). Leave empty for the plugin default.`,placeholder:`0 3 * * *`},timezone:{label:`Timezone`,help:`IANA timezone used to interpret the cron cadence.`,placeholder:`Europe/Vienna`,default:`Gateway local timezone`},model:{label:`Dreaming model`,help:`Provider/model override for dream diary narration. Requires subagent model overrides to be allowed.`,placeholder:`anthropic/claude-sonnet-4-6`,default:`Agent model`},verboseLogging:{label:`Verbose logging`,help:`Log each dreaming phase in detail. Useful when tuning thresholds.`},storage:{title:`Storage`,description:`Where promoted memories and dreaming reports are written.`,modeLabel:`Storage mode`,modeHelp:`Inline writes into the memory file; separate keeps a dedicated report file.`,modes:{inline:`Inline`,separate:`Separate`,both:`Both`},separateReportsLabel:`Separate reports`,separateReportsHelp:`Keep dreaming reports out of the main memory file.`},phases:{light:{title:`Light phase`,description:`Cheap recent-activity pass that stages replay candidates.`},deep:{title:`Deep phase`,description:`Scored promotion pass that graduates short-term entries into memory.`},rem:{title:`REM phase`,description:`Pattern pass that looks for recurring themes across the lookback window.`}},phaseFields:{enabled:`Enabled`,enabledHelp:`Run this phase during the sweep.`,lookbackDays:`Lookback days`,lookbackDaysHelp:`How far back this phase reads. Leave empty for the plugin default.`,limit:`Limit`,limitHelp:`Maximum entries this phase processes per run.`,dedupeSimilarity:`Dedupe similarity`,dedupeSimilarityHelp:`Similarity above which two candidates are treated as duplicates.`,minScore:`Minimum score`,minScoreHelp:`Promotion score an entry must reach.`,minRecallCount:`Minimum recalls`,minRecallCountHelp:`How often an entry must be recalled before it can be promoted.`,minUniqueQueries:`Minimum unique queries`,minUniqueQueriesHelp:`How many distinct queries must have surfaced the entry.`,recencyHalfLifeDays:`Recency half-life (days)`,recencyHalfLifeDaysHelp:`How quickly older recall signals lose weight.`,maxAgeDays:`Maximum age (days)`,maxAgeDaysHelp:`Ignore short-term entries older than this.`,maxPromotedSnippetTokens:`Max promoted snippet tokens`,maxPromotedSnippetTokensHelp:`Token budget for each promoted snippet. Provenance stays attached.`,minPatternStrength:`Minimum pattern strength`,minPatternStrengthHelp:`Strength a recurring pattern must reach to be reported.`},agentScope:{rowTitle:`Agent`},unsupported:{title:`Dreaming settings`,rowTitle:`Not available for this engine`,description:`The {plugin} plugin owns the memory slot and its config schema has no dreaming section, so these settings cannot be stored. Switch the engine above to edit them.`}}},sessionsPage:{hubTablistLabel:`Session sections`},pluginsPage:{searchLabel:`Search plugins`,searchPlaceholder:`Search plugins and ClawHub`,browseClawHub:`Browse ClawHub`,refresh:`Refresh`,hubTablistLabel:`Plugins sections`,installedTab:`Installed`,discoverTab:`Discover`,workshopTab:`Workshop`,tryAgain:`Try again`,loading:`Loading plugins…`,searching:`Searching ClawHub…`,fromClawHub:`From ClawHub`,noClawHubResultsBody:`ClawHub has no results for “{query}”.`,noDiscoverMatchTitle:`Nothing to discover matches`,featuredGroup:`Featured`,officialGroup:`Official plugins`,connectorsGroup:`Connect your world`,connectorsHint:`One-click MCP connectors and hand-picked ClawHub searches for popular services.`,connectorGroupWork:`Work & productivity`,connectorGroupDev:`Coding & infrastructure`,connectorGroupHome:`Home & media`,connectorGroupLife:`Everyday life`,mcp:`MCP`,oauth:`OAuth`,connectorMcpNote:`One-click MCP server`,connectorClawHubNote:`Community plugins on ClawHub`,connectorAdd:`Add`,connectorSearch:`Find on ClawHub`,connectorAdded:`Added`,connectorAddedOauth:`Added {name}. Authenticate with “{command}”, then restart the gateway.`,connectorAddedEndpoint:`Added {name}. Update the endpoint and credentials in MCP settings before use.`,connectorAddedReady:`Added {name}. New agent sessions can use it right away.`,connectorDescriptions:{notion:`Search, create, and update pages and databases in your Notion workspace.`,linear:`Triage issues, update cycles, and file bugs straight from chat.`,todoist:`Read, add, and complete tasks and projects in Todoist.`,airtable:`Query and update records, tables, and bases in Airtable.`,jira:`Create, search, and triage Jira tickets from chat.`,canva:`Create and edit Canva designs, manage assets, and export results.`,stripe:`Check payments, customers, invoices, and subscriptions in your Stripe account.`,googleCalendar:`Read, create, and get briefed on events — your agent owns your schedule.`,email:`Mailbox triage, summaries, and drafts with send-on-approval.`,pdf:`Extract, merge, convert, and OCR PDF documents.`,transcription:`Turn audio and video into clean, structured transcripts.`,github:`PR review queues, issue triage, and repo Q&A through the official GitHub MCP.`,sentry:`Crash alerts explained and triaged the moment they fire.`,context7:`Version-specific library docs and code examples while coding. No signup needed.`,deepwiki:`Ask questions about any public GitHub repo. Free, no account needed.`,huggingFace:`Search models, datasets, and papers; run Spaces as tools.`,grafana:`Grafana know-how and community connectors for dashboards and alerts.`,kubernetes:`Cluster operations and troubleshooting from chat.`,homeAssistant:`Control lights, climate, and automations across your whole home.`,spotify:`Search, queue, and soundtrack your day with mood-based playlists.`,sonos:`Whole-home audio: play, group rooms, and queue by chat.`,reddit:`Browse, search, and summarize subreddits and threads.`,markets:`Live stocks and crypto with price alerts and daily digests.`,travel:`Flight and hotel search with fare watching and trip memory.`,news:`A personalized daily briefing: news, weather, and tasks in one message.`,maps:`Places, routing, and travel-time answers.`,translation:`Translate and localize text and documents.`,notes:`Capture notes to Markdown, Obsidian, Notion, or Bear.`},noInstalledTitle:`No optional plugins installed`,noInstalledBody:`Discover a featured plugin or search ClawHub to extend OpenClaw.`,noInstalledMatchTitle:`No installed plugins match`,noMatchBody:`Try a different search.`,filterAll:`All`,filterIssues:`Issues`,filterLabel:`Filter installed plugins`,categoryChannels:`Channels`,categoryProviders:`Model providers`,categoryMemory:`Memory`,categoryContextEngine:`Context engines`,categoryTools:`Tools`,categoryOther:`Other`,mcpServersGroup:`MCP servers`,mcpSettingsLink:`MCP settings`,mcpHint:`Connect Model Context Protocol servers to give your agent extra tools. Changes apply to new agent sessions.`,mcpEmpty:`No MCP servers configured yet. Add one here or pick a connector from Discover.`,remove:`Remove`,removing:`Removing…`,removeNamed:`Remove {name}`,removeConfirmTitle:`Remove {name}?`,removeConfirmMessage:`Removing this plugin package and all of its entries restarts the Gateway immediately and interrupts active sessions.`,cancel:`Cancel`,removedRestart:`Removed {name}. A Gateway restart is required to apply the change.`,verifiedSource:`Verified source`,enableAction:`Enable`,disableAction:`Disable`,working:`Working…`,detailClose:`Close`,detailOrigin:`Source`,detailCategory:`Category`,detailPackage:`Package`,detailPluginId:`Plugin ID`,capabilities:`Capabilities`,offlineTitle:`Gateway offline`,offlineBody:`Connect to browse installed and recommended plugins.`,optionalCapability:`Optional OpenClaw capability.`,enabled:`Enabled`,disabled:`Disabled`,available:`Available`,needsAttention:`Needs attention`,included:`Included`,global:`Global`,workspace:`Workspace`,config:`Config`,official:`Official`,codePlugin:`Code plugin`,bundlePlugin:`Bundle plugin`,unavailable:`Unavailable`,install:`Install`,installing:`Installing…`,installNamed:`Install {name}`,installConfirmTitle:`Install {name}?`,installConfirmMessage:`Installing this plugin restarts the Gateway immediately and interrupts active sessions.`,policyReviewTitle:`Security review needed`,policyReviewBodyKnown:`Policy warnings: {count}. Not installed.`,policyReviewBodyReason:`{reason} Not installed.`,policyReviewFindings:`Findings`,policyReviewSeverityInfo:`Info`,policyReviewSeverityWarn:`Warning`,policyReviewSeverityCritical:`Critical`,policyReviewTechnicalDetails:`Details`,policyReviewScope:`Install anyway approves every install-policy warning encountered during this install. Each warning is checked again before installation continues.`,installAnyway:`Install anyway`,connectToChange:`Connect to the gateway to change plugins.`,adminRequired:`Browsing only. Plugin changes require operator.admin access.`,changesDisabled:`Browsing only. This gateway does not allow plugin changes.`,configRefreshFailed:`Could not refresh Control UI configuration: {error}`,installedSuccess:`Installed {name}.`,installedRestart:`Installed {name}. A Gateway restart is required to apply the change.`,enabledSuccess:`Enabled {name}.`,enabledRestart:`Enabled {name}. A Gateway restart is required to apply the change.`,disabledSuccess:`Disabled {name}.`,disabledRestart:`Disabled {name}. A Gateway restart is required to apply the change.`},labsPage:{intro:`Labs contains experimental capabilities that may change, break, or disappear between releases.`,sectionTitle:`Experimental features`,sectionDescription:`Changes save immediately and apply to future agent runs.`,documentation:`Documentation`,restartRequired:`Gateway restart required.`,saveErrorTitle:`Could not update feature`,saveFailed:`The feature setting could not be saved.`,codeMode:{title:`Code Mode`,description:`Set the global default for compact, sandboxed JavaScript tool workflows. On selects Auto for evaluated models; Off disables the default. Per-model Code Mode overrides are in Agent Defaults → Models (Advanced).`},swarm:{title:`Swarm`,description:`Let Code Mode orchestrate groups of subagents in parallel.`,defaultPhase:`Unphased`,progress:`{complete} of {total}`},toolSearch:{title:`Tool Search`,description:`Keep a bounded tool directory visible and defer the rest behind search, so large MCP and plugin catalogs stop crowding the prompt.`},loopDetection:{title:`Tool-loop detection`,description:`Enable rolling-history guards that warn or block repeated tool calls when an agent stops making progress.`},localModelLean:{title:`Lean tools for local models`,description:`Drop heavyweight default tools that smaller local models handle poorly, leaving a shorter set they can use reliably.`},cliAgents:{title:`CLI agents`,description:`Show external CLI session engines in the new-session model picker when their plugins support creating sessions.`},auditMessages:{title:`Message audit metadata`,description:`Record content-free metadata for direct conversations in the audit ledger. Message content is never stored.`},hostDesktop:{title:`Host Desktop`,description:`Watch and control this Gateway machine from the Desktop panel through its existing VNC or Screen Sharing server.`},workerDesktop:{title:`Cloud Worker Desktop`,description:`Watch and control node-carried desktops from capable Crabbox AWS or Hetzner profiles with desktop: true.`}},aboutPage:{productName:`OpenClaw`,tagline:`Your personal AI assistant, running on your own devices.`,waveHello:`Wave hello to Clawd`,linksLabel:`Community and resources`,linkWebsite:`Website`,linkDocs:`Docs`,linkGitHub:`GitHub`,linkDiscord:`Discord`,linkX:`X (Twitter)`,linkChangelog:`Changelog`,license:`© 2026 OpenClaw Foundation — MIT License.`,artifactTitle:`Control UI`,artifactSubtitle:`Identity embedded when this browser artifact was built.`,artifactDetails:`Control UI build details`,version:`Version`,commit:`Commit`,branch:`Branch`,built:`Built`,unavailable:`Unavailable`,copyCommit:`Copy full commit hash`,copyingCommit:`Copying commit hash`,copiedCommit:`Commit hash copied`,copyCommitFailed:`Could not copy commit hash`,gateway:`Gateway`,gatewayVersion:`Connected Gateway version`,gatewayVersionHint:`Reported by the active Gateway connection; separate from this Control UI build.`},appsPage:{heroTitle:`Take OpenClaw everywhere`,heroTagline:`Companion apps for your phone, watch, desktop, and browser — plus plugins to extend what your agent can do.`,sectionMobile:`On your phone`,havePhone:`Already have the app?`,pairDevice:`Pair your device`,sectionWatch:`On your wrist`,sectionDesktop:`On your desktop`,sectionBrowser:`In your browser`,sectionCommunity:`Community`,badgeBundledIos:`Included with the iOS app`,badgeBundledAndroid:`Included with the Android app`,ctaAppStore:`App Store`,ctaPlayStore:`Google Play`,ctaDownload:`Download`,ctaDocs:`Docs`,ctaSetupGuide:`Setup guide`,ctaChromeWebStore:`Chrome Web Store`,ctaOpenPlugins:`Open Plugins`,ctaBrowseClawHub:`Browse ClawHub`,linkDiscord:`Discord community`,linkDocs:`Docs`,cards:{ios:{title:`iPhone`,desc:`Chat, talk, approve actions, and share into OpenClaw from iOS.`},android:{title:`Android`,desc:`Your Android phone as a full OpenClaw device — chat, camera, and Canvas.`},appleWatch:{title:`Apple Watch`,desc:`Glanceable chats and quick replies from your wrist.`},wearOs:{title:`Wear OS`,desc:`The Android companion extends OpenClaw to your watch.`},macos:{title:`macOS`,desc:`Menu bar companion for your Gateway — notifications, approvals, quick chat.`},windows:{title:`Windows`,desc:`The Windows companion connects your PC as an OpenClaw device.`},linux:{title:`Linux`,desc:`Native desktop app — .deb and AppImage builds.`},chrome:{title:`Chrome extension`,desc:`Let OpenClaw drive your existing Chrome — tabs, pages, and forms.`},plugins:{title:`Plugins & ClawHub`,desc:`Extend OpenClaw with channels, tools, and skills from the community.`}}},presence:{rosterTitle:`Online`,card:{details:`Details for {name}`,loadFailed:`Could not open details. Try again, or open this persons Activity page.`,ariaLabel:`Activity for {name}`,person:`Person`,onlineFor:`Online for`,where:`Where`,reportedTimeZone:`Reported time zone: {zone}`,lastActivity:`Last activity`,notObserved:`Not observed yet`,viewingNow:`Viewing now`,recentSessions:`Recent sessions`,noVisibleSessions:`No visible sessions being viewed.`,noRecentSessions:`No recent visible sessions.`,sessionUpdated:`Session updated`,ago:`ago`,viewActivity:`View activity`,controlUi:`Control UI`,cli:`Command line`,app:`App`}},activityFeed:{partialHistory:`People and counts describe visible recorded session associations; retained history and this people list may be incomplete.`,sessionsMode:`Sessions`,searchPlaceholder:`Search session titles…`,time:`Time`,time24h:`Last 24 hours`,time7d:`Last 7 days`,time30d:`Last 30 days`,timeAll:`All time`,everyone:`Everyone`,peopleButtonLabel:`Filter sessions by person`,lastActive:`· {time}`,unresolvedIdentities:`Unresolved identities`,clearPersonFilter:`Clear person filter`,sessions:`Sessions`,showing:`Showing {shown} of {total}`,today:`Today`,yesterday:`Yesterday`,unknownDate:`Unknown date`,noSessions:`No sessions match these filters.`,automationGroup:`{count} automation sessions`,automation:`Automation`,inspectRun:`Inspect run`,backToSessions:`Back to sessions`,channelLabel:`Channel: {value}`,agentLabel:`Agent: {value}`,online:`Online`,idle:`Idle`,offline:`Offline`,unknownDevice:`Unknown device`,lastInput:`Last input {time} ago`,viewingNow:`Viewing now`,notViewing:`Not viewing a session right now.`,notFoundTitle:`Person not found`,notFoundDescription:`No online presence or visible session association matches this identity.`},profilePage:{offline:`Connect to the gateway to meet your agent.`,usageStatistics:`Usage statistics`,usageStatisticsDescription:`View activity, costs, and usage trends.`,identity:{title:`Identity`,menuLabel:`Identity menu`,menuButtonLabel:`Identity and app menu for {name}`,description:`Your profile on this gateway.`,loading:`Loading your identity…`,profileUnavailable:`Your identity profile could not be loaded.`,writeRequired:`Profile editing requires operator.write access.`,notSet:`Identity is not set.`,setIdentity:`Set identity`,avatar:`Avatar`,avatarDescription:`PNG, JPEG, or WebP. Images are resized to 256 × 256 or smaller.`,chooseAvatar:`Choose image`,processingAvatar:`Processing…`,displayName:`Display name`,displayNameDescription:`Shown to other people using this gateway.`,linkedEmails:`Linked emails`,linkedEmailsDescription:`Email addresses connected to this profile.`,githubAccount:`GitHub account`,githubAccountDescription:`Automatically verified from your GitHub-backed sign-in.`,githubVerified:`Verified from your GitHub-backed sign-in`,githubUnavailable:`Unavailable`,githubUnavailableDescription:`GitHub-backed sign-in is unavailable. Refresh to retry.`,gitCoauthor:`Git co-author credit`,gitCoauthorDescription:`Adds this account's public GitHub noreply address to commits created from shared sessions. Turning it off affects future commits only.`,gitCoauthorUnavailable:`Available after your GitHub-backed sign-in is verified. Refresh to retry.`,avatarErrors:{invalid:`That image could not be processed.`,sourceTooLarge:`Choose an image that is 10 MB or smaller.`,tooLarge:`The processed avatar is larger than 512 KB.`}}},tasksPage:{active:`Active`,activeSub:`Queued and running background work.`,recent:`Recent`,recentSub:`Latest completed, failed, and cancelled tasks.`,loading:`Loading tasks…`,empty:`No background tasks yet.`,emptyActive:`No queued or running tasks.`,emptyRecent:`No recent completed tasks.`,disconnected:`Connect to the gateway to load and manage tasks.`,loadFailed:`Could not load tasks.`,cancelFailed:`Could not cancel the task.`,recoveryFailed:`Could not update completion delivery.`,invalidResponse:`The gateway returned an invalid task list.`,untitled:`Background task`,taskCount:`{count} tasks`,taskCountOne:`1 task`,agent:`Agent: {agent}`,openSession:`Open session`,cancelTask:`Cancel {title}`,cancelling:`Cancelling…`,retryDelivery:`Retry delivery`,dismissDelivery:`Dismiss delivery`,copyResult:`Copy result`,deliveryBlocked:`Completed, but result delivery is blocked.`,deliveryDismissed:`Completed; result delivery was dismissed.`,duplicateRisk:`Retrying may duplicate a result after an ambiguous acknowledgement.`,status:{queued:`Queued`,running:`Running`,completed:`Completed`,failed:`Failed`,cancelled:`Cancelled`,timedOut:`Timed out`},runtime:{subagent:`Subagent`,cron:`Automation`,acp:`ACP`,cli:`CLI`,unknown:`Task`}},skillWorkshop:{title:`Skill Workshop`,header:{useCurrentChat:`Use current chat`,useCurrentChatAria:`Use current chat for revision requests`,useCurrentChatTooltip:`Send revision requests to the current chat session instead of the proposal's workshop session.`,selfLearning:`Self-learning`,selfLearningAria:`Toggle autonomous self-learning`,selfLearningTooltip:`Capture corrections and review substantial completed work as reusable skills. The default automatic mode applies scanner-approved captures and shows them on this board.`,view:`Workshop view`,board:`Board`,today:`Today`},status:{all:`All`,pending:`Pending`,applied:`Applied`,rejected:`Rejected`,quarantined:`Quarantined`,stale:`Stale`},recency:{today:`Today`,yesterday:`Yesterday`,earlier:`Earlier this week`},diff:{changes:`Changes`,fullBody:`Full body`,viewLabel:`Revision view`,unchanged:`This revision left the skill body unchanged.`,loadingPrevious:`Loading the previous revision…`,previousUnavailable:`The previous revision is unavailable, so this is the full body.`,tooLarge:`This comparison is too large to show here. Switch to Full body to read it.`,truncated:`This comparison is truncated. Changes and statistics may be incomplete. Switch to Full body to review the complete revision.`},applied:{history:`History`,revision:`{count} revision`,revisions:`{count} revisions`,create:`Create`,update:`Update`,version:`v{version}`},previewContext:`in {slug}`,actions:{close:`Close`,cancel:`Cancel`,previous:`Previous`,next:`Next`,apply:`Apply`,applying:`Applying…`,evaluate:`Evaluate`,evaluating:`Evaluating…`,evaluated:`Evaluated`,revise:`Revise`,tweak:`Tweak`,opening:`Opening…`,reject:`Reject`,rejecting:`Rejecting…`,sending:`Sending…`},notices:{applied:`Applied`,proposalChanged:`Proposal changed. Review the updated draft before choosing another action.`,rejected:`Rejected`,revisionRequested:`Revision requested`},revision:{title:`{verb} proposal`,description:`Tell the agent what should change. The proposal stays pending and the workshop will create a revised version.`,placeholder:`Example: Make this use Gmail labels instead of unread search, and add a safer dry-run step.`,preparing:`Waiting for chat admission`,notAdmitted:`Revision request was not admitted. Your instructions are still available; review the error and retry. {error}`,send:`Send revision`},queue:{resize:`Resize proposal list`,search:`Search proposals…`,loadError:`Could not load proposals.`,loading:`Loading proposals…`,noStatus:`No {status} proposals.`,noMatch:`No proposals match the current filter.`},detail:{edited:`Edited {time}`,created:`Created {time}`,supportFiles:`{count} support files`,noSupportFiles:`0 support files`,loading:`Loading proposal…`,supportFilesTitle:`Support files`,clickToPreview:`· click to preview`},evaluation:{title:`Evaluation`,version:`Proposal {version}`,completedAt:`Completed {time}`,status:{completed:`Completed`,skipped:`Skipped`,error:`Error`},decision:{pass:`Pass`,revise:`Revise`,block:`Block`},severity:{info:`Info`,warn:`Warning`,critical:`Critical`},evaluatorVersion:`Evaluator {version}`,mode:`Mode {mode}`,findings:`Findings`,metrics:`Metrics`,fileLine:`{file}:{line}`,errors:{revisionHashUnavailable:`The current proposal revision could not be identified.`,revisionChanged:`The proposal revision changed during evaluation.`}},empty:{searchTitle:`No matching proposals`,searchBody:`Clear the search or try a different keyword.`,pendingTitle:`No pending proposals`,pendingBody:`New drafts will appear here when they need review.`,appliedTitle:`Nothing applied yet`,appliedBody:`Use a pending proposal and it will appear here as a live skill.`,rejectedTitle:`No rejected proposals`,rejectedBody:`Skipped proposals will stay here for a clean review history.`,quarantinedTitle:`Nothing quarantined`,quarantinedBody:`Scanner-blocked or safety-held proposals will appear here.`,staleTitle:`No stale proposals`,staleBody:`Proposals that can no longer apply cleanly will appear here.`,allTitle:`No proposals here`,allBody:`Skill Workshop proposals will appear here when your agent drafts them.`,defaultAgent:`Your agent`,noProposalsAria:`No Skill Workshop proposals`,noProposalsTitle:`No proposals yet`,noProposalsBody:`{agent} hasn't drafted any skill proposals.`,noProposalsFooter:`New proposals will appear here for review.`},selfLearning:{pitchTitle:`Turn on self-learning`,pitchBody:`OpenClaw reviews corrections and substantial completed runs, then applies scanner-approved skills and shows them on this board. Experience review spends extra background tokens.`,enable:`Enable self-learning`,enabling:`Enabling…`,updateError:`Could not update the self-learning setting.`},history:{eyebrow:`Past work`,title:`Find reusable workflows`,body:`Review substantial sessions from newest to oldest. Only strong recovery patterns or workflows that save repeated tool calls become pending proposals.`,findIdeas:`Find skill ideas`,scanEarlier:`Scan earlier work`,scanNew:`Scan new work`,scanning:`Reviewing sessions…`,loading:`Loading history…`,pendingOnly:`Pending proposals only · uses your configured model`,reviewed:`{count} sessions reviewed`,found:`{count} ideas found`,noSessions:`No substantial sessions found in this window.`,today:`today`},today:{emptyTitle:`Nothing waiting today`,emptyBody:`Your agent hasn't drafted anything new. Switch to Board to browse history.`,new:`NEW`,waiting:`WAITING`,reviewed:`REVIEWED`,agent:`agent`,proposalsWaiting:`{count} proposals waiting`,browseApplied:`Browse what's already applied.`,progress:`{current} of {total}`,draftedBy:`Drafted by`,supportFile:`{count} support file`,supportFiles:`{count} support files`,comeWithIt:`come with it.`,useIt:`Use it`,addToSkills:`Add to your skills`,evaluate:`Evaluate`,runChecks:`Run proposal checks`,tweakIt:`Tweak it`,askAgent:`Ask the agent to change something`,skipping:`Skipping…`,skip:`Skip`,notForMe:`Not for me`,upNext:`Up next · {count} more waiting`,seeAll:`See all proposals →`,collection:`Your collection · {count} in use`,manage:`Manage →`,workflowHeading:`How the agent will use it`,applicabilityHeading:`When the agent should use it`}},activity:{status:{done:`Done`}},gatewayLogs:{title:`Logs`,subtitle:`Gateway file logs (JSONL).`,exportButton:`Export {label}`,exportLabels:{filtered:`filtered`,visible:`visible`},filter:`Filter`,searchPlaceholder:`Search logs`,autoFollow:`Auto-follow`,file:`File: {file}`,truncated:`Log output truncated; showing latest chunk.`,empty:`No log entries.`},pluginTabs:{unavailableTitle:`Plugin panel unavailable`,unavailableSubtitle:`The plugin that owns this tab is not active on the connected gateway, or it did not provide a panel.`},logbook:{nav:{previousDay:`Previous day`,nextDay:`Next day`,today:`Today`},status:{capturing:`Capturing every {seconds}s`,paused:`Capture paused`,disabled:`Capture off`,nodeHelp:`Device providing screen snapshots.`,pending:`{count} frames queued`,pendingHelp:`Snapshots waiting for the next analysis batch.`,analyzing:`Analyzing…`,captureError:`Capture error`,batchError:`Analysis error`,modelMissing:`No vision model`,modelMissingHelp:`Set plugins.entries.logbook.config.visionModel (for example codex/gpt-5.6-sol) or configure tools.media models.`},actions:{pause:`Pause`,resume:`Resume`,analyzeNow:`Analyze now`},empty:{title:`Nothing on the timeline yet.`,subtitle:`Logbook is collecting snapshots; cards appear after the first analysis batch completes.`},card:{keyframeAlt:`Screen snapshot from this activity`,distractions:`Distractions`},stats:{title:`Day at a glance`,focus:`{pct}% focus`,tracked:`{duration} tracked`},standup:{title:`Daily standup`,generate:`Generate`,refresh:`Regenerate`,empty:`Turn today's timeline into a ready-to-paste standup update.`},ask:{title:`Ask your day`,placeholder:`When did I review the gateway PR?`,submit:`Ask`}},board:{label:`Session dashboard`,tabsLabel:`Dashboard tabs`,moreTabs:`More dashboard tabs`,gridLabel:`Dashboard widgets`,emptyTitle:`A clear board, ready for work`,emptyHint:`Your agent can pin widgets here — try asking for a status card.`,actionFailed:`The dashboard change could not be saved.`,actionInProgress:`Another dashboard change is still being saved.`,announcement:{moved:`Moved {title}.`,resized:`Resized {title}.`,removed:`Removed {title}.`,granted:`Widget access allowed.`,rejected:`Widget access rejected.`},widget:{cellLabel:`Dashboard widget: {title}. Use arrow keys to navigate. Hold Alt and press an arrow key to move it.`,moveHandle:`Move {title}`,resizeHandle:`Resize {title}`,menuLabel:`Widget options`,moveToTab:`Move to tab`,noOtherTabs:`No other tabs`,resize:`Resize`,autoHeight:`Auto height`,remove:`Remove`,needsApproval:`Needs approval`,needsApprovalDetail:`This widget requested additional access.`,networkAccess:`Network origins`,hostTools:`Host tools and data`,activeCapabilities:`Active widget capabilities`,networkCapability:`Network: {capability}`,toolCapability:`Tool: {capability}`,granted:`Granted`,allow:`Allow`,allowFailed:`Could not allow widget access. Try again.`,reject:`Reject`,rejectFailed:`Could not reject widget access. Try again.`,rejected:`Access rejected`,rejectedDetail:`This widget stays inactive until it is removed or replaced.`,appLoading:`Restoring app…`,appStaleTitle:`This pinned app is stale`,appStaleDetail:`Its server, resource, or originating transcript is no longer available.`,retry:`Retry`,frameResolverMissing:`Widget content is unavailable.`,sandboxUnavailable:`Widget sandbox host is unavailable.`,frameAuthorizationFailed:`Widget authorization failed after repeated refresh attempts.`,sandboxOriginRequired:`Widget authorization failed after repeated refresh attempts. If the gateway runs behind a reverse proxy or tunnel that does not route the widget sandbox port, set mcp.apps.sandboxOrigin to a dedicated public origin routed to the sandbox listener.`,errorTitle:`This widget could not load`,errorDetail:`The problem is contained to this card.`,actionErrorTitle:`Widget change failed`,actionErrorDetail:`The dashboard kept the previous widget state.`,errorShow:`Show details`,kindMcp:`MCP`,kindHtml:`HTML`,kindPlugin:`Plugin`,pluginLoading:`Loading plugin widget…`,disabledPlugin:`Widget from disabled plugin {pluginId}`}},workboard:{widget:{boardLabel:`Workboard board`,cardLabel:`Workboard card`,summaryLabel:`Workboard summary`,loading:`Loading Workboard…`,cardIdRequired:`This widget needs a cardId prop.`,cardMissing:`This Workboard card is no longer available.`,unassigned:`Unassigned`,openBoard:`Open board`,statusCounts:`Cards by status`,cardCount:`{count} cards`,noActiveCards:`No ready or running cards.`},disabledHelpStart:`Workboard is disabled. Enable`,enableConfigKey:`plugins.entries.workboard.enabled = true`,disabledHelpEnd:`, then reload this tab.`,status:{triage:`Triage`,backlog:`Backlog`,todo:`Todo`,scheduled:`Scheduled`,ready:`Ready`,running:`Running`,review:`Review`,blocked:`Blocked`,done:`Done`},noLinkedSession:`No linked session`,stopSession:`Stop session`,editCard:`Edit card`,editCardHelp:`Update queue metadata and session handoff.`,newCard:`New card`,newCardHelp:`Queue work for an agent session.`,archiveCard:`Archive card`,unarchiveCard:`Restore from archive`,archived:`Archived`,deleteCard:`Delete card`,viewDetails:`View details`,detailTitle:`Card details`,detailTask:`Gateway task`,detailRun:`Run`,detailUpdated:`Updated`,detailProof:`Proof`,detailDiagnostics:`Diagnostics`,detailWorkerLogs:`Worker logs`,detailWorkerProtocol:`Worker protocol`,detailAutomation:`Automation`,detailUpdatedValue:`Updated: {time}`,detailAutomationTenant:`Tenant: {tenant}`,detailAutomationBoard:`Board: {board}`,detailAutomationSkills:`Skills: {skills}`,detailAutomationWorkspace:`Workspace: {workspace}`,detailAutomationSummary:`Summary: {summary}`,detailOperatorNotes:`Operator notes`,detailNoNotes:`No operator notes yet.`,detailNotePlaceholder:`Add a decision, blocker, or proof note...`,detailAddNote:`Add note`,dashboardTitle:`Dashboard`,dashboardEmpty:`No dashboard yet — the working agent can pin widgets.`,openSession:`Open session`,defaultAgent:`Default agent`,allAgents:`All agents`,agentFilter:`Filter by agent`,allBoards:`All boards`,boardFilter:`Filter by board`,defaultBoard:`Default board`,automationAttached:`Automation`,automationAttachedTitle:`Open Automations`,boardFilterSummary:`{active} active · {total} total`,boardFilterArchivedSummary:`Archived · {active} active · {total} total`,agentFilterUnassigned:`Unassigned (uses {agent})`,agentFilterUnassignedHelp:`Cards without an explicit agent.`,agentFilterConfiguredDefault:`{agent} (default)`,agentFilterConfiguredDefaultHelp:`Cards explicitly assigned to the configured default agent.`,agentCurrentUnconfigured:`{agent} (not configured)`,viewPreset:`Workboard view`,viewAll:`All cards`,viewDefaultAgent:`Default agent`,viewReady:`Ready`,viewRunning:`Running`,viewBlocked:`Blocked`,viewReview:`Review`,viewStale:`Stale`,viewMissingProof:`Missing proof`,viewRecentlyDone:`Recently done`,viewPresetCount:`{count} cards`,agentLinked:`Linked to {agent}`,agentDefaultLinked:`Using default agent {agent}`,engineOpenAI:`OpenAI`,engineClaude:`Claude`,engineDisabledRuntime:`{agent} uses the {runtime} ACP runtime. Use default start for that session.`,runEngine:`Run {engine}`,openEngine:`Open {engine}`,runDefaultAgent:`Run default agent`,run:`Run`,open:`Open`,start:`Start`,dependencies:`Dependencies`,dependenciesReady:`{count} ready`,dependenciesReadyTitle:`{count} dependencies are done.`,dependenciesBlocked:`{count} blocked`,dependenciesBlockedTitle:`Waiting on dependencies: {parents}.`,dependencyMissing:`{parent} (missing)`,dependencyStatusMissing:`Missing`,unknownStatus:`Unknown`,showArchivedShort:`Archived`,hideArchivedShort:`Hide archived`,layout:`Card layout`,layoutCompact:`Compact card density`,layoutComfortable:`Comfortable card density`,dispatch:`Dispatch ready work`,dispatchSummary:`Dispatch complete: started {started}, promoted {promoted}, blocked {blocked}, reclaimed {reclaimed}, orchestrated {orchestrated}, failures {failures}.`,dispatchSummaryEmpty:`Dispatch complete: no ready work changed.`,lastRefreshed:`Updated {time}`,refreshError:`Refresh failed`,healthLabel:`Workboard health`,healthRunning:`running`,healthBlocked:`blocked`,healthStale:`stale`,healthReadyUnassigned:`ready unassigned`,healthMissingProof:`missing proof`,healthFailedAttempts:`failed attempts`,live:`live`,fieldTitle:`Title`,fieldNotes:`Notes`,fieldStatus:`Status`,fieldPriority:`Priority`,fieldAgent:`Agent`,fieldSession:`Session`,fieldLabels:`Labels`,templatesLabel:`Card templates`,template:{bugfix:`Bugfix`,docs:`Docs`,release:`Release`,pr_review:`PR review`,plugin:`Plugin`},templateDraft:{bugfixTitle:`Fix: `,bugfixNotes:`Symptom:
Cause:
Acceptance:
Proof:`,docsTitle:`Docs: `,docsNotes:`Page:
Change:
Source proof:`,releaseTitle:`Release: `,releaseNotes:`Scope:
Verification:
Closeout:`,prReviewTitle:`Review PR `,prReviewNotes:`Surface:
Risks:
Proof:`,pluginTitle:`Plugin: `,pluginNotes:`Boundary:
Config/docs:
Tests:`},badgeAttempts:`{count} attempts`,badgeFailures:`{count} failed`,badgeComments:`{count} comments`,badgeLinks:`{count} links`,badgeProof:`{count} proof`,badgeHeartbeat:`heartbeat {age}`,badgeArtifacts:`{count} artifacts`,badgeAttachments:`{count} attachments`,badgeDispatches:`{count} dispatches`,badgeTaskLinked:`task linked`,badgeClaimed:`claimed by {owner}`,badgeStale:`stale`,titlePlaceholder:`Card title`,notesPlaceholder:`Notes, acceptance criteria, links`,labelsPlaceholder:`ui, docs`,searchPlaceholder:`Search cards`,allPriorities:`All priorities`,emptyColumns:`Empty columns`,showEmptyColumns:`Show all`,collapseEmptyColumns:`Collapse empty`,hideEmptyColumns:`Hide empty`,collapseColumn:`Collapse {column} column`,expandColumn:`Expand {column} column`,emptyColumn:`Drop work here`,emptyFilteredTitle:`No cards match this view`,emptyFilteredHint:`Change the view, search, priority, agent, or archive filter.`,lifecycleUnlinked:`No session`,lifecycleUnlinkedDetail:`Start or link a session`,lifecycleMissing:`Session missing`,lifecycleMissingDetail:`Reload sessions or relink this card`,lifecycleLinked:`Linked`,lifecycleIdleDetail:`No active run`,lifecycleRunning:`Running`,lifecycleRunningDetail:`Active run in progress`,lifecycleStale:`Stale`,lifecycleStaleDetail:`No recent session activity`,lifecycleDone:`Done`,lifecycleDoneDetail:`Moved to review`,lifecycleNeedsReview:`Needs review`,lifecycleNeedsReviewDetail:`Run stopped or failed`,taskStatus:{queued:`Task queued`,running:`Task running`,completed:`Task complete`,failed:`Task failed`,cancelled:`Task cancelled`,timed_out:`Task timed out`},eventsLabel:`Card events`,eventCreated:`Created`,eventEdited:`Edited`,eventMoved:`Moved`,eventMovedTo:`Moved to {status}`,eventLinked:`Linked session`,eventSpecified:`Specified`,eventDecomposed:`Decomposed`,eventClaimed:`Claimed`,eventHeartbeat:`Heartbeat`,eventExecutionUpdated:`Agent updated`,eventAttemptStarted:`Attempt started`,eventAttemptUpdated:`Attempt updated`,eventCommentAdded:`Comment added`,eventLinkAdded:`Link added`,eventProofAdded:`Proof added`,eventArtifactAdded:`Artifact added`,eventAttachmentAdded:`Attachment added`,eventDiagnostic:`Diagnostic`,eventNotification:`Notification`,eventDispatch:`Dispatch`,eventOrchestration:`Orchestration`,eventProtocolViolation:`Protocol violation`,eventArchived:`Archived`,eventUnarchived:`Unarchived`,eventStale:`Stale session`},connection:{disconnectedTitle:`Disconnected`,queuedCount:`{count} queued`,reconnecting:`Reconnecting…`,restarting:`Restarting…`,retryNow:`Retry now`,actionsUnavailable:`Actions are unavailable while the Gateway reconnects.`,settingsChangesUnavailable:`Changes to settings are disabled while the Gateway is reconnecting.`,sessionOperationCompletedPreviousConnection:`The session operation completed on the previous connection. Check the current session list before continuing.`,sessionOperationCompletedPreviousConnectionWithRefreshError:`The session operation completed on the previous connection, but refreshing the current session list failed: {error}`,scopeUpgrade:{limited:`This browser has limited access.`,guidance:`This browser has limited access. Manage it with openclaw devices on the Gateway or from Devices on an admin browser.`,status:`Limited access`,inboxState:`Administrator access required`,showDetails:`Show limited access details`,closeDetails:`Close limited access details`,request:`Request admin`,requesting:`Requesting administrator access…`,requestingAction:`Requesting…`,pending:`Approve this browser by running openclaw devices on the Gateway or from Devices on an admin browser. Retry reattaches to the request; Cancel stops waiting.`,retry:`Retry`,cancel:`Cancel`,rejected:`The administrator access request was rejected.`,expired:`The administrator access request expired.`,error:`Administrator access request failed: {error}`},access:{title:`Gateway Access`,subtitle:`Where the dashboard connects and how it authenticates.`,wsUrl:`WebSocket URL`,token:`Gateway Token`,password:`Password (not stored)`,passwordPlaceholder:`system or shared password`,sessionKey:`Default Session Key`,connectHint:`Click Connect to apply connection changes.`,trustedProxy:`Authenticated via trusted proxy.`,showToken:`Show token`,hideToken:`Hide token`,toggleTokenVisibility:`Toggle token visibility`,showPassword:`Show password`,hidePassword:`Hide password`,togglePasswordVisibility:`Toggle password visibility`},snapshot:{title:`Snapshot`,subtitle:`Latest gateway handshake information.`,status:`Status`,tickInterval:`Tick Interval`,lastChannelsRefresh:`Last Channels Refresh`,lastError:`Last error`},help:{title:`How to connect`,step1:`Start the gateway on your host machine:`,step2:`Get a tokenized dashboard URL:`,step3:`Paste the WebSocket URL and token above, or open the tokenized URL directly.`,docsLink:`Read the docs →`,copyCommand:`Copy command`,copyCommandAria:`Copy command: {command}`}},attention:{custodianAlertAria:`Ask OpenClaw, {count} undismissed alert`,custodianAlertsAria:`Ask OpenClaw, {count} undismissed alerts`,cronErrorUnknown:`Unknown error`,cronFailed:`{job} failed`,cronOverdue:`{job} overdue`,automationFailed:`Failed · {time}`,automationOverdue:`Overdue · {time}`,failed:`Failed`,overdue:`Overdue`,dismissItem:`Dismiss {item}`,dismissShown:`Dismiss shown`,emptyTitle:`Nothing waiting`,emptyBody:`New requests and alerts land here.`,issues:`Inbox`,issueCount:`{count} inbox item`,issueCountPlural:`{count} inbox items`,tabs:{label:`Inbox categories`,all:`All`,approvals:`Approvals`,automations:`Automations`,system:`System`},modelAuthExpired:`Model auth expired: {providers}`,authExpired:`Auth expired`,modelAuthExpiredState:`Auth expired · {time}`,modelAuthExpiredWithScope:`{scope} · Auth expired · {time}`,reconnect:`Reconnect`,pendingApproval:`{count} pending approval`,pendingApprovals:`{count} pending approvals`,alerts:{updateQuestion:`These are the available update facts:
{facts}
Summarize what is new and whether anything needs my attention before updating.`,cronFailedQuestion:`These automations failed:
{facts}
Explain why they failed and how to fix them.`,cronOverdueFact:`{job}: {duration} late`,cronOverdueQuestion:`These automations are overdue:
{facts}
Explain why they have not run and how to fix them.`,modelAuthExpiredQuestion:`These model-provider credentials need attention:
{facts}
Explain what expired and how to re-authenticate them.`}},standingGrants:{title:`Standing grants`,description:`Allow-always on an automation approval mints a standing grant for that exact command. Revoking one makes the next occurrence ask again.`,historyTitle:`Approval history`,empty:`No standing grants. Answer an automation approval with Always allow to mint one.`,stateUntilRevoked:`Until revoked`,stateExpiresIn:`Expires in {count}d`,stateExpired:`Expired`,stateRevoked:`Revoked`,revoke:`Revoke`,revoking:`Revoking…`,columns:{automation:`Automation`,command:`Command`,uses:`Uses`,state:`State`}},approvalHistory:{description:`Terminal exec, plugin, and system-agent approvals recorded by this gateway, newest first.`,loading:`Loading approval history…`,loadingMore:`Loading…`,loadMore:`Load more`,empty:`No resolved approvals in the rolling 30-day window.`,retention:`Approval history is a rolling 30-day window.`,offline:`Connect to the gateway to load approval history.`,invalidResponse:`The gateway returned an invalid approval history response.`,unknown:`Unknown`,notApplicable:`N/A`,columns:{resolved:`Resolved`,kind:`Kind`,request:`Request`,decision:`Decision`,reason:`Resolution reason`,source:`Source agent / session`,resolver:`Resolver`},kinds:{exec:`Exec`,plugin:`Plugin`,systemAgent:`System agent`},statuses:{allowed:`Allowed`,denied:`Denied`,expired:`Expired`,cancelled:`Cancelled`},decisions:{allowOnce:`Allow once`,allowAlways:`Always allow`,deny:`Deny`},reasons:{user:`User decision`,timeout:`Timed out`,malformedVerdict:`Malformed verdict`,noRoute:`No route`,runAborted:`Run aborted`,gatewayRestart:`Gateway restart`,storageCorrupt:`Storage corrupt`}},palette:{placeholder:`Search chats and commands…`,noResults:`No results`,searchFailed:`Chat search failed — check the gateway logs and retry`,searchPartial:`Transcript search unavailable — showing chat titles and metadata`,searchIncomplete:`Transcript matches may be incomplete — indexing or search limits apply`,categories:{search:`Search`,navigation:`Navigation`,skills:`Skills`},items:{apps:`Apps`,sessions:`Sessions`,scheduled:`Automations`,skills:`Skills`,plugins:`Plugins`,settings:`Settings`,agents:`Agents`,desktop:`Desktop`},descriptions:{verboseMode:`Toggle verbose mode.`},footer:{navigate:`navigate`,select:`select`,close:`close`}},dreaming:{tabs:{scene:`Scene`,diary:`Diary`,advanced:`Advanced`},header:{refresh:`Refresh`,refreshing:`Refreshing…`,on:`Dreaming On`,off:`Dreaming Off`,engineOff:`Memory engine is Off. Choose an engine in Settings to enable dreaming.`},toggleConfirmation:{subtitle:`Dreaming is a global setting; it is not scoped to this agent.`,enableTitle:`Turn On Dreaming for All Agents`,enableDetail:`The nightly dreaming sweep will run across every configured agent workspace, promoting short-term recalls into long-term memory. This applies right away.`,enableConfirm:`Turn On Dreaming`,disableTitle:`Turn Off Dreaming for All Agents`,disableDetail:`The nightly dreaming sweep will stop for every configured agent, not just this one. Memories already written stay; nothing new gets promoted. This applies right away.`,disableConfirm:`Turn Off Dreaming`,saving:`Saving…`,failed:`Could not apply change. Check your connection and try again.`},status:{active:`Dreaming Active`,idle:`Dreaming Idle`,promotedSuffix:`promoted`,nextSweepPrefix:`next sweep`},scene:{backfill:`Backfill`,dedupeDiary:`Dedupe Diary`,reset:`Reset`,clearGrounded:`Clear Replayed`,repairCache:`Repair Dream Cache`,working:`Working…`},phase:{light:`Light`,deep:`Deep`,rem:`Rem`,off:`off`},advanced:{eyebrow:`Review`,title:`Daily Log Review`,description:`Review what came from the daily log, what is waiting for promotion, and what was promoted recently.`,summaryFromDailyLog:`from daily log`,summaryWaiting:`waiting`,summaryPromotedToday:`promoted today`,stagedTitle:`From the Daily Log`,stagedDescription:`Replay candidates pulled from older daily log entries.`,shortTermTitle:`Waiting for Promotion`,shortTermDescription:`Current short-term candidates waiting to graduate into real memory.`,sortRecent:`Most recent`,sortSignals:`Strongest support`,originDailyLog:`replayed`,originLive:`live`,originMixed:`mixed`,promotedTitle:`Recent Promotions`,promotedDescription:`Items that already made it through promotion.`,emptyGrounded:`No staged grounded replay entries right now.`,emptyShortTerm:`No short-term entries to inspect.`,emptyPromoted:`No recent promotions to inspect.`,updatedPrefix:`updated`},stats:{grounded:`Grounded`,signals:`Signals`},diary:{title:`Dream Diary`,noDreamsYet:`No dreams yet`,noDreamsHint:`Dreams will appear here after the first dreaming cycle runs.`,waitingTitle:`The diary is waiting`,waitingHint:`Narrative entries will appear after the next dreaming cycle.`,reload:`Reload`,reloading:`Reloading…`},actions:{dedupeRemovedOneAndKept:`Removed {removed} duplicate dream entry and kept {kept}.`,dedupeRemovedManyAndKept:`Removed {removed} duplicate dream entries and kept {kept}.`,dedupeRemovedOne:`Removed {removed} duplicate dream entry.`,dedupeRemovedMany:`Removed {removed} duplicate dream entries.`,repairArchivedThreadCorpus:`archived session corpus`,repairArchivedIngestionState:`archived ingestion state`,repairArchivedDreamDiary:`archived dream diary`,repairNoChanges:`Dream cache repair finished with no changes.`,repairCompleteWithArchive:`Dream cache repair complete: {actions}. Archive: {archiveDir}`,repairComplete:`Dream cache repair complete: {actions}.`,backfillComplete:`Backfilled {count} dream diary entries.`,resetDiaryComplete:`Removed {count} backfilled dream diary entries.`,clearReplayedComplete:`Cleared {count} replayed short-term entries.`,complete:`Dream diary action complete.`,confirmRepairDescription:`This archives derived dream cache files and rebuilds them from clean inputs. Your dream diary stays untouched.`,confirmDedupeDescription:`This rewrites DREAMS.md and removes only exact duplicate diary entries.`,archivePathCopied:`Archive path copied.`,archivePathCopyFailed:`Could not copy archive path.`,updateFailed:`Could not update dreaming settings.`,unsupportedPlugin:`Selected memory plugin "{pluginId}" does not support dreaming settings.`,configHashMissing:`Config hash missing; refresh and retry.`},wiki:{previewFallbackTitle:`Wiki page`,close:`Close`,loadingPage:`Loading wiki page…`,dreamsTab:`Dreams`,insightsTab:`Imported Insights`,wikiTab:`Memory Wiki`,dreamsExplainer:`This is the raw dream diary the system writes while replaying and consolidating memory; use it to inspect what the memory system is noticing, and where it still looks noisy or thin.`,insightsExplainer:`These are imported insights clustered from external history; use them to review what imports surfaced before any of it graduates into durable memory.`,wikiExplainer:`This is the compiled memory wiki surface the system can search and reason over; use it to inspect actual memory pages, claims, open questions, and contradictions rather than raw imported source chats.`,copyArchivePath:`Copy archive path`,loadingInsights:`Loading imported insights…`,noInsights:`No imported insights yet`,noInsightsHint:`Run a ChatGPT import with apply to surface clustered imported insights here.`,candidateSignals:`Potentially useful signals`,corrections:`Corrections or revisions`,importDetails:`Import details`,startedWith:`Started with:`,endedOn:`Ended on:`,messages:`Messages:`,riskReasons:`Risk reasons:`,labels:`Labels:`,openSourcePage:`Open source page`,loadingWiki:`Loading memory wiki…`,emptyWiki:`Memory wiki is not populated yet`,emptyWikiHint:`Right now the wiki mostly has raw source imports and operational reports. This tab becomes useful once syntheses, entities, or concepts start getting written.`,claims:`Claims`,openQuestions:`Open questions`,contradictions:`Contradictions`,pageDetails:`Page details`,wikiPage:`Wiki page:`,id:`Id:`,openWikiPage:`Open wiki page`,unavailable:`Memory Wiki is not enabled`,unavailablePluginPrefix:`Imported Insights and Memory Wiki are provided by the bundled`,unavailablePluginSuffix:`plugin.`,enablePrefix:`Enable`,enableSuffix:`, then reload this tab.`,openConfig:`Open Config`,howToEnable:`How to enable`,pageTypes:{entity:`entity`,concept:`concept`,source:`source`,synthesis:`synthesis`,report:`report`},pageGroups:{sources:`Sources`,syntheses:`Syntheses`,reports:`Reports`,entities:`Entities`,concepts:`Concepts`},counts:{pageOne:`{count} page`,pages:`{count} pages`,claimRowOne:`{count} claim row`,claimRows:`{count} claim rows`,openQuestionOne:`{count} open question`,openQuestions:`{count} open questions`,contradictionOne:`{count} contradiction`,contradictions:`{count} contradictions`,chats:`{count} chats`,sensitive:`{count} sensitive`,signals:`{count} signals`,messages:`{count} messages`,userMessages:`{count} user`,assistantMessages:`{count} assistant`},pageGroupSummary:`{label} · {count}`,noPagesYet:`No pages yet`,sectionPageSummary:`{label}: {count}`,questionCountOnPages:`{questionCount} on {pageCount}`,risk:{needsReview:`needs review`,low:`low risk`,medium:`medium risk`,high:`high risk`,unknown:`unknown risk`},pageNotFound:`No wiki page found for {lookup}.`,previewTruncated:`Showing the first chunk of this page.`,previewTruncatedWithTotal:`Showing the first chunk of this page ({count} total lines).`,boundedResults:`Showing the newest {returned} of {total} items.`,importedClusterSummary:`Imported chats clustered around {label}.`,withheldDigestOne:`{count} digest was withheld pending review.`,withheldDigests:`{count} digests were withheld pending review.`,details:`Details`,hideDetails:`Hide details`,vault:`Vault`,fullVaultBreakdown:`Full vault breakdown: {breakdown}.`,selectedSection:`Selected section: {summary}.`,latestUpdate:`Latest update {date}.`,noContent:`No wiki content available.`},phrases:{consolidatingMemories:`consolidating memories…`,tidyingKnowledgeGraph:`tidying the knowledge graph…`,replayingConversations:`replaying today's conversations…`,weavingShortTerm:`weaving short-term into long-term…`,defragmentingMemoryLane:`defragmenting memory lane…`,filingLooseThoughts:`filing away loose thoughts…`,connectingDots:`connecting distant dots…`,compostingContext:`composting old context windows…`,alphabetizingSubconscious:`alphabetizing the subconscious…`,promotingHunches:`promoting promising hunches…`,forgettingNoise:`forgetting what doesn't matter…`,dreamingEmbeddings:`dreaming in embeddings…`,reorganizingAttic:`reorganizing the memory attic…`,indexingDay:`softly indexing the day…`,nurturingInsights:`nurturing fledgling insights…`,simmeringIdeas:`simmering half-formed ideas…`,whisperingVectorStore:`whispering to the vector store…`}},modelProviders:{title:`Configured providers`,subtitle:`Model providers with auth, plan, quota, and cost data.`,updated:`Updated {time}`,refreshing:`Refreshing…`,disconnected:`Connect to the gateway to see configured model providers.`,emptyTitle:`No model providers configured`,emptySubtitle:`Sign in to a provider or add an API key, then refresh.`,status:{ok:`Signed in`,ready:`Ready`,expiring:`Expiring`,expired:`Expired`,missing:`Not signed in`,apiKey:`API key`,denied:`Credentials rejected`,configured:`Credentials configured`},expiresIn:`Credential expires in {time}`,models:`{count} models`,modelOne:`1 model`,modelsAvailable:`{available} of {count} models available`,globalUsage:`Global usage and cost`,noStats:`No live usage data reported by this provider.`,localCost:`Global session spend · {days}d`,localCostDetail:`{tokens} tokens · {sessions} sessions`,saving:`Saving…`,requestFailed:`Request failed.`,configUnavailable:`Configuration is unavailable. Refresh and try again.`,credentials:{label:`Credentials for {agent}`,oauth:`OAuth profiles: {count}`,tokenProfiles:`Token profiles: {count}`,configKey:`API key set in config`,envKey:`API key from environment`,envKeyNamed:`API key from environment ({name})`,profileKey:`API key profiles: {count}`,none:`Not configured`},apiKey:{label:`API key`,placeholder:`Enter provider API key`,replacePlaceholder:`Secret saved. Enter a new key to replace it.`,set:`Set API key`,replace:`Replace key`,remove:`Remove key`,saved:`Secret saved.`,removed:`API key removed.`,authModeBlocked:`API key changes are unavailable while auth mode is "{mode}".`},probe:{test:`Test connection`,testing:`Testing…`,unavailable:`Connection testing requires a newer gateway.`,latency:`{ms} ms`,status:{ok:`Connected`,auth:`Authentication failed`,rate_limit:`Rate limited`,billing:`Billing problem`,timeout:`Timed out`,format:`Invalid response`,unknown:`Connection failed`,no_model:`No models available`,partial:`Connected with warnings`}},readiness:{title:`AI setup`,heading:`Connect a verified AI model`,signedInNoModels:`You're signed in, but this account exposes no usable models. Choose another provider or account to continue.`,notConfigured:`Choose a provider and verify the model OpenClaw will use.`,noModels:`No models available`,modelRequired:`Model required`,chooseProvider:`Choose another provider`},logout:{action:`Log out`,confirm:`Log out of {provider}? Saved OAuth and token profiles will be removed.`,loggingOut:`Logging out…`,done:`Logged out.`},add:{title:`Add provider`,subtitle:`Choose a known model provider and save its API key.`,action:`Add provider`,none:`All known providers are already configured.`,provider:`Provider`,selectProvider:`Select a provider`,save:`Save provider`,saved:`Provider {provider} added.`},defaults:{title:`Default models`,subtitle:`Choose the primary, ordered fallbacks, and utility model.`,primary:`Default model`,utility:`Utility model`,utilityHelpLabel:`About the utility model`,utilityHelpPurpose:`Handles short background tasks such as generated titles, progress narration, and session summaries.`,utilityHelpAutomatic:`Automatic uses the primary model provider's recommended small model when available. Generated titles otherwise use the primary model.`,automatic:`Automatic (provider default)`,disabled:`Disabled`,fallbacks:`Fallbacks`,noFallbacks:`No fallback models configured.`,unsaved:`Unsaved changes`,addFallback:`Add fallback`,selectModel:`Select a model`,selectFallback:`Select a fallback model`,noModels:`Configure a provider before selecting default models.`,saved:`Default models saved.`},readOnly:{disconnected:`Connect to the gateway to change model settings.`,adminRequired:`Browsing only. Model changes require operator.admin access.`},notes:{saveKey:`Save API key for {provider} from Control UI`,removeKey:`Remove API key for {provider} from Control UI`,addProvider:`Add model provider {provider} from Control UI`,defaultModel:`Update default model selection from Control UI`}},usage:{common:{emptyValue:`—`,unknown:`unknown`},loading:{title:`Usage Overview`,badge:`Loading`},metrics:{tokens:`Tokens`,cost:`Cost`,session:`session`,sessions:`sessions`},heatmap:{title:`Token Activity`,subtitle:`Daily token intensity for the selected range, up to one year.`,cellTokens:`{tokens} tokens`,less:`Less`,more:`More`},providerUsage:{title:`Provider plans & billing`,subtitle:`Live plan, quota, balance, and budget data reported by configured providers.`,stalled:`Provider usage did not finish loading. Refresh to retry.`,unavailable:`Provider usage is unavailable; the last request failed. Refresh to retry.`,balance:`Balance`,spend:`Usage`,budget:`Budget`,today:`Today`,last7Days:`7 days`,lastDays:`{count} days`,dailyCost:`Daily provider cost`,requests:`{count} requests`,inputTokens:`{count} input`,cacheTokens:`{count} cache`,outputTokens:`{count} output`,topModels:`Top models`,costCategories:`Cost categories`,remaining:`{percent}% left`,resets:`Resets {date}`},presets:{today:`Today`,last7d:`7d`,last30d:`30d`,last90d:`90d`,last1y:`1y`,all:`All`},scope:{instance:`Current instance`,instanceHint:`Show only the active session id for each logical session.`,family:`Historical lineage`,familyHint:`Roll up known rotated transcript-backed session ids.`,familyIncluded:`Historical lineage includes {count} session instances.`},filters:{title:`Filters`,to:`to`,startDate:`Start date`,endDate:`End date`,timeZone:`Time zone`,timeZoneLocal:`Local`,timeZoneUtc:`UTC`,pin:`Pin`,pinned:`Pinned`,selectAll:`Select All`,clear:`Clear`,clearAll:`Clear All`,remove:`Remove filter`,removeDays:`Remove days filter`,removeHours:`Remove hours filter`,removeSession:`Remove session filter`,all:`All`,days:`Days`,hours:`Hours`,session:`Session`,agent:`Agent`,channel:`Channel`,provider:`Provider`,model:`Model`,tool:`Tool`,daysCount:`{count} days`,hoursCount:`{count} hours`,sessionsCount:`{count} sessions`},query:{placeholder:`Filter sessions (e.g. key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)`,apply:`Filter (client-side)`,matching:`{shown} of {total} sessions match`,inRange:`{total} sessions in range`,tip:`Tip: use filters or click bars to refine days.`},export:{label:`Export`,changed:`Session context changed while preparing the export. Refresh usage and try again.`,sessionsCsv:`Sessions CSV`,dailyCsv:`Daily CSV`,json:`JSON`},cacheStatus:{warning:`Usage data may be incomplete. Checking for updated totals automatically.`,paused:`Usage data may be incomplete. Automatic checks paused; select Refresh to check again.`},empty:{title:`Start with a date range`,subtitle:`Load usage data to compare costs, inspect sessions, and drill into timelines without leaving the dashboard.`,hint:`Select a date range and click Refresh to load usage.`,noData:`No data`,featureOverview:`Overview cards`,featureSessions:`Session ranking`,featureTimeline:`Timeline drilldown`},daily:{title:`Daily Usage`,total:`Total`,byType:`By Type`,tokensTitle:`Daily Token Usage`,costTitle:`Daily Cost`,compressedScaleHint:`Square-root scale keeps low-usage days visible.`},costWindows:{title:`Cost Windows`,subtitle:`Calendar windows ending {date}`,selectedRange:`Selected Range`,lastDays:`Last {count} days`,perDay:`/ day`},breakdown:{output:`Output`,input:`Input`,cacheWrite:`Cache Write`,cacheRead:`Cache Read`,total:`Total`,tokensByType:`Tokens by Type`,costByType:`Cost by Type`},overview:{title:`Usage Overview`,messages:`Messages`,messagesHint:`Total user and assistant messages in range.`,messagesAbbrev:`msgs`,user:`user`,assistant:`assistant`,toolCalls:`Tool Calls`,toolCallsHint:`Total tool call count across sessions.`,toolsUsed:`tools used`,errors:`Errors`,errorsHint:`Total message and tool errors in range.`,toolResults:`tool results`,avgTokens:`Avg Tokens / Msg`,avgTokensHint:`Average tokens per message in this range.`,avgCost:`Avg Cost / Msg`,avgCostHint:`Average cost per message when providers report costs.`,avgCostHintMissing:`Average cost per message when providers report costs. Cost data is missing for some or all sessions in this range.`,acrossMessages:`Across {count} messages`,sessions:`Sessions`,sessionsHint:`Distinct sessions in the range.`,sessionsInRange:`of {count} in range`,throughput:`Throughput`,throughputHint:`Throughput shows tokens per minute over active time. Higher is better.`,tokensPerMinute:`tok/min`,perMinute:`/ min`,errorRate:`Error Rate`,errorHint:`Error rate = errors / total messages. Lower is better.`,avgSession:`avg session`,cacheHitRate:`Cache Hit Rate`,cacheHint:`Cache hit rate = cache read / (input + cache read + cache write). Higher is better.`,cached:`cached`,prompt:`prompt`,calls:`calls`,costShare:`{percent}% of cost`,topModels:`Top Models`,topProviders:`Top Providers`,topTools:`Top Tools`,topAgents:`Top Agents`,topChannels:`Top Channels`,peakErrorDays:`Peak Error Days`,peakErrorHours:`Peak Error Hours`,noModelData:`No model data`,noProviderData:`No provider data`,noToolCalls:`No tool calls`,noAgentData:`No agent data`,noChannelData:`No channel data`,noErrorData:`No error data`},sessions:{title:`Sessions`,shown:`{count} shown`,total:`{count} total`,avg:`avg`,all:`All`,recent:`Recently viewed`,recentShort:`Recent`,sort:`Sort`,ascending:`Ascending`,descending:`Descending`,clearSelection:`Clear Selection`,noRecent:`No recent sessions`,noneInRange:`No sessions in range`,more:`+{count} more`,selected:`Selected ({count})`,copy:`Copy`,limitReached:`Showing first 1,000 sessions. Narrow date range for complete results.`},details:{noUsageData:`No usage data for this session.`,duration:`Duration`,modelMix:`Model Mix`,filtered:`(filtered)`,close:`Close session details`,noTimeline:`No timeline data`,loadFailed:`Could not load {detail}: {error}`,noDataInRange:`No data in range`,usageOverTime:`Usage Over Time`,reset:`Reset`,perTurn:`Per Turn`,cumulative:`Cumulative`,turnRange:`Turns {start}{end} of {total}`,assistantOutputTokens:`Assistant output tokens`,userToolInputTokens:`User + tool input tokens`,tokensWrittenToCache:`Tokens written to cache`,tokensReadFromCache:`Tokens read from cache`,noContextData:`No context data`,systemPromptBreakdown:`System Prompt Breakdown`,collapse:`Collapse`,collapseAll:`Collapse All`,expandAll:`Expand All`,baseContextPerMessage:`Base context per message`,system:`System`,systemShort:`Sys`,skills:`Skills`,tools:`Tools`,files:`Files`,ofInput:`of input`,of:`of`,timelineFiltered:`timeline filtered`,conversation:`Conversation`,noMessages:`No messages`,tool:`Tool`,toolResult:`Tool result`,hasTools:`Has tools`,searchConversation:`Search conversation`,filterByRole:`Filter by role`,filterByTool:`Filter by tool`,you:`You`,noMessagesMatch:`No messages match the filters.`},mosaic:{title:`Activity by Time`,subtitleEmpty:`Estimates require session timestamps.`,subtitle:`Estimated from session spans (first/last activity). Time zone: {zone}.`,noTimelineData:`No timeline data yet.`,dayOfWeek:`Day of Week`,midnight:`Midnight`,fourAm:`4am`,eightAm:`8am`,noon:`Noon`,fourPm:`4pm`,eightPm:`8pm`,legend:`Low → High token density`,sun:`Sun`,mon:`Mon`,tue:`Tue`,wed:`Wed`,thu:`Thu`,fri:`Fri`,sat:`Sat`}},login:{subtitle:`Gateway Dashboard`,passwordPlaceholder:`optional`,showToken:`Show token`,hideToken:`Hide token`,toggleTokenVisibility:`Toggle token visibility`,showPassword:`Show password`,hidePassword:`Hide password`,togglePasswordVisibility:`Toggle password visibility`,failure:{rawError:`Raw error`,docsAuth:`Control UI auth docs`,docsPairing:`Device pairing docs`,docsInsecure:`Insecure HTTP docs`,authRequired:{title:`Auth required`,summary:`The Gateway is reachable, but it needs a matching token or password before this browser can connect.`,stepPaste:`Paste the token from openclaw gateway auth-token --show or enter the configured password.`,stepGenerate:`If no token is configured, run openclaw doctor --generate-gateway-token on the gateway host.`,stepConnect:`Click Connect again after updating the credential.`},authFailed:{title:`Auth did not match`,summary:`The supplied credential was rejected. The most common cause is a stale token or a token copied from another Gateway URL.`,stepDashboard:`Run openclaw dashboard --no-open for a fresh URL, or openclaw gateway auth-token --show to recover the token.`,stepReplace:`Replace stale token/password values; do not reuse a token from another Gateway URL.`,stepMode:`Use one matching auth mode at a time: gateway token for token mode, password for password mode.`},rateLimited:{title:`Too many failed attempts`,summary:`The Gateway is temporarily limiting authentication attempts for this client.`,stepStop:`Stop retrying from this tab for a moment.`,stepWait:`Wait for the auth limiter to cool down, then reconnect with the corrected credential.`,stepCheckClients:`If this is a shared host, check other clients for repeated bad retries.`},pairing:{title:`Device pairing required`,scopeTitle:`Scope upgrade pending`,roleTitle:`Role upgrade pending`,metadataTitle:`Device refresh pending`,summary:`This browser needs one-time approval from the Gateway host before it can use the Control UI.`,upgradeSummary:`This browser is already known, but the requested access changed and needs a fresh approval.`,stepDashboard:`On the Gateway host, run openclaw dashboard to open a secure one-time pairing link.`,stepList:`Run openclaw devices list on the Gateway host.`,stepApproveId:`Approve this request: openclaw devices approve {requestId}.`,stepApprove:`Approve the pending browser/device request from that list.`,stepReconnect:`Reconnect after the approval completes.`},insecure:{title:`Secure browser context required`,summary:`This page is running over plain HTTP, so the browser cannot create the device identity the Gateway expects.`,stepHttps:`Use HTTPS/Tailscale Serve, or open http://127.0.0.1:18789 on the Gateway host.`,stepAvoidDisable:`Do not use a remote plain-HTTP URL; a token or password cannot replace browser device identity.`},origin:{title:`Browser origin not allowed`,summary:`The Gateway rejected this page origin before accepting the Control UI connection.`,stepAllowedOrigins:`Add this browser origin to gateway.controlUi.allowedOrigins.`,stepFullOrigin:`Use full origins such as http://localhost:5173, not wildcard patterns.`,stepRestart:`Restart or reload the Gateway after changing allowed origins.`},protocol:{title:`Protocol mismatch`,summary:`The served Control UI and the running Gateway do not agree on the supported connection protocol.`,refresh:`Refresh page`,stepDashboard:`Reopen the served dashboard with openclaw dashboard so the UI and Gateway come from the same install.`,stepDevUi:`If using pnpm ui:dev, rebuild or restart the dev UI against the current checkout.`,stepRestart:`Restart the Gateway after updating OpenClaw so it serves the current protocol.`},network:{title:`Could not connect`,summary:`The browser could not complete the Gateway connection. Check the target and transport before retrying credentials.`,stepGateway:`Confirm the Gateway is running with openclaw status or openclaw gateway run.`,stepUrl:`Check the WebSocket URL and use wss:// when the Gateway is behind HTTPS/Tailscale Serve.`,stepDashboard:`Reopen the dashboard with openclaw dashboard --no-open to recopy the current URL and auth details.`}}},chat:{cloudWorkerFailed:`Runner failed: {error}`,errorDetails:`Error details`,copyError:`Copy error`,diskSpace:{warningTitle:`Cloud session disk space is low`,criticalTitle:`Cloud session disk space is critically low`,warningBody:`{percent}% used · {free} free. Delete unneeded files or stop the cloud worker before large writes.`,criticalBody:`{percent}% used · {free} free. New writes may fail and stop the agent. Delete unneeded files or stop the cloud worker before large writes.`},sendErrors:{outboxPayloadCopied:`This queued message was copied from another tab. Check the conversation and retry only if it has not arrived.`,outboxPayloadCapacity:`Browser attachment storage is full. Try a smaller batch or send/discard queued messages to free space. No new message was sent; your input is retained.`,outboxPayloadUnavailable:`Browser attachment storage is unavailable. Use HTTPS or localhost, allow browser storage, and close older dashboard tabs before reconnecting and retrying. No new message was sent.`,outboxPayloadMissing:`Queued attachments are missing or unreadable. This may be a stale copy from another tab. Check the conversation, then discard this row and attach the files again if needed. No new message was sent.`,activeLeafChanged:`The session switched branches — review and resend.`},waitingForApproval:`Waiting for approval…`,startupStatus:{preparingWorkspace:`Preparing workspace…`,namingWorktree:`Naming worktree…`,creatingWorktree:`Creating worktree…`,runningSetup:`Running setup…`,provisioningEnvironment:`Provisioning environment…`,preparingContext:`Preparing this turn…`,startingModel:`Waiting for a response…`},archivedSessionDisabled:`This session is archived. Unarchive it to continue the conversation.`,sessionRoute:{chooseTitle:`Choose a session`,multipleMatches:`More than one session matches {shortId}.`,additionalMatches:`Search results remain. Use a longer id prefix.`,notFoundTitle:`Session not found`,notFoundExplanation:`The session may have been removed, or the link may be incorrect.`,goToMain:`Go to main session`,viewSessions:`View sessions`},commandResults:{startingNewThread:`Starting new session...`,resettingThread:`Resetting session...`,stoppingCurrentRun:`Stopping current run...`,chatHistoryCleared:`Chat history cleared.`,exportingThread:`Exporting session...`,emptyExport:`There are no messages to export yet.`,unknownCommand:"Unknown command: `{command}`",options:`Options: {options}.`,sessionUnavailable:`Session capability is unavailable`,help:{availableCommands:`Available Commands`,agentCommand:`agent`,openMenu:"Type `/` to open the command menu."},compaction:{failed:`Compaction failed.`,failedWithReason:`Compaction failed: {reason}`,tokenSummary:` ({before} -> {after} tokens)`,succeeded:`Context compacted successfully`,skipped:`Compaction skipped.`,skippedWithReason:`Compaction skipped: {reason}`},model:{current:`**Current model:** {model}`,available:`**Available:** {models}`,more:` +{count} more`,getFailed:`Failed to get model info: {error}`,set:`Model set to {model}.`,setFailed:`Failed to set model: {error}`},thinking:{current:`Current thinking level: {level}.`,getFailed:`Failed to get thinking level: {error}`,reset:`Thinking level reset to default.`,resetFailed:`Failed to reset thinking level: {error}`,unrecognized:`Unrecognized thinking level "{level}". Valid levels: {options}.`,unsupported:`Unsupported thinking level "{level}" for this model. Valid levels: {options}.`,set:`Thinking level set to {level}.`,setFailed:`Failed to set thinking level: {error}`},verbose:{current:`Current verbose level: {level}.`,getFailed:`Failed to get verbose level: {error}`,unrecognized:`Unrecognized verbose level "{level}". Valid levels: off, on, full.`,set:`Verbose mode set to {level}.`,setFailed:`Failed to set verbose mode: {error}`},fast:{autoValue:`auto ({seconds} sec)`,on:`on`,off:`off`,sourceSession:` (session)`,sourceAgent:` (default: agent)`,sourceModel:` (default: model)`,sourceDefault:` (default)`,current:`Current fast mode: {value}`,options:`on, off, auto ({seconds} sec), default, status`,getFailed:`Failed to get fast mode: {error}`,reset:`Fast mode reset to default.`,resetFailed:`Failed to reset fast mode: {error}`,unrecognized:`Unrecognized fast mode "{mode}". Valid levels: on, off, auto, default, status.`,setAuto:`Fast mode set to auto.`,enabled:`Fast mode enabled.`,disabled:`Fast mode disabled.`,setFailed:`Failed to set fast mode: {error}`},usage:{noActiveThread:`No active session.`,notAvailable:`n/a`,title:`Session Usage`,inputTokens:`Input: {count} tokens`,outputTokens:`Output: {count} tokens`,totalTokens:`Total: {count} tokens`,context:`Context: {percent} of {total}`,model:`Model: {model}`,failed:`Failed to get usage: {error}`},agents:{none:`No agents configured.`,title:`**Agents** ({count})`,default:`default`,runtime:` · runtime {runtime}`,failed:`Failed to list agents: {error}`},steer:{timeout:`The active run ended before the steer message was accepted.`,failed:`Steer failed before it reached the run; try again.`,usage:"Usage: `/steer <message>`",succeeded:`Steered.`,requestFailed:`Failed to steer: {error}`},redirect:{timeout:`The active run ended before the redirect message was accepted.`,failed:`Redirect failed before it reached the run; try again.`,usage:"Usage: `/redirect <message>`",succeeded:`Redirected.`,requestFailed:`Failed to redirect: {error}`}},sessionSharing:{menu:`Session sharing`,current:`Session visibility: {visibility}`,visibility:`Visibility`,shared:`Shared`,readOnly:`Read-only`,suggest:`Suggest`,draft:`Draft`,publishDraft:`Publish draft`,members:`Members`,selected:`Member`,noPeople:`No paired people found.`,readOnlyNotice:`Only the session owner and members can act in this session.`},sessionSuggestions:{suggest:`Suggest`,suggestMessage:`Suggest message`,attachmentsUnsupported:`Remove attachments before submitting a text suggestion.`,sendNow:`Send {author}'s suggestion now`,queue:`Queue {author}'s suggestion`,edit:`Edit {author}'s suggestion`,dismiss:`Dismiss {author}'s suggestion`,typing:`{name} is typing…`,typingMany:`{names} are typing…`,state:{pending:`Pending`,accepted:`Accepted`,dismissed:`Dismissed`}},sessionHeader:{renameTooltip:`Rename session`,renameAria:`Rename session {title}`,renameInputAria:`Session title`,renameInputPlaceholder:`Session title`,openParent:`Open parent session {title}`,panels:`Panels`,layout:`Layout`,continueInTerminal:{action:`Continue in terminal…`,title:`Continue in terminal`,description:`Copy this command to continue the current session. It is safe to paste in common terminals and shells.`,authNote:`The command contains no credentials. The terminal authenticates independently, and the session's access controls still apply.`,disconnected:`Connect to the Gateway to continue this session in a terminal.`,queryRouted:`Query-routed Gateway URLs cannot create credential-free continuation commands because authentication and stored device scope are not query-aware. Use a manually authenticated CLI target or a queryless configured Gateway URL.`,unavailable:`This session or Gateway address cannot be continued in a terminal.`},workspaceAria:`Workspace actions for {workspace}`,revealFinder:`Reveal in Finder`,revealFileExplorer:`Reveal in File Explorer`,revealFileManager:`Open in file manager`,copyPath:`Copy path`,copyBranch:`Copy branch name`,copied:`Copied`,incognito:`Incognito session`,branches:`Session branches`,branchSwitchUnavailable:`Branch switch is unavailable while the agent is working.`,untitledBranch:`Untitled branch`,oneMessage:`{count} message`,messages:`{count} messages`,activeBranch:`Active branch`,gatewayPicker:{menuLabel:`Gateway: {gateway}`,primaryTag:`primary`,setPrimary:`Set as primary…`,openSettings:`Gateway settings…`,connected:`Connected`,unreachable:`Unreachable`,unknown:`Unknown status`}},board:{faceLabel:`Session face`,chatFace:`Chat`,splitFace:`Split`,dashboardFace:`Dashboard`,dockMenu:`Chat dock: {dock}`,dockLeft:`Dock chat left`,dockRight:`Dock chat right`,dockBottom:`Dock chat bottom`,resizeDock:`Resize chat dock`,enterFullscreen:`Enter fullscreen`,exitFullscreen:`Exit fullscreen`,fullscreenUnavailable:`Fullscreen is unavailable in this browser`,fullscreenFailed:`Could not change fullscreen mode: {error}`,workboardCard:`Workboard card: {title}, {status}`,defaultTab:`Main`,mockPlaceholder:`Board view seam · {tabs} tabs · {widgets} widgets`,mockOverview:`Overview`,mockResearch:`Research`,mockSessionStatus:`Session status`,mockRecentFindings:`Recent findings`,mockSourceMap:`Source map`,resetTitle:`Reset conversation?`,resetDescription:`The conversation context resets. Your dashboard stays.`},catalog:{remoteViewOnly:`This session is on a paired device and is view-only.`,unsupportedViewOnly:`This external session source is view-only.`,sessionMenu:`External session actions`,openInOpenClaw:`Open in OpenClaw`,openInTerminal:`Open in terminal`,terminalUnavailable:`Terminal opening is unavailable for this session.`},taskSuggestions:{eyebrow:`Suggested task · in {repo}`,startWorktree:`Start with worktree`,startLocal:`Start locally`,startCloud:`Send to cloud · {profile}`,startCloudGeneric:`Send to cloud`,copyPrompt:`Copy prompt`,copyPromptFailed:`Couldn't copy the prompt to the clipboard`,promptCopied:`Copied`,fixInSession:`Fix in this session`,noCloudConfigured:`No cloud environment configured`,showInstructions:`Show instructions`,hideInstructions:`Hide instructions`,previous:`Previous suggested task`,next:`Next suggested task`,moreActions:`More ways to start this task`,starting:`Starting…`,dismiss:`Dismiss {title}`,adminRequired:`Administrator access is required to start suggested tasks.`},pullRequests:{linkLabel:`Pull request #{number}: {title}`,createPr:`Create PR`,createPrLabel:`Create a pull request for {branch}`,publishPr:`Publish PR`,publishing:`Publishing…`,publicationRequested:`Requested`,retryPublication:`Retry publication`,openPublishedPr:`Open PR`,cloudPublicationGuidance:`Start a live agent turn and ask it to publish this cloud workspace after reconciliation.`,dismiss:`Dismiss pull request #{number}`,open:`Open`,draft:`Draft`,merged:`Merged`,closed:`Closed`,checks:`CI`,checksPassing:`CI checks passing`,checksFailing:`CI checks failing`,checksPending:`CI checks running`,ciMonitoring:`CI monitoring`,openChecks:`Open checks on GitHub`,checksPassed:`Passed`,checksFailed:`Failed`,checksRunning:`Running`,checksSkipped:`Skipped`,showMore:`Show {count} more`,rateLimited:`GitHub API rate limit reached. Pull request status may be out of date until the limit resets.`},usageRemaining:`Usage Remaining`,view:{menu:`View`,reasoning:`Reasoning`,toolCalls:`Tool calls`,commentary:`Keep commentary`},sendShortcut:`Send shortcut`,sendShortcutEnter:`Enter`,sendShortcutModifierEnter:`⌘/Ctrl+Enter`,followUpMode:`Follow-ups while the agent is working`,followUpModeQueue:`Queue until the run ends`,followUpModeServer:`Server default ({mode})`,followUpModeLoading:`loading…`,followUpModeSteer:`Steer into the active run`,followUpModeUsingServer:`Using server default ({mode})`,followUpModeOverriding:`Overriding server default ({mode})`,followUpModeReset:`Reset to server default`,catalogOpenTarget:`Open external sessions in`,catalogOpenTargetViewer:`OpenClaw viewer`,catalogOpenTargetTerminal:`Terminal`,onboardingDisabled:`Disabled during setup`,commandPaletteTitle:`Search or jump to… (⌘K)`,openCommandPalette:`Open command palette`,updating:`Updating…`,actions:{copyAsMarkdown:`Copy as markdown`,dismissError:`Dismiss error`,exitFocusMode:`Exit focus mode`,scrollToLatest:`Scroll to latest`},markdown:{truncated:`… truncated ({total} chars, showing first {shown}).`},codeBlock:{languageFallback:`Code`,hiddenLine:`1 hidden line`,hiddenLines:`{count} hidden lines`,showHiddenLine:`Show 1 hidden line`,showHiddenLines:`Show {count} hidden lines`,enableWrap:`Enable word wrap`,disableWrap:`Disable word wrap`,jsonBadge:`JSON`,jsonArrayItem:`Array ({count} item)`,jsonArrayItems:`Array ({count} items)`,jsonObjectKeys:`Object ({count} keys)`},workspaceConflict:{titleOne:`1 cloud workspace conflict`,titleMany:`{count} cloud workspace conflicts`,description:`OpenClaw kept your local versions and applied the other cloud changes. Inspect the staged result or take its version for a conflicted path.`,summary:`Local versions kept; inspect or take the cloud version.`,showCommands:`Show commands`,morePaths:`+{count} more paths`,stagedResult:`Staged cloud result`,copyStagedResult:`Copy staged result ref`,inspectCloud:`Inspect the first cloud version`,takeCloud:`Take the first cloud version`,copyInspectCommand:`Copy cloud inspect command`,copyTakeCommand:`Copy take-cloud command`,commandHelp:`Run these in Bash or zsh (Git Bash on Windows). If inspect says the path does not exist, the cloud deleted it; verify and remove the local path manually. If checkout reports a file/directory conflict, move or remove the blocking local path, then retry. If the staged ref is missing, the notice is stale; do not change the local path.`,commandsUnavailable:`This filename contains terminal control characters, so OpenClaw will not build a copyable shell command for it. Inspect the staged ref directly and enter the path manually with care.`,dismiss:`Dismiss workspace conflict notice`,eventSender:`Cloud workspace`,eventTitleOne:`Cloud result applied with 1 conflict`,eventTitleMany:`Cloud result applied with {count} conflicts`,eventDescription:`Local versions were kept for these paths; other cloud changes were applied.`},compaction:{label:`Compacted history`,savedTokens:`saved {count} tokens`,description:`The compacted transcript is preserved as a checkpoint.`,openCheckpoints:`Open checkpoints`},sessionReset:{label:`Session reset`,description:`The earlier conversation was cleared.`},outboxRecoveryTitle:`Saved messages need a destination`,outboxRecoveryDescription:`An older browser version did not preserve every destination. These drafts and queued messages have not been sent by recovery. Open an empty non-Incognito conversation, then restore an entry here for review. Attachment drafts may appear separately.`,outboxRecoveryConfirm:`Confirm this destination for the saved entry. Queued messages will remain paused for review and Retry. If delivery was uncertain, check the conversation before retrying.`,outboxRecoveryRestore:`Restore here for review`,outboxRecoveryConflict:`This destination has a newer draft or queue, or changed during confirmation. Open an empty conversation and try again. The saved entry is still available.`,outboxRecoveryStorageFailed:`Browser storage could not complete recovery. The original saved data has been retained. Free browser storage and reload to try again.`,outboxRecoveryFull:`Recovery is full. Restore saved entries to make room; remaining legacy data is still retained in this browser.`,outboxRecoveryMessages:`Queued messages: {count}`,restartRecoveryTitle:`This session ended during a restart.`,restartRecoveryDisabled:`Its transcript is safe.`,resumeInNewSession:`Resume in new session`,resumingSession:`Resuming…`,systemNotice:{guardian:{approvedSummary:`Guardian approved {action}.`,deniedLabel:`Guardian denied`,deniedSummary:`{action} · risk: {risk}
{rationale}`,warningLabel:`Guardian warning`,warningFallback:`Guardian stopped the requested action.`,strictReviewRequiredLabel:`Guardian review required`,strictReviewRequiredSummary:`Guardian is reviewing this action before it can continue.`,requestedAction:`Requested action`,unknownRisk:`unknown`,noRationale:`No rationale was provided.`},restartRecovery:{label:`System · restart recovery`,summary:`Turn interrupted by a gateway restart — asked the agent to resume and finish the response.`},gatewayRestarted:{label:`System · gateway restarted`},cliHarnessContext:{label:`System · injected context`},showContent:`Show content`},progressLabels:{shelling:`Shelling`,scuttling:`Scuttling`,clawing:`Clawing`,pinching:`Pinching`,molting:`Molting`,bubbling:`Bubbling`,tiding:`Tiding`,reefing:`Reefing`,cracking:`Cracking`,sifting:`Sifting`,brining:`Brining`,nautiling:`Nautiling`,krilling:`Krilling`,barnacling:`Barnacling`,lobstering:`Lobstering`,tidepooling:`Tidepooling`,pearling:`Pearling`,snapping:`Snapping`,surfacing:`Surfacing`},turnRecap:{doneIn:`Done in {duration}`,tokens:`{count} tokens`,tokensOne:`1 token`},commands:{arguments:`Command arguments`,menu:`Slash commands`,optionCount:`{count} options`,clearDescription:`Clear chat history`,redirectDescription:`Abort and restart with a new message`,steerDescription:`Inject a message into the active run`,categories:{session:`Session`,model:`Model`,agents:`Agents`,tools:`Tools`}},skills:{menu:`Skill references`,label:`Skills`,loading:`Loading skills…`},splitView:{open:`Open split view`,splitRight:`Split right`,splitDown:`Split down`,closePane:`Close pane`,dropSplit:`Split`,dropOpenHere:`Open here`},sidebar:{updateMacAndGateway:`Update Mac app + Gateway`,updateGateway:`Update Gateway`,serverUpdatedTitle:`Server updated`,serverUpdatedRefresh:`Refresh for full capabilities`,threads:`Sessions`,otherSessions:`Other`,groups:`Groups`,coding:`Coding`,catalogViewOptions:`View options`,hideFromSidebar:`Hide from sidebar`,sectionHidden:`{section} hidden.`,sectionHiddenRecovery:`Show it again in Settings > Appearance > Sidebar.`,hiddenSessionSections:`Hidden session sections`,showSessionSection:`Show`,catalogGroupByProject:`Project`,catalogGroupByPerson:`Person`,openSessionMenu:`Open session menu`,sortBy:`Sort by`,sortCreated:`Created`,sortSessions:`Filter & sort`,sortUpdated:`Last updated`,sessionMenu:`Actions for {session}`,sessionMenuMany:`Actions for {count} sessions`,toolActivity:`Using {tool}`,catalogDiscoveryHelp:`{error}. Configure native session discovery in Settings > Automation > Plugins.`},welcome:{hintBeforeShortcut:`Type a message below ·`,hintAfterShortcut:`for commands`,recentSessions:`Recent chats`,suggestions:{whatCanYouDo:`What can you do?`,summarizeRecentSessions:`Summarize my recent sessions`,configureChannel:`Help me configure a channel`,checkSystemHealth:`Check system health`}},runControls:{newSession:`New session`,newSessionWorktree:`New session in worktree`,exportChat:`Export chat`,queue:`Queue`,queueMessage:`Queue message`,stop:`Stop`,stopWithShortcut:`Stop (Esc)`,stopGenerating:`Stop generating`,send:`Send`,sendMessage:`Send message`},queue:{connectionPending:`Finishing connection recovery. Try sending again when it is ready.`,initialTurnPending:`The initial message is unresolved. Reconnect if needed, then review it before sending another message.`,notSent:`Not sent`,deliveryUnconfirmed:`Delivery unconfirmed`,checkDelivery:`Check delivery`,checkDeliveryHelp:`Delivery is unconfirmed. Check delivery looks for the original message without resending it or starting a worker. Inspect the conversation, or copy the retained prompt if you choose to start a separate attempt.`,retry:`Retry`,retryQueuedMessage:`Retry queued message`,steer:`Steer`,steerQueuedMessage:`Steer queued message`,removeQueuedMessage:`Remove queued message`,reorderQueuedMessage:`Reorder queued message with the arrow keys`,reorderUnavailable:`This message holds its place and cannot be reordered`,editQueuedMessage:`Edit queued message`,moreActions:`More queued message actions`,cancelEdit:`Cancel editing and keep the queued message`,states:{applyingSettings:`Applying chat settings`,runningCommand:`Running command`,waitingForReconnect:`Waiting for reconnect`,editing:`Editing`,needsReview:`Delivery uncertain`},imageCount:`Image ({count})`},goals:{composerMode:`Goal`,sessionChanged:`Conversation changed. Cancel and select Goal again.`,start:`Start goal`,save:`Save goal`,startHint:`Enter your objective.`,editHint:`Save without starting a run.`,objectivePlaceholder:`What should this goal accomplish?`,cancel:`Cancel goal entry`,offline:`Reconnect to manage goals.`,busy:`Wait for this run to finish. Your draft is unchanged.`,annotationUnsupported:`Send or remove browser annotations first. Your draft is unchanged.`,actionPending:`Wait for the pending goal action.`,admissionImmutable:`Retry or remove this request. Editing requires a new goal.`,edit:`Edit goal`,editChip:`Edit`,pause:`Pause goal`,pauseChip:`Pause`,resume:`Resume goal`,resumeChip:`Resume`,clear:`Clear goal`,clearChip:`Clear`,showDetails:`Show goal details`,hideDetails:`Hide goal details`},questions:{other:`Type your own answer here`,submit:`Submit`,next:`Next`,back:`Back`,skip:`Skip`,skipping:`Skipping…`,skipped:`Skipped`,collapse:`Collapse question`,expand:`Expand question`,eyebrow:`Question`,summaryLabel:`Question outcome`,ownAnswerFor:`Your own answer for {header}`,storeRequestedBy:`Requested by {agent} · {session}`,storeEntry:`Stores {name} as {kind}`,storeReplacement:`Replaces {name} — last updated {updated}`,storeReplacementBy:`Replaces {name} — last updated {updated} by {updatedBy}`,submitting:`Submitting…`,submitFailed:`Could not submit: {error}`,answered:`Answered`,answeredElsewhere:`Answered elsewhere`,unavailable:`Unavailable`,expired:`Expired`,disconnected:`Not connected. Try again after reconnecting.`},imageLightbox:{label:`Image preview: {title}`,open:`Open image {title}`,openOriginal:`Open in new tab`,copy:`Copy image`,download:`Download image`,copyFailed:`Could not copy this image. Check clipboard access and try again.`,downloadFailed:`Could not download this image. Try again.`,loadFailed:`Could not load this image. Try again.`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,resetZoom:`Reset zoom`,close:`Close image preview`,untitled:`Image`},externalImage:{notLoaded:`External image not loaded`,open:`Open image`},messages:{copySelection:`Copy`,forkFromHere:`Fork from here`,reply:`Reply`,replyToMessage:`Reply to message`,replyingTo:`Replying to {name}`,originalUnavailable:`The original message is unavailable.`,message:`message`,currentMessage:`current message`,actions:`Message actions`,selectionActions:`Selection actions`,moreDetails:`More details`,askInSideChat:`Ask in side chat`,rewind:`Rewind`,rewindConfirm:`Rewind to before this message?`,dontAskAgain:`Don't ask again`,rewindToHere:`Rewind to here`,rewindUnavailable:`Rewind is unavailable while the agent is working`,forkUnavailable:`Fork is unavailable while the agent is working`,showLess:`Show less`,showMore:`Show more`,tooLargeToDisplay:`This message is too large to display here.`,unknownDate:`Unknown date`,toolSender:`Tool`,fullContentLoadExhausted:`Could not load the full message.`,voiceNote:`Voice note`,duplicatesCollapsed:`{count} consecutive identical messages collapsed`,contextFor:`Message context for {timestamp}`},mediaPlayer:{play:`Play`,pause:`Pause`,seek:`Seek media`,mute:`Mute`,unmute:`Unmute`,volume:`Volume`,download:`Download {filename}`,preparing:`Preparing playback…`,openVideo:`Expand {filename} in the media overlay`,videoPreview:`Video preview: {title}`,closeVideoPreview:`Close video preview`},modelControls:{default:`Default`,effort:`Effort`,faster:`Faster`,smarter:`Smarter`,fastMode:`Fast mode`,searchModels:`Search models`,noMatchingModels:`No models match your search`,onlyForSession:`Only for this session`,useDefaultModel:`Use default ({model})`,defaultWithModel:`Default ({model})`,defaultWithLevel:`Default ({level})`,fastHelp:`Faster responses, higher usage of limits.`,contextWindow:`Context window`,contextWindowAria:`Context window: {state}`,speedUnsupported:`Speed control is not supported for this model.`,contextActiveAndMax:`{active} active · {maximum} max`,chatOnly:`Chat only`,chatOnlyHelp:`This model can chat, but it cannot use tools. Choose another model for files, commands, web, or media tasks.`,loadingModels:`Loading models…`,modelsUnavailable:`Models unavailable`,noModelsAvailable:`No models available`,emptyModelsAction:`Manage models`,providerModels:`{provider} models`,useDefaultReasoning:`Use default reasoning ({level})`,fastResponsesAria:`Fast responses: {state}`},permissionControls:{label:`Permissions`,help:`Choose permissions for new runs.`,nextRun:`New permissions apply to the next run.`,default:`Default`,defaultDescription:`Follow the agent's configured policy.`,defaultWithMode:`Default ({mode})`,fullRequiresAdmin:`Full access requires operator.admin access.`,updateFailed:`Failed to update permissions: {error}`,modes:{"read-only":{label:`Read only`,description:`Read within the session root; writes and commands are blocked.`},guarded:{label:`Guarded`,description:`A human reviews requests beyond the session root.`},workspace:{label:`Workspace`,description:`An AI reviewer checks requests beyond the session root.`},full:{label:`Full access`,description:`No reviewer; files and commands are unrestricted.`}}},rail:{title:`Session companion`,subtitle:`Ask about this session or its project`,expand:`Expand session companion`,collapse:`Collapse session companion`,close:`Close session companion`,show:`Show session companion`,moreActions:`More companion actions`,clear:`Clear companion session`,pullRequests:`Pull requests`,checksPassing:`{count} passed`,checksFailing:`{count} failed`,checksPending:`{count} running`,finished:`Finished {time}`,empty:`Answers come from this session's transcript and its project files.`,starters:{changed:`What changed?`,stopped:`Why did it stop?`,remaining:`What's left?`},askLabel:`Ask the session companion`,askPlaceholder:`Ask a question`,askSubmit:`Ask`,askPending:`Answering from this session…`,askBusy:`The companion is already answering a question.`,askHistoryUnavailable:`Couldn't load this session's history.`,askMissing:`This session is no longer available.`,askModelUnavailable:`No utility model is configured for this session.`,askRateLimited:`The companion reached its question limit. Try again shortly.`,askUnavailable:`The companion cannot answer right now.`,askRetry:`Retry`,asOf:`as of {time}`,health:{"on-track":`On track`,grinding:`Working`,stuck:`Stuck`,"waiting-on-user":`Waiting on you`,"wrapping-up":`Wrapping up`,done:`Done`,failed:`Failed`}},detailPanel:{close:`Close sidebar`,copyPath:`Copy path`,discard:`Discard`,editFile:`Edit file`,searchInFile:`Search in file`,showInFiles:`Show in Files`,previousMatch:`Previous match`,nextMatch:`Next match`,overwrite:`Overwrite`,viewRawText:`View Raw Text`,renderedMarkdown:`Rendered Markdown`,renderedMarkdownHint:`Sanitized rich-text preview for quick reading.`,noPreviewableMarkdown:`No previewable markdown content.`,noContent:`No content available`,fullContentOversized:`Full content is unavailable because the stored transcript entry is too large to return safely.`,fullContentNotVisible:`Full content is unavailable because this transcript entry does not have a visible WebChat projection.`,fullContentUnavailable:`Full content is no longer available for this transcript entry.`,copyContents:`Copy file contents`,fileChanged:`File changed on disk since it was loaded.`,renderPreview:`Render preview`,imagePreview:`Image preview`,file:`File`,markdownPreview:`Markdown preview`,toolDetails:`Tool details`,reloadFailed:`Failed to reload the latest file.`,overwriteLoadFailed:`Failed to load the latest file before overwriting.`,fullContentLoadFailed:`Failed to load full content: {error}`},sidebarColumns:{close:`Close {panel}`},sidePanel:{label:`Side panel`,addTab:`Add side panel tab`,expand:`Expand side panel`,restore:`Restore side panel`,minimize:`Minimize side panel`,resize:`Resize side panel`,emptyTitle:`Open a tab`,review:`Review`,reviewEmpty:`Open a change, file, image, or tool result to review it here.`,terminal:`Terminal`,terminalEmpty:`Open a shell for this session's workspace.`,browser:`Browser`,browserEmpty:`A shared browser for you and the agent.`,files:`Files`,filesEmpty:`Browse files, artifacts, and changes from this session.`,companion:`Side chat`,companionEmpty:`Ask a focused question about this session.`,tasks:`Tasks`,tasksEmpty:`Follow active and recently completed background tasks.`,desktop:`Desktop`,desktopEmpty:`Connect to an available remote desktop.`,discussion:`Discussion`,discussionEmpty:`Open the shared discussion for this session.`,boardChat:`Board chat`,boardChatEmpty:`Open the board conversation alongside its dashboard.`},thread:{search:`Search messages`,searchPlaceholder:`Search messages...`,closeSearch:`Close search`,loading:`Loading chat`,showEarlier:`Show earlier`,loadingEarlier:`Loading earlier history…`,noMatches:`No matching messages`},pendingInputs:{count:`Retained accepted inputs: {count}`,queued:`Accepted by the Gateway. Waiting for its turn.`,cancelled:`Cancelled before its turn. This input will not run automatically; copy it to send a new message.`,interrupted:`Interrupted before its turn. This input will not run automatically; copy it to send a new message.`,earlier:`Earlier accepted inputs`,latest:`Latest accepted inputs`},pairingQrExpired:{title:`Pairing QR expired`,reason:`Run /pair qr again to generate a fresh setup code.`,badge:`Expired`},composer:{placeholder:`Message {name}`,emptyHint:`Write a message to send.`,placeholderWithAttachments:`Add a message or paste more images...`,offlineHint:`Offline — messages will be queued and sent when the connection returns.`,offlineQueuedHint:`Offline — {count} queued; messages send when the connection returns.`,preparingModel:`Preparing model...`,responding:`{name} is responding...`,sendingMessage:`Sending message...`,working:`{name} is working...`,runDone:`Done`,runInterrupted:`Interrupted`,runStatus:`Run status: {status}`,compactingContext:`Compacting context...`,contextCompacted:`Context compacted`,fallbackActive:`Fallback active: {model}`,fallbackCleared:`Fallback cleared: {model}`,fallbackSelected:`Selected: {model}`,fallbackCurrent:`Active: {model}`,fallbackPrevious:`Previous fallback: {model}`,fallbackReason:`Reason: {reason}`,fallbackAttempts:`Attempts: {attempts}`,cancelReply:`Cancel reply`,attachmentPreview:`Attachment preview`,browserAnnotation:`Browser annotation`,browserAnnotationPreview:`Browser annotation preview`,browserAnnotationRegion:`{count} marked region`,browserAnnotationRegions:`{count} marked regions`,browserAnnotationInspectedElement:`Element inspected`,browserAnnotationRemoved:`Browser annotation removed.`,browserAnnotationUndoUnavailable:`Undo is unavailable because the browser annotation limit has been reached.`,removeAttachment:`Remove attachment`,removeBrowserAnnotation:`Remove browser annotation: {name}`,addAttachment:`Add attachment`,attachPhoto:`Photo`,attachFileOption:`File`,menu:{back:`Back`,skills:`Skills`,connectors:`Connectors`,webSearch:`Web search`,managePlugins:`Manage plugins`,manageSkills:`Manage skills`,browseConnectors:`Browse connectors`,addMcpServer:`Add MCP server…`,addMcpServerTitle:`Add MCP server`,addMcpServerDescription:`Configure the server and choose where it is enabled.`,scopeLabel:`Availability`,scopeSession:`This session`,scopeEverywhere:`Everywhere`,scopeSessionHint:`The server is saved globally disabled and enabled only for this session.`,scopeEverywhereHint:`The server is saved and enabled for every session.`,toolAccess:{label:`Tool access`,loading:`Loading tools…`,loadFailed:`Couldnt load tools.`,noTools:`No tools available for this connector.`,summary:`{enabled} of {total} tools on`,summaryOne:`{enabled} of {total} tool on`},enabledCount:`{count} on`,loadingSkills:`Loading skills…`,skillsLoadFailed:`Couldnt load skills.`,noSkills:`No skills available.`,noConnectors:`No MCP servers configured.`,depsMissing:`deps missing`,skillBlocked:`not available for this agent`,sessionTag:`session`,offlineBlocked:`Connect to the gateway to change session capabilities.`,adminBlocked:`Admin access is required to manage connectors.`,savingBlocked:`Wait for the current session capability change to finish.`},overrides:{count:`{count} overrides`,countOne:`{count} override`,clear:`Clear session overrides`},contextUsage:{title:`Context usage details`,open:`Open context usage details`,summary:`Session context usage: {used} of {limit} ({pct}%)`,contextWindow:`Context window`,latestRunTokens:`Latest run tokens`,estimatedCost:`Est. cost`,planUsage:`Plan usage`,openUsage:`Open usage dashboard`,resets:`Resets {time}`,usageCredits:`Usage credits`,budgetValue:`{used} of {limit}`,limitFiveHour:`5-hour limit`,limitWeekly:`Weekly`,limitDaily:`Daily limit`,limitHours:`{hours}-hour limit`},takePhoto:`Take photo`,cameraAccessFailed:`Unable to access the camera.`,cameraBusy:`The camera is busy or unavailable to the browser.`,cameraFallback:`Camera {number}`,cameraInput:`Camera`,cameraListUnsupported:`This browser cannot list cameras.`,cameraNoneFound:`No camera was found.`,cameraPageInactive:`Cameras are unavailable while this page is inactive.`,cameraPermissionBlocked:`Camera access is blocked. Allow camera access in browser site settings.`,cameraPreview:`Camera preview`,dismissVoiceInputError:`Dismiss voice input error`,microphoneAccessFailed:`Unable to access microphone inputs.`,microphoneBusy:`Microphone inputs are busy or unavailable to the browser.`,microphoneStopped:`Microphone input stopped. Choose an available input and start again.`,microphoneFallback:`Microphone {number}`,microphoneInput:`Microphone input`,microphoneAppliesNextSession:`Changes apply when you start your next Talk session.`,microphoneListUnsupported:`This browser cannot list microphone inputs.`,noCameras:`No additional cameras found`,noMicrophones:`No additional microphones found`,microphoneNoneFound:`No microphone found. Plug one in and it appears here.`,microphonePageInactive:`Microphone inputs are unavailable while this page is inactive.`,microphonePermissionBlocked:`Microphone access is blocked. Allow it in browser site settings to list inputs.`,realtimeTalkCapability:`Tap to talk`,dictationCapability:`Dictation`,realtimeTalkProviderUnavailable:`No realtime voice provider is configured.`,dictationProviderUnavailableShort:`No transcription provider is configured.`,talkCapabilityChecking:`Checking provider availability…`,talkCapabilityUnknown:`Provider availability could not be verified.`,openRealtimeTalkSettings:`Talk settings`,openDictationSettings:`Transcription setup`,configureCapability:`Configure`,holdToRecordSetting:`Hold microphone button to start dictation`,holdToDictate:`Hold to start dictation`,holdToRecordSettingDescription:`Hold until dictation starts, then release and keep speaking. Tap Stop to insert the transcript.`,dictationAudioUnsupported:`The Gateway returned an unsupported dictation audio format.`,dictationBrowserAudioUnsupported:`This browser cannot capture dictation audio at 8 kHz.`,dictationConnecting:`Starting dictation…`,dictationDisconnected:`Dictation stopped because the Gateway disconnected.`,dictationFailed:`Dictation failed.`,dictationInterruptedRecovery:`Captured text was inserted. Check your connection and try again.`,dictationStartRecovery:`Check microphone access and transcription settings, then try again.`,dictationFinalizing:`Finishing dictation…`,dictationListening:`Listening…`,dictationStopAndKeep:`Stop and keep text`,dictationProviderUnavailable:`No transcription provider is configured for dictation. Choose one in Settings to dictate.`,realtimeTalkCancellationRejected:`Realtime output cancellation was not accepted.`,realtimeTalkMissingTurnIdentity:`Realtime output is missing its turn identity.`,realtimeTalkRequiresMicrophone:`Realtime voice input requires browser microphone access.`,selectedMicrophoneUnavailable:`The selected microphone is unavailable. Choose another input or System default.`,selectedCameraUnavailable:`The selected camera is unavailable. Choose another camera or System default.`,startVoiceInput:`Start voice input`,voiceGestureHint:`Tap to talk · Hold to start dictation`,stillListening:`Still listening`,stopVoiceInput:`Stop voice input`,systemDefaultMicrophone:`System default`,systemDefaultCamera:`System default`,switchCamera:`Switch camera`,turnCameraOff:`Turn camera off`,turnCameraOn:`Turn camera on`,voiceTranscript:`Voice transcript`},attachments:{attachedFile:`Attached file`,audio:`Audio`,expand:`Open {filename} in the side panel`,open:`Open`,previewUnavailable:`Preview unavailable`,readFailed:`Could not attach: {names}{more}`,tooLarge:`Too large to send: {names}{more}`,showInTextField:`Show in text field`,outsideAllowedFolders:`Outside allowed folders`,unavailable:`Unavailable`,failureDeliveryFailed:`Delivery failed. Try sending this file again.`,failureFileNotFound:`File not found. Check the path and try again.`,failureUnsupportedFormat:`Rejected by the local attachment allowlist. Send a supported file type.`,notSent:`Not sent`,video:`Video`},voice:{asking:`Asking OpenClaw...`,connecting:`Connecting voice input...`,listening:`Listening...`},selectors:{loadMoreSessions:`Show more`,loadMoreRosterSessions:`Load more sessions`,model:`Chat model`,modelSection:`Model`,modelLocked:`Locked`,modelLockedLabel:`Model selection controlled for this session`,lockedSessionModel:`Session model`,nativeCodexModel:`Codex-controlled model`,thinkingLevel:`Chat thinking level`},toolCards:{tool:`Tool`,canvas:`Canvas`,summary:`Summary`,toolInput:`Tool input`,toolOutput:`Tool output`,toolError:`Tool error`,rawDetails:`Raw details`,showRawDetails:`Show raw details`,hideRawDetails:`Hide raw details`,viewMode:`Tool detail view`,diff:`Diff`,raw:`Raw`,openFile:`Open file`,openDetails:`Open tool details in side panel`,widgetActions:`Widget actions`,copyToClipboard:`Copy to clipboard`,downloadFile:`Download file`,copyAsImage:`Copy as image`,downloadAsImage:`Download as image`,widgetExportRerender:`This widget needs to be re-rendered to export as an image.`,widgetExportHtmlFallback:`Image unavailable. Downloaded the widget as HTML instead.`,widgetExportFailed:`Widget export failed. Try again.`,pinToDashboard:`Pin to dashboard`,pinToDashboardPending:`Pinning…`,pinToDashboardFailed:`Could not pin to dashboard. Try again.`,pinnedToDashboard:`Pinned`,fileChanges:`File changes`,attemptedChanges:`Attempted changes`,failed:`failed`,running:`Running`,completed:`Completed`,exitCode:`Exit code {code}`,noOutputFailed:`No output — tool failed.`,noOutputSucceeded:`No output — tool completed successfully.`,noResult:`No result available.`,review:{reviewing:`{reviewer} reviewing`,approved:`{reviewer} approved`,denied:`{reviewer} denied`,timedOut:`{reviewer} timed out`,aborted:`{reviewer} stopped`,risk:`{level} risk`,authorization:`{level} authorization`,noRationale:`No rationale was provided.`},verbs:{read:`Read`,edit:`Edit`,editing:`Editing`,edited:`Edited`,create:`Create`,creating:`Creating`,created:`Created`,delete:`Delete`,deleting:`Deleting`,deleted:`Deleted`,change:`Change`,changing:`Changing`,changed:`Changed`,write:`Write`,writing:`Writing`,wrote:`Wrote`,searched:`Searched`,fetched:`Fetched`},group:{commandsOne:`ran a command`,commandsMany:`ran {count} commands`,readsOne:`read a file`,readsMany:`read {count} files`,editsOne:`edited a file`,editsMany:`edited {count} files`,writesOne:`created a file`,writesMany:`created {count} files`,deletesOne:`deleted a file`,deletesMany:`deleted {count} files`,searchesOne:`ran a search`,searchesMany:`ran {count} searches`,fetchesOne:`fetched a page`,fetchesMany:`fetched {count} pages`,namedTool:`used {names}`,namedToolRepeated:`used {names} ×{count}`,otherOne:`used a tool`,otherMany:`used {count} tools`,emptyOne:`Ran a tool call`,emptyMany:`Ran {count} tool calls`}},workRun:{workedFor:`Worked for {duration}`,worked:`Worked`},backgroundTasks:{label:`Background tasks`,title:`Background tasks`,show:`Show background tasks`,collapse:`Collapse background tasks`,refresh:`Refresh background tasks`,loading:`Loading background tasks…`,running:`Running ({count})`,finished:`Finished ({count})`,statusRunningOne:`1 running task`,statusRunningMany:`{count} running tasks`,statusPreviewMore:`+{count} more`,stopTask:`Stop {title}`,toolUseOne:`1 tool use`,toolUseMany:`{count} tool uses`,detailLoading:`Loading task details…`,detailFailed:`Could not load task details.`,detailRetry:`Try again`,transcriptLoading:`Loading task transcript…`,transcriptEmpty:`No transcript messages yet.`,transcriptFailed:`Could not load task transcript.`,taskDetailTitle:`Task details`,taskUnavailable:`This task is no longer available.`,prompt:`Prompt`,output:`Output`,promptUnavailable:`Prompt unavailable.`,outputPending:`No output yet.`,subagentActivity:{label:`Subagent activity`,working:`Subagent working`,finished:`Subagent finished`,failed:`Subagent failed`,cancelled:`Subagent cancelled`,openDetails:`Open subagent details for {title}`,moreWorking:`+{count} more working`}},sessionDiff:{title:`Changes`,show:`Show session changes`,refresh:`Refresh changes`,loading:`Loading changes…`,empty:`No changes in this session's checkout.`,notGit:`This session's workspace is not a git checkout.`,unknownSession:`No workspace is associated with this session.`,unknownCommit:`This commit is no longer available in the session checkout.`,disconnected:`Gateway is disconnected.`,allChanges:`All Changes`,uncommitted:`Uncommitted`,commitsAhead:`{count} commits ahead of {base}`,head:`HEAD`,mergeBase:`Merge Base`,scopeMenu:`Choose change scope`,sync:`Sync`,syncLocally:`Sync Locally`,syncDescription:`Run this command in a local checkout to mirror this session's committed changes.`,copyCommand:`Copy sync command`,checkoutPath:`Checkout path`,branchName:`Branch name`,uncommittedStay:`Uncommitted changes stay in the session checkout.`,viewOptions:`Change view options`,collapseAll:`Collapse All`,expandAll:`Expand All`,enableWrapping:`Enable Wrapping`,disableWrapping:`Disable Wrapping`,switchSplit:`Switch to Split Diff`,switchUnified:`Switch to Unified Diff`,fileActions:`Actions for {path}`,copyPath:`Copy Path`,openFile:`Open File`,openInEditor:`Open in Editor`,revealInFileTree:`Reveal in File Tree`,unmodifiedLines:`{count} unmodified lines`,expandPreviousLines:`Show previous {count} unmodified lines`,expandNextLines:`Show next {count} unmodified lines`,expandAllLines:`Show all {count} unmodified lines`,binaryFile:`Binary file`,untracked:`untracked`,tooLarge:`Diff too large to display.`,truncatedFile:`Diff truncated.`,truncatedResult:`Some changes were omitted because the diff is very large.`,statusAdded:`Added`,statusDeleted:`Deleted`,statusRenamed:`Renamed`,statusModified:`Modified`},sessionDiscussion:{show:`Show discussion`,hide:`Hide discussion`,disconnected:`Gateway is disconnected.`,loading:`Loading discussion…`,opening:`Opening discussion…`,requiresWriteAccess:`Operator write access is required to open this discussion.`,openExternal:`Open discussion in a new tab`,frameTitle:`Session discussion`,unavailable:`This discussion cannot be embedded.`},workspaceFiles:{label:`Session workspace`,collapse:`Collapse session workspace`,showFiles:`Show session files`,dockRight:`Dock to the right`,dockBottom:`Dock to the bottom`,workspace:`Session`,files:`Workspace`,refresh:`Refresh session workspace`,loading:`Loading session workspace…`,changed:`Changed`,read:`Read`,artifacts:`Artifacts`,browser:`Project files`,root:`Root`,search:`Search files`,searchResults:`Search results`,parentFolder:`Parent folder`,noBrowserFiles:`No files in this folder.`,noSearchResults:`No matching files.`,truncated:`Showing the first matching files. Refine the search to narrow results.`,session:`Session`,missing:`Missing`,summary:`Session workspace summary`,changedCount:`{count} changed`,readCount:`{count} read`,artifactCount:`{count} artifacts`,browserCount:`{count} shown`,actions:`Workspace file actions`,preview:`Preview`,copyPath:`Copy path`}},languages:{en:`English`,zhCN:`简体中文 (Simplified Chinese)`,zhTW:`繁體中文 (Traditional Chinese)`,ptBR:`Português (Brazilian Portuguese)`,de:`Deutsch (German)`,es:`Español (Spanish)`,jaJP:`日本語 (Japanese)`,ko:`한국어 (Korean)`,fr:`Français (French)`,hi:`हिन्दी (Hindi)`,ar:`العربية (Arabic)`,it:`Italiano (Italian)`,tr:`Türkçe (Turkish)`,uk:`Українська (Ukrainian)`,id:`Bahasa Indonesia (Indonesian)`,pl:`Polski (Polish)`,th:`ไทย (Thai)`,vi:`Tiếng Việt (Vietnamese)`,nl:`Nederlands (Dutch)`,fa:`فارسی (Persian)`,ru:`Русский (Russian)`},secretsStore:{name:`Name`,access:`Access`,accessMode:`Access mode`,value:`Value`,allowedHosts:`Allowed hosts`,allowedHostsPlaceholder:`api.example.com`,allowedHostsHint:`Exact hostnames only, one per line or comma-separated. No wildcards or ports.`,noAllowedHosts:`None`,updated:`Last updated`,by:`{time} by {name}`,actions:`Actions`,add:`Add`,edit:`Edit`,bulk:`Bulk Add`,protectedSecret:`Protected secret`,protectedSecretHint:`Hidden after save and inert unless referenced by a SecretRef or used through enabled destination-bound Gateway egress. It is never directly readable.`,agentReadable:`Agent-readable environment`,agentReadableHint:`High risk: visible to admins and plaintext to Gateway-hosted agent commands. The agent can print, transmit, or persist it. Applies from the next run.`,hint:`Choose protected, write-only secrets or intentionally agent-readable Gateway environment values.`,required:`Enter a value.`,detect:`Protect credential-like names automatically`,detected:`{count} protected secrets detected`,detectedOne:`{count} protected secret detected`,unavail:`Gateway/admin required.`,badName:`Use SERVICE_API_KEY.`,tooLarge:`Max 64 KiB.`,savedProtected:`Saved {name} as Protected secret. Add a SecretRef or enable destination-bound Gateway egress to use it.`,savedReadable:`Saved {name} as Agent-readable environment. It is available to Gateway-hosted agent commands from the next run.`,savedMany:`Saved {count} entries ({protected} protected, {readable} agent-readable). Protected secrets need a SecretRef or enabled destination-bound Gateway egress; agent-readable environment values reach Gateway-hosted agent commands from the next run.`,warnings:`{count} runtime warnings.`,partial:`{saved}/{total}: {error}`,confirmDelete:`Delete {name}?`,deleted:`Deleted {name}.`,deleteFailed:`The secret was not deleted. Reload the list and try again.`},cron:{adminRequired:`Browsing only. Automation changes require operator.admin access.`,tabs:{filterLabel:`Automation status`,all:`All`,active:`Active`,paused:`Paused`},list:{viewLabel:`Automation views`,searchPlaceholder:`Search automations`,newTask:`New automation`,filters:`Filters`,shownOf:`{shown} of {total}`,emptyTitle:`No automations yet`,emptyHint:`Describe what OpenClaw should do and when — it runs on schedule.`,noMatching:`No automations match the current filters.`,loadMore:`Load more`,loading:`Loading...`,schedulerOff:`Scheduler disabled`,refresh:`Refresh`,refreshing:`Refreshing...`,paused:`Paused`,autoDisabledRunFailures:`Auto-disabled · {count} run failures`,autoDisabledScheduleErrors:`Auto-disabled · {count} schedule errors`,tasksTab:`Automations`,activityTab:`Run history`},suggestions:{title:`Starter automations`,schedules:{weekdayMornings:`Weekdays at 9:00 AM`,everyMorning:`Daily at 8:00 AM`,weekly:`Mondays at 9:00 AM`,hourly:`Every hour`},ideas:{repoPulse:{name:`Repo pulse`,tagline:`Overnight issues, PRs, and CI failures, ranked by urgency.`,prompt:`Review overnight activity in my repositories: new issues, pull requests, and CI failures. Summarize the three things that most need my attention today, each with a link and a one-line reason.`},standupGhostwriter:{name:`Standup ghostwriter`,tagline:`Your standup update, drafted from yesterday's work.`,prompt:`Draft my standup update from yesterday's commits, merged pull requests, and open review threads. Three bullets max: done, doing, blocked.`},hackerNewsScout:{name:`Hacker News scout`,tagline:`Three links worth your coffee, with hot takes.`,prompt:`Scan today's Hacker News front page for posts about AI agents, developer tooling, and TypeScript. Send me the three most interesting links, each with a one-line hot take.`},dependencyRadar:{name:`Dependency radar`,tagline:`Outdated or vulnerable dependencies, with upgrade notes.`,prompt:`Check my main project for outdated or vulnerable dependencies. List the notable updates with a one-line risk note each, and draft the upgrade command.`},watchdog:{name:`Night watch`,tagline:`Hourly health check with a one-line verdict.`,prompt:`Check that my services and gateway are healthy: scan recent logs for new errors, restarts, or unusual load. Reply with a single short all-clear line when everything is fine; if something looks broken, report what failed and where to start looking.`},polyglotMinute:{name:`Polyglot minute`,tagline:`One useful foreign phrase with your morning coffee.`,prompt:`Teach me one useful phrase in Japanese: the phrase, how to pronounce it, its literal meaning, and when to use it. Keep it under five lines.`}}},stats:{tasks:`Automations`,failing:`Failing`,nextWake:`Next wake`},detail:{tabsLabel:`Automation details`,newTitle:`New automation`,newSubtitle:`Describe what OpenClaw should do, then pick when it runs.`,back:`All automations`,settingsTab:`Settings`,historyTitle:`Run history`,generalSection:`General`,scheduleSection:`Schedule`,deliverySection:`Delivery`,active:`Active`,paused:`Paused`},actions:{runNow:`Run now`,runIfDue:`Run if due`,pause:`Pause`,resume:`Resume`,clone:`Clone`,remove:`Remove`,removeConfirmTitle:`Remove "{name}"?`,removeConfirmMessage:`This permanently deletes the automation and stops all future runs. This action cannot be undone.`,more:`More actions`},runNotStarted:{notDue:`This automation is not due yet.`,alreadyRunning:`This automation is already running.`,recoveryPending:`Scheduler recovery is still in progress.`,invalidSpec:`This automation has an invalid schedule or payload.`,stopped:`The scheduler is stopped.`,unknown:`This automation could not be started.`},jobs:{schedule:`Schedule`,lastRun:`Last run`,all:`All`,condition:`Condition`,conditional:`Conditional`,unconditional:`Unconditional`,sort:`Sort`,nextRun:`Next run`,recentlyUpdated:`Recently updated`,name:`Name`,direction:`Direction`,ascending:`Ascending`,descending:`Descending`,reset:`Reset`},runs:{searchRuns:`Search runs`,searchPlaceholder:`Summary, error, or task`,newestFirst:`Newest first`,oldestFirst:`Oldest first`,status:`Status`,delivery:`Delivery`,clear:`Clear`,allStatuses:`All statuses`,allDelivery:`All delivery`,noMatching:`No matching runs.`,emptyTitle:`No runs yet`,emptyHint:`Runs show up here once an automation fires.`,conditionActivity:`Condition activity`,conditionActivityHint:`Checks run on schedule before the payload starts.`,checks:`Checks`,lastChecked:`Last checked`,lastFired:`Last fired`,notChecked:`Not checked yet`,neverFired:`Never`,emptyConditionTitle:`No payload runs yet`,emptyConditionHint:`The condition has been checked {count} times without matching. Run history starts when the payload executes.`,emptyConditionHintOne:`The condition has been checked once without matching. Run history starts when the payload executes.`,emptyConditionUnchecked:`The condition has not been checked yet. Run history starts when the payload executes.`,loadMore:`Load more runs`,runStatusOk:`OK`,runStatusError:`Error`,runStatusSkipped:`Skipped`,runStatusUnknown:`Unknown`,runStatusRunning:`Running`,deliveryDelivered:`Delivered`,deliveryNotDelivered:`Not delivered`,deliveryUnknown:`Unknown`,deliveryNotRequested:`Not requested`},form:{requiredSr:`required`,fieldName:`Name`,description:`Description`,agentId:`Agent`,namePlaceholder:`Morning brief`,descriptionPlaceholder:`Optional context for this task`,agentPlaceholder:`main or ops`,agentHelp:`Start typing to pick a known agent, or enter a custom one.`,promptPlaceholder:`Describe what OpenClaw should do...`,repeat:`Repeat`,repeatInterval:`Interval`,repeatOnce:`Once`,repeatOnExit:`On exit`,repeatStream:`Stream source`,onExitHelp:`Runs when a watched command exits. The schedule cannot be edited here.`,every:`Every`,at:`At`,cronOption:`Cron`,runAt:`Run at`,unit:`Unit`,minutes:`Minutes`,hours:`Hours`,days:`Days`,expression:`Expression`,expressionPlaceholder:`0 7 * * *`,everyAmountPlaceholder:`30`,summaryEverySecondOne:`Runs every second`,summaryEveryMinuteOne:`Runs every minute`,summaryEveryHourOne:`Runs every hour`,summaryEveryDayOne:`Runs every day`,summaryEverySeconds:`Runs every {amount} seconds`,summaryEveryMinutes:`Runs every {amount} minutes`,summaryEveryHours:`Runs every {amount} hours`,summaryEveryDays:`Runs every {amount} days`,summaryOnce:`Runs once at {at}`,summaryCron:`Cron schedule {expr}`,summaryCronTz:`Cron schedule {expr} ({tz})`,timezoneOptional:`Timezone`,timezonePlaceholder:`America/Los_Angeles`,timezoneHelp:`Optional. Leave blank to use the Gateway host timezone, or enter any valid IANA timezone.`,runsIn:`Runs in`,mainSession:`Main session`,isolatedSession:`Isolated session`,sessionHelp:`Main posts into the agent's timeline. Isolated runs a dedicated agent turn.`,wakeMode:`Wake mode`,now:`Now`,nextHeartbeat:`Next heartbeat`,wakeModeHelp:`Now triggers immediately. Next heartbeat waits for the next cycle.`,action:`Action`,command:`Command`,script:`Script`,readOnlyPayloadHelp:`This payload was created outside Control UI. Its contents stay read-only and are preserved when you save other changes.`,systemEvent:`Post to main timeline`,agentTurn:`Run agent task`,systemEventHelp:`Sends your text to the gateway main timeline (good for reminders).`,agentTurnHelp:`Starts an agent run in its own session using your prompt.`,timeoutSeconds:`Timeout (seconds)`,timeoutPlaceholder:`Optional, e.g. 90`,timeoutHelp:`Optional. Leave blank to use the gateway default timeout for this run.`,mainTimelineMessage:`Main timeline message`,assistantTaskPrompt:`Prompt`,deliveryModeLabel:`Mode`,announceDefault:`Announce summary`,webhookPost:`Webhook POST`,noneInternal:`None (internal)`,deliveryHelp:`Announce posts a summary to chat. None keeps execution internal.`,webhookUrl:`Webhook URL`,channel:`Channel`,webhookPlaceholder:`https://example.com/cron`,channelHelp:`Choose which connected channel receives the summary.`,webhookHelp:`Send run summaries to a webhook endpoint.`,to:`To`,toPlaceholder:`+1555... or chat id`,toHelp:`Optional recipient override (chat id, phone, or user id).`,advanced:`Advanced`,advancedHelp:`Optional condition checks, delivery guarantees, schedule jitter, and model controls.`,conditionTrigger:`Condition trigger`,conditionTriggerHelp:`Run a quiet headless check before the task and call the model only when it matches.`,triggerConfigured:`Trigger configured`,triggerScript:`Trigger script`,triggerScriptHelp:`Runs unattended with this automation's tool policy. Return json({ fire, message?, state? }); limits: 30 seconds, 5 tool calls, 16 KB state.`,triggerOnce:`Disable after first match`,triggerOnceHelp:`Disable this automation after the first successful fired task.`,triggerDisabled:`Condition triggers are disabled by cron.triggers.enabled.`,triggerDisabledConfigured:`Condition triggers are disabled. Existing configuration is preserved until you clear it.`,clearTrigger:`Clear trigger`,startEnabled:`Start enabled`,deleteAfterRun:`Delete after run`,deleteAfterRunHelp:`Best for one-shot reminders that should auto-clean up.`,clearAgentOverride:`Clear agent override`,clearAgentHelp:`Force this task to use the gateway default agent.`,sessionKey:`Session key`,sessionKeyHelp:`Optional routing key for job delivery and wake routing.`,exactTiming:`Exact timing (no stagger)`,exactTimingHelp:`Run on exact cron boundaries with no spread.`,staggerWindow:`Stagger window`,staggerUnit:`Stagger unit`,staggerPlaceholder:`30`,seconds:`Seconds`,accountId:`Account ID`,accountIdHelp:`Optional channel account ID for multi-account setups.`,lightContext:`Light context`,lightContextHelp:`Use lightweight bootstrap context for this agent job.`,model:`Model`,customModel:`Custom model…`,modelPlaceholder:`openai/gpt-5.2`,modelHelp:`Start typing to pick a known model, or enter a custom one. Routine jobs (summaries, triage, classification) run well on a lighter model — cheaper and faster than your default.`,thinking:`Reasoning`,thinkingPlaceholder:`low`,thinkingHelp:`Use a suggested level or enter a provider-specific value.`,failureAlerts:`Failure alerts`,failureAlertInherit:`Inherit global setting`,failureAlertDisabled:`Disable for this job`,failureAlertCustom:`Custom per-job settings`,failureAlertsHelp:`Control when this job sends repeated-failure alerts.`,failureAlertAfter:`Alert after`,failureAlertAfterHelp:`Consecutive errors before alerting.`,failureAlertCooldown:`Cooldown (seconds)`,failureAlertCooldownHelp:`Minimum seconds between alerts.`,failureAlertChannel:`Alert channel`,failureAlertTo:`Alert to`,failureAlertToPlaceholder:`+1555... or chat id`,failureAlertToHelp:`Optional recipient override for failure alerts.`,failureAlertMode:`Alert mode`,failureAlertAnnounce:`Announce (via channel)`,failureAlertWebhook:`Webhook (HTTP POST)`,failureAlertAccountId:`Alert account ID`,failureAlertAccountPlaceholder:`Account ID for multi-account setups`,bestEffortDelivery:`Best effort delivery`,bestEffortHelp:`Do not fail the task if delivery itself fails.`,cantAddYet:`Can't save yet`,fillRequired:`Fill the required fields below to enable submit.`,fixFields:`Fix {count} field to continue.`,fixFieldsPlural:`Fix {count} fields to continue.`,saving:`Saving...`,saveChanges:`Save changes`,createTask:`Create automation`,createAndRun:`Create & run now`,cancel:`Cancel`},jobState:{next:`Next`},runEntry:{noSummary:`No summary.`,deliverySuppression:`Delivery suppression: {reason}`,runAt:`Run at`,openRunChat:`Open run chat`,next:`Next {rel}`,due:`Due {rel}`},errors:{nameRequired:`Name is required.`,scheduleAtInvalid:`Enter a valid date/time.`,everyAmountInvalid:`Interval must be greater than 0.`,triggerIntervalTooShort:`Condition-triggered automations must run at least every 30 seconds.`,cronExprRequired:`Cron expression is required.`,staggerAmountInvalid:`Stagger must be greater than 0.`,triggerScriptRequired:`Trigger script is required when the condition trigger is enabled.`,triggerScriptPayloadUnsupported:`Script payloads cannot use condition triggers because both own the same saved state.`,triggerScheduleUnsupported:`Condition triggers require an interval, cron, or stream schedule.`,systemTextRequired:`System text is required.`,agentMessageRequired:`Agent message is required.`,timeoutInvalid:`If set, timeout must be greater than 0 seconds.`,webhookUrlRequired:`Webhook URL is required.`,webhookUrlInvalid:`Webhook URL must start with http:// or https://.`,invalidRunTime:`Invalid run time.`,invalidIntervalAmount:`Invalid interval amount.`,cronExprRequiredShort:`Cron expression required.`,invalidStaggerAmount:`Invalid stagger amount.`,systemEventTextRequired:`System event text required.`,agentMessageRequiredShort:`Agent message required.`,nameRequiredShort:`Name required.`}}}})))()}function Re(e){return e!=null&&We.includes(e)}function ze(e){return Ue.includes(e)}function Be(e){let t=e.toLowerCase();if(t.startsWith(`zh`)){let[,...e]=t.split(`-`);return e.includes(`hant`)?`zh-TW`:e.includes(`hans`)?`zh-CN`:e.some(e=>e===`tw`||e===`hk`||e===`mo`)?`zh-TW`:`zh-CN`}return Ue.find(e=>t.startsWith(e.split(`-`)[0].toLowerCase()))??`en`}async function Ve(e){return ze(e)?(await He[e]())[e.replaceAll(`-`,`_`)]??null:null}var He,Ue,We;function Ge(){return(Ge=e((()=>{s(),He={"zh-CN":()=>a(()=>import(`./zh-CN-BDyHCHaR.js`),__vite__mapDeps([0,1]),import.meta.url),"zh-TW":()=>a(()=>import(`./zh-TW-bniZU45R.js`),__vite__mapDeps([2,1]),import.meta.url),"pt-BR":()=>a(()=>import(`./pt-BR-q1CxtPN7.js`),__vite__mapDeps([3,1]),import.meta.url),de:()=>a(()=>import(`./de-CsWCVeir.js`),__vite__mapDeps([4,1]),import.meta.url),es:()=>a(()=>import(`./es-gnNoOceK.js`),__vite__mapDeps([5,1]),import.meta.url),"ja-JP":()=>a(()=>import(`./ja-JP-ofw9hrwQ.js`),__vite__mapDeps([6,1]),import.meta.url),ko:()=>a(()=>import(`./ko-EhrHl2qd.js`),__vite__mapDeps([7,1]),import.meta.url),fr:()=>a(()=>import(`./fr-C_P7mm2_.js`),__vite__mapDeps([8,1]),import.meta.url),hi:()=>a(()=>import(`./hi-CSbbtGy_.js`),__vite__mapDeps([9,1]),import.meta.url),ar:()=>a(()=>import(`./ar-DX3Bj1-2.js`),__vite__mapDeps([10,1]),import.meta.url),it:()=>a(()=>import(`./it-BO5kiNQ2.js`),__vite__mapDeps([11,1]),import.meta.url),tr:()=>a(()=>import(`./tr-kvZ06KIs.js`),__vite__mapDeps([12,1]),import.meta.url),uk:()=>a(()=>import(`./uk-zO5ZpLm2.js`),__vite__mapDeps([13,1]),import.meta.url),id:()=>a(()=>import(`./id-D2zrqmdp.js`),__vite__mapDeps([14,1]),import.meta.url),pl:()=>a(()=>import(`./pl-JXP7ECuq.js`),__vite__mapDeps([15,1]),import.meta.url),th:()=>a(()=>import(`./th-BM4ZX7It.js`),__vite__mapDeps([16,1]),import.meta.url),vi:()=>a(()=>import(`./vi-BbZwfy0a.js`),__vite__mapDeps([17,1]),import.meta.url),nl:()=>a(()=>import(`./nl-CbGcre6k.js`),__vite__mapDeps([18,1]),import.meta.url),fa:()=>a(()=>import(`./fa-BWFMf9T6.js`),__vite__mapDeps([19,1]),import.meta.url),ru:()=>a(()=>import(`./ru-C0I-R-aJ.js`),__vite__mapDeps([20,1]),import.meta.url)},Ue=Object.keys(He),We=[`en`,...Ue]})))()}function Ke(e){typeof document>`u`||(document.documentElement.lang=e,document.documentElement.dir=qe.has(e)?`rtl`:`ltr`)}var qe,Je,x,S;function Ye(){return(Ye=e((()=>{Le(),Ge(),qe=new Set([`ar`,`fa`]),Je=class{constructor(e=Ve){this.loadLocaleTranslation=e,this.locale=`en`,this.translations={en:Ie},this.subscribers=new Set,this.pendingLocale=null,this.pendingLocaleShouldPersist=!0,this.localeRequestGeneration=0,this.inFlightLocaleLoads=new Map,this.loadLocale()}readStoredLocale(){let e=fe();if(!e)return null;try{return e.getItem(`openclaw.i18n.locale`)}catch{return null}}persistLocale(e){let t=fe();if(t)try{t.setItem(`openclaw.i18n.locale`,e)}catch{}}clearPersistedLocale(){let e=fe();if(e)try{e.removeItem(`openclaw.i18n.locale`)}catch{}}resolveInitialLocale(){let e=this.readStoredLocale();return Re(e)?{locale:e,shouldPersist:!0}:{locale:Be((typeof globalThis.navigator?.language==`string`?globalThis.navigator.language:null)??``),shouldPersist:!1}}loadLocale(){let e=this.resolveInitialLocale();if(e.locale===`en`){this.locale=`en`,Ke(`en`),e.shouldPersist||this.clearPersistedLocale();return}this.applyLocale(e.locale,!1,e.shouldPersist)}getLocale(){return this.locale}getSystemLocale(){return Be((typeof globalThis.navigator?.language==`string`?globalThis.navigator.language:null)??``)}async setLocale(e){return this.applyLocale(e,!1,!0)}async useSystemLocale(){return this.applyLocale(this.getSystemLocale(),!1,!1)}loadLocaleTranslationOnce(e){let t=this.inFlightLocaleLoads.get(e);if(t)return t;let n=this.loadLocaleTranslation(e),r=()=>{this.inFlightLocaleLoads.get(e)===n&&this.inFlightLocaleLoads.delete(e)};return this.inFlightLocaleLoads.set(e,n),n.then(r,r),n}async applyLocale(e,t,n){let r=++this.localeRequestGeneration,i=e!==`en`&&!this.translations[e];if(n||this.clearPersistedLocale(),this.locale===e&&!i){this.pendingLocale=null,n&&this.persistLocale(e);return}if(i){this.pendingLocale=e,this.pendingLocaleShouldPersist=n;try{let t=await this.loadLocaleTranslationOnce(e);if(!t){this.localeRequestGeneration===r&&(this.pendingLocale=e,this.pendingLocaleShouldPersist=n);return}this.translations[e]=t}catch(i){let a=this.localeRequestGeneration===r;a&&(this.pendingLocale=e,this.pendingLocaleShouldPersist=n),t&&a&&this.localeLoadRecovery?.isUnrecoverableError(i)&&(n&&this.persistLocale(e),this.localeLoadRecovery.onUnrecoverableLocaleLoad?.(e)),console.error(`Failed to load locale: ${e}`,i);return}}this.localeRequestGeneration===r&&(this.pendingLocale=null,this.locale=e,Ke(e),n&&this.persistLocale(e),this.notify())}retryPendingLocale(){if(this.pendingLocale===null||this.pendingLocale===this.locale)return;let e=this.pendingLocale,t=this.pendingLocaleShouldPersist;this.pendingLocale=null,this.applyLocale(e,!0,t)}setLocaleLoadRecovery(e){this.localeLoadRecovery=e}registerTranslation(e,t){this.translations[e]=t}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}notify(){this.subscribers.forEach(e=>e(this.locale))}t(e,t){let n=e.split(`.`),r=this.translations[this.locale]||this.translations.en;for(let e of n)if(r&&typeof r==`object`)r=r[e];else{r=void 0;break}if(r===void 0&&this.locale!==`en`){r=this.translations.en;for(let e of n)if(r&&typeof r==`object`)r=r[e];else{r=void 0;break}}return typeof r==`string`?t?r.replace(/\{(\w+)\}/g,(e,n)=>t[n]??`{${n}}`):r:e}},x=new Je,S=(e,t)=>x.t(e,t),typeof process<`u`&&{}.VITEST&&(globalThis[Symbol.for(`openclaw.i18nManagerTestApi`)]={createI18nManager(e){return new Je(e)}})})))()}var Xe;function Ze(){return(Ze=e((()=>{Ye(),Xe=class{constructor(e){this.host=e,this.host.addController(this)}hostConnected(){this.unsubscribe?.(),this.unsubscribe=x.subscribe(()=>{this.host.requestUpdate()}),this.host.requestUpdate()}hostDisconnected(){this.unsubscribe?.(),this.unsubscribe=void 0}}})))()}function C(){return(C=e((()=>{Ye(),Ze()})))()}function w(e){return h`
<svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
${e}
</svg>
`}var Qe;function $e(){return($e=e((()=>{g(),Qe={shieldCheck:w(_`<path d="M20 13c0 5-3.5 7.5-8 9-4.5-1.5-8-4-8-9V5l8-3 8 3zM9 12l2 2 4-4" />`),shieldX:w(_`<path d="M20 13c0 5-3.5 7.5-8 9-4.5-1.5-8-4-8-9V5l8-3 8 3zM9.5 9.5l5 5m0-5-5 5" />`),cpu:w(_` <rect width="16" height="16" x="4" y="4" rx="2" />
<rect width="6" height="6" x="9" y="9" rx="1" />
<path d="M15 2v2M15 20v2M2 15h2M2 9h2M20 15h2M20 9h2M9 2v2M9 20v2" />`),foldVertical:w(_`<path d="M12 22v-6M12 8V2M4 12H2M10 12H8M16 12h-2M22 12h-2M19 9l-3 3 3 3M5 15l3-3-3-3" />`),wrench:w(_` <path
d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
/>`),fileCode:w(_` <path
d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"
/>
<polyline points="14 2 14 8 20 8" />
<path d="M10 13l-2 2 2 2M14 17l2-2-2-2" />`),edit:w(_`<path
d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"
/>`),home:w(_` <path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9 22 9 12 15 12 15 22" />`),penLine:w(_`<path d="M12 20h9M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" />`),paperclip:w(_` <path
d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"
/>`),globe:w(_` <circle cx="12" cy="12" r="10" />
<path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />
<path d="M2 12h20" />`),image:w(_` <rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
<circle cx="9" cy="9" r="2" />
<path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />`),copyImage:w(_` <rect width="14" height="14" x="8" y="8" rx="2" />
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
<circle cx="13" cy="13" r="1" />
<path d="m21 18-3-3-5 5" />`),camera:w(_` <path
d="M14.5 4 16 7h3a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h3l1.5-3z"
/>
<circle cx="12" cy="13" r="3" />`),cameraOff:w(_`<path
d="M14.564 14.558a3 3 0 1 1-4.122-4.121M2 2l20 20M20 20H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 .819-.175M9.695 4.024A2 2 0 0 1 10.004 4h3.993a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v7.344"
/>`),smartphone:w(_` <rect width="14" height="20" x="5" y="2" rx="2" ry="2" />
<path d="M12 18h.01" />`),circleQuestionMark:w(_` <circle cx="12" cy="12" r="10" />
<path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3M12 17h.01" />`),plug:w(_`<path d="M12 22v-5M9 8V2M15 8V2M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z" />`),circle:w(_`<circle cx="12" cy="12" r="10" />`),puzzle:w(_` <path
d="M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.076.874.54 1.02 1.02a2.5 2.5 0 1 0 3.237-3.237c-.48-.146-.944-.505-1.02-1.02a.98.98 0 0 1 .303-.917l1.526-1.526A2.402 2.402 0 0 1 11.998 2c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.236 3.236c-.464.18-.894.527-.967 1.02Z"
/>`),panelLeft:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M9 3v18" />`),panelLeftClose:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M9 3v18M16 10l-3 2 3 2" />`),panelLeftOpen:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M9 3v18M14 10l3 2-3 2" />`),chevronDown:w(_`<path d="M6 9l6 6 6-6" />`),chevronRight:w(_`<path d="M9 18l6-6-6-6" />`),chevronLeft:w(_`<path d="M15 18l-6-6 6-6" />`),externalLink:w(_`<path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14L21 3" />`),send:w(_`<path d="m22 2-7 20-4-9-9-4ZM22 2 11 13" />`),stop:w(_`<rect width="14" height="14" x="5" y="5" rx="1" />`),pin:w(_` <line x1="12" x2="12" y1="17" y2="22" />
<path
d="M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24Z"
/>`),pinOff:w(_` <line x1="2" x2="22" y1="2" y2="22" />
<line x1="12" x2="12" y1="17" y2="22" />
<path
d="M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0-.39.04"
/>`),download:w(_` <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<polyline points="7 10 12 15 17 10" />
<line x1="12" x2="12" y1="15" y2="3" />`),mic:w(_`<path d="M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3ZM19 10v2a7 7 0 0 1-14 0v-2M12 19v3" />`),volume2:w(_` <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" />
<path d="M15.54 8.46a5 5 0 0 1 0 7.07M19.07 4.93a10 10 0 0 1 0 14.14" />`),volumeX:w(_` <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" />
<path d="m22 9-6 6" />
<path d="m16 9 6 6" />`),bookmark:w(_`<path d="m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z" />`),plus:w(_`<path d="M5 12h14M12 5v14" />`),gitBranch:w(_` <circle cx="6" cy="5" r="2" />
<circle cx="18" cy="6" r="2" />
<circle cx="6" cy="19" r="2" />
<path d="M6 7v10M8 9h5a5 5 0 0 0 5-5" />`),gitFork:w(_` <circle cx="6" cy="6" r="3" />
<circle cx="18" cy="6" r="3" />
<circle cx="12" cy="18" r="3" />
<path d="M6 9a6 6 0 0 0 6 6M18 9a6 6 0 0 1-6 6" />`),gitPullRequest:w(_` <circle cx="6" cy="6" r="3" />
<circle cx="18" cy="18" r="3" />
<path d="M13 6h3a2 2 0 0 1 2 2v7M6 9v12" />`),gitPullRequestDraft:w(_` <circle cx="6" cy="6" r="3" />
<circle cx="18" cy="18" r="3" />
<path d="M6 9v12" />
<path d="M18 6v.01" />
<path d="M18 11v.01" />`),gitPullRequestClosed:w(_` <circle cx="6" cy="6" r="3" />
<path d="M6 9v12" />
<path d="m15 9 6 6" />
<path d="m21 9-6 6" />`),gitMerge:w(_` <circle cx="6" cy="6" r="3" />
<circle cx="18" cy="18" r="3" />
<path d="M6 21V9a9 9 0 0 0 9 9" />`),terminal:w(_` <polyline points="4 17 10 11 4 5" />
<line x1="12" x2="20" y1="19" y2="19" />`),squareTerminal:w(_` <path d="m7 11 2-2-2-2M11 13h4" />
<rect width="18" height="18" x="3" y="3" rx="2" ry="2" />`),listTree:w(_`<path d="M21 12h-8M21 6H8M21 18h-8M3 6v4c0 1.1.9 2 2 2h3M3 10v6c0 1.1.9 2 2 2h3" />`),claw:w(_` <path
d="M8.2 10 A5.2 5.2 0 1 0 8.2 20.4 A5.2 5.2 0 0 0 8.2 10 Z M10.2 20 C14.5 20.8 19 18.6 22.3 13.2 C21 12.9 19.7 12.7 18.4 12.8 L17.5 14.6 L16 12.9 L14.3 14.5 L13.5 13 L11.5 14.2 Z"
/>
<path
class="claw-icon__jaw"
d="M5.6 12.2 C5.2 5.6 10.4 1.4 15.6 2 C19.4 2.6 21.8 5.2 22.6 8.2 C20.9 7.7 19.2 7.6 17.6 7.9 L16.9 6.3 L15.2 8.5 C13.6 9.4 12.2 10.9 11.6 12.4 L6.8 13 Z"
/>`),spark:w(_` <path
d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"
/>`),lobster:h`
<svg viewBox="0 0 120 120" fill="none">
<defs>
<!-- Gradient stops read theme tokens (base.css --lobster-icon-*): the
shipped hex pair sank into dark backgrounds, so dark mode brightens
both stops while light mode keeps the original artwork. var() is
only valid in style="", not presentation attributes. -->
<linearGradient id="lob-g" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color: var(--lobster-icon-body, #ff4d4d)" />
<stop offset="100%" style="stop-color: var(--lobster-icon-shade, #991b1b)" />
</linearGradient>
</defs>
<path
d="M60 10C30 10 15 35 15 55C15 75 30 95 45 100L45 110L55 110L55 100C55 100 60 102 65 100L65 110L75 110L75 100C90 95 105 75 105 55C105 35 90 10 60 10Z"
fill="url(#lob-g)"
/>
<path d="M20 45C5 40 0 50 5 60C10 70 20 65 25 55C28 48 25 45 20 45Z" fill="url(#lob-g)" />
<path
d="M100 45C115 40 120 50 115 60C110 70 100 65 95 55C92 48 95 45 100 45Z"
fill="url(#lob-g)"
/>
<path
d="M45 15Q35 5 30 8"
style="stroke: var(--lobster-icon-body, #ff4d4d)"
stroke-width="3"
stroke-linecap="round"
/>
<path
d="M75 15Q85 5 90 8"
style="stroke: var(--lobster-icon-body, #ff4d4d)"
stroke-width="3"
stroke-linecap="round"
/>
<circle cx="45" cy="35" r="6" style="fill: var(--lobster-icon-eye, #050810)" />
<circle cx="75" cy="35" r="6" style="fill: var(--lobster-icon-eye, #050810)" />
<circle cx="46" cy="34" r="2.5" fill="#00e5cc" />
<circle cx="76" cy="34" r="2.5" fill="#00e5cc" />
</svg>
`,circleUser:w(_` <path d="M18 20a6 6 0 0 0-12 0" />
<circle cx="12" cy="10" r="4" />
<circle cx="12" cy="12" r="10" />`),bell:w(_`<path
d="M10.268 21a2 2 0 0 0 3.464 0M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"
/>`),palette:w(_` <path
d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"
/>
<circle cx="13.5" cy="6.5" r=".5" fill="currentColor" />
<circle cx="17.5" cy="10.5" r=".5" fill="currentColor" />
<circle cx="6.5" cy="12.5" r=".5" fill="currentColor" />
<circle cx="8.5" cy="7.5" r=".5" fill="currentColor" />`),flaskConical:w(_`<path
d="M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2M6.453 15h11.094M8.5 2h7"
/>`),badgeCheck:w(_` <path
d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z"
/>
<path d="m9 12 2 2 4-4" />`),refresh:w(_`<path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8M21 3v5h-5" />`),rotateCcw:w(_`<path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8M3 3v5h5" />`),trash:w(_`<path
d="M3 6h18M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2M10 11v6M14 11v6"
/>`),eye:w(_` <path
d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"
/>
<circle cx="12" cy="12" r="3" />`),eyeOff:w(_`<path
d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49M14.084 14.158a3 3 0 0 1-4.242-4.242M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143M2 2l20 20"
/>`),arrowUpDown:w(_`<path d="M21 16l-4 4-4-4M17 20V4M3 8l4-4 4 4M7 4v16" />`),panelRightOpen:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M15 3v18M10 10l-3 2 3 2" />`),panelRightClose:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M15 3v18M8 10l3 2-3 2" />`),columns2:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M12 3v18" />`),panelBottomOpen:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M3 15h18M10 8l2 3 2-3" />`),panelBottomClose:w(_` <rect x="3" y="3" width="18" height="18" rx="2" />
<path d="M3 15h18M10 11l2-3 2 3" />`),maximize:w(_` <polyline points="15 3 21 3 21 9" />
<polyline points="9 21 3 21 3 15" />
<line x1="21" x2="14" y1="3" y2="10" />
<line x1="3" x2="10" y1="21" y2="14" />`),minimize:w(_` <polyline points="4 14 10 14 10 20" />
<polyline points="20 10 14 10 14 4" />
<line x1="14" x2="21" y1="10" y2="3" />
<line x1="3" x2="10" y1="21" y2="14" />`)}})))()}function et(e){return T[e]}var T;function E(){return(E=e((()=>{g(),$e(),T={messageSquare:w(_` <path
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
/>`),messageCircleOff:w(_` <path d="m2 2 20 20" />
<path
d="M4.93 4.929a10 10 0 0 0-1.938 11.412 2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 0 0 11.302-1.989"
/>
<path d="M8.35 2.69A10 10 0 0 1 21.3 15.65" />`),layoutGrid:w(_` <rect width="7" height="7" x="3" y="3" rx="1" />
<rect width="7" height="7" x="14" y="3" rx="1" />
<rect width="7" height="7" x="14" y="14" rx="1" />
<rect width="7" height="7" x="3" y="14" rx="1" />`),barChart:w(_` <line x1="12" x2="12" y1="20" y2="10" />
<line x1="18" x2="18" y1="20" y2="4" />
<line x1="6" x2="6" y1="20" y2="16" />`),layoutDashboard:w(_` <rect width="7" height="9" x="3" y="3" rx="1" />
<rect width="7" height="5" x="14" y="3" rx="1" />
<rect width="7" height="9" x="14" y="12" rx="1" />
<rect width="7" height="5" x="3" y="16" rx="1" />`),coins:w(_` <circle cx="8" cy="8" r="6" />
<path d="M18.09 10.37A6 6 0 1 1 10.34 18" />
<path d="M7 6h1v4" />
<path d="m16.71 13.88.7.71-2.82 2.82" />`),activity:w(_` <path d="M22 12h-4l-3 9L9 3l-3 9H2" />`),clock:w(_` <circle cx="12" cy="12" r="10" />
<polyline points="12 6 12 12 16 14" />`),circleX:w(_` <circle cx="12" cy="12" r="10" />
<path d="m15 9-6 6" />
<path d="m9 9 6 6" />`),arrowUpRight:w(_` <path d="M7 17 17 7" />
<path d="M7 7h10v10" />`),link:w(_` <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" />
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />`),radio:w(_` <circle cx="12" cy="12" r="2" />
<path
d="M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"
/>`),fileText:w(_` <path
d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"
/>
<polyline points="14 2 14 8 20 8" />
<line x1="16" x2="8" y1="13" y2="13" />
<line x1="16" x2="8" y1="17" y2="17" />
<line x1="10" x2="8" y1="9" y2="9" />`),file:w(_` <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<polyline points="14 2 14 8 20 8" />`),fileDiff:w(_` <path
d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.7.71l3.59 3.58A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"
/>
<path d="M9 10h6" />
<path d="M12 13V7" />
<path d="M9 17h6" />`),diff:w(_` <path d="M12 3v14" />
<path d="M5 10h14" />
<path d="M5 21h14" />`),braces:w(_` <path
d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1"
/>
<path d="M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1" />`),mail:w(_` <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" />
<polyline points="22,6 12,13 2,6" />`),outbox:w(_` <polyline points="22 12 16 12 14 15 10 15 8 12 2 12" />
<path d="M2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6" />
<path d="M12 10V3" />
<path d="m8 6 4-4 4 4" />`),inbox:w(_` <polyline points="22 12 16 12 14 15 10 15 8 12 2 12" />
<path d="m5.45 5.11-3.45 6.89v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89a2 2 0 0 0-1.79-1.11h-9.52a2 2 0 0 0-1.79 1.11z" />`),star:w(_`<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />`),wandSparkles:w(_` <path d="M15 4V2" />
<path d="M15 16v-2" />
<path d="M8 9h2" />
<path d="M20 9h2" />
<path d="M17.8 11.8 19 13" />
<path d="M15 9h0" />
<path d="M17.8 6.2 19 5" />
<path d="m3 21 9-9" />
<path d="M12.2 6.2 11 5" />`),chrome:w(_` <circle cx="12" cy="12" r="10" />
<circle cx="12" cy="12" r="4" />
<line x1="21.17" y1="8" x2="12" y2="8" />
<line x1="3.95" y1="6.06" x2="8.54" y2="14" />
<line x1="10.88" y1="21.94" x2="15.46" y2="14" />`),panelsTopLeft:w(_` <rect x="3" y="3" width="18" height="18" rx="2" ry="2" />
<line x1="3" y1="9" x2="21" y2="9" />
<line x1="9" y1="21" x2="9" y2="9" />`),box:w(_` <path
d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"
/>
<polyline points="3.27 6.96 12 12.01 20.73 6.96" />
<line x1="12" y1="22.08" x2="12" y2="12" />`),music:w(_` <path d="M9 18V5l12-2v13" />
<circle cx="6" cy="18" r="3" />
<circle cx="18" cy="16" r="3" />`),asterisk:w(_` <path d="M12 2v6" />
<path d="m4.93 10.93 4.24 4.24" />
<path d="M2 12h6" />
<path d="m4.93 13.07 4.24-4.24" />
<path d="M12 22v-6" />
<path d="m19.07 13.07-4.24-4.24" />
<path d="M22 12h-6" />
<path d="m19.07 10.93-4.24 4.24" />`),zap:w(_`<polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" />`),monitor:w(_` <rect width="20" height="14" x="2" y="3" rx="2" />
<line x1="8" x2="16" y1="21" y2="21" />
<line x1="12" x2="12" y1="17" y2="21" />`),monitorSmartphone:w(_` <path
d="M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8"
/>
<path d="M10 19v-3.96 3.15" />
<path d="M7 19h5" />
<rect width="6" height="10" x="16" y="12" rx="2" />`),server:w(_` <rect width="20" height="8" x="2" y="2" rx="2" ry="2" />
<rect width="20" height="8" x="2" y="14" rx="2" ry="2" />
<line x1="6" x2="6.01" y1="6" y2="6" />
<line x1="6" x2="6.01" y1="18" y2="18" />`),sun:w(_` <circle cx="12" cy="12" r="4" />
<path d="M12 2v2" />
<path d="M12 20v2" />
<path d="m4.93 4.93 1.41 1.41" />
<path d="m17.66 17.66 1.41 1.41" />
<path d="M2 12h2" />
<path d="M20 12h2" />
<path d="m6.34 17.66-1.41 1.41" />
<path d="m19.07 4.93-1.41 1.41" />`),moon:w(_` <path d="M12 3a6.5 6.5 0 0 0 9 9 9 9 0 1 1-9-9Z" />`),settings:w(_` <path
d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"
/>
<circle cx="12" cy="12" r="3" />`),bug:w(_` <path d="m8 2 1.88 1.88" />
<path d="M14.12 3.88 16 2" />
<path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1" />
<path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6" />
<path d="M12 20v-9" />
<path d="M6.53 9C4.6 8.8 3 7.1 3 5" />
<path d="M6 13H2" />
<path d="M3 21c0-2.1 1.7-3.9 3.8-4" />
<path d="M20.97 5c0 2.1-1.6 3.8-3.5 4" />
<path d="M22 13h-4" />
<path d="M17.2 17c2.1.1 3.8 1.9 3.8 4" />`),scrollText:w(_` <path
d="M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4"
/>
<path d="M19 17V5a2 2 0 0 0-2-2H4" />
<path d="M15 8h-5" />
<path d="M15 12h-5" />`),folder:w(_` <path
d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"
/>`),kanban:w(_` <rect width="18" height="18" x="3" y="3" rx="2" />
<path d="M8 7v7" />
<path d="M12 7v4" />
<path d="M16 7v9" />`),bot:w(_` <path d="M12 8V4H8" />
<rect width="16" height="12" x="4" y="8" rx="2" />
<path d="M2 14h2" />
<path d="M20 14h2" />
<path d="M15 13v2" />
<path d="M9 13v2" />`),users:w(_` <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M22 21v-2a4 4 0 0 0-3-3.87" />
<path d="M16 3.13a4 4 0 0 1 0 7.75" />`),shieldQuestion:w(_` <path
d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
/>
<path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3" />
<path d="M12 17h.01" />`),shield:w(_` <path
d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
/>`),shieldEllipsis:w(_` <path
d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
/>
<path d="M8 12h.01" /><path d="M12 12h.01" /><path d="M16 12h.01" />`),shieldLock:w(_` <path
d="M20 9.807V6a1 1 0 0 0-1-1c-2 0-4.49-1.19-6.24-2.72a1.17 1.17 0 0 0-1.52 0C9.5 3.8 7 5 5 5a1 1 0 0 0-1 1v7c0 3.88 2.107 6.254 5 7.796"
/>
<path d="M19 17v-2a2 2 0 0 0-4 0v2" />
<rect x="13" y="17" width="8" height="5" rx="1" />`),shieldCog:w(_` <path d="m10.929 14.467-.383.924" />
<path d="M10.929 8.923 10.546 8" />
<path d="M13.225 8.923 13.608 8" />
<path d="m13.607 15.391-.382-.924" />
<path d="m14.849 10.547.923-.383" />
<path d="m14.849 12.843.923.383" />
<path
d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
/>
<path d="m9.305 10.547-.923-.383" />
<path d="m9.305 12.843-.923.383" />
<circle cx="12.077" cy="11.695" r="3" />`),shieldAlert:w(_` <path
d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
/>
<path d="M12 8v4" />
<path d="M12 16h.01" />`),menu:w(_` <line x1="4" x2="20" y1="12" y2="12" />
<line x1="4" x2="20" y1="6" y2="6" />
<line x1="4" x2="20" y1="18" y2="18" />`),x:w(_` <path d="M18 6 6 18" />
<path d="m6 6 12 12" />`),check:w(_`<path d="M20 6 9 17l-5-5" />`),info:w(_`<circle cx="12" cy="12" r="10" /><path d="M12 16v-4" /><path d="M12 8h.01" />`),square:w(_`<rect width="18" height="18" x="3" y="3" rx="2" />`),play:w(_`<polygon points="6 3 20 12 6 21 6 3" />`),pause:w(_` <rect x="14" y="4" width="4" height="16" rx="1" />
<rect x="6" y="4" width="4" height="16" rx="1" />`),target:w(_` <circle cx="12" cy="12" r="10" />
<circle cx="12" cy="12" r="6" />
<circle cx="12" cy="12" r="2" />`),switchCamera:w(_` <path d="M11 19H6.5a4.5 4.5 0 0 1 0-9H8" />
<path d="m8 16 3 3-3 3" />
<path d="M13 5h4.5a4.5 4.5 0 0 1 0 9H16" />
<path d="m16 8-3-3 3-3" />`),archive:w(_` <rect width="20" height="5" x="2" y="3" rx="1" />
<path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" />
<path d="M10 12h4" />`),archiveRestore:w(_` <rect width="20" height="5" x="2" y="3" rx="1" />
<path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" />
<path d="m9 15 3-3 3 3" />
<path d="M12 12v6" />`),alertTriangle:w(_` <path
d="m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
/>
<path d="M12 9v4" />
<path d="M12 17h.01" />`),globeOff:w(_` <path
d="M10.114 4.462A14.5 14.5 0 0 1 12 2a10 10 0 0 1 9.313 13.643"
/>
<path d="M15.557 15.556A14.5 14.5 0 0 1 12 22 10 10 0 0 1 4.929 4.929" />
<path d="M15.892 10.234A14.5 14.5 0 0 0 12 2a10 10 0 0 0-3.643.687" />
<path d="M17.656 12H22" />
<path d="M19.071 19.071A10 10 0 0 1 12 22 14.5 14.5 0 0 1 8.44 8.45" />
<path d="M2 12h10" />
<path d="m2 2 20 20" />`),hand:w(_` <path d="M18 11V6a2 2 0 0 0-4 0v5" />
<path d="M14 10V4a2 2 0 0 0-4 0v6" />
<path d="M10 10.5V6a2 2 0 0 0-4 0v8" />
<path d="M6 14v-2a2 2 0 0 0-4 0v4c0 4.4 3.6 8 8 8h2c4.4 0 8-3.6 8-8v-5a2 2 0 0 0-4 0v2" />`),key:w(_` <circle cx="7.5" cy="15.5" r="5.5" />
<path d="m21 2-9.6 9.6" />
<path d="m15.5 7.5 3 3L22 7l-3-3" />`),flag:w(_` <path d="M5 22V4" />
<path d="M5 4c5-4 9 4 14 0v11c-5 4-9-4-14 0" />`),lock:w(_` <rect width="18" height="11" x="3" y="11" rx="2" />
<path d="M7 11V7a5 5 0 0 1 10 0v4" />`),pencil:w(_` <path
d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"
/>
<path d="m15 5 4 4" />`),pipette:w(_` <path
d="m12 9-8.414 8.414A2 2 0 0 0 3 18.828v1.344a2 2 0 0 1-.586 1.414A2 2 0 0 1 3.828 21h1.344a2 2 0 0 0 1.414-.586L15 12"
/>
<path
d="m18 9 .4.4a1 1 0 1 1-3 3l-3.8-3.8a1 1 0 1 1 3-3l.4.4 3.4-3.4a1 1 0 1 1 3 3z"
/>
<path d="m2 22 .414-.414" />`),pencilSparkles:w(_` <path d="M10 3H8" />
<path d="m15.007 5.008 3.987 3.986" />
<path d="M20 15v4" />
<path
d="M21.174 6.813a2.82 2.82 0 0 0-3.986-3.987L3.842 16.175a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"
/>
<path d="M22 17h-4" />
<path d="M4 5v4" />
<path d="M6 7H2" />
<path d="M9 2v2" />`),hourglass:w(_` <path d="M5 22h14" />
<path d="M5 2h14" />
<path d="M17 22v-4.2a4 4 0 0 0-1.2-2.8L12 11l-3.8 4A4 4 0 0 0 7 17.8V22" />
<path d="M7 2v4.2A4 4 0 0 0 8.2 9l3.8 4 3.8-4A4 4 0 0 0 17 6.2V2" />`),layoutComfortable:w(_` <rect width="16" height="5" x="4" y="4" rx="1.5" />
<rect width="16" height="5" x="4" y="15" rx="1.5" />
<line x1="7" x2="16" y1="7" y2="7" />
<line x1="7" x2="16" y1="18" y2="18" />`),layoutCompact:w(_` <rect width="16" height="3" x="4" y="4" rx="1" />
<rect width="16" height="3" x="4" y="9" rx="1" />
<rect width="16" height="3" x="4" y="14" rx="1" />
<rect width="16" height="3" x="4" y="19" rx="1" />`),listFilter:w(_` <path d="M3 6h18" />
<path d="M7 12h10" />
<path d="M10 18h4" />`),gripVertical:w(_` <circle cx="9" cy="6" r="1.1" fill="currentColor" stroke="none" />
<circle cx="9" cy="12" r="1.1" fill="currentColor" stroke="none" />
<circle cx="9" cy="18" r="1.1" fill="currentColor" stroke="none" />
<circle cx="15" cy="6" r="1.1" fill="currentColor" stroke="none" />
<circle cx="15" cy="12" r="1.1" fill="currentColor" stroke="none" />
<circle cx="15" cy="18" r="1.1" fill="currentColor" stroke="none" />`),arrowDown:w(_`<path d="M12 5v14m7-7-7 7-7-7" />`),arrowUp:w(_`<path d="M12 19V5m-7 7 7-7 7 7" />`),audioLines:w(_`<path d="M2 10v3" />
<path d="M6 6v11" />
<path d="M10 3v18" />
<path d="M14 8v7" />
<path d="M18 5v13" />
<path d="M22 10v3" />`),chevronUp:w(_`<path d="m18 15-6-6-6 6" />`),chevronsUpDown:w(_`<path d="m7 15 5 5 5-5" />
<path d="m7 9 5-5 5 5" />`),arrowLeft:w(_` <path d="m12 19-7-7 7-7" />
<path d="M19 12H5" />`),cornerDownLeft:w(_` <polyline points="9 10 4 15 9 20" />
<path d="M20 4v7a4 4 0 0 1-4 4H4" />`),cornerDownRight:w(_` <polyline points="15 10 20 15 15 20" />
<path d="M4 4v7a4 4 0 0 0 4 4h12" />`),copy:w(_` <rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />`),search:w(_` <circle cx="11" cy="11" r="8" />
<path d="m21 21-4.3-4.3" />`),brain:w(_` <path
d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"
/>
<path
d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"
/>
<path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4" />
<path d="M17.599 6.5a3 3 0 0 0 .399-1.375" />
<path d="M6.003 5.125A3 3 0 0 0 6.401 6.5" />
<path d="M3.477 10.896a4 4 0 0 1 .585-.396" />
<path d="M19.938 10.5a4 4 0 0 1 .585.396" />
<path d="M6 18a4 4 0 0 1-1.967-.516" />
<path d="M19.967 17.484A4 4 0 0 1 18 18" />`),book:w(_` <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20" />`),loader:w(_` <path d="M12 2v4" />
<path d="m16.2 7.8 2.9-2.9" />
<path d="M18 12h4" />
<path d="m16.2 16.2 2.9 2.9" />
<path d="M12 18v4" />
<path d="m4.9 19.1 2.9-2.9" />
<path d="M2 12h4" />
<path d="m4.9 4.9 2.9 2.9" />`),calendarClock:w(_` <path
d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"
/>
<path d="M16 2v4" />
<path d="M8 2v4" />
<path d="M3 10h5" />
<path d="M17.5 17.5 16 16.3V14" />
<circle cx="16" cy="16" r="6" />`),listChecks:w(_` <path d="m3 17 2 2 4-4" />
<path d="m3 7 2 2 4-4" />
<path d="M13 6h8" />
<path d="M13 12h8" />
<path d="M13 18h8" />`),moreHorizontal:w(_` <circle cx="5" cy="12" r="1" />
<circle cx="12" cy="12" r="1" />
<circle cx="19" cy="12" r="1" />`),...Qe}})))()}function tt(e){return e.replace(/\s+/g,` `).trim()}function nt(e){return typeof e==`object`&&!!e&&`namespaceURI`in e&&(e.namespaceURI===`http://www.w3.org/1999/xhtml`||e.namespaceURI===`http://www.w3.org/2000/svg`)}function rt(e){return e.nodeType===Node.ELEMENT_NODE}function it(e,t){let n=e.ownerDocument.defaultView?.getComputedStyle(e);if(e.hasAttribute(`hidden`)||!t&&e.getAttribute(`aria-hidden`)===`true`||n?.display===`none`||n?.contentVisibility===`hidden`)return``;let r=n?.visibility!==`hidden`&&n?.visibility!==`collapse`&&(n?.display===`contents`||typeof e.checkVisibility!=`function`||e.checkVisibility({checkOpacity:t,checkVisibilityCSS:!0}));return[...e.childNodes].map(e=>rt(e)?it(e,t):e.nodeType===Node.TEXT_NODE&&r?e.textContent??``:``).join(` `)}function at(e){return it(e,!1)}function ot(e){return e.matches(`[data-tooltip-overflow]`)||e.scrollWidth>e.clientWidth||e.scrollHeight>e.clientHeight}function st(e,t){let n=tt(e),r=tt(it(t,!0));if(!n||!r.includes(n)||ot(t))return!1;for(let e of t.querySelectorAll(`*`))if(nt(e)&&ot(e))return!1;return!0}function ct(){return`openclaw-tooltip-${++pt}`}var lt,ut,dt,ft,pt,mt,D;function O(){return(O=e((()=>{u(),g(),v(),p(),lt=`a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])`,ut=150,dt=300,ft=100,pt=0,mt=class extends ve{constructor(...e){super(...e),this.delay=ut,this.skipDelay=dt,this.delayed=!0,this.focusInput=`keyboard`,this.skipDelayTimer=null,this.handleDocumentKeyDown=e=>{[`Alt`,`Control`,`Meta`,`Shift`].includes(e.key)||(this.focusInput=`keyboard`)},this.handleDocumentPointerDown=()=>{this.focusInput=`pointer`}}connectedCallback(){super.connectedCallback(),this.style.display=`contents`,this.focusInput=`keyboard`,this.ownerDocument.addEventListener(`keydown`,this.handleDocumentKeyDown,!0),this.ownerDocument.addEventListener(`pointerdown`,this.handleDocumentPointerDown,!0)}disconnectedCallback(){this.ownerDocument.removeEventListener(`keydown`,this.handleDocumentKeyDown,!0),this.ownerDocument.removeEventListener(`pointerdown`,this.handleDocumentPointerDown,!0),D.closeForProvider(this),this.clearSkipDelayTimer(),this.delayed=!0,super.disconnectedCallback()}focusOpensTooltip(){return this.focusInput===`keyboard`}openTooltip(){this.delayed=!1,this.clearSkipDelayTimer()}closeTooltip(){if(this.clearSkipDelayTimer(),this.skipDelay<=0){this.delayed=!0;return}this.skipDelayTimer=window.setTimeout(()=>{this.skipDelayTimer=null,this.delayed=!0},this.skipDelay)}clearSkipDelayTimer(){this.skipDelayTimer!==null&&(window.clearTimeout(this.skipDelayTimer),this.skipDelayTimer=null)}render(){return h`<slot></slot>`}},l([y({type:Number})],mt.prototype,`delay`,void 0),l([y({type:Number})],mt.prototype,`skipDelay`,void 0),D=class e extends ve{constructor(...e){super(...e),this.content=``,this.closeDelay=ft,this.describe=!0,this.disabled=!1,this.openOnClick=!1,this.anchor=null,this.triggerElement=null,this.pinned=!1,this.describedElement=null,this.openTimer=null,this.closeTimer=null,this.triggerHovered=!1,this.contentHovered=!1,this.describedBy=null,this.descriptionCaptured=!1,this.descriptionElement=null,this.richContentObserver=null,this.tooltipProvider=null,this.tooltipId=ct(),this.descriptionId=`${this.tooltipId}-description`,this.handlePointerEnter=e=>{(!(`pointerType`in e)||e.pointerType!==`touch`)&&(this.triggerHovered=!0,this.clearCloseTimer(),this.scheduleOpen())},this.handlePointerLeave=e=>{(!(`pointerType`in e)||e.pointerType!==`touch`)&&(this.triggerHovered=!1,this.clearTimers(!1),this.maybeClose())},this.handleContentPointerEnter=e=>{e.pointerType!==`touch`&&(this.contentHovered=!0,this.clearCloseTimer(),this.show())},this.handleContentPointerLeave=e=>{e.pointerType!==`touch`&&(this.contentHovered=!1,this.maybeClose())},this.handlePointerDown=()=>{this.openOnClick||this.close()},this.handlePointerCancel=()=>{this.close()},this.handleFocusIn=()=>{this.tooltipProvider?.focusOpensTooltip()!==!1&&this.show()},this.handleFocusOut=e=>{e instanceof FocusEvent&&e.relatedTarget instanceof Node&&this.containsInteractionTarget(e.relatedTarget)||this.pinned||this.triggerHovered||this.contentHovered||this.close()},this.handleClick=()=>{if(this.openOnClick&&!this.pinned){this.show(),this.pinned=this.webAwesomeTooltip?.open===!0;return}this.close()},this.handleDocumentDismiss=e=>{e.composedPath().some(e=>e===this||e===this.triggerElement)||this.close()},this.handleContentSlotChange=()=>{this.observeRichContent(),this.syncDescription(),this.tooltipText||this.close()}}static{this.activeByDocument=new WeakMap}static closeForProvider(t){let n=e.activeByDocument.get(t.ownerDocument);n?.tooltipProvider===t&&n.close()}static{this.styles=b`
:host {
display: contents;
}
wa-tooltip {
--max-width: var(--openclaw-tooltip-max-width, min(260px, calc(100vw - 16px)));
--wa-tooltip-arrow-size: var(--openclaw-tooltip-arrow-size, 0px);
--wa-tooltip-background-color: var(
--openclaw-tooltip-background-color,
color-mix(in srgb, var(--bg-elevated) 97%, var(--text) 3%)
);
--wa-tooltip-border-color: var(
--openclaw-tooltip-border-color,
var(--overlay-border, var(--border-strong))
);
--wa-tooltip-border-width: 1px;
--wa-tooltip-border-style: solid;
--wa-tooltip-content-color: var(--text);
--wa-tooltip-border-radius: var(--openclaw-tooltip-border-radius, var(--radius-md));
--show-duration: var(--openclaw-tooltip-popup-show-duration, var(--wa-transition-fast));
--hide-duration: var(--openclaw-tooltip-popup-hide-duration, var(--wa-transition-fast));
font-family: var(--font-body);
}
wa-tooltip::part(body) {
padding: var(--openclaw-tooltip-padding, 5px 7px);
box-shadow: var(--openclaw-tooltip-shadow, var(--overlay-shadow, var(--shadow-md)));
font-size: 11px;
font-weight: 500;
line-height: 1.25;
overflow-wrap: anywhere;
}
:host(.sidebar-hover-tooltip) wa-tooltip[open]::part(base__popup) {
animation: var(--openclaw-tooltip-open-animation);
}
@media (prefers-reduced-motion: reduce) {
wa-tooltip {
--show-duration: 0ms;
--hide-duration: 0ms;
}
:host(.sidebar-hover-tooltip) wa-tooltip[open]::part(base__popup) {
animation: none;
}
}
@keyframes openclaw-tooltip-hover-card-in {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
.tooltip-content {
display: block;
text-align: center;
white-space: pre-line;
}
.tooltip-rich-content {
display: block;
pointer-events: auto;
text-align: left;
}
`}connectedCallback(){super.connectedCallback(),this.style.display=`contents`}updated(){this.attachTrigger(),this.syncDescription(),this.syncWebAwesomeTooltip(),(this.disabled||!this.tooltipText||this.isRedundant())&&this.close()}disconnectedCallback(){this.close(),this.richContentObserver?.disconnect(),this.richContentObserver=null,this.tooltipProvider=null,this.detachTrigger(),super.disconnectedCallback()}attachTrigger(){let e=this.renderRoot.querySelector(`slot:not([name])`),t=this.anchor??e?.assignedElements({flatten:!0}).find(nt);if(t===this.triggerElement||(this.close(),this.detachTrigger(),!t))return;this.triggerElement=t,this.tooltipProvider=null;let n=t;for(;n;){let e=n.closest(`openclaw-tooltip-provider`);if(e){this.tooltipProvider=e;break}let t=n.getRootNode();n=t instanceof ShadowRoot?t.host:null}t.addEventListener(`pointerenter`,this.handlePointerEnter),t.addEventListener(`pointerleave`,this.handlePointerLeave),t.addEventListener(`pointerdown`,this.handlePointerDown),t.addEventListener(`pointercancel`,this.handlePointerCancel),t.addEventListener(`focusin`,this.handleFocusIn),t.addEventListener(`focusout`,this.handleFocusOut),t.addEventListener(`click`,this.handleClick,!0),this.observeRichContent(),this.syncDescription(),this.syncWebAwesomeTooltip()}detachTrigger(){let e=this.triggerElement;e&&(e.removeEventListener(`pointerenter`,this.handlePointerEnter),e.removeEventListener(`pointerleave`,this.handlePointerLeave),e.removeEventListener(`pointerdown`,this.handlePointerDown),e.removeEventListener(`pointercancel`,this.handlePointerCancel),e.removeEventListener(`focusin`,this.handleFocusIn),e.removeEventListener(`focusout`,this.handleFocusOut),e.removeEventListener(`click`,this.handleClick,!0),this.restoreDescription(),this.triggerElement=null)}previewForAnchor(e,t,n){this.anchor=e,this.content=t,this.updateComplete.then(()=>{this.anchor!==e||!e.isConnected||!this.isConnected||(n===`focus`?this.handleFocusIn():(this.triggerHovered=!0,this.scheduleOpen()))})}syncWebAwesomeTooltip(){let e=this.webAwesomeTooltip;if(!e)return;e.showDelay=0,e.hideDelay=0;let t=this.triggerElement;e.updateComplete.then(()=>{this.webAwesomeTooltip===e&&this.triggerElement===t&&(e.anchor=t)})}scheduleOpen(){if(this.disabled||this.webAwesomeTooltip?.open||this.openTimer!==null)return;let e=this.tooltipProvider,t=this.delay===void 0&&e?.delayed===!1?0:Math.max(0,this.delay??e?.delay??ut);this.openTimer=window.setTimeout(()=>{this.openTimer=null,this.show()},t)}show(){let t=this.webAwesomeTooltip;if(this.disabled||!t||!this.triggerElement||!this.tooltipText||this.isRedundant())return;this.clearTimers(!1);let n=e.activeByDocument.get(this.ownerDocument);n&&n!==this&&n.close(),e.activeByDocument.set(this.ownerDocument,this),this.tooltipProvider?.openTooltip(),this.syncDescription(),t.open=!0,this.setAttribute(`open`,``),this.ownerDocument.addEventListener(`pointerdown`,this.handleDocumentDismiss,!0),this.ownerDocument.addEventListener(`focusin`,this.handleDocumentDismiss,!0)}containsInteractionTarget(e){return this.contains(e)||this.triggerElement?.contains(e)===!0}close(){this.pinned=!1,this.removeAttribute(`open`),this.ownerDocument.removeEventListener(`pointerdown`,this.handleDocumentDismiss,!0),this.ownerDocument.removeEventListener(`focusin`,this.handleDocumentDismiss,!0),this.clearTimers(),this.webAwesomeTooltip?.open&&(this.webAwesomeTooltip.open=!1),e.activeByDocument.get(this.ownerDocument)===this&&(e.activeByDocument.delete(this.ownerDocument),this.tooltipProvider?.closeTooltip())}isRedundant(){if(this.richContentText)return!1;let e=this.triggerElement;return e?st(this.content,e):!1}resolveDescribedElement(){let e=this.triggerElement;return e?e.matches(lt)?e:e.querySelector(lt)??e:null}syncDescription(){if(!this.describe){this.restoreDescription();return}let e=this.resolveDescribedElement();if(!e)return;this.describedElement=e;let t=e.getAttribute(`aria-describedby`);if(this.descriptionCaptured||=(this.describedBy=t,!0),!this.descriptionElement){let t=this.ownerDocument.createElement(`span`);t.id=this.descriptionId,t.hidden=!0;let n=e.getRootNode();(n instanceof ShadowRoot?n:this).append(t),this.descriptionElement=t}this.descriptionElement.textContent=this.tooltipText;let n=new Set((t??``).split(/\s+/u).filter(Boolean));n.add(this.descriptionId),e.setAttribute(`aria-describedby`,[...n].join(` `))}restoreDescription(){let e=this.describedElement??this.triggerElement;e&&(this.describedBy?e.setAttribute(`aria-describedby`,this.describedBy):e.removeAttribute(`aria-describedby`),this.describedElement=null,this.descriptionElement?.remove(),this.descriptionElement=null,this.describedBy=null,this.descriptionCaptured=!1)}clearCloseTimer(){this.closeTimer!==null&&(window.clearTimeout(this.closeTimer),this.closeTimer=null)}shouldRemainOpen(){let e=this.triggerElement?.getRootNode(),t=e instanceof ShadowRoot?e.activeElement:this.ownerDocument.activeElement;return this.pinned||this.triggerHovered||this.contentHovered||t instanceof Node&&this.containsInteractionTarget(t)}maybeClose(){if(this.clearCloseTimer(),!this.shouldRemainOpen()){if(!this.richContentText){this.close();return}this.closeTimer=window.setTimeout(()=>{this.closeTimer=null,this.shouldRemainOpen()||this.close()},this.closeDelay)}}clearTimers(e=!0){this.openTimer!==null&&(window.clearTimeout(this.openTimer),this.openTimer=null),this.clearCloseTimer(),e&&(this.triggerHovered=!1,this.contentHovered=!1)}get richContentText(){return tt(this.renderRoot.querySelector(`slot[name="content"]`)?.assignedNodes({flatten:!0}).map(e=>e.textContent??``).join(` `)??``)}get tooltipText(){return this.richContentText||this.content}observeRichContent(){this.richContentObserver?.disconnect(),this.richContentObserver??=new MutationObserver(()=>this.syncDescription());let e=this.renderRoot.querySelector(`slot[name="content"]`);for(let t of e?.assignedNodes({flatten:!0})??[])this.richContentObserver.observe(t,{characterData:!0,childList:!0,subtree:!0})}render(){return h`
<slot @slotchange=${()=>this.attachTrigger()}></slot>
<wa-tooltip id=${this.tooltipId} trigger="manual" @wa-hide=${()=>this.close()}>
<span class="tooltip-content">${this.content}</span>
<span
class="tooltip-rich-content"
@pointerenter=${this.handleContentPointerEnter}
@pointerleave=${this.handleContentPointerLeave}
@focusin=${this.handleFocusIn}
@focusout=${this.handleFocusOut}
>
<slot name="content" @slotchange=${this.handleContentSlotChange}></slot>
</span>
</wa-tooltip>
`}},l([y()],D.prototype,`content`,void 0),l([y({type:Number})],D.prototype,`closeDelay`,void 0),l([y({type:Number})],D.prototype,`delay`,void 0),l([y({type:Boolean})],D.prototype,`describe`,void 0),l([y({type:Boolean})],D.prototype,`disabled`,void 0),l([y({type:Boolean,attribute:`open-on-click`})],D.prototype,`openOnClick`,void 0),l([y({attribute:!1})],D.prototype,`anchor`,void 0),l([xe(`wa-tooltip`)],D.prototype,`webAwesomeTooltip`,void 0),customElements.get(`openclaw-tooltip-provider`)||customElements.define(`openclaw-tooltip-provider`,mt),customElements.get(`openclaw-tooltip`)||customElements.define(`openclaw-tooltip`,D)})))()}var k;function ht(){return(ht=e((()=>{g(),v(),ke(),Ce(),C(),p(),E(),O(),k=class extends oe{constructor(...e){super(...e),this.navDrawerOpen=!1,this.resourceBasePath=``,this.environment=null}render(){let e=this.navDrawerOpen?S(`nav.collapse`):S(`nav.expand`);return h`
<header class="topbar">
<div class="topnav-shell">
<openclaw-tooltip .content=${e}>
<button
type="button"
class="topbar-icon-btn topbar-nav-toggle"
@click=${e=>this.onToggleDrawer(e.currentTarget)}
aria-label=${e}
aria-expanded=${String(this.navDrawerOpen)}
>
<span class="nav-collapse-toggle__icon" aria-hidden="true">${T.menu}</span>
</button>
</openclaw-tooltip>
<!-- The Mac app used to float a native drag strip over this brand
row; the web now asks the host to move the window itself. -->
<div class="topnav-shell__content" @mousedown=${Se}>
<div class="topbar-brand" aria-label="OpenClaw">
<img
class="topbar-brand__logo"
src=${Ee(`apple-touch-icon.png`,this.resourceBasePath)}
alt=""
aria-hidden="true"
/>
<span class="topbar-brand__title">OpenClaw</span>
${this.environment&&h`<span class="control-ui-environment-pill">${this.environment.label}</span>`}
</div>
</div>
<div class="topnav-shell__actions">
<openclaw-tooltip .content=${S(`chat.commandPaletteTitle`)}>
<button
class="topbar-search"
@click=${this.onOpenPalette}
aria-label=${S(`chat.openCommandPalette`)}
>
${T.search}
</button>
</openclaw-tooltip>
</div>
</div>
</header>
`}},l([y({attribute:!1})],k.prototype,`navDrawerOpen`,void 0),l([y({attribute:!1})],k.prototype,`resourceBasePath`,void 0),l([y({attribute:!1})],k.prototype,`environment`,void 0),l([y({attribute:!1})],k.prototype,`onToggleDrawer`,void 0),l([y({attribute:!1})],k.prototype,`onOpenPalette`,void 0),customElements.get(`openclaw-app-topbar`)||customElements.define(`openclaw-app-topbar`,k)})))()}function gt(e,t){_t.delete(e),t&&_t.add(e)}var _t,A;function vt(){return(vt=e((()=>{i(),g(),v(),p(),_t=document.openClawModalLayers??=new Set,A=class extends ve{constructor(...e){super(...e),this.open=!0,this.manual=!1,this.label=``,this.description=``,this.returnFocus=null,this.syncGeneration=0,this.suppressNextCancel=!1,this.handleInitialFocus=e=>{if(e.target!==e.currentTarget||!this.isConnected)return;let t=this.getRootNode(),n=t instanceof ShadowRoot?t.activeElement:this.ownerDocument.activeElement;if(n instanceof HTMLElement&&n!==this&&this.contains(n))return;let r=e instanceof FocusEvent?e.relatedTarget:null;(r instanceof HTMLElement&&this.contains(r)?r:this.querySelector(`[autofocus]`))?.focus({preventScroll:!0})},this.handleAfterHide=e=>{if(e.target!==e.currentTarget)return;let t=this.returnFocusOverride,n=this.returnFocus;this.returnFocusOverride=void 0,this.open=!1,this.returnFocus=null,t!==void 0&&setTimeout(()=>{t===null?n&&document.activeElement===n&&n.blur():t.isConnected&&t.focus({preventScroll:!0})},0)},this.handleHide=e=>{if(e.target!==e.currentTarget)return;if(this.suppressNextCancel){this.suppressNextCancel=!1;return}let t=new CustomEvent(`modal-cancel`,{bubbles:!0,composed:!0,cancelable:!0});this.dispatchEvent(t),t.defaultPrevented&&e.preventDefault()}}static{this.styles=b`
:host {
display: contents;
}
wa-dialog {
--width: min(var(--openclaw-modal-width, 540px), calc(100vw - 48px));
--spacing: 0;
--backdrop-filter: var(--openclaw-modal-backdrop-filter, blur(4px));
}
wa-dialog::part(dialog) {
max-width: var(--openclaw-modal-max-width, calc(100vw - 48px));
max-height: var(--openclaw-modal-max-height, calc(100dvh - 48px));
padding: 0;
border: 0;
background: transparent;
color: var(--text);
overflow: visible;
}
wa-dialog::part(body) {
padding: 0;
overflow: visible;
}
:host(.fullscreen) wa-dialog {
--width: calc(100vw - 20px);
}
:host(.fullscreen) wa-dialog::part(dialog) {
max-width: calc(100vw - 20px);
max-height: calc(100dvh - 20px);
}
:host(.viewport-edge-to-edge) wa-dialog {
--width: 100vw;
}
:host(.viewport-edge-to-edge) wa-dialog::part(dialog) {
width: 100vw;
height: 100dvh;
max-width: none;
max-height: none;
margin: 0;
border-radius: 0;
}
:host(.viewport-edge-to-edge) wa-dialog::part(body) {
height: 100%;
}
:host(.palette) wa-dialog::part(dialog) {
margin-block-start: min(20dvh, 160px);
margin-block-end: auto;
}
:host(.palette) wa-dialog {
--show-duration: 0ms;
--hide-duration: 0ms;
}
:host(.drawer) wa-dialog {
--width: min(var(--openclaw-modal-width, 100vw), 100vw);
--show-duration: 200ms;
--hide-duration: 0ms;
}
:host(.drawer) wa-dialog::part(dialog) {
height: 100dvh;
max-width: 100vw;
max-height: 100dvh;
margin: 0 0 0 auto;
border-radius: 0;
}
:host(.drawer) wa-dialog[open]::part(dialog) {
animation: openclaw-drawer-in 200ms cubic-bezier(0.32, 0.72, 0, 1);
}
@keyframes openclaw-drawer-in {
from {
transform: translateX(100%);
}
to {
transform: translateX(0);
}
}
@media (prefers-reduced-motion: reduce) {
:host(.drawer) wa-dialog {
--show-duration: 0ms;
}
:host(.drawer) wa-dialog[open]::part(dialog) {
animation: none;
}
}
@media (max-width: 640px) {
wa-dialog {
--width: min(var(--openclaw-modal-width, 540px), calc(100vw - 24px));
}
wa-dialog::part(dialog) {
max-width: var(--openclaw-modal-max-width, calc(100vw - 24px));
max-height: 90dvh;
}
}
@media (max-width: 768px),
(max-width: 932px) and (max-height: 500px) and (orientation: landscape) {
:host(.mobile-edge-to-edge) wa-dialog {
--width: 100vw;
}
:host(.mobile-edge-to-edge) wa-dialog::part(dialog) {
width: 100vw;
height: 100dvh;
max-width: none;
max-height: none;
margin: 0;
border-radius: 0;
}
:host(.mobile-edge-to-edge) wa-dialog::part(body) {
height: 100%;
}
}
`}connectedCallback(){this.manual&&(this.open=!1),super.connectedCallback(),this.updateComplete.then(()=>this.syncDialogOpen())}disconnectedCallback(){gt(this,!1),this.syncGeneration+=1;let e=this.webAwesomeDialog,t=e?.shadowRoot?.querySelector(`dialog`);t?.open&&t.close(),e&&(e.open=!1);let n=this.returnFocusOverride===void 0?this.returnFocus:this.returnFocusOverride;this.returnFocus=null,this.returnFocusOverride=void 0,n?.isConnected&&n.focus({preventScroll:!0}),super.disconnectedCallback()}render(){return h`
<wa-dialog
without-header
light-dismiss
.label=${this.label}
@focusin=${this.handleInitialFocus}
@wa-after-show=${this.handleInitialFocus}
@wa-after-hide=${this.handleAfterHide}
@wa-hide=${this.handleHide}
>
<slot></slot>
</wa-dialog>
`}updated(e){e.has(`open`)&&gt(this,this.open),this.syncAccessibility(),this.syncDialogOpen()}async syncDialogOpen(){let e=++this.syncGeneration,t=this.webAwesomeDialog;if(!t||(await t.updateComplete,e!==this.syncGeneration||!this.isConnected))return;let n=t.shadowRoot?.querySelector(`dialog`);if(this.open){if(n?.open)return;this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,t.open=!0;return}(t.open||n?.open)&&(this.suppressNextCancel=!0,t.open=!1)}async syncAccessibility(){let e=this.webAwesomeDialog;if(!e)return;await e.updateComplete;let t=e.shadowRoot?.querySelector(`dialog`);t&&(t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-modal`,`true`),this.label?t.setAttribute(`aria-label`,this.label):t.removeAttribute(`aria-label`),this.description?t.setAttribute(`aria-description`,this.description):t.removeAttribute(`aria-description`))}show(){this.open=!0}setReturnFocusTarget(e){this.returnFocusOverride=e}hide(){this.open=!1}},l([y({type:Boolean})],A.prototype,`open`,void 0),l([y({type:Boolean,reflect:!0})],A.prototype,`manual`,void 0),l([y()],A.prototype,`label`,void 0),l([y()],A.prototype,`description`,void 0),l([xe(`wa-dialog`)],A.prototype,`webAwesomeDialog`,void 0),customElements.get(`openclaw-modal-dialog`)||customElements.define(`openclaw-modal-dialog`,A)})))()}var yt,j;function bt(){return(bt=e((()=>{g(),v(),C(),p(),yt=[`pointerup`,`pointercancel`,`blur`],j=class extends ve{constructor(...e){super(...e),this.splitRatio=.6,this.minRatio=.4,this.maxRatio=.7,this.label=``,this.orientation=`vertical`,this.startPosition=0,this.startRatio=0,this.dragRatio=0,this.dragSize=0,this.dragFrame=0,this.pendingPosition=null,this.activePointerId=null,this.handlePointerDown=e=>{if(e.button===0&&this.activePointerId===null&&(this.startPosition=this.orientation===`horizontal`?e.clientY:e.clientX,this.startRatio=this.currentRatio(),this.dragRatio=this.startRatio,this.dragSize=this.measureDragSize(),!(this.dragSize<=0))){this.classList.add(`dragging`),this.capturePointer(e.pointerId),window.addEventListener(`pointermove`,this.handlePointerMove);for(let e of yt)window.addEventListener(e,this.finishDragging);this.addEventListener(`lostpointercapture`,this.finishDragging),e.preventDefault()}},this.handlePointerMove=e=>{e.pointerId===this.activePointerId&&(this.pendingPosition=this.orientation===`horizontal`?e.clientY:e.clientX,this.dragFrame||=requestAnimationFrame(this.flushPointerMove))},this.flushPointerMove=()=>{this.dragFrame=0;let e=this.pendingPosition;this.pendingPosition=null,e!==null&&(this.dragRatio=this.emitResize(this.startRatio+(e-this.startPosition)/this.dragSize))},this.handleKeyDown=e=>{let t=e.shiftKey?.05:.02,n=this.currentRatio(),r=null,i=this.orientation===`horizontal`?`ArrowUp`:`ArrowLeft`,a=this.orientation===`horizontal`?`ArrowDown`:`ArrowRight`;e.key===i?r=n-t:e.key===a?r=n+t:e.key===`Home`?r=this.minRatio:e.key===`End`&&(r=this.maxRatio),r!=null&&(e.preventDefault(),this.emitResize(r),this.emitResizeEnd(r))},this.finishDragging=e=>{`pointerId`in e&&e.pointerId!==this.activePointerId||(this.activePointerId!==null&&(this.dragFrame&&=(cancelAnimationFrame(this.dragFrame),0),this.flushPointerMove(),this.emitResizeEnd(this.dragRatio)),this.stopDragging())}}static{this.styles=b`
:host {
width: var(--resize-handle-size, 6px);
cursor: col-resize;
flex-shrink: 0;
position: relative;
touch-action: none;
user-select: none;
}
:host::before {
content: "";
position: absolute;
top: 0;
left: -4px;
right: -4px;
bottom: 0;
}
/* The visible divider is a centered hairline, not the whole gutter:
filling the host paints a fat bar that stacks with neighboring pane
borders into a multi-line smear while dragging. */
:host::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
inset-inline-start: var(--resize-handle-line-inline, 50%);
width: var(--resize-handle-line-size, 1px);
transform: translateX(-50%);
background: var(--resize-handle-rest-color, var(--border, #1e2028));
transition:
background 150ms ease-out,
width 150ms ease-out;
}
:host(:hover)::after,
:host(.dragging)::after,
:host(:focus-visible)::after {
width: var(--resize-handle-active-line-size, 2px);
background: var(--resize-handle-active-color, currentColor);
}
:host(:focus-visible) {
outline: 2px solid var(--accent, #ff5c5c);
outline-offset: 2px;
}
:host([orientation="horizontal"]) {
width: auto;
height: var(--resize-handle-size, 6px);
cursor: row-resize;
}
:host([orientation="horizontal"])::before {
top: -4px;
left: 0;
right: 0;
bottom: -4px;
}
:host([orientation="horizontal"])::after {
top: var(--resize-handle-line-block, 50%);
bottom: auto;
inset-inline-start: 0;
left: 0;
right: 0;
width: auto;
height: var(--resize-handle-line-size, 1px);
transform: translateY(-50%);
transition:
background 150ms ease-out,
height 150ms ease-out;
}
:host([orientation="horizontal"]:hover)::after,
:host([orientation="horizontal"].dragging)::after,
:host([orientation="horizontal"]:focus-visible)::after {
width: auto;
height: var(--resize-handle-active-line-size, 2px);
}
`}render(){return m}connectedCallback(){super.connectedCallback(),this.setStaticAccessibilityAttributes(),this.addEventListener(`pointerdown`,this.handlePointerDown),this.addEventListener(`keydown`,this.handleKeyDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`pointerdown`,this.handlePointerDown),this.removeEventListener(`keydown`,this.handleKeyDown),this.finishDragging(new Event(`disconnect`))}updated(){this.setAttribute(`aria-valuemin`,String(this.toAriaValue(this.minRatio))),this.setAttribute(`aria-valuemax`,String(this.toAriaValue(this.maxRatio))),this.setCurrentAriaValue(this.currentRatio()),this.setAttribute(`aria-label`,this.label||S(`common.resizeSplitView`)),this.setAttribute(`aria-orientation`,this.orientation)}stopDragging(){let e=this.activePointerId;if(e!==null){this.classList.remove(`dragging`),this.removeEventListener(`lostpointercapture`,this.finishDragging),this.releaseActivePointer(e),this.dragFrame&&=(cancelAnimationFrame(this.dragFrame),0),this.pendingPosition=null,window.removeEventListener(`pointermove`,this.handlePointerMove);for(let e of yt)window.removeEventListener(e,this.finishDragging)}}emitResize(e){let t=this.clampRatio(e);return this.setCurrentAriaValue(t),this.dispatchEvent(new CustomEvent(`resize`,{detail:{splitRatio:t},bubbles:!0,composed:!0})),t}emitResizeEnd(e){this.dispatchEvent(new CustomEvent(`resize-end`,{detail:{splitRatio:this.clampRatio(e)},bubbles:!0,composed:!0}))}clampRatio(e){return Math.max(this.minRatio,Math.min(this.maxRatio,e))}measureDragSize(){let e=this.measureSize?.()??0;if(e>0)return e;let t=this.previousElementSibling?.getBoundingClientRect(),n=this.nextElementSibling?.getBoundingClientRect(),r=this.orientation===`horizontal`?(t?.height??0)+(n?.height??0):(t?.width??0)+(n?.width??0);if(r>0)return r;let i=this.parentElement?.getBoundingClientRect();return this.orientation===`horizontal`?i?.height??0:i?.width??0}currentRatio(){let e=this.measureRatio?.();return e!==void 0&&Number.isFinite(e)?this.clampRatio(e):this.splitRatio}toAriaValue(e){return Math.round(e*100)}setCurrentAriaValue(e){this.setAttribute(`aria-valuenow`,String(this.toAriaValue(e)))}setStaticAccessibilityAttributes(){this.setAttribute(`role`,`separator`),this.setAttribute(`tabindex`,`0`),this.setAttribute(`aria-orientation`,this.orientation)}capturePointer(e){this.activePointerId=e,typeof this.setPointerCapture==`function`&&this.setPointerCapture(e)}releaseActivePointer(e){this.activePointerId=null,typeof this.releasePointerCapture==`function`&&(typeof this.hasPointerCapture==`function`&&!this.hasPointerCapture(e)||this.releasePointerCapture(e))}},l([y({type:Number})],j.prototype,`splitRatio`,void 0),l([y({type:Number})],j.prototype,`minRatio`,void 0),l([y({type:Number})],j.prototype,`maxRatio`,void 0),l([y({type:String})],j.prototype,`label`,void 0),l([y({type:String,reflect:!0})],j.prototype,`orientation`,void 0),l([y({attribute:!1})],j.prototype,`measureRatio`,void 0),l([y({attribute:!1})],j.prototype,`measureSize`,void 0),customElements.get(`resizable-divider`)||customElements.define(`resizable-divider`,j)})))()}var xt;function St(){return(St=e((()=>{xt={boards:[],ready:!1}})))()}function Ct(){return{floatOffset:0,antennaDegrees:0,antennaDroop:0,leftClawDegrees:0,rightClawDegrees:0,eyeGlowOpacity:1,glowScale:1,leftEyeOpenness:1,rightEyeOpenness:1,happyEyes:0,gaze:{x:0,y:0},mouthCurve:0,mouthOpen:0,mouthRound:0,blush:0,hardHat:0,bodyTilt:0,bodyStretch:1,dizzy:0,dizzyPhase:0,effect:`none`,effectPhase:0}}function M(e,t,n){return Math.min(Math.max(e,t),n)}function wt(e){return e.floatOffset=M(e.floatOffset,-12,2),e.antennaDegrees=M(e.antennaDegrees,-14,14),e.antennaDroop=M(e.antennaDroop,0,1),e.leftClawDegrees=M(e.leftClawDegrees,-45,45),e.rightClawDegrees=M(e.rightClawDegrees,-45,45),e.eyeGlowOpacity=M(e.eyeGlowOpacity,0,1),e.glowScale=M(e.glowScale,.5,1.6),e.leftEyeOpenness=M(e.leftEyeOpenness,0,1),e.rightEyeOpenness=M(e.rightEyeOpenness,0,1),e.happyEyes=M(e.happyEyes,0,1),e.gaze.x=M(e.gaze.x,-1.2,1.2),e.gaze.y=M(e.gaze.y,-1.2,1.2),e.mouthCurve=M(e.mouthCurve,-1,1),e.mouthOpen=M(e.mouthOpen,0,1),e.mouthRound=M(e.mouthRound,0,1),e.blush=M(e.blush,0,1),e.hardHat=M(e.hardHat,0,1),e.bodyTilt=M(e.bodyTilt,-8,8),e.bodyStretch=M(e.bodyStretch,.86,1.05),e.dizzy=M(e.dizzy,0,1),e}function Tt(e){let t=Ct();switch(e){case`idle`:case`curious`:case`attentive`:break;case`thinking`:t.gaze={x:.3,y:-.5};break;case`working`:t.hardHat=1,t.rightClawDegrees=-28,t.gaze={x:.4,y:.35},t.mouthCurve=.15,t.bodyTilt=2;break;case`happy`:t.mouthCurve=.6,t.happyEyes=.4;break;case`celebrating`:t.mouthCurve=.9,t.mouthOpen=.4,t.happyEyes=.8,t.leftClawDegrees=30,t.rightClawDegrees=-30;break;case`sad`:t.antennaDroop=.75,t.mouthCurve=-.55,t.eyeGlowOpacity=.6,t.gaze={x:0,y:.5};break;case`sleepy`:t.leftEyeOpenness=.25,t.rightEyeOpenness=.25,t.eyeGlowOpacity=.5,t.antennaDroop=.35}return t}function Et(e){return e?Ot:Dt}var Dt,Ot;function kt(){return(kt=e((()=>{Dt={gradientTop:`#ff4d4d`,gradientBottom:`#991b1b`,antenna:`#ff4d4d`},Ot={gradientTop:`#ff7079`,gradientBottom:`#ea4c59`,antenna:`#ef4b58`}})))()}function N(e,t=0,n=1){return Math.min(Math.max(e,t),n)}function P(e,t){let n=e/t%1;return n<0?n+1:n}function F(e){let t=N(e);return t*t*(3-2*t)}function I(e){let t=N(e);return F(t<.5?t*2:(1-t)*2)}function At(e,t,n){let r=N(e);return r<t?F(r/t):r>n?F((1-r)/(1-n)):1}function jt(e){switch(e){case`wave`:return 1.5;case`hop`:return .7;case`celebrate`:return 2.4;case`sigh`:return 1.8;case`yawn`:case`wipeBrow`:return 2;case`clawSnap`:return .6;case`donHardHat`:return 1}return 0}var Mt,Nt,Pt,L,Ft,It,Lt,Rt;function zt(){return(zt=e((()=>{kt(),Mt=(1n<<64n)-1n,Nt=11400714819323198485n,Pt=2685821657736338717n,L=Math.PI*2,Ft=.16,It=.8,Lt=class{constructor(e){let t=BigInt.asUintN(64,BigInt(e));this.state=t===0n?Nt:t}next(){return this.state^=this.state>>12n,this.state=BigInt.asUintN(64,this.state),this.state^=this.state<<25n,this.state=BigInt.asUintN(64,this.state),this.state^=this.state>>27n,this.state=BigInt.asUintN(64,this.state),this.state*Pt&Mt}unit(){return Number(this.next()>>11n)/9007199254740992}},Rt=class{constructor(e=BigInt(Date.now())){this.currentMood=`idle`,this.startTime=null,this.lastPoseTime=0,this.activeGesture=null,this.activeGestureStart=0,this.pendingGesture=null,this.pendingGestureAt=0,this.nextBlinkAt=0,this.pendingDoubleBlink=!1,this.blinkStarts=[],this.nextGlanceAt=0,this.gazeHoldUntil=0,this.gazeTarget={x:0,y:0},this.currentGaze={x:0,y:0},this.nextClawSnapAt=0,this.nextMoodBeatAt=0,this.teaseActive=!1,this.teaseChangedAt=0,this.catchStartedAt=null,this.rng=new Lt(e)}setMood(e,t){if(e===this.currentMood)return;this.currentMood=e,this.pendingGesture=null,this.activeGesture=null,this.rescheduleMoodBeat(t);let n=this.entranceGesture(e);n&&this.startGesture(n,t)}setTease(e,t){this.teaseActive=e,this.teaseChangedAt=t}playCatch(e){this.catchStartedAt=e}poseAt(e){this.startTime===null&&this.begin(e);let t=N(e-this.lastPoseTime,0,.1);this.lastPoseTime=e,this.advanceSchedules(e);let n=this.basePose(this.currentMood,e);if(this.applyGaze(n,this.currentMood,e,t),this.applyBlinks(n,e),this.activeGesture){let t=(e-this.activeGestureStart)/jt(this.activeGesture);t>=1?this.activeGesture=null:this.applyGesture(this.activeGesture,n,t)}if(this.teaseActive&&e>=this.teaseChangedAt&&(n.mouthRound=Math.max(n.mouthRound,.5),n.gaze={x:0,y:.6}),this.catchStartedAt!==null){let t=(e-this.catchStartedAt)/It;if(t>=1)this.catchStartedAt=null;else if(t>=0){let e=I(t);this.applyGesture(`clawSnap`,n,N(t/.75)),n.happyEyes=Math.max(n.happyEyes,.9*e),n.mouthCurve=Math.max(n.mouthCurve,.7*e),n.blush=Math.max(n.blush,.65*e)}}return wt(n)}begin(e){this.startTime=e,this.lastPoseTime=e,this.nextBlinkAt=e+this.random(.8,2.4),this.nextGlanceAt=e+this.random(1.5,4),this.nextClawSnapAt=e+this.random(2,5),this.rescheduleMoodBeat(e),(this.currentMood===`idle`||this.currentMood===`curious`||this.currentMood===`happy`)&&(this.pendingGesture=`wave`,this.pendingGestureAt=e+.9)}advanceSchedules(e){if(e>=this.nextBlinkAt&&(this.blinkStarts.push(e),this.pendingDoubleBlink?(this.pendingDoubleBlink=!1,this.nextBlinkAt=e+this.blinkInterval()):this.random(0,1)<.14?(this.pendingDoubleBlink=!0,this.nextBlinkAt=e+.34):this.nextBlinkAt=e+this.blinkInterval()),this.blinkStarts=this.blinkStarts.filter(t=>e-t<=Ft),e>=this.nextGlanceAt?(this.gazeTarget=this.randomGlanceTarget(),this.gazeHoldUntil=e+this.random(.7,1.9),this.nextGlanceAt=this.gazeHoldUntil+this.glanceInterval()):e>=this.gazeHoldUntil&&(this.gazeTarget={x:0,y:0}),e>=this.nextClawSnapAt&&(this.activeGesture===null&&this.currentMood!==`sad`&&this.currentMood!==`working`&&this.startGesture(`clawSnap`,e),this.nextClawSnapAt=e+this.random(4,9)),e>=this.nextMoodBeatAt&&(this.activeGesture===null&&(this.currentMood===`sad`?this.startGesture(`sigh`,e):this.currentMood===`sleepy`?this.startGesture(`yawn`,e):this.currentMood===`working`&&this.startGesture(`wipeBrow`,e)),this.rescheduleMoodBeat(e)),this.pendingGesture&&e>=this.pendingGestureAt&&this.activeGesture===null){let t=this.pendingGesture;this.pendingGesture=null,this.startGesture(t,e)}}basePose(e,t){let n=Ct();switch(e){case`idle`:n.floatOffset=-4.8*(1-Math.cos(L*P(t,4))),n.antennaDegrees=-3*Math.sin(L*P(t,2));break;case`curious`:n.floatOffset=-4.2*(1-Math.cos(L*P(t,3.4))),n.antennaDegrees=-4*Math.sin(L*P(t,1.7)),n.bodyTilt=1.6*Math.sin(L*P(t,5.2));break;case`thinking`:n.floatOffset=-3.2*(1-Math.cos(L*P(t,5))),n.antennaDegrees=-5*Math.sin(L*P(t,1.3)),n.bodyTilt=2*Math.sin(L*P(t,6)),n.eyeGlowOpacity=.9+.1*Math.sin(L*P(t,.8));break;case`working`:{let e=P(t,.95);if(e<.05)n.rightClawDegrees=-6;else if(e<.6)n.rightClawDegrees=-6-28*F((e-.05)/.55);else if(e<.72){let t=N((e-.6)/.12);n.rightClawDegrees=-34+46*t*t}else n.rightClawDegrees=12-18*F((e-.72)/.28);n.leftClawDegrees=4+2*Math.sin(L*e);let r=I(N((e-.72)/.14));if(n.floatOffset=-2*(1-Math.cos(L*P(t,3.8)))+.8*r,n.bodyStretch=1-.03*r,n.bodyTilt=2.2+.6*Math.sin(L*P(t,5)),e>=.72){let t=N((e-.72)/.28);n.antennaDegrees=6*(1-t)*Math.sin(t*3*Math.PI)}n.leftEyeOpenness=.85,n.rightEyeOpenness=.85,n.mouthCurve=.18,n.hardHat=1,n.effect=`sparks`;let i=(e-.72)%1;n.effectPhase=i<0?i+1:i;break}case`happy`:n.floatOffset=-6*(1-Math.cos(L*P(t,3))),n.antennaDegrees=-4.5*Math.sin(L*P(t,1.6)),n.mouthCurve=.55+.1*Math.sin(L*P(t,3)),n.happyEyes=.35;break;case`celebrating`:{let e=Math.abs(Math.sin(L*P(t,1.6)));n.floatOffset=-9*e,n.bodyStretch=1+.03*e,n.antennaDegrees=-6*Math.sin(L*P(t,.8));let r=Math.sin(L*P(t,.9));n.leftClawDegrees=20+8*r,n.rightClawDegrees=-20+8*r,n.mouthCurve=.9,n.mouthOpen=.35,n.happyEyes=.7,n.glowScale=1.1,n.effect=`sparkles`,n.effectPhase=P(t,2.2);break}case`sad`:n.floatOffset=-2.4*(1-Math.cos(L*P(t,5.5))),n.antennaDegrees=-1.5*Math.sin(L*P(t,3)),n.antennaDroop=.75,n.mouthCurve=-.55,n.eyeGlowOpacity=.6;break;case`sleepy`:n.floatOffset=-2*(1-Math.cos(L*P(t,6))),n.antennaDroop=.35,n.leftEyeOpenness=.22+.08*Math.sin(L*P(t,3)),n.rightEyeOpenness=n.leftEyeOpenness,n.eyeGlowOpacity=.5,n.mouthRound=.15,n.bodyTilt=2.5*Math.sin(L*P(t,6)),n.effect=`zzz`,n.effectPhase=P(t,3);break;case`attentive`:n.floatOffset=-3*(1-Math.cos(L*P(t,4))),n.antennaDegrees=-2.5*Math.sin(L*P(t,2)),n.mouthCurve=.25}return n}applyGaze(e,t,n,r){let i=this.gazeTarget;switch(t){case`thinking`:i={x:.4*Math.sin(L*P(n,3.8)),y:-.55};break;case`working`:i={x:.55+.04*Math.sin(L*P(n,4.6)),y:.45+.02*Math.cos(L*P(n,3.9))};break;case`attentive`:i={x:i.x*.5,y:.35};break;case`sad`:i={x:i.x*.3,y:.5};break;case`sleepy`:i={x:0,y:.4}}let a=1-Math.exp(-r*9);this.currentGaze.x+=(i.x-this.currentGaze.x)*a,this.currentGaze.y+=(i.y-this.currentGaze.y)*a,e.gaze={...this.currentGaze}}applyBlinks(e,t){if(!(e.happyEyes>=.6))for(let n of this.blinkStarts){let r=(t-n)/Ft;if(r<0||r>1)continue;let i=I(r);e.leftEyeOpenness=Math.min(e.leftEyeOpenness,1-i),e.rightEyeOpenness=Math.min(e.rightEyeOpenness,1-i),e.eyeGlowOpacity*=Math.max(.3,1-i)}}applyGesture(e,t,n){let r=N(n);switch(e){case`wave`:{let e=At(r,.18,.82);t.rightClawDegrees+=e*(-28+9*Math.sin(r*6*Math.PI)),t.bodyTilt+=-2*e,t.mouthCurve=Math.max(t.mouthCurve,.5*e);break}case`hop`:{let e=I(N((r-.2)/.6));t.floatOffset+=-9*e,t.bodyStretch+=.045*e-.1*I(N(r/.2))-.06*I(N((r-.82)/.18)),t.mouthCurve=Math.max(t.mouthCurve,.4*e);break}case`celebrate`:{let e=At(r,.12,.88),n=Math.abs(Math.sin(r*4*Math.PI));t.floatOffset+=-11*n*e,t.bodyStretch+=.035*n*e,t.leftClawDegrees+=38*e,t.rightClawDegrees+=-38*e,t.happyEyes=Math.max(t.happyEyes,e),t.mouthCurve=Math.max(t.mouthCurve,e),t.mouthOpen=Math.max(t.mouthOpen,.6*I(r)),t.antennaDroop=0,t.glowScale=Math.max(t.glowScale,1+.2*e),t.effect=`sparkles`,t.effectPhase=r;break}case`sigh`:{let e=F(N(r/.3)),n=F(N((r-.3)/.45));t.bodyStretch+=.025*e-.08*n*(1-N((r-.85)/.15)),t.gaze={x:t.gaze.x,y:.5*n},t.antennaDroop=Math.min(1,t.antennaDroop+.15*n);break}case`yawn`:{let e=At(r,.3,.75);t.mouthRound=Math.max(t.mouthRound,.9*e),t.leftEyeOpenness=Math.min(t.leftEyeOpenness,1-.9*e),t.rightEyeOpenness=Math.min(t.rightEyeOpenness,1-.9*e),t.bodyStretch+=.03*e,t.bodyTilt+=-2*e;break}case`clawSnap`:t.leftClawDegrees+=-8*I(N(r/.7)),t.rightClawDegrees+=-8*I(N((r-.25)/.7));break;case`donHardHat`:{let e=F(N(r/.55));t.hardHat=Math.min(t.hardHat,e),r<.55&&(t.gaze={x:0,y:-.9*(1-r)}),t.bodyStretch-=.04*I(N((r-.5)/.2));let n=I(N((r-.7)/.3));t.leftClawDegrees+=-8*n,t.rightClawDegrees+=8*n;break}case`wipeBrow`:{let e=At(r,.2,.8);t.leftClawDegrees*=1-e,t.rightClawDegrees*=1-e,t.leftClawDegrees+=38*e*(.9+.1*Math.sin(r*5*Math.PI)),t.bodyTilt*=1-e,t.bodyStretch+=.02*e,t.happyEyes=Math.max(t.happyEyes,.7*e),t.mouthCurve=Math.max(t.mouthCurve,.5*e),t.gaze={x:t.gaze.x*(1-e),y:t.gaze.y*(1-e)},t.effect=`sweat`,t.effectPhase=r;break}}}entranceGesture(e){switch(e){case`happy`:return`hop`;case`celebrating`:return`celebrate`;case`sad`:return`sigh`;case`sleepy`:return`yawn`;case`working`:return`donHardHat`;case`idle`:case`curious`:case`thinking`:case`attentive`:return null}return null}startGesture(e,t){this.activeGesture=e,this.activeGestureStart=t}random(e,t){return e+(t-e)*this.rng.unit()}blinkInterval(){return this.currentMood===`attentive`?this.random(1.8,4):this.random(2.2,5.5)}glanceInterval(){return this.currentMood===`curious`?this.random(1.6,4):this.currentMood===`thinking`?this.random(1.2,3):this.random(3,8)}randomGlanceTarget(){let e=this.random(.5,1),t=this.random(0,L);return{x:Math.cos(t)*e,y:Math.sin(t)*e*.6}}rescheduleMoodBeat(e){this.nextMoodBeatAt=e+this.random(6,12)}}})))()}function Bt(){if(W)return W;let e=new Path2D;e.moveTo(60,10),e.bezierCurveTo(30,10,15,35,15,55),e.bezierCurveTo(15,75,30,95,45,100),e.lineTo(45,110),e.lineTo(55,110),e.lineTo(55,100),e.bezierCurveTo(55,100,60,102,65,100),e.lineTo(65,110),e.lineTo(75,110),e.lineTo(75,100),e.bezierCurveTo(90,95,105,75,105,55),e.bezierCurveTo(105,35,90,10,60,10),e.closePath();let t=new Path2D;t.moveTo(20,45),t.bezierCurveTo(5,40,0,50,5,60),t.bezierCurveTo(10,70,20,65,25,55),t.bezierCurveTo(28,48,25,45,20,45),t.closePath();let n=new Path2D;n.moveTo(100,45),n.bezierCurveTo(115,40,120,50,115,60),n.bezierCurveTo(110,70,100,65,95,55),n.bezierCurveTo(92,48,95,45,100,45),n.closePath();let r=new Path2D;r.moveTo(45,15),r.quadraticCurveTo(35,5,30,8);let i=new Path2D;return i.moveTo(75,15),i.quadraticCurveTo(85,5,90,8),W={body:{path:e,bounds:{minX:15,minY:10,maxX:105,maxY:110}},leftClaw:{path:t,bounds:{minX:3.125,minY:43.67006838144548,maxX:26.196938456699073,maxY:65.45084971874738}},rightClaw:{path:n,bounds:{minX:93.80306154330093,minY:43.67006838144548,maxX:116.875,maxY:65.45084971874738}},leftAntenna:r,rightAntenna:i},W}function Vt(e,t,n){let{bounds:r}=t,i=e.createLinearGradient(r.minX,r.minY,r.maxX,r.maxY);return i.addColorStop(0,n.gradientTop),i.addColorStop(1,n.gradientBottom),i}function Ht(e){return e*Math.PI/180}function Ut(e){let t=B(e,0,1);return t*t*(3-2*t)}function Wt(e){let t=B(e,0,1);return Ut(t<.5?t*2:(1-t)*2)}function R(e,t,n,r){e.save(),e.translate(n.x,n.y),e.rotate(Ht(t)),e.translate(-n.x,-n.y),r(),e.restore()}function z(e,t,n){let r=new Path2D;return r.ellipse(e.x,e.y,t,n,0,0,en),r}function Gt(e,t,n,r,i){let a=new Path2D,o=e+n,s=t+r;return a.moveTo(e+i,t),a.lineTo(o-i,t),a.quadraticCurveTo(o,t,o,t+i),a.lineTo(o,s-i),a.quadraticCurveTo(o,s,o-i,s),a.lineTo(e+i,s),a.quadraticCurveTo(e,s,e,s-i),a.lineTo(e,t+i),a.quadraticCurveTo(e,t,e+i,t),a.closePath(),a}function Kt(e,t,n,r){let i={x:t.x+r.gaze.x*2,y:t.y+r.gaze.y*1.5};if(r.happyEyes<1){let t=Math.max(1.2,12*n*(1-.6*r.happyEyes));e.save(),e.globalAlpha*=1-r.happyEyes,e.fillStyle=H,e.fill(z({x:i.x,y:i.y-6+(12-t)*.65+t/2},6,t/2)),e.restore()}if(r.happyEyes>0){let t=new Path2D;t.moveTo(i.x-6,i.y+2),t.quadraticCurveTo(i.x,i.y-5.5,i.x+6,i.y+2),e.save(),e.globalAlpha*=r.happyEyes,e.strokeStyle=H,e.lineWidth=2.6,e.lineCap=`round`,e.stroke(t),e.restore()}if(r.dizzy>0){let n=r.dizzyPhase*en+(t.x>60?Math.PI:0),a={x:i.x+Math.cos(n)*3.4,y:i.y+Math.sin(n)*2.6};e.save(),e.globalAlpha*=r.dizzy,e.fillStyle=U,e.fill(z(a,1.8,1.8)),e.restore()}let a=r.eyeGlowOpacity*n*(1-r.happyEyes)*(1-r.dizzy);if(a<=.01)return;let o=2*r.glowScale,s={x:i.x+1+r.gaze.x*1.2,y:i.y-1+r.gaze.y*.9};e.save(),e.globalAlpha*=a,e.fillStyle=U,e.fill(z(s,o,o)),e.restore()}function qt(e,t){if(e.fillStyle=H,e.strokeStyle=H,e.lineCap=`round`,t.mouthRound>.05){let n=1+3.2*t.mouthRound,r=1+4.2*t.mouthRound;e.fill(z({x:60,y:51},n,r));return}if(t.mouthOpen>.05){let n=new Path2D;n.moveTo(52.5,48.5),n.quadraticCurveTo(60,48.5+14*t.mouthOpen,67.5,48.5),n.closePath(),e.fill(n);return}if(Math.abs(t.mouthCurve)<=.05)return;let n=new Path2D;n.moveTo(52.5,49),n.quadraticCurveTo(60,49+8*t.mouthCurve,67.5,49),e.lineWidth=2.2,e.stroke(n)}function Jt(e,t){t.blush<=.02||(e.save(),e.globalAlpha*=t.blush*.55,e.fillStyle=tn,e.fill(z({x:37,y:45},4.5,2.5)),e.fill(z({x:83,y:45},4.5,2.5)),e.restore())}function Yt(e,t){if(t<=.01)return;let n=new Path2D;n.moveTo(45,15),n.bezierCurveTo(47,7,54,3,60,3),n.bezierCurveTo(66,3,73,7,75,15),n.lineTo(45,15),n.closePath();let r=Gt(41,14,38,5,2);e.save(),e.globalAlpha*=t,e.translate(60,15-14*(1-t)),e.rotate(Ht(-5)),e.translate(-60,-15);let i=e.createLinearGradient(60,3,60,16);i.addColorStop(0,rn),i.addColorStop(1,nn),e.fillStyle=i,e.fill(n),e.strokeStyle=an,e.lineWidth=.8,e.stroke(n),e.fillStyle=nn,e.fill(r),e.stroke(r),e.restore()}function Xt(e,t){let n=new Path2D;n.moveTo(e.x,e.y-t);for(let[r,i]of[[1,0],[0,1],[-1,0],[0,-1]])n.quadraticCurveTo(e.x,e.y,e.x+t*r,e.y+t*i);return n.closePath(),n}function Zt(e,t,n,r){let i=new Path2D,a=n*.62,o=n*.78;i.moveTo(t.x-a/2,t.y-o/2),i.lineTo(t.x+a/2,t.y-o/2),i.lineTo(t.x-a/2,t.y+o/2),i.lineTo(t.x+a/2,t.y+o/2),e.save(),e.globalAlpha*=r*.9,e.strokeStyle=U,e.lineWidth=Math.max(1.2,n*.16),e.lineCap=`round`,e.lineJoin=`round`,e.stroke(i),e.restore()}function Qt(e,t,n){switch(t.effect){case`none`:return;case`sparkles`:for(let r=0;r<6;r+=1){let i=Wt((t.effectPhase+r*.37)%1);if(i<=.05)continue;let a=Math.PI+Math.PI*(r+.5)/6,o={x:60+Math.cos(a)*(50+r%3*4),y:55+Math.sin(a)*(40+r*5%3*4)};e.save(),e.globalAlpha*=i,e.fillStyle=r%2==0?U:n.antenna,e.fill(Xt(o,2.5+2*i)),e.restore()}return;case`zzz`:for(let n=0;n<3;n+=1){let r=(t.effectPhase+n*.33)%1,i=r<.2?r/.2:1-(r-.2)/.8;i<=.05||Zt(e,{x:86+14*r+2*Math.sin(r*4*Math.PI),y:24-20*r},6+4*r,i)}return;case`sparks`:for(let n=0;n<5;n+=1){let r=t.effectPhase-n*.025;if(r<0||r>=.45)continue;let i=r<.08?r/.08:1-(r-.08)/.37,a=Ht(-160+n*35),o=5+12*r/.45,s=2.2+n%3*.8,c={x:B(106+Math.cos(a)*o,s,V-s),y:B(66+Math.sin(a)*o,s,V-s)};e.save(),e.globalAlpha*=i,e.fillStyle=n%2==0?U:nn,e.fill(Xt(c,s)),e.restore()}return;case`sweat`:{let n=Wt(t.effectPhase);if(n<=.02)return;let r={x:42,y:24+7*t.effectPhase},i=new Path2D;i.moveTo(r.x,r.y-3),i.bezierCurveTo(r.x-4,r.y+1,r.x-2,r.y+3,r.x,r.y+3),i.bezierCurveTo(r.x+2,r.y+3,r.x+4,r.y+1,r.x,r.y-3),e.save(),e.globalAlpha*=n,e.fillStyle=`#80d4ff`,e.fill(i),e.restore()}}}function B(e,t,n){return Math.min(Math.max(e,t),n)}function $t(e,t,n,r){let i=Bt();if(n.save(),n.scale(r/V,r/V),e.bodyStretch!==1){let t=B(1+(1-e.bodyStretch)*.5,.97,1.03);n.translate(60,110),n.scale(t,e.bodyStretch),n.translate(-60,-110)}e.bodyTilt!==0&&(n.translate(60,60),n.rotate(Ht(e.bodyTilt)),n.translate(-60,-60)),n.fillStyle=Vt(n,i.body,t),n.fill(i.body.path),R(n,e.leftClawDegrees,{x:26,y:53},()=>{n.fillStyle=Vt(n,i.leftClaw,t),n.fill(i.leftClaw.path)}),R(n,e.rightClawDegrees,{x:94,y:53},()=>{n.fillStyle=Vt(n,i.rightClaw,t),n.fill(i.rightClaw.path)});let a=e.antennaDegrees*(1-e.antennaDroop);n.strokeStyle=t.antenna,n.lineWidth=2,n.lineCap=`round`,R(n,-e.antennaDroop*40,{x:45,y:15},()=>{R(n,a,{x:37.5,y:11},()=>n.stroke(i.leftAntenna))}),R(n,e.antennaDroop*40,{x:75,y:15},()=>{R(n,a,{x:82.5,y:11},()=>n.stroke(i.rightAntenna))}),Yt(n,e.hardHat),Jt(n,e),Kt(n,{x:45,y:35},e.leftEyeOpenness,e),Kt(n,{x:75,y:35},e.rightEyeOpenness,e),qt(n,e),Qt(n,e,t),n.restore()}var V,en,H,U,tn,nn,rn,an,W;function on(){return(on=e((()=>{V=120,en=Math.PI*2,H=`#050810`,U=`#00e5cc`,tn=`#ff9eae`,nn=`#f2a833`,rn=`#ffd659`,an=`rgba(184, 115, 31, 0.7)`,W=null})))()}function G(){return performance.now()/1e3}var sn,cn,K;function ln(){return(ln=e((()=>{g(),v(),zt(),on(),kt(),sn=120,cn=new Set([`idle`,`curious`,`thinking`,`working`,`happy`,`celebrating`,`sad`,`sleepy`,`attentive`]),K=class extends n{constructor(...e){super(...e),this.mood=`idle`,this.size=sn,this.tease=!1,this.animator=new Rt,this.animationFrame=0,this.visible=!0,this.reducedMotion=!1,this.lastPose=Tt(`idle`),this.intersectionObserver=null,this.themeObserver=null,this.motionQuery=null,this.handleVisibilityChange=()=>this.syncPlayback(),this.handleMotionChange=e=>{this.reducedMotion=e.matches,this.syncPlayback()},this.renderAnimationFrame=e=>{this.animationFrame=0,this.shouldAnimate&&(this.drawCurrentFrame(e/1e3),this.animationFrame=window.requestAnimationFrame(this.renderAnimationFrame))}}static{this.styles=b`
:host {
display: inline-block;
width: var(--openclaw-mascot-size, 120px);
height: var(--openclaw-mascot-size, 120px);
overflow: visible;
contain: layout style;
pointer-events: none;
line-height: 0;
}
canvas {
display: block;
width: 100%;
height: 100%;
will-change: transform;
}
`}connectedCallback(){super.connectedCallback(),this.setAttribute(`aria-hidden`,`true`),document.addEventListener(`visibilitychange`,this.handleVisibilityChange),this.motionQuery=window.matchMedia?.(`(prefers-reduced-motion: reduce)`)??null,this.reducedMotion=this.motionQuery?.matches??!1,this.motionQuery?.addEventListener(`change`,this.handleMotionChange),typeof IntersectionObserver<`u`&&(this.intersectionObserver=new IntersectionObserver(e=>{this.visible=e.some(e=>e.isIntersecting),this.syncPlayback()}),this.intersectionObserver.observe(this)),typeof MutationObserver<`u`&&(this.themeObserver=new MutationObserver(()=>this.drawPose(this.lastPose)),this.themeObserver.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme-mode`]}))}disconnectedCallback(){this.stopAnimation(),document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),this.motionQuery?.removeEventListener(`change`,this.handleMotionChange),this.motionQuery=null,this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.themeObserver?.disconnect(),this.themeObserver=null,super.disconnectedCallback()}firstUpdated(){this.animator.setMood(this.resolvedMood,G()),this.animator.setTease(this.tease,G()),this.drawCurrentFrame(G()),this.syncPlayback()}updated(e){e.has(`size`)&&this.style.setProperty(`--openclaw-mascot-size`,`${this.resolvedSize}px`),e.has(`mood`)&&this.animator.setMood(this.resolvedMood,G()),e.has(`tease`)&&this.animator.setTease(this.tease,G()),(e.has(`size`)||e.has(`mood`)||e.has(`tease`))&&(this.drawCurrentFrame(G()),this.syncPlayback())}catchOnce(){if(!this.isConnected||this.reducedMotion)return;let e=G();this.animator.playCatch(e),this.drawCurrentFrame(e),this.syncPlayback()}render(){return h`<canvas></canvas>`}get resolvedMood(){return cn.has(this.mood)?this.mood:`idle`}get resolvedSize(){return Number.isFinite(this.size)&&this.size>0?this.size:sn}get shouldAnimate(){return this.isConnected&&this.visible&&!this.reducedMotion&&document.visibilityState!==`hidden`}syncPlayback(){if(this.renderRoot.querySelector(`canvas`)){if(this.reducedMotion){this.stopAnimation(),this.lastPose=Tt(this.resolvedMood),this.drawPose(this.lastPose);return}if(!this.shouldAnimate){this.stopAnimation();return}this.animationFrame===0&&(this.animationFrame=window.requestAnimationFrame(this.renderAnimationFrame))}}stopAnimation(){this.animationFrame!==0&&(window.cancelAnimationFrame(this.animationFrame),this.animationFrame=0)}drawCurrentFrame(e){this.lastPose=this.reducedMotion?Tt(this.resolvedMood):this.animator.poseAt(e),this.drawPose(this.lastPose)}drawPose(e){let t=this.renderRoot.querySelector(`canvas`);if(!(t instanceof HTMLCanvasElement)||typeof Path2D>`u`)return;let n=t.getContext(`2d`);if(!n)return;let r=this.resolvedSize,i=Math.max(1,window.devicePixelRatio||1),a=Math.round(r*i);(t.width!==a||t.height!==a)&&(t.width=a,t.height=a),n.setTransform(i,0,0,i,0,0),n.clearRect(0,0,r,r),$t(e,Et(document.documentElement.dataset.themeMode===`light`),n,r),t.style.transform=`translate3d(0, ${e.floatOffset*r/120}px, 0)`}},l([y({reflect:!0})],K.prototype,`mood`,void 0),l([y({type:Number})],K.prototype,`size`,void 0),l([y({type:Boolean})],K.prototype,`tease`,void 0),customElements.get(`openclaw-mascot`)||customElements.define(`openclaw-mascot`,K)})))()}function un(){return h`
<section
class="lazy-view-state lazy-view-state--loading"
role="status"
aria-live="polite"
aria-label=${S(`common.loading`)}
>
<openclaw-mascot mood="thinking" .size=${120}></openclaw-mascot>
</section>
`}function dn(){return(dn=e((()=>{g(),C(),ln()})))()}function fn(e,t,n){return e.status===`loading`?un():mn({actionLabel:S(`common.retry`),error:e.error,stale:e.stale,subtitle:e.element.label,onRetry:t,onClose:n})}function pn(e){let t=e.visibleState;if(!t)return m;let n=()=>e.close();return h`<openclaw-modal-dialog label=${t.element.label} @modal-cancel=${n}>
${fn(t,()=>e.retry(),n)}
</openclaw-modal-dialog>`}function mn({actionLabel:e,error:t,onClose:n,onRetry:r,render:i,stale:a=!1,subtitle:o}){let s=ue(t);return h`
${i?.()??m}
${hn({title:S(a?`lazyView.staleTitle`:`lazyView.errorTitle`),subtitle:o??S(a?`lazyView.staleSubtitle`:`lazyView.genericSubtitle`),actions:h`
<button class="btn lazy-view-error__action" @click=${r}>
${e??S(a?`common.reload`:`lazyView.retry`)}
</button>
${n?h`<button class="btn" type="button" @click=${n}>${S(`common.close`)}</button>`:m}
`,detail:s,inline:!!i,stale:a})}
`}function hn({actions:e,className:t,detail:n,inline:r=!1,role:i=`alert`,stale:a=!1,subtitle:o,title:s}){let c=`lazy-view-error${r?` lazy-view-error--inline`:``}${a?` lazy-view-error--stale`:``}${t?` ${t}`:``}`;return h`
<div class=${c} role=${i}>
<div class="lazy-view-error__icon" aria-hidden="true">
${et(a?`refresh`:`alertTriangle`)}
</div>
<div class="lazy-view-error__title">${s}</div>
<div class="lazy-view-error__subtitle">${o}</div>
${e?h`<div class="lazy-view-error__actions">${e}</div>`:m}
${n?h`<code class="lazy-view-error__detail">${n}</code>`:m}
</div>
`}function gn(){return(gn=e((()=>{g(),C(),_e(),E(),dn()})))()}function _n(e){return typeof Reflect.get(e,`restartAfterTeardown`)==`function`&&typeof Reflect.get(e,`teardown`)==`function`}function vn(e,t=`mcp-app-view`){let n=new Set;for(let r of e){r instanceof Element&&r.matches(t)&&_n(r)&&n.add(r);for(let e of r.querySelectorAll(t))_n(e)&&n.add(e)}return[...n]}var yn;function bn(){return(bn=e((()=>{yn=class{constructor(e,t=`mcp-app-view`){this.host=e,this.selector=t,this.renderedKey=null,this.pending=!1,this.restartTargets=null}apply(e,t){return this.renderedValue=t(),this.renderedKey=e,this.renderedValue}render(e,t,n,r={}){if(this.pending)return this.renderedValue;if(this.restartTargets){let n=this.restartTargets;return this.restartTargets=null,queueMicrotask(()=>{for(let e of n)e.isConnected&&e.restartAfterTeardown()}),this.renderedKey===e&&r.retainRenderedValue?this.renderedValue:this.apply(e,t)}if(this.renderedKey===e&&r.retainRenderedValue)return this.renderedValue;if(this.renderedKey===null||this.renderedKey===e)return this.apply(e,t);let i=vn(n(),this.selector);return i.length===0?this.apply(e,t):(this.pending=!0,Promise.allSettled(i.map(e=>e.teardown())).then(()=>{this.pending=!1,this.restartTargets=i,this.host.requestUpdate()}),this.renderedValue)}}})))()}function xn(e){return typeof window<`u`&&wn(e.version??void 0,e.sha??void 0)?(window.location.reload(),!0):!1}function Sn(e){return d(e)&&e.type===`sw-updated`&&typeof e.version==`string`&&e.version!==q.buildId}function Cn(e){if(e.controlUiBuildSource===`configured`)return!1;let t=q.buildId?.trim(),n=e.buildId?.trim();return t&&t!==`dev`&&n?t!==n:wn(e.version??void 0)}function wn(e,t){let n=q.version?.trim(),r=e?.trim();if(n&&r&&n!==r)return!0;let i=q.commit?.trim().toLowerCase(),a=t?.trim().toLowerCase();return!!(i&&a&&!i.startsWith(a)&&!a.startsWith(i))}var q;function Tn(){return(Tn=e((()=>{q={version:`2026.8.1`,commit:`ea806575e6450e4d1efdfc72c19f04be982a1b9b`,builtAt:`2026-08-31T00:16:08.235Z`,release:!1,commitAt:`2026-08-30T23:53:40.000Z`,branch:null,dirty:!0,buildId:`2026.8.1-ea806575e645-2026-08-31T00-16-08.235Z`}})))()}function En(e){if(!e.pendingGatewayUrl)return m;let t=S(`channels.gatewayUrlConfirmation.title`),n=S(`channels.gatewayUrlConfirmation.subtitle`);return h`
<openclaw-modal-dialog
label=${t}
description=${n}
@modal-cancel=${e.onCancel}
>
<div class="exec-approval-card">
<div class="exec-approval-header">
<div>
<div id=${`gateway-url-confirmation-title`} class="exec-approval-title">${t}</div>
<div id=${`gateway-url-confirmation-description`} class="exec-approval-sub">${n}</div>
</div>
</div>
<div class="exec-approval-command mono">${e.pendingGatewayUrl}</div>
<div class="callout danger" style="margin-top: 12px;">
${S(`channels.gatewayUrlConfirmation.warning`)}
</div>
<div class="exec-approval-actions">
<button class="btn primary" @click=${e.onConfirm}>${S(`common.confirm`)}</button>
<button class="btn" @click=${e.onCancel}>${S(`common.cancel`)}</button>
</div>
</div>
</openclaw-modal-dialog>
`}var Dn;function On(){return(On=e((()=>{g(),v(),C(),p(),vt(),Dn=class extends oe{render(){return this.props?En(this.props):m}},l([y({attribute:!1})],Dn.prototype,`props`,void 0),customElements.get(`openclaw-gateway-url-confirmation`)||customElements.define(`openclaw-gateway-url-confirmation`,Dn)})))()}function kn(e){try{let t=decodeURIComponent(e).trim();return t&&t!==`.`&&t!==`..`?t:null}catch{return null}}function An(e){let t=e.pathname.split(`/`).filter(Boolean),n=kn(t[0]??``),r=kn(t[1]??``),i=t[2],a=t[3]??``;if(!n||!r||!/^[1-9]\d{0,9}$/.test(a))return null;let o=i===`issues`?`issue`:i===`pull`?`pull`:null;return o?{kind:o,number:Number(a),owner:n,repo:r}:null}function jn(e){let t;try{t=new URL(e,globalThis.location?.href??`http://localhost/`)}catch{return null}if(t.protocol!==`https:`||t.hostname.toLowerCase()!==In||t.username||t.password||t.port&&t.port!==`443`)return null;let n=An(t);return n?{...n,href:t.href}:null}function Mn(e){return`https://${In}/${encodeURIComponent(e)}`}function Nn(e){let t=`${encodeURIComponent(e.owner)}/${encodeURIComponent(e.repo)}`;return`https://${In}/${t}/pull/${e.number}/files`}function Pn(e){for(let t of e.composedPath()){if(t instanceof HTMLAnchorElement)return t;if(t===e.currentTarget)break}return null}function Fn(e){return jn(e)?.kind===`pull`}var In;function Ln(){return(Ln=e((()=>{In=`github.com`})))()}function Rn(e){let t={focus:t=>void e(t,`focus`),pointer:t=>void e(t,`pointer`)};return document.addEventListener(`pointerover`,t.pointer,!0),document.addEventListener(`focusin`,t.focus,!0),()=>{document.removeEventListener(`pointerover`,t.pointer,!0),document.removeEventListener(`focusin`,t.focus,!0)}}function zn(e,t,n=!1){return t===`pointer`?e.matches(`:hover`):n?document.activeElement instanceof Node&&e.contains(document.activeElement):document.activeElement===e}function Bn(e,t){return Math.max(0,t-(performance.now()-e))}var Vn;function Hn(){return(Hn=e((()=>{Te(),Vn=class{constructor(e){this.params=e,this.stopListeners=null}install(e){customElements.get(this.params.tag)||(this.stopListeners=Rn(e))}providerFor(e){return e.closest(this.params.tag)}async define(){let e=new Map([...document.querySelectorAll(this.params.tag)].map(e=>[e,this.params.snapshot(e)]));await we(this.params.tag,async()=>{let t=await this.params.load();customElements.get(this.params.tag)||customElements.define(this.params.tag,t);for(let[t,n]of e)this.params.restore(t,n)}),this.stopListeners?.(),this.stopListeners=null,this.params.onDefined?.()}}})))()}async function Un(e,t){if(t===`pointer`&&e.pointerType===`touch`)return;let n=Pn(e),r=n?jn(n.href):null;if(!n||!r||!J.providerFor(n))return;let i=performance.now();await J.define();let a=J.providerFor(n);if(!a||!n.isConnected||!zn(n,t))return;let o=t===`pointer`?Bn(i,250):0;a.activateFromBootstrap(n,r,t,o)}var J;function Wn(){return(Wn=e((()=>{Ln(),Hn(),s(),J=new Vn({tag:`openclaw-github-link-hovercard-provider`,load:async()=>(await a(async()=>{let{GitHubLinkHovercardProvider:e}=await import(`./github-link-hovercard.runtime-CDrMcW--.js`);return{GitHubLinkHovercardProvider:e}},__vite__mapDeps([21,1,22,23,24,25,26,27,28,29,30]),import.meta.url)).GitHubLinkHovercardProvider,snapshot:e=>e.client,restore:(e,t)=>{e.client=t}}),J.install(Un)})))()}function Gn(){return S(`chat.actions.copyAsMarkdown`)}function Kn(e){return e.querySelector(`[data-copy-label]`)?.textContent??e.getAttribute(`aria-label`)}function qn(e,t,n=!1){let r=e.parentElement?.querySelector(`[data-copy-feedback]`);r&&(r.hidden=!n,r.textContent=t);let i=e.querySelector(`[data-copy-label]`)?.lastChild;i?.nodeType===Node.TEXT_NODE?i.nodeValue=t:e.setAttribute(`aria-label`,t)}async function Jn(e,t,n){let r=e.currentTarget;if(!r||r.dataset.copyState===`copying`)return!1;let i=String(Number(r.dataset.copyAttempt??`0`)+1);r.dataset.copyAttempt=i,r.dataset.copyState=`copying`,r.setAttribute(`aria-busy`,`true`),r.disabled=!0,qn(r,n);let a=()=>r.isConnected&&r.dataset.copyAttempt===i,o=await he(t,a);if(delete r.dataset.copyState,r.removeAttribute(`aria-busy`),r.disabled=!1,!a())return!1;r.dataset.copyState=o?`copied`:`error`;let s=Kn(r)??n,c=S(o?`common.copied`:`common.copyFailed`);qn(r,c,!0);let l=o?Zn:Qn;return window.setTimeout(()=>{if(!a())return;delete r.dataset.copyState;let e=Kn(r);qn(r,e&&e!==c?e:s)},l),o}function Yn(e,t=Gn(),n=!1){return h`
<openclaw-tooltip .content=${t}>
<button
class=${n?`chat-copy-btn`:`btn btn--xs chat-copy-btn`}
type="button"
aria-label=${t}
@click=${n=>void Jn(n,e,t)}
>
<span class="chat-copy-btn__icon" aria-hidden="true">
<span class="chat-copy-btn__icon-copy">${T.copy}</span>
<span class="chat-copy-btn__icon-check">${T.check}</span>
</span>
</button>
<span data-copy-feedback role="status" hidden></span>
</openclaw-tooltip>
`}function Xn(e){return Yn(e,Gn(),!0)}var Zn,Qn;function $n(){return($n=e((()=>{g(),C(),E(),O(),Zn=1500,Qn=2e3})))()}function er(e){e.currentTarget.querySelector(`.chat-copy-btn`)?.click()}function tr(e){let t=S(`connection.help.copyCommand`);return h`
<openclaw-tooltip .content=${t}>
<div
class="login-gate__command"
role="button"
tabindex="0"
aria-label=${S(`connection.help.copyCommandAria`,{command:e})}
@click=${e=>{e.target?.closest(`.chat-copy-btn`)||er(e)}}
@keydown=${e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),er(e))}}
>
<code translate="no">${e}</code>
${Yn(e,t)}
</div>
</openclaw-tooltip>
`}function nr(){return(nr=e((()=>{g(),C(),$n(),O()})))()}function rr(e){return e.includes(`insecure-http`)?S(`login.failure.docsInsecure`):e.includes(`device-pairing`)?S(`login.failure.docsPairing`):S(`login.failure.docsAuth`)}function ir(e){let t=e.replace(/([?#&])(?:access_token|auth|deviceToken|password|refresh_token|token)=([^&#\s]+)/gi,`$1[redacted-credential]`).replace(/\bBearer\s+([A-Za-z0-9._~+/-]+=*)/gi,`Bearer [redacted]`).replace(/(["']?(?:access|accessToken|deviceToken|password|refresh|refreshToken|token)["']?\s*[:=]\s*)["']?[^"',\s}]+/gi,`$1[redacted]`);return ue(t)}function Y(e){let t=e.docsHref??`https://docs.openclaw.ai/web/dashboard`;return{kind:e.kind,title:S(e.titleKey,e.stepParams),summary:S(e.summaryKey,e.stepParams),refreshAction:e.refreshAction,steps:e.stepKeys.map(t=>typeof t==`string`?{text:S(t,e.stepParams),commands:[]}:{text:S(t.key,e.stepParams),commands:t.commands}),docsHref:t,docsLabel:rr(t),rawError:ir(e.rawError)}}function ar(e){if(e.connected||!e.lastError)return null;let n=e.lastError,r=e.lastErrorCode??null,i=t(n);if(r===o.CONTROL_UI_BUILD_MISMATCH)return Y({kind:`build-mismatch`,rawError:n,titleKey:`chat.sidebar.serverUpdatedTitle`,summaryKey:`chat.sidebar.serverUpdatedRefresh`,refreshAction:{label:S(`login.failure.protocol.refresh`)},stepKeys:[],docsHref:`https://docs.openclaw.ai/web/control-ui`});let a=de(!1,n,r);if(a){let e=a.requestId?`openclaw devices approve ${a.requestId}`:null;return Y({kind:`pairing-required`,rawError:n,docsHref:`https://docs.openclaw.ai/web/control-ui#device-pairing-first-connection`,titleKey:a.kind===`scope-upgrade-pending`?`login.failure.pairing.scopeTitle`:a.kind===`role-upgrade-pending`?`login.failure.pairing.roleTitle`:a.kind===`metadata-upgrade-pending`?`login.failure.pairing.metadataTitle`:`login.failure.pairing.title`,summaryKey:a.kind===`pairing-required`?`login.failure.pairing.summary`:`login.failure.pairing.upgradeSummary`,stepKeys:[{key:`login.failure.pairing.stepDashboard`,commands:[`openclaw dashboard`]},{key:`login.failure.pairing.stepList`,commands:[`openclaw devices list`]},e?{key:`login.failure.pairing.stepApproveId`,commands:[e]}:`login.failure.pairing.stepApprove`,`login.failure.pairing.stepReconnect`],stepParams:{requestId:a.requestId??``}})}if(r===o.AUTH_RATE_LIMITED||i.includes(`too many failed authentication attempts`)||i.includes(`rate limit`))return Y({kind:`auth-rate-limited`,rawError:n,titleKey:`login.failure.rateLimited.title`,summaryKey:`login.failure.rateLimited.summary`,stepKeys:[`login.failure.rateLimited.stepStop`,`login.failure.rateLimited.stepWait`,`login.failure.rateLimited.stepCheckClients`]});if(ae(!1,n,r))return Y({kind:`insecure-context`,rawError:n,docsHref:`https://docs.openclaw.ai/web/control-ui#insecure-http`,titleKey:`login.failure.insecure.title`,summaryKey:`login.failure.insecure.summary`,stepKeys:[`login.failure.insecure.stepHttps`,`login.failure.insecure.stepAvoidDisable`]});if(r===o.CONTROL_UI_ORIGIN_NOT_ALLOWED||i.includes(`origin not allowed`))return Y({kind:`origin-not-allowed`,rawError:n,docsHref:`https://docs.openclaw.ai/web/control-ui#debuggingtesting-dev-server--remote-gateway`,titleKey:`login.failure.origin.title`,summaryKey:`login.failure.origin.summary`,stepKeys:[`login.failure.origin.stepAllowedOrigins`,`login.failure.origin.stepFullOrigin`,`login.failure.origin.stepRestart`]});if(i.includes(`protocol mismatch`))return Y({kind:`protocol-mismatch`,rawError:n,docsHref:`https://docs.openclaw.ai/web/control-ui#debuggingtesting-dev-server--remote-gateway`,titleKey:`login.failure.protocol.title`,summaryKey:`login.failure.protocol.summary`,refreshAction:{label:S(`login.failure.protocol.refresh`)},stepKeys:[{key:`login.failure.protocol.stepDashboard`,commands:[`openclaw dashboard`]},{key:`login.failure.protocol.stepDevUi`,commands:[`pnpm ui:dev`]},`login.failure.protocol.stepRestart`]});let s=pe({connected:!1,lastError:n,lastErrorCode:r,hasToken:e.hasToken,hasPassword:e.hasPassword});return Y(s===`required`?{kind:`auth-required`,rawError:n,titleKey:`login.failure.authRequired.title`,summaryKey:`login.failure.authRequired.summary`,stepKeys:[{key:`login.failure.authRequired.stepPaste`,commands:[`openclaw gateway auth-token --show`]},{key:`login.failure.authRequired.stepGenerate`,commands:[`openclaw doctor --generate-gateway-token`]},`login.failure.authRequired.stepConnect`]}:s===`failed`?{kind:`auth-failed`,rawError:n,titleKey:`login.failure.authFailed.title`,summaryKey:`login.failure.authFailed.summary`,stepKeys:[{key:`login.failure.authFailed.stepDashboard`,commands:[`openclaw dashboard --no-open`,`openclaw gateway auth-token --show`]},`login.failure.authFailed.stepReplace`,`login.failure.authFailed.stepMode`]}:{kind:`network`,rawError:n,titleKey:`login.failure.network.title`,summaryKey:`login.failure.network.summary`,stepKeys:[{key:`login.failure.network.stepGateway`,commands:[`openclaw status`,`openclaw gateway run`]},`login.failure.network.stepUrl`,{key:`login.failure.network.stepDashboard`,commands:[`openclaw dashboard --no-open`]}]})}function or(){window.location.reload()}function sr(e,t){let n=new Set(t),r=[...n].map(t=>({command:t,index:e.indexOf(t)})).filter(e=>e.index>=0).toSorted((e,t)=>e.index-t.index||t.command.length-e.command.length),i=[],a=0;for(let t of r)t.index<a||(t.index>a&&i.push({kind:`text`,value:e.slice(a,t.index)}),i.push({kind:`command`,value:t.command}),n.delete(t.command),a=t.index+t.command.length);(a<e.length||!i.length)&&i.push({kind:`text`,value:e.slice(a)});for(let e of n)i.length&&i.push({kind:`text`,value:` `}),i.push({kind:`command`,value:e});return i}function cr(e){return sr(e.text,e.commands).map(e=>e.kind===`command`?tr(e.value):e.value)}function lr(e){return h`
<div
class="callout danger login-gate__failure"
role="alert"
aria-live="polite"
data-kind=${e.kind}
>
<div class="login-gate__failure-title">${e.title}</div>
<div class="login-gate__failure-summary">${e.summary}</div>
${e.refreshAction?h`
<button
type="button"
class="btn primary login-gate__failure-refresh"
@click=${or}
>
${e.refreshAction.label}
</button>
`:m}
<ol class="login-gate__failure-steps">
${e.steps.map(e=>h`<li>${cr(e)}</li>`)}
</ol>
<details class="login-gate__failure-detail">
<summary>${S(`login.failure.rawError`)}</summary>
<div class="login-gate__failure-raw mono">${e.rawError}</div>
</details>
<a
class="session-link login-gate__failure-docs"
href=${e.docsHref}
target=${se}
rel=${le()}
>${e.docsLabel}</a
>
</div>
`}function ur(e){let t=De(e.resourceBasePath),n=Ee(`favicon.svg`,t),r=ar({connected:e.connected,lastError:e.lastError,lastErrorCode:e.lastErrorCode,hasToken:e.hasToken,hasPassword:e.hasPassword});return h`
<div class="login-gate">
<div class="login-gate__card">
<div class="login-gate__header">
<img class="login-gate__logo" src=${n} alt="OpenClaw" />
<div class="login-gate__title">OpenClaw</div>
<div class="login-gate__sub">${S(`login.subtitle`)}</div>
</div>
<div class="login-gate__form">
<label class="field">
<span>${S(`connection.access.wsUrl`)}</span>
<input
inputmode="url"
autocapitalize="none"
autocorrect="off"
autocomplete="off"
spellcheck="false"
enterkeyhint="go"
.value=${e.gatewayUrl}
@input=${t=>{e.onGatewayUrlChange(t.target.value)}}
@keydown=${t=>{t.key===`Enter`&&e.onConnect()}}
placeholder="ws://127.0.0.1:18789"
/>
</label>
<label class="field">
<span>${S(`connection.access.token`)}</span>
<span class="settings-secret">
<input
type=${e.showGatewayToken?`text`:`password`}
autocomplete="off"
spellcheck="false"
enterkeyhint="go"
.value=${e.token}
@input=${t=>{e.onTokenChange(t.target.value)}}
placeholder="OPENCLAW_GATEWAY_TOKEN (${S(`login.passwordPlaceholder`)})"
@keydown=${t=>{t.key===`Enter`&&e.onConnect()}}
/>
<openclaw-tooltip
.content=${e.showGatewayToken?S(`login.hideToken`):S(`login.showToken`)}
>
<button
type="button"
class="settings-secret__toggle"
aria-label=${S(`login.toggleTokenVisibility`)}
aria-pressed=${e.showGatewayToken}
@click=${e.onToggleGatewayToken}
>
${e.showGatewayToken?T.eye:T.eyeOff}
</button>
</openclaw-tooltip>
</span>
</label>
<label class="field">
<span>${S(`connection.access.password`)}</span>
<span class="settings-secret">
<input
type=${e.showGatewayPassword?`text`:`password`}
autocomplete="off"
spellcheck="false"
enterkeyhint="go"
.value=${e.password}
@input=${t=>{e.onPasswordChange(t.target.value)}}
placeholder="${S(`login.passwordPlaceholder`)}"
@keydown=${t=>{t.key===`Enter`&&e.onConnect()}}
/>
<openclaw-tooltip
.content=${e.showGatewayPassword?S(`login.hidePassword`):S(`login.showPassword`)}
>
<button
type="button"
class="settings-secret__toggle"
aria-label=${S(`login.togglePasswordVisibility`)}
aria-pressed=${e.showGatewayPassword}
@click=${e.onToggleGatewayPassword}
>
${e.showGatewayPassword?T.eye:T.eyeOff}
</button>
</openclaw-tooltip>
</span>
</label>
<button class="btn primary login-gate__connect" @click=${e.onConnect}>
${S(`common.connect`)}
</button>
</div>
${r?lr(r):``}
<details class="login-gate__help">
<summary class="login-gate__help-title">${S(`connection.help.title`)}</summary>
<ol class="login-gate__steps">
<li>${S(`connection.help.step1`)}${tr(`openclaw gateway run`)}</li>
<li>${S(`connection.help.step2`)} ${tr(`openclaw dashboard`)}</li>
<li>${S(`connection.help.step3`)}</li>
</ol>
<div class="login-gate__docs">
<a
class="session-link"
href="https://docs.openclaw.ai/web/dashboard"
target="_blank"
rel="noreferrer"
>${S(`connection.help.docsLink`)}</a
>
</div>
</details>
</div>
</div>
`}var dr;function fr(){return(fr=e((()=>{g(),v(),r(),Ae(),Ce(),C(),ge(),ye(),_e(),p(),nr(),E(),dr=class extends oe{render(){return this.props?ur(this.props):m}},l([y({attribute:!1})],dr.prototype,`props`,void 0),customElements.get(`openclaw-login-gate`)||customElements.define(`openclaw-login-gate`,dr)})))()}function pr(e){return e.hasAttribute(`aria-label`)||e.hasAttribute(`aria-labelledby`)||e.matches(`img[alt], input[alt]`)||at(e).trim()?!1:e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement?!e.labels?.length&&!e.matches(`input[type="button"], input[type="submit"], input[type="reset"]`):!0}function mr(e){let t=null,n=null,r=()=>{if(!n)return;let{anchor:e,title:r,label:i}=n;n=null,a.disconnect(),e.removeEventListener(`pointerleave`,o),e.removeEventListener(`focusout`,s),r!==null&&e.getAttribute(`title`)===``&&e.setAttribute(`title`,r),i!==null&&e.getAttribute(`aria-label`)===i&&e.removeAttribute(`aria-label`),t&&(t.anchor=null,t.remove())},i=()=>n?.anchor.getAttribute(`data-tooltip`)??n?.title??``,a=new MutationObserver(e=>{if(n){if(!n.anchor.isConnected){r();return}e.some(e=>n?.anchor.contains(e.target))&&(e.some(e=>e.target===n?.anchor&&e.attributeName===`title`)&&(n.title=n.anchor.getAttribute(`title`),n.title!==null&&(n.anchor.setAttribute(`title`,``),a.takeRecords())),n.label!==null&&n.anchor.getAttribute(`aria-label`)===n.label&&(n.anchor.removeAttribute(`aria-label`),n.label=null),n.title&&pr(n.anchor)&&(n.label=n.title,n.anchor.setAttribute(`aria-label`,n.label)),t&&(t.content=i()))}}),o=e=>{!n||e.target!==n.anchor||(n.pointer=!1,n.focus||r())},s=e=>{!n||e instanceof FocusEvent&&e.relatedTarget instanceof Node&&n.anchor.contains(e.relatedTarget)||(n.focus=!1,n.pointer||r())},c=c=>{if(`pointerType`in c&&c.pointerType===`touch`)return;let l=c.composedPath().filter(nt),ee=l.some(e=>e.localName===`openclaw-tooltip`),u;for(let e of l){if(e.localName===`iframe`)break;let t=e===n?.anchor?n.title:e.getAttribute(`title`),r=e.getAttribute(`data-tooltip`)??t;if(r!==null){u=r?e:void 0;break}}let d=c.type===`focusin`?`focus`:`pointer`;if(u===n?.anchor){n&&(n[d]=!0);return}if(!u&&n?.focus&&d===`pointer`||(r(),!u))return;let f=u.getAttribute(`title`),te=f&&pr(u)?f:null;n={anchor:u,title:f,label:te,pointer:d===`pointer`,focus:d===`focus`},f!==null&&u.setAttribute(`title`,``),te!==null&&u.setAttribute(`aria-label`,te),u.addEventListener(`pointerleave`,o),u.addEventListener(`focusout`,s),a.observe(u,{attributes:!0,attributeFilter:[`title`,`data-tooltip`,`aria-hidden`],characterData:!0,subtree:!0}),a.observe(e,{childList:!0,subtree:!0});let ne=u.getRootNode();ne instanceof ShadowRoot&&a.observe(ne,{childList:!0,subtree:!0}),ee||(t??=e.createElement(`openclaw-tooltip`),(l.find(e=>e.localName===`openclaw-modal-dialog`)??e.body).append(t),t.previewForAnchor(u,i(),d))};return e.addEventListener(`pointerover`,c,!0),e.addEventListener(`focusin`,c,!0),()=>{e.removeEventListener(`pointerover`,c,!0),e.removeEventListener(`focusin`,c,!0),r()}}function hr(){return(hr=e((()=>{O()})))()}function gr(e){if(!Cr.test(e))return;let[t=``,n]=e.toLowerCase().split(`e`),r=t.startsWith(`-`),[i=``,a=``]=(r?t.slice(1):t).split(`.`),o=`${i||`0`}${a}`;if(/^0+$/u.test(o))return{numerator:0n,denominator:1n};let s=Number(n??0);if(!Number.isSafeInteger(s))return;let c=a.length-s;if(o.length>wr||Math.abs(c)>wr)return;let l=BigInt(o),ee=c<0?l*10n**BigInt(-c):l;return{numerator:r?-ee:ee,denominator:c>0?10n**BigInt(c):1n}}function _r(e,t){return e.numerator*t.denominator===t.numerator*e.denominator}function vr(e){let t=e.trim();return t!==``&&Cr.test(t)}function yr(e){let t=e.trim();return/^-?\d+$/u.test(t)&&!Number.isSafeInteger(Number(t))}function br(e,t){let n=e.trim();if(n===``)return;if(!vr(n))return e;let r=Number(n);if(!Number.isFinite(r)||t&&!Number.isInteger(r))return e;let i=gr(n);if(!i)return e;let a=Number.isInteger(r)?void 0:Sr(r);return(Number.isInteger(r)?i.numerator===BigInt(r)*i.denominator:a&&_r(i,a))?r:e}function xr(e){return Number.isInteger(e)?BigInt(e).toString():String(e)}function Sr(e){if(Number.isFinite(e))return gr(String(e))}var Cr,wr;function Tr(){return(Tr=e((()=>{Cr=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/u,wr=1024})))()}function Er(e){if(e.setAttribute(`popover`,`manual`),typeof e.showPopover==`function`)try{e.showPopover();return}catch{}e.removeAttribute(`popover`)}var Dr;function Or(){return(Or=e((()=>{Dr=class extends HTMLElement{connectedCallback(){Er(this)}},customElements.get(`openclaw-menu-surface`)||customElements.define(`openclaw-menu-surface`,Dr)})))()}function kr(e,t){if(e.key===`Tab`){t?.();return}e.key===`Escape`&&e.currentTarget&&Ir.add(e.currentTarget)}function Ar(e){let t=e.currentTarget;return!t||!Ir.has(t)?!1:(Ir.delete(t),!0)}function jr(e,t){if(!(e instanceof HTMLElement)||e.localName!==`wa-dropdown-item`)return;let n=e;Promise.resolve(n.updateComplete).then(()=>{n.isConnected&&(n.setAttribute(`role`,`menuitemradio`),n.setAttribute(`aria-checked`,String(t)))})}function Mr(e){let t=e.shadowRoot?.querySelector(`[part="menu"]`);if(!t)return;let n=e.getAttribute(`aria-label`);if(n){t.setAttribute(`aria-label`,n),t.removeAttribute(`aria-labelledby`);return}let r=e.querySelector(`[slot="trigger"]`),i=r?.getAttribute(`aria-label`)??r?.textContent?.trim();i&&(t.setAttribute(`aria-label`,i),t.removeAttribute(`aria-labelledby`))}function Nr(e){let t=e.target;if(!(t instanceof HTMLElement)||t.localName!==`wa-dropdown`||(t.shadowRoot?.querySelector(`[part="menu"]`)?.removeAttribute(`inert`),Mr(t),X.get(t)?.disconnect(),typeof MutationObserver>`u`))return;let n=new MutationObserver(()=>Mr(t));n.observe(t,{attributes:!0,attributeFilter:[`aria-label`],childList:!0,characterData:!0,subtree:!0}),X.set(t,n)}function Pr(e){let t=e.target;!(t instanceof HTMLElement)||t.localName!==`wa-dropdown`||queueMicrotask(()=>{e.defaultPrevented||!t.isConnected||t.open||t.shadowRoot?.querySelector(`[part="menu"]`)?.setAttribute(`inert`,``)})}function Fr(e){let t=e.target;!(t instanceof HTMLElement)||t.localName!==`wa-dropdown`||(X.get(t)?.disconnect(),X.delete(t))}var Ir,X;function Lr(){return(Lr=e((()=>{ee(),c(),Ir=new WeakSet,X=new WeakMap,typeof document<`u`&&(document.addEventListener(`wa-show`,Nr),document.addEventListener(`wa-hide`,Pr),document.addEventListener(`wa-after-hide`,Fr))})))()}var Rr;function zr(){return(zr=e((()=>{Lr(),Rr=class{constructor(e,t){this.host=e,this.options=t,this.generation=0,this.handleDocumentKeydown=e=>{if(this.options.onKeydown?.(e),!e.defaultPrevented){if(e.key!==`Escape`){e.key===`Tab`&&e.composedPath().some(e=>e instanceof Element&&e.localName===`wa-dropdown-item`&&this.host.contains(e))&&kr(e,()=>this.options.getTrigger()?.focus());return}e.preventDefault(),e.stopPropagation(),this.options.getTrigger()?.focus(),this.options.onClose()}},e.addController(this)}hostConnected(){document.addEventListener(`keydown`,this.handleDocumentKeydown,!0);let e=++this.generation;this.focusFirstItem(e)}hostDisconnected(){this.generation+=1,document.removeEventListener(`keydown`,this.handleDocumentKeydown,!0)}async focusFirstItem(e){await this.host.updateComplete,await this.host.querySelector(`wa-dropdown`)?.updateComplete,this.host.isConnected&&e===this.generation&&this.host.querySelector(`wa-dropdown-item:not([disabled])`)?.focus()}}})))()}function Z(e){return h`<span slot="details" class="session-menu__shortcut" aria-hidden="true"
>${e.toUpperCase()}</span
>`}function Br(e,t){if(t.metaKey||t.ctrlKey||t.altKey)return!1;let n=f(t);if(!n)return!1;let r=e.querySelector(`[data-shortcut="${n}"]`);if(!r||r.disabled||r.getAttribute(`aria-disabled`)===`true`)return!1;let i=r.closest(`wa-dropdown-item:not([slot="submenu"])`);return r.getAttribute(`slot`)===`submenu`&&i?.submenuOpen!==!0?!1:(t.preventDefault(),t.stopPropagation(),r.click(),!0)}function Vr(){return(Vr=e((()=>{g(),ie()})))()}var Q;function Hr(){return(Hr=e((()=>{g(),v(),C(),p(),zr(),E(),Vr(),Lr(),Q=class extends ce{constructor(...e){super(...e),this.x=0,this.y=0,this.trigger=null,this.onAction=()=>{},this.onClose=()=>{},this.menuLifecycle=new Rr(this,{getTrigger:()=>this.trigger,onClose:()=>this.onClose(),onKeydown:e=>Br(this,e)})}runAction(e){this.onClose(),this.onAction(e)}render(){let e=Math.max(8,Math.min(this.x,window.innerWidth-264-8)),t=Math.max(8,Math.min(this.y,window.innerHeight-136-8));return h`
<wa-dropdown
class="session-menu native-link-menu"
.open=${!0}
placement="bottom-start"
.distance=${0}
aria-label=${S(`nativeLinkMenu.label`)}
@wa-select=${e=>{e.preventDefault();let t=e.detail.item.value;t&&(this.trigger?.focus(),this.runAction(t))}}
@wa-after-hide=${()=>{this.onClose()}}
>
<button
slot="trigger"
type="button"
tabindex="-1"
aria-hidden="true"
aria-label=${S(`nativeLinkMenu.label`)}
style="position: fixed; left: ${e}px; top: ${t}px; width: 1px; height: 1px; opacity: 0; pointer-events: none;"
></button>
<wa-dropdown-item
class="session-menu__item"
value="inline"
data-shortcut="s"
aria-keyshortcuts="S"
>
<span slot="icon" class="session-menu__icon" aria-hidden="true"
>${T.panelRightOpen}</span
>
<span class="session-menu__text">${S(`nativeLinkMenu.openInline`)}</span>
${Z(`s`)}
</wa-dropdown-item>
<wa-dropdown-item
class="session-menu__item"
value="external"
data-new-tab-action
data-shortcut="b"
aria-keyshortcuts="B"
>
<span slot="icon" class="session-menu__icon" aria-hidden="true"
>${T.externalLink}</span
>
<span class="session-menu__text">${S(`nativeLinkMenu.openExternal`)}</span>
${Z(`b`)}
</wa-dropdown-item>
<div class="session-menu__separator" role="separator"></div>
<wa-dropdown-item
class="session-menu__item"
value="copy"
data-shortcut="c"
aria-keyshortcuts="C"
>
<span slot="icon" class="session-menu__icon" aria-hidden="true">${T.copy}</span>
<span class="session-menu__text">${S(`nativeLinkMenu.copy`)}</span>
${Z(`c`)}
</wa-dropdown-item>
</wa-dropdown>
`}},l([y({attribute:!1})],Q.prototype,`x`,void 0),l([y({attribute:!1})],Q.prototype,`y`,void 0),l([y({attribute:!1})],Q.prototype,`trigger`,void 0),l([y({attribute:!1})],Q.prototype,`onAction`,void 0),l([y({attribute:!1})],Q.prototype,`onClose`,void 0),customElements.get(`openclaw-native-link-menu`)||customElements.define(`openclaw-native-link-menu`,Q)})))()}function Ur(e){return re(ne.terminalPanel,e)}var Wr,Gr,Kr,qr,Jr,Yr,Xr,Zr;function Qr(){return(Qr=e((()=>{be(),Wr=`openclaw:terminal-toggle`,Gr=`openclaw:terminal-dock-bottom`,Kr=`openclaw:browser-toggle`,qr=`openclaw:desktop-toggle`,Jr=`openclaw:custodian-toggle`,Yr=`openclaw:debug-overlay-request`,Xr=`openclaw:keyboard-shortcuts-request`,Zr=`openclaw:ui-command`})))()}function $r(e){let t=e instanceof CustomEvent?e.detail:void 0,n=t&&typeof t==`object`&&`trigger`in t?t.trigger:null;return n instanceof HTMLElement?n:void 0}function ei(e){return re(ne.commandPalette,e)}function ti(e){return typeof e==`object`&&!!e&&`owner`in e&&e.owner instanceof Element&&`onSlashCommand`in e&&(e.onSlashCommand===null||typeof e.onSlashCommand==`function`)}function ni(e,t){let n=t instanceof CustomEvent?t.detail:void 0;return ti(n)?n.onSlashCommand?n:e?.owner===n.owner?void 0:e:null}function ri(e,t){let n=ni(e.commandPaletteTarget,t);n!==null&&(e.commandPaletteTarget=n,e.requestUpdate())}var ii,ai,oi;function si(){return(si=e((()=>{be(),ii=`openclaw-command-palette-target`,ai=`openclaw:command-palette-open`,oi=`openclaw:shell-nav-drawer-toggle`})))()}function ci(e,t){$.set(e,{event:t,createdAt:Date.now()})}function li(e,t){$.get(e)?.event===t&&$.delete(e)}function ui(e){let t=$.get(e)??null;return $.delete(e),t&&Date.now()-t.createdAt<=di?t.event:null}var di,$;function fi(){return(fi=e((()=>{di=1e4,$=new Map})))()}function pi(e){let t=!!e.disabledReason,n=`${Oe(`new-session`,e.basePath)}${me(e.agentId,e.target)}`;return h`<openclaw-tooltip .content=${e.disabledReason??e.label}>
<a
class=${e.className}
role="link"
href=${t?m:n}
aria-label=${e.label}
aria-disabled=${t?`true`:m}
tabindex=${t?`-1`:m}
@contextmenu=${e=>{e.stopPropagation()}}
@click=${n=>{if(t){n.preventDefault();return}te(n)&&(n.preventDefault(),e.onOpen?.(e.agentId,e.target))}}
>
${T.plus}
</a>
</openclaw-tooltip>`}function mi(){return(mi=e((()=>{g(),Ae(),E(),O()})))()}function hi(e,t){let n=e.settingsSidebarRenderer;if(n)return n(t);let r=e.settingsSidebarLoadFailed;return r||e.loadSettingsSidebarRenderer(),h`<aside class="settings-sidebar" aria-busy=${r?m:`true`}>
<header class="settings-sidebar__header">
<button type="button" class="settings-sidebar__back" @click=${t.onExit}>
<span class="settings-sidebar__back-icon" aria-hidden="true">${T.arrowLeft}</span>
${S(`nav.exitSettings`)}
</button>
<h1 class="settings-sidebar__title">${S(`nav.settings`)}</h1>
</header>
<div class="settings-sidebar__empty" role=${r?`alert`:`status`}>
${S(r?`nav.settingsLoadFailed`:`common.loading`)}
${r?h`<button
class="btn btn--sm"
type="button"
@click=${()=>e.retrySettingsSidebarRenderer()}
>
${S(`common.retry`)}
</button>`:m}
</div>
</aside>`}function gi(){return(gi=e((()=>{g(),C(),E()})))()}export{Xn as $,Rr as A,xt as At,xr as B,w as Bt,Zr as C,pn as Ct,Br as D,dn as Dt,Hr as E,hn as Et,kr as F,O as Ft,mr as G,x as Gt,vr as H,C as Ht,Or as I,et as It,nr as J,We as Jt,fr as K,Ye as Kt,Er as L,T as Lt,Ar as M,bt as Mt,Lr as N,vt as Nt,Vr as O,un as Ot,jr as P,ht as Pt,$n as Q,Le as Qt,br as R,E as Rt,Wr as S,gn as St,Ur as T,mn as Tt,yr as U,Xe as Ut,Tr as V,Qe as Vt,hr as W,Ze as Wt,Gn as X,Re as Xt,tr as Y,Ge as Yt,Jn as Z,Ie as Zt,Jr as _,Sn as _t,li as a,Bn as at,Xr as b,yn as bt,ui as c,Mn as ct,oi as d,Fn as dt,Yn as et,ri as f,An as ft,Kr as g,Cn as gt,$r as h,q as ht,pi as i,Hn as it,zr as j,St as jt,Z as k,ln as kt,ai as l,Pn as lt,ei as m,On as mt,hi as n,Vn as nt,fi as o,kn as ot,si as p,jn as pt,ir as q,S as qt,mi as r,zn as rt,ci as s,Nn as st,gi as t,Wn as tt,ii as u,Ln as ut,Yr as v,Tn as vt,Qr as w,fn as wt,Gr as x,bn as xt,qr as y,xn as yt,Sr as z,$e as zt};
//# sourceMappingURL=control-ui-core-Br5DB0Zj.js.map