diff --git a/apps/desktop/src/renderer/lib/agent-launch-command.ts b/apps/desktop/src/renderer/lib/agent-launch-command.ts index bb45bebddab..bd3e5be7067 100644 --- a/apps/desktop/src/renderer/lib/agent-launch-command.ts +++ b/apps/desktop/src/renderer/lib/agent-launch-command.ts @@ -24,7 +24,7 @@ interface LinkedPresetLaunch { commands: string[]; } -function areEnvMapsEqual( +export function areEnvMapsEqual( left: Record, right: Record, ): boolean { diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentDetail/AgentDetail.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentDetail/AgentDetail.tsx index 8c52e7ca0dc..5b31caed9b5 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentDetail/AgentDetail.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentDetail/AgentDetail.tsx @@ -22,7 +22,7 @@ import { Switch } from "@superset/ui/switch"; import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; import { useMutation } from "@tanstack/react-query"; import { Info, RotateCcw, Trash2 } from "lucide-react"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { getAgentCommandText, isAgentCommandPatchChanged, @@ -33,6 +33,7 @@ import { electronTrpc } from "renderer/lib/electron-trpc"; import { getHostServiceClientByUrl } from "renderer/lib/host-service-client"; import { getHostServiceUnavailableMessage } from "renderer/lib/host-service-unavailable"; import { useLocalHostService } from "renderer/routes/_authenticated/providers/LocalHostServiceProvider"; +import { AgentEnvEditor, type AgentEnvEditorHandle } from "../AgentEnvEditor"; import { AgentDetailHeader, AgentLaunchFields, @@ -84,8 +85,12 @@ export function AgentDetail({ ), }); + const envEditorRef = useRef(null); + const [envEditorKey, setEnvEditorKey] = useState(0); const [label, setLabel] = useState(config.label); - const [commandText, setCommandText] = useState(getAgentCommandText(config)); + const [commandText, setCommandText] = useState( + getAgentCommandText({ command: config.command, args: config.args }), + ); const [promptArgsText, setPromptArgsText] = useState( joinArgs(config.promptArgs), ); @@ -102,11 +107,7 @@ export function AgentDetail({ useEffect(() => { setLabel(config.label); setCommandText( - getAgentCommandText({ - command: config.command, - args: config.args, - env: config.env, - }), + getAgentCommandText({ command: config.command, args: config.args }), ); setPromptArgsText(joinArgs(config.promptArgs)); setResumeArgsText(joinArgs(config.resumeArgs ?? [])); @@ -116,7 +117,6 @@ export function AgentDetail({ config.label, config.command, config.args, - config.env, config.promptArgs, config.resumeArgs, config.forkArgs, @@ -194,6 +194,7 @@ export function AgentDetail({ }, onSuccess: (updated) => { onChanged(updated); + setEnvEditorKey((key) => key + 1); const updatedLabel = updated.label; toast.success( t({ @@ -219,22 +220,36 @@ export function AgentDetail({ }; const handleCommandBlur = () => { - const patch = parseAgentCommandText(commandText); - const { command } = patch; + const { + command, + args, + env: inlineEnv, + } = parseAgentCommandText(commandText); if (command.length === 0) { toast.error( t({ message: "Command cannot be empty", }), ); - setCommandText(getAgentCommandText(config)); + setCommandText( + getAgentCommandText({ command: config.command, args: config.args }), + ); return; } - if (isAgentCommandPatchChanged(config, patch)) { - updateMutation.mutate(patch); + if (Object.keys(inlineEnv).length > 0) { + envEditorRef.current?.assign(inlineEnv); + setCommandText(getAgentCommandText({ command, args })); + } + if ( + isAgentCommandPatchChanged(config, { command, args, env: config.env }) + ) { + updateMutation.mutate({ command, args }); } }; + const handleEnvCommit = (env: Record) => + updateMutation.mutateAsync({ env }); + const handlePromptArgsBlur = () => { const args = parseArgs(promptArgsText); const changed = @@ -324,6 +339,20 @@ export function AgentDetail({ onPromptTransportChange={handleTransportChange} /> +
+ +
+ {isHooksSetupTarget ? (
diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/AgentEnvEditor.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/AgentEnvEditor.tsx new file mode 100644 index 00000000000..dd639193e26 --- /dev/null +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/AgentEnvEditor.tsx @@ -0,0 +1,262 @@ +import { Trans, useLingui } from "@lingui/react/macro"; +import { Button } from "@superset/ui/button"; +import { Input } from "@superset/ui/input"; +import { Plus, X } from "lucide-react"; +import { + type Ref, + useEffect, + useImperativeHandle, + useRef, + useState, +} from "react"; +import { areEnvMapsEqual } from "renderer/lib/agent-launch-command"; + +const ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/; + +interface EnvRow { + id: string; + key: string; + value: string; + saved: { key: string; value: string } | null; +} + +function toRows(env: Record): EnvRow[] { + return Object.entries(env).map(([key, value]) => ({ + id: crypto.randomUUID(), + key, + value, + saved: { key, value }, + })); +} + +/** Rows that keep their saved name claim it before renamed or new rows. */ +function acceptedRowIds(rows: readonly EnvRow[]): Set { + const takenKeys = new Set(); + const ids = new Set(); + const accept = (row: EnvRow) => { + const key = row.key.trim(); + if (ids.has(row.id) || !ENV_KEY.test(key) || takenKeys.has(key)) return; + takenKeys.add(key); + ids.add(row.id); + }; + for (const row of rows) if (row.saved?.key === row.key.trim()) accept(row); + for (const row of rows) accept(row); + return ids; +} + +/** Rows whose name is not accepted keep their last saved entry. */ +function toEnv(rows: readonly EnvRow[]): Record { + const accepted = acceptedRowIds(rows); + const entries = new Map(); + for (const row of rows) { + if (accepted.has(row.id)) entries.set(row.key.trim(), row.value); + } + for (const row of rows) { + if (!accepted.has(row.id) && row.saved && !entries.has(row.saved.key)) { + entries.set(row.saved.key, row.saved.value); + } + } + return Object.fromEntries(entries); +} + +function markSaved(rows: EnvRow[], submitted: readonly EnvRow[]): EnvRow[] { + const accepted = acceptedRowIds(submitted); + return rows.map((row) => { + const sent = submitted.find((candidate) => candidate.id === row.id); + return sent && accepted.has(row.id) + ? { ...row, saved: { key: sent.key.trim(), value: sent.value } } + : row; + }); +} + +function withAssignments( + rows: readonly EnvRow[], + assignments: Record, +): EnvRow[] { + const remaining = new Map(Object.entries(assignments)); + const accepted = acceptedRowIds(rows); + const updated = rows.map((row) => { + const key = row.key.trim(); + if (!accepted.has(row.id) || !remaining.has(key)) return row; + const value = remaining.get(key) ?? ""; + remaining.delete(key); + return { ...row, value }; + }); + const added = [...remaining].map(([key, value]) => ({ + id: crypto.randomUUID(), + key, + value, + saved: null, + })); + return [...updated, ...added]; +} + +function hasUnsavedEdits(rows: readonly EnvRow[]): boolean { + return rows.some((row) => + row.saved === null + ? row.key.trim().length > 0 || row.value.length > 0 + : row.key.trim() !== row.saved.key || row.value !== row.saved.value, + ); +} + +export interface AgentEnvEditorHandle { + /** Sets variables, e.g. inline `VAR=value` prefixes from the command field. */ + assign: (assignments: Record) => void; +} + +interface AgentEnvEditorProps { + idPrefix: string; + env: Record; + onCommit: (env: Record) => Promise; + ref?: Ref; +} + +export function AgentEnvEditor({ + idPrefix, + env, + onCommit, + ref, +}: AgentEnvEditorProps) { + const { t } = useLingui(); + const variableNameLabel = t({ message: "Variable name" }); + const variableValueLabel = t({ message: "Variable value" }); + const [rows, setRows] = useState(() => toRows(env)); + const rowsRef = useRef(rows); + rowsRef.current = rows; + const saves = useRef({ inFlight: false, queued: false, lastSent: env }); + const accepted = acceptedRowIds(rows); + + // While a save is pending or rows hold unsaved edits, the rows are the + // source of truth: a full-config response from another save can carry an + // older env. + useEffect(() => { + const state = saves.current; + if (state.inFlight || state.queued) return; + if (hasUnsavedEdits(rows)) return; + if (areEnvMapsEqual(env, state.lastSent)) return; + state.lastSent = env; + setRows(toRows(env)); + }, [env, rows]); + + const send = (submitted: readonly EnvRow[]) => { + const state = saves.current; + const nextEnv = toEnv(submitted); + if (areEnvMapsEqual(nextEnv, state.lastSent)) { + setRows((current) => markSaved(current, submitted)); + return; + } + const previous = state.lastSent; + state.inFlight = true; + state.lastSent = nextEnv; + onCommit(nextEnv) + .then( + () => setRows((current) => markSaved(current, submitted)), + () => { + state.lastSent = previous; + }, + ) + .finally(() => { + state.inFlight = false; + if (state.queued) { + state.queued = false; + send(rowsRef.current); + } + }); + }; + + const commit = (next: readonly EnvRow[]) => { + if (saves.current.inFlight) saves.current.queued = true; + else send(next); + }; + + useImperativeHandle(ref, () => ({ + assign: (assignments) => { + const next = withAssignments(rowsRef.current, assignments); + rowsRef.current = next; + setRows(next); + commit(next); + }, + })); + + const isInvalid = (row: EnvRow) => + !accepted.has(row.id) && (row.key.trim().length > 0 || row.saved !== null); + + const updateRow = (id: string, patch: Partial) => + setRows((current) => + current.map((row) => (row.id === id ? { ...row, ...patch } : row)), + ); + + const removeRow = (id: string) => { + const next = rows.filter((row) => row.id !== id); + rowsRef.current = next; + setRows(next); + commit(next); + }; + + const addRow = () => + setRows((current) => [ + ...current, + { id: crypto.randomUUID(), key: "", value: "", saved: null }, + ]); + + return ( +
+

+ + Set when this agent launches, e.g. CLAUDE_CONFIG_DIR to + use another Claude login. + +

+ {rows.length === 0 ? ( +

+ No variables set yet. +

+ ) : ( + rows.map((row) => ( +
+ updateRow(row.id, { key: e.target.value })} + onBlur={() => commit(rows)} + aria-label={variableNameLabel} + aria-invalid={isInvalid(row)} + placeholder={variableNameLabel} + spellCheck={false} + /> + updateRow(row.id, { value: e.target.value })} + onBlur={() => commit(rows)} + aria-label={variableValueLabel} + placeholder={variableValueLabel} + spellCheck={false} + /> + +
+ )) + )} + +
+ ); +} diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/index.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/index.ts new file mode 100644 index 00000000000..348af517423 --- /dev/null +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/agents/components/V2AgentsSettings/components/AgentEnvEditor/index.ts @@ -0,0 +1 @@ +export { AgentEnvEditor, type AgentEnvEditorHandle } from "./AgentEnvEditor"; diff --git a/packages/i18n/locales/cs/messages.po b/packages/i18n/locales/cs/messages.po index 261347d9891..46b688f30b7 100644 --- a/packages/i18n/locales/cs/messages.po +++ b/packages/i18n/locales/cs/messages.po @@ -2145,6 +2145,9 @@ msgstr "Přidat do postranního panelu" msgid "Add to workspace" msgstr "Přidat do pracovního prostoru" +msgid "Add variable" +msgstr "Přidat proměnnou" + msgid "Add what it does" msgstr "Přidat, co dělá" @@ -15613,6 +15616,9 @@ msgstr "odebrat propojení s PR" msgid "Remove trigger" msgstr "Odebrat spouštěč" +msgid "Remove variable" +msgstr "Odebrat proměnnou" + msgid "Remove workspace" msgstr "Odebrat pracovní prostor" @@ -17279,6 +17285,9 @@ msgstr "Připravit tento projekt pro Paradev" msgid "Set up your organization to get started" msgstr "Nastavte si organizaci a můžete začít" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Nastaví se při spuštění tohoto agenta, např. <0>CLAUDE_CONFIG_DIR pro použití jiného přihlášení Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Když nainstalovaný plugin vrátíte na Dostupné, všem zůstane jejich kopie; pak ji mohou odebrat. Nedostupné ho odebere." @@ -20809,6 +20818,12 @@ msgstr "uživatel@host, ssh://uživatel@host:2222 nebo alias z konfigurace ssh" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId neodpovídá projektu pracovního prostoru" +msgid "Variable name" +msgstr "Název proměnné" + +msgid "Variable value" +msgstr "Hodnota proměnné" + msgid "Variables" msgstr "Proměnné" diff --git a/packages/i18n/locales/de/messages.po b/packages/i18n/locales/de/messages.po index 31dea11a80c..a85208634a3 100644 --- a/packages/i18n/locales/de/messages.po +++ b/packages/i18n/locales/de/messages.po @@ -2145,6 +2145,9 @@ msgstr "Zur Seitenleiste hinzufügen" msgid "Add to workspace" msgstr "Zum Arbeitsbereich hinzufügen" +msgid "Add variable" +msgstr "Variable hinzufügen" + msgid "Add what it does" msgstr "Beschreiben, was er macht" @@ -15613,6 +15616,9 @@ msgstr "den PR-Link entfernen" msgid "Remove trigger" msgstr "Auslöser entfernen" +msgid "Remove variable" +msgstr "Variable entfernen" + msgid "Remove workspace" msgstr "Arbeitsbereich entfernen" @@ -17279,6 +17285,9 @@ msgstr "Dieses Projekt für Paradev einrichten" msgid "Set up your organization to get started" msgstr "Richte deine Organisation ein, um loszulegen" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Wird beim Start dieses Agenten gesetzt, z. B. <0>CLAUDE_CONFIG_DIR, um ein anderes Claude-Login zu verwenden." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Wird ein installiertes Plugin wieder auf Verfügbar gesetzt, behalten alle ihre Kopie und können sie dann entfernen. Nicht verfügbar entfernt es." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222 oder ein Alias aus der ssh-Konfiguration msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId passt nicht zum Projekt des Arbeitsbereichs" +msgid "Variable name" +msgstr "Variablenname" + +msgid "Variable value" +msgstr "Variablenwert" + msgid "Variables" msgstr "Variablen" diff --git a/packages/i18n/locales/en/messages.po b/packages/i18n/locales/en/messages.po index 5e05d7ffaaf..6a743bc2814 100644 --- a/packages/i18n/locales/en/messages.po +++ b/packages/i18n/locales/en/messages.po @@ -2145,6 +2145,9 @@ msgstr "Add to sidebar" msgid "Add to workspace" msgstr "Add to workspace" +msgid "Add variable" +msgstr "Add variable" + msgid "Add what it does" msgstr "Add what it does" @@ -15613,6 +15616,9 @@ msgstr "remove the PR link" msgid "Remove trigger" msgstr "Remove trigger" +msgid "Remove variable" +msgstr "Remove variable" + msgid "Remove workspace" msgstr "Remove workspace" @@ -17279,6 +17285,9 @@ msgstr "Set up this project for Paradev" msgid "Set up your organization to get started" msgstr "Set up your organization to get started" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222, or an ssh config alias" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId does not match the workspace's project" +msgid "Variable name" +msgstr "Variable name" + +msgid "Variable value" +msgstr "Variable value" + msgid "Variables" msgstr "Variables" diff --git a/packages/i18n/locales/es/messages.po b/packages/i18n/locales/es/messages.po index 869f48abc92..1b76025e331 100644 --- a/packages/i18n/locales/es/messages.po +++ b/packages/i18n/locales/es/messages.po @@ -2145,6 +2145,9 @@ msgstr "Añadir a la barra lateral" msgid "Add to workspace" msgstr "Añadir al espacio de trabajo" +msgid "Add variable" +msgstr "Añadir variable" + msgid "Add what it does" msgstr "Añadir qué hace" @@ -15613,6 +15616,9 @@ msgstr "quitar el enlace a la PR" msgid "Remove trigger" msgstr "Eliminar disparador" +msgid "Remove variable" +msgstr "Quitar variable" + msgid "Remove workspace" msgstr "Quitar el espacio de trabajo" @@ -17279,6 +17285,9 @@ msgstr "Preparar este proyecto para Paradev" msgid "Set up your organization to get started" msgstr "Configurar la organización para empezar" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Se define al iniciar este agente, p. ej. <0>CLAUDE_CONFIG_DIR para usar otro inicio de sesión de Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Si vuelves a poner un plugin instalado en Disponible, todos conservan su copia y luego pueden quitarla. No disponible lo quita." @@ -20809,6 +20818,12 @@ msgstr "usuario@host, ssh://usuario@host:2222 o un alias de la configuración de msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId no coincide con el proyecto del espacio de trabajo" +msgid "Variable name" +msgstr "Nombre de la variable" + +msgid "Variable value" +msgstr "Valor de la variable" + msgid "Variables" msgstr "Variables" diff --git a/packages/i18n/locales/fr/messages.po b/packages/i18n/locales/fr/messages.po index 49b51d684ee..ac424d1e065 100644 --- a/packages/i18n/locales/fr/messages.po +++ b/packages/i18n/locales/fr/messages.po @@ -2145,6 +2145,9 @@ msgstr "Ajouter à la barre latérale" msgid "Add to workspace" msgstr "Ajouter à un espace de travail" +msgid "Add variable" +msgstr "Ajouter une variable" + msgid "Add what it does" msgstr "Ajouter ce qu’il fait" @@ -15613,6 +15616,9 @@ msgstr "retirer le lien de la PR" msgid "Remove trigger" msgstr "Supprimer le déclencheur" +msgid "Remove variable" +msgstr "Supprimer la variable" + msgid "Remove workspace" msgstr "Supprimer l'espace de travail" @@ -17279,6 +17285,9 @@ msgstr "Configurer ce projet pour Paradev" msgid "Set up your organization to get started" msgstr "Configurez votre organisation pour commencer" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Définie au lancement de cet agent, par ex. <0>CLAUDE_CONFIG_DIR pour utiliser une autre connexion Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Repasser un plugin installé en Disponible laisse sa copie à chacun ; ils peuvent ensuite la supprimer. Indisponible le retire." @@ -20809,6 +20818,12 @@ msgstr "user@hôte, ssh://user@hôte:2222 ou un alias de configuration ssh" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId ne correspond pas au projet de l'espace de travail" +msgid "Variable name" +msgstr "Nom de la variable" + +msgid "Variable value" +msgstr "Valeur de la variable" + msgid "Variables" msgstr "Variables" diff --git a/packages/i18n/locales/id/messages.po b/packages/i18n/locales/id/messages.po index 1387a444104..e2ff6c2a460 100644 --- a/packages/i18n/locales/id/messages.po +++ b/packages/i18n/locales/id/messages.po @@ -2145,6 +2145,9 @@ msgstr "Tambahkan ke sidebar" msgid "Add to workspace" msgstr "Tambahkan ke workspace" +msgid "Add variable" +msgstr "Tambah variabel" + msgid "Add what it does" msgstr "Tambahkan apa yang dilakukannya" @@ -15613,6 +15616,9 @@ msgstr "menghapus tautan PR" msgid "Remove trigger" msgstr "Hapus pemicu" +msgid "Remove variable" +msgstr "Hapus variabel" + msgid "Remove workspace" msgstr "Hapus workspace" @@ -17279,6 +17285,9 @@ msgstr "Siapkan proyek ini untuk Paradev" msgid "Set up your organization to get started" msgstr "Siapkan organisasi Anda untuk memulai" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Diatur saat agen ini dijalankan, mis. <0>CLAUDE_CONFIG_DIR untuk memakai login Claude lain." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Mengembalikan plugin terpasang ke Tersedia membuat semua orang tetap memiliki salinannya; mereka lalu bisa menghapusnya. Tidak tersedia akan menghapusnya." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222, atau alias dari konfigurasi ssh" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId tidak cocok dengan proyek workspace" +msgid "Variable name" +msgstr "Nama variabel" + +msgid "Variable value" +msgstr "Nilai variabel" + msgid "Variables" msgstr "Variabel" diff --git a/packages/i18n/locales/it/messages.po b/packages/i18n/locales/it/messages.po index a7e3a2944be..391c731cc13 100644 --- a/packages/i18n/locales/it/messages.po +++ b/packages/i18n/locales/it/messages.po @@ -2145,6 +2145,9 @@ msgstr "Aggiungi alla barra laterale" msgid "Add to workspace" msgstr "Aggiungi al workspace" +msgid "Add variable" +msgstr "Aggiungi variabile" + msgid "Add what it does" msgstr "Aggiungi cosa fa" @@ -15613,6 +15616,9 @@ msgstr "rimuovere il link alla PR" msgid "Remove trigger" msgstr "Rimuovi trigger" +msgid "Remove variable" +msgstr "Rimuovi variabile" + msgid "Remove workspace" msgstr "Rimuovi il workspace" @@ -17279,6 +17285,9 @@ msgstr "Configura questo progetto per Paradev" msgid "Set up your organization to get started" msgstr "Configura la tua organizzazione per iniziare" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Impostata all'avvio di questo agente, ad es. <0>CLAUDE_CONFIG_DIR per usare un altro accesso Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Riportare un plugin installato su Disponibile lascia a tutti la propria copia; potranno poi rimuoverla. Non disponibile lo rimuove." @@ -20809,6 +20818,12 @@ msgstr "utente@host, ssh://utente@host:2222 o un alias della configurazione ssh" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId non corrisponde al progetto del workspace" +msgid "Variable name" +msgstr "Nome variabile" + +msgid "Variable value" +msgstr "Valore variabile" + msgid "Variables" msgstr "Variabili" diff --git a/packages/i18n/locales/ja/messages.po b/packages/i18n/locales/ja/messages.po index 1a3178d862f..4b233e65bd1 100644 --- a/packages/i18n/locales/ja/messages.po +++ b/packages/i18n/locales/ja/messages.po @@ -2145,6 +2145,9 @@ msgstr "サイドバーに追加" msgid "Add to workspace" msgstr "ワークスペースに追加" +msgid "Add variable" +msgstr "変数を追加" + msgid "Add what it does" msgstr "役割を追加" @@ -15613,6 +15616,9 @@ msgstr "PRリンクを削除する" msgid "Remove trigger" msgstr "トリガーを削除" +msgid "Remove variable" +msgstr "変数を削除" + msgid "Remove workspace" msgstr "ワークスペースを削除" @@ -17279,6 +17285,9 @@ msgstr "このプロジェクトをParadev向けにセットアップ" msgid "Set up your organization to get started" msgstr "組織をセットアップして始めましょう" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "このエージェントの起動時に設定されます。例: 別の Claude ログインを使うには <0>CLAUDE_CONFIG_DIR。" + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "インストール済みのプラグインを「利用可能」に戻しても、全員のコピーは残り、各自で削除できるようになります。「利用不可」にすると削除されます。" @@ -20809,6 +20818,12 @@ msgstr "user@host、ssh://user@host:2222、または ssh config のエイリア msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectIdがワークスペースのプロジェクトと一致しません" +msgid "Variable name" +msgstr "変数名" + +msgid "Variable value" +msgstr "変数の値" + msgid "Variables" msgstr "変数" diff --git a/packages/i18n/locales/ko/messages.po b/packages/i18n/locales/ko/messages.po index 8deba6dd0c1..e4afa279cd4 100644 --- a/packages/i18n/locales/ko/messages.po +++ b/packages/i18n/locales/ko/messages.po @@ -2145,6 +2145,9 @@ msgstr "사이드바에 추가" msgid "Add to workspace" msgstr "워크스페이스에 추가" +msgid "Add variable" +msgstr "변수 추가" + msgid "Add what it does" msgstr "하는 일 추가" @@ -15613,6 +15616,9 @@ msgstr "PR 링크를 제거할" msgid "Remove trigger" msgstr "트리거 제거" +msgid "Remove variable" +msgstr "변수 제거" + msgid "Remove workspace" msgstr "워크스페이스 제거" @@ -17279,6 +17285,9 @@ msgstr "이 프로젝트를 Paradev에 맞게 설정하기" msgid "Set up your organization to get started" msgstr "조직을 설정하고 시작하세요" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "이 에이전트를 실행할 때 설정됩니다. 예: 다른 Claude 로그인을 사용하려면 <0>CLAUDE_CONFIG_DIR." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "설치된 플러그인을 다시 사용 가능으로 바꾸면 모두의 사본은 그대로 남고, 이후 각자 제거할 수 있습니다. 사용 불가로 바꾸면 제거됩니다." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222 또는 ssh 설정 별칭" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId가 워크스페이스의 프로젝트와 일치하지 않습니다" +msgid "Variable name" +msgstr "변수 이름" + +msgid "Variable value" +msgstr "변수 값" + msgid "Variables" msgstr "변수" diff --git a/packages/i18n/locales/nl/messages.po b/packages/i18n/locales/nl/messages.po index 580dc23cfac..295343bd57b 100644 --- a/packages/i18n/locales/nl/messages.po +++ b/packages/i18n/locales/nl/messages.po @@ -2145,6 +2145,9 @@ msgstr "Aan zijbalk toevoegen" msgid "Add to workspace" msgstr "Toevoegen aan werkruimte" +msgid "Add variable" +msgstr "Variabele toevoegen" + msgid "Add what it does" msgstr "Toevoegen wat hij doet" @@ -15613,6 +15616,9 @@ msgstr "de PR-koppeling verwijderen" msgid "Remove trigger" msgstr "Trigger verwijderen" +msgid "Remove variable" +msgstr "Variabele verwijderen" + msgid "Remove workspace" msgstr "Werkruimte verwijderen" @@ -17279,6 +17285,9 @@ msgstr "Dit project instellen voor Paradev" msgid "Set up your organization to get started" msgstr "Stel je organisatie in om te beginnen" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Ingesteld wanneer deze agent start, bijv. <0>CLAUDE_CONFIG_DIR om een andere Claude-login te gebruiken." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Zet je een geïnstalleerde plugin terug op Beschikbaar, dan houdt iedereen zijn kopie en kan die daarna verwijderen. Niet beschikbaar verwijdert hem." @@ -20809,6 +20818,12 @@ msgstr "gebruiker@host, ssh://gebruiker@host:2222 of een alias uit je ssh-config msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId komt niet overeen met het project van de werkruimte" +msgid "Variable name" +msgstr "Variabelenaam" + +msgid "Variable value" +msgstr "Variabelewaarde" + msgid "Variables" msgstr "Variabelen" diff --git a/packages/i18n/locales/pl/messages.po b/packages/i18n/locales/pl/messages.po index 1498aa918ad..4ac814dd0af 100644 --- a/packages/i18n/locales/pl/messages.po +++ b/packages/i18n/locales/pl/messages.po @@ -2145,6 +2145,9 @@ msgstr "Dodaj do paska bocznego" msgid "Add to workspace" msgstr "Dodaj do obszaru roboczego" +msgid "Add variable" +msgstr "Dodaj zmienną" + msgid "Add what it does" msgstr "Dodaj, co robi" @@ -15613,6 +15616,9 @@ msgstr "usunąć powiązania z PR" msgid "Remove trigger" msgstr "Usuń wyzwalacz" +msgid "Remove variable" +msgstr "Usuń zmienną" + msgid "Remove workspace" msgstr "Usuń obszar roboczy" @@ -17279,6 +17285,9 @@ msgstr "Skonfiguruj ten projekt pod Paradev" msgid "Set up your organization to get started" msgstr "Skonfiguruj organizację, aby zacząć" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Ustawiana przy uruchomieniu tego agenta, np. <0>CLAUDE_CONFIG_DIR, aby użyć innego logowania Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Przywrócenie zainstalowanej wtyczki do stanu Dostępna zostawia wszystkim ich kopię; mogą ją potem usunąć. Niedostępna ją usuwa." @@ -20809,6 +20818,12 @@ msgstr "użytkownik@host, ssh://użytkownik@host:2222 lub alias z konfiguracji s msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId nie pasuje do projektu obszaru roboczego" +msgid "Variable name" +msgstr "Nazwa zmiennej" + +msgid "Variable value" +msgstr "Wartość zmiennej" + msgid "Variables" msgstr "Zmienne" diff --git a/packages/i18n/locales/pt-BR/messages.po b/packages/i18n/locales/pt-BR/messages.po index f38914349b9..bcef7976561 100644 --- a/packages/i18n/locales/pt-BR/messages.po +++ b/packages/i18n/locales/pt-BR/messages.po @@ -2145,6 +2145,9 @@ msgstr "Adicionar à barra lateral" msgid "Add to workspace" msgstr "Adicionar à área de trabalho" +msgid "Add variable" +msgstr "Adicionar variável" + msgid "Add what it does" msgstr "Adicionar o que ele faz" @@ -15613,6 +15616,9 @@ msgstr "remover o vínculo do PR" msgid "Remove trigger" msgstr "Remover gatilho" +msgid "Remove variable" +msgstr "Remover variável" + msgid "Remove workspace" msgstr "Remover área de trabalho" @@ -17279,6 +17285,9 @@ msgstr "Configurar este projeto para o Paradev" msgid "Set up your organization to get started" msgstr "Configure sua organização para começar" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Definida quando este agente é iniciado, por ex. <0>CLAUDE_CONFIG_DIR para usar outro login do Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Voltar um plugin instalado para Disponível mantém a cópia de cada um; depois eles podem removê-la. Indisponível o remove." @@ -20809,6 +20818,12 @@ msgstr "usuário@host, ssh://usuário@host:2222 ou um alias da configuração do msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId não corresponde ao projeto da área de trabalho" +msgid "Variable name" +msgstr "Nome da variável" + +msgid "Variable value" +msgstr "Valor da variável" + msgid "Variables" msgstr "Variáveis" diff --git a/packages/i18n/locales/ru/messages.po b/packages/i18n/locales/ru/messages.po index 117c1e57862..5daad422fe6 100644 --- a/packages/i18n/locales/ru/messages.po +++ b/packages/i18n/locales/ru/messages.po @@ -2145,6 +2145,9 @@ msgstr "Добавить на боковую панель" msgid "Add to workspace" msgstr "Добавить в рабочую область" +msgid "Add variable" +msgstr "Добавить переменную" + msgid "Add what it does" msgstr "Добавить, что он делает" @@ -15613,6 +15616,9 @@ msgstr "отвязать PR" msgid "Remove trigger" msgstr "Удалить триггер" +msgid "Remove variable" +msgstr "Удалить переменную" + msgid "Remove workspace" msgstr "Удалить рабочую область" @@ -17279,6 +17285,9 @@ msgstr "Настроить этот проект под Paradev" msgid "Set up your organization to get started" msgstr "Настройте организацию, чтобы начать" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Задаётся при запуске этого агента, например <0>CLAUDE_CONFIG_DIR, чтобы использовать другой вход в Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Если вернуть установленный плагин в «Доступен», у всех останется их копия, и её можно будет удалить. «Недоступен» удаляет его." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222 или псевдоним из конф msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId не совпадает с проектом рабочей области" +msgid "Variable name" +msgstr "Имя переменной" + +msgid "Variable value" +msgstr "Значение переменной" + msgid "Variables" msgstr "Переменные" diff --git a/packages/i18n/locales/tr/messages.po b/packages/i18n/locales/tr/messages.po index 64aa524be97..5f416ccb8e2 100644 --- a/packages/i18n/locales/tr/messages.po +++ b/packages/i18n/locales/tr/messages.po @@ -2145,6 +2145,9 @@ msgstr "Kenar çubuğuna ekle" msgid "Add to workspace" msgstr "Çalışma alanına ekle" +msgid "Add variable" +msgstr "Değişken ekle" + msgid "Add what it does" msgstr "Ne yaptığını ekle" @@ -15613,6 +15616,9 @@ msgstr "PR bağlantısını kaldırma" msgid "Remove trigger" msgstr "Tetikleyiciyi kaldır" +msgid "Remove variable" +msgstr "Değişkeni kaldır" + msgid "Remove workspace" msgstr "Çalışma alanını kaldır" @@ -17279,6 +17285,9 @@ msgstr "Bu projeyi Paradev için kur" msgid "Set up your organization to get started" msgstr "Başlamak için kuruluşunuzu kurun" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Bu ajan başlatıldığında ayarlanır; ör. başka bir Claude girişi kullanmak için <0>CLAUDE_CONFIG_DIR." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Yüklü bir eklentiyi yeniden Kullanılabilir yapmak herkesin kopyasını korur; sonra kaldırabilirler. Kullanılamaz yapmak onu kaldırır." @@ -20809,6 +20818,12 @@ msgstr "kullanıcı@host, ssh://kullanıcı@host:2222 veya bir ssh yapılandırm msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId, çalışma alanının projesiyle eşleşmiyor" +msgid "Variable name" +msgstr "Değişken adı" + +msgid "Variable value" +msgstr "Değişken değeri" + msgid "Variables" msgstr "Değişkenler" diff --git a/packages/i18n/locales/uk/messages.po b/packages/i18n/locales/uk/messages.po index c2bc526e949..a057b679b59 100644 --- a/packages/i18n/locales/uk/messages.po +++ b/packages/i18n/locales/uk/messages.po @@ -2139,6 +2139,9 @@ msgstr "Додати на бічну панель" msgid "Add to workspace" msgstr "Додати до робочого простору" +msgid "Add variable" +msgstr "Додати змінну" + msgid "Add what it does" msgstr "Опишіть, що він робить" @@ -15607,6 +15610,9 @@ msgstr "прибрати посилання на PR" msgid "Remove trigger" msgstr "Видалити тригер" +msgid "Remove variable" +msgstr "Видалити змінну" + msgid "Remove workspace" msgstr "Видалити робочий простір" @@ -17273,6 +17279,9 @@ msgstr "Налаштуй цей проєкт для Paradev" msgid "Set up your organization to get started" msgstr "Щоб почати, налаштуйте свою організацію" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Задається під час запуску цього агента, наприклад <0>CLAUDE_CONFIG_DIR, щоб використати інший вхід у Claude." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Якщо повернути встановлений плагін у стан «Доступний», у всіх залишиться їхня копія, і її можна буде видалити. «Недоступний» видаляє його." @@ -20803,6 +20812,12 @@ msgstr "user@host, ssh://user@host:2222 або аліас із конфігур msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId не відповідає проєкту робочого простору" +msgid "Variable name" +msgstr "Ім'я змінної" + +msgid "Variable value" +msgstr "Значення змінної" + msgid "Variables" msgstr "Змінні" diff --git a/packages/i18n/locales/vi/messages.po b/packages/i18n/locales/vi/messages.po index 5ced0b32651..987957e9634 100644 --- a/packages/i18n/locales/vi/messages.po +++ b/packages/i18n/locales/vi/messages.po @@ -2145,6 +2145,9 @@ msgstr "Thêm vào thanh bên" msgid "Add to workspace" msgstr "Thêm vào workspace" +msgid "Add variable" +msgstr "Thêm biến" + msgid "Add what it does" msgstr "Thêm việc nó làm" @@ -15613,6 +15616,9 @@ msgstr "gỡ liên kết PR" msgid "Remove trigger" msgstr "Xóa trình kích hoạt" +msgid "Remove variable" +msgstr "Xóa biến" + msgid "Remove workspace" msgstr "Gỡ workspace" @@ -17279,6 +17285,9 @@ msgstr "Thiết lập dự án này cho Paradev" msgid "Set up your organization to get started" msgstr "Thiết lập tổ chức của bạn để bắt đầu" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "Được đặt khi tác tử này khởi chạy, ví dụ <0>CLAUDE_CONFIG_DIR để dùng một đăng nhập Claude khác." + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "Đặt lại một plugin đã cài thành Khả dụng thì mọi người vẫn giữ bản của mình; sau đó họ có thể gỡ. Không khả dụng sẽ gỡ nó." @@ -20809,6 +20818,12 @@ msgstr "user@host, ssh://user@host:2222 hoặc một bí danh trong cấu hình msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId không khớp với dự án của workspace" +msgid "Variable name" +msgstr "Tên biến" + +msgid "Variable value" +msgstr "Giá trị biến" + msgid "Variables" msgstr "Biến" diff --git a/packages/i18n/locales/zh-CN/messages.po b/packages/i18n/locales/zh-CN/messages.po index 7cc0ee52238..3b8c081a361 100644 --- a/packages/i18n/locales/zh-CN/messages.po +++ b/packages/i18n/locales/zh-CN/messages.po @@ -2145,6 +2145,9 @@ msgstr "添加到侧边栏" msgid "Add to workspace" msgstr "添加到工作区" +msgid "Add variable" +msgstr "添加变量" + msgid "Add what it does" msgstr "添加它的用途" @@ -15613,6 +15616,9 @@ msgstr "移除PR链接" msgid "Remove trigger" msgstr "移除触发器" +msgid "Remove variable" +msgstr "移除变量" + msgid "Remove workspace" msgstr "移除工作区" @@ -17279,6 +17285,9 @@ msgstr "为Paradev配置这个项目" msgid "Set up your organization to get started" msgstr "设置你的组织即可开始" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "在此智能体启动时设置,例如用 <0>CLAUDE_CONFIG_DIR 来使用另一个 Claude 登录。" + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "把已安装的插件改回“可用”后,每个人的副本仍会保留,之后可以自行移除。改为“不可用”会将其移除。" @@ -20809,6 +20818,12 @@ msgstr "user@host、ssh://user@host:2222 或 ssh 配置中的别名" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId与该工作区的项目不匹配" +msgid "Variable name" +msgstr "变量名" + +msgid "Variable value" +msgstr "变量值" + msgid "Variables" msgstr "变量" diff --git a/packages/i18n/locales/zh-TW/messages.po b/packages/i18n/locales/zh-TW/messages.po index 721a9580c76..9beff402449 100644 --- a/packages/i18n/locales/zh-TW/messages.po +++ b/packages/i18n/locales/zh-TW/messages.po @@ -2145,6 +2145,9 @@ msgstr "新增到側邊欄" msgid "Add to workspace" msgstr "新增到工作區" +msgid "Add variable" +msgstr "新增變數" + msgid "Add what it does" msgstr "新增它的用途" @@ -15613,6 +15616,9 @@ msgstr "移除PR連結" msgid "Remove trigger" msgstr "移除觸發條件" +msgid "Remove variable" +msgstr "移除變數" + msgid "Remove workspace" msgstr "移除工作區" @@ -17279,6 +17285,9 @@ msgstr "為Paradev配置這個專案" msgid "Set up your organization to get started" msgstr "設定你的組織即可開始" +msgid "Set when this agent launches, e.g. <0>CLAUDE_CONFIG_DIR to use another Claude login." +msgstr "在此代理程式啟動時設定,例如用 <0>CLAUDE_CONFIG_DIR 來使用另一個 Claude 登入。" + msgid "Setting an installed plugin back to Available keeps everyone's copy; they can then remove it. Unavailable removes it." msgstr "把已安裝的外掛改回「可用」後,每個人的副本仍會保留,之後可以自行移除。改為「不可用」會將其移除。" @@ -20809,6 +20818,12 @@ msgstr "user@host、ssh://user@host:2222 或 ssh 設定中的別名" msgid "v2ProjectId does not match the workspace's project" msgstr "v2ProjectId與該工作區的專案不匹配" +msgid "Variable name" +msgstr "變數名稱" + +msgid "Variable value" +msgstr "變數值" + msgid "Variables" msgstr "變數"