add 1Password credential parameter support to workflow editor (#2657)

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Shuchang Zheng <wintonzheng0325@gmail.com>
This commit is contained in:
Prakash Maheshwaran
2025-06-12 12:54:58 -04:00
committed by GitHub
parent 39a830ef6c
commit 3559e2572c
9 changed files with 462 additions and 242 deletions

View File

@@ -48,6 +48,7 @@ import {
BlockYAML, BlockYAML,
ContextParameterYAML, ContextParameterYAML,
CredentialParameterYAML, CredentialParameterYAML,
OnePasswordCredentialParameterYAML,
ParameterYAML, ParameterYAML,
WorkflowCreateYAMLRequest, WorkflowCreateYAMLRequest,
WorkflowParameterYAML, WorkflowParameterYAML,
@@ -68,6 +69,12 @@ import {
} from "./nodes"; } from "./nodes";
import { WorkflowNodeLibraryPanel } from "./panels/WorkflowNodeLibraryPanel"; import { WorkflowNodeLibraryPanel } from "./panels/WorkflowNodeLibraryPanel";
import { WorkflowParametersPanel } from "./panels/WorkflowParametersPanel"; import { WorkflowParametersPanel } from "./panels/WorkflowParametersPanel";
import {
ParametersState,
parameterIsSkyvernCredential,
parameterIsOnePasswordCredential,
parameterIsBitwardenCredential,
} from "./types";
import "./reactFlowOverrideStyles.css"; import "./reactFlowOverrideStyles.css";
import { import {
convertEchoParameters, convertEchoParameters,
@@ -84,7 +91,7 @@ import {
nodeAdderNode, nodeAdderNode,
startNode, startNode,
} from "./workflowEditorUtils"; } from "./workflowEditorUtils";
import { parameterIsBitwardenCredential, ParametersState } from "./types";
import { useAutoPan } from "./useAutoPan"; import { useAutoPan } from "./useAutoPan";
function convertToParametersYAML( function convertToParametersYAML(
@@ -95,86 +102,133 @@ function convertToParametersYAML(
| ContextParameterYAML | ContextParameterYAML
| BitwardenSensitiveInformationParameterYAML | BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML | BitwardenCreditCardDataParameterYAML
| OnePasswordCredentialParameterYAML
| CredentialParameterYAML | CredentialParameterYAML
> { > {
return parameters.map((parameter) => { return parameters
if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) { .map(
return { (
parameter_type: WorkflowParameterTypes.Workflow, parameter: ParametersState[number],
key: parameter.key, ):
description: parameter.description || null, | WorkflowParameterYAML
workflow_parameter_type: parameter.dataType, | BitwardenLoginCredentialParameterYAML
...(parameter.defaultValue === null | ContextParameterYAML
? {} | BitwardenSensitiveInformationParameterYAML
: { default_value: parameter.defaultValue }), | BitwardenCreditCardDataParameterYAML
}; | OnePasswordCredentialParameterYAML
} else if ( | CredentialParameterYAML
parameter.parameterType === WorkflowEditorParameterTypes.Context | undefined => {
) { if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) {
return { return {
parameter_type: WorkflowParameterTypes.Context, parameter_type: WorkflowParameterTypes.Workflow,
key: parameter.key, key: parameter.key,
description: parameter.description || null, description: parameter.description || null,
source_parameter_key: parameter.sourceParameterKey, workflow_parameter_type: parameter.dataType,
}; ...(parameter.defaultValue === null
} else if ( ? {}
parameter.parameterType === WorkflowEditorParameterTypes.Secret : { default_value: parameter.defaultValue }),
) { };
return { } else if (
parameter_type: WorkflowParameterTypes.Bitwarden_Sensitive_Information, parameter.parameterType === WorkflowEditorParameterTypes.Context
key: parameter.key, ) {
bitwarden_identity_key: parameter.identityKey, return {
bitwarden_identity_fields: parameter.identityFields, parameter_type: WorkflowParameterTypes.Context,
description: parameter.description || null, key: parameter.key,
bitwarden_collection_id: parameter.collectionId, description: parameter.description || null,
bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY, source_parameter_key: parameter.sourceParameterKey,
bitwarden_client_secret_aws_secret_key: };
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY, } else if (
bitwarden_master_password_aws_secret_key: parameter.parameterType === WorkflowEditorParameterTypes.Secret
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY, ) {
}; return {
} else if ( parameter_type:
parameter.parameterType === WorkflowEditorParameterTypes.CreditCardData WorkflowParameterTypes.Bitwarden_Sensitive_Information,
) { key: parameter.key,
return { bitwarden_identity_key: parameter.identityKey,
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data, bitwarden_identity_fields: parameter.identityFields,
key: parameter.key, description: parameter.description || null,
description: parameter.description || null, bitwarden_collection_id: parameter.collectionId,
bitwarden_item_id: parameter.itemId, bitwarden_client_id_aws_secret_key:
bitwarden_collection_id: parameter.collectionId, BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY, bitwarden_client_secret_aws_secret_key:
bitwarden_client_secret_aws_secret_key: BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY, bitwarden_master_password_aws_secret_key:
bitwarden_master_password_aws_secret_key: BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY, };
}; } else if (
} else { parameter.parameterType ===
if (parameterIsBitwardenCredential(parameter)) { WorkflowEditorParameterTypes.CreditCardData
return { ) {
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential, return {
key: parameter.key, parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
description: parameter.description || null, key: parameter.key,
bitwarden_collection_id: parameter.collectionId, description: parameter.description || null,
bitwarden_item_id: parameter.itemId, bitwarden_item_id: parameter.itemId,
url_parameter_key: parameter.urlParameterKey, bitwarden_collection_id: parameter.collectionId,
bitwarden_client_id_aws_secret_key: bitwarden_client_id_aws_secret_key:
BITWARDEN_CLIENT_ID_AWS_SECRET_KEY, BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
bitwarden_client_secret_aws_secret_key: bitwarden_client_secret_aws_secret_key:
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY, BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
bitwarden_master_password_aws_secret_key: bitwarden_master_password_aws_secret_key:
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY, BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
}; };
} else { } else {
return { if (parameterIsBitwardenCredential(parameter)) {
parameter_type: WorkflowParameterTypes.Workflow, return {
workflow_parameter_type: WorkflowParameterValueType.CredentialId, parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
default_value: parameter.credentialId, key: parameter.key,
key: parameter.key, description: parameter.description || null,
description: parameter.description || null, bitwarden_collection_id: parameter.collectionId,
}; bitwarden_item_id: parameter.itemId,
} url_parameter_key: parameter.urlParameterKey,
} bitwarden_client_id_aws_secret_key:
}); BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
bitwarden_client_secret_aws_secret_key:
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
bitwarden_master_password_aws_secret_key:
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
};
} else if (parameterIsSkyvernCredential(parameter)) {
return {
parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type: WorkflowParameterValueType.CredentialId,
default_value: parameter.credentialId,
key: parameter.key,
description: parameter.description || null,
};
} else if (parameterIsOnePasswordCredential(parameter)) {
return {
parameter_type: WorkflowParameterTypes.OnePassword,
key: parameter.key,
description: parameter.description || null,
vault_id: parameter.vaultId,
item_id: parameter.itemId,
};
}
}
return undefined;
},
)
.filter(
(
param:
| WorkflowParameterYAML
| BitwardenLoginCredentialParameterYAML
| ContextParameterYAML
| BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML
| OnePasswordCredentialParameterYAML
| CredentialParameterYAML
| undefined,
): param is
| WorkflowParameterYAML
| BitwardenLoginCredentialParameterYAML
| ContextParameterYAML
| BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML
| OnePasswordCredentialParameterYAML
| CredentialParameterYAML => param !== undefined,
);
} }
type Props = { type Props = {
@@ -207,7 +261,8 @@ function FlowRenderer({
useWorkflowPanelStore(); useWorkflowPanelStore();
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes); const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
const [parameters, setParameters] = useState(initialParameters); const [parameters, setParameters] =
useState<ParametersState>(initialParameters);
const [title, setTitle] = useState(initialTitle); const [title, setTitle] = useState(initialTitle);
const nodesInitialized = useNodesInitialized(); const nodesInitialized = useNodesInitialized();
const { hasChanges, setHasChanges } = useWorkflowHasChangesStore(); const { hasChanges, setHasChanges } = useWorkflowHasChangesStore();

View File

@@ -14,6 +14,7 @@ import {
WorkflowParameterValueType, WorkflowParameterValueType,
WorkflowSettings, WorkflowSettings,
} from "../types/workflowTypes"; } from "../types/workflowTypes";
import { ParametersState } from "./types";
import { useGlobalWorkflowsQuery } from "../hooks/useGlobalWorkflowsQuery"; import { useGlobalWorkflowsQuery } from "../hooks/useGlobalWorkflowsQuery";
function WorkflowEditor() { function WorkflowEditor() {
@@ -74,82 +75,100 @@ function WorkflowEditor() {
initialTitle={workflow.title} initialTitle={workflow.title}
initialNodes={elements.nodes} initialNodes={elements.nodes}
initialEdges={elements.edges} initialEdges={elements.edges}
initialParameters={workflow.workflow_definition.parameters initialParameters={
.filter((parameter) => isDisplayedInWorkflowEditor(parameter)) workflow.workflow_definition.parameters
.map((parameter) => { .filter((parameter) => isDisplayedInWorkflowEditor(parameter))
if ( .map((parameter) => {
parameter.parameter_type === WorkflowParameterTypes.Workflow
) {
if ( if (
parameter.workflow_parameter_type === parameter.parameter_type === WorkflowParameterTypes.Workflow
WorkflowParameterValueType.CredentialId ) {
if (
parameter.workflow_parameter_type ===
WorkflowParameterValueType.CredentialId
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Credential,
credentialId: parameter.default_value as string,
description: parameter.description,
};
}
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Workflow,
dataType: parameter.workflow_parameter_type,
defaultValue: parameter.default_value,
description: parameter.description,
};
} else if (
parameter.parameter_type === WorkflowParameterTypes.Context
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Context,
sourceParameterKey: parameter.source.key,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Sensitive_Information
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Secret,
collectionId: parameter.bitwarden_collection_id,
identityKey: parameter.bitwarden_identity_key,
identityFields: parameter.bitwarden_identity_fields,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Credit_Card_Data
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.CreditCardData,
collectionId: parameter.bitwarden_collection_id,
itemId: parameter.bitwarden_item_id,
description: parameter.description,
};
} else if (
parameter.parameter_type === WorkflowParameterTypes.Credential
) { ) {
return { return {
key: parameter.key, key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Credential, parameterType: WorkflowEditorParameterTypes.Credential,
credentialId: parameter.default_value as string, credentialId: parameter.credential_id,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.OnePassword
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.OnePassword,
vaultId: parameter.vault_id,
itemId: parameter.item_id,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Login_Credential
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Credential,
collectionId: parameter.bitwarden_collection_id,
itemId: parameter.bitwarden_item_id,
urlParameterKey: parameter.url_parameter_key,
description: parameter.description, description: parameter.description,
}; };
} }
return { return undefined;
key: parameter.key, })
parameterType: WorkflowEditorParameterTypes.Workflow, .filter(Boolean) as ParametersState
dataType: parameter.workflow_parameter_type, }
defaultValue: parameter.default_value,
description: parameter.description,
};
} else if (
parameter.parameter_type === WorkflowParameterTypes.Context
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Context,
sourceParameterKey: parameter.source.key,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Sensitive_Information
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Secret,
collectionId: parameter.bitwarden_collection_id,
identityKey: parameter.bitwarden_identity_key,
identityFields: parameter.bitwarden_identity_fields,
description: parameter.description,
};
} else if (
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Credit_Card_Data
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.CreditCardData,
collectionId: parameter.bitwarden_collection_id,
itemId: parameter.bitwarden_item_id,
description: parameter.description,
};
} else if (
parameter.parameter_type === WorkflowParameterTypes.Credential
) {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Credential,
credentialId: parameter.credential_id,
description: parameter.description,
};
} else {
return {
key: parameter.key,
parameterType: WorkflowEditorParameterTypes.Credential,
collectionId: parameter.bitwarden_collection_id,
itemId: parameter.bitwarden_item_id,
urlParameterKey: parameter.url_parameter_key,
description: parameter.description,
};
}
})}
workflow={workflow} workflow={workflow}
/> />
</ReactFlowProvider> </ReactFlowProvider>

View File

@@ -80,9 +80,11 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
string | undefined string | undefined
>(undefined); >(undefined);
const [credentialType, setCredentialType] = useState<"bitwarden" | "skyvern">( const [credentialType, setCredentialType] = useState<
"skyvern", "bitwarden" | "skyvern" | "onepassword"
); >("skyvern");
const [vaultId, setVaultId] = useState("");
const [itemId, setItemId] = useState("");
const [identityKey, setIdentityKey] = useState(""); const [identityKey, setIdentityKey] = useState("");
const [identityFields, setIdentityFields] = useState(""); const [identityFields, setIdentityFields] = useState("");
@@ -200,11 +202,14 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
<SwitchBar <SwitchBar
value={credentialType} value={credentialType}
onChange={(value) => { onChange={(value) => {
setCredentialType(value as "bitwarden" | "skyvern"); setCredentialType(
value as "bitwarden" | "skyvern" | "onepassword",
);
}} }}
options={[ options={[
{ label: "Skyvern", value: "skyvern" }, { label: "Skyvern", value: "skyvern" },
{ label: "Bitwarden", value: "bitwarden" }, { label: "Bitwarden", value: "bitwarden" },
{ label: "1Password", value: "onepassword" },
]} ]}
/> />
)} )}
@@ -237,6 +242,24 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
</div> </div>
</> </>
)} )}
{type === "credential" && credentialType === "onepassword" && (
<>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Vault ID</Label>
<Input
value={vaultId}
onChange={(e) => setVaultId(e.target.value)}
/>
</div>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Item ID</Label>
<Input
value={itemId}
onChange={(e) => setItemId(e.target.value)}
/>
</div>
</>
)}
{type === "context" && ( {type === "context" && (
<div className="space-y-1"> <div className="space-y-1">
<Label className="text-xs text-slate-300">Source Parameter</Label> <Label className="text-xs text-slate-300">Source Parameter</Label>
@@ -387,6 +410,23 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
description, description,
}); });
} }
if (type === "credential" && credentialType === "onepassword") {
if (vaultId.trim() === "" || itemId.trim() === "") {
toast({
variant: "destructive",
title: "Failed to add parameter",
description: "Vault ID and Item ID are required",
});
return;
}
onSave({
key,
parameterType: "onepassword",
vaultId,
itemId,
description,
});
}
if (type === "secret" || type === "creditCardData") { if (type === "secret" || type === "creditCardData") {
if (!bitwardenCollectionId) { if (!bitwardenCollectionId) {
toast({ toast({

View File

@@ -26,6 +26,7 @@ import { WorkflowParameterInput } from "../../WorkflowParameterInput";
import { import {
parameterIsBitwardenCredential, parameterIsBitwardenCredential,
parameterIsSkyvernCredential, parameterIsSkyvernCredential,
parameterIsOnePasswordCredential,
ParametersState, ParametersState,
} from "../types"; } from "../types";
import { getDefaultValueForParameterType } from "../workflowEditorUtils"; import { getDefaultValueForParameterType } from "../workflowEditorUtils";
@@ -78,8 +79,17 @@ function WorkflowParameterEditPanel({
const isSkyvernCredential = const isSkyvernCredential =
initialValues.parameterType === "credential" && initialValues.parameterType === "credential" &&
parameterIsSkyvernCredential(initialValues); parameterIsSkyvernCredential(initialValues);
const [credentialType, setCredentialType] = useState<"bitwarden" | "skyvern">( const isOnePasswordCredential =
isBitwardenCredential ? "bitwarden" : "skyvern", initialValues.parameterType === "onepassword" &&
parameterIsOnePasswordCredential(initialValues);
const [credentialType, setCredentialType] = useState<
"bitwarden" | "skyvern" | "onepassword"
>(
isBitwardenCredential
? "bitwarden"
: isOnePasswordCredential
? "onepassword"
: "skyvern",
); );
const [urlParameterKey, setUrlParameterKey] = useState( const [urlParameterKey, setUrlParameterKey] = useState(
isBitwardenCredential ? initialValues.urlParameterKey ?? "" : "", isBitwardenCredential ? initialValues.urlParameterKey ?? "" : "",
@@ -143,6 +153,12 @@ function WorkflowParameterEditPanel({
const [credentialId, setCredentialId] = useState( const [credentialId, setCredentialId] = useState(
isSkyvernCredential ? initialValues.credentialId : "", isSkyvernCredential ? initialValues.credentialId : "",
); );
const [vaultId, setVaultId] = useState(
isOnePasswordCredential ? initialValues.vaultId : "",
);
const [opItemId, setOpItemId] = useState(
isOnePasswordCredential ? initialValues.itemId : "",
);
const [bitwardenLoginCredentialItemId, setBitwardenLoginCredentialItemId] = const [bitwardenLoginCredentialItemId, setBitwardenLoginCredentialItemId] =
useState(isBitwardenCredential ? initialValues.itemId ?? "" : ""); useState(isBitwardenCredential ? initialValues.itemId ?? "" : "");
@@ -256,11 +272,14 @@ function WorkflowParameterEditPanel({
<SwitchBar <SwitchBar
value={credentialType} value={credentialType}
onChange={(value) => { onChange={(value) => {
setCredentialType(value as "bitwarden" | "skyvern"); setCredentialType(
value as "bitwarden" | "skyvern" | "onepassword",
);
}} }}
options={[ options={[
{ label: "Skyvern", value: "skyvern" }, { label: "Skyvern", value: "skyvern" },
{ label: "Bitwarden", value: "bitwarden" }, { label: "Bitwarden", value: "bitwarden" },
{ label: "1Password", value: "onepassword" },
]} ]}
/> />
)} )}
@@ -293,6 +312,24 @@ function WorkflowParameterEditPanel({
</div> </div>
</> </>
)} )}
{type === "credential" && credentialType === "onepassword" && (
<>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Vault ID</Label>
<Input
value={vaultId}
onChange={(e) => setVaultId(e.target.value)}
/>
</div>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Item ID</Label>
<Input
value={opItemId}
onChange={(e) => setOpItemId(e.target.value)}
/>
</div>
</>
)}
{type === "context" && ( {type === "context" && (
<div className="space-y-1"> <div className="space-y-1">
<Label className="text-xs text-slate-300">Source Parameter</Label> <Label className="text-xs text-slate-300">Source Parameter</Label>
@@ -430,6 +467,23 @@ function WorkflowParameterEditPanel({
description, description,
}); });
} }
if (type === "credential" && credentialType === "onepassword") {
if (vaultId.trim() === "" || opItemId.trim() === "") {
toast({
variant: "destructive",
title: "Failed to save parameter",
description: "Vault ID and Item ID are required",
});
return;
}
onSave({
key,
parameterType: "onepassword",
vaultId,
itemId: opItemId,
description,
});
}
if (type === "secret" || type === "creditCardData") { if (type === "secret" || type === "creditCardData") {
if (!collectionId) { if (!collectionId) {
toast({ toast({

View File

@@ -153,7 +153,10 @@ function WorkflowParametersPanel() {
active: true, active: true,
operation: "edit", operation: "edit",
parameter: parameter, parameter: parameter,
type: parameter.parameterType, type:
parameter.parameterType === "onepassword"
? WorkflowEditorParameterTypes.OnePassword
: parameter.parameterType,
}); });
}} }}
/> />

View File

@@ -16,6 +16,14 @@ export type SkyvernCredential = {
credentialId: string; credentialId: string;
}; };
export type OnePasswordCredential = {
key: string;
description?: string | null;
parameterType: "onepassword";
vaultId: string;
itemId: string;
};
export function parameterIsBitwardenCredential( export function parameterIsBitwardenCredential(
parameter: CredentialParameterState, parameter: CredentialParameterState,
): parameter is BitwardenLoginCredential { ): parameter is BitwardenLoginCredential {
@@ -28,9 +36,16 @@ export function parameterIsSkyvernCredential(
return "credentialId" in parameter; return "credentialId" in parameter;
} }
export function parameterIsOnePasswordCredential(
parameter: CredentialParameterState,
): parameter is OnePasswordCredential {
return "vaultId" in parameter && "itemId" in parameter;
}
export type CredentialParameterState = export type CredentialParameterState =
| BitwardenLoginCredential | BitwardenLoginCredential
| SkyvernCredential; | SkyvernCredential
| OnePasswordCredential;
export type ParametersState = Array< export type ParametersState = Array<
| { | {
@@ -53,6 +68,7 @@ export type ParametersState = Array<
identityFields: Array<string>; identityFields: Array<string>;
collectionId: string; collectionId: string;
description?: string | null; description?: string | null;
maybe?: boolean;
} }
| { | {
key: string; key: string;

View File

@@ -1614,89 +1614,99 @@ function getAvailableOutputParameterKeys(
function convertParametersToParameterYAML( function convertParametersToParameterYAML(
parameters: Array<Exclude<Parameter, OutputParameter>>, parameters: Array<Exclude<Parameter, OutputParameter>>,
): Array<ParameterYAML> { ): Array<ParameterYAML> {
return parameters.map((parameter) => { return parameters
const base = { .map((parameter) => {
key: parameter.key, const base = {
description: parameter.description, key: parameter.key,
parameter_type: parameter.parameter_type, description: parameter.description,
}; parameter_type: parameter.parameter_type,
switch (parameter.parameter_type) { };
case WorkflowParameterTypes.AWS_Secret: { switch (parameter.parameter_type) {
return { case WorkflowParameterTypes.AWS_Secret: {
...base, return {
parameter_type: WorkflowParameterTypes.AWS_Secret, ...base,
aws_key: parameter.aws_key, parameter_type: WorkflowParameterTypes.AWS_Secret,
}; aws_key: parameter.aws_key,
};
}
case WorkflowParameterTypes.Bitwarden_Login_Credential: {
return {
...base,
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_item_id: parameter.bitwarden_item_id,
url_parameter_key: parameter.url_parameter_key,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Bitwarden_Sensitive_Information: {
return {
...base,
parameter_type:
WorkflowParameterTypes.Bitwarden_Sensitive_Information,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_identity_key: parameter.bitwarden_identity_key,
bitwarden_identity_fields: parameter.bitwarden_identity_fields,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Bitwarden_Credit_Card_Data: {
return {
...base,
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_item_id: parameter.bitwarden_item_id,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Context: {
return {
...base,
parameter_type: WorkflowParameterTypes.Context,
source_parameter_key: parameter.source.key,
};
}
case WorkflowParameterTypes.Workflow: {
return {
...base,
parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type: parameter.workflow_parameter_type,
default_value: parameter.default_value,
};
}
case WorkflowParameterTypes.Credential: {
return {
...base,
parameter_type: WorkflowParameterTypes.Credential,
credential_id: parameter.credential_id,
};
}
case WorkflowParameterTypes.OnePassword: {
return {
...base,
parameter_type: WorkflowParameterTypes.OnePassword,
vault_id: parameter.vault_id,
item_id: parameter.item_id,
};
}
} }
case WorkflowParameterTypes.Bitwarden_Login_Credential: { })
return { .filter(Boolean);
...base,
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_item_id: parameter.bitwarden_item_id,
url_parameter_key: parameter.url_parameter_key,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Bitwarden_Sensitive_Information: {
return {
...base,
parameter_type:
WorkflowParameterTypes.Bitwarden_Sensitive_Information,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_identity_key: parameter.bitwarden_identity_key,
bitwarden_identity_fields: parameter.bitwarden_identity_fields,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Bitwarden_Credit_Card_Data: {
return {
...base,
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_item_id: parameter.bitwarden_item_id,
bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key:
parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key:
parameter.bitwarden_master_password_aws_secret_key,
};
}
case WorkflowParameterTypes.Context: {
return {
...base,
parameter_type: WorkflowParameterTypes.Context,
source_parameter_key: parameter.source.key,
};
}
case WorkflowParameterTypes.Workflow: {
return {
...base,
parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type: parameter.workflow_parameter_type,
default_value: parameter.default_value,
};
}
case WorkflowParameterTypes.Credential: {
return {
...base,
parameter_type: WorkflowParameterTypes.Credential,
credential_id: parameter.credential_id,
};
}
}
});
} }
function convertBlocksToBlockYAML( function convertBlocksToBlockYAML(

View File

@@ -61,6 +61,17 @@ export type BitwardenCreditCardDataParameter = WorkflowParameterBase & {
deleted_at: string | null; deleted_at: string | null;
}; };
export type OnePasswordCredentialParameter = WorkflowParameterBase & {
parameter_type: "onepassword";
workflow_id: string;
onepassword_credential_parameter_id: string;
vault_id: string;
item_id: string;
created_at: string;
modified_at: string;
deleted_at: string | null;
};
export type CredentialParameter = WorkflowParameterBase & { export type CredentialParameter = WorkflowParameterBase & {
parameter_type: "credential"; parameter_type: "credential";
workflow_id: string; workflow_id: string;
@@ -118,6 +129,7 @@ export const WorkflowParameterTypes = {
Bitwarden_Login_Credential: "bitwarden_login_credential", Bitwarden_Login_Credential: "bitwarden_login_credential",
Bitwarden_Sensitive_Information: "bitwarden_sensitive_information", Bitwarden_Sensitive_Information: "bitwarden_sensitive_information",
Bitwarden_Credit_Card_Data: "bitwarden_credit_card_data", Bitwarden_Credit_Card_Data: "bitwarden_credit_card_data",
OnePassword: "onepassword",
Credential: "credential", Credential: "credential",
} as const; } as const;
@@ -132,6 +144,7 @@ export function isDisplayedInWorkflowEditor(
| BitwardenCreditCardDataParameter | BitwardenCreditCardDataParameter
| BitwardenLoginCredentialParameter | BitwardenLoginCredentialParameter
| BitwardenSensitiveInformationParameter | BitwardenSensitiveInformationParameter
| OnePasswordCredentialParameter
| CredentialParameter { | CredentialParameter {
return ( return (
parameter.parameter_type === WorkflowParameterTypes.Workflow || parameter.parameter_type === WorkflowParameterTypes.Workflow ||
@@ -142,6 +155,7 @@ export function isDisplayedInWorkflowEditor(
WorkflowParameterTypes.Bitwarden_Sensitive_Information || WorkflowParameterTypes.Bitwarden_Sensitive_Information ||
parameter.parameter_type === parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Credit_Card_Data || WorkflowParameterTypes.Bitwarden_Credit_Card_Data ||
parameter.parameter_type === WorkflowParameterTypes.OnePassword ||
parameter.parameter_type === WorkflowParameterTypes.Credential parameter.parameter_type === WorkflowParameterTypes.Credential
); );
} }
@@ -153,6 +167,7 @@ export type Parameter =
| BitwardenLoginCredentialParameter | BitwardenLoginCredentialParameter
| BitwardenSensitiveInformationParameter | BitwardenSensitiveInformationParameter
| BitwardenCreditCardDataParameter | BitwardenCreditCardDataParameter
| OnePasswordCredentialParameter
| AWSSecretParameter | AWSSecretParameter
| CredentialParameter; | CredentialParameter;
@@ -222,6 +237,7 @@ export const WorkflowEditorParameterTypes = {
Secret: "secret", Secret: "secret",
Context: "context", Context: "context",
CreditCardData: "creditCardData", CreditCardData: "creditCardData",
OnePassword: "onepassword",
} as const; } as const;
export type WorkflowEditorParameterType = export type WorkflowEditorParameterType =

View File

@@ -23,11 +23,12 @@ export type ParameterYAML =
| WorkflowParameterYAML | WorkflowParameterYAML
| BitwardenLoginCredentialParameterYAML | BitwardenLoginCredentialParameterYAML
| AWSSecretParameterYAML | AWSSecretParameterYAML
| CredentialParameterYAML | BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML
| OnePasswordCredentialParameterYAML
| ContextParameterYAML | ContextParameterYAML
| OutputParameterYAML | OutputParameterYAML
| BitwardenSensitiveInformationParameterYAML | CredentialParameterYAML;
| BitwardenCreditCardDataParameterYAML;
export type ParameterYAMLBase = { export type ParameterYAMLBase = {
parameter_type: string; parameter_type: string;
@@ -78,6 +79,12 @@ export type BitwardenCreditCardDataParameterYAML = ParameterYAMLBase & {
bitwarden_master_password_aws_secret_key: string; bitwarden_master_password_aws_secret_key: string;
}; };
export type OnePasswordCredentialParameterYAML = ParameterYAMLBase & {
parameter_type: "onepassword";
vault_id: string;
item_id: string;
};
export type ContextParameterYAML = ParameterYAMLBase & { export type ContextParameterYAML = ParameterYAMLBase & {
parameter_type: "context"; parameter_type: "context";
source_parameter_key: string; source_parameter_key: string;