Merge pull request #2327 from radiusred/fix/env-var-plain-to-secret-data-loss
fix(ui): preserve env var when switching type from Plain to Secret
This commit is contained in:
commit
5b479652f2
2 changed files with 29 additions and 3 deletions
|
|
@ -1772,6 +1772,18 @@ export function agentRoutes(db: Db) {
|
||||||
rawEffectiveAdapterConfig = { ...existingAdapterConfig, ...requestedAdapterConfig };
|
rawEffectiveAdapterConfig = { ...existingAdapterConfig, ...requestedAdapterConfig };
|
||||||
}
|
}
|
||||||
if (changingAdapterType) {
|
if (changingAdapterType) {
|
||||||
|
// Preserve adapter-agnostic keys (env, cwd, etc.) from the existing config
|
||||||
|
// when the adapter type changes. Without this, a PATCH that includes
|
||||||
|
// adapterConfig but omits these keys would silently drop them.
|
||||||
|
const ADAPTER_AGNOSTIC_KEYS = [
|
||||||
|
"env", "cwd", "timeoutSec", "graceSec",
|
||||||
|
"promptTemplate", "bootstrapPromptTemplate",
|
||||||
|
] as const;
|
||||||
|
for (const key of ADAPTER_AGNOSTIC_KEYS) {
|
||||||
|
if (rawEffectiveAdapterConfig[key] === undefined && existingAdapterConfig[key] !== undefined) {
|
||||||
|
rawEffectiveAdapterConfig = { ...rawEffectiveAdapterConfig, [key]: existingAdapterConfig[key] };
|
||||||
|
}
|
||||||
|
}
|
||||||
rawEffectiveAdapterConfig = preserveInstructionsBundleConfig(
|
rawEffectiveAdapterConfig = preserveInstructionsBundleConfig(
|
||||||
existingAdapterConfig,
|
existingAdapterConfig,
|
||||||
rawEffectiveAdapterConfig,
|
rawEffectiveAdapterConfig,
|
||||||
|
|
|
||||||
|
|
@ -1155,9 +1155,17 @@ function EnvVarEditor({
|
||||||
const [rows, setRows] = useState<Row[]>(() => toRows(value));
|
const [rows, setRows] = useState<Row[]>(() => toRows(value));
|
||||||
const [sealError, setSealError] = useState<string | null>(null);
|
const [sealError, setSealError] = useState<string | null>(null);
|
||||||
const valueRef = useRef(value);
|
const valueRef = useRef(value);
|
||||||
|
const emittingRef = useRef(false);
|
||||||
|
|
||||||
// Sync when value identity changes (overlay reset after save)
|
// Sync when value identity changes (overlay reset after save).
|
||||||
|
// Skip re-sync when the change was triggered by our own emit() to avoid
|
||||||
|
// reverting local row state (e.g. a secret-transition dropdown choice).
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (emittingRef.current) {
|
||||||
|
emittingRef.current = false;
|
||||||
|
valueRef.current = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (value !== valueRef.current) {
|
if (value !== valueRef.current) {
|
||||||
valueRef.current = value;
|
valueRef.current = value;
|
||||||
setRows(toRows(value));
|
setRows(toRows(value));
|
||||||
|
|
@ -1170,12 +1178,18 @@ function EnvVarEditor({
|
||||||
const k = row.key.trim();
|
const k = row.key.trim();
|
||||||
if (!k) continue;
|
if (!k) continue;
|
||||||
if (row.source === "secret") {
|
if (row.source === "secret") {
|
||||||
if (!row.secretId) continue;
|
if (row.secretId) {
|
||||||
rec[k] = { type: "secret_ref", secretId: row.secretId, version: "latest" };
|
rec[k] = { type: "secret_ref", secretId: row.secretId, version: "latest" };
|
||||||
|
} else {
|
||||||
|
// Row is transitioning to secret but user hasn't picked one yet.
|
||||||
|
// Preserve the plain value so it isn't silently dropped.
|
||||||
|
rec[k] = { type: "plain", value: row.plainValue };
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rec[k] = { type: "plain", value: row.plainValue };
|
rec[k] = { type: "plain", value: row.plainValue };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
emittingRef.current = true;
|
||||||
onChange(Object.keys(rec).length > 0 ? rec : undefined);
|
onChange(Object.keys(rec).length > 0 ? rec : undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue