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:
committed by
GitHub
parent
39a830ef6c
commit
3559e2572c
@@ -48,6 +48,7 @@ import {
|
||||
BlockYAML,
|
||||
ContextParameterYAML,
|
||||
CredentialParameterYAML,
|
||||
OnePasswordCredentialParameterYAML,
|
||||
ParameterYAML,
|
||||
WorkflowCreateYAMLRequest,
|
||||
WorkflowParameterYAML,
|
||||
@@ -68,6 +69,12 @@ import {
|
||||
} from "./nodes";
|
||||
import { WorkflowNodeLibraryPanel } from "./panels/WorkflowNodeLibraryPanel";
|
||||
import { WorkflowParametersPanel } from "./panels/WorkflowParametersPanel";
|
||||
import {
|
||||
ParametersState,
|
||||
parameterIsSkyvernCredential,
|
||||
parameterIsOnePasswordCredential,
|
||||
parameterIsBitwardenCredential,
|
||||
} from "./types";
|
||||
import "./reactFlowOverrideStyles.css";
|
||||
import {
|
||||
convertEchoParameters,
|
||||
@@ -84,7 +91,7 @@ import {
|
||||
nodeAdderNode,
|
||||
startNode,
|
||||
} from "./workflowEditorUtils";
|
||||
import { parameterIsBitwardenCredential, ParametersState } from "./types";
|
||||
|
||||
import { useAutoPan } from "./useAutoPan";
|
||||
|
||||
function convertToParametersYAML(
|
||||
@@ -95,86 +102,133 @@ function convertToParametersYAML(
|
||||
| ContextParameterYAML
|
||||
| BitwardenSensitiveInformationParameterYAML
|
||||
| BitwardenCreditCardDataParameterYAML
|
||||
| OnePasswordCredentialParameterYAML
|
||||
| CredentialParameterYAML
|
||||
> {
|
||||
return parameters.map((parameter) => {
|
||||
if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Workflow,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
workflow_parameter_type: parameter.dataType,
|
||||
...(parameter.defaultValue === null
|
||||
? {}
|
||||
: { default_value: parameter.defaultValue }),
|
||||
};
|
||||
} else if (
|
||||
parameter.parameterType === WorkflowEditorParameterTypes.Context
|
||||
) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Context,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
source_parameter_key: parameter.sourceParameterKey,
|
||||
};
|
||||
} else if (
|
||||
parameter.parameterType === WorkflowEditorParameterTypes.Secret
|
||||
) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Bitwarden_Sensitive_Information,
|
||||
key: parameter.key,
|
||||
bitwarden_identity_key: parameter.identityKey,
|
||||
bitwarden_identity_fields: parameter.identityFields,
|
||||
description: parameter.description || null,
|
||||
bitwarden_collection_id: parameter.collectionId,
|
||||
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 (
|
||||
parameter.parameterType === WorkflowEditorParameterTypes.CreditCardData
|
||||
) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
bitwarden_item_id: parameter.itemId,
|
||||
bitwarden_collection_id: parameter.collectionId,
|
||||
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 (parameterIsBitwardenCredential(parameter)) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
|
||||
key: parameter.key,
|
||||
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 {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Workflow,
|
||||
workflow_parameter_type: WorkflowParameterValueType.CredentialId,
|
||||
default_value: parameter.credentialId,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
return parameters
|
||||
.map(
|
||||
(
|
||||
parameter: ParametersState[number],
|
||||
):
|
||||
| WorkflowParameterYAML
|
||||
| BitwardenLoginCredentialParameterYAML
|
||||
| ContextParameterYAML
|
||||
| BitwardenSensitiveInformationParameterYAML
|
||||
| BitwardenCreditCardDataParameterYAML
|
||||
| OnePasswordCredentialParameterYAML
|
||||
| CredentialParameterYAML
|
||||
| undefined => {
|
||||
if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Workflow,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
workflow_parameter_type: parameter.dataType,
|
||||
...(parameter.defaultValue === null
|
||||
? {}
|
||||
: { default_value: parameter.defaultValue }),
|
||||
};
|
||||
} else if (
|
||||
parameter.parameterType === WorkflowEditorParameterTypes.Context
|
||||
) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Context,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
source_parameter_key: parameter.sourceParameterKey,
|
||||
};
|
||||
} else if (
|
||||
parameter.parameterType === WorkflowEditorParameterTypes.Secret
|
||||
) {
|
||||
return {
|
||||
parameter_type:
|
||||
WorkflowParameterTypes.Bitwarden_Sensitive_Information,
|
||||
key: parameter.key,
|
||||
bitwarden_identity_key: parameter.identityKey,
|
||||
bitwarden_identity_fields: parameter.identityFields,
|
||||
description: parameter.description || null,
|
||||
bitwarden_collection_id: parameter.collectionId,
|
||||
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 (
|
||||
parameter.parameterType ===
|
||||
WorkflowEditorParameterTypes.CreditCardData
|
||||
) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
|
||||
key: parameter.key,
|
||||
description: parameter.description || null,
|
||||
bitwarden_item_id: parameter.itemId,
|
||||
bitwarden_collection_id: parameter.collectionId,
|
||||
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 (parameterIsBitwardenCredential(parameter)) {
|
||||
return {
|
||||
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
|
||||
key: parameter.key,
|
||||
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 = {
|
||||
@@ -207,7 +261,8 @@ function FlowRenderer({
|
||||
useWorkflowPanelStore();
|
||||
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
||||
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
||||
const [parameters, setParameters] = useState(initialParameters);
|
||||
const [parameters, setParameters] =
|
||||
useState<ParametersState>(initialParameters);
|
||||
const [title, setTitle] = useState(initialTitle);
|
||||
const nodesInitialized = useNodesInitialized();
|
||||
const { hasChanges, setHasChanges } = useWorkflowHasChangesStore();
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
WorkflowParameterValueType,
|
||||
WorkflowSettings,
|
||||
} from "../types/workflowTypes";
|
||||
import { ParametersState } from "./types";
|
||||
import { useGlobalWorkflowsQuery } from "../hooks/useGlobalWorkflowsQuery";
|
||||
|
||||
function WorkflowEditor() {
|
||||
@@ -74,82 +75,100 @@ function WorkflowEditor() {
|
||||
initialTitle={workflow.title}
|
||||
initialNodes={elements.nodes}
|
||||
initialEdges={elements.edges}
|
||||
initialParameters={workflow.workflow_definition.parameters
|
||||
.filter((parameter) => isDisplayedInWorkflowEditor(parameter))
|
||||
.map((parameter) => {
|
||||
if (
|
||||
parameter.parameter_type === WorkflowParameterTypes.Workflow
|
||||
) {
|
||||
initialParameters={
|
||||
workflow.workflow_definition.parameters
|
||||
.filter((parameter) => isDisplayedInWorkflowEditor(parameter))
|
||||
.map((parameter) => {
|
||||
if (
|
||||
parameter.workflow_parameter_type ===
|
||||
WorkflowParameterValueType.CredentialId
|
||||
parameter.parameter_type === WorkflowParameterTypes.Workflow
|
||||
) {
|
||||
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 {
|
||||
key: parameter.key,
|
||||
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,
|
||||
};
|
||||
}
|
||||
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 {
|
||||
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,
|
||||
};
|
||||
}
|
||||
})}
|
||||
return undefined;
|
||||
})
|
||||
.filter(Boolean) as ParametersState
|
||||
}
|
||||
workflow={workflow}
|
||||
/>
|
||||
</ReactFlowProvider>
|
||||
|
||||
@@ -80,9 +80,11 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
||||
string | undefined
|
||||
>(undefined);
|
||||
|
||||
const [credentialType, setCredentialType] = useState<"bitwarden" | "skyvern">(
|
||||
"skyvern",
|
||||
);
|
||||
const [credentialType, setCredentialType] = useState<
|
||||
"bitwarden" | "skyvern" | "onepassword"
|
||||
>("skyvern");
|
||||
const [vaultId, setVaultId] = useState("");
|
||||
const [itemId, setItemId] = useState("");
|
||||
|
||||
const [identityKey, setIdentityKey] = useState("");
|
||||
const [identityFields, setIdentityFields] = useState("");
|
||||
@@ -200,11 +202,14 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
||||
<SwitchBar
|
||||
value={credentialType}
|
||||
onChange={(value) => {
|
||||
setCredentialType(value as "bitwarden" | "skyvern");
|
||||
setCredentialType(
|
||||
value as "bitwarden" | "skyvern" | "onepassword",
|
||||
);
|
||||
}}
|
||||
options={[
|
||||
{ label: "Skyvern", value: "skyvern" },
|
||||
{ label: "Bitwarden", value: "bitwarden" },
|
||||
{ label: "1Password", value: "onepassword" },
|
||||
]}
|
||||
/>
|
||||
)}
|
||||
@@ -237,6 +242,24 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
||||
</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" && (
|
||||
<div className="space-y-1">
|
||||
<Label className="text-xs text-slate-300">Source Parameter</Label>
|
||||
@@ -387,6 +410,23 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
||||
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 (!bitwardenCollectionId) {
|
||||
toast({
|
||||
|
||||
@@ -26,6 +26,7 @@ import { WorkflowParameterInput } from "../../WorkflowParameterInput";
|
||||
import {
|
||||
parameterIsBitwardenCredential,
|
||||
parameterIsSkyvernCredential,
|
||||
parameterIsOnePasswordCredential,
|
||||
ParametersState,
|
||||
} from "../types";
|
||||
import { getDefaultValueForParameterType } from "../workflowEditorUtils";
|
||||
@@ -78,8 +79,17 @@ function WorkflowParameterEditPanel({
|
||||
const isSkyvernCredential =
|
||||
initialValues.parameterType === "credential" &&
|
||||
parameterIsSkyvernCredential(initialValues);
|
||||
const [credentialType, setCredentialType] = useState<"bitwarden" | "skyvern">(
|
||||
isBitwardenCredential ? "bitwarden" : "skyvern",
|
||||
const isOnePasswordCredential =
|
||||
initialValues.parameterType === "onepassword" &&
|
||||
parameterIsOnePasswordCredential(initialValues);
|
||||
const [credentialType, setCredentialType] = useState<
|
||||
"bitwarden" | "skyvern" | "onepassword"
|
||||
>(
|
||||
isBitwardenCredential
|
||||
? "bitwarden"
|
||||
: isOnePasswordCredential
|
||||
? "onepassword"
|
||||
: "skyvern",
|
||||
);
|
||||
const [urlParameterKey, setUrlParameterKey] = useState(
|
||||
isBitwardenCredential ? initialValues.urlParameterKey ?? "" : "",
|
||||
@@ -143,6 +153,12 @@ function WorkflowParameterEditPanel({
|
||||
const [credentialId, setCredentialId] = useState(
|
||||
isSkyvernCredential ? initialValues.credentialId : "",
|
||||
);
|
||||
const [vaultId, setVaultId] = useState(
|
||||
isOnePasswordCredential ? initialValues.vaultId : "",
|
||||
);
|
||||
const [opItemId, setOpItemId] = useState(
|
||||
isOnePasswordCredential ? initialValues.itemId : "",
|
||||
);
|
||||
|
||||
const [bitwardenLoginCredentialItemId, setBitwardenLoginCredentialItemId] =
|
||||
useState(isBitwardenCredential ? initialValues.itemId ?? "" : "");
|
||||
@@ -256,11 +272,14 @@ function WorkflowParameterEditPanel({
|
||||
<SwitchBar
|
||||
value={credentialType}
|
||||
onChange={(value) => {
|
||||
setCredentialType(value as "bitwarden" | "skyvern");
|
||||
setCredentialType(
|
||||
value as "bitwarden" | "skyvern" | "onepassword",
|
||||
);
|
||||
}}
|
||||
options={[
|
||||
{ label: "Skyvern", value: "skyvern" },
|
||||
{ label: "Bitwarden", value: "bitwarden" },
|
||||
{ label: "1Password", value: "onepassword" },
|
||||
]}
|
||||
/>
|
||||
)}
|
||||
@@ -293,6 +312,24 @@ function WorkflowParameterEditPanel({
|
||||
</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" && (
|
||||
<div className="space-y-1">
|
||||
<Label className="text-xs text-slate-300">Source Parameter</Label>
|
||||
@@ -430,6 +467,23 @@ function WorkflowParameterEditPanel({
|
||||
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 (!collectionId) {
|
||||
toast({
|
||||
|
||||
@@ -153,7 +153,10 @@ function WorkflowParametersPanel() {
|
||||
active: true,
|
||||
operation: "edit",
|
||||
parameter: parameter,
|
||||
type: parameter.parameterType,
|
||||
type:
|
||||
parameter.parameterType === "onepassword"
|
||||
? WorkflowEditorParameterTypes.OnePassword
|
||||
: parameter.parameterType,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -16,6 +16,14 @@ export type SkyvernCredential = {
|
||||
credentialId: string;
|
||||
};
|
||||
|
||||
export type OnePasswordCredential = {
|
||||
key: string;
|
||||
description?: string | null;
|
||||
parameterType: "onepassword";
|
||||
vaultId: string;
|
||||
itemId: string;
|
||||
};
|
||||
|
||||
export function parameterIsBitwardenCredential(
|
||||
parameter: CredentialParameterState,
|
||||
): parameter is BitwardenLoginCredential {
|
||||
@@ -28,9 +36,16 @@ export function parameterIsSkyvernCredential(
|
||||
return "credentialId" in parameter;
|
||||
}
|
||||
|
||||
export function parameterIsOnePasswordCredential(
|
||||
parameter: CredentialParameterState,
|
||||
): parameter is OnePasswordCredential {
|
||||
return "vaultId" in parameter && "itemId" in parameter;
|
||||
}
|
||||
|
||||
export type CredentialParameterState =
|
||||
| BitwardenLoginCredential
|
||||
| SkyvernCredential;
|
||||
| SkyvernCredential
|
||||
| OnePasswordCredential;
|
||||
|
||||
export type ParametersState = Array<
|
||||
| {
|
||||
@@ -53,6 +68,7 @@ export type ParametersState = Array<
|
||||
identityFields: Array<string>;
|
||||
collectionId: string;
|
||||
description?: string | null;
|
||||
maybe?: boolean;
|
||||
}
|
||||
| {
|
||||
key: string;
|
||||
|
||||
@@ -1614,89 +1614,99 @@ function getAvailableOutputParameterKeys(
|
||||
function convertParametersToParameterYAML(
|
||||
parameters: Array<Exclude<Parameter, OutputParameter>>,
|
||||
): Array<ParameterYAML> {
|
||||
return parameters.map((parameter) => {
|
||||
const base = {
|
||||
key: parameter.key,
|
||||
description: parameter.description,
|
||||
parameter_type: parameter.parameter_type,
|
||||
};
|
||||
switch (parameter.parameter_type) {
|
||||
case WorkflowParameterTypes.AWS_Secret: {
|
||||
return {
|
||||
...base,
|
||||
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||
aws_key: parameter.aws_key,
|
||||
};
|
||||
return parameters
|
||||
.map((parameter) => {
|
||||
const base = {
|
||||
key: parameter.key,
|
||||
description: parameter.description,
|
||||
parameter_type: parameter.parameter_type,
|
||||
};
|
||||
switch (parameter.parameter_type) {
|
||||
case WorkflowParameterTypes.AWS_Secret: {
|
||||
return {
|
||||
...base,
|
||||
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 {
|
||||
...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,
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
function convertBlocksToBlockYAML(
|
||||
|
||||
@@ -61,6 +61,17 @@ export type BitwardenCreditCardDataParameter = WorkflowParameterBase & {
|
||||
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 & {
|
||||
parameter_type: "credential";
|
||||
workflow_id: string;
|
||||
@@ -118,6 +129,7 @@ export const WorkflowParameterTypes = {
|
||||
Bitwarden_Login_Credential: "bitwarden_login_credential",
|
||||
Bitwarden_Sensitive_Information: "bitwarden_sensitive_information",
|
||||
Bitwarden_Credit_Card_Data: "bitwarden_credit_card_data",
|
||||
OnePassword: "onepassword",
|
||||
Credential: "credential",
|
||||
} as const;
|
||||
|
||||
@@ -132,6 +144,7 @@ export function isDisplayedInWorkflowEditor(
|
||||
| BitwardenCreditCardDataParameter
|
||||
| BitwardenLoginCredentialParameter
|
||||
| BitwardenSensitiveInformationParameter
|
||||
| OnePasswordCredentialParameter
|
||||
| CredentialParameter {
|
||||
return (
|
||||
parameter.parameter_type === WorkflowParameterTypes.Workflow ||
|
||||
@@ -142,6 +155,7 @@ export function isDisplayedInWorkflowEditor(
|
||||
WorkflowParameterTypes.Bitwarden_Sensitive_Information ||
|
||||
parameter.parameter_type ===
|
||||
WorkflowParameterTypes.Bitwarden_Credit_Card_Data ||
|
||||
parameter.parameter_type === WorkflowParameterTypes.OnePassword ||
|
||||
parameter.parameter_type === WorkflowParameterTypes.Credential
|
||||
);
|
||||
}
|
||||
@@ -153,6 +167,7 @@ export type Parameter =
|
||||
| BitwardenLoginCredentialParameter
|
||||
| BitwardenSensitiveInformationParameter
|
||||
| BitwardenCreditCardDataParameter
|
||||
| OnePasswordCredentialParameter
|
||||
| AWSSecretParameter
|
||||
| CredentialParameter;
|
||||
|
||||
@@ -222,6 +237,7 @@ export const WorkflowEditorParameterTypes = {
|
||||
Secret: "secret",
|
||||
Context: "context",
|
||||
CreditCardData: "creditCardData",
|
||||
OnePassword: "onepassword",
|
||||
} as const;
|
||||
|
||||
export type WorkflowEditorParameterType =
|
||||
|
||||
@@ -23,11 +23,12 @@ export type ParameterYAML =
|
||||
| WorkflowParameterYAML
|
||||
| BitwardenLoginCredentialParameterYAML
|
||||
| AWSSecretParameterYAML
|
||||
| CredentialParameterYAML
|
||||
| BitwardenSensitiveInformationParameterYAML
|
||||
| BitwardenCreditCardDataParameterYAML
|
||||
| OnePasswordCredentialParameterYAML
|
||||
| ContextParameterYAML
|
||||
| OutputParameterYAML
|
||||
| BitwardenSensitiveInformationParameterYAML
|
||||
| BitwardenCreditCardDataParameterYAML;
|
||||
| CredentialParameterYAML;
|
||||
|
||||
export type ParameterYAMLBase = {
|
||||
parameter_type: string;
|
||||
@@ -78,6 +79,12 @@ export type BitwardenCreditCardDataParameterYAML = ParameterYAMLBase & {
|
||||
bitwarden_master_password_aws_secret_key: string;
|
||||
};
|
||||
|
||||
export type OnePasswordCredentialParameterYAML = ParameterYAMLBase & {
|
||||
parameter_type: "onepassword";
|
||||
vault_id: string;
|
||||
item_id: string;
|
||||
};
|
||||
|
||||
export type ContextParameterYAML = ParameterYAMLBase & {
|
||||
parameter_type: "context";
|
||||
source_parameter_key: string;
|
||||
|
||||
Reference in New Issue
Block a user