[
  {
    "name": "convertLead",
    "label": "Convert Lead",
    "description": "Salesforce-compatible Lead Convert. Routes through the Std_ConvertLead flow so tenants customise behavior (defaults, guards, child relink) as data without backend changes.",
    "flowDeveloperName": "Std_ConvertLead",
    "previewFlowDeveloperName": "Std_ConvertLeadCampaignPreview",
    "visibilityCondition": "record.IsConverted != true",
    "category": "LeadActions",
    "rendererId": "app-pack:crm/action-renderer/lead-convert",
    "config": {
      "leadConvertPreview": {
        "campaignAttribution": {
          "enabled": true,
          "source": "CampaignMember",
          "summaryFields": [
            "CampaignId",
            "Campaign.Name",
            "Status",
            "HasResponded"
          ]
        }
      },
      "leadConvertMatch": {
        "contactByAccountAndEmail": {
          "enabled": true,
          "accountInput": "accountId",
          "emailField": "Email",
          "targetInput": "contactId",
          "switchModeTo": "reuse"
        }
      }
    },
    "requiredPermissions": [
      "ConvertLeads"
    ],
    "targetObjects": [
      "Lead"
    ],
    "isAtomic": true,
    "sortOrder": 0,
    "inputs": [
      {
        "apiName": "leadId",
        "dataType": "id",
        "isRequired": true,
        "uiSection": "Lead",
        "uiMode": "hidden",
        "targetObject": "Lead",
        "targetFieldAPIName": "Id",
        "sortOrder": 0
      },
      {
        "apiName": "convertedStatus",
        "dataType": "picklist",
        "isRequired": true,
        "uiSection": "Lead",
        "uiMode": "hidden",
        "targetObject": "Lead",
        "targetFieldAPIName": "Status",
        "requiredPicklistTag": "converted",
        "sortOrder": 1
      },
      {
        "apiName": "accountId",
        "dataType": "reference",
        "referenceTo": "Account",
        "label": "Account",
        "uiSection": "Account",
        "uiMode": "reuse",
        "targetObject": "Account",
        "sortOrder": 2
      },
      {
        "apiName": "contactFirstName",
        "dataType": "string",
        "uiSection": "Contact",
        "uiMode": "create",
        "targetObject": "Contact",
        "targetFieldAPIName": "FirstName",
        "prefillSourceFieldAPIName": "FirstName",
        "mappingSourceObject": "Lead",
        "mappingActionType": "convert",
        "sortOrder": 3
      },
      {
        "apiName": "contactLastName",
        "dataType": "string",
        "uiSection": "Contact",
        "uiMode": "create",
        "targetObject": "Contact",
        "targetFieldAPIName": "LastName",
        "prefillSourceFieldAPIName": "LastName",
        "mappingSourceObject": "Lead",
        "mappingActionType": "convert",
        "sortOrder": 4
      },
      {
        "apiName": "contactTitle",
        "dataType": "string",
        "uiSection": "Contact",
        "uiMode": "create",
        "targetObject": "Contact",
        "targetFieldAPIName": "Title",
        "prefillSourceFieldAPIName": "Title",
        "mappingSourceObject": "Lead",
        "mappingActionType": "convert",
        "sortOrder": 5
      },
      {
        "apiName": "contactEmail",
        "dataType": "string",
        "uiSection": "Contact",
        "uiMode": "create",
        "targetObject": "Contact",
        "targetFieldAPIName": "Email",
        "prefillSourceFieldAPIName": "Email",
        "mappingSourceObject": "Lead",
        "mappingActionType": "convert",
        "sortOrder": 6
      },
      {
        "apiName": "contactId",
        "dataType": "reference",
        "referenceTo": "Contact",
        "label": "Contact",
        "uiSection": "Contact",
        "uiMode": "reuse",
        "targetObject": "Contact",
        "sortOrder": 7
      },
      {
        "apiName": "opportunityName",
        "dataType": "string",
        "uiSection": "Opportunity",
        "uiMode": "create",
        "targetObject": "Opportunity",
        "targetFieldAPIName": "Name",
        "prefillSourceFieldAPIName": "Company",
        "mappingSourceObject": "Lead",
        "mappingActionType": "convert",
        "sortOrder": 8
      },
      {
        "apiName": "opportunityId",
        "dataType": "reference",
        "referenceTo": "Opportunity",
        "label": "Opportunity",
        "uiSection": "Opportunity",
        "uiMode": "reuse",
        "targetObject": "Opportunity",
        "sortOrder": 9
      },
      {
        "apiName": "doNotCreateOpportunity",
        "dataType": "boolean",
        "label": "Do Not Create Opportunity",
        "uiSection": "Opportunity",
        "uiMode": "skip",
        "targetObject": "Opportunity",
        "sortOrder": 10
      },
      {
        "apiName": "ownerId",
        "dataType": "reference",
        "referenceTo": "User",
        "label": "Owner",
        "uiSection": "Owner",
        "uiMode": "reuse",
        "targetObject": "User",
        "sortOrder": 11
      },
      {
        "apiName": "overwriteLeadSource",
        "dataType": "boolean",
        "label": "Overwrite Lead Source",
        "uiSection": "Contact",
        "uiMode": "reuse",
        "targetObject": "Contact",
        "sortOrder": 12
      }
    ],
    "outputs": [
      {
        "apiName": "leadId",
        "dataType": "id",
        "sortOrder": 0
      },
      {
        "apiName": "opportunityId",
        "dataType": "reference",
        "referenceTo": "Opportunity",
        "sortOrder": 1
      },
      {
        "apiName": "accountId",
        "dataType": "reference",
        "referenceTo": "Account",
        "sortOrder": 2
      },
      {
        "apiName": "contactId",
        "dataType": "reference",
        "referenceTo": "Contact",
        "sortOrder": 3
      }
    ],
    "fieldDefaults": [
      {
        "targetObject": "Opportunity",
        "fieldAPIName": "CloseDate",
        "valueFormula": "TODAY() + 30",
        "priority": 0
      }
    ],
    "inputGuards": [
      {
        "condition": "true",
        "requiredObject": "Lead",
        "requiredOperation": "Edit",
        "errorMessage": "permission denied: Lead.Edit is required during lead convert",
        "sortOrder": 0
      },
      {
        "condition": "ISBLANK(Input.accountId)",
        "requiredObject": "Account",
        "requiredOperation": "Create",
        "errorMessage": "permission denied: Account.Create is required to create an Account during lead convert",
        "gatedInput": "accountId",
        "sortOrder": 10
      },
      {
        "condition": "NOT(ISBLANK(Input.accountId))",
        "requiredObject": "Account",
        "requiredOperation": "Edit",
        "errorMessage": "permission denied: Account.Edit is required to reuse an Account during lead convert",
        "gatedInput": "accountId",
        "sortOrder": 20
      },
      {
        "condition": "ISBLANK(Input.contactId)",
        "requiredObject": "Contact",
        "requiredOperation": "Create",
        "errorMessage": "permission denied: Contact.Create is required to create a Contact during lead convert",
        "gatedInput": "contactId",
        "sortOrder": 30
      },
      {
        "condition": "NOT(ISBLANK(Input.contactId))",
        "requiredObject": "Contact",
        "requiredOperation": "Edit",
        "errorMessage": "permission denied: Contact.Edit is required to reuse a Contact during lead convert",
        "gatedInput": "contactId",
        "sortOrder": 40
      },
      {
        "condition": "AND(Input.doNotCreateOpportunity != true, ISBLANK(Input.opportunityId))",
        "requiredObject": "Opportunity",
        "requiredOperation": "Create",
        "errorMessage": "permission denied: Opportunity.Create is required to create an Opportunity during lead convert",
        "gatedInput": "opportunityName",
        "sortOrder": 50
      },
      {
        "condition": "AND(Input.doNotCreateOpportunity != true, NOT(ISBLANK(Input.opportunityId)))",
        "requiredObject": "Opportunity",
        "requiredOperation": "Edit",
        "errorMessage": "permission denied: Opportunity.Edit is required to reuse an Opportunity during lead convert",
        "gatedInput": "opportunityId",
        "sortOrder": 60
      },
      {
        "condition": "Input.doNotCreateOpportunity == true",
        "requiredPermission": "SkipOpportunityOnConvert",
        "errorMessage": "permission denied: you do not have permission to skip opportunity creation during lead convert",
        "gatedInput": "doNotCreateOpportunity",
        "sortOrder": 70
      }
    ],
    "internalAccessScopes": [
      {
        "objectApiName": "FlowDefinition",
        "operation": "Read",
        "reason": "Lead Convert owns resolution of its pack-owned standard FlowDefinition after the caller has passed the ConvertLeads action gate."
      },
      {
        "objectApiName": "Flow",
        "operation": "Read",
        "reason": "Lead Convert owns resolution of its pack-owned active Flow version after the caller has passed the ConvertLeads action gate."
      },
      {
        "objectApiName": "OpportunityContactRole",
        "operation": "Read",
        "reason": "Lead Convert owns lookup of existing opportunity contact roles before promoting or creating the primary role."
      },
      {
        "objectApiName": "OpportunityContactRole",
        "operation": "Create",
        "reason": "Lead Convert owns creation of the primary opportunity contact role after conversion."
      },
      {
        "objectApiName": "OpportunityContactRole",
        "operation": "Edit",
        "reason": "Lead Convert owns demotion and promotion of primary opportunity contact roles after conversion."
      },
      {
        "objectApiName": "CampaignMember",
        "operation": "Read",
        "reason": "Lead Convert owns lookup of campaign memberships for primary campaign attribution and child relink after conversion."
      },
      {
        "objectApiName": "Campaign",
        "operation": "Read",
        "reason": "Lead Convert owns the Campaign.Name relationship read used by the campaign attribution preview after the caller has passed the ConvertLeads action gate."
      },
      {
        "objectApiName": "CampaignMember",
        "operation": "Edit",
        "reason": "Lead Convert owns reparenting campaign memberships from Lead to Contact after conversion."
      },
      {
        "objectApiName": "Task",
        "operation": "Read",
        "reason": "Lead Convert owns lookup of open tasks for child relink after conversion."
      },
      {
        "objectApiName": "Task",
        "operation": "Edit",
        "reason": "Lead Convert owns reparenting open tasks from Lead to converted Contact and Account or Opportunity."
      }
    ]
  },
  {
    "name": "createQuote",
    "label": "Create Quote",
    "description": "Salesforce-compatible Create Quote from Opportunity. Routes through the Std_CreateQuoteFromOpportunity flow so the parent Quote and copied QuoteLineItems are created atomically from metadata.",
    "flowDeveloperName": "Std_CreateQuoteFromOpportunity",
    "createPreviewSupported": true,
    "category": "OpportunityActions",
    "rendererId": "app-pack:crm/action-renderer/create-record-from-source",
    "requiredPermissions": ["ApiEnabled"],
    "targetObjects": ["Opportunity"],
    "isAtomic": true,
    "sortOrder": 10,
    "inputs": [
      { "apiName": "opportunityId", "dataType": "id", "isRequired": true, "uiSection": "Opportunity", "uiMode": "hidden", "targetObject": "Opportunity", "targetFieldAPIName": "Id", "sortOrder": 0 }
    ],
    "outputs": [
      { "apiName": "quoteId", "dataType": "reference", "referenceTo": "Quote", "sortOrder": 0 }
    ],
    "inputGuards": [
      {
        "condition": "true",
        "requiredObject": "Opportunity",
        "requiredOperation": "Read",
        "errorMessage": "permission denied: Opportunity.Read is required during Create Quote",
        "sortOrder": 0
      },
      {
        "condition": "true",
        "requiredObject": "Quote",
        "requiredOperation": "Create",
        "errorMessage": "permission denied: Quote.Create is required during Create Quote",
        "sortOrder": 10
      },
      {
        "condition": "true",
        "requiredObject": "OpportunityLineItem",
        "requiredOperation": "Read",
        "errorMessage": "permission denied: OpportunityLineItem.Read is required during Create Quote",
        "sortOrder": 20
      },
      {
        "condition": "true",
        "requiredObject": "QuoteLineItem",
        "requiredOperation": "Create",
        "errorMessage": "permission denied: QuoteLineItem.Create is required during Create Quote",
        "sortOrder": 30
      }
    ],
    "internalAccessScopes": [
      {
        "objectApiName": "_System_Object",
        "operation": "Read",
        "reason": "Create Quote resolves the Quote metadata row before selecting the target Quote RecordType."
      },
      {
        "objectApiName": "_System_RecordType",
        "operation": "Read",
        "reason": "Create Quote owns source-to-target and default RecordType resolution for the Quote created from an Opportunity."
      }
    ]
  },
  {
    "name": "createOrder",
    "label": "Create Order",
    "description": "Salesforce-compatible Create Order from Quote. Routes through the Std_CreateOrderFromQuote flow so the Order is created atomically from an accepted Quote and its Account relationship.",
    "flowDeveloperName": "Std_CreateOrderFromQuote",
    "createPreviewSupported": true,
    "category": "QuoteActions",
    "rendererId": "app-pack:crm/action-renderer/create-record-from-source",
    "requiredPermissions": ["ApiEnabled"],
    "targetObjects": ["Quote"],
    "visibilityCondition": "record.Status == 'Accepted' && record.AccountId != null",
    "isAtomic": true,
    "sortOrder": 20,
    "inputs": [
      { "apiName": "quoteId", "dataType": "id", "isRequired": true, "uiSection": "Quote", "uiMode": "hidden", "targetObject": "Quote", "targetFieldAPIName": "Id", "sortOrder": 0 }
    ],
    "outputs": [
      { "apiName": "orderId", "dataType": "reference", "referenceTo": "Order", "sortOrder": 0 }
    ],
    "inputGuards": [
      {
        "condition": "true",
        "requiredObject": "Quote",
        "requiredOperation": "Read",
        "errorMessage": "permission denied: Quote.Read is required during Create Order",
        "sortOrder": 0
      },
      {
        "condition": "true",
        "requiredObject": "Account",
        "requiredOperation": "Read",
        "errorMessage": "permission denied: Account.Read is required during Create Order",
        "sortOrder": 10
      },
    {
      "condition": "true",
      "requiredObject": "Order",
      "requiredOperation": "Create",
      "errorMessage": "permission denied: Order.Create is required during Create Order",
      "sortOrder": 20
    },
    {
      "condition": "true",
      "requiredObject": "QuoteLineItem",
      "requiredOperation": "Read",
      "errorMessage": "permission denied: QuoteLineItem.Read is required during Create Order",
      "sortOrder": 30
    },
    {
      "condition": "true",
      "requiredObject": "OrderItem",
      "requiredOperation": "Create",
      "errorMessage": "permission denied: OrderItem.Create is required during Create Order",
      "sortOrder": 40
    }
  ],
    "internalAccessScopes": [
      {
        "objectApiName": "_System_Object",
        "operation": "Read",
        "reason": "Create Order resolves the Order metadata row before selecting the target Order RecordType."
      },
      {
        "objectApiName": "_System_RecordType",
        "operation": "Read",
        "reason": "Create Order owns source Quote RecordType to target Order RecordType resolution."
      }
    ]
  },
  {
    "name": "sendRecordEmail",
    "label": "Email",
    "description": "Queue one provider-neutral email for the current user's connected mailbox and log CRM activity only after proven delivery.",
    "flowDeveloperName": "Std_SendRecordEmail",
    "category": "ActivityTimeline",
    "rendererId": "app-pack:crm/action-renderer/email-compose",
    "config": {
      "outboundMail": {
        "connectorOwnerKey": "salesforce-crm-standard",
        "flowActionName": "EnqueueMail",
        "actionSlotId": "send-mail",
        "destinationSlotId": "primary-mailbox",
        "calloutProfileOwnerPack": "gmail-connected-mail-connector",
        "calloutProfileBusinessKey": "gmail-connected-mail-connector/gmail-delivery",
        "mailCompletion": {
          "recipientAddressField": "Email",
          "recipientOptOutField": "HasOptedOutOfEmail",
          "activity": {
            "objectApiName": "Task",
            "sourceRecordField": "WhoId",
            "subjectField": "Subject",
            "activityDateField": "ActivityDate",
            "statusField": "Status",
            "priorityField": "Priority",
            "bodyField": "Description",
            "ownerField": "OwnerId",
            "typeField": "Type",
            "subtypeField": "TaskSubtype",
            "fixedSubject": "Email",
            "fixedStatus": "Completed",
            "fixedPriority": "Normal",
            "fixedType": "Email",
            "fixedSubtype": "Email"
          },
          "message": {
            "objectApiName": "EmailMessage",
            "activityIdField": "ActivityId",
            "fromAddressField": "FromAddress",
            "toAddressField": "ToAddress",
            "ccAddressField": "CcAddress",
            "bccAddressField": "BccAddress",
            "subjectField": "Subject",
            "textBodyField": "TextBody",
            "htmlBodyField": "HtmlBody",
            "attachmentIdsField": "AttachmentIds",
            "incomingField": "Incoming",
            "statusField": "Status",
            "messageDateField": "MessageDate",
            "fixedIncoming": false,
            "fixedStatus": "3"
          }
        }
      }
    },
    "requiredPermissions": ["SendRecordEmail"],
    "targetObjects": ["Contact", "Lead"],
    "legacyNames": ["taskEmail"],
    "headerFallbackEligible": false,
    "isAtomic": true,
    "sortOrder": 30,
    "inputs": [
      { "apiName": "requestId", "dataType": "string", "isRequired": true, "uiMode": "hidden", "sortOrder": 0 },
      { "apiName": "recordId", "dataType": "id", "isRequired": true, "uiMode": "hidden", "sortOrder": 10 },
      { "apiName": "objectApiName", "dataType": "string", "isRequired": true, "uiMode": "hidden", "sortOrder": 20 },
      { "apiName": "subject", "dataType": "string", "isRequired": true, "label": "Subject", "sortOrder": 30 },
      { "apiName": "body", "dataType": "string", "isRequired": true, "label": "Plain Text Message", "sortOrder": 40 },
      { "apiName": "cc", "dataType": "string", "isRequired": false, "label": "Cc", "sortOrder": 50 },
      { "apiName": "bcc", "dataType": "string", "isRequired": false, "label": "Bcc", "sortOrder": 60 },
      { "apiName": "htmlBody", "dataType": "string", "isRequired": false, "label": "HTML Message", "sortOrder": 70 },
      { "apiName": "attachments", "dataType": "id", "isCollection": true, "isRequired": false, "label": "Attachments", "sortOrder": 80 }
    ],
    "outputs": [
      { "apiName": "intentId", "dataType": "string", "sortOrder": 0 },
      { "apiName": "deliveryState", "dataType": "string", "sortOrder": 10 },
      { "apiName": "failureCode", "dataType": "string", "sortOrder": 20 }
    ],
    "inputGuards": []
  }
]
