Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions ui/desktop/src/components/settings/app/ExternalBackendSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ const i18n = defineMessages({
defaultMessage:
'Enter the HTTP(S) base URL. Goose checks /status and connects to /acp under this base.',
},
workingDir: {
id: 'externalBackendSection.workingDir',
Comment thread
saime428 marked this conversation as resolved.
defaultMessage: 'Remote Working Directory (optional)',
},
workingDirPlaceholder: {
id: 'externalBackendSection.workingDirPlaceholder',
defaultMessage: '/home/goose/workspace',
},
workingDirHelp: {
id: 'externalBackendSection.workingDirHelp',
defaultMessage: 'Path on the machine running the external backend. Leave blank to use its default.',
},
secretKey: {
id: 'externalBackendSection.secretKey',
defaultMessage: 'Secret Key',
Expand Down Expand Up @@ -222,6 +234,24 @@ export default function ExternalBackendSection() {
</p>
</div>

<div className="space-y-2">
<label htmlFor="external-working-dir" className="text-text-primary text-xs">
{intl.formatMessage(i18n.workingDir)}
</label>
<Input
id="external-working-dir"
type="text"
placeholder={intl.formatMessage(i18n.workingDirPlaceholder)}
value={config.workingDir || ''}
onChange={(e) => updateField('workingDir', e.target.value)}
onBlur={() => saveConfig(config)}
disabled={isSaving}
/>
<p className="text-xs text-text-secondary">
{intl.formatMessage(i18n.workingDirHelp)}
</p>
</div>

<div className="space-y-2">
<label htmlFor="external-secret" className="text-text-primary text-xs">
{intl.formatMessage(i18n.secretKey)}
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Verbindung zu einem anderswo laufenden goose-Server herstellen (erfordert Neustart der App)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Remote-Arbeitsverzeichnis (optional)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Pfad auf dem Computer, auf dem das externe Backend ausgeführt wird. Leer lassen, um den Standard zu verwenden."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Schließen"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Connect to an ACP-compatible backend running elsewhere."
},
"externalBackendSection.workingDir": {
"defaultMessage": "Remote Working Directory (optional)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Path on the machine running the external backend. Leave blank to use its default."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Close"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Conéctate a un servidor goose que se ejecuta en otro lugar (requiere reiniciar la app)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Directorio de trabajo remoto (opcional)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Ruta en el equipo donde se ejecuta el backend externo. Déjelo vacío para usar el valor predeterminado."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Cerrar"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Se connecter à un serveur goose exécuté ailleurs (nécessite le redémarrage de l'application)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Répertoire de travail distant (facultatif)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Chemin sur la machine exécutant le backend externe. Laissez vide pour utiliser la valeur par défaut."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Fermer"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/hi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "कहीं और चल रहे goose सर्वर से कनेक्ट करें (ऐप पुनरारंभ की आवश्यकता है)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "रिमोट कार्य निर्देशिका (वैकल्पिक)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "उस मशीन पर पथ जहाँ बाहरी बैकएंड चल रहा है। डिफ़ॉल्ट का उपयोग करने के लिए खाली छोड़ दें।"
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "बंद करें"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/id.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Terhubung ke server goose yang berjalan di tempat lain (memerlukan mulai ulang aplikasi)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Direktori kerja jarak jauh (opsional)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Jalur pada mesin yang menjalankan backend eksternal. Biarkan kosong untuk menggunakan nilai default."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Tutup"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Connettiti a un server goose in esecuzione altrove (richiede il riavvio dell'app)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Directory di lavoro remota (facoltativa)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Percorso sul computer che esegue il backend esterno. Lascia vuoto per usare il valore predefinito."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Chiudi"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "別の場所で実行中の goose サーバーに接続します(アプリの再起動が必要)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "リモート作業ディレクトリ(任意)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "外部バックエンドを実行しているマシン上のパスです。既定値を使用するには空白のままにします。"
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "閉じる"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "다른 곳에서 실행 중인 ACP 호환 백엔드에 연결합니다."
},
"externalBackendSection.workingDir": {
"defaultMessage": "원격 작업 디렉터리(선택 사항)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "외부 백엔드를 실행하는 컴퓨터의 경로입니다. 기본값을 사용하려면 비워 두세요."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "닫기"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/ms.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Sambung ke pelayan goose yang berjalan di tempat lain (memerlukan memulakan semula aplikasi)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Direktori kerja jauh (pilihan)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Laluan pada mesin yang menjalankan backend luaran. Biarkan kosong untuk menggunakan nilai lalai."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Tutup"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Conecte-se a um servidor goose em execução em outro lugar (requer reinicialização do app)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Diretório de trabalho remoto (opcional)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Caminho na máquina que executa o backend externo. Deixe em branco para usar o padrão."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Fechar"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Подключиться к серверу goose, запущенному в другом месте (требуется перезапуск приложения)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Удалённый рабочий каталог (необязательно)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Путь на компьютере, где запущен внешний бэкенд. Оставьте пустым, чтобы использовать значение по умолчанию."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Закрыть"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Başka bir yerde çalışan bir goose sunucusuna bağlanın (uygulamanın yeniden başlatılmasını gerektirir)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Uzak çalışma dizini (isteğe bağlı)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Harici arka ucun çalıştığı makinedeki yol. Varsayılanı kullanmak için boş bırakın."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Kapat"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "Kết nối tới một máy chủ goose đang chạy ở nơi khác (cần khởi động lại ứng dụng)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "Thư mục làm việc từ xa (tùy chọn)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "Đường dẫn trên máy đang chạy phần phụ trợ bên ngoài. Để trống để dùng giá trị mặc định."
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "Đóng"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "连接到运行在其他位置的 goose 服务器(需要重启应用)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "远程工作目录(可选)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "运行外部后端的计算机上的路径。留空以使用默认值。"
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "关闭"
},
Expand Down
9 changes: 9 additions & 0 deletions ui/desktop/src/i18n/messages/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,15 @@
"externalBackendSection.useExternalServerDescription": {
"defaultMessage": "連線至在其他位置執行的 goose 伺服器(需要重新啟動應用程式)"
},
"externalBackendSection.workingDir": {
"defaultMessage": "遠端工作目錄(選用)"
},
"externalBackendSection.workingDirHelp": {
"defaultMessage": "外部後端執行所在電腦上的路徑。留空以使用預設值。"
},
"externalBackendSection.workingDirPlaceholder": {
"defaultMessage": "/home/goose/workspace"
},
"goosehintsModal.close": {
"defaultMessage": "關閉"
},
Expand Down
5 changes: 4 additions & 1 deletion ui/desktop/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import type { GooseApp } from './types/apps';
import installExtension, { REACT_DEVELOPER_TOOLS } from 'electron-devtools-installer';
import { BLOCKED_PROTOCOLS, WEB_PROTOCOLS } from './utils/urlSecurity';
import { buildCSP } from './utils/csp';
import { resolveWorkingDir } from './utils/workingDir';

function shouldSetupUpdater(): boolean {
// Setup updater if either the flag is enabled OR dev updates are enabled
Expand Down Expand Up @@ -889,6 +890,7 @@ interface ExternalBackend {
url: string;
secret: string;
certFingerprint?: string;
workingDir?: string;
}

const getExternalBackendUrlFromEnv = (): string | null => {
Expand Down Expand Up @@ -944,6 +946,7 @@ const getActiveExternalBackend = (settings: Settings): ExternalBackend | null =>
url: settings.externalGoosed.url,
secret: getServerSecret(settings),
certFingerprint: settings.externalGoosed.certFingerprint,
workingDir: settings.externalGoosed.workingDir,
};
}

Expand Down Expand Up @@ -1067,7 +1070,7 @@ const createChat = async (
}

const serverSecret = externalBackend ? externalBackend.secret : GENERATED_SECRET;
let workingDir = dir || os.homedir();
let workingDir = resolveWorkingDir(externalBackend?.workingDir, dir, os.homedir());
Comment thread
saime428 marked this conversation as resolved.
Comment thread
saime428 marked this conversation as resolved.
let gooseServeLease: GooseServeLease | null = null;

if (externalBackend) {
Expand Down
12 changes: 12 additions & 0 deletions ui/desktop/src/utils/__tests__/workingDir.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { describe, expect, it } from 'vitest';
import { resolveWorkingDir } from '../workingDir';

describe('resolveWorkingDir', () => {
it('uses the configured external backend directory when present', () => {
expect(resolveWorkingDir(' /home/goose ', 'C:\\Users\\goose', 'C:\\Users\\goose')).toBe(
'/home/goose'
);
expect(resolveWorkingDir(' ', 'C:\\work', 'C:\\Users\\goose')).toBe('C:\\work');
expect(resolveWorkingDir(undefined, undefined, 'C:\\Users\\goose')).toBe('C:\\Users\\goose');
});
});
1 change: 1 addition & 0 deletions ui/desktop/src/utils/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export interface ExternalBackendConfig {
url: string;
secret: string;
certFingerprint?: string;
workingDir?: string;
Comment thread
saime428 marked this conversation as resolved.
}

export interface KeyboardShortcuts {
Expand Down
6 changes: 6 additions & 0 deletions ui/desktop/src/utils/workingDir.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,9 @@ export const getInitialWorkingDir = (): string => {
// Fall back to initial config from app startup
return (window.appConfig?.get('GOOSE_WORKING_DIR') as string) ?? '';
};

export const resolveWorkingDir = (
externalWorkingDir: string | undefined,
requestedWorkingDir: string | undefined,
homeDir: string
): string => externalWorkingDir?.trim() || requestedWorkingDir || homeDir;