@daeda/mcp-pro 0.1.42 → 0.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2630 -171
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -863,6 +863,9 @@ var ACTION_TYPE_CATALOG_ROW_SCHEMA = z6.object({
863
863
  contextConstraintsJson: z6.string(),
864
864
  lookupRequirementsJson: z6.string(),
865
865
  resourceRequirementsJson: z6.string(),
866
+ corpusMetadataJson: z6.string(),
867
+ fieldFrequencyJson: z6.string(),
868
+ variantInventoryJson: z6.string(),
866
869
  createGuidanceText: z6.string()
867
870
  });
868
871
  var actionTypeCatalogPayloadSchema = z6.object({
@@ -881,12 +884,15 @@ var TABLE_STATEMENTS4 = [
881
884
  context_constraints_json TEXT NOT NULL,
882
885
  lookup_requirements_json TEXT NOT NULL,
883
886
  resource_requirements_json TEXT NOT NULL,
887
+ corpus_metadata_json TEXT NOT NULL,
888
+ field_frequency_json TEXT NOT NULL,
889
+ variant_inventory_json TEXT NOT NULL,
884
890
  create_guidance_text TEXT NOT NULL
885
891
  )`,
886
892
  `CREATE INDEX IF NOT EXISTS idx_action_type_catalog_category ON action_type_catalog(category)`
887
893
  ];
888
894
  var QUERY_DOCS5 = [
889
- '- The "action_type_catalog" table has: action_type_id, name, category, connection_type, example_actions_json, recommended_create_examples_json, field_schema_json, known_guardrails_json, context_constraints_json, lookup_requirements_json, resource_requirements_json, create_guidance_text',
895
+ '- The "action_type_catalog" table has: action_type_id, name, category, connection_type, example_actions_json, recommended_create_examples_json, field_schema_json, known_guardrails_json, context_constraints_json, lookup_requirements_json, resource_requirements_json, corpus_metadata_json, field_frequency_json, variant_inventory_json, create_guidance_text',
890
896
  "- Query action_type_catalog to discover supported workflow action types before constructing workflows",
891
897
  "- category is 'built_in' for the supported workflow action types surfaced to the LLM",
892
898
  "- field_schema_json documents required fields for supported actions; example_actions_json contains curated fixture-derived examples for reference",
@@ -895,11 +901,14 @@ var QUERY_DOCS5 = [
895
901
  "- lookup_requirements_json shows which local table/column to query before filling IDs like user_ids, flow_id, sequenceId, subscriptionId, inbox IDs, or association label IDs",
896
902
  "- Use recommended_create_examples_json as the preferred template source when constructing new workflow actions",
897
903
  "- Use resource_requirements_json to see whether an action needs IDs like listId, user_ids, flow_id, sequenceId, subscriptionId, inbox IDs, or association label IDs before creation",
904
+ "- corpus_metadata_json includes harvested example counts by action type across portals and workflows",
905
+ "- field_frequency_json summarizes whether each field was always observed, commonly optional, or a rare edge case in the harvested corpus",
906
+ "- variant_inventory_json lists the main structural variants observed for the action type in harvested workflows",
898
907
  "- create_guidance_text captures action-specific creation tips plus live update caveats such as when update_workflow must use fresh actionIds for replacement nodes"
899
908
  ];
900
909
  var actionTypeCatalogPlugin = {
901
910
  name: "action-type-catalog",
902
- schemaVersion: 2,
911
+ schemaVersion: 3,
903
912
  tableNames: ["action_type_catalog"],
904
913
  ddlStatements: TABLE_STATEMENTS4,
905
914
  initStrategy: "eager",
@@ -920,6 +929,9 @@ var actionTypeCatalogPlugin = {
920
929
  parsed.actionTypeCatalog.map((row) => row.contextConstraintsJson),
921
930
  parsed.actionTypeCatalog.map((row) => row.lookupRequirementsJson),
922
931
  parsed.actionTypeCatalog.map((row) => row.resourceRequirementsJson),
932
+ parsed.actionTypeCatalog.map((row) => row.corpusMetadataJson),
933
+ parsed.actionTypeCatalog.map((row) => row.fieldFrequencyJson),
934
+ parsed.actionTypeCatalog.map((row) => row.variantInventoryJson),
923
935
  parsed.actionTypeCatalog.map((row) => row.createGuidanceText)
924
936
  ]);
925
937
  },
@@ -9371,6 +9383,7 @@ var PipelineStageMetadataSchema = z33.object({
9371
9383
  var PipelineStageDefinitionSchema = z33.object({
9372
9384
  label: z33.string().min(1),
9373
9385
  display_order: z33.number().int(),
9386
+ ref: z33.string().min(1).optional(),
9374
9387
  metadata: PipelineStageMetadataSchema.optional()
9375
9388
  });
9376
9389
  var PipelineDefinitionSchema = z33.object({
@@ -9389,7 +9402,7 @@ var fields7 = [
9389
9402
  { name: "object_type", type: "string", required: true, description: "CRM object type (deals, tickets, or custom object ID)" },
9390
9403
  { name: "label", type: "string", required: true, description: "Pipeline name as displayed in HubSpot" },
9391
9404
  { name: "display_order", type: "number", required: true, description: "Pipeline display order among all pipelines" },
9392
- { name: "stages", type: "array", required: true, description: "Pipeline stages (at least one required)", itemShape: "{ label: string, display_order: number, metadata?: { probability?: string, ticketState?: string } }" }
9405
+ { name: "stages", type: "array", required: true, description: "Pipeline stages (at least one required)", itemShape: "{ label: string, display_order: number, ref?: string, metadata?: { probability?: string, ticketState?: string } }" }
9393
9406
  ];
9394
9407
  var createPipelineMeta = {
9395
9408
  type: "create_pipeline",
@@ -9405,9 +9418,9 @@ var createPipelineMeta = {
9405
9418
  label: "Enterprise Sales",
9406
9419
  display_order: 1,
9407
9420
  stages: [
9408
- { label: "Qualified", display_order: 0, metadata: { probability: "0.2" } },
9409
- { label: "Proposal Sent", display_order: 1, metadata: { probability: "0.5" } },
9410
- { label: "Closed Won", display_order: 2, metadata: { probability: "1.0" } }
9421
+ { label: "Qualified", display_order: 0, ref: "stage.enterprise_sales.qualified", metadata: { probability: "0.2" } },
9422
+ { label: "Proposal Sent", display_order: 1, ref: "stage.enterprise_sales.proposal_sent", metadata: { probability: "0.5" } },
9423
+ { label: "Closed Won", display_order: 2, ref: "stage.enterprise_sales.closed_won", metadata: { probability: "1.0" } }
9411
9424
  ]
9412
9425
  }
9413
9426
  },
@@ -11532,17 +11545,41 @@ import { z as z71 } from "zod";
11532
11545
  // ../shared/types/workflow-actions-types/index.ts
11533
11546
  import { z as z70 } from "zod";
11534
11547
  var NonEmptyStringSchema = z70.string().min(1);
11548
+ var BooleanStringSchema = z70.enum(["true", "false"]);
11549
+ var WorkflowEdgeTypeSchema = z70.enum(["STANDARD", "GOTO"]);
11550
+ var TimeUnitSchema = z70.enum(["MINUTES", "HOURS", "DAYS"]);
11551
+ var WeekdaySchema = z70.enum(["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]);
11552
+ var CountryCodeModeSchema = z70.enum(["static_default_country_code", "dynamic_default_country_code", "none"]);
11553
+ var SenderTypeSchema = z70.enum(["CONTACT_OWNER", "SPECIFIC_USER"]);
11554
+ var MarketingContactStatusSchema = z70.enum(["MARKETABLE", "MARKETABLE_UNTIL_RENEWAL", "NON_MARKETABLE"]);
11555
+ var CommunicationChannelSchema = z70.enum(["EMAIL", "SMS", "WHATSAPP"]);
11556
+ var CommunicationOptStateSchema = z70.enum(["OPT_IN", "OPT_OUT"]);
11557
+ var LegalBasisSchema = z70.enum([
11558
+ "LEGITIMATE_INTEREST_CLIENT",
11559
+ "LEGITIMATE_INTEREST_OTHER",
11560
+ "PERFORMANCE_OF_CONTRACT",
11561
+ "CONSENT_WITH_NOTICE",
11562
+ "NON_GDPR"
11563
+ ]);
11564
+ var RelativeDelayDirectionSchema = z70.enum(["BEFORE", "AFTER"]);
11565
+ var WebhookMethodSchema = z70.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]);
11566
+ var CustomCodeRuntimeSchema = z70.enum(["NODE20X"]);
11567
+ var CustomCodeOutputTypeSchema = z70.enum(["NUMBER", "DATE", "STRING", "ENUMERATION", "DATETIME", "BOOLEAN"]);
11568
+ var NotificationDeliveryMethodSchema = z70.enum(["APP", "MOBILE"]);
11569
+ var AssociationCategorySchema = z70.enum(["HUBSPOT_DEFINED", "USER_DEFINED"]);
11535
11570
  var WorkflowConnectionSchema = z70.object({
11536
- edgeType: NonEmptyStringSchema,
11571
+ edgeType: WorkflowEdgeTypeSchema,
11537
11572
  nextActionId: NonEmptyStringSchema
11538
11573
  }).passthrough();
11539
11574
  var WorkflowStaticBranchSchema = z70.object({
11540
11575
  branchValue: NonEmptyStringSchema,
11541
- connection: WorkflowConnectionSchema.optional()
11576
+ connection: WorkflowConnectionSchema.optional(),
11577
+ nextActionId: NonEmptyStringSchema.optional()
11542
11578
  }).passthrough();
11543
11579
  var WorkflowTestBranchSchema = z70.object({
11544
11580
  percentage: z70.number().int().min(0).max(100),
11545
- connection: WorkflowConnectionSchema.optional()
11581
+ connection: WorkflowConnectionSchema.optional(),
11582
+ nextActionId: NonEmptyStringSchema.optional()
11546
11583
  }).passthrough();
11547
11584
  var WorkflowListMembershipFilterSchema = z70.object({
11548
11585
  listId: NonEmptyStringSchema,
@@ -11553,23 +11590,100 @@ var WorkflowListBranchPropertyOperationSchema = z70.object({
11553
11590
  operator: NonEmptyStringSchema,
11554
11591
  includeObjectsWithNoValueSet: z70.boolean().optional(),
11555
11592
  values: z70.array(z70.string()).optional(),
11556
- operationType: NonEmptyStringSchema.optional()
11593
+ operationType: NonEmptyStringSchema.optional(),
11594
+ value: z70.union([z70.string(), z70.number(), z70.boolean()]).optional(),
11595
+ endpointBehavior: NonEmptyStringSchema.optional(),
11596
+ propertyParser: NonEmptyStringSchema.optional(),
11597
+ type: NonEmptyStringSchema.optional(),
11598
+ lowerBound: z70.number().optional(),
11599
+ upperBound: z70.number().optional(),
11600
+ lowerBoundEndpointBehavior: NonEmptyStringSchema.optional(),
11601
+ upperBoundEndpointBehavior: NonEmptyStringSchema.optional(),
11602
+ lowerBoundTimePoint: z70.record(z70.string(), z70.unknown()).optional(),
11603
+ upperBoundTimePoint: z70.record(z70.string(), z70.unknown()).optional(),
11604
+ timePoint: z70.record(z70.string(), z70.unknown()).optional()
11557
11605
  }).passthrough();
11558
11606
  var WorkflowListBranchPropertyFilterSchema = z70.object({
11559
11607
  property: NonEmptyStringSchema,
11560
11608
  filterType: z70.literal("PROPERTY"),
11561
11609
  operation: WorkflowListBranchPropertyOperationSchema
11562
11610
  }).passthrough();
11611
+ var WorkflowListBranchFormSubmissionFilterSchema = z70.object({
11612
+ filterType: z70.literal("FORM_SUBMISSION"),
11613
+ formId: NonEmptyStringSchema,
11614
+ operator: z70.literal("FILLED_OUT"),
11615
+ pruningRefineBy: z70.record(z70.string(), z70.unknown()).optional()
11616
+ }).passthrough();
11617
+ var WorkflowListBranchFormSubmissionOnPageFilterSchema = z70.object({
11618
+ filterType: z70.literal("FORM_SUBMISSION_ON_PAGE"),
11619
+ formId: NonEmptyStringSchema,
11620
+ pageId: NonEmptyStringSchema,
11621
+ operator: z70.literal("FILLED_OUT")
11622
+ }).passthrough();
11623
+ var WorkflowListBranchEmailEventFilterSchema = z70.object({
11624
+ filterType: z70.literal("EMAIL_EVENT"),
11625
+ level: NonEmptyStringSchema,
11626
+ emailId: NonEmptyStringSchema,
11627
+ appId: NonEmptyStringSchema,
11628
+ operator: z70.enum(["OPENED", "CLICKED", "BOUNCED", "DELIVERED", "MARKED_SPAM", "UNSUBSCRIBED"])
11629
+ }).passthrough();
11630
+ var WorkflowListBranchCtaFilterSchema = z70.object({
11631
+ filterType: z70.literal("CTA"),
11632
+ operator: z70.literal("HAS_CLICKED_CTA_PLACEMENT"),
11633
+ ctaName: NonEmptyStringSchema
11634
+ }).passthrough();
11563
11635
  var WorkflowListBranchFilterLeafSchema = z70.union([
11564
11636
  WorkflowListMembershipFilterSchema,
11565
- WorkflowListBranchPropertyFilterSchema
11637
+ WorkflowListBranchPropertyFilterSchema,
11638
+ WorkflowListBranchFormSubmissionFilterSchema,
11639
+ WorkflowListBranchFormSubmissionOnPageFilterSchema,
11640
+ WorkflowListBranchEmailEventFilterSchema,
11641
+ WorkflowListBranchCtaFilterSchema
11566
11642
  ]);
11567
- var WorkflowListBranchFilterNodeSchema = z70.object({
11643
+ var WorkflowListBranchLogicalNodeSchema = z70.object({
11568
11644
  filterBranches: z70.array(z70.lazy(() => WorkflowListBranchFilterNodeSchema)).default([]),
11569
11645
  filters: z70.array(WorkflowListBranchFilterLeafSchema).default([]),
11570
11646
  filterBranchType: z70.enum(["AND", "OR"]),
11571
11647
  filterBranchOperator: z70.enum(["AND", "OR"])
11572
11648
  }).passthrough();
11649
+ var WorkflowListBranchAssociationNodeSchema = z70.object({
11650
+ filterBranches: z70.array(z70.lazy(() => WorkflowListBranchFilterNodeSchema)).default([]),
11651
+ filters: z70.array(WorkflowListBranchFilterLeafSchema).default([]),
11652
+ filterBranchType: z70.literal("ASSOCIATION"),
11653
+ filterBranchOperator: z70.literal("AND"),
11654
+ associationCategory: AssociationCategorySchema,
11655
+ associationTypeId: z70.number().int(),
11656
+ objectTypeId: NonEmptyStringSchema,
11657
+ operator: z70.literal("IN_LIST")
11658
+ }).passthrough();
11659
+ var WorkflowListBranchUnifiedEventsNodeSchema = z70.object({
11660
+ filterBranches: z70.array(z70.lazy(() => WorkflowListBranchFilterNodeSchema)).default([]),
11661
+ filters: z70.array(WorkflowListBranchFilterLeafSchema).default([]),
11662
+ filterBranchType: z70.literal("UNIFIED_EVENTS"),
11663
+ filterBranchOperator: z70.literal("AND"),
11664
+ eventTypeId: NonEmptyStringSchema,
11665
+ operator: z70.literal("HAS_COMPLETED")
11666
+ }).passthrough();
11667
+ var WorkflowListBranchFilterNodeSchema = z70.union([
11668
+ WorkflowListBranchLogicalNodeSchema,
11669
+ WorkflowListBranchAssociationNodeSchema,
11670
+ WorkflowListBranchUnifiedEventsNodeSchema
11671
+ ]).superRefine((value, ctx) => {
11672
+ if ((value.filterBranchType === "AND" || value.filterBranchType === "OR") && value.filterBranches.length === 0 && value.filters.length === 0) {
11673
+ ctx.addIssue({
11674
+ code: z70.ZodIssueCode.custom,
11675
+ message: "Logical LIST_BRANCH nodes must include at least one child branch or filter.",
11676
+ path: ["filterBranches"]
11677
+ });
11678
+ }
11679
+ if (value.filterBranchType === "UNIFIED_EVENTS" && value.filters.length > 0) {
11680
+ ctx.addIssue({
11681
+ code: z70.ZodIssueCode.custom,
11682
+ message: "UNIFIED_EVENTS nodes do not accept direct filters.",
11683
+ path: ["filters"]
11684
+ });
11685
+ }
11686
+ });
11573
11687
  var WorkflowListBranchSchema = z70.object({
11574
11688
  branchName: NonEmptyStringSchema,
11575
11689
  filterBranch: WorkflowListBranchFilterNodeSchema,
@@ -11577,20 +11691,51 @@ var WorkflowListBranchSchema = z70.object({
11577
11691
  nextActionId: NonEmptyStringSchema.optional()
11578
11692
  }).passthrough();
11579
11693
  var AssociationSpecSchema = z70.object({
11580
- associationCategory: NonEmptyStringSchema,
11694
+ associationCategory: AssociationCategorySchema,
11581
11695
  associationTypeId: z70.number().int()
11582
11696
  }).passthrough();
11583
11697
  var StaticValueSchema = z70.object({
11584
11698
  type: z70.literal("STATIC_VALUE"),
11585
- staticValue: z70.string()
11699
+ staticValue: StringOrPlanRefSchema
11586
11700
  }).passthrough();
11587
11701
  var ObjectPropertyValueSchema = z70.object({
11588
11702
  type: z70.literal("OBJECT_PROPERTY"),
11589
11703
  propertyName: NonEmptyStringSchema
11590
11704
  }).passthrough();
11591
- var ActionValueSchema = z70.union([
11705
+ var FieldDataValueSchema = z70.object({
11706
+ type: z70.literal("FIELD_DATA"),
11707
+ actionId: NonEmptyStringSchema,
11708
+ dataKey: NonEmptyStringSchema
11709
+ }).passthrough();
11710
+ var TimestampValueSchema = z70.object({
11711
+ type: z70.literal("TIMESTAMP"),
11712
+ timestampType: NonEmptyStringSchema.optional()
11713
+ }).passthrough();
11714
+ var IncrementValueSchema = z70.object({
11715
+ type: z70.literal("INCREMENT"),
11716
+ incrementAmount: z70.number()
11717
+ }).passthrough();
11718
+ var StaticAppendValueSchema = z70.object({
11719
+ type: z70.literal("STATIC_APPEND_VALUE"),
11720
+ staticAppendValue: z70.string()
11721
+ }).passthrough();
11722
+ var EnrollmentEventPropertyValueSchema = z70.object({
11723
+ type: z70.literal("ENROLLMENT_EVENT_PROPERTY"),
11724
+ enrollmentEventPropertyToken: z70.string()
11725
+ }).passthrough();
11726
+ var FetchedObjectPropertyValueSchema = z70.object({
11727
+ type: z70.literal("FETCHED_OBJECT_PROPERTY"),
11728
+ propertyToken: z70.string()
11729
+ }).passthrough();
11730
+ var ActionValueSchema = z70.discriminatedUnion("type", [
11592
11731
  StaticValueSchema,
11593
- ObjectPropertyValueSchema
11732
+ ObjectPropertyValueSchema,
11733
+ FieldDataValueSchema,
11734
+ TimestampValueSchema,
11735
+ IncrementValueSchema,
11736
+ StaticAppendValueSchema,
11737
+ EnrollmentEventPropertyValueSchema,
11738
+ FetchedObjectPropertyValueSchema
11594
11739
  ]);
11595
11740
  var AssociationValueSchema = z70.union([
11596
11741
  z70.object({
@@ -11609,12 +11754,42 @@ var TimeOfDaySchema = z70.object({
11609
11754
  hour: z70.number().int().min(0).max(23),
11610
11755
  minute: z70.number().int().min(0).max(59)
11611
11756
  }).passthrough();
11757
+ var RelativeDatetimeValueSchema = z70.object({
11758
+ type: z70.literal("RELATIVE_DATETIME"),
11759
+ timeDelay: z70.object({
11760
+ delta: z70.number().int(),
11761
+ timeUnit: TimeUnitSchema,
11762
+ daysOfWeek: z70.array(WeekdaySchema),
11763
+ timeOfDay: TimeOfDaySchema.optional()
11764
+ }).passthrough()
11765
+ }).passthrough();
11612
11766
  var RelativeTimeSchema = z70.object({
11613
11767
  delta: z70.number().int(),
11614
- timeUnit: NonEmptyStringSchema,
11768
+ timeUnit: TimeUnitSchema,
11615
11769
  timeOfDay: TimeOfDaySchema,
11616
- daysOfWeek: z70.array(NonEmptyStringSchema)
11770
+ daysOfWeek: z70.array(WeekdaySchema)
11771
+ }).passthrough();
11772
+ var RecipientSelectionSchema = z70.object({
11773
+ user_ids: z70.array(NonEmptyStringSchema).optional(),
11774
+ team_ids: z70.array(NonEmptyStringSchema).optional(),
11775
+ owner_properties: z70.array(NonEmptyStringSchema).optional()
11617
11776
  }).passthrough();
11777
+ var requireAtLeastOneRecipient = (value, ctx) => {
11778
+ const recipientCounts = [
11779
+ value.fields?.user_ids?.length ?? 0,
11780
+ value.fields?.team_ids?.length ?? 0,
11781
+ value.fields?.owner_properties?.length ?? 0
11782
+ ];
11783
+ if (!recipientCounts.some((count) => count > 0)) {
11784
+ ctx.addIssue({
11785
+ code: z70.ZodIssueCode.custom,
11786
+ message: "At least one of user_ids, team_ids, or owner_properties must contain a recipient.",
11787
+ path: ["fields"]
11788
+ });
11789
+ }
11790
+ };
11791
+ var GenericObjectSchema = z70.record(z70.string(), z70.unknown());
11792
+ var NotificationRecipientArraySchema = z70.array(NonEmptyStringSchema);
11618
11793
  var ActionFieldDataInputSchema = z70.object({
11619
11794
  actionId: NonEmptyStringSchema,
11620
11795
  dataKey: NonEmptyStringSchema,
@@ -11622,8 +11797,107 @@ var ActionFieldDataInputSchema = z70.object({
11622
11797
  }).passthrough();
11623
11798
  var StaticBranchInputValueSchema = z70.union([
11624
11799
  ActionFieldDataInputSchema,
11625
- ObjectPropertyValueSchema
11800
+ ObjectPropertyValueSchema,
11801
+ FetchedObjectPropertyValueSchema
11626
11802
  ]);
11803
+ var hasSourcePattern = (sourceCode, pattern) => pattern.test(sourceCode);
11804
+ var collectLiteralOutputFieldKeys = (sourceCode) => {
11805
+ const matches = [...sourceCode.matchAll(/outputFields\s*:\s*\{([\s\S]*?)\}/g)];
11806
+ const keys = /* @__PURE__ */ new Set();
11807
+ for (const match of matches) {
11808
+ const body = match[1] ?? "";
11809
+ for (const keyMatch of body.matchAll(/(?:^|[,{]\s*)(['"]?)([A-Za-z_$][\w$-]*)\1\s*:/g)) {
11810
+ keys.add(keyMatch[2]);
11811
+ }
11812
+ }
11813
+ return [...keys];
11814
+ };
11815
+ var validateCustomCodeSource = (value, ctx) => {
11816
+ const sourceCode = value.sourceCode;
11817
+ try {
11818
+ new Function(sourceCode);
11819
+ } catch (error) {
11820
+ ctx.addIssue({
11821
+ code: z70.ZodIssueCode.custom,
11822
+ message: `sourceCode must be valid JavaScript: ${error instanceof Error ? error.message : "syntax error"}`,
11823
+ path: ["sourceCode"]
11824
+ });
11825
+ return;
11826
+ }
11827
+ if (!hasSourcePattern(sourceCode, /\b(?:exports|module\.exports)\.main\s*=/)) {
11828
+ ctx.addIssue({
11829
+ code: z70.ZodIssueCode.custom,
11830
+ message: "sourceCode must define exports.main or module.exports.main.",
11831
+ path: ["sourceCode"]
11832
+ });
11833
+ }
11834
+ const hasCallbackContract = hasSourcePattern(sourceCode, /\bcallback\s*\(/);
11835
+ const hasReturnContract = hasSourcePattern(sourceCode, /\breturn\s+(?:await\s+)?\{[\s\S]*?outputFields\s*:/);
11836
+ if (!hasCallbackContract && !hasReturnContract) {
11837
+ ctx.addIssue({
11838
+ code: z70.ZodIssueCode.custom,
11839
+ message: "sourceCode must either call callback(...) or return an object containing outputFields.",
11840
+ path: ["sourceCode"]
11841
+ });
11842
+ }
11843
+ const literalOutputKeys = collectLiteralOutputFieldKeys(sourceCode);
11844
+ const declaredOutputNames = new Set((value.outputFields ?? []).map((field) => field.name));
11845
+ if (declaredOutputNames.size > 0) {
11846
+ for (const field of value.outputFields ?? []) {
11847
+ if (!hasSourcePattern(sourceCode, new RegExp(`\\b${field.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`))) {
11848
+ ctx.addIssue({
11849
+ code: z70.ZodIssueCode.custom,
11850
+ message: `Declared output field '${field.name}' is not referenced in sourceCode.`,
11851
+ path: ["outputFields"]
11852
+ });
11853
+ }
11854
+ }
11855
+ }
11856
+ for (const literalKey of literalOutputKeys) {
11857
+ if (!declaredOutputNames.has(literalKey)) {
11858
+ ctx.addIssue({
11859
+ code: z70.ZodIssueCode.custom,
11860
+ message: `sourceCode emits outputFields.${literalKey} but it is not declared in outputFields.`,
11861
+ path: ["outputFields"]
11862
+ });
11863
+ }
11864
+ }
11865
+ for (const [index, inputField] of (value.inputFields ?? []).entries()) {
11866
+ if (!hasSourcePattern(sourceCode, new RegExp(`\\b${inputField.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`))) {
11867
+ ctx.addIssue({
11868
+ code: z70.ZodIssueCode.custom,
11869
+ message: `Declared input field '${inputField.name}' is not referenced in sourceCode.`,
11870
+ path: ["inputFields", index, "name"]
11871
+ });
11872
+ }
11873
+ }
11874
+ for (const [index, secretName] of (value.secretNames ?? []).entries()) {
11875
+ if (!hasSourcePattern(sourceCode, new RegExp(`\\b${secretName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`))) {
11876
+ ctx.addIssue({
11877
+ code: z70.ZodIssueCode.custom,
11878
+ message: `Declared secret '${secretName}' is not referenced in sourceCode.`,
11879
+ path: ["secretNames", index]
11880
+ });
11881
+ }
11882
+ }
11883
+ const dangerousPatterns = [
11884
+ { pattern: /\beval\s*\(/, message: "sourceCode must not use eval()." },
11885
+ { pattern: /\bFunction\s*\(/, message: "sourceCode must not construct functions dynamically." },
11886
+ { pattern: /\brequire\s*\(\s*['"]child_process['"]\s*\)/, message: "sourceCode must not import child_process." },
11887
+ { pattern: /\bexec(?:Sync)?\s*\(/, message: "sourceCode must not execute shell commands." },
11888
+ { pattern: /\bspawn\s*\(/, message: "sourceCode must not spawn subprocesses." },
11889
+ { pattern: /\bfs\.(?:writeFile|writeFileSync|appendFile|appendFileSync)\s*\(/, message: "sourceCode must not write to the filesystem." }
11890
+ ];
11891
+ for (const { pattern, message } of dangerousPatterns) {
11892
+ if (hasSourcePattern(sourceCode, pattern)) {
11893
+ ctx.addIssue({
11894
+ code: z70.ZodIssueCode.custom,
11895
+ message,
11896
+ path: ["sourceCode"]
11897
+ });
11898
+ }
11899
+ }
11900
+ };
11627
11901
  var SingleConnectionActionBaseSchema = z70.object({
11628
11902
  actionId: NonEmptyStringSchema,
11629
11903
  actionTypeVersion: z70.number().int().optional(),
@@ -11634,23 +11908,27 @@ var buildSingleConnectionActionSchema = (actionTypeId, fields51) => SingleConnec
11634
11908
  actionTypeId: z70.literal(actionTypeId),
11635
11909
  fields: fields51
11636
11910
  });
11637
- var BooleanStringSchema = z70.enum(["true", "false"]);
11638
11911
  var DelayForSetAmountOfTimeActionSchema = buildSingleConnectionActionSchema("0-1", z70.object({
11639
11912
  delta: NonEmptyStringSchema,
11640
- time_unit: NonEmptyStringSchema
11913
+ time_unit: TimeUnitSchema,
11914
+ days_of_week: z70.array(WeekdaySchema).optional(),
11915
+ time_of_day: TimeOfDaySchema.optional(),
11916
+ time_zone_strategy: NonEmptyStringSchema.optional()
11917
+ }).passthrough());
11918
+ var SendEmailActionSchema = buildSingleConnectionActionSchema("0-4", z70.object({
11919
+ content_id: NonEmptyStringSchema
11641
11920
  }).passthrough());
11642
- var RotateRecordToOwnerActionSchema = buildSingleConnectionActionSchema("0-11", z70.object({
11643
- user_ids: z70.array(NonEmptyStringSchema).min(1),
11921
+ var RotateRecordToOwnerActionSchema = buildSingleConnectionActionSchema("0-11", RecipientSelectionSchema.extend({
11644
11922
  target_property: NonEmptyStringSchema,
11645
11923
  overwrite_current_owner: BooleanStringSchema
11646
- }).passthrough());
11924
+ })).superRefine(requireAtLeastOneRecipient);
11647
11925
  var CreateRecordPropertySchema = z70.object({
11648
11926
  targetProperty: NonEmptyStringSchema,
11649
- value: ActionValueSchema
11927
+ value: z70.union([ActionValueSchema, RelativeDatetimeValueSchema])
11650
11928
  }).passthrough();
11651
11929
  var CreateRecordActionSchema = buildSingleConnectionActionSchema("0-14", z70.object({
11652
11930
  object_type_id: NonEmptyStringSchema,
11653
- properties: z70.array(CreateRecordPropertySchema).optional(),
11931
+ properties: z70.array(CreateRecordPropertySchema),
11654
11932
  associations: z70.array(ActionAssociationSchema).optional(),
11655
11933
  use_explicit_associations: BooleanStringSchema.optional()
11656
11934
  }).passthrough());
@@ -11670,15 +11948,43 @@ var StopTrackingIntentSignalsActionSchema = buildSingleConnectionActionSchema("0
11670
11948
  targetCompany: NonEmptyStringSchema
11671
11949
  }).passthrough());
11672
11950
  var ValidateAndFormatPhoneNumberActionSchema = buildSingleConnectionActionSchema("0-225935194", z70.object({
11673
- defaultCountryCodeMode: NonEmptyStringSchema
11674
- }).passthrough());
11951
+ defaultCountryCodeMode: CountryCodeModeSchema,
11952
+ propertyValue: NonEmptyStringSchema.optional(),
11953
+ staticDefaultCountryCode: NonEmptyStringSchema.optional()
11954
+ }).passthrough()).superRefine((value, ctx) => {
11955
+ if (value.fields.defaultCountryCodeMode === "static_default_country_code" && !value.fields.staticDefaultCountryCode) {
11956
+ ctx.addIssue({
11957
+ code: z70.ZodIssueCode.custom,
11958
+ message: "staticDefaultCountryCode is required when defaultCountryCodeMode is static_default_country_code.",
11959
+ path: ["fields", "staticDefaultCountryCode"]
11960
+ });
11961
+ }
11962
+ if (value.fields.defaultCountryCodeMode !== "static_default_country_code" && value.fields.staticDefaultCountryCode) {
11963
+ ctx.addIssue({
11964
+ code: z70.ZodIssueCode.custom,
11965
+ message: "staticDefaultCountryCode is only valid when defaultCountryCodeMode is static_default_country_code.",
11966
+ path: ["fields", "staticDefaultCountryCode"]
11967
+ });
11968
+ }
11969
+ });
11675
11970
  var DelayUntilEventOccursActionSchema = buildSingleConnectionActionSchema("0-29", z70.object({
11676
- expiration_minutes: NonEmptyStringSchema
11971
+ expiration_minutes: NonEmptyStringSchema,
11972
+ event_filter_branches: z70.array(GenericObjectSchema).optional(),
11973
+ target_object_override: NonEmptyStringSchema.optional()
11677
11974
  }).passthrough());
11678
- var TaskOwnerAssignmentSchema = z70.object({
11679
- type: NonEmptyStringSchema,
11680
- value: StaticValueSchema
11681
- }).passthrough();
11975
+ var RelativeDelayActionSchema = buildSingleConnectionActionSchema("0-28", z70.object({
11976
+ delay: RelativeTimeSchema,
11977
+ direction: RelativeDelayDirectionSchema
11978
+ }).passthrough());
11979
+ var TaskOwnerAssignmentSchema = z70.discriminatedUnion("type", [
11980
+ z70.object({
11981
+ type: z70.literal("CUSTOM"),
11982
+ value: z70.union([StaticValueSchema, ObjectPropertyValueSchema])
11983
+ }).passthrough(),
11984
+ z70.object({
11985
+ type: z70.literal("ENROLLED_OBJECT_OWNER")
11986
+ }).passthrough()
11987
+ ]);
11682
11988
  var CreateTaskActionSchema = buildSingleConnectionActionSchema("0-3", z70.object({
11683
11989
  task_type: NonEmptyStringSchema,
11684
11990
  subject: NonEmptyStringSchema,
@@ -11688,24 +11994,25 @@ var CreateTaskActionSchema = buildSingleConnectionActionSchema("0-3", z70.object
11688
11994
  priority: NonEmptyStringSchema.optional(),
11689
11995
  due_time: RelativeTimeSchema.optional(),
11690
11996
  reminder_time: RelativeTimeSchema.optional(),
11691
- owner_assignment: TaskOwnerAssignmentSchema.optional()
11997
+ owner_assignment: TaskOwnerAssignmentSchema.optional(),
11998
+ queue_id: NonEmptyStringSchema.optional()
11692
11999
  }).passthrough());
11693
12000
  var SetMarketingContactStatusActionSchema = buildSingleConnectionActionSchema("0-31", z70.object({
11694
12001
  targetContact: NonEmptyStringSchema,
11695
- marketableType: NonEmptyStringSchema
12002
+ marketableType: MarketingContactStatusSchema
11696
12003
  }).passthrough());
11697
12004
  var DelayUntilDateActionSchema = buildSingleConnectionActionSchema("0-35", z70.object({
11698
- date: ActionValueSchema,
12005
+ date: z70.union([ActionValueSchema, RelativeDatetimeValueSchema]),
11699
12006
  delta: NonEmptyStringSchema,
11700
- time_unit: NonEmptyStringSchema,
12007
+ time_unit: TimeUnitSchema,
11701
12008
  time_of_day: TimeOfDaySchema
11702
12009
  }).passthrough());
11703
12010
  var ManageCommunicationSubscriptionsActionSchema = buildSingleConnectionActionSchema("0-43347357", z70.object({
11704
12011
  targetContact: NonEmptyStringSchema,
11705
- channel: NonEmptyStringSchema,
11706
- optState: NonEmptyStringSchema,
12012
+ channel: CommunicationChannelSchema,
12013
+ optState: CommunicationOptStateSchema,
11707
12014
  subscriptionId: NonEmptyStringSchema,
11708
- legalBasis: NonEmptyStringSchema,
12015
+ legalBasis: LegalBasisSchema,
11709
12016
  legalBasisExplanation: z70.string()
11710
12017
  }).passthrough());
11711
12018
  var AssignConversationOwnerActionSchema = buildSingleConnectionActionSchema("0-44475148", z70.object({
@@ -11715,10 +12022,25 @@ var AssignConversationOwnerActionSchema = buildSingleConnectionActionSchema("0-4
11715
12022
  var EnrollInSequenceActionSchema = buildSingleConnectionActionSchema("0-46510720", z70.object({
11716
12023
  sequenceId: NonEmptyStringSchema,
11717
12024
  shouldUseContactTimeZone: BooleanStringSchema,
11718
- senderType: NonEmptyStringSchema,
12025
+ senderType: SenderTypeSchema,
11719
12026
  contactOwnerProperty: NonEmptyStringSchema.optional(),
11720
12027
  userId: NonEmptyStringSchema.optional()
11721
- }).passthrough());
12028
+ }).passthrough()).superRefine((value, ctx) => {
12029
+ if (value.fields.senderType === "CONTACT_OWNER" && !value.fields.contactOwnerProperty) {
12030
+ ctx.addIssue({
12031
+ code: z70.ZodIssueCode.custom,
12032
+ message: "contactOwnerProperty is required when senderType is CONTACT_OWNER.",
12033
+ path: ["fields", "contactOwnerProperty"]
12034
+ });
12035
+ }
12036
+ if (value.fields.senderType === "SPECIFIC_USER" && !value.fields.userId) {
12037
+ ctx.addIssue({
12038
+ code: z70.ZodIssueCode.custom,
12039
+ message: "userId is required when senderType is SPECIFIC_USER.",
12040
+ path: ["fields", "userId"]
12041
+ });
12042
+ }
12043
+ });
11722
12044
  var UnenrollFromSequenceActionSchema = buildSingleConnectionActionSchema("0-4702372", z70.object({}).passthrough());
11723
12045
  var EditRecordsSetPropertyActionSchema = buildSingleConnectionActionSchema("0-5", z70.object({
11724
12046
  property_name: NonEmptyStringSchema,
@@ -11750,21 +12072,114 @@ var ApplyAssociationLabelsActionSchema = buildSingleConnectionActionSchema("0-73
11750
12072
  fromObjectType: NonEmptyStringSchema,
11751
12073
  toObjectType: NonEmptyStringSchema,
11752
12074
  labelToApply: NonEmptyStringSchema,
11753
- applyLabelToAllAssociatedObjects: BooleanStringSchema
12075
+ applyLabelToAllAssociatedObjects: BooleanStringSchema,
12076
+ matchBy: NonEmptyStringSchema.optional(),
12077
+ enrolledObjectPropertyNameToMatch: NonEmptyStringSchema.optional(),
12078
+ associatedObjectPropertyNameToMatch: NonEmptyStringSchema.optional(),
12079
+ associatedObjectPropertyName: NonEmptyStringSchema.optional(),
12080
+ associatedObjectPropertyOperator: NonEmptyStringSchema.optional(),
12081
+ associatedObjectPropertyValue: NonEmptyStringSchema.optional()
11754
12082
  }).passthrough());
11755
- var SendInternalEmailNotificationActionSchema = buildSingleConnectionActionSchema("0-8", z70.object({
11756
- user_ids: z70.array(NonEmptyStringSchema).min(1),
12083
+ var SendInternalEmailNotificationActionSchema = buildSingleConnectionActionSchema("0-8", RecipientSelectionSchema.extend({
11757
12084
  subject: NonEmptyStringSchema,
11758
- body: NonEmptyStringSchema,
11759
- owner_properties: z70.array(NonEmptyStringSchema).optional()
11760
- }).passthrough());
11761
- var SendInAppNotificationActionSchema = buildSingleConnectionActionSchema("0-9", z70.object({
11762
- user_ids: z70.array(NonEmptyStringSchema).min(1),
11763
- delivery_method: z70.enum(["APP", "MOBILE"]),
12085
+ body: NonEmptyStringSchema
12086
+ })).superRefine(requireAtLeastOneRecipient);
12087
+ var SendInAppNotificationActionSchema = buildSingleConnectionActionSchema("0-9", RecipientSelectionSchema.extend({
12088
+ delivery_method: NotificationDeliveryMethodSchema,
11764
12089
  subject: NonEmptyStringSchema,
11765
- body: NonEmptyStringSchema,
11766
- owner_properties: z70.array(NonEmptyStringSchema).optional()
12090
+ body: NonEmptyStringSchema
12091
+ })).superRefine(requireAtLeastOneRecipient);
12092
+ var SendInternalMarketingEmailActionSchema = buildSingleConnectionActionSchema("0-23", z70.object({
12093
+ email_content_id: NonEmptyStringSchema,
12094
+ recipient_emails: z70.array(NonEmptyStringSchema).min(1)
12095
+ }).passthrough());
12096
+ var AdsAudienceActionSchema = buildSingleConnectionActionSchema("0-30", z70.object({
12097
+ audience_id: NonEmptyStringSchema
12098
+ }).passthrough());
12099
+ var RenderTemplateVariableSchema = z70.object({
12100
+ name: NonEmptyStringSchema,
12101
+ value: z70.union([ActionValueSchema, GenericObjectSchema])
12102
+ }).passthrough();
12103
+ var RenderTemplateActionSchema = buildSingleConnectionActionSchema("0-33", z70.object({
12104
+ variables: z70.array(RenderTemplateVariableSchema),
12105
+ template: z70.string(),
12106
+ locale: NonEmptyStringSchema.optional()
12107
+ }).passthrough());
12108
+ var EnrichRecordActionSchema = buildSingleConnectionActionSchema("0-177946906", z70.object({
12109
+ object_to_enrich: NonEmptyStringSchema,
12110
+ bi_enrichment_overwrite: BooleanStringSchema.optional()
12111
+ }).passthrough());
12112
+ var SendSurveyActionSchema = buildSingleConnectionActionSchema("0-199186210", z70.object({
12113
+ sendTo: NonEmptyStringSchema,
12114
+ survey: NonEmptyStringSchema
12115
+ }).passthrough());
12116
+ var SendSmsMessageActionSchema = buildSingleConnectionActionSchema("0-40900952", z70.object({
12117
+ rootMicId: NonEmptyStringSchema,
12118
+ targetContact: NonEmptyStringSchema
12119
+ }).passthrough());
12120
+ var UpdateAssociationLabelsActionSchema = buildSingleConnectionActionSchema("0-61139484", z70.object({
12121
+ fromObjectType: NonEmptyStringSchema,
12122
+ toObjectType: NonEmptyStringSchema,
12123
+ labelToUpdate: NonEmptyStringSchema,
12124
+ deleteExistingLabel: BooleanStringSchema,
12125
+ labelToApply: NonEmptyStringSchema
11767
12126
  }).passthrough());
12127
+ var SendSlackNotificationActionSchema = buildSingleConnectionActionSchema("1-179507819", z70.object({
12128
+ message: z70.string(),
12129
+ slackChannelIds: NotificationRecipientArraySchema.optional(),
12130
+ slackUserIds: NotificationRecipientArraySchema.optional(),
12131
+ notifyOwner: NotificationRecipientArraySchema.optional()
12132
+ }).passthrough()).superRefine((value, ctx) => {
12133
+ const recipients = [
12134
+ value.fields.slackChannelIds?.length ?? 0,
12135
+ value.fields.slackUserIds?.length ?? 0,
12136
+ value.fields.notifyOwner?.length ?? 0
12137
+ ];
12138
+ if (!recipients.some((count) => count > 0)) {
12139
+ ctx.addIssue({
12140
+ code: z70.ZodIssueCode.custom,
12141
+ message: "At least one Slack recipient target must be provided.",
12142
+ path: ["fields"]
12143
+ });
12144
+ }
12145
+ });
12146
+ var CustomCodeInputFieldSchema = z70.object({
12147
+ name: NonEmptyStringSchema,
12148
+ value: z70.union([ActionValueSchema, GenericObjectSchema])
12149
+ }).passthrough();
12150
+ var CustomCodeOutputFieldSchema = z70.object({
12151
+ name: NonEmptyStringSchema,
12152
+ type: CustomCodeOutputTypeSchema,
12153
+ options: z70.array(NonEmptyStringSchema).optional()
12154
+ }).passthrough();
12155
+ var CustomCodeActionSchema = z70.object({
12156
+ actionId: NonEmptyStringSchema,
12157
+ connection: WorkflowConnectionSchema.optional(),
12158
+ inputFields: z70.array(CustomCodeInputFieldSchema).optional(),
12159
+ outputFields: z70.array(CustomCodeOutputFieldSchema).optional(),
12160
+ runtime: CustomCodeRuntimeSchema,
12161
+ secretNames: z70.array(NonEmptyStringSchema).optional(),
12162
+ sourceCode: z70.string(),
12163
+ type: z70.literal("CUSTOM_CODE")
12164
+ }).passthrough().superRefine((value, ctx) => {
12165
+ for (const [index, field] of (value.outputFields ?? []).entries()) {
12166
+ if (field.type === "ENUMERATION" && (!field.options || field.options.length === 0)) {
12167
+ ctx.addIssue({
12168
+ code: z70.ZodIssueCode.custom,
12169
+ message: "ENUMERATION output fields must include options.",
12170
+ path: ["outputFields", index, "options"]
12171
+ });
12172
+ }
12173
+ }
12174
+ validateCustomCodeSource(value, ctx);
12175
+ });
12176
+ var WebhookActionSchema = z70.object({
12177
+ actionId: NonEmptyStringSchema,
12178
+ method: WebhookMethodSchema,
12179
+ queryParams: z70.array(GenericObjectSchema),
12180
+ type: z70.literal("WEBHOOK"),
12181
+ webhookUrl: NonEmptyStringSchema
12182
+ }).passthrough();
11768
12183
  var StaticBranchWorkflowActionSchema = z70.object({
11769
12184
  actionId: NonEmptyStringSchema,
11770
12185
  inputValue: StaticBranchInputValueSchema,
@@ -11788,6 +12203,7 @@ var ListBranchWorkflowActionSchema = z70.object({
11788
12203
  var WorkflowActionSchemasByDefinitionKey = {
11789
12204
  AB_TEST_BRANCH: AbTestBranchWorkflowActionSchema,
11790
12205
  "0-1": DelayForSetAmountOfTimeActionSchema,
12206
+ "0-4": SendEmailActionSchema,
11791
12207
  "0-11": RotateRecordToOwnerActionSchema,
11792
12208
  "0-14": CreateRecordActionSchema,
11793
12209
  "0-15": GoToWorkflowActionSchema,
@@ -11797,9 +12213,13 @@ var WorkflowActionSchemasByDefinitionKey = {
11797
12213
  "0-219160146": TrackIntentSignalsActionSchema,
11798
12214
  "0-219161394": StopTrackingIntentSignalsActionSchema,
11799
12215
  "0-225935194": ValidateAndFormatPhoneNumberActionSchema,
12216
+ "0-23": SendInternalMarketingEmailActionSchema,
12217
+ "0-28": RelativeDelayActionSchema,
11800
12218
  "0-29": DelayUntilEventOccursActionSchema,
12219
+ "0-30": AdsAudienceActionSchema,
11801
12220
  "0-3": CreateTaskActionSchema,
11802
12221
  "0-31": SetMarketingContactStatusActionSchema,
12222
+ "0-33": RenderTemplateActionSchema,
11803
12223
  "0-35": DelayUntilDateActionSchema,
11804
12224
  "0-43347357": ManageCommunicationSubscriptionsActionSchema,
11805
12225
  "0-44475148": AssignConversationOwnerActionSchema,
@@ -11807,18 +12227,26 @@ var WorkflowActionSchemasByDefinitionKey = {
11807
12227
  "0-4702372": UnenrollFromSequenceActionSchema,
11808
12228
  "0-5": EditRecordsSetPropertyActionSchema,
11809
12229
  "0-61139476": RemoveAssociationLabelsActionSchema,
12230
+ "0-61139484": UpdateAssociationLabelsActionSchema,
11810
12231
  "0-63189541": CreateAssociationsActionSchema,
11811
12232
  "0-63809083": AddToStaticListActionSchema,
11812
12233
  "0-63863438": RemoveFromStaticListActionSchema,
11813
12234
  "0-73444249": ApplyAssociationLabelsActionSchema,
11814
12235
  "0-8": SendInternalEmailNotificationActionSchema,
11815
12236
  "0-9": SendInAppNotificationActionSchema,
12237
+ "0-177946906": EnrichRecordActionSchema,
12238
+ "0-199186210": SendSurveyActionSchema,
12239
+ "0-40900952": SendSmsMessageActionSchema,
12240
+ "1-179507819": SendSlackNotificationActionSchema,
12241
+ CUSTOM_CODE: CustomCodeActionSchema,
11816
12242
  LIST_BRANCH: ListBranchWorkflowActionSchema,
11817
- STATIC_BRANCH: StaticBranchWorkflowActionSchema
12243
+ STATIC_BRANCH: StaticBranchWorkflowActionSchema,
12244
+ WEBHOOK: WebhookActionSchema
11818
12245
  };
11819
12246
  var WorkflowDefinitionActionSchema = z70.union([
11820
12247
  AbTestBranchWorkflowActionSchema,
11821
12248
  DelayForSetAmountOfTimeActionSchema,
12249
+ SendEmailActionSchema,
11822
12250
  RotateRecordToOwnerActionSchema,
11823
12251
  CreateRecordActionSchema,
11824
12252
  GoToWorkflowActionSchema,
@@ -11828,9 +12256,13 @@ var WorkflowDefinitionActionSchema = z70.union([
11828
12256
  TrackIntentSignalsActionSchema,
11829
12257
  StopTrackingIntentSignalsActionSchema,
11830
12258
  ValidateAndFormatPhoneNumberActionSchema,
12259
+ SendInternalMarketingEmailActionSchema,
12260
+ RelativeDelayActionSchema,
11831
12261
  DelayUntilEventOccursActionSchema,
12262
+ AdsAudienceActionSchema,
11832
12263
  CreateTaskActionSchema,
11833
12264
  SetMarketingContactStatusActionSchema,
12265
+ RenderTemplateActionSchema,
11834
12266
  DelayUntilDateActionSchema,
11835
12267
  ManageCommunicationSubscriptionsActionSchema,
11836
12268
  AssignConversationOwnerActionSchema,
@@ -11838,14 +12270,21 @@ var WorkflowDefinitionActionSchema = z70.union([
11838
12270
  UnenrollFromSequenceActionSchema,
11839
12271
  EditRecordsSetPropertyActionSchema,
11840
12272
  RemoveAssociationLabelsActionSchema,
12273
+ UpdateAssociationLabelsActionSchema,
11841
12274
  CreateAssociationsActionSchema,
11842
12275
  AddToStaticListActionSchema,
11843
12276
  RemoveFromStaticListActionSchema,
11844
12277
  ApplyAssociationLabelsActionSchema,
11845
12278
  SendInternalEmailNotificationActionSchema,
11846
12279
  SendInAppNotificationActionSchema,
12280
+ EnrichRecordActionSchema,
12281
+ SendSurveyActionSchema,
12282
+ SendSmsMessageActionSchema,
12283
+ SendSlackNotificationActionSchema,
12284
+ CustomCodeActionSchema,
11847
12285
  ListBranchWorkflowActionSchema,
11848
- StaticBranchWorkflowActionSchema
12286
+ StaticBranchWorkflowActionSchema,
12287
+ WebhookActionSchema
11849
12288
  ]);
11850
12289
 
11851
12290
  // ../shared/pure/workflow-action-types.ts
@@ -11857,7 +12296,10 @@ var BUILT_IN_ACTION_TYPES = {
11857
12296
  connectionType: "SINGLE_CONNECTION",
11858
12297
  fields: [
11859
12298
  { name: "delta", type: "string", required: true, description: "Duration value (e.g. '1440' for minutes)" },
11860
- { name: "time_unit", type: "string", required: true, description: "Unit: MINUTES, HOURS, or DAYS" }
12299
+ { name: "time_unit", type: "string", required: true, description: "Unit: MINUTES, HOURS, or DAYS" },
12300
+ { name: "days_of_week", type: "array", required: false, description: "Optional allowed execution weekdays when the delay should only release on selected days." },
12301
+ { name: "time_of_day", type: "object", required: false, description: "Optional release time of day: { hour, minute }." },
12302
+ { name: "time_zone_strategy", type: "string", required: false, description: "Optional timezone handling mode used by HubSpot when evaluating the delay." }
11861
12303
  ]
11862
12304
  },
11863
12305
  "0-3": {
@@ -11870,6 +12312,8 @@ var BUILT_IN_ACTION_TYPES = {
11870
12312
  { name: "subject", type: "string", required: true, description: "Task subject line" },
11871
12313
  { name: "body", type: "string", required: true, description: "Task body (HTML)" },
11872
12314
  { name: "priority", type: "string", required: false, description: "Priority: NONE, LOW, MEDIUM, HIGH" },
12315
+ { name: "owner_assignment", type: "object", required: false, description: "Optional owner assignment spec for the created task, for example { type: 'CUSTOM', value: { type: 'OBJECT_PROPERTY', propertyName: 'hubspot_owner_id' } }." },
12316
+ { name: "queue_id", type: "string", required: false, description: "Optional task queue identifier used in some harvested payloads." },
11873
12317
  { name: "associations", type: "array", required: false, description: "Association targets. On CONTACT_FLOW, use [{ target: { associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 204 }, value: { type: 'ENROLLED_OBJECT' } }]." },
11874
12318
  { name: "use_explicit_associations", type: "string", required: false, description: "'true' to use explicit associations. On CONTACT_FLOW create-task actions, set this to 'true' with the enrolled-contact association to avoid HubSpot HTTP 500 errors." }
11875
12319
  ]
@@ -11886,11 +12330,11 @@ var BUILT_IN_ACTION_TYPES = {
11886
12330
  "0-5": {
11887
12331
  actionTypeId: "0-5",
11888
12332
  name: "Edit records / Set property",
11889
- description: "Set, edit, copy, or clear property values for enrolled or associated records",
12333
+ description: "Set, copy, append, increment, timestamp, or clear CRM property values on the enrolled record or on an associated record.",
11890
12334
  connectionType: "SINGLE_CONNECTION",
11891
12335
  fields: [
11892
12336
  { name: "property_name", type: "string", required: true, description: "Internal property name to set" },
11893
- { name: "value", type: "object", required: true, description: "MUST include type: 'STATIC_VALUE' when setting a value, e.g. { type: 'STATIC_VALUE', staticValue: 'value' }. Omitting type causes HTTP 500." },
12337
+ { name: "value", type: "object", required: true, description: "Typed value payload. Common variants are STATIC_VALUE, OBJECT_PROPERTY, INCREMENT, FIELD_DATA, TIMESTAMP, STATIC_APPEND_VALUE, ENROLLMENT_EVENT_PROPERTY, and FETCHED_OBJECT_PROPERTY. STATIC_VALUE must include type explicitly or HubSpot returns HTTP 500." },
11894
12338
  { name: "association", type: "object", required: false, description: "Association spec if setting on an associated record: { associationCategory: 'HUBSPOT_DEFINED', associationTypeId: <number> }" }
11895
12339
  ]
11896
12340
  },
@@ -11900,7 +12344,9 @@ var BUILT_IN_ACTION_TYPES = {
11900
12344
  description: "Send an internal email to selected users or teams",
11901
12345
  connectionType: "SINGLE_CONNECTION",
11902
12346
  fields: [
11903
- { name: "user_ids", type: "array", required: true, description: "Array of user ID strings to notify" },
12347
+ { name: "user_ids", type: "array", required: false, description: "Array of user ID strings to notify" },
12348
+ { name: "team_ids", type: "array", required: false, description: "Optional array of team IDs to notify." },
12349
+ { name: "owner_properties", type: "array", required: false, description: "Optional owner-property keys used by some payloads to target owners dynamically." },
11904
12350
  { name: "subject", type: "string", required: true, description: "Email subject" },
11905
12351
  { name: "body", type: "string", required: true, description: "Email body (HTML)" }
11906
12352
  ]
@@ -11911,7 +12357,9 @@ var BUILT_IN_ACTION_TYPES = {
11911
12357
  description: "Send a notification to specified users or teams in HubSpot",
11912
12358
  connectionType: "SINGLE_CONNECTION",
11913
12359
  fields: [
11914
- { name: "user_ids", type: "array", required: true, description: "Array of user ID strings to notify" },
12360
+ { name: "user_ids", type: "array", required: false, description: "Array of user ID strings to notify" },
12361
+ { name: "team_ids", type: "array", required: false, description: "Optional array of team IDs to notify." },
12362
+ { name: "owner_properties", type: "array", required: false, description: "Optional owner-property keys used by some payloads to target owners dynamically." },
11915
12363
  { name: "delivery_method", type: "string", required: true, description: "Delivery method: APP" },
11916
12364
  { name: "subject", type: "string", required: true, description: "Notification subject" },
11917
12365
  { name: "body", type: "string", required: true, description: "Notification body" }
@@ -11923,7 +12371,8 @@ var BUILT_IN_ACTION_TYPES = {
11923
12371
  description: "Evenly distribute enrolled records to selected users or teams. IMPORTANT: user_ids must contain HubSpot user IDs (owners table user_id column), NOT owner IDs (owners table owner_id column) \u2014 these are different values for the same person. Using owner IDs will cause an internal HubSpot error. CONTACT_FLOW requires all three fields (user_ids, target_property, overwrite_current_owner). PLATFORM_FLOW auto-fills target_property and overwrite_current_owner when only user_ids is provided.",
11924
12372
  connectionType: "SINGLE_CONNECTION",
11925
12373
  fields: [
11926
- { name: "user_ids", type: "array", required: true, description: "Array of HubSpot user ID strings to rotate between (can be empty array). IMPORTANT: query the owners table and use the user_id column, NOT owner_id. owner_id and user_id are different values \u2014 using owner_id will cause HubSpot API errors." },
12374
+ { name: "user_ids", type: "array", required: false, description: "Array of HubSpot user ID strings to rotate between. IMPORTANT: query the owners table and use the user_id column, NOT owner_id. owner_id and user_id are different values \u2014 using owner_id will cause HubSpot API errors." },
12375
+ { name: "team_ids", type: "array", required: false, description: "Optional array of team IDs to include in the rotation." },
11927
12376
  { name: "target_property", type: "string", required: true, description: "Owner property to set, e.g. 'hubspot_owner_id'. Required on CONTACT_FLOW; auto-filled on PLATFORM_FLOW." },
11928
12377
  { name: "overwrite_current_owner", type: "string", required: true, description: "'true' or 'false' \u2014 whether to overwrite existing owner. Required on CONTACT_FLOW; auto-filled as 'false' on PLATFORM_FLOW." }
11929
12378
  ]
@@ -11931,13 +12380,13 @@ var BUILT_IN_ACTION_TYPES = {
11931
12380
  "0-14": {
11932
12381
  actionTypeId: "0-14",
11933
12382
  name: "Create record",
11934
- description: "Create a CRM record (contact, company, deal, ticket, lead, custom object)",
12383
+ description: "Create a CRM record and optionally initialize its properties and associations in the same workflow step.",
11935
12384
  connectionType: "SINGLE_CONNECTION",
11936
12385
  fields: [
11937
12386
  { name: "object_type_id", type: "string", required: true, description: "Object type ID to create (e.g. '0-3' for deals, '0-5' for tickets)" },
11938
- { name: "properties", type: "array", required: true, description: "Array of { targetProperty, value: { type: 'STATIC_VALUE', staticValue: 'value' } }. Each value MUST include type: 'STATIC_VALUE'. Omitting type causes HTTP 500." },
11939
- { name: "associations", type: "array", required: false, description: "Association targets for the new record" },
11940
- { name: "use_explicit_associations", type: "string", required: false, description: "'true' to use explicit associations" }
12387
+ { name: "properties", type: "array", required: true, description: "Array of { targetProperty, value } records. Harvested values use OBJECT_PROPERTY, STATIC_VALUE, RELATIVE_DATETIME, and STATIC_APPEND_VALUE variants. STATIC_VALUE payloads must include type: 'STATIC_VALUE' or HubSpot returns HTTP 500." },
12388
+ { name: "associations", type: "array", required: false, description: "Association targets for the new record. Harvested variants include ENROLLED_OBJECT and COPY_ASSOCIATION association values." },
12389
+ { name: "use_explicit_associations", type: "string", required: false, description: "'true' to use explicit associations. Harvested payloads almost always set this when associations are present." }
11941
12390
  ]
11942
12391
  },
11943
12392
  "0-15": {
@@ -11977,10 +12426,22 @@ var BUILT_IN_ACTION_TYPES = {
11977
12426
  "0-29": {
11978
12427
  actionTypeId: "0-29",
11979
12428
  name: "Delay until an event occurs",
11980
- description: "Delay enrolled records until a specified event occurs.",
12429
+ description: "Pause the workflow until a qualifying event occurs or the timeout expires.",
12430
+ connectionType: "SINGLE_CONNECTION",
12431
+ fields: [
12432
+ { name: "expiration_minutes", type: "string", required: true, description: "How long the workflow should wait for the event before timing out" },
12433
+ { name: "event_filter_branches", type: "array", required: false, description: "Optional event filter tree used to define which completed event releases the delay. This follows the same branch-node concepts as LIST_BRANCH event filtering." },
12434
+ { name: "target_object_override", type: "string", required: false, description: "Optional object override used by some harvested event-delay payloads." }
12435
+ ]
12436
+ },
12437
+ "0-28": {
12438
+ actionTypeId: "0-28",
12439
+ name: "Relative delay",
12440
+ description: "Delay execution relative to a target time using a direction such as BEFORE or AFTER.",
11981
12441
  connectionType: "SINGLE_CONNECTION",
11982
12442
  fields: [
11983
- { name: "expiration_minutes", type: "string", required: true, description: "How long the workflow should wait for the event before timing out" }
12443
+ { name: "delay", type: "object", required: true, description: "Relative delay payload with delta, timeUnit, timeOfDay, and daysOfWeek." },
12444
+ { name: "direction", type: "string", required: true, description: "Direction of the relative delay, for example BEFORE." }
11984
12445
  ]
11985
12446
  },
11986
12447
  "0-30": {
@@ -11988,16 +12449,18 @@ var BUILT_IN_ACTION_TYPES = {
11988
12449
  name: "Add to / Remove from ads audience",
11989
12450
  description: "Add or remove contacts from an ads audience",
11990
12451
  connectionType: "SINGLE_CONNECTION",
11991
- fields: []
12452
+ fields: [
12453
+ { name: "audience_id", type: "string", required: true, description: "Ads audience identifier targeted by the action." }
12454
+ ]
11992
12455
  },
11993
12456
  "0-31": {
11994
12457
  actionTypeId: "0-31",
11995
12458
  name: "Set marketing contact status",
11996
- description: "Mark contact as marketing or non-marketing",
12459
+ description: "Change the contact's marketing-contact status for billing and messaging eligibility.",
11997
12460
  connectionType: "SINGLE_CONNECTION",
11998
12461
  fields: [
11999
12462
  { name: "targetContact", type: "string", required: true, description: "Target contact token or fetched object reference, usually '{{ enrolled_object }}' in contact workflows" },
12000
- { name: "marketableType", type: "string", required: true, description: "Marketing status to apply, e.g. 'MARKETABLE' or 'MARKETABLE_UNTIL_RENEWAL'" }
12463
+ { name: "marketableType", type: "string", required: true, description: "Marketing status to apply. Harvested values include MARKETABLE, MARKETABLE_UNTIL_RENEWAL, and NON_MARKETABLE." }
12001
12464
  ]
12002
12465
  },
12003
12466
  "0-35": {
@@ -12012,6 +12475,17 @@ var BUILT_IN_ACTION_TYPES = {
12012
12475
  { name: "time_of_day", type: "object", required: true, description: "Required time of day: { hour: number, minute: number }. HubSpot UI rejects delay-until-date actions without it. If the workflow continues after this delay, the next action should be a STATIC_BRANCH on hs_delay_status rather than a direct business-action connection." }
12013
12476
  ]
12014
12477
  },
12478
+ "0-33": {
12479
+ actionTypeId: "0-33",
12480
+ name: "Render template",
12481
+ description: "Render a template string using named variables resolved from enrolled-record properties or prior workflow outputs.",
12482
+ connectionType: "SINGLE_CONNECTION",
12483
+ fields: [
12484
+ { name: "variables", type: "array", required: true, description: "Named variable bindings used inside the template." },
12485
+ { name: "template", type: "string", required: true, description: "Template source string with variable references." },
12486
+ { name: "locale", type: "string", required: false, description: "Optional locale identifier used during rendering." }
12487
+ ]
12488
+ },
12015
12489
  "0-63809083": {
12016
12490
  actionTypeId: "0-63809083",
12017
12491
  name: "Add to static list",
@@ -12033,12 +12507,12 @@ var BUILT_IN_ACTION_TYPES = {
12033
12507
  "0-43347357": {
12034
12508
  actionTypeId: "0-43347357",
12035
12509
  name: "Manage communication subscriptions",
12036
- description: "Update subscription status, legal basis, and communication consent",
12510
+ description: "Update a contact's communication subscription status, legal basis, and channel-level consent for a specific subscription definition.",
12037
12511
  connectionType: "SINGLE_CONNECTION",
12038
12512
  fields: [
12039
12513
  { name: "targetContact", type: "string", required: true, description: "Target contact token or fetched object reference, e.g. '{{ enrolled_object }}'" },
12040
- { name: "channel", type: "string", required: true, description: "Communication channel, e.g. 'EMAIL'" },
12041
- { name: "optState", type: "string", required: true, description: "Subscription status, e.g. 'OPT_IN' or 'OPT_OUT'" },
12514
+ { name: "channel", type: "string", required: true, description: "Communication channel. Harvested values include EMAIL, SMS, and WHATSAPP." },
12515
+ { name: "optState", type: "string", required: true, description: "Subscription status, e.g. OPT_IN or OPT_OUT." },
12042
12516
  { name: "subscriptionId", type: "string", required: true, description: "HubSpot subscription type ID to update" },
12043
12517
  { name: "legalBasis", type: "string", required: true, description: "Legal basis, e.g. LEGITIMATE_INTEREST_CLIENT, LEGITIMATE_INTEREST_OTHER, PERFORMANCE_OF_CONTRACT, CONSENT_WITH_NOTICE, NON_GDPR" },
12044
12518
  { name: "legalBasisExplanation", type: "string", required: true, description: "Free-text explanation for the selected legal basis" }
@@ -12047,14 +12521,14 @@ var BUILT_IN_ACTION_TYPES = {
12047
12521
  "0-46510720": {
12048
12522
  actionTypeId: "0-46510720",
12049
12523
  name: "Enroll in a sequence",
12050
- description: "Automatically enroll contacts in a sequence",
12524
+ description: "Enroll contacts into a sales sequence with either the contact owner or a specific user as the sender.",
12051
12525
  connectionType: "SINGLE_CONNECTION",
12052
12526
  fields: [
12053
12527
  { name: "sequenceId", type: "string", required: true, description: "HubSpot sequence ID to enroll the contact into" },
12054
12528
  { name: "shouldUseContactTimeZone", type: "string", required: true, description: "'true' or 'false' to send based on the contact's time zone" },
12055
- { name: "senderType", type: "string", required: true, description: "Sequence sender mode, e.g. 'CONTACT_OWNER' or 'SPECIFIC_USER'" },
12056
- { name: "contactOwnerProperty", type: "string", required: false, description: "Owner property used when senderType is 'CONTACT_OWNER', e.g. 'hubspot_owner_id'" },
12057
- { name: "userId", type: "string", required: false, description: "Specific HubSpot user ID used when senderType is 'SPECIFIC_USER'" }
12529
+ { name: "senderType", type: "string", required: true, description: "Sequence sender mode. Harvested values include CONTACT_OWNER and SPECIFIC_USER." },
12530
+ { name: "contactOwnerProperty", type: "string", required: false, description: "Required when senderType is CONTACT_OWNER, usually hubspot_owner_id." },
12531
+ { name: "userId", type: "string", required: false, description: "Required when senderType is SPECIFIC_USER. Must be a HubSpot user ID, not owner_id." }
12058
12532
  ]
12059
12533
  },
12060
12534
  "0-4702372": {
@@ -12095,7 +12569,13 @@ var BUILT_IN_ACTION_TYPES = {
12095
12569
  { name: "fromObjectType", type: "string", required: true, description: "HubSpot object type ID on the source side of the association pair" },
12096
12570
  { name: "toObjectType", type: "string", required: true, description: "HubSpot object type ID on the destination side of the association pair" },
12097
12571
  { name: "labelToApply", type: "string", required: true, description: "Association label type ID to apply" },
12098
- { name: "applyLabelToAllAssociatedObjects", type: "string", required: true, description: "'true' or 'false' to control whether the label applies to all associated objects" }
12572
+ { name: "applyLabelToAllAssociatedObjects", type: "string", required: true, description: "'true' or 'false' to control whether the label applies to all associated objects" },
12573
+ { name: "matchBy", type: "string", required: false, description: "Optional matching strategy used to target specific associated records." },
12574
+ { name: "enrolledObjectPropertyNameToMatch", type: "string", required: false, description: "Optional enrolled-record property used for association matching." },
12575
+ { name: "associatedObjectPropertyNameToMatch", type: "string", required: false, description: "Optional associated-record property used for association matching." },
12576
+ { name: "associatedObjectPropertyName", type: "string", required: false, description: "Optional associated-record property name used by property-based label application variants." },
12577
+ { name: "associatedObjectPropertyOperator", type: "string", required: false, description: "Optional operator used with associatedObjectPropertyName." },
12578
+ { name: "associatedObjectPropertyValue", type: "string", required: false, description: "Optional comparison value used with associatedObjectPropertyName." }
12099
12579
  ]
12100
12580
  },
12101
12581
  "0-61139476": {
@@ -12136,7 +12616,9 @@ var BUILT_IN_ACTION_TYPES = {
12136
12616
  description: "Format phone numbers for calling compatibility",
12137
12617
  connectionType: "SINGLE_CONNECTION",
12138
12618
  fields: [
12139
- { name: "defaultCountryCodeMode", type: "string", required: true, description: "Default country code mode, e.g. 'static_default_country_code', 'dynamic_default_country_code', or 'none'" }
12619
+ { name: "defaultCountryCodeMode", type: "string", required: true, description: "Default country code mode: static_default_country_code, dynamic_default_country_code, or none." },
12620
+ { name: "propertyValue", type: "string", required: false, description: "Optional property token or value source for the phone number being normalized." },
12621
+ { name: "staticDefaultCountryCode", type: "string", required: false, description: "Required when defaultCountryCodeMode is static_default_country_code. Omit it for the other modes." }
12140
12622
  ]
12141
12623
  },
12142
12624
  "0-177946906": {
@@ -12144,14 +12626,20 @@ var BUILT_IN_ACTION_TYPES = {
12144
12626
  name: "Enrich record",
12145
12627
  description: "Enrich contacts or companies with additional data",
12146
12628
  connectionType: "SINGLE_CONNECTION",
12147
- fields: []
12629
+ fields: [
12630
+ { name: "object_to_enrich", type: "string", required: true, description: "Object token or identifier indicating which record should be enriched." },
12631
+ { name: "bi_enrichment_overwrite", type: "string", required: false, description: "Optional boolean-string controlling whether enrichment should overwrite existing values." }
12632
+ ]
12148
12633
  },
12149
12634
  "0-199186210": {
12150
12635
  actionTypeId: "0-199186210",
12151
12636
  name: "Send survey",
12152
12637
  description: "Send a custom survey to enrolled contacts (BETA)",
12153
12638
  connectionType: "SINGLE_CONNECTION",
12154
- fields: []
12639
+ fields: [
12640
+ { name: "survey", type: "string", required: true, description: "Survey identifier to send." },
12641
+ { name: "sendTo", type: "string", required: true, description: "Target recipient token or recipient mode." }
12642
+ ]
12155
12643
  },
12156
12644
  "0-25085031": {
12157
12645
  actionTypeId: "0-25085031",
@@ -12165,7 +12653,23 @@ var BUILT_IN_ACTION_TYPES = {
12165
12653
  name: "Send SMS message",
12166
12654
  description: "Send SMS to enrolled or associated contacts",
12167
12655
  connectionType: "SINGLE_CONNECTION",
12168
- fields: []
12656
+ fields: [
12657
+ { name: "rootMicId", type: "string", required: true, description: "Messaging integration or campaign identifier used by the SMS action." },
12658
+ { name: "targetContact", type: "string", required: true, description: "Target contact token or fetched object reference." }
12659
+ ]
12660
+ },
12661
+ "0-61139484": {
12662
+ actionTypeId: "0-61139484",
12663
+ name: "Update association labels",
12664
+ description: "Replace or apply association labels on existing CRM record associations.",
12665
+ connectionType: "SINGLE_CONNECTION",
12666
+ fields: [
12667
+ { name: "fromObjectType", type: "string", required: true, description: "HubSpot object type ID on the source side of the association pair." },
12668
+ { name: "toObjectType", type: "string", required: true, description: "HubSpot object type ID on the destination side of the association pair." },
12669
+ { name: "labelToUpdate", type: "string", required: true, description: "Existing association label type ID to replace." },
12670
+ { name: "deleteExistingLabel", type: "string", required: true, description: "'true' or 'false' controlling whether the existing label should be removed before applying the new one." },
12671
+ { name: "labelToApply", type: "string", required: true, description: "Association label type ID to apply." }
12672
+ ]
12169
12673
  },
12170
12674
  "0-172351286": {
12171
12675
  actionTypeId: "0-172351286",
@@ -12246,7 +12750,36 @@ var BUILT_IN_ACTION_TYPES = {
12246
12750
  name: "Send Slack notification",
12247
12751
  description: "Send a Slack message via integrated Slack workspace",
12248
12752
  connectionType: "SINGLE_CONNECTION",
12249
- fields: []
12753
+ fields: [
12754
+ { name: "message", type: "string", required: true, description: "Slack message body." },
12755
+ { name: "slackChannelIds", type: "array", required: false, description: "Optional target Slack channel IDs. Provide at least one recipient target across the Slack recipient fields." },
12756
+ { name: "slackUserIds", type: "array", required: false, description: "Optional target Slack user IDs. Provide at least one recipient target across the Slack recipient fields." },
12757
+ { name: "notifyOwner", type: "array", required: false, description: "Optional owner-targeting values harvested as an array in corpus payloads. Provide at least one recipient target across the Slack recipient fields." }
12758
+ ]
12759
+ },
12760
+ CUSTOM_CODE: {
12761
+ actionTypeId: "CUSTOM_CODE",
12762
+ name: "Custom code",
12763
+ description: "Run a HubSpot server-side custom code step with declared inputs, outputs, runtime, and optional secrets.",
12764
+ connectionType: "SINGLE_CONNECTION",
12765
+ fields: [
12766
+ { name: "secretNames", type: "array", required: false, description: "Optional list of secret names exposed to the runtime." },
12767
+ { name: "sourceCode", type: "string", required: true, description: "Custom code source body. It must be valid JavaScript, define exports.main or module.exports.main, and either call callback(...) or return an object containing outputFields." },
12768
+ { name: "runtime", type: "string", required: true, description: "Execution runtime. Harvested corpus currently uses NODE20X." },
12769
+ { name: "inputFields", type: "array", required: false, description: "Optional named inputs passed into the custom code runtime. Harvested input variants include OBJECT_PROPERTY, FIELD_DATA, ENROLLMENT_EVENT_PROPERTY, and FETCHED_OBJECT_PROPERTY." },
12770
+ { name: "outputFields", type: "array", required: false, description: "Optional declared output fields produced by the custom code action. Output types include NUMBER, DATE, STRING, ENUMERATION, DATETIME, and BOOLEAN. ENUMERATION outputs must include an options array." }
12771
+ ]
12772
+ },
12773
+ WEBHOOK: {
12774
+ actionTypeId: "WEBHOOK",
12775
+ name: "Webhook",
12776
+ description: "Send an outbound HTTP request from the workflow to an external webhook endpoint.",
12777
+ connectionType: "SINGLE_CONNECTION",
12778
+ fields: [
12779
+ { name: "method", type: "string", required: true, description: "HTTP method used for the webhook request. Supported values are GET, POST, PUT, PATCH, and DELETE." },
12780
+ { name: "webhookUrl", type: "string", required: true, description: "Target webhook URL." },
12781
+ { name: "queryParams", type: "array", required: false, description: "Optional query parameter definitions attached to the request." }
12782
+ ]
12250
12783
  },
12251
12784
  "1-100451": {
12252
12785
  actionTypeId: "1-100451",
@@ -12291,6 +12824,10 @@ var WORKFLOW_ACTION_CREATE_METADATA_BY_ID = {
12291
12824
  ],
12292
12825
  createGuidanceText: "For CONTACT_FLOW create-task actions, include associations with target { associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 204 }, value { type: 'ENROLLED_OBJECT' }, and use_explicit_associations: 'true'. Omitting these can cause HubSpot to return HTTP 500 even when task_type, subject, and body are present."
12293
12826
  },
12827
+ "0-4": {
12828
+ resourceRequirements: [],
12829
+ createGuidanceText: "Use a real automated marketing email content_id. The ID is not currently queryable from the synced portal metadata, so treat it as not exposed unless you already know it."
12830
+ },
12294
12831
  "0-8": {
12295
12832
  resourceRequirements: [
12296
12833
  {
@@ -12327,6 +12864,14 @@ var WORKFLOW_ACTION_CREATE_METADATA_BY_ID = {
12327
12864
  ],
12328
12865
  createGuidanceText: "On CONTACT_FLOW, always send user_ids, target_property, and overwrite_current_owner together. Use owners.user_id values, never owner_id."
12329
12866
  },
12867
+ "0-23": {
12868
+ resourceRequirements: [],
12869
+ createGuidanceText: "This action is API-incompatible in harvested testing. Keep the type and examples in the catalog, but avoid generating it automatically for write plans."
12870
+ },
12871
+ "0-28": {
12872
+ resourceRequirements: [],
12873
+ createGuidanceText: "Use a relative delay payload in fields.delay with delta, timeUnit, timeOfDay, and daysOfWeek, plus a direction such as BEFORE."
12874
+ },
12330
12875
  "0-15": {
12331
12876
  resourceRequirements: [
12332
12877
  {
@@ -12343,6 +12888,14 @@ var WORKFLOW_ACTION_CREATE_METADATA_BY_ID = {
12343
12888
  resourceRequirements: [],
12344
12889
  createGuidanceText: "When using STATIC_VALUE dates, send a future Unix-milliseconds timestamp. time_of_day is required for reliable creation. If the delay action continues to another step, route it into a STATIC_BRANCH that reads inputValue { actionId: '<delay_action_id>', dataKey: 'hs_delay_status', type: 'FIELD_DATA' } and continues from the DATE_MET_AS_PLANNED branch instead of connecting directly to the next business action."
12345
12890
  },
12891
+ "0-30": {
12892
+ resourceRequirements: [],
12893
+ createGuidanceText: "Use a real ads audience identifier in audience_id. This value is not currently queryable from synced portal metadata."
12894
+ },
12895
+ "0-33": {
12896
+ resourceRequirements: [],
12897
+ createGuidanceText: "Render-template actions should use simple variable bindings backed by enrolled-object properties or prior action outputs."
12898
+ },
12346
12899
  "0-14": {
12347
12900
  resourceRequirements: [],
12348
12901
  createGuidanceText: "Prefer standard object types and explicit STATIC_VALUE property payloads for creation examples. Avoid portal-specific custom object IDs in default templates."
@@ -12355,99 +12908,1698 @@ var WORKFLOW_ACTION_CREATE_METADATA_BY_ID = {
12355
12908
  resolutionMode: "queryable",
12356
12909
  sourceHint: "lists.list_id"
12357
12910
  }
12358
- ],
12359
- createGuidanceText: "Resolve listId from the lists table before creating the workflow."
12911
+ ],
12912
+ createGuidanceText: "Resolve listId from the lists table before creating the workflow."
12913
+ },
12914
+ "0-63863438": {
12915
+ resourceRequirements: [
12916
+ {
12917
+ fieldName: "listId",
12918
+ resourceKind: "list",
12919
+ resolutionMode: "queryable",
12920
+ sourceHint: "lists.list_id"
12921
+ }
12922
+ ],
12923
+ createGuidanceText: "Resolve listId from the lists table before creating the workflow."
12924
+ },
12925
+ "0-43347357": {
12926
+ resourceRequirements: [
12927
+ {
12928
+ fieldName: "subscriptionId",
12929
+ resourceKind: "subscription_definition",
12930
+ resolutionMode: "not_exposed",
12931
+ sourceHint: "HubSpot communication subscription definition ID"
12932
+ }
12933
+ ],
12934
+ createGuidanceText: "Use a real communication subscription definition ID. targetContact can often be '{{ enrolled_object }}' for contact workflows."
12935
+ },
12936
+ "0-46510720": {
12937
+ resourceRequirements: [
12938
+ {
12939
+ fieldName: "sequenceId",
12940
+ resourceKind: "sequence",
12941
+ resolutionMode: "not_exposed",
12942
+ sourceHint: "HubSpot sequence ID"
12943
+ },
12944
+ {
12945
+ fieldName: "userId",
12946
+ resourceKind: "user",
12947
+ resolutionMode: "queryable",
12948
+ sourceHint: "owners.user_id",
12949
+ notes: "Only needed when senderType is SPECIFIC_USER."
12950
+ }
12951
+ ],
12952
+ createGuidanceText: "Use a real sequenceId. Prefer CONTACT_OWNER plus contactOwnerProperty for generic templates, or SPECIFIC_USER plus a valid owners.user_id."
12953
+ },
12954
+ "0-63189541": {
12955
+ resourceRequirements: [
12956
+ {
12957
+ fieldName: "labelToApply",
12958
+ resourceKind: "association_label",
12959
+ resolutionMode: "partially_queryable",
12960
+ sourceHint: "Association label typeId",
12961
+ notes: "May come from existing association labels or a label created earlier in the same plan."
12962
+ }
12963
+ ],
12964
+ createGuidanceText: "For match fields, prefer bare property names over 'objectTypeId/propertyName' prefixes in create templates."
12965
+ },
12966
+ "0-73444249": {
12967
+ resourceRequirements: [
12968
+ {
12969
+ fieldName: "labelToApply",
12970
+ resourceKind: "association_label",
12971
+ resolutionMode: "partially_queryable",
12972
+ sourceHint: "Association label typeId"
12973
+ }
12974
+ ],
12975
+ createGuidanceText: "Use an existing association label typeId for the relevant object pair."
12976
+ },
12977
+ "0-61139476": {
12978
+ resourceRequirements: [
12979
+ {
12980
+ fieldName: "labelToRemove",
12981
+ resourceKind: "association_label",
12982
+ resolutionMode: "partially_queryable",
12983
+ sourceHint: "Association label typeId"
12984
+ }
12985
+ ],
12986
+ createGuidanceText: "Use an existing association label typeId for the relevant object pair."
12987
+ },
12988
+ "0-61139484": {
12989
+ resourceRequirements: [
12990
+ {
12991
+ fieldName: "labelToUpdate",
12992
+ resourceKind: "association_label",
12993
+ resolutionMode: "partially_queryable",
12994
+ sourceHint: "Association label typeId to replace"
12995
+ },
12996
+ {
12997
+ fieldName: "labelToApply",
12998
+ resourceKind: "association_label",
12999
+ resolutionMode: "partially_queryable",
13000
+ sourceHint: "Association label typeId to apply"
13001
+ }
13002
+ ],
13003
+ createGuidanceText: "Use valid association label type IDs for both labelToUpdate and labelToApply, and ensure the from/to object pair matches the label schema."
13004
+ },
13005
+ "0-177946906": {
13006
+ resourceRequirements: [],
13007
+ createGuidanceText: "Use the enrolled record token or another valid object reference for object_to_enrich. bi_enrichment_overwrite is optional."
13008
+ },
13009
+ "0-199186210": {
13010
+ resourceRequirements: [],
13011
+ createGuidanceText: "Use a real survey identifier and a valid recipient selector in sendTo. These values are not currently queryable from synced portal metadata."
13012
+ },
13013
+ "0-40900952": {
13014
+ resourceRequirements: [],
13015
+ createGuidanceText: "Use a real messaging integration identifier in rootMicId and a valid contact token or fetched object reference in targetContact."
13016
+ },
13017
+ "1-179507819": {
13018
+ resourceRequirements: [],
13019
+ createGuidanceText: "Slack notification actions may target channel IDs, user IDs, or owner-derived recipients. Provide a message and at least one recipient target."
13020
+ },
13021
+ CUSTOM_CODE: {
13022
+ resourceRequirements: [],
13023
+ createGuidanceText: "Custom code actions should declare runtime, sourceCode, and any required secrets or input/output field contracts. Avoid embedding portal-specific endpoints or credentials in reusable examples."
13024
+ },
13025
+ WEBHOOK: {
13026
+ resourceRequirements: [],
13027
+ createGuidanceText: "Webhook actions should use a concrete HTTP method and target URL, with queryParams only when required. Sanitize any example endpoints."
13028
+ },
13029
+ "0-44475148": {
13030
+ resourceRequirements: [
13031
+ {
13032
+ fieldName: "Target Inbox",
13033
+ resourceKind: "inbox",
13034
+ resolutionMode: "not_exposed",
13035
+ sourceHint: "HubSpot conversation inbox ID"
13036
+ },
13037
+ {
13038
+ fieldName: "Conversation User",
13039
+ resourceKind: "user",
13040
+ resolutionMode: "queryable",
13041
+ sourceHint: "owners.user_id"
13042
+ }
13043
+ ],
13044
+ createGuidanceText: "Use a real inbox ID and a real HubSpot user ID. Conversation User should be a HubSpot user ID, not an owner ID."
13045
+ }
13046
+ };
13047
+
13048
+ // ../shared/pure/workflow-action-corpus-metadata.ts
13049
+ var WORKFLOW_ACTION_CORPUS_METADATA_BY_ID = {
13050
+ "0-1": {
13051
+ "exampleCount": 1754,
13052
+ "portalCount": 13,
13053
+ "workflowCount": 468,
13054
+ "fieldFrequency": [
13055
+ {
13056
+ "name": "days_of_week",
13057
+ "bucket": "rare_optional",
13058
+ "observedCount": 9,
13059
+ "totalCount": 1754
13060
+ },
13061
+ {
13062
+ "name": "delta",
13063
+ "bucket": "always_observed",
13064
+ "observedCount": 1754,
13065
+ "totalCount": 1754
13066
+ },
13067
+ {
13068
+ "name": "time_of_day",
13069
+ "bucket": "rare_optional",
13070
+ "observedCount": 135,
13071
+ "totalCount": 1754
13072
+ },
13073
+ {
13074
+ "name": "time_unit",
13075
+ "bucket": "always_observed",
13076
+ "observedCount": 1754,
13077
+ "totalCount": 1754
13078
+ },
13079
+ {
13080
+ "name": "time_zone_strategy",
13081
+ "bucket": "rare_optional",
13082
+ "observedCount": 101,
13083
+ "totalCount": 1754
13084
+ }
13085
+ ],
13086
+ "variantInventory": [
13087
+ {
13088
+ "key": "default",
13089
+ "exampleCount": 1754,
13090
+ "description": "Observed harvested variant: default."
13091
+ }
13092
+ ]
13093
+ },
13094
+ "0-3": {
13095
+ "exampleCount": 149,
13096
+ "portalCount": 7,
13097
+ "workflowCount": 134,
13098
+ "fieldFrequency": [
13099
+ {
13100
+ "name": "associations",
13101
+ "bucket": "common_optional",
13102
+ "observedCount": 147,
13103
+ "totalCount": 149
13104
+ },
13105
+ {
13106
+ "name": "body",
13107
+ "bucket": "always_observed",
13108
+ "observedCount": 149,
13109
+ "totalCount": 149
13110
+ },
13111
+ {
13112
+ "name": "due_time",
13113
+ "bucket": "rare_optional",
13114
+ "observedCount": 23,
13115
+ "totalCount": 149
13116
+ },
13117
+ {
13118
+ "name": "owner_assignment",
13119
+ "bucket": "common_optional",
13120
+ "observedCount": 138,
13121
+ "totalCount": 149
13122
+ },
13123
+ {
13124
+ "name": "priority",
13125
+ "bucket": "common_optional",
13126
+ "observedCount": 147,
13127
+ "totalCount": 149
13128
+ },
13129
+ {
13130
+ "name": "queue_id",
13131
+ "bucket": "rare_optional",
13132
+ "observedCount": 7,
13133
+ "totalCount": 149
13134
+ },
13135
+ {
13136
+ "name": "reminder_time",
13137
+ "bucket": "rare_optional",
13138
+ "observedCount": 18,
13139
+ "totalCount": 149
13140
+ },
13141
+ {
13142
+ "name": "subject",
13143
+ "bucket": "always_observed",
13144
+ "observedCount": 149,
13145
+ "totalCount": 149
13146
+ },
13147
+ {
13148
+ "name": "task_type",
13149
+ "bucket": "always_observed",
13150
+ "observedCount": 149,
13151
+ "totalCount": 149
13152
+ },
13153
+ {
13154
+ "name": "use_explicit_associations",
13155
+ "bucket": "always_observed",
13156
+ "observedCount": 149,
13157
+ "totalCount": 149
13158
+ }
13159
+ ],
13160
+ "variantInventory": [
13161
+ {
13162
+ "key": "TODO",
13163
+ "exampleCount": 133,
13164
+ "description": "Observed harvested variant: TODO."
13165
+ },
13166
+ {
13167
+ "key": "EMAIL",
13168
+ "exampleCount": 9,
13169
+ "description": "Observed harvested variant: EMAIL."
13170
+ },
13171
+ {
13172
+ "key": "CALL",
13173
+ "exampleCount": 7,
13174
+ "description": "Observed harvested variant: CALL."
13175
+ }
13176
+ ]
13177
+ },
13178
+ "0-4": {
13179
+ "exampleCount": 1869,
13180
+ "portalCount": 13,
13181
+ "workflowCount": 452,
13182
+ "fieldFrequency": [
13183
+ {
13184
+ "name": "content_id",
13185
+ "bucket": "always_observed",
13186
+ "observedCount": 1869,
13187
+ "totalCount": 1869
13188
+ }
13189
+ ],
13190
+ "variantInventory": [
13191
+ {
13192
+ "key": "default",
13193
+ "exampleCount": 1869,
13194
+ "description": "Observed harvested variant: default."
13195
+ }
13196
+ ]
13197
+ },
13198
+ "0-5": {
13199
+ "exampleCount": 4124,
13200
+ "portalCount": 13,
13201
+ "workflowCount": 1031,
13202
+ "fieldFrequency": [
13203
+ {
13204
+ "name": "association",
13205
+ "bucket": "rare_optional",
13206
+ "observedCount": 330,
13207
+ "totalCount": 4124
13208
+ },
13209
+ {
13210
+ "name": "property_name",
13211
+ "bucket": "always_observed",
13212
+ "observedCount": 4124,
13213
+ "totalCount": 4124
13214
+ },
13215
+ {
13216
+ "name": "value",
13217
+ "bucket": "always_observed",
13218
+ "observedCount": 4124,
13219
+ "totalCount": 4124
13220
+ }
13221
+ ],
13222
+ "variantInventory": [
13223
+ {
13224
+ "key": "STATIC_VALUE",
13225
+ "exampleCount": 3619,
13226
+ "description": "Uses a literal static value payload."
13227
+ },
13228
+ {
13229
+ "key": "FIELD_DATA",
13230
+ "exampleCount": 201,
13231
+ "description": "Uses output from a previous workflow action."
13232
+ },
13233
+ {
13234
+ "key": "OBJECT_PROPERTY",
13235
+ "exampleCount": 96,
13236
+ "description": "Copies a value from an enrolled-object property."
13237
+ },
13238
+ {
13239
+ "key": "FETCHED_OBJECT_PROPERTY",
13240
+ "exampleCount": 83,
13241
+ "description": "Uses a property from a fetched associated record."
13242
+ },
13243
+ {
13244
+ "key": "TIMESTAMP",
13245
+ "exampleCount": 76,
13246
+ "description": "Uses a workflow execution timestamp."
13247
+ },
13248
+ {
13249
+ "key": "STATIC_APPEND_VALUE",
13250
+ "exampleCount": 39,
13251
+ "description": "Appends a static suffix or token to an existing value."
13252
+ },
13253
+ {
13254
+ "key": "ENROLLMENT_EVENT_PROPERTY",
13255
+ "exampleCount": 8,
13256
+ "description": "Uses a property from the enrollment event payload."
13257
+ },
13258
+ {
13259
+ "key": "INCREMENT",
13260
+ "exampleCount": 2,
13261
+ "description": "Increments a numeric property."
13262
+ }
13263
+ ]
13264
+ },
13265
+ "0-8": {
13266
+ "exampleCount": 509,
13267
+ "portalCount": 9,
13268
+ "workflowCount": 248,
13269
+ "fieldFrequency": [
13270
+ {
13271
+ "name": "body",
13272
+ "bucket": "always_observed",
13273
+ "observedCount": 509,
13274
+ "totalCount": 509
13275
+ },
13276
+ {
13277
+ "name": "owner_properties",
13278
+ "bucket": "rare_optional",
13279
+ "observedCount": 44,
13280
+ "totalCount": 509
13281
+ },
13282
+ {
13283
+ "name": "subject",
13284
+ "bucket": "always_observed",
13285
+ "observedCount": 509,
13286
+ "totalCount": 509
13287
+ },
13288
+ {
13289
+ "name": "team_ids",
13290
+ "bucket": "rare_optional",
13291
+ "observedCount": 7,
13292
+ "totalCount": 509
13293
+ },
13294
+ {
13295
+ "name": "user_ids",
13296
+ "bucket": "common_optional",
13297
+ "observedCount": 466,
13298
+ "totalCount": 509
13299
+ }
13300
+ ],
13301
+ "variantInventory": [
13302
+ {
13303
+ "key": "user_recipients",
13304
+ "exampleCount": 460,
13305
+ "description": "Targets explicit HubSpot users."
13306
+ },
13307
+ {
13308
+ "key": "owner_property_recipients",
13309
+ "exampleCount": 42,
13310
+ "description": "Targets owners resolved through owner properties."
13311
+ },
13312
+ {
13313
+ "key": "team_recipients",
13314
+ "exampleCount": 7,
13315
+ "description": "Targets a team instead of explicit users."
13316
+ }
13317
+ ]
13318
+ },
13319
+ "0-9": {
13320
+ "exampleCount": 19,
13321
+ "portalCount": 4,
13322
+ "workflowCount": 13,
13323
+ "fieldFrequency": [
13324
+ {
13325
+ "name": "body",
13326
+ "bucket": "always_observed",
13327
+ "observedCount": 19,
13328
+ "totalCount": 19
13329
+ },
13330
+ {
13331
+ "name": "delivery_method",
13332
+ "bucket": "always_observed",
13333
+ "observedCount": 19,
13334
+ "totalCount": 19
13335
+ },
13336
+ {
13337
+ "name": "owner_properties",
13338
+ "bucket": "rare_optional",
13339
+ "observedCount": 4,
13340
+ "totalCount": 19
13341
+ },
13342
+ {
13343
+ "name": "subject",
13344
+ "bucket": "always_observed",
13345
+ "observedCount": 19,
13346
+ "totalCount": 19
13347
+ },
13348
+ {
13349
+ "name": "team_ids",
13350
+ "bucket": "common_optional",
13351
+ "observedCount": 6,
13352
+ "totalCount": 19
13353
+ },
13354
+ {
13355
+ "name": "user_ids",
13356
+ "bucket": "common_optional",
13357
+ "observedCount": 8,
13358
+ "totalCount": 19
13359
+ }
13360
+ ],
13361
+ "variantInventory": [
13362
+ {
13363
+ "key": "APP",
13364
+ "exampleCount": 19,
13365
+ "description": "Delivers the notification in the HubSpot app."
13366
+ }
13367
+ ]
13368
+ },
13369
+ "0-11": {
13370
+ "exampleCount": 42,
13371
+ "portalCount": 4,
13372
+ "workflowCount": 18,
13373
+ "fieldFrequency": [
13374
+ {
13375
+ "name": "overwrite_current_owner",
13376
+ "bucket": "always_observed",
13377
+ "observedCount": 42,
13378
+ "totalCount": 42
13379
+ },
13380
+ {
13381
+ "name": "target_property",
13382
+ "bucket": "always_observed",
13383
+ "observedCount": 42,
13384
+ "totalCount": 42
13385
+ },
13386
+ {
13387
+ "name": "team_ids",
13388
+ "bucket": "rare_optional",
13389
+ "observedCount": 3,
13390
+ "totalCount": 42
13391
+ },
13392
+ {
13393
+ "name": "user_ids",
13394
+ "bucket": "common_optional",
13395
+ "observedCount": 39,
13396
+ "totalCount": 42
13397
+ }
13398
+ ],
13399
+ "variantInventory": [
13400
+ {
13401
+ "key": "user_rotation",
13402
+ "exampleCount": 39,
13403
+ "description": "Rotates ownership across explicit users."
13404
+ },
13405
+ {
13406
+ "key": "team_rotation",
13407
+ "exampleCount": 3,
13408
+ "description": "Rotates ownership across teams."
13409
+ }
13410
+ ]
13411
+ },
13412
+ "0-14": {
13413
+ "exampleCount": 43,
13414
+ "portalCount": 6,
13415
+ "workflowCount": 31,
13416
+ "fieldFrequency": [
13417
+ {
13418
+ "name": "associations",
13419
+ "bucket": "common_optional",
13420
+ "observedCount": 42,
13421
+ "totalCount": 43
13422
+ },
13423
+ {
13424
+ "name": "object_type_id",
13425
+ "bucket": "always_observed",
13426
+ "observedCount": 43,
13427
+ "totalCount": 43
13428
+ },
13429
+ {
13430
+ "name": "properties",
13431
+ "bucket": "always_observed",
13432
+ "observedCount": 43,
13433
+ "totalCount": 43
13434
+ },
13435
+ {
13436
+ "name": "use_explicit_associations",
13437
+ "bucket": "always_observed",
13438
+ "observedCount": 43,
13439
+ "totalCount": 43
13440
+ }
13441
+ ],
13442
+ "variantInventory": [
13443
+ {
13444
+ "key": "STATIC_VALUE",
13445
+ "exampleCount": 18,
13446
+ "description": "Uses a literal static value payload."
13447
+ },
13448
+ {
13449
+ "key": "OBJECT_PROPERTY+STATIC_VALUE",
13450
+ "exampleCount": 12,
13451
+ "description": "Observed harvested variant: OBJECT_PROPERTY+STATIC_VALUE."
13452
+ },
13453
+ {
13454
+ "key": "OBJECT_PROPERTY+RELATIVE_DATETIME+STATIC_VALUE",
13455
+ "exampleCount": 8,
13456
+ "description": "Observed harvested variant: OBJECT_PROPERTY+RELATIVE_DATETIME+STATIC_VALUE."
13457
+ },
13458
+ {
13459
+ "key": "OBJECT_PROPERTY+STATIC_APPEND_VALUE+STATIC_VALUE",
13460
+ "exampleCount": 3,
13461
+ "description": "Observed harvested variant: OBJECT_PROPERTY+STATIC_APPEND_VALUE+STATIC_VALUE."
13462
+ },
13463
+ {
13464
+ "key": "RELATIVE_DATETIME+STATIC_VALUE",
13465
+ "exampleCount": 1,
13466
+ "description": "Observed harvested variant: RELATIVE_DATETIME+STATIC_VALUE."
13467
+ },
13468
+ {
13469
+ "key": "STATIC_APPEND_VALUE+STATIC_VALUE",
13470
+ "exampleCount": 1,
13471
+ "description": "Observed harvested variant: STATIC_APPEND_VALUE+STATIC_VALUE."
13472
+ }
13473
+ ]
13474
+ },
13475
+ "0-15": {
13476
+ "exampleCount": 61,
13477
+ "portalCount": 3,
13478
+ "workflowCount": 41,
13479
+ "fieldFrequency": [
13480
+ {
13481
+ "name": "flow_id",
13482
+ "bucket": "always_observed",
13483
+ "observedCount": 61,
13484
+ "totalCount": 61
13485
+ }
13486
+ ],
13487
+ "variantInventory": [
13488
+ {
13489
+ "key": "default",
13490
+ "exampleCount": 61,
13491
+ "description": "Observed harvested variant: default."
13492
+ }
13493
+ ]
13494
+ },
13495
+ "0-23": {
13496
+ "exampleCount": 1,
13497
+ "portalCount": 1,
13498
+ "workflowCount": 1,
13499
+ "fieldFrequency": [
13500
+ {
13501
+ "name": "email_content_id",
13502
+ "bucket": "always_observed",
13503
+ "observedCount": 1,
13504
+ "totalCount": 1
13505
+ },
13506
+ {
13507
+ "name": "recipient_emails",
13508
+ "bucket": "always_observed",
13509
+ "observedCount": 1,
13510
+ "totalCount": 1
13511
+ }
13512
+ ],
13513
+ "variantInventory": [
13514
+ {
13515
+ "key": "default",
13516
+ "exampleCount": 1,
13517
+ "description": "Observed harvested variant: default."
13518
+ }
13519
+ ]
13520
+ },
13521
+ "0-28": {
13522
+ "exampleCount": 18,
13523
+ "portalCount": 2,
13524
+ "workflowCount": 8,
13525
+ "fieldFrequency": [
13526
+ {
13527
+ "name": "delay",
13528
+ "bucket": "always_observed",
13529
+ "observedCount": 18,
13530
+ "totalCount": 18
13531
+ },
13532
+ {
13533
+ "name": "direction",
13534
+ "bucket": "always_observed",
13535
+ "observedCount": 18,
13536
+ "totalCount": 18
13537
+ }
13538
+ ],
13539
+ "variantInventory": [
13540
+ {
13541
+ "key": "AFTER",
13542
+ "exampleCount": 9,
13543
+ "description": "Schedules the delay after the reference point."
13544
+ },
13545
+ {
13546
+ "key": "BEFORE",
13547
+ "exampleCount": 9,
13548
+ "description": "Schedules the delay before the reference point."
13549
+ }
13550
+ ]
13551
+ },
13552
+ "0-29": {
13553
+ "exampleCount": 283,
13554
+ "portalCount": 4,
13555
+ "workflowCount": 181,
13556
+ "fieldFrequency": [
13557
+ {
13558
+ "name": "event_filter_branches",
13559
+ "bucket": "common_optional",
13560
+ "observedCount": 276,
13561
+ "totalCount": 283
13562
+ },
13563
+ {
13564
+ "name": "expiration_minutes",
13565
+ "bucket": "always_observed",
13566
+ "observedCount": 283,
13567
+ "totalCount": 283
13568
+ },
13569
+ {
13570
+ "name": "target_object_override",
13571
+ "bucket": "rare_optional",
13572
+ "observedCount": 2,
13573
+ "totalCount": 283
13574
+ }
13575
+ ],
13576
+ "variantInventory": [
13577
+ {
13578
+ "key": "event_filtered",
13579
+ "exampleCount": 276,
13580
+ "description": "Waits on a filtered event branch tree."
13581
+ },
13582
+ {
13583
+ "key": "timeout_only",
13584
+ "exampleCount": 7,
13585
+ "description": "Only uses the expiration timeout fields."
13586
+ }
13587
+ ]
13588
+ },
13589
+ "0-30": {
13590
+ "exampleCount": 7,
13591
+ "portalCount": 2,
13592
+ "workflowCount": 5,
13593
+ "fieldFrequency": [
13594
+ {
13595
+ "name": "audience_id",
13596
+ "bucket": "always_observed",
13597
+ "observedCount": 7,
13598
+ "totalCount": 7
13599
+ }
13600
+ ],
13601
+ "variantInventory": [
13602
+ {
13603
+ "key": "audience_membership",
13604
+ "exampleCount": 7,
13605
+ "description": "Adds or removes a record from a configured audience."
13606
+ }
13607
+ ]
13608
+ },
13609
+ "0-31": {
13610
+ "exampleCount": 336,
13611
+ "portalCount": 10,
13612
+ "workflowCount": 228,
13613
+ "fieldFrequency": [
13614
+ {
13615
+ "name": "marketableType",
13616
+ "bucket": "always_observed",
13617
+ "observedCount": 336,
13618
+ "totalCount": 336
13619
+ },
13620
+ {
13621
+ "name": "targetContact",
13622
+ "bucket": "common_optional",
13623
+ "observedCount": 335,
13624
+ "totalCount": 336
13625
+ }
13626
+ ],
13627
+ "variantInventory": [
13628
+ {
13629
+ "key": "MARKETABLE",
13630
+ "exampleCount": 215,
13631
+ "description": "Marks the contact as marketable."
13632
+ },
13633
+ {
13634
+ "key": "MARKETABLE_UNTIL_RENEWAL",
13635
+ "exampleCount": 121,
13636
+ "description": "Marks the contact as marketable until renewal."
13637
+ }
13638
+ ]
13639
+ },
13640
+ "0-33": {
13641
+ "exampleCount": 21,
13642
+ "portalCount": 2,
13643
+ "workflowCount": 12,
13644
+ "fieldFrequency": [
13645
+ {
13646
+ "name": "locale",
13647
+ "bucket": "always_observed",
13648
+ "observedCount": 21,
13649
+ "totalCount": 21
13650
+ },
13651
+ {
13652
+ "name": "template",
13653
+ "bucket": "always_observed",
13654
+ "observedCount": 21,
13655
+ "totalCount": 21
13656
+ },
13657
+ {
13658
+ "name": "variables",
13659
+ "bucket": "common_optional",
13660
+ "observedCount": 20,
13661
+ "totalCount": 21
13662
+ }
13663
+ ],
13664
+ "variantInventory": [
13665
+ {
13666
+ "key": "localized_template",
13667
+ "exampleCount": 20,
13668
+ "description": "Supplies an explicit locale for template rendering."
13669
+ },
13670
+ {
13671
+ "key": "default_locale_template",
13672
+ "exampleCount": 1,
13673
+ "description": "Relies on the default locale."
13674
+ }
13675
+ ]
13676
+ },
13677
+ "0-35": {
13678
+ "exampleCount": 240,
13679
+ "portalCount": 5,
13680
+ "workflowCount": 206,
13681
+ "fieldFrequency": [
13682
+ {
13683
+ "name": "date",
13684
+ "bucket": "always_observed",
13685
+ "observedCount": 240,
13686
+ "totalCount": 240
13687
+ },
13688
+ {
13689
+ "name": "delta",
13690
+ "bucket": "always_observed",
13691
+ "observedCount": 240,
13692
+ "totalCount": 240
13693
+ },
13694
+ {
13695
+ "name": "time_of_day",
13696
+ "bucket": "common_optional",
13697
+ "observedCount": 230,
13698
+ "totalCount": 240
13699
+ },
13700
+ {
13701
+ "name": "time_unit",
13702
+ "bucket": "always_observed",
13703
+ "observedCount": 240,
13704
+ "totalCount": 240
13705
+ }
13706
+ ],
13707
+ "variantInventory": [
13708
+ {
13709
+ "key": "STATIC_VALUE",
13710
+ "exampleCount": 227,
13711
+ "description": "Uses a literal static value payload."
13712
+ },
13713
+ {
13714
+ "key": "OBJECT_PROPERTY",
13715
+ "exampleCount": 13,
13716
+ "description": "Copies a value from an enrolled-object property."
13717
+ }
13718
+ ]
13719
+ },
13720
+ "0-169425243": {
13721
+ "exampleCount": 21,
13722
+ "portalCount": 2,
13723
+ "workflowCount": 10,
13724
+ "fieldFrequency": [
13725
+ {
13726
+ "name": "note_body",
13727
+ "bucket": "always_observed",
13728
+ "observedCount": 21,
13729
+ "totalCount": 21
13730
+ },
13731
+ {
13732
+ "name": "pin_note",
13733
+ "bucket": "always_observed",
13734
+ "observedCount": 21,
13735
+ "totalCount": 21
13736
+ }
13737
+ ],
13738
+ "variantInventory": [
13739
+ {
13740
+ "key": "default",
13741
+ "exampleCount": 21,
13742
+ "description": "Observed harvested variant: default."
13743
+ }
13744
+ ]
13745
+ },
13746
+ "0-177946906": {
13747
+ "exampleCount": 2,
13748
+ "portalCount": 1,
13749
+ "workflowCount": 1,
13750
+ "fieldFrequency": [
13751
+ {
13752
+ "name": "bi_enrichment_overwrite",
13753
+ "bucket": "always_observed",
13754
+ "observedCount": 2,
13755
+ "totalCount": 2
13756
+ },
13757
+ {
13758
+ "name": "object_to_enrich",
13759
+ "bucket": "always_observed",
13760
+ "observedCount": 2,
13761
+ "totalCount": 2
13762
+ }
13763
+ ],
13764
+ "variantInventory": [
13765
+ {
13766
+ "key": "default",
13767
+ "exampleCount": 2,
13768
+ "description": "Observed harvested variant: default."
13769
+ }
13770
+ ]
13771
+ },
13772
+ "0-18224765": {
13773
+ "exampleCount": 5,
13774
+ "portalCount": 3,
13775
+ "workflowCount": 5,
13776
+ "fieldFrequency": [],
13777
+ "variantInventory": [
13778
+ {
13779
+ "key": "default",
13780
+ "exampleCount": 5,
13781
+ "description": "Observed harvested variant: default."
13782
+ }
13783
+ ]
13784
+ },
13785
+ "0-195318603": {
13786
+ "exampleCount": 0,
13787
+ "portalCount": 0,
13788
+ "workflowCount": 0,
13789
+ "fieldFrequency": [],
13790
+ "variantInventory": []
13791
+ },
13792
+ "0-199186210": {
13793
+ "exampleCount": 4,
13794
+ "portalCount": 1,
13795
+ "workflowCount": 1,
13796
+ "fieldFrequency": [
13797
+ {
13798
+ "name": "sendTo",
13799
+ "bucket": "always_observed",
13800
+ "observedCount": 4,
13801
+ "totalCount": 4
13802
+ },
13803
+ {
13804
+ "name": "survey",
13805
+ "bucket": "always_observed",
13806
+ "observedCount": 4,
13807
+ "totalCount": 4
13808
+ }
13809
+ ],
13810
+ "variantInventory": [
13811
+ {
13812
+ "key": "default",
13813
+ "exampleCount": 4,
13814
+ "description": "Observed harvested variant: default."
13815
+ }
13816
+ ]
13817
+ },
13818
+ "0-219160146": {
13819
+ "exampleCount": 0,
13820
+ "portalCount": 0,
13821
+ "workflowCount": 0,
13822
+ "fieldFrequency": [],
13823
+ "variantInventory": []
13824
+ },
13825
+ "0-219161394": {
13826
+ "exampleCount": 0,
13827
+ "portalCount": 0,
13828
+ "workflowCount": 0,
13829
+ "fieldFrequency": [],
13830
+ "variantInventory": []
13831
+ },
13832
+ "0-225935194": {
13833
+ "exampleCount": 2,
13834
+ "portalCount": 2,
13835
+ "workflowCount": 2,
13836
+ "fieldFrequency": [
13837
+ {
13838
+ "name": "defaultCountryCodeMode",
13839
+ "bucket": "always_observed",
13840
+ "observedCount": 2,
13841
+ "totalCount": 2
13842
+ },
13843
+ {
13844
+ "name": "propertyValue",
13845
+ "bucket": "always_observed",
13846
+ "observedCount": 2,
13847
+ "totalCount": 2
13848
+ },
13849
+ {
13850
+ "name": "staticDefaultCountryCode",
13851
+ "bucket": "always_observed",
13852
+ "observedCount": 2,
13853
+ "totalCount": 2
13854
+ }
13855
+ ],
13856
+ "variantInventory": [
13857
+ {
13858
+ "key": "static_default_country_code",
13859
+ "exampleCount": 2,
13860
+ "description": "Uses a static country code when validating phone numbers."
13861
+ }
13862
+ ]
13863
+ },
13864
+ "0-40900952": {
13865
+ "exampleCount": 84,
13866
+ "portalCount": 1,
13867
+ "workflowCount": 31,
13868
+ "fieldFrequency": [
13869
+ {
13870
+ "name": "rootMicId",
13871
+ "bucket": "common_optional",
13872
+ "observedCount": 82,
13873
+ "totalCount": 84
13874
+ },
13875
+ {
13876
+ "name": "targetContact",
13877
+ "bucket": "always_observed",
13878
+ "observedCount": 84,
13879
+ "totalCount": 84
13880
+ }
13881
+ ],
13882
+ "variantInventory": [
13883
+ {
13884
+ "key": "default",
13885
+ "exampleCount": 84,
13886
+ "description": "Observed harvested variant: default."
13887
+ }
13888
+ ]
13889
+ },
13890
+ "0-43347357": {
13891
+ "exampleCount": 161,
13892
+ "portalCount": 6,
13893
+ "workflowCount": 124,
13894
+ "fieldFrequency": [
13895
+ {
13896
+ "name": "channel",
13897
+ "bucket": "always_observed",
13898
+ "observedCount": 161,
13899
+ "totalCount": 161
13900
+ },
13901
+ {
13902
+ "name": "legalBasis",
13903
+ "bucket": "always_observed",
13904
+ "observedCount": 161,
13905
+ "totalCount": 161
13906
+ },
13907
+ {
13908
+ "name": "legalBasisExplanation",
13909
+ "bucket": "common_optional",
13910
+ "observedCount": 159,
13911
+ "totalCount": 161
13912
+ },
13913
+ {
13914
+ "name": "optState",
13915
+ "bucket": "always_observed",
13916
+ "observedCount": 161,
13917
+ "totalCount": 161
13918
+ },
13919
+ {
13920
+ "name": "subscriptionId",
13921
+ "bucket": "always_observed",
13922
+ "observedCount": 161,
13923
+ "totalCount": 161
13924
+ },
13925
+ {
13926
+ "name": "targetContact",
13927
+ "bucket": "common_optional",
13928
+ "observedCount": 160,
13929
+ "totalCount": 161
13930
+ }
13931
+ ],
13932
+ "variantInventory": [
13933
+ {
13934
+ "key": "EMAIL:OPT_IN",
13935
+ "exampleCount": 141,
13936
+ "description": "Observed harvested variant: EMAIL:OPT_IN."
13937
+ },
13938
+ {
13939
+ "key": "SMS:OPT_IN",
13940
+ "exampleCount": 13,
13941
+ "description": "Observed harvested variant: SMS:OPT_IN."
13942
+ },
13943
+ {
13944
+ "key": "EMAIL:OPT_OUT",
13945
+ "exampleCount": 6,
13946
+ "description": "Observed harvested variant: EMAIL:OPT_OUT."
13947
+ },
13948
+ {
13949
+ "key": "SMS:OPT_OUT",
13950
+ "exampleCount": 1,
13951
+ "description": "Observed harvested variant: SMS:OPT_OUT."
13952
+ }
13953
+ ]
13954
+ },
13955
+ "0-44475148": {
13956
+ "exampleCount": 0,
13957
+ "portalCount": 0,
13958
+ "workflowCount": 0,
13959
+ "fieldFrequency": [],
13960
+ "variantInventory": []
13961
+ },
13962
+ "0-46510720": {
13963
+ "exampleCount": 7,
13964
+ "portalCount": 1,
13965
+ "workflowCount": 7,
13966
+ "fieldFrequency": [
13967
+ {
13968
+ "name": "contactOwnerProperty",
13969
+ "bucket": "always_observed",
13970
+ "observedCount": 7,
13971
+ "totalCount": 7
13972
+ },
13973
+ {
13974
+ "name": "senderType",
13975
+ "bucket": "always_observed",
13976
+ "observedCount": 7,
13977
+ "totalCount": 7
13978
+ },
13979
+ {
13980
+ "name": "sequenceId",
13981
+ "bucket": "always_observed",
13982
+ "observedCount": 7,
13983
+ "totalCount": 7
13984
+ },
13985
+ {
13986
+ "name": "shouldUseContactTimeZone",
13987
+ "bucket": "common_optional",
13988
+ "observedCount": 6,
13989
+ "totalCount": 7
13990
+ }
13991
+ ],
13992
+ "variantInventory": [
13993
+ {
13994
+ "key": "CONTACT_OWNER",
13995
+ "exampleCount": 7,
13996
+ "description": "Uses the enrolled record owner as the sender."
13997
+ }
13998
+ ]
13999
+ },
14000
+ "0-4702372": {
14001
+ "exampleCount": 4,
14002
+ "portalCount": 2,
14003
+ "workflowCount": 4,
14004
+ "fieldFrequency": [],
14005
+ "variantInventory": [
14006
+ {
14007
+ "key": "default",
14008
+ "exampleCount": 4,
14009
+ "description": "Observed harvested variant: default."
14010
+ }
14011
+ ]
14012
+ },
14013
+ "0-61139476": {
14014
+ "exampleCount": 2,
14015
+ "portalCount": 1,
14016
+ "workflowCount": 1,
14017
+ "fieldFrequency": [
14018
+ {
14019
+ "name": "fromObjectType",
14020
+ "bucket": "always_observed",
14021
+ "observedCount": 2,
14022
+ "totalCount": 2
14023
+ },
14024
+ {
14025
+ "name": "fullyDissociate",
14026
+ "bucket": "always_observed",
14027
+ "observedCount": 2,
14028
+ "totalCount": 2
14029
+ },
14030
+ {
14031
+ "name": "labelToRemove",
14032
+ "bucket": "always_observed",
14033
+ "observedCount": 2,
14034
+ "totalCount": 2
14035
+ },
14036
+ {
14037
+ "name": "toObjectType",
14038
+ "bucket": "always_observed",
14039
+ "observedCount": 2,
14040
+ "totalCount": 2
14041
+ }
14042
+ ],
14043
+ "variantInventory": [
14044
+ {
14045
+ "key": "default",
14046
+ "exampleCount": 2,
14047
+ "description": "Observed harvested variant: default."
14048
+ }
14049
+ ]
14050
+ },
14051
+ "0-61139484": {
14052
+ "exampleCount": 7,
14053
+ "portalCount": 1,
14054
+ "workflowCount": 2,
14055
+ "fieldFrequency": [
14056
+ {
14057
+ "name": "deleteExistingLabel",
14058
+ "bucket": "always_observed",
14059
+ "observedCount": 7,
14060
+ "totalCount": 7
14061
+ },
14062
+ {
14063
+ "name": "fromObjectType",
14064
+ "bucket": "always_observed",
14065
+ "observedCount": 7,
14066
+ "totalCount": 7
14067
+ },
14068
+ {
14069
+ "name": "labelToApply",
14070
+ "bucket": "always_observed",
14071
+ "observedCount": 7,
14072
+ "totalCount": 7
14073
+ },
14074
+ {
14075
+ "name": "labelToUpdate",
14076
+ "bucket": "always_observed",
14077
+ "observedCount": 7,
14078
+ "totalCount": 7
14079
+ },
14080
+ {
14081
+ "name": "toObjectType",
14082
+ "bucket": "always_observed",
14083
+ "observedCount": 7,
14084
+ "totalCount": 7
14085
+ }
14086
+ ],
14087
+ "variantInventory": [
14088
+ {
14089
+ "key": "replace_existing",
14090
+ "exampleCount": 7,
14091
+ "description": "Deletes an existing label before applying the new label."
14092
+ }
14093
+ ]
14094
+ },
14095
+ "0-63189541": {
14096
+ "exampleCount": 330,
14097
+ "portalCount": 3,
14098
+ "workflowCount": 207,
14099
+ "fieldFrequency": [
14100
+ {
14101
+ "name": "associatedObjectPropertyNameToMatch",
14102
+ "bucket": "common_optional",
14103
+ "observedCount": 329,
14104
+ "totalCount": 330
14105
+ },
14106
+ {
14107
+ "name": "createAssociationOnly",
14108
+ "bucket": "always_observed",
14109
+ "observedCount": 330,
14110
+ "totalCount": 330
14111
+ },
14112
+ {
14113
+ "name": "enrolledObjectPropertyNameToMatch",
14114
+ "bucket": "always_observed",
14115
+ "observedCount": 330,
14116
+ "totalCount": 330
14117
+ },
14118
+ {
14119
+ "name": "fromObjectType",
14120
+ "bucket": "always_observed",
14121
+ "observedCount": 330,
14122
+ "totalCount": 330
14123
+ },
14124
+ {
14125
+ "name": "labelToApply",
14126
+ "bucket": "common_optional",
14127
+ "observedCount": 219,
14128
+ "totalCount": 330
14129
+ },
14130
+ {
14131
+ "name": "matchBy",
14132
+ "bucket": "always_observed",
14133
+ "observedCount": 330,
14134
+ "totalCount": 330
14135
+ },
14136
+ {
14137
+ "name": "toObjectType",
14138
+ "bucket": "always_observed",
14139
+ "observedCount": 330,
14140
+ "totalCount": 330
14141
+ }
14142
+ ],
14143
+ "variantInventory": [
14144
+ {
14145
+ "key": "fromAndToObjects",
14146
+ "exampleCount": 330,
14147
+ "description": "Observed harvested variant: fromAndToObjects."
14148
+ }
14149
+ ]
14150
+ },
14151
+ "0-63809083": {
14152
+ "exampleCount": 442,
14153
+ "portalCount": 8,
14154
+ "workflowCount": 279,
14155
+ "fieldFrequency": [
14156
+ {
14157
+ "name": "listId",
14158
+ "bucket": "common_optional",
14159
+ "observedCount": 441,
14160
+ "totalCount": 442
14161
+ }
14162
+ ],
14163
+ "variantInventory": [
14164
+ {
14165
+ "key": "default",
14166
+ "exampleCount": 442,
14167
+ "description": "Observed harvested variant: default."
14168
+ }
14169
+ ]
14170
+ },
14171
+ "0-63863438": {
14172
+ "exampleCount": 18,
14173
+ "portalCount": 3,
14174
+ "workflowCount": 11,
14175
+ "fieldFrequency": [
14176
+ {
14177
+ "name": "listId",
14178
+ "bucket": "always_observed",
14179
+ "observedCount": 18,
14180
+ "totalCount": 18
14181
+ }
14182
+ ],
14183
+ "variantInventory": [
14184
+ {
14185
+ "key": "default",
14186
+ "exampleCount": 18,
14187
+ "description": "Observed harvested variant: default."
14188
+ }
14189
+ ]
14190
+ },
14191
+ "0-73444249": {
14192
+ "exampleCount": 16,
14193
+ "portalCount": 3,
14194
+ "workflowCount": 10,
14195
+ "fieldFrequency": [
14196
+ {
14197
+ "name": "applyLabelToAllAssociatedObjects",
14198
+ "bucket": "always_observed",
14199
+ "observedCount": 16,
14200
+ "totalCount": 16
14201
+ },
14202
+ {
14203
+ "name": "associatedObjectPropertyName",
14204
+ "bucket": "common_optional",
14205
+ "observedCount": 7,
14206
+ "totalCount": 16
14207
+ },
14208
+ {
14209
+ "name": "associatedObjectPropertyNameToMatch",
14210
+ "bucket": "common_optional",
14211
+ "observedCount": 5,
14212
+ "totalCount": 16
14213
+ },
14214
+ {
14215
+ "name": "associatedObjectPropertyOperator",
14216
+ "bucket": "common_optional",
14217
+ "observedCount": 7,
14218
+ "totalCount": 16
14219
+ },
14220
+ {
14221
+ "name": "associatedObjectPropertyValue",
14222
+ "bucket": "common_optional",
14223
+ "observedCount": 7,
14224
+ "totalCount": 16
14225
+ },
14226
+ {
14227
+ "name": "enrolledObjectPropertyNameToMatch",
14228
+ "bucket": "common_optional",
14229
+ "observedCount": 5,
14230
+ "totalCount": 16
14231
+ },
14232
+ {
14233
+ "name": "fromObjectType",
14234
+ "bucket": "always_observed",
14235
+ "observedCount": 16,
14236
+ "totalCount": 16
14237
+ },
14238
+ {
14239
+ "name": "labelToApply",
14240
+ "bucket": "always_observed",
14241
+ "observedCount": 16,
14242
+ "totalCount": 16
14243
+ },
14244
+ {
14245
+ "name": "matchBy",
14246
+ "bucket": "common_optional",
14247
+ "observedCount": 12,
14248
+ "totalCount": 16
14249
+ },
14250
+ {
14251
+ "name": "toObjectType",
14252
+ "bucket": "always_observed",
14253
+ "observedCount": 16,
14254
+ "totalCount": 16
14255
+ }
14256
+ ],
14257
+ "variantInventory": [
14258
+ {
14259
+ "key": "property_match",
14260
+ "exampleCount": 12,
14261
+ "description": "Matches records using property-based association criteria."
14262
+ },
14263
+ {
14264
+ "key": "all_associated",
14265
+ "exampleCount": 4,
14266
+ "description": "Applies the label to all associated records."
14267
+ }
14268
+ ]
14269
+ },
14270
+ "1-179507819": {
14271
+ "exampleCount": 20,
14272
+ "portalCount": 1,
14273
+ "workflowCount": 11,
14274
+ "fieldFrequency": [
14275
+ {
14276
+ "name": "message",
14277
+ "bucket": "always_observed",
14278
+ "observedCount": 20,
14279
+ "totalCount": 20
14280
+ },
14281
+ {
14282
+ "name": "notifyOwner",
14283
+ "bucket": "common_optional",
14284
+ "observedCount": 17,
14285
+ "totalCount": 20
14286
+ },
14287
+ {
14288
+ "name": "slackChannelIds",
14289
+ "bucket": "common_optional",
14290
+ "observedCount": 12,
14291
+ "totalCount": 20
14292
+ },
14293
+ {
14294
+ "name": "slackUserIds",
14295
+ "bucket": "common_optional",
14296
+ "observedCount": 10,
14297
+ "totalCount": 20
14298
+ }
14299
+ ],
14300
+ "variantInventory": [
14301
+ {
14302
+ "key": "channel_delivery",
14303
+ "exampleCount": 11,
14304
+ "description": "Sends the Slack notification to channels."
14305
+ },
14306
+ {
14307
+ "key": "owner_delivery",
14308
+ "exampleCount": 4,
14309
+ "description": "Sends the Slack notification to resolved record owners."
14310
+ },
14311
+ {
14312
+ "key": "user_delivery",
14313
+ "exampleCount": 4,
14314
+ "description": "Sends the Slack notification to specific Slack users."
14315
+ },
14316
+ {
14317
+ "key": "message_only",
14318
+ "exampleCount": 1,
14319
+ "description": "Carries only the message payload in harvested examples."
14320
+ }
14321
+ ]
14322
+ },
14323
+ "AB_TEST_BRANCH": {
14324
+ "exampleCount": 41,
14325
+ "portalCount": 2,
14326
+ "workflowCount": 24,
14327
+ "fieldFrequency": [
14328
+ {
14329
+ "name": "testBranches",
14330
+ "bucket": "always_observed",
14331
+ "observedCount": 41,
14332
+ "totalCount": 41
14333
+ }
14334
+ ],
14335
+ "variantInventory": [
14336
+ {
14337
+ "key": "10_branches",
14338
+ "exampleCount": 9,
14339
+ "description": "Observed harvested variant: 10_branches."
14340
+ },
14341
+ {
14342
+ "key": "6_branches",
14343
+ "exampleCount": 7,
14344
+ "description": "Observed harvested variant: 6_branches."
14345
+ },
14346
+ {
14347
+ "key": "2_branches",
14348
+ "exampleCount": 6,
14349
+ "description": "Two weighted branch targets."
14350
+ },
14351
+ {
14352
+ "key": "4_branches",
14353
+ "exampleCount": 6,
14354
+ "description": "Observed harvested variant: 4_branches."
14355
+ },
14356
+ {
14357
+ "key": "5_branches",
14358
+ "exampleCount": 5,
14359
+ "description": "Observed harvested variant: 5_branches."
14360
+ },
14361
+ {
14362
+ "key": "9_branches",
14363
+ "exampleCount": 3,
14364
+ "description": "Observed harvested variant: 9_branches."
14365
+ },
14366
+ {
14367
+ "key": "7_branches",
14368
+ "exampleCount": 2,
14369
+ "description": "Observed harvested variant: 7_branches."
14370
+ },
14371
+ {
14372
+ "key": "1_branches",
14373
+ "exampleCount": 1,
14374
+ "description": "Single weighted branch target."
14375
+ }
14376
+ ]
12360
14377
  },
12361
- "0-63863438": {
12362
- resourceRequirements: [
14378
+ "CUSTOM_CODE": {
14379
+ "exampleCount": 682,
14380
+ "portalCount": 7,
14381
+ "workflowCount": 222,
14382
+ "fieldFrequency": [
12363
14383
  {
12364
- fieldName: "listId",
12365
- resourceKind: "list",
12366
- resolutionMode: "queryable",
12367
- sourceHint: "lists.list_id"
14384
+ "name": "inputFields",
14385
+ "bucket": "always_observed",
14386
+ "observedCount": 682,
14387
+ "totalCount": 682
14388
+ },
14389
+ {
14390
+ "name": "outputFields",
14391
+ "bucket": "always_observed",
14392
+ "observedCount": 682,
14393
+ "totalCount": 682
14394
+ },
14395
+ {
14396
+ "name": "runtime",
14397
+ "bucket": "always_observed",
14398
+ "observedCount": 682,
14399
+ "totalCount": 682
14400
+ },
14401
+ {
14402
+ "name": "secretNames",
14403
+ "bucket": "always_observed",
14404
+ "observedCount": 682,
14405
+ "totalCount": 682
14406
+ },
14407
+ {
14408
+ "name": "sourceCode",
14409
+ "bucket": "always_observed",
14410
+ "observedCount": 682,
14411
+ "totalCount": 682
12368
14412
  }
12369
14413
  ],
12370
- createGuidanceText: "Resolve listId from the lists table before creating the workflow."
12371
- },
12372
- "0-43347357": {
12373
- resourceRequirements: [
14414
+ "variantInventory": [
12374
14415
  {
12375
- fieldName: "subscriptionId",
12376
- resourceKind: "subscription_definition",
12377
- resolutionMode: "not_exposed",
12378
- sourceHint: "HubSpot communication subscription definition ID"
14416
+ "key": "inputs:OBJECT_PROPERTY|outputs:STRING|secrets:yes",
14417
+ "exampleCount": 74,
14418
+ "description": "Observed harvested variant: inputs:OBJECT_PROPERTY|outputs:STRING|secrets:yes."
14419
+ },
14420
+ {
14421
+ "key": "inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:ENUMERATION+STRING|secrets:yes",
14422
+ "exampleCount": 73,
14423
+ "description": "Observed harvested variant: inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:ENUMERATION+STRING|secrets:yes."
14424
+ },
14425
+ {
14426
+ "key": "inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:BOOLEAN|secrets:no",
14427
+ "exampleCount": 67,
14428
+ "description": "Observed harvested variant: inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:BOOLEAN|secrets:no."
14429
+ },
14430
+ {
14431
+ "key": "inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:NUMBER+STRING|secrets:no",
14432
+ "exampleCount": 52,
14433
+ "description": "Observed harvested variant: inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:NUMBER+STRING|secrets:no."
14434
+ },
14435
+ {
14436
+ "key": "inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:none|secrets:yes",
14437
+ "exampleCount": 33,
14438
+ "description": "Observed harvested variant: inputs:FETCHED_OBJECT_PROPERTY+OBJECT_PROPERTY|outputs:none|secrets:yes."
14439
+ },
14440
+ {
14441
+ "key": "inputs:OBJECT_PROPERTY|outputs:STRING|secrets:no",
14442
+ "exampleCount": 33,
14443
+ "description": "Observed harvested variant: inputs:OBJECT_PROPERTY|outputs:STRING|secrets:no."
14444
+ },
14445
+ {
14446
+ "key": "inputs:OBJECT_PROPERTY|outputs:none|secrets:yes",
14447
+ "exampleCount": 24,
14448
+ "description": "Observed harvested variant: inputs:OBJECT_PROPERTY|outputs:none|secrets:yes."
14449
+ },
14450
+ {
14451
+ "key": "inputs:OBJECT_PROPERTY|outputs:NUMBER+STRING|secrets:yes",
14452
+ "exampleCount": 22,
14453
+ "description": "Observed harvested variant: inputs:OBJECT_PROPERTY|outputs:NUMBER+STRING|secrets:yes."
12379
14454
  }
12380
- ],
12381
- createGuidanceText: "Use a real communication subscription definition ID. targetContact can often be '{{ enrolled_object }}' for contact workflows."
14455
+ ]
12382
14456
  },
12383
- "0-46510720": {
12384
- resourceRequirements: [
14457
+ "LIST_BRANCH": {
14458
+ "exampleCount": 1724,
14459
+ "portalCount": 12,
14460
+ "workflowCount": 670,
14461
+ "fieldFrequency": [
12385
14462
  {
12386
- fieldName: "sequenceId",
12387
- resourceKind: "sequence",
12388
- resolutionMode: "not_exposed",
12389
- sourceHint: "HubSpot sequence ID"
14463
+ "name": "defaultBranch",
14464
+ "bucket": "always_observed",
14465
+ "observedCount": 1724,
14466
+ "totalCount": 1724
12390
14467
  },
12391
14468
  {
12392
- fieldName: "userId",
12393
- resourceKind: "user",
12394
- resolutionMode: "queryable",
12395
- sourceHint: "owners.user_id",
12396
- notes: "Only needed when senderType is SPECIFIC_USER."
14469
+ "name": "defaultBranchName",
14470
+ "bucket": "always_observed",
14471
+ "observedCount": 1724,
14472
+ "totalCount": 1724
14473
+ },
14474
+ {
14475
+ "name": "listBranches",
14476
+ "bucket": "always_observed",
14477
+ "observedCount": 1724,
14478
+ "totalCount": 1724
12397
14479
  }
12398
14480
  ],
12399
- createGuidanceText: "Use a real sequenceId. Prefer CONTACT_OWNER plus contactOwnerProperty for generic templates, or SPECIFIC_USER plus a valid owners.user_id."
12400
- },
12401
- "0-63189541": {
12402
- resourceRequirements: [
14481
+ "variantInventory": [
12403
14482
  {
12404
- fieldName: "labelToApply",
12405
- resourceKind: "association_label",
12406
- resolutionMode: "partially_queryable",
12407
- sourceHint: "Association label typeId",
12408
- notes: "May come from existing association labels or a label created earlier in the same plan."
14483
+ "key": "AND+ASSOCIATION+OR+PROPERTY",
14484
+ "exampleCount": 703,
14485
+ "description": "Observed harvested variant: AND+ASSOCIATION+OR+PROPERTY."
14486
+ },
14487
+ {
14488
+ "key": "AND+OR+PROPERTY",
14489
+ "exampleCount": 663,
14490
+ "description": "Observed harvested variant: AND+OR+PROPERTY."
14491
+ },
14492
+ {
14493
+ "key": "AND+IN_LIST+OR+PROPERTY",
14494
+ "exampleCount": 67,
14495
+ "description": "Observed harvested variant: AND+IN_LIST+OR+PROPERTY."
14496
+ },
14497
+ {
14498
+ "key": "AND+IN_LIST+OR",
14499
+ "exampleCount": 59,
14500
+ "description": "Observed harvested variant: AND+IN_LIST+OR."
14501
+ },
14502
+ {
14503
+ "key": "AND+ASSOCIATION+EMAIL_EVENT+FORM_SUBMISSION_ON_PAGE+OR+PROPERTY",
14504
+ "exampleCount": 58,
14505
+ "description": "Observed harvested variant: AND+ASSOCIATION+EMAIL_EVENT+FORM_SUBMISSION_ON_PAGE+OR+PROPERTY."
14506
+ },
14507
+ {
14508
+ "key": "AND+EMAIL_EVENT+OR",
14509
+ "exampleCount": 43,
14510
+ "description": "Observed harvested variant: AND+EMAIL_EVENT+OR."
14511
+ },
14512
+ {
14513
+ "key": "AND+ASSOCIATION+FORM_SUBMISSION_ON_PAGE+OR+PROPERTY",
14514
+ "exampleCount": 36,
14515
+ "description": "Observed harvested variant: AND+ASSOCIATION+FORM_SUBMISSION_ON_PAGE+OR+PROPERTY."
14516
+ },
14517
+ {
14518
+ "key": "AND+ASSOCIATION+FORM_SUBMISSION+OR+PROPERTY",
14519
+ "exampleCount": 29,
14520
+ "description": "Observed harvested variant: AND+ASSOCIATION+FORM_SUBMISSION+OR+PROPERTY."
12409
14521
  }
12410
- ],
12411
- createGuidanceText: "For match fields, prefer bare property names over 'objectTypeId/propertyName' prefixes in create templates."
14522
+ ]
12412
14523
  },
12413
- "0-73444249": {
12414
- resourceRequirements: [
14524
+ "STATIC_BRANCH": {
14525
+ "exampleCount": 721,
14526
+ "portalCount": 10,
14527
+ "workflowCount": 338,
14528
+ "fieldFrequency": [
12415
14529
  {
12416
- fieldName: "labelToApply",
12417
- resourceKind: "association_label",
12418
- resolutionMode: "partially_queryable",
12419
- sourceHint: "Association label typeId"
14530
+ "name": "defaultBranch",
14531
+ "bucket": "always_observed",
14532
+ "observedCount": 721,
14533
+ "totalCount": 721
14534
+ },
14535
+ {
14536
+ "name": "defaultBranchName",
14537
+ "bucket": "always_observed",
14538
+ "observedCount": 721,
14539
+ "totalCount": 721
14540
+ },
14541
+ {
14542
+ "name": "inputValue",
14543
+ "bucket": "always_observed",
14544
+ "observedCount": 721,
14545
+ "totalCount": 721
14546
+ },
14547
+ {
14548
+ "name": "staticBranches",
14549
+ "bucket": "always_observed",
14550
+ "observedCount": 721,
14551
+ "totalCount": 721
12420
14552
  }
12421
14553
  ],
12422
- createGuidanceText: "Use an existing association label typeId for the relevant object pair."
12423
- },
12424
- "0-61139476": {
12425
- resourceRequirements: [
14554
+ "variantInventory": [
12426
14555
  {
12427
- fieldName: "labelToRemove",
12428
- resourceKind: "association_label",
12429
- resolutionMode: "partially_queryable",
12430
- sourceHint: "Association label typeId"
14556
+ "key": "FIELD_DATA",
14557
+ "exampleCount": 493,
14558
+ "description": "Uses output from a previous workflow action."
14559
+ },
14560
+ {
14561
+ "key": "OBJECT_PROPERTY",
14562
+ "exampleCount": 225,
14563
+ "description": "Copies a value from an enrolled-object property."
14564
+ },
14565
+ {
14566
+ "key": "FETCHED_OBJECT_PROPERTY",
14567
+ "exampleCount": 3,
14568
+ "description": "Uses a property from a fetched associated record."
12431
14569
  }
12432
- ],
12433
- createGuidanceText: "Use an existing association label typeId for the relevant object pair."
14570
+ ]
12434
14571
  },
12435
- "0-44475148": {
12436
- resourceRequirements: [
14572
+ "WEBHOOK": {
14573
+ "exampleCount": 2,
14574
+ "portalCount": 2,
14575
+ "workflowCount": 2,
14576
+ "fieldFrequency": [
12437
14577
  {
12438
- fieldName: "Target Inbox",
12439
- resourceKind: "inbox",
12440
- resolutionMode: "not_exposed",
12441
- sourceHint: "HubSpot conversation inbox ID"
14578
+ "name": "method",
14579
+ "bucket": "always_observed",
14580
+ "observedCount": 2,
14581
+ "totalCount": 2
12442
14582
  },
12443
14583
  {
12444
- fieldName: "Conversation User",
12445
- resourceKind: "user",
12446
- resolutionMode: "queryable",
12447
- sourceHint: "owners.user_id"
14584
+ "name": "queryParams",
14585
+ "bucket": "always_observed",
14586
+ "observedCount": 2,
14587
+ "totalCount": 2
14588
+ },
14589
+ {
14590
+ "name": "webhookUrl",
14591
+ "bucket": "always_observed",
14592
+ "observedCount": 2,
14593
+ "totalCount": 2
12448
14594
  }
12449
14595
  ],
12450
- createGuidanceText: "Use a real inbox ID and a real HubSpot user ID. Conversation User should be a HubSpot user ID, not an owner ID."
14596
+ "variantInventory": [
14597
+ {
14598
+ "key": "POST",
14599
+ "exampleCount": 2,
14600
+ "description": "Observed harvested variant: POST."
14601
+ }
14602
+ ]
12451
14603
  }
12452
14604
  };
12453
14605
 
@@ -12533,6 +14685,10 @@ var KNOWN_GUARDRAILS_BY_ACTION_TYPE_ID = {
12533
14685
  {
12534
14686
  code: "USER_IDS_ARRAY",
12535
14687
  message: "user_ids must be an array of HubSpot user ID strings."
14688
+ },
14689
+ {
14690
+ code: "RECIPIENT_SOURCE_REQUIRED",
14691
+ message: "At least one of user_ids or team_ids must contain a rotation target."
12536
14692
  }
12537
14693
  ],
12538
14694
  "0-3": [
@@ -12541,6 +14697,66 @@ var KNOWN_GUARDRAILS_BY_ACTION_TYPE_ID = {
12541
14697
  message: "In CONTACT_FLOW, include use_explicit_associations: 'true' and an enrolled-contact association via associationTypeId 204 or HubSpot may return HTTP 500."
12542
14698
  }
12543
14699
  ],
14700
+ "0-225935194": [
14701
+ {
14702
+ code: "STATIC_COUNTRY_CODE_MODE_REQUIREMENT",
14703
+ message: "staticDefaultCountryCode is required only when defaultCountryCodeMode is static_default_country_code."
14704
+ }
14705
+ ],
14706
+ "0-46510720": [
14707
+ {
14708
+ code: "SENDER_MODE_DEPENDENCIES",
14709
+ message: "CONTACT_OWNER requires contactOwnerProperty; SPECIFIC_USER requires userId."
14710
+ }
14711
+ ],
14712
+ "1-179507819": [
14713
+ {
14714
+ code: "SLACK_RECIPIENT_TARGET_REQUIRED",
14715
+ message: "Provide at least one recipient target in slackChannelIds, slackUserIds, or notifyOwner."
14716
+ }
14717
+ ],
14718
+ CUSTOM_CODE: [
14719
+ {
14720
+ code: "ENUM_OUTPUT_OPTIONS_REQUIRED",
14721
+ message: "CUSTOM_CODE outputFields with type ENUMERATION must include a non-empty options array."
14722
+ },
14723
+ {
14724
+ code: "EXPORTS_MAIN_REQUIRED",
14725
+ message: "sourceCode must define exports.main or module.exports.main."
14726
+ },
14727
+ {
14728
+ code: "CALLBACK_OR_RETURN_CONTRACT",
14729
+ message: "sourceCode must either call callback(...) or return an object containing outputFields."
14730
+ },
14731
+ {
14732
+ code: "DECLARED_IO_MUST_BE_REFERENCED",
14733
+ message: "Declared inputFields, outputFields, and secretNames should all be referenced in sourceCode."
14734
+ },
14735
+ {
14736
+ code: "DANGEROUS_CONSTRUCTS_REJECTED",
14737
+ message: "sourceCode must not use eval, dynamic Function construction, child_process, shell execution, or filesystem writes."
14738
+ }
14739
+ ],
14740
+ WEBHOOK: [
14741
+ {
14742
+ code: "WEBHOOK_METHOD_ENUM",
14743
+ message: "method must be one of GET, POST, PUT, PATCH, or DELETE."
14744
+ }
14745
+ ],
14746
+ LIST_BRANCH: [
14747
+ {
14748
+ code: "LOGICAL_NODE_NON_EMPTY",
14749
+ message: "AND and OR LIST_BRANCH nodes must include at least one filter or child branch."
14750
+ },
14751
+ {
14752
+ code: "ASSOCIATION_NODE_SHAPE",
14753
+ message: "ASSOCIATION nodes require associationCategory, associationTypeId, objectTypeId, and operator: 'IN_LIST'."
14754
+ },
14755
+ {
14756
+ code: "UNIFIED_EVENTS_NODE_SHAPE",
14757
+ message: "UNIFIED_EVENTS nodes require eventTypeId and operator: 'HAS_COMPLETED', and do not accept direct filters."
14758
+ }
14759
+ ],
12544
14760
  STATIC_BRANCH: [
12545
14761
  {
12546
14762
  code: "FIELD_DATA_SOURCE_MUST_EXIST",
@@ -12574,6 +14790,32 @@ var CONTEXT_CONSTRAINTS_BY_ACTION_TYPE_ID = {
12574
14790
  condition: "workflow_type = PLATFORM_FLOW",
12575
14791
  requirement: "target_property and overwrite_current_owner may be omitted because HubSpot auto-fills them."
12576
14792
  }
14793
+ ],
14794
+ "0-225935194": [
14795
+ {
14796
+ condition: "fields.defaultCountryCodeMode = static_default_country_code",
14797
+ requirement: "Set staticDefaultCountryCode to a valid ISO country code string."
14798
+ }
14799
+ ],
14800
+ "0-46510720": [
14801
+ {
14802
+ condition: "fields.senderType = CONTACT_OWNER",
14803
+ requirement: "Provide contactOwnerProperty, usually hubspot_owner_id."
14804
+ },
14805
+ {
14806
+ condition: "fields.senderType = SPECIFIC_USER",
14807
+ requirement: "Provide userId with a HubSpot user ID from the owners.user_id column."
14808
+ }
14809
+ ],
14810
+ LIST_BRANCH: [
14811
+ {
14812
+ condition: "node.filterBranchType = ASSOCIATION",
14813
+ requirement: "Set associationCategory, associationTypeId, objectTypeId, and operator: 'IN_LIST' on that node."
14814
+ },
14815
+ {
14816
+ condition: "node.filterBranchType = UNIFIED_EVENTS",
14817
+ requirement: "Set eventTypeId and operator: 'HAS_COMPLETED' on that node and keep direct filters empty."
14818
+ }
12577
14819
  ]
12578
14820
  };
12579
14821
  var toLookupRequirements = (requirements) => requirements.map((requirement) => {
@@ -12593,6 +14835,13 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12593
14835
  const knownGuardrails = KNOWN_GUARDRAILS_BY_ACTION_TYPE_ID[actionTypeId] ?? [];
12594
14836
  const contextConstraints = CONTEXT_CONSTRAINTS_BY_ACTION_TYPE_ID[actionTypeId] ?? [];
12595
14837
  const lookupRequirements = toLookupRequirements(resourceRequirements);
14838
+ const corpusMetadata = WORKFLOW_ACTION_CORPUS_METADATA_BY_ID[actionTypeId] ?? {
14839
+ exampleCount: 0,
14840
+ portalCount: 0,
14841
+ workflowCount: 0,
14842
+ fieldFrequency: [],
14843
+ variantInventory: []
14844
+ };
12596
14845
  if (actionTypeId === "AB_TEST_BRANCH") {
12597
14846
  return {
12598
14847
  actionTypeId,
@@ -12614,14 +14863,17 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12614
14863
  ),
12615
14864
  knownGuardrails,
12616
14865
  contextConstraints,
12617
- lookupRequirements
14866
+ lookupRequirements,
14867
+ corpusMetadata,
14868
+ fieldFrequency: corpusMetadata.fieldFrequency,
14869
+ variantInventory: corpusMetadata.variantInventory
12618
14870
  };
12619
14871
  }
12620
14872
  if (actionTypeId === "LIST_BRANCH") {
12621
14873
  return {
12622
14874
  actionTypeId,
12623
14875
  name: "List branch",
12624
- description: "Branch the workflow using list membership filters or root-record property predicates arranged in listBranches filter trees.",
14876
+ description: "Branch the workflow using explicit logical filter trees made up of property filters, list membership filters, form/email activity filters, association scopes, and unified-event nodes.",
12625
14877
  category: "built_in",
12626
14878
  connectionType: "BRANCH",
12627
14879
  fields: [
@@ -12629,7 +14881,7 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12629
14881
  name: "listBranches",
12630
14882
  type: "array",
12631
14883
  required: true,
12632
- description: "Branch definitions. Each entry includes branchName, filterBranch, and may include a connection or nextActionId when the branch continues to another action."
14884
+ description: "Branch definitions. Each entry includes branchName and a filterBranch tree. The tree can contain logical AND/OR nodes, ASSOCIATION nodes scoped to a related object type, and UNIFIED_EVENTS nodes for completed-event checks. Leaf filters include PROPERTY, IN_LIST, FORM_SUBMISSION, FORM_SUBMISSION_ON_PAGE, EMAIL_EVENT, and CTA variants."
12633
14885
  },
12634
14886
  {
12635
14887
  name: "defaultBranch",
@@ -12646,11 +14898,14 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12646
14898
  ],
12647
14899
  resourceRequirements,
12648
14900
  createGuidanceText: withUpdateWorkflowGuidance(
12649
- createMetadata?.createGuidanceText ?? "Use LIST_BRANCH for conditional branching on list membership or root-record properties."
14901
+ createMetadata?.createGuidanceText ?? "Use LIST_BRANCH for conditional branching when you need nested logical groups, association-scoped conditions, or activity-based filters such as form submissions and email events."
12650
14902
  ),
12651
14903
  knownGuardrails,
12652
14904
  contextConstraints,
12653
- lookupRequirements
14905
+ lookupRequirements,
14906
+ corpusMetadata,
14907
+ fieldFrequency: corpusMetadata.fieldFrequency,
14908
+ variantInventory: corpusMetadata.variantInventory
12654
14909
  };
12655
14910
  }
12656
14911
  if (actionTypeId === "STATIC_BRANCH") {
@@ -12665,7 +14920,7 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12665
14920
  name: "inputValue",
12666
14921
  type: "object",
12667
14922
  required: true,
12668
- description: "Branch input reference. Use FIELD_DATA to branch on a prior action output or OBJECT_PROPERTY to branch on an enrolled record property."
14923
+ description: "Branch input reference. Use FIELD_DATA to branch on a prior action output, OBJECT_PROPERTY to branch on an enrolled record property, or FETCHED_OBJECT_PROPERTY when a fetched-object token is the branch source."
12669
14924
  },
12670
14925
  {
12671
14926
  name: "staticBranches",
@@ -12692,7 +14947,10 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12692
14947
  ),
12693
14948
  knownGuardrails,
12694
14949
  contextConstraints,
12695
- lookupRequirements
14950
+ lookupRequirements,
14951
+ corpusMetadata,
14952
+ fieldFrequency: corpusMetadata.fieldFrequency,
14953
+ variantInventory: corpusMetadata.variantInventory
12696
14954
  };
12697
14955
  }
12698
14956
  const builtInActionType = BUILT_IN_ACTION_TYPES[actionTypeId];
@@ -12710,7 +14968,10 @@ var SUPPORTED_WORKFLOW_ACTION_TYPES = SUPPORTED_WORKFLOW_ACTION_KEYS.map((action
12710
14968
  createGuidanceText: withUpdateWorkflowGuidance(createMetadata?.createGuidanceText ?? ""),
12711
14969
  knownGuardrails,
12712
14970
  contextConstraints,
12713
- lookupRequirements
14971
+ lookupRequirements,
14972
+ corpusMetadata,
14973
+ fieldFrequency: corpusMetadata.fieldFrequency,
14974
+ variantInventory: corpusMetadata.variantInventory
12714
14975
  };
12715
14976
  });
12716
14977
  var SUPPORTED_WORKFLOW_ACTION_TYPES_BY_ID = Object.fromEntries(
@@ -16783,7 +19044,7 @@ var projectCreatedPipeline = (ctx, objectType, pipeline2) => {
16783
19044
  label: pipeline2.label,
16784
19045
  displayOrder: pipeline2.displayOrder,
16785
19046
  stages: pipeline2.stages.map((stage, index) => ({
16786
- id: `created-stage:${index + 1}`,
19047
+ id: stage.id ?? `created-stage:${index + 1}`,
16787
19048
  label: stage.label,
16788
19049
  displayOrder: stage.displayOrder,
16789
19050
  metadata: { ...stage.metadata ?? {} }
@@ -18367,6 +20628,7 @@ var HIGH_STAGE_LIMIT_OBJECTS = /* @__PURE__ */ new Set(["deals", "tickets"]);
18367
20628
  var validateCreatePipeline = (op, index, _ctx) => {
18368
20629
  const issues = [];
18369
20630
  const stageLabels = /* @__PURE__ */ new Set();
20631
+ const stageRefs = /* @__PURE__ */ new Set();
18370
20632
  for (const stage of op.pipeline.stages) {
18371
20633
  if (stageLabels.has(stage.label)) {
18372
20634
  issues.push({
@@ -18377,6 +20639,17 @@ var validateCreatePipeline = (op, index, _ctx) => {
18377
20639
  });
18378
20640
  }
18379
20641
  stageLabels.add(stage.label);
20642
+ if (stage.ref) {
20643
+ if (stageRefs.has(stage.ref)) {
20644
+ issues.push({
20645
+ severity: "error",
20646
+ operation_index: index,
20647
+ code: "DUPLICATE_STAGE_REF",
20648
+ message: `Stage ref '${stage.ref}' is duplicated within the pipeline definition`
20649
+ });
20650
+ }
20651
+ stageRefs.add(stage.ref);
20652
+ }
18380
20653
  }
18381
20654
  if (OBJECTS_WITH_PROBABILITY.has(op.object_type)) {
18382
20655
  for (const stage of op.pipeline.stages) {
@@ -18485,19 +20758,31 @@ var createPipelineHandler = {
18485
20758
  validate: validateCreatePipeline,
18486
20759
  validateEffectful: validateCreatePipelineEffectful,
18487
20760
  preCheck: preCheckCreatePipeline,
18488
- declarePlanRefs: (op, index, ctx) => declarePlanRef(ctx, {
18489
- ref: op.ref,
18490
- sourceOperationIndex: index,
18491
- kind: "pipeline",
18492
- primitive: "string",
18493
- projectedValue: `plan-ref:pipeline:${index + 1}`,
18494
- objectType: op.object_type
18495
- }),
20761
+ declarePlanRefs: (op, index, ctx) => [
20762
+ ...declarePlanRef(ctx, {
20763
+ ref: op.ref,
20764
+ sourceOperationIndex: index,
20765
+ kind: "pipeline",
20766
+ primitive: "string",
20767
+ projectedValue: `plan-ref:pipeline:${index + 1}`,
20768
+ objectType: op.object_type
20769
+ }),
20770
+ ...declareIndexedPlanRefs(ctx, {
20771
+ items: op.pipeline.stages,
20772
+ sourceOperationIndex: index,
20773
+ kind: "pipeline_stage",
20774
+ primitive: "string",
20775
+ getRef: (stage) => stage.ref,
20776
+ getProjectedValue: (_stage, itemIndex) => makeSyntheticStringRefValue("pipeline_stage", index, itemIndex),
20777
+ getObjectType: () => op.object_type
20778
+ })
20779
+ ],
18496
20780
  projectValidationState: (op, index, ctx) => projectCreatedPipeline(ctx, op.object_type, {
18497
20781
  id: op.ref ? `plan-ref:pipeline:${index + 1}` : void 0,
18498
20782
  label: op.pipeline.label,
18499
20783
  displayOrder: op.pipeline.display_order,
18500
- stages: op.pipeline.stages.map((stage) => ({
20784
+ stages: op.pipeline.stages.map((stage, stageIndex) => ({
20785
+ id: stage.ref ? makeSyntheticStringRefValue("pipeline_stage", index, stageIndex) : void 0,
18501
20786
  label: stage.label,
18502
20787
  displayOrder: stage.display_order,
18503
20788
  metadata: stage.metadata
@@ -18526,11 +20811,22 @@ var createPipelineHandler = {
18526
20811
  type: "create_pipeline",
18527
20812
  status: "success",
18528
20813
  records_affected: 1,
18529
- affected_ids: [result.id]
20814
+ affected_ids: [result.id],
20815
+ outputs: [
20816
+ ...collectSingleOutputRef(op.ref, "pipeline", "string", result.id, op.object_type),
20817
+ ...collectIndexedOutputRefs({
20818
+ items: op.pipeline.stages,
20819
+ values: result.stages.map((stage) => stage.id),
20820
+ kind: "pipeline_stage",
20821
+ primitive: "string",
20822
+ getRef: (stage) => stage.ref,
20823
+ getObjectType: () => op.object_type
20824
+ })
20825
+ ]
18530
20826
  })),
18531
20827
  catchAllToFailed("create_pipeline", index)
18532
20828
  ),
18533
- collectOutputRefs: (op, _index, result) => collectSingleOutputRef(op.ref, "pipeline", "string", result.affected_ids?.[0], op.object_type),
20829
+ collectOutputRefs: () => [],
18534
20830
  postCheck: (op, index, result) => {
18535
20831
  if (result.status !== "success") return Effect77.succeed([]);
18536
20832
  return pipe59(
@@ -23146,6 +25442,12 @@ var ENUMERATION_INVALID_OPERATORS = /* @__PURE__ */ new Set([
23146
25442
  "IS_EQUAL_TO",
23147
25443
  "IS_NOT_EQUAL_TO"
23148
25444
  ]);
25445
+ var ALL_PROPERTY_EXISTENCE_OPERATORS = /* @__PURE__ */ new Set([
25446
+ "IS_KNOWN",
25447
+ "IS_UNKNOWN",
25448
+ "IS_BLANK",
25449
+ "IS_NOT_BLANK"
25450
+ ]);
23149
25451
  var isCompatibleEnrollmentOperationType = (operationType, expectedOperationType, propertyType) => operationType === expectedOperationType || operationType === "ALL_PROPERTY" || operationType === "TIME_RANGED" && (propertyType === "date" || propertyType === "datetime");
23150
25452
  var collectPropertyFiltersFromBranches = (branches, parentObjectTypeId, parentEventTypeId) => {
23151
25453
  const refs = [];
@@ -23279,6 +25581,15 @@ var validateWorkflowEnrollmentMetadata = (params) => {
23279
25581
  });
23280
25582
  continue;
23281
25583
  }
25584
+ if (propertyDefinition.type === "bool" && filterRef.operationType === "ALL_PROPERTY" && filterRef.operator !== void 0 && !ALL_PROPERTY_EXISTENCE_OPERATORS.has(filterRef.operator)) {
25585
+ add({
25586
+ severity: "error",
25587
+ operation_index: operationIndex,
25588
+ code: "INVALID_ENROLLMENT_FILTER_OPERATION_TYPE",
25589
+ message: `Workflow enrollment filter property '${filterRef.property}' is boolean but uses operator '${filterRef.operator}' with operationType 'ALL_PROPERTY'. Use operationType 'BOOL' for true/false checks, or keep 'ALL_PROPERTY' only for existence operators ${Array.from(ALL_PROPERTY_EXISTENCE_OPERATORS).join(", ")}.`
25590
+ });
25591
+ continue;
25592
+ }
23282
25593
  if (isCompatibleEnrollmentOperationType(filterRef.operationType, expectedOperationType, propertyDefinition.type)) {
23283
25594
  if (propertyDefinition.type === "enumeration" && filterRef.operator !== void 0 && ENUMERATION_INVALID_OPERATORS.has(filterRef.operator)) {
23284
25595
  add({
@@ -23322,6 +25633,12 @@ var ENUMERATION_INVALID_OPERATORS2 = /* @__PURE__ */ new Set([
23322
25633
  "IS_EQUAL_TO",
23323
25634
  "IS_NOT_EQUAL_TO"
23324
25635
  ]);
25636
+ var ALL_PROPERTY_EXISTENCE_OPERATORS2 = /* @__PURE__ */ new Set([
25637
+ "IS_KNOWN",
25638
+ "IS_UNKNOWN",
25639
+ "IS_BLANK",
25640
+ "IS_NOT_BLANK"
25641
+ ]);
23325
25642
  var isCompatibleOperationType = (operationType, expectedOperationType, propertyType) => operationType === expectedOperationType || operationType === "ALL_PROPERTY" || operationType === "TIME_RANGED" && (propertyType === "date" || propertyType === "datetime");
23326
25643
  var validateListBranchFilterNode = (params) => {
23327
25644
  const { actionId, node, path: path6, operationIndex } = params;
@@ -23601,6 +25918,15 @@ var validateWorkflowListBranchMetadata = (params) => {
23601
25918
  });
23602
25919
  continue;
23603
25920
  }
25921
+ if (propertyDefinition.type === "bool" && propertyRef.operationType === "ALL_PROPERTY" && propertyRef.operator !== void 0 && !ALL_PROPERTY_EXISTENCE_OPERATORS2.has(propertyRef.operator)) {
25922
+ add({
25923
+ severity: "error",
25924
+ operation_index: operationIndex,
25925
+ code: "WORKFLOW_LIST_BRANCH_INVALID_FILTER_OPERATION_TYPE",
25926
+ message: `Action '${propertyRef.actionId}' LIST_BRANCH property '${propertyRef.property}' is boolean but uses operator '${propertyRef.operator}' with operationType 'ALL_PROPERTY'. Use operationType 'BOOL' for true/false checks, or keep 'ALL_PROPERTY' only for existence operators ${Array.from(ALL_PROPERTY_EXISTENCE_OPERATORS2).join(", ")}.`
25927
+ });
25928
+ continue;
25929
+ }
23604
25930
  if (!isCompatibleOperationType(propertyRef.operationType, expectedOperationType, propertyDefinition.type)) {
23605
25931
  add({
23606
25932
  severity: "error",
@@ -24326,6 +26652,86 @@ var NUMBER_STRING_FIELD_KINDS = {
24326
26652
  labelToApply: ["association_label"],
24327
26653
  labelToRemove: ["association_label"]
24328
26654
  };
26655
+ var LEGACY_PIPELINE_TEMPLATE_PATTERN = /^\s*\{\{\s*pipeline\.[^}]+\}\}\s*$/;
26656
+ var WORKFLOW_PROPERTY_TARGET_KINDS = {
26657
+ pipeline: ["pipeline"],
26658
+ dealstage: ["pipeline_stage"],
26659
+ hs_pipeline_stage: ["pipeline_stage"]
26660
+ };
26661
+ var getWorkflowPropertyTargetKinds = (targetProperty) => targetProperty ? WORKFLOW_PROPERTY_TARGET_KINDS[targetProperty] : void 0;
26662
+ var isLegacyPipelineTemplate = (value) => typeof value === "string" && LEGACY_PIPELINE_TEMPLATE_PATTERN.test(value);
26663
+ var resolveWorkflowValueSpecForValidation = (valueSpec, params) => {
26664
+ const kinds = getWorkflowPropertyTargetKinds(params.targetProperty);
26665
+ if (!kinds || !valueSpec || typeof valueSpec !== "object") return void 0;
26666
+ const record = valueSpec;
26667
+ const rawStaticValue = record.staticValue;
26668
+ if (isLegacyPipelineTemplate(rawStaticValue)) {
26669
+ return {
26670
+ value: valueSpec,
26671
+ issues: [{
26672
+ severity: "error",
26673
+ operation_index: params.operationIndex,
26674
+ code: "WORKFLOW_LEGACY_PIPELINE_TEMPLATE_UNSUPPORTED",
26675
+ message: `${params.path}.staticValue uses legacy pipeline template syntax; use a typed plan ref instead`
26676
+ }]
26677
+ };
26678
+ }
26679
+ if (!(typeof rawStaticValue === "string" || isPlanRefValue(rawStaticValue))) return void 0;
26680
+ const result = resolveStringFieldForValidation(rawStaticValue, {
26681
+ ctx: params.ctx,
26682
+ operationIndex: params.operationIndex,
26683
+ fieldLabel: `${params.path}.staticValue`,
26684
+ kinds
26685
+ });
26686
+ if (!result.ok) {
26687
+ return {
26688
+ value: valueSpec,
26689
+ issues: result.issues
26690
+ };
26691
+ }
26692
+ return {
26693
+ value: {
26694
+ ...record,
26695
+ staticValue: result.value
26696
+ },
26697
+ issues: []
26698
+ };
26699
+ };
26700
+ var resolveWorkflowValueSpecForExecution = (valueSpec, params) => {
26701
+ const kinds = getWorkflowPropertyTargetKinds(params.targetProperty);
26702
+ if (!kinds || !valueSpec || typeof valueSpec !== "object") return void 0;
26703
+ const record = valueSpec;
26704
+ const rawStaticValue = record.staticValue;
26705
+ if (isLegacyPipelineTemplate(rawStaticValue)) {
26706
+ return {
26707
+ ok: false,
26708
+ result: {
26709
+ index: params.operationIndex,
26710
+ type: params.operationType,
26711
+ status: "skipped",
26712
+ records_affected: 0,
26713
+ error_code: "WORKFLOW_LEGACY_PIPELINE_TEMPLATE_UNSUPPORTED",
26714
+ error: `${params.path}.staticValue uses legacy pipeline template syntax; use a typed plan ref instead`
26715
+ }
26716
+ };
26717
+ }
26718
+ if (!(typeof rawStaticValue === "string" || isPlanRefValue(rawStaticValue))) return void 0;
26719
+ const result = resolveStringFieldForExecution(rawStaticValue, {
26720
+ ctx: params.ctx,
26721
+ operationIndex: params.operationIndex,
26722
+ operationType: params.operationType,
26723
+ fieldLabel: `${params.path}.staticValue`,
26724
+ kinds
26725
+ });
26726
+ if (!result.ok) return result;
26727
+ return {
26728
+ ok: true,
26729
+ value: {
26730
+ ...record,
26731
+ staticValue: result.value
26732
+ }
26733
+ };
26734
+ };
24329
26735
  var resolveNestedForValidation = (value, params) => {
24330
26736
  if (Array.isArray(value)) {
24331
26737
  const issues2 = [];
@@ -24345,6 +26751,30 @@ var resolveNestedForValidation = (value, params) => {
24345
26751
  const record = value;
24346
26752
  const issues = [];
24347
26753
  const next = {};
26754
+ if (typeof record.targetProperty === "string" && "value" in record) {
26755
+ const resolvedValueSpec = resolveWorkflowValueSpecForValidation(record.value, {
26756
+ ctx: params.ctx,
26757
+ operationIndex: params.operationIndex,
26758
+ path: params.path ? `${params.path}.value` : "value",
26759
+ targetProperty: record.targetProperty
26760
+ });
26761
+ if (resolvedValueSpec) {
26762
+ issues.push(...resolvedValueSpec.issues);
26763
+ next.targetProperty = record.targetProperty;
26764
+ next.value = resolvedValueSpec.value;
26765
+ for (const [key, raw] of Object.entries(record)) {
26766
+ if (key === "targetProperty" || key === "value") continue;
26767
+ const path6 = params.path ? `${params.path}.${key}` : key;
26768
+ const nested = resolveNestedForValidation(raw, {
26769
+ ...params,
26770
+ path: path6
26771
+ });
26772
+ issues.push(...nested.issues);
26773
+ next[key] = nested.value;
26774
+ }
26775
+ return { value: next, issues };
26776
+ }
26777
+ }
24348
26778
  for (const [key, raw] of Object.entries(record)) {
24349
26779
  const path6 = params.path ? `${params.path}.${key}` : key;
24350
26780
  if (key in STRING_FIELD_KINDS && (typeof raw === "string" || isPlanRefValue(raw))) {
@@ -24408,6 +26838,31 @@ var resolveNestedForExecution = (value, params) => {
24408
26838
  }
24409
26839
  const record = value;
24410
26840
  const next = {};
26841
+ if (typeof record.targetProperty === "string" && "value" in record) {
26842
+ const resolvedValueSpec = resolveWorkflowValueSpecForExecution(record.value, {
26843
+ ctx: params.ctx,
26844
+ operationIndex: params.operationIndex,
26845
+ operationType: params.operationType,
26846
+ path: params.path ? `${params.path}.value` : "value",
26847
+ targetProperty: record.targetProperty
26848
+ });
26849
+ if (resolvedValueSpec) {
26850
+ if (!resolvedValueSpec.ok) return resolvedValueSpec;
26851
+ next.targetProperty = record.targetProperty;
26852
+ next.value = resolvedValueSpec.value;
26853
+ for (const [key, raw] of Object.entries(record)) {
26854
+ if (key === "targetProperty" || key === "value") continue;
26855
+ const path6 = params.path ? `${params.path}.${key}` : key;
26856
+ const nested = resolveNestedForExecution(raw, {
26857
+ ...params,
26858
+ path: path6
26859
+ });
26860
+ if (!nested.ok) return nested;
26861
+ next[key] = nested.value;
26862
+ }
26863
+ return { ok: true, value: next };
26864
+ }
26865
+ }
24411
26866
  for (const [key, raw] of Object.entries(record)) {
24412
26867
  const path6 = params.path ? `${params.path}.${key}` : key;
24413
26868
  if (key in STRING_FIELD_KINDS && (typeof raw === "string" || isPlanRefValue(raw))) {
@@ -27025,7 +29480,11 @@ var buildDispatcher = (handlers, options2) => {
27025
29480
  (result) => pipe118(
27026
29481
  collectOperationOutputRefs(resolved.op, index, result),
27027
29482
  Effect138.map((outputs) => {
27028
- const nextResult = outputs.length > 0 ? { ...result, outputs } : result;
29483
+ const mergedOutputs = [
29484
+ ...result.outputs ?? [],
29485
+ ...outputs
29486
+ ];
29487
+ const nextResult = mergedOutputs.length > 0 ? { ...result, outputs: mergedOutputs } : result;
27029
29488
  if (nextResult.outputs) {
27030
29489
  for (const output of nextResult.outputs) {
27031
29490
  state.ctx.outputsByRef.set(output.ref, output);