fix(SKY-12078): restore run-level editable credential input for single-credential login blocks (#7219)
Some checks are pending
Run tests and pre-commit / Run tests and pre-commit hooks (push) Waiting to run
Run tests and pre-commit / Frontend Lint and Build (push) Waiting to run
Run tests and pre-commit / pip Package Smoke Tests (3.11) (push) Waiting to run
Run tests and pre-commit / pip Package Smoke Tests (3.13) (push) Waiting to run
Publish Fern Docs / run (push) Waiting to run

This commit is contained in:
Shuchang Zheng 2026-07-08 16:42:42 -07:00 committed by GitHub
parent 7681a7cd2b
commit 26f73ec044
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 95 additions and 26 deletions

View file

@ -69,7 +69,6 @@ import {
WorkflowApiResponse,
WorkflowEditorParameterTypes,
WorkflowParameterTypes,
WorkflowParameterValueType,
} from "../types/workflowTypes";
import {
BitwardenCreditCardDataParameterYAML,
@ -123,6 +122,7 @@ import {
parameterIsBitwardenCredential,
parameterIsAzureVaultCredential,
} from "./types";
import { skyvernCredentialToParameterYAML } from "./utils";
import "./reactFlowOverrideStyles.css";
import {
convertEchoParameters,
@ -316,29 +316,7 @@ function convertToParametersYAML(
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
};
} else if (parameterIsSkyvernCredential(parameter)) {
const hasCredentialRotation =
(parameter.credentialIds?.length ?? 0) >= 2;
if (
parameter.dataType === WorkflowParameterValueType.CredentialId &&
!hasCredentialRotation
) {
return {
parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type:
WorkflowParameterValueType.CredentialId,
default_value: parameter.credentialId,
key: parameter.key,
description: parameter.description || null,
};
}
return {
parameter_type: WorkflowParameterTypes.Credential,
credential_id: parameter.credentialId,
credential_ids: parameter.credentialIds ?? null,
selection_strategy: parameter.selectionStrategy ?? null,
key: parameter.key,
description: parameter.description || null,
};
return skyvernCredentialToParameterYAML(parameter);
} else if (parameterIsOnePasswordCredential(parameter)) {
return {
parameter_type: WorkflowParameterTypes.OnePassword,

View file

@ -4,7 +4,11 @@ import {
type WorkflowApiResponse,
WorkflowParameterValueType,
} from "../types/workflowTypes";
import { getInitialParameters } from "./utils";
import {
getInitialParameters,
skyvernCredentialToParameterYAML,
} from "./utils";
import { SkyvernCredential } from "./types";
const baseWorkflow = {
workflow_id: "w_test",
@ -98,3 +102,57 @@ describe("getInitialParameters", () => {
]);
});
});
describe("skyvernCredentialToParameterYAML", () => {
test("serializes a freshly selected single credential (no dataType) as an editable workflow credential_id parameter", () => {
const parameter: SkyvernCredential = {
key: "credentials",
parameterType: "credential",
credentialId: "cred_123",
};
expect(skyvernCredentialToParameterYAML(parameter)).toEqual({
parameter_type: "workflow",
workflow_parameter_type: WorkflowParameterValueType.CredentialId,
default_value: "cred_123",
key: "credentials",
description: null,
});
});
test("serializes a legacy single credential (dataType set) as an editable workflow credential_id parameter", () => {
const parameter: SkyvernCredential = {
key: "credentials",
parameterType: "credential",
credentialId: "cred_123",
dataType: WorkflowParameterValueType.CredentialId,
};
expect(skyvernCredentialToParameterYAML(parameter)).toEqual({
parameter_type: "workflow",
workflow_parameter_type: WorkflowParameterValueType.CredentialId,
default_value: "cred_123",
key: "credentials",
description: null,
});
});
test("serializes a rotation pool (2+ credentials) as a credential parameter", () => {
const parameter: SkyvernCredential = {
key: "credentials",
parameterType: "credential",
credentialId: "cred_1",
credentialIds: ["cred_1", "cred_2"],
selectionStrategy: "round_robin",
};
expect(skyvernCredentialToParameterYAML(parameter)).toEqual({
parameter_type: "credential",
credential_id: "cred_1",
credential_ids: ["cred_1", "cred_2"],
selection_strategy: "round_robin",
key: "credentials",
description: null,
});
});
});

View file

@ -6,7 +6,39 @@ import {
WorkflowParameterTypes,
WorkflowParameterValueType,
} from "../types/workflowTypes";
import { ParametersState } from "./types";
import {
CredentialParameterYAML,
WorkflowParameterYAML,
} from "../types/workflowYamlTypes";
import { ParametersState, SkyvernCredential } from "./types";
/**
* A single credential serializes to an editable workflow `credential_id`
* parameter (overridable at run/rerun time); only a rotation pool (2+
* credentials) becomes a block-scoped credential parameter.
*/
function skyvernCredentialToParameterYAML(
parameter: SkyvernCredential,
): WorkflowParameterYAML | CredentialParameterYAML {
const hasCredentialRotation = (parameter.credentialIds?.length ?? 0) >= 2;
if (!hasCredentialRotation) {
return {
parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type: WorkflowParameterValueType.CredentialId,
default_value: parameter.credentialId,
key: parameter.key,
description: parameter.description || null,
};
}
return {
parameter_type: WorkflowParameterTypes.Credential,
credential_id: parameter.credentialId,
credential_ids: parameter.credentialIds ?? null,
selection_strategy: parameter.selectionStrategy ?? null,
key: parameter.key,
description: parameter.description || null,
};
}
const getInitialParameters = (workflow: WorkflowApiResponse) => {
return workflow.workflow_definition.parameters
@ -173,4 +205,5 @@ export {
constructCacheKeyValue,
constructCacheKeyValueFromParameters,
getInitialParameters,
skyvernCredentialToParameterYAML,
};