Add credit card data parameter (#1599)

This commit is contained in:
Shuchang Zheng
2025-01-20 06:34:00 -08:00
committed by GitHub
parent 74d9c65e54
commit 8f3941b6b5
9 changed files with 296 additions and 82 deletions

View File

@@ -36,10 +36,13 @@ import { stringify as convertToYAML } from "yaml";
import { import {
AWSSecretParameter, AWSSecretParameter,
WorkflowApiResponse, WorkflowApiResponse,
WorkflowEditorParameterTypes,
WorkflowParameterTypes,
WorkflowParameterValueType, WorkflowParameterValueType,
WorkflowSettings, WorkflowSettings,
} from "../types/workflowTypes"; } from "../types/workflowTypes";
import { import {
BitwardenCreditCardDataParameterYAML,
BitwardenLoginCredentialParameterYAML, BitwardenLoginCredentialParameterYAML,
BitwardenSensitiveInformationParameterYAML, BitwardenSensitiveInformationParameterYAML,
BlockYAML, BlockYAML,
@@ -50,6 +53,11 @@ import {
} from "../types/workflowYamlTypes"; } from "../types/workflowYamlTypes";
import { WorkflowHeader } from "./WorkflowHeader"; import { WorkflowHeader } from "./WorkflowHeader";
import { WorkflowParametersStateContext } from "./WorkflowParametersStateContext"; import { WorkflowParametersStateContext } from "./WorkflowParametersStateContext";
import {
BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
} from "./constants";
import { edgeTypes } from "./edges"; import { edgeTypes } from "./edges";
import { import {
AppNode, AppNode,
@@ -82,11 +90,12 @@ function convertToParametersYAML(
| BitwardenLoginCredentialParameterYAML | BitwardenLoginCredentialParameterYAML
| ContextParameterYAML | ContextParameterYAML
| BitwardenSensitiveInformationParameterYAML | BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML
> { > {
return parameters.map((parameter) => { return parameters.map((parameter) => {
if (parameter.parameterType === "workflow") { if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) {
return { return {
parameter_type: "workflow", parameter_type: WorkflowParameterTypes.Workflow,
key: parameter.key, key: parameter.key,
description: parameter.description || null, description: parameter.description || null,
workflow_parameter_type: parameter.dataType, workflow_parameter_type: parameter.dataType,
@@ -94,39 +103,58 @@ function convertToParametersYAML(
? {} ? {}
: { default_value: parameter.defaultValue }), : { default_value: parameter.defaultValue }),
}; };
} else if (parameter.parameterType === "context") { } else if (
parameter.parameterType === WorkflowEditorParameterTypes.Context
) {
return { return {
parameter_type: "context", parameter_type: WorkflowParameterTypes.Context,
key: parameter.key, key: parameter.key,
description: parameter.description || null, description: parameter.description || null,
source_parameter_key: parameter.sourceParameterKey, source_parameter_key: parameter.sourceParameterKey,
}; };
} else if (parameter.parameterType === "secret") { } else if (
parameter.parameterType === WorkflowEditorParameterTypes.Secret
) {
return { return {
parameter_type: "bitwarden_sensitive_information", parameter_type: WorkflowParameterTypes.Bitwarden_Sensitive_Information,
key: parameter.key, key: parameter.key,
bitwarden_identity_key: parameter.identityKey, bitwarden_identity_key: parameter.identityKey,
bitwarden_identity_fields: parameter.identityFields, bitwarden_identity_fields: parameter.identityFields,
description: parameter.description || null, description: parameter.description || null,
bitwarden_collection_id: parameter.collectionId, bitwarden_collection_id: parameter.collectionId,
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID", bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
bitwarden_client_secret_aws_secret_key: bitwarden_client_secret_aws_secret_key:
"SKYVERN_BITWARDEN_CLIENT_SECRET", BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
bitwarden_master_password_aws_secret_key: bitwarden_master_password_aws_secret_key:
"SKYVERN_BITWARDEN_MASTER_PASSWORD", 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 { } else {
return { return {
parameter_type: "bitwarden_login_credential", parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
key: parameter.key, key: parameter.key,
description: parameter.description || null, description: parameter.description || null,
bitwarden_collection_id: parameter.collectionId, bitwarden_collection_id: parameter.collectionId,
url_parameter_key: parameter.urlParameterKey, url_parameter_key: parameter.urlParameterKey,
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID", bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
bitwarden_client_secret_aws_secret_key: bitwarden_client_secret_aws_secret_key:
"SKYVERN_BITWARDEN_CLIENT_SECRET", BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
bitwarden_master_password_aws_secret_key: bitwarden_master_password_aws_secret_key:
"SKYVERN_BITWARDEN_MASTER_PASSWORD", BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
}; };
} }
}); });
@@ -161,6 +189,13 @@ export type ParametersState = Array<
collectionId: string; collectionId: string;
description?: string | null; description?: string | null;
} }
| {
key: string;
parameterType: "creditCardData";
itemId: string;
collectionId: string;
description?: string | null;
}
>; >;
type Props = { type Props = {

View File

@@ -7,7 +7,12 @@ import { useWorkflowQuery } from "../hooks/useWorkflowQuery";
import { FlowRenderer } from "./FlowRenderer"; import { FlowRenderer } from "./FlowRenderer";
import { getElements } from "./workflowEditorUtils"; import { getElements } from "./workflowEditorUtils";
import { LogoMinimized } from "@/components/LogoMinimized"; import { LogoMinimized } from "@/components/LogoMinimized";
import { WorkflowSettings } from "../types/workflowTypes"; import {
isDisplayedInWorkflowEditor,
WorkflowEditorParameterTypes,
WorkflowParameterTypes,
WorkflowSettings,
} from "../types/workflowTypes";
function WorkflowEditor() { function WorkflowEditor() {
const { workflowPermanentId } = useParams(); const { workflowPermanentId } = useParams();
@@ -27,7 +32,6 @@ function WorkflowEditor() {
setHasChanges(false); setHasChanges(false);
}); });
// TODO
if (isLoading) { if (isLoading) {
return ( return (
<div className="flex h-screen w-full items-center justify-center"> <div className="flex h-screen w-full items-center justify-center">
@@ -56,13 +60,7 @@ function WorkflowEditor() {
initialNodes={elements.nodes} initialNodes={elements.nodes}
initialEdges={elements.edges} initialEdges={elements.edges}
initialParameters={workflow.workflow_definition.parameters initialParameters={workflow.workflow_definition.parameters
.filter( .filter((parameter) => isDisplayedInWorkflowEditor(parameter))
(parameter) =>
parameter.parameter_type === "workflow" ||
parameter.parameter_type === "bitwarden_login_credential" ||
parameter.parameter_type === "context" ||
parameter.parameter_type === "bitwarden_sensitive_information",
)
.map((parameter) => { .map((parameter) => {
if (parameter.parameter_type === "workflow") { if (parameter.parameter_type === "workflow") {
return { return {
@@ -90,6 +88,17 @@ function WorkflowEditor() {
identityFields: parameter.bitwarden_identity_fields, identityFields: parameter.bitwarden_identity_fields,
description: parameter.description, 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 { } else {
return { return {
key: parameter.key, key: parameter.key,

View File

@@ -14,3 +14,9 @@ export const SMTP_USERNAME_AWS_KEY = "SKYVERN_SMTP_USERNAME_SES";
export const SMTP_PASSWORD_AWS_KEY = "SKYVERN_SMTP_PASSWORD_SES"; export const SMTP_PASSWORD_AWS_KEY = "SKYVERN_SMTP_PASSWORD_SES";
export const EMAIL_BLOCK_SENDER = "hello@skyvern.com"; export const EMAIL_BLOCK_SENDER = "hello@skyvern.com";
export const BITWARDEN_CLIENT_ID_AWS_SECRET_KEY = "SKYVERN_BITWARDEN_CLIENT_ID";
export const BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY =
"SKYVERN_BITWARDEN_CLIENT_SECRET";
export const BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY =
"SKYVERN_BITWARDEN_MASTER_PASSWORD";

View File

@@ -2,7 +2,10 @@ import { Cross2Icon } from "@radix-ui/react-icons";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { useState } from "react"; import { useState } from "react";
import { WorkflowParameterValueType } from "../../types/workflowTypes"; import {
WorkflowEditorParameterType,
WorkflowParameterValueType,
} from "../../types/workflowTypes";
import { import {
Select, Select,
SelectContent, SelectContent,
@@ -21,7 +24,7 @@ import { SourceParameterKeySelector } from "../../components/SourceParameterKeyS
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area"; import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
type Props = { type Props = {
type: "workflow" | "credential" | "context" | "secret"; type: WorkflowEditorParameterType;
onClose: () => void; onClose: () => void;
onSave: (value: ParametersState[number]) => void; onSave: (value: ParametersState[number]) => void;
}; };
@@ -35,7 +38,7 @@ const workflowParameterTypeOptions = [
{ label: "JSON", value: WorkflowParameterValueType.JSON }, { label: "JSON", value: WorkflowParameterValueType.JSON },
]; ];
function header(type: "workflow" | "credential" | "context" | "secret") { function header(type: WorkflowEditorParameterType) {
if (type === "workflow") { if (type === "workflow") {
return "Add Input Parameter"; return "Add Input Parameter";
} }
@@ -45,6 +48,9 @@ function header(type: "workflow" | "credential" | "context" | "secret") {
if (type === "secret") { if (type === "secret") {
return "Add Secret Parameter"; return "Add Secret Parameter";
} }
if (type === "creditCardData") {
return "Add Credit Card Data Parameter";
}
return "Add Context Parameter"; return "Add Context Parameter";
} }
@@ -68,6 +74,7 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
const [identityKey, setIdentityKey] = useState(""); const [identityKey, setIdentityKey] = useState("");
const [identityFields, setIdentityFields] = useState(""); const [identityFields, setIdentityFields] = useState("");
const [itemId, setItemId] = useState("");
return ( return (
<ScrollArea> <ScrollArea>
@@ -230,6 +237,24 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
</div> </div>
</> </>
)} )}
{type === "creditCardData" && (
<>
<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>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Collection ID</Label>
<Input
value={collectionId}
onChange={(e) => setCollectionId(e.target.value)}
/>
</div>
</>
)}
<div className="flex justify-end"> <div className="flex justify-end">
<Button <Button
onClick={() => { onClick={() => {
@@ -264,15 +289,21 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
: null, : null,
}); });
} }
if (type === "credential") { if (
type === "credential" ||
type === "secret" ||
type === "creditCardData"
) {
if (!collectionId) { if (!collectionId) {
toast({ toast({
variant: "destructive", variant: "destructive",
title: "Failed to add parameter", title: "Failed to save parameter",
description: "Collection ID is required", description: "Collection ID is required",
}); });
return; return;
} }
}
if (type === "credential") {
onSave({ onSave({
key, key,
parameterType: "credential", parameterType: "credential",
@@ -282,14 +313,6 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
}); });
} }
if (type === "secret") { if (type === "secret") {
if (!collectionId) {
toast({
variant: "destructive",
title: "Failed to add parameter",
description: "Collection ID is required",
});
return;
}
onSave({ onSave({
key, key,
parameterType: "secret", parameterType: "secret",
@@ -302,6 +325,15 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
description, description,
}); });
} }
if (type === "creditCardData") {
onSave({
key,
parameterType: "creditCardData",
collectionId,
itemId,
description,
});
}
if (type === "context") { if (type === "context") {
if (!sourceParameterKey) { if (!sourceParameterKey) {
toast({ toast({

View File

@@ -2,7 +2,10 @@ import { Cross2Icon } from "@radix-ui/react-icons";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { useState } from "react"; import { useState } from "react";
import { WorkflowParameterValueType } from "../../types/workflowTypes"; import {
WorkflowEditorParameterType,
WorkflowParameterValueType,
} from "../../types/workflowTypes";
import { import {
Select, Select,
SelectContent, SelectContent,
@@ -21,7 +24,7 @@ import { SourceParameterKeySelector } from "../../components/SourceParameterKeyS
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area"; import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
type Props = { type Props = {
type: "workflow" | "credential" | "context" | "secret"; type: WorkflowEditorParameterType;
onClose: () => void; onClose: () => void;
onSave: (value: ParametersState[number]) => void; onSave: (value: ParametersState[number]) => void;
initialValues: ParametersState[number]; initialValues: ParametersState[number];
@@ -36,7 +39,7 @@ const workflowParameterTypeOptions = [
{ label: "JSON", value: WorkflowParameterValueType.JSON }, { label: "JSON", value: WorkflowParameterValueType.JSON },
]; ];
function header(type: "workflow" | "credential" | "context" | "secret") { function header(type: WorkflowEditorParameterType) {
if (type === "workflow") { if (type === "workflow") {
return "Edit Input Parameter"; return "Edit Input Parameter";
} }
@@ -46,6 +49,9 @@ function header(type: "workflow" | "credential" | "context" | "secret") {
if (type === "secret") { if (type === "secret") {
return "Edit Secret Parameter"; return "Edit Secret Parameter";
} }
if (type === "creditCardData") {
return "Edit Credit Card Data Parameter";
}
return "Edit Context Parameter"; return "Edit Context Parameter";
} }
@@ -66,7 +72,8 @@ function WorkflowParameterEditPanel({
); );
const [collectionId, setCollectionId] = useState( const [collectionId, setCollectionId] = useState(
initialValues.parameterType === "credential" || initialValues.parameterType === "credential" ||
initialValues.parameterType === "secret" initialValues.parameterType === "secret" ||
initialValues.parameterType === "creditCardData"
? initialValues.collectionId ? initialValues.collectionId
: "", : "",
); );
@@ -110,6 +117,12 @@ function WorkflowParameterEditPanel({
: "", : "",
); );
const [itemId, setItemId] = useState(
initialValues.parameterType === "creditCardData"
? initialValues.itemId
: "",
);
return ( return (
<ScrollArea> <ScrollArea>
<ScrollAreaViewport className="max-h-[500px]"> <ScrollAreaViewport className="max-h-[500px]">
@@ -271,6 +284,24 @@ function WorkflowParameterEditPanel({
</div> </div>
</> </>
)} )}
{type === "creditCardData" && (
<>
<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>
<div className="space-y-1">
<Label className="text-xs text-slate-300">Collection ID</Label>
<Input
value={collectionId}
onChange={(e) => setCollectionId(e.target.value)}
/>
</div>
</>
)}
<div className="flex justify-end"> <div className="flex justify-end">
<Button <Button
onClick={() => { onClick={() => {
@@ -305,7 +336,11 @@ function WorkflowParameterEditPanel({
: null, : null,
}); });
} }
if (type === "credential") { if (
type === "credential" ||
type === "secret" ||
type === "creditCardData"
) {
if (!collectionId) { if (!collectionId) {
toast({ toast({
variant: "destructive", variant: "destructive",
@@ -314,6 +349,8 @@ function WorkflowParameterEditPanel({
}); });
return; return;
} }
}
if (type === "credential") {
onSave({ onSave({
key, key,
parameterType: "credential", parameterType: "credential",
@@ -323,14 +360,6 @@ function WorkflowParameterEditPanel({
}); });
} }
if (type === "secret") { if (type === "secret") {
if (!collectionId) {
toast({
variant: "destructive",
title: "Failed to add parameter",
description: "Collection ID is required",
});
return;
}
onSave({ onSave({
key, key,
parameterType: "secret", parameterType: "secret",
@@ -343,6 +372,15 @@ function WorkflowParameterEditPanel({
description, description,
}); });
} }
if (type === "creditCardData") {
onSave({
key,
parameterType: "creditCardData",
collectionId,
itemId,
description,
});
}
if (type === "context") { if (type === "context") {
if (!sourceParameterKey) { if (!sourceParameterKey) {
toast({ toast({

View File

@@ -27,6 +27,10 @@ import {
import { useReactFlow } from "@xyflow/react"; import { useReactFlow } from "@xyflow/react";
import { useWorkflowHasChangesStore } from "@/store/WorkflowHasChangesStore"; import { useWorkflowHasChangesStore } from "@/store/WorkflowHasChangesStore";
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area"; import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
import {
WorkflowEditorParameterType,
WorkflowEditorParameterTypes,
} from "../../types/workflowTypes";
const WORKFLOW_EDIT_PANEL_WIDTH = 20 * 16; const WORKFLOW_EDIT_PANEL_WIDTH = 20 * 16;
const WORKFLOW_EDIT_PANEL_GAP = 1 * 16; const WORKFLOW_EDIT_PANEL_GAP = 1 * 16;
@@ -41,7 +45,7 @@ function WorkflowParametersPanel() {
active: boolean; active: boolean;
operation: "add" | "edit"; operation: "add" | "edit";
parameter?: ParametersState[number] | null; parameter?: ParametersState[number] | null;
type: "workflow" | "credential" | "context" | "secret"; type: WorkflowEditorParameterType;
}>({ }>({
active: false, active: false,
operation: "add", operation: "add",
@@ -114,6 +118,17 @@ function WorkflowParametersPanel() {
> >
Secret Parameter Secret Parameter
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem
onClick={() => {
setOperationPanelState({
active: true,
operation: "add",
type: WorkflowEditorParameterTypes.CreditCardData,
});
}}
>
Credit Card Data Parameter
</DropdownMenuItem>
</DropdownMenuContent> </DropdownMenuContent>
</DropdownMenu> </DropdownMenu>

View File

@@ -2,14 +2,16 @@ import Dagre from "@dagrejs/dagre";
import type { Node } from "@xyflow/react"; import type { Node } from "@xyflow/react";
import { Edge } from "@xyflow/react"; import { Edge } from "@xyflow/react";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import type { import {
AWSSecretParameter, WorkflowBlockTypes,
OutputParameter, WorkflowParameterTypes,
Parameter, type AWSSecretParameter,
WorkflowApiResponse, type OutputParameter,
WorkflowBlock, type Parameter,
WorkflowParameterValueType, type WorkflowApiResponse,
WorkflowSettings, type WorkflowBlock,
type WorkflowParameterValueType,
type WorkflowSettings,
} from "../types/workflowTypes"; } from "../types/workflowTypes";
import { import {
ActionBlockYAML, ActionBlockYAML,
@@ -1241,22 +1243,22 @@ const sendEmailExpectedParameters = [
{ {
key: SMTP_HOST_PARAMETER_KEY, key: SMTP_HOST_PARAMETER_KEY,
aws_key: SMTP_HOST_AWS_KEY, aws_key: SMTP_HOST_AWS_KEY,
parameter_type: "aws_secret", parameter_type: WorkflowParameterTypes.AWS_Secret,
}, },
{ {
key: SMTP_PORT_PARAMETER_KEY, key: SMTP_PORT_PARAMETER_KEY,
aws_key: SMTP_PORT_AWS_KEY, aws_key: SMTP_PORT_AWS_KEY,
parameter_type: "aws_secret", parameter_type: WorkflowParameterTypes.AWS_Secret,
}, },
{ {
key: SMTP_USERNAME_PARAMETER_KEY, key: SMTP_USERNAME_PARAMETER_KEY,
aws_key: SMTP_USERNAME_AWS_KEY, aws_key: SMTP_USERNAME_AWS_KEY,
parameter_type: "aws_secret", parameter_type: WorkflowParameterTypes.AWS_Secret,
}, },
{ {
key: SMTP_PASSWORD_PARAMETER_KEY, key: SMTP_PASSWORD_PARAMETER_KEY,
aws_key: SMTP_PASSWORD_AWS_KEY, aws_key: SMTP_PASSWORD_AWS_KEY,
parameter_type: "aws_secret", parameter_type: WorkflowParameterTypes.AWS_Secret,
}, },
] as const; ] as const;
@@ -1265,7 +1267,7 @@ function getAdditionalParametersForEmailBlock(
parameters: Array<ParameterYAML>, parameters: Array<ParameterYAML>,
): Array<ParameterYAML> { ): Array<ParameterYAML> {
const emailBlocks = blocks.filter( const emailBlocks = blocks.filter(
(block) => block.block_type === "send_email", (block) => block.block_type === WorkflowBlockTypes.SendEmail,
); );
if (emailBlocks.length === 0) { if (emailBlocks.length === 0) {
return []; return [];
@@ -1371,32 +1373,35 @@ function convertParametersToParameterYAML(
const base = { const base = {
key: parameter.key, key: parameter.key,
description: parameter.description, description: parameter.description,
parameter_type: parameter.parameter_type,
}; };
switch (parameter.parameter_type) { switch (parameter.parameter_type) {
case "aws_secret": { case WorkflowParameterTypes.AWS_Secret: {
return { return {
...base, ...base,
parameter_type: "aws_secret", parameter_type: WorkflowParameterTypes.AWS_Secret,
aws_key: parameter.aws_key, aws_key: parameter.aws_key,
}; };
} }
case "bitwarden_login_credential": { case WorkflowParameterTypes.Bitwarden_Login_Credential: {
return { return {
...base, ...base,
parameter_type: "bitwarden_login_credential", parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
bitwarden_collection_id: parameter.bitwarden_collection_id, bitwarden_collection_id: parameter.bitwarden_collection_id,
url_parameter_key: parameter.url_parameter_key, url_parameter_key: parameter.url_parameter_key,
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID", bitwarden_client_id_aws_secret_key:
parameter.bitwarden_client_id_aws_secret_key,
bitwarden_client_secret_aws_secret_key: bitwarden_client_secret_aws_secret_key:
"SKYVERN_BITWARDEN_CLIENT_SECRET", parameter.bitwarden_client_secret_aws_secret_key,
bitwarden_master_password_aws_secret_key: bitwarden_master_password_aws_secret_key:
"SKYVERN_BITWARDEN_MASTER_PASSWORD", parameter.bitwarden_master_password_aws_secret_key,
}; };
} }
case "bitwarden_sensitive_information": { case WorkflowParameterTypes.Bitwarden_Sensitive_Information: {
return { return {
...base, ...base,
parameter_type: "bitwarden_sensitive_information", parameter_type:
WorkflowParameterTypes.Bitwarden_Sensitive_Information,
bitwarden_collection_id: parameter.bitwarden_collection_id, bitwarden_collection_id: parameter.bitwarden_collection_id,
bitwarden_identity_key: parameter.bitwarden_identity_key, bitwarden_identity_key: parameter.bitwarden_identity_key,
bitwarden_identity_fields: parameter.bitwarden_identity_fields, bitwarden_identity_fields: parameter.bitwarden_identity_fields,
@@ -1408,17 +1413,31 @@ function convertParametersToParameterYAML(
parameter.bitwarden_master_password_aws_secret_key, parameter.bitwarden_master_password_aws_secret_key,
}; };
} }
case "context": { case WorkflowParameterTypes.Bitwarden_Credit_Card_Data: {
return { return {
...base, ...base,
parameter_type: "context", 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, source_parameter_key: parameter.source.key,
}; };
} }
case "workflow": { case WorkflowParameterTypes.Workflow: {
return { return {
...base, ...base,
parameter_type: "workflow", parameter_type: WorkflowParameterTypes.Workflow,
workflow_parameter_type: parameter.workflow_parameter_type, workflow_parameter_type: parameter.workflow_parameter_type,
default_value: parameter.default_value, default_value: parameter.default_value,
}; };
@@ -1645,7 +1664,7 @@ function convertBlocksToBlockYAML(
function convert(workflow: WorkflowApiResponse): WorkflowCreateYAMLRequest { function convert(workflow: WorkflowApiResponse): WorkflowCreateYAMLRequest {
const userParameters = workflow.workflow_definition.parameters.filter( const userParameters = workflow.workflow_definition.parameters.filter(
(parameter) => parameter.parameter_type !== "output", (parameter) => parameter.parameter_type !== WorkflowParameterTypes.Output,
); );
return { return {
title: workflow.title, title: workflow.title,

View File

@@ -45,6 +45,20 @@ export type BitwardenSensitiveInformationParameter = WorkflowParameterBase & {
deleted_at: string | null; deleted_at: string | null;
}; };
export type BitwardenCreditCardDataParameter = WorkflowParameterBase & {
parameter_type: "bitwarden_credit_card_data";
workflow_id: string;
bitwarden_credit_card_data_parameter_id: string;
bitwarden_client_id_aws_secret_key: string;
bitwarden_client_secret_aws_secret_key: string;
bitwarden_master_password_aws_secret_key: string;
bitwarden_collection_id: string;
bitwarden_item_id: string;
created_at: string;
modified_at: string;
deleted_at: string | null;
};
export type WorkflowParameter = WorkflowParameterBase & { export type WorkflowParameter = WorkflowParameterBase & {
parameter_type: "workflow"; parameter_type: "workflow";
workflow_id: string; workflow_id: string;
@@ -83,17 +97,38 @@ export const WorkflowParameterValueType = {
export type WorkflowParameterValueType = export type WorkflowParameterValueType =
(typeof WorkflowParameterValueType)[keyof typeof WorkflowParameterValueType]; (typeof WorkflowParameterValueType)[keyof typeof WorkflowParameterValueType];
export const WorkflowParameterType = { export const WorkflowParameterTypes = {
Workflow: "workflow", Workflow: "workflow",
Context: "context", Context: "context",
Output: "output", Output: "output",
AWS_Secret: "aws_secret", AWS_Secret: "aws_secret",
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",
} as const; } as const;
export type WorkflowParameterType = export type WorkflowParameterType =
(typeof WorkflowParameterType)[keyof typeof WorkflowParameterType]; (typeof WorkflowParameterTypes)[keyof typeof WorkflowParameterTypes];
export function isDisplayedInWorkflowEditor(
parameter: Parameter,
): parameter is
| WorkflowParameter
| ContextParameter
| BitwardenCreditCardDataParameter
| BitwardenLoginCredentialParameter
| BitwardenSensitiveInformationParameter {
return (
parameter.parameter_type === WorkflowParameterTypes.Workflow ||
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Login_Credential ||
parameter.parameter_type === WorkflowParameterTypes.Context ||
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Sensitive_Information ||
parameter.parameter_type ===
WorkflowParameterTypes.Bitwarden_Credit_Card_Data
);
}
export type Parameter = export type Parameter =
| WorkflowParameter | WorkflowParameter
@@ -101,6 +136,7 @@ export type Parameter =
| ContextParameter | ContextParameter
| BitwardenLoginCredentialParameter | BitwardenLoginCredentialParameter
| BitwardenSensitiveInformationParameter | BitwardenSensitiveInformationParameter
| BitwardenCreditCardDataParameter
| AWSSecretParameter; | AWSSecretParameter;
export type WorkflowBlock = export type WorkflowBlock =
@@ -155,6 +191,17 @@ export function isTaskVariantBlock(item: {
export type WorkflowBlockType = export type WorkflowBlockType =
(typeof WorkflowBlockTypes)[keyof typeof WorkflowBlockTypes]; (typeof WorkflowBlockTypes)[keyof typeof WorkflowBlockTypes];
export const WorkflowEditorParameterTypes = {
Workflow: "workflow",
Credential: "credential",
Secret: "secret",
Context: "context",
CreditCardData: "creditCardData",
} as const;
export type WorkflowEditorParameterType =
(typeof WorkflowEditorParameterTypes)[keyof typeof WorkflowEditorParameterTypes];
export type WorkflowBlockBase = { export type WorkflowBlockBase = {
label: string; label: string;
block_type: WorkflowBlockType; block_type: WorkflowBlockType;

View File

@@ -22,7 +22,8 @@ export type ParameterYAML =
| AWSSecretParameterYAML | AWSSecretParameterYAML
| ContextParameterYAML | ContextParameterYAML
| OutputParameterYAML | OutputParameterYAML
| BitwardenSensitiveInformationParameterYAML; | BitwardenSensitiveInformationParameterYAML
| BitwardenCreditCardDataParameterYAML;
export type ParameterYAMLBase = { export type ParameterYAMLBase = {
parameter_type: string; parameter_type: string;
@@ -40,9 +41,9 @@ export type BitwardenLoginCredentialParameterYAML = ParameterYAMLBase & {
parameter_type: "bitwarden_login_credential"; parameter_type: "bitwarden_login_credential";
bitwarden_collection_id: string; bitwarden_collection_id: string;
url_parameter_key: string; url_parameter_key: string;
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID"; bitwarden_client_id_aws_secret_key: string;
bitwarden_client_secret_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_SECRET"; bitwarden_client_secret_aws_secret_key: string;
bitwarden_master_password_aws_secret_key: "SKYVERN_BITWARDEN_MASTER_PASSWORD"; bitwarden_master_password_aws_secret_key: string;
}; };
export type AWSSecretParameterYAML = ParameterYAMLBase & { export type AWSSecretParameterYAML = ParameterYAMLBase & {
@@ -60,6 +61,18 @@ export type BitwardenSensitiveInformationParameterYAML = ParameterYAMLBase & {
bitwarden_master_password_aws_secret_key: string; bitwarden_master_password_aws_secret_key: string;
}; };
export type BitwardenCreditCardDataParameterYAML = ParameterYAMLBase & {
parameter_type: "bitwarden_credit_card_data";
// bitwarden ids for the credit card item
bitwarden_collection_id: string;
bitwarden_item_id: string;
bitwarden_client_id_aws_secret_key: string;
bitwarden_client_secret_aws_secret_key: string;
bitwarden_master_password_aws_secret_key: string;
};
export type ContextParameterYAML = ParameterYAMLBase & { export type ContextParameterYAML = ParameterYAMLBase & {
parameter_type: "context"; parameter_type: "context";
source_parameter_key: string; source_parameter_key: string;