Decouple bundled UI from runtime API and add remote instance tooling (#1228)
Add a packaged-client runtime boundary so the shared UI can talk to local, desktop, remote, and VS Code runtimes through the right transport instead of assuming one same-origin web server. Centralize OpenChamber-owned API access behind RuntimeAPIs, runtimeFetch, and runtime URL helpers, while keeping official OpenCode traffic on the SDK path. Support runtime switching, remote host selection, desktop client credentials, and headless connection links for pairing packaged clients with remote OpenChamber servers. Harden the new auth model by moving long-lived client tokens out of browser URLs, introducing short-lived scoped URL tokens for browser-owned transports, restricting URL-token access to explicit readable/realtime routes, and making client-token management session-scoped or self-scoped as appropriate. Update browser-owned assets and preview proxy flows to work with the split runtime model, including authenticated project icons, preview token propagation, CSP-safe preview bridge injection, and preview proxy auth that survives short-lived URL-token expiry. Tighten Electron security boundaries for packaged clients by gating privileged preload state to trusted origins and requiring explicit confirmation before connect deep-links import or switch remote runtimes. Also refresh agent guidance and project skills so future runtime/API, auth, preview, UI, CLI, settings, locale, and drag-to-reorder work follows the new architecture.
This commit is contained in:
committed by
GitHub
parent
a4314c189b
commit
2031e3b4a8
@@ -198,19 +198,50 @@ export const settingsDict = {
|
||||
"settings.magicPrompts.sidebar.item.sessionFusion": "Fusion",
|
||||
"settings.remoteInstances.sidebar.title": "Віддалені інстанси",
|
||||
"settings.remoteInstances.sidebar.total": "Усього {count}",
|
||||
"settings.remoteInstances.sidebar.newSshInstanceName": "Новий інстанс SSH",
|
||||
"settings.remoteInstances.sidebar.actions.addSshInstance": "Додати інстанс SSH",
|
||||
"settings.remoteInstances.sidebar.newSshInstanceName": "Нове SSH-підключення",
|
||||
"settings.remoteInstances.sidebar.actions.addSshInstance": "Додати SSH-підключення",
|
||||
"settings.remoteInstances.sidebar.actions.connect": "Підключитися",
|
||||
"settings.remoteInstances.sidebar.actions.disconnect": "Відключити",
|
||||
"settings.remoteInstances.sidebar.actions.retry": "Повторити спробу",
|
||||
"settings.remoteInstances.sidebar.actions.remove": "Видалити",
|
||||
"settings.remoteInstances.sidebar.confirm.localPortInUseRetry": "Локальний порт уже використовується. Вибрати випадковий вільний локальний порт і повторити спробу?",
|
||||
"settings.remoteInstances.sidebar.toast.createFailed": "Не вдалося створити інстанс SSH",
|
||||
"settings.remoteInstances.sidebar.toast.createFailed": "Не вдалося створити SSH-підключення",
|
||||
"settings.remoteInstances.sidebar.toast.retriedWithRandomPort": "Повторна спроба з випадковим локальним портом",
|
||||
"settings.remoteInstances.sidebar.toast.connectFailed": "Не вдалося підключити інстанс",
|
||||
"settings.remoteInstances.sidebar.toast.disconnectFailed": "Не вдалося від’єднати інстанс",
|
||||
"settings.remoteInstances.sidebar.toast.retryFailed": "Не вдалося повторити підключення",
|
||||
"settings.remoteInstances.sidebar.toast.removeFailed": "Не вдалося видалити інстанс",
|
||||
"settings.remoteInstances.direct.sidebarTitle": "Посилання на сервери",
|
||||
"settings.remoteInstances.direct.sidebarDescription": "Підключення через посилання або токен",
|
||||
"settings.remoteInstances.direct.title": "Інші сервери OpenChamber",
|
||||
"settings.remoteInstances.direct.description": "Додайте інший сервер OpenChamber за URL. Використовуйте це, коли сервер уже запущений і у вас є токен підключення.",
|
||||
"settings.remoteInstances.direct.field.labelPlaceholder": "Назва (необов’язково)",
|
||||
"settings.remoteInstances.direct.field.urlPlaceholder": "https://host:port",
|
||||
"settings.remoteInstances.direct.field.tokenPlaceholder": "Токен підключення (необов’язково для довірених локальних серверів)",
|
||||
"settings.remoteInstances.direct.note": "Токени підключення зберігаються на цьому пристрої й використовуються лише коли цей застосунок підключається до відповідного сервера.",
|
||||
"settings.remoteInstances.direct.actions.add": "Додати сервер",
|
||||
"settings.remoteInstances.direct.import.description": "Вставте посилання для підключення з іншого сервера OpenChamber.",
|
||||
"settings.remoteInstances.direct.import.placeholder": "openchamber://connect?...",
|
||||
"settings.remoteInstances.direct.import.action": "Імпортувати посилання",
|
||||
"settings.remoteInstances.direct.error.invalidConnectLink": "Недійсне посилання підключення OpenChamber.",
|
||||
"settings.remoteInstances.direct.state.loading": "Завантаження серверів...",
|
||||
"settings.remoteInstances.direct.state.empty": "Інших серверів ще не додано.",
|
||||
"settings.remoteInstances.clientAuth.title": "Підключення до цього сервера",
|
||||
"settings.remoteInstances.clientAuth.description": "Створіть безпечне посилання або токен, щоб OpenChamber Desktop міг підключитися до цього сервера.",
|
||||
"settings.remoteInstances.clientAuth.field.labelPlaceholder": "Назва пристрою (необов’язково)",
|
||||
"settings.remoteInstances.clientAuth.actions.create": "Створити токен",
|
||||
"settings.remoteInstances.clientAuth.actions.pair": "Створити посилання",
|
||||
"settings.remoteInstances.clientAuth.actions.revoke": "Відкликати",
|
||||
"settings.remoteInstances.clientAuth.actions.clearRevoked": "Очистити відкликані",
|
||||
"settings.remoteInstances.clientAuth.qrAlt": "QR-код підключення OpenChamber",
|
||||
"settings.remoteInstances.clientAuth.pairingUrl": "Посилання для підключення",
|
||||
"settings.remoteInstances.clientAuth.createdToken": "Скопіюйте цей токен зараз. З міркувань безпеки він більше не показуватиметься.",
|
||||
"settings.remoteInstances.clientAuth.state.loading": "Завантаження токенів...",
|
||||
"settings.remoteInstances.clientAuth.state.empty": "Жоден пристрій ще не підключено.",
|
||||
"settings.remoteInstances.clientAuth.state.revoked": "Відкликано",
|
||||
"settings.remoteInstances.clientAuth.state.thisDevice": "Цей пристрій",
|
||||
"settings.remoteInstances.clientAuth.lastUsed": "Останнє використання {date}",
|
||||
"settings.remoteInstances.clientAuth.neverUsed": "Ще не використовувався",
|
||||
"settings.remoteInstances.sidebar.phase.ready": "Готово",
|
||||
"settings.remoteInstances.sidebar.phase.error": "Помилка",
|
||||
"settings.remoteInstances.sidebar.phase.reconnect": "Повторне підключення",
|
||||
@@ -221,20 +252,20 @@ export const settingsDict = {
|
||||
"settings.remoteInstances.sidebar.phase.connecting": "Підключення",
|
||||
"settings.remoteInstances.sidebar.phase.idle": "Очікує",
|
||||
"settings.remoteInstances.page.section.instance": "Інстанс",
|
||||
"settings.remoteInstances.page.section.instanceDescription": "Основні налаштування SSH.",
|
||||
"settings.remoteInstances.page.section.instanceDescription": "Виберіть SSH-команду й назву для цього підключення.",
|
||||
"settings.remoteInstances.page.field.mode": "Режим",
|
||||
"settings.remoteInstances.page.field.modeHint": "Керований режим встановлює/оновлює OpenChamber і запускає його віддалено. Зовнішній режим очікує, що сервер уже запущено.",
|
||||
"settings.remoteInstances.page.field.modeHint": "Виберіть, чи OpenChamber має запустити сервер для вас, чи підключитися до вже запущеного.",
|
||||
"settings.remoteInstances.page.field.modePlaceholder": "Виберіть режим",
|
||||
"settings.remoteInstances.page.field.modeManaged": "Керований (автоматичний запуск)",
|
||||
"settings.remoteInstances.page.field.modeExternal": "Зовнішній (вже працює)",
|
||||
"settings.remoteInstances.page.field.modeManaged": "Запустити для мене",
|
||||
"settings.remoteInstances.page.field.modeExternal": "Уже запущено",
|
||||
"settings.remoteInstances.page.field.preferredRemotePort": "Бажаний віддалений порт",
|
||||
"settings.remoteInstances.page.field.preferredRemotePortHint": "Порт OpenChamber на віддаленому хості. Залиште порожнім для автоматичного вибору під час запуску.",
|
||||
"settings.remoteInstances.page.field.preferredRemotePortHint": "Порт на віддаленій машині. Залиште порожнім, щоб вибрати автоматично.",
|
||||
"settings.remoteInstances.page.field.keepServerRunning": "Залишати сервер запущеним",
|
||||
"settings.remoteInstances.page.field.keepServerRunningHint": "Якщо ввімкнено, демон OpenChamber продовжує працювати віддалено після відключення.",
|
||||
"settings.remoteInstances.page.field.keepServerRunningHint": "Залишати OpenChamber запущеним на віддаленій машині після відключення.",
|
||||
"settings.remoteInstances.page.field.bindHost": "Прив’язати хост",
|
||||
"settings.remoteInstances.page.field.bindHostHint": "Мережевий інтерфейс для основної локальної URL-адреси. Використовуйте 127.0.0.1/localhost лише для локального доступу.",
|
||||
"settings.remoteInstances.page.field.bindHostHint": "Де має слухати локальне підключення. Використовуйте 127.0.0.1 або localhost, якщо вам не потрібен доступ з локальної мережі.",
|
||||
"settings.remoteInstances.page.field.preferredLocalPort": "Бажаний локальний порт",
|
||||
"settings.remoteInstances.page.field.preferredLocalPortHint": "Бажаний локальний порт для головного тунелю OpenChamber. Залиште порожнім для автоматичного вибору.",
|
||||
"settings.remoteInstances.page.field.preferredLocalPortHint": "Локальний порт для цього підключення. Залиште порожнім, щоб вибрати автоматично.",
|
||||
"settings.remoteInstances.page.field.forwardType": "Тип переадресації",
|
||||
"settings.remoteInstances.page.field.localHostPlaceholder": "127.0.0.1",
|
||||
"settings.remoteInstances.page.field.remoteHostPlaceholder": "127.0.0.1",
|
||||
@@ -243,7 +274,7 @@ export const settingsDict = {
|
||||
"settings.remoteInstances.page.preview.localSocks5": "(локальний SOCKS5)",
|
||||
"settings.remoteInstances.page.preview.local": "(локальний)",
|
||||
"settings.remoteInstances.page.preview.remote": "(віддалений)",
|
||||
"settings.remoteInstances.page.toast.openLocalEndpointFailed": "Не вдалося відкрити локальну кінцеву точку",
|
||||
"settings.remoteInstances.page.toast.openLocalEndpointFailed": "Не вдалося відкрити локальну адресу",
|
||||
"settings.remoteInstances.page.toast.localUrlCopied": "Локальний URL скопійовано",
|
||||
"settings.remoteInstances.page.actions.copyLocalUrl": "Скопіювати локальний URL",
|
||||
"settings.remoteInstances.page.actions.open": "Відкрити",
|
||||
@@ -945,26 +976,26 @@ export const settingsDict = {
|
||||
"settings.usage.pace.waitSeparator": " · Зачекайте ",
|
||||
"settings.usage.pace.predictionLabel": "Прогноз: ",
|
||||
"settings.remoteInstances.page.title": "Віддалений інстанс",
|
||||
"settings.remoteInstances.page.description": "Налаштувати підключення SSH, віддалений сервер і параметри пересилання.",
|
||||
"settings.remoteInstances.page.description": "Підключіться до іншої машини через SSH і відкрийте там OpenChamber.",
|
||||
"settings.remoteInstances.page.empty.selectInstance": "Виберіть інстанс, щоб переглянути та змінити його налаштування.",
|
||||
"settings.remoteInstances.page.empty.noExtraForwards": "Не налаштовано додаткові переадресації портів.",
|
||||
"settings.remoteInstances.page.section.actions": "Дії",
|
||||
"settings.remoteInstances.page.section.actionsDescription": "Підключіться, перепідключіться, перегляньте журнали або видаліть цей інстанс.",
|
||||
"settings.remoteInstances.page.section.remoteServer": "Віддалений сервер",
|
||||
"settings.remoteInstances.page.section.remoteServerDescription": "Як OpenChamber керується та запускається на віддаленому хості.",
|
||||
"settings.remoteInstances.page.section.mainTunnel": "Головний тунель",
|
||||
"settings.remoteInstances.page.section.mainTunnelDescription": "Основна локальна кінцева точка для цього віддаленого інстанса.",
|
||||
"settings.remoteInstances.page.section.actionsDescription": "Підключіться, перепідключіться, перегляньте журнали або видаліть це підключення.",
|
||||
"settings.remoteInstances.page.section.remoteServer": "OpenChamber на віддаленій машині",
|
||||
"settings.remoteInstances.page.section.remoteServerDescription": "Виберіть, як OpenChamber має працювати після SSH-підключення.",
|
||||
"settings.remoteInstances.page.section.mainTunnel": "Локальний доступ",
|
||||
"settings.remoteInstances.page.section.mainTunnelDescription": "Виберіть локальну адресу, через яку відкриватиметься цей віддалений сервер OpenChamber.",
|
||||
"settings.remoteInstances.page.section.authentication": "Аутентифікація",
|
||||
"settings.remoteInstances.page.section.authenticationDescription": "Додаткові облікові дані для SSH та віддаленого інтерфейсу користувача OpenChamber.",
|
||||
"settings.remoteInstances.page.section.portForwards": "Перенаправлення портів",
|
||||
"settings.remoteInstances.page.section.portForwardsDescription": "Додаткове SSH-переадресування поза основним тунелем.",
|
||||
"settings.remoteInstances.page.section.portForwardsDescription": "Додаткові порти, які можна зробити доступними через це SSH-підключення.",
|
||||
"settings.remoteInstances.page.field.sshCommand": "Команда SSH",
|
||||
"settings.remoteInstances.page.field.sshCommandPlaceholder": "ssh користувач@хост",
|
||||
"settings.remoteInstances.page.field.nickname": "Назва",
|
||||
"settings.remoteInstances.page.field.nicknamePlaceholder": "Мій віддалений хост",
|
||||
"settings.remoteInstances.page.field.nicknamePlaceholder": "Робочий ноутбук",
|
||||
"settings.remoteInstances.page.field.connectionTimeoutSeconds": "Тайм-аут підключення (секунди)",
|
||||
"settings.remoteInstances.page.field.installMethod": "Спосіб встановлення",
|
||||
"settings.remoteInstances.page.field.installMethodHint": "Як інсталюється OpenChamber під час роботи в керованому режимі.",
|
||||
"settings.remoteInstances.page.field.installMethodHint": "Як розмістити OpenChamber на віддаленій машині, коли цей застосунок запускає його для вас.",
|
||||
"settings.remoteInstances.page.field.selectInstallMethodPlaceholder": "Вибрати метод встановлення",
|
||||
"settings.remoteInstances.page.field.installMethodDownloadRelease": "Завантажити випуск",
|
||||
"settings.remoteInstances.page.field.installMethodUploadBundle": "Завантажити пакет",
|
||||
@@ -973,14 +1004,14 @@ export const settingsDict = {
|
||||
"settings.remoteInstances.page.field.sshPasswordPlaceholder": "Введіть пароль SSH",
|
||||
"settings.remoteInstances.page.field.uiPasswordOptional": "Пароль інтерфейсу користувача (необов'язково)",
|
||||
"settings.remoteInstances.page.field.uiPasswordPlaceholder": "Введіть пароль інтерфейсу",
|
||||
"settings.remoteInstances.page.field.forwardTypeHint": "Виберіть локальне (-L), віддалене (-R) або динамічне (-D) переадресування.",
|
||||
"settings.remoteInstances.page.field.forwardTypeHint": "Виберіть, який доступ до портів має надавати це SSH-підключення.",
|
||||
"settings.remoteInstances.page.field.typePlaceholder": "Тип",
|
||||
"settings.remoteInstances.page.forwardType.local": "Локальний (-L)",
|
||||
"settings.remoteInstances.page.forwardType.remote": "Віддалений (-R)",
|
||||
"settings.remoteInstances.page.forwardType.dynamic": "Динамічний (-D)",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.local": "Перенаправляти локальний трафік до віддаленого пункту призначення.",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.remote": "Відкрити віддалену кінцеву точку та переслати її назад на локальну машину.",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.dynamic": "Відкрити локальний SOCKS5-проксі через SSH.",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.local": "Відкрити локальний порт, який підключається до сервісу на віддаленій машині.",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.remote": "Відкрити порт на віддаленій машині, який підключається назад до вашого комп’ютера.",
|
||||
"settings.remoteInstances.page.forwardTypeDescription.dynamic": "Відкрити локальний SOCKS-проксі через SSH-підключення.",
|
||||
"settings.remoteInstances.page.actions.create": "Створити",
|
||||
"settings.remoteInstances.page.actions.cancel": "Скасувати",
|
||||
"settings.remoteInstances.page.actions.connecting": "Підключення...",
|
||||
@@ -991,7 +1022,7 @@ export const settingsDict = {
|
||||
"settings.remoteInstances.page.actions.enableForwardAria": "Увімкнути пересилання",
|
||||
"settings.remoteInstances.page.actions.openLocal": "Відкрити локально",
|
||||
"settings.remoteInstances.page.actions.addForward": "Додати переадресацію",
|
||||
"settings.remoteInstances.page.import.sectionTitle": "Імпортувати з конфігурації SSH",
|
||||
"settings.remoteInstances.page.import.sectionTitle": "Збережені SSH-хости",
|
||||
"settings.remoteInstances.page.import.loading": "Завантаження хостів SSH...",
|
||||
"settings.remoteInstances.page.import.noneFound": "Не знайдено хостів SSH.",
|
||||
"settings.remoteInstances.page.import.noneAvailable": "Немає доступних для імпорту хостів SSH.",
|
||||
@@ -1006,7 +1037,7 @@ export const settingsDict = {
|
||||
"settings.remoteInstances.page.phase.resolvingConfiguration": "Визначення конфігурації",
|
||||
"settings.remoteInstances.page.phase.checkingAuth": "Перевірка автентифікації",
|
||||
"settings.remoteInstances.page.phase.establishingSsh": "Встановлення підключення SSH",
|
||||
"settings.remoteInstances.page.phase.probingRemote": "Перевірка віддаленого хоста",
|
||||
"settings.remoteInstances.page.phase.probingRemote": "Перевірка віддаленої машини",
|
||||
"settings.remoteInstances.page.phase.installingOpenChamber": "Встановлення OpenChamber",
|
||||
"settings.remoteInstances.page.phase.updatingOpenChamber": "Оновлення OpenChamber",
|
||||
"settings.remoteInstances.page.phase.detectingServer": "Виявлення сервера",
|
||||
@@ -1471,6 +1502,9 @@ export const settingsDict = {
|
||||
"settings.voice.page.preview.voiceLine": "Привіт! Я {voiceName}. Ось як я звучу.",
|
||||
"settings.voice.page.preview.customServerLine": "Привіт! Це попередній перегляд спеціального сервера TTS.",
|
||||
"settings.openchamber.visual.section.colorMode": "Режим теми",
|
||||
"settings.openchamber.visual.section.mobileLayout": "Мобільний макет",
|
||||
"settings.openchamber.visual.option.mobileLayout.default": "Стандартний",
|
||||
"settings.openchamber.visual.option.mobileLayout.new": "Новий",
|
||||
"settings.openchamber.visual.section.localization": "Локалізація",
|
||||
"settings.openchamber.visual.section.spacingAndLayout": "Відступи й компонування",
|
||||
"settings.openchamber.visual.section.navigation": "Навігація",
|
||||
|
||||
Reference in New Issue
Block a user