@salesforce/afv-skills 1.65.0 → 1.65.1
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.
- package/package.json +1 -1
- package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +2 -23
- package/skills/field-service-data-capture-form-designer-configure/SKILL.md +3 -13
- package/skills/field-service-mobile-branding-configure/SKILL.md +3 -17
- package/skills/field-service-objective-designer-configure/SKILL.md +379 -72
- package/skills/field-service-prework-brief-deployer-configure/SKILL.md +537 -10
- package/skills/field-service-scheduling-policy-designer-query/SKILL.md +1093 -65
- package/skills/field-service-sobject-create-configure/SKILL.md +213 -13
- package/skills/field-service-voice-to-form-configure/SKILL.md +11 -40
- package/skills/field-service-work-rule-designer-configure/SKILL.md +95 -121
- package/skills/agentforce-gpt-email-generation-configure/SKILL.md +0 -312
- package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +0 -64
- package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +0 -46
- package/skills/automation-company-profile-info-query/SKILL.md +0 -51
- package/skills/automation-digital-wallet-configure/SKILL.md +0 -689
- package/skills/automation-flow-coordinate/SKILL.md +0 -95
- package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +0 -1569
- package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +0 -96
- package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +0 -23
- package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +0 -31
- package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +0 -179
- package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +0 -13
- package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +0 -83
- package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +0 -69
- package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +0 -274
- package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +0 -192
- package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +0 -130
- package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +0 -92
- package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +0 -88
- package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +0 -152
- package/skills/automation-flow-coordinate/references/elements/start/start.md +0 -539
- package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +0 -152
- package/skills/automation-flow-coordinate/references/elements/wait/wait.md +0 -497
- package/skills/automation-flow-coordinate/references/recipes/author/author.md +0 -868
- package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +0 -300
- package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +0 -292
- package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +0 -323
- package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +0 -109
- package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +0 -219
- package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +0 -180
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +0 -175
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +0 -255
- package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +0 -212
- package/skills/automation-flow-coordinate/references/resources/variable/variable.md +0 -171
- package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +0 -786
- package/skills/automation-flow-coordinate/references/shared/end/end.md +0 -267
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +0 -69
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +0 -80
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +0 -116
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +0 -321
- package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +0 -320
- package/skills/automation-flow-coordinate/references/shared/server-functions.md +0 -597
- package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +0 -69
- package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +0 -78
- package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +0 -373
- package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +0 -273
- package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +0 -259
- package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +0 -369
- package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +0 -542
- package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +0 -159
- package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +0 -349
- package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +0 -505
- package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +0 -380
- package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +0 -567
- package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +0 -159
- package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +0 -360
- package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +0 -539
- package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +0 -358
- package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +0 -602
- package/skills/commerce-b2b-store-configure/SKILL.md +0 -251
- package/skills/commerce-credit-memo-create/SKILL.md +0 -139
- package/skills/commerce-delivery-business-hours-configure/SKILL.md +0 -277
- package/skills/commerce-delivery-estimation-apply/SKILL.md +0 -155
- package/skills/commerce-delivery-estimation-configure/SKILL.md +0 -377
- package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +0 -174
- package/skills/commerce-estimate-bopis-query/SKILL.md +0 -279
- package/skills/commerce-estimate-delivery-date-query/SKILL.md +0 -349
- package/skills/commerce-fees-apply/SKILL.md +0 -227
- package/skills/commerce-fulfillment-routing-analyze/SKILL.md +0 -200
- package/skills/commerce-guest-buyer-create/SKILL.md +0 -173
- package/skills/commerce-location-bopis-configure/SKILL.md +0 -378
- package/skills/commerce-location-business-hours-configure/SKILL.md +0 -235
- package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +0 -309
- package/skills/commerce-location-graph-integrate/SKILL.md +0 -131
- package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +0 -755
- package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +0 -331
- package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +0 -579
- package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +0 -626
- package/skills/commerce-merchant-catalog-configure/SKILL.md +0 -614
- package/skills/commerce-merchant-extension-provider-configure/SKILL.md +0 -368
- package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +0 -118
- package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +0 -65
- package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +0 -90
- package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +0 -72
- package/skills/commerce-merchant-insights-query/SKILL.md +0 -279
- package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +0 -656
- package/skills/commerce-order-summary-change-apply/SKILL.md +0 -375
- package/skills/commerce-product-details-get/SKILL.md +0 -363
- package/skills/commerce-product-search/SKILL.md +0 -563
- package/skills/commerce-react-storefront-create/SKILL.md +0 -350
- package/skills/commerce-return-order-summary-create/SKILL.md +0 -513
- package/skills/commerce-search-relevance-analyze/SKILL.md +0 -757
- package/skills/commerce-temporary-processing-time-override-create/SKILL.md +0 -274
- package/skills/communications-initial-setup-configure/SKILL.md +0 -630
- package/skills/communications-multisite-configure/SKILL.md +0 -571
- package/skills/communications-revenue-cloud-settings-configure/SKILL.md +0 -74
- package/skills/communications-smb-fiber-catalog-create/SKILL.md +0 -413
- package/skills/communications-tmf-integrate/SKILL.md +0 -1368
- package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +0 -448
- package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +0 -269
- package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +0 -271
- package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +0 -382
- package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +0 -373
- package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +0 -389
- package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +0 -338
- package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +0 -547
- package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +0 -346
- package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +0 -1110
- package/skills/crm-analytics-adoption-insights-configure/SKILL.md +0 -224
- package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +0 -418
- package/skills/crm-analytics-dashboards-configure/SKILL.md +0 -731
- package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +0 -233
- package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +0 -184
- package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +0 -167
- package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +0 -55
- package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +0 -1350
- package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +0 -1862
- package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +0 -83
- package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +0 -81
- package/skills/data360-activation-create/SKILL.md +0 -104
- package/skills/data360-activation-external-platform-get/SKILL.md +0 -49
- package/skills/data360-activation-target-create/SKILL.md +0 -93
- package/skills/data360-activation-v2-create/SKILL.md +0 -456
- package/skills/data360-audience-dmo-get/SKILL.md +0 -38
- package/skills/data360-calculated-affinity-create/SKILL.md +0 -82
- package/skills/data360-calculated-insight-create/SKILL.md +0 -148
- package/skills/data360-catalog-metadata-create/SKILL.md +0 -183
- package/skills/data360-code-extension-create/SKILL.md +0 -115
- package/skills/data360-communication-capping-create/SKILL.md +0 -227
- package/skills/data360-connection-create/SKILL.md +0 -491
- package/skills/data360-content-lens-create/SKILL.md +0 -181
- package/skills/data360-data-action-create/SKILL.md +0 -126
- package/skills/data360-data-action-target-create/SKILL.md +0 -181
- package/skills/data360-data-clean-room-create/SKILL.md +0 -238
- package/skills/data360-data-governance-create/SKILL.md +0 -746
- package/skills/data360-data-graph-create/SKILL.md +0 -82
- package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +0 -38
- package/skills/data360-data-lake-object-create/SKILL.md +0 -207
- package/skills/data360-data-model-object-catalog-get/SKILL.md +0 -49
- package/skills/data360-data-model-object-create/SKILL.md +0 -128
- package/skills/data360-data-model-object-mapping-create/SKILL.md +0 -106
- package/skills/data360-data-space-create/SKILL.md +0 -161
- package/skills/data360-data-streams-create/SKILL.md +0 -324
- package/skills/data360-engagement-signal-get/SKILL.md +0 -38
- package/skills/data360-experiment-create/SKILL.md +0 -82
- package/skills/data360-goal-based-campaign-create/SKILL.md +0 -192
- package/skills/data360-harmonization-process-history-get/SKILL.md +0 -38
- package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +0 -84
- package/skills/data360-identity-resolution-create/SKILL.md +0 -115
- package/skills/data360-intelligent-document-processing-create/SKILL.md +0 -148
- package/skills/data360-knowledge-graph-construction-create/SKILL.md +0 -93
- package/skills/data360-knowledge-graph-create/SKILL.md +0 -216
- package/skills/data360-knowledge-space-mcp-configure/SKILL.md +0 -475
- package/skills/data360-machine-learning-mcp-configure/SKILL.md +0 -697
- package/skills/data360-multi-org-mcp-configure/SKILL.md +0 -117
- package/skills/data360-secondary-index-mcp-configure/SKILL.md +0 -126
- package/skills/data360-segment-mcp-configure/SKILL.md +0 -159
- package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +0 -38
- package/skills/data360-semantic-engine-mcp-configure/SKILL.md +0 -62
- package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +0 -38
- package/skills/data360-semantic-metric-mcp-configure/SKILL.md +0 -93
- package/skills/data360-semantic-model-mcp-configure/SKILL.md +0 -115
- package/skills/data360-standard-mapping-mcp-configure/SKILL.md +0 -38
- package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +0 -73
- package/skills/experience-afv-query/SKILL.md +0 -234
- package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +0 -63
- package/skills/experience-apex-components-configure/SKILL.md +0 -69
- package/skills/experience-apex-pages-configure/SKILL.md +0 -107
- package/skills/experience-app-home-configure/SKILL.md +0 -76
- package/skills/experience-aura-lightning-out-access-configure/SKILL.md +0 -58
- package/skills/experience-briefcase-configure/SKILL.md +0 -287
- package/skills/experience-community-flexi-page-list-create/SKILL.md +0 -74
- package/skills/experience-community-template-definition-list-query/SKILL.md +0 -48
- package/skills/experience-community-theme-definition-list-query/SKILL.md +0 -38
- package/skills/experience-content-assets-configure/SKILL.md +0 -86
- package/skills/experience-custom-domain-create/SKILL.md +0 -727
- package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +0 -41
- package/skills/experience-field-service-app-builder-configure/SKILL.md +0 -187
- package/skills/experience-flow-category-configure/SKILL.md +0 -117
- package/skills/experience-formula-configure/SKILL.md +0 -358
- package/skills/experience-global-actions-configure/SKILL.md +0 -69
- package/skills/experience-global-publisher-layouts-configure/SKILL.md +0 -79
- package/skills/experience-instrumentation-configure/SKILL.md +0 -64
- package/skills/experience-lex-engagement-configure/SKILL.md +0 -50
- package/skills/experience-lightning-bolt-open/SKILL.md +0 -12
- package/skills/experience-lightning-out-configure/SKILL.md +0 -129
- package/skills/experience-lightning-preview-configure/SKILL.md +0 -67
- package/skills/experience-lightning-types-query/SKILL.md +0 -98
- package/skills/experience-malware-scan-configure/SKILL.md +0 -71
- package/skills/experience-my-salesforce-configure/SKILL.md +0 -126
- package/skills/experience-navigation-menus-configure/SKILL.md +0 -235
- package/skills/experience-notification-types-configure/SKILL.md +0 -206
- package/skills/experience-notifications-configure/SKILL.md +0 -75
- package/skills/experience-record-discovery-query/SKILL.md +0 -227
- package/skills/experience-regenerate-previews-open/SKILL.md +0 -94
- package/skills/experience-sales-cloud-mab-configure/SKILL.md +0 -254
- package/skills/experience-schema-builder-open/SKILL.md +0 -38
- package/skills/experience-simple-record-home-configure/SKILL.md +0 -110
- package/skills/experience-static-resources-configure/SKILL.md +0 -74
- package/skills/field-service-setup-coordinate/SKILL.md +0 -62
- package/skills/field-service-work-plan-configure/SKILL.md +0 -253
- package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +0 -180
- package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +0 -196
- package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +0 -106
- package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +0 -96
- package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +0 -111
- package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +0 -250
- package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +0 -122
- package/skills/fsc-digital-origination-coordinate/SKILL.md +0 -653
- package/skills/fsc-digital-origination-demo-run/SKILL.md +0 -225
- package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +0 -112
- package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +0 -396
- package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +0 -336
- package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +0 -208
- package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +0 -375
- package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +0 -83
- package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +0 -248
- package/skills/fsc-digital-origination-sample-data-create/SKILL.md +0 -206
- package/skills/fsc-document-checklist-settings-configure/SKILL.md +0 -57
- package/skills/fsc-flexible-hierarchy-configure/SKILL.md +0 -148
- package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +0 -1430
- package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +0 -471
- package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +0 -429
- package/skills/fsc-pricing-product-configurator-configure/SKILL.md +0 -150
- package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +0 -123
- package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +0 -82
- package/skills/fsc-product-act3-attributes-create/SKILL.md +0 -249
- package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +0 -196
- package/skills/fsc-product-act5-considerations-get/SKILL.md +0 -44
- package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +0 -384
- package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +0 -144
- package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +0 -107
- package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +0 -189
- package/skills/fsc-stage-management-definition-create/SKILL.md +0 -108
- package/skills/fsc-stage-management-permissions-assign/SKILL.md +0 -143
- package/skills/fsc-stage-management-transitions-configure/SKILL.md +0 -139
- package/skills/health-cloud-appt-booking-config-configure/SKILL.md +0 -135
- package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +0 -134
- package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +0 -136
- package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +0 -134
- package/skills/health-cloud-care-requests-create/SKILL.md +0 -178
- package/skills/health-cloud-initial-configure/SKILL.md +0 -511
- package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +0 -1374
- package/skills/health-cloud-provider-search-settings-configure/SKILL.md +0 -924
- package/skills/health-cloud-referral-management-coordinate/SKILL.md +0 -513
- package/skills/health-cloud-timeline-configure/SKILL.md +0 -622
- package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +0 -135
- package/skills/industries-account-score-settings-query/SKILL.md +0 -78
- package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +0 -177
- package/skills/industries-ad-product-availability-search/SKILL.md +0 -399
- package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +0 -628
- package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +0 -73
- package/skills/industries-atm-settings-starter-configure/SKILL.md +0 -76
- package/skills/industries-batch-document-ai-configure/SKILL.md +0 -196
- package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +0 -71
- package/skills/industries-branch-management-settings-configure/SKILL.md +0 -89
- package/skills/industries-bre-decision-table-access-configure/SKILL.md +0 -367
- package/skills/industries-brokerage-settings-configure/SKILL.md +0 -41
- package/skills/industries-calendar-sync-settings-configure/SKILL.md +0 -89
- package/skills/industries-care-request-settings-configure/SKILL.md +0 -218
- package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +0 -54
- package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +0 -380
- package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +0 -216
- package/skills/industries-catalog-process-intake-configure/SKILL.md +0 -219
- package/skills/industries-catalog-process-knowledge-configure/SKILL.md +0 -153
- package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +0 -168
- package/skills/industries-cds-general-settings-configure/SKILL.md +0 -69
- package/skills/industries-claim-financial-settings-configure/SKILL.md +0 -169
- package/skills/industries-clinical-data-model-settings-configure/SKILL.md +0 -136
- package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +0 -105
- package/skills/industries-collection-plan-settings-configure/SKILL.md +0 -132
- package/skills/industries-comms-service-console-settings-configure/SKILL.md +0 -159
- package/skills/industries-compliance-configure/SKILL.md +0 -102
- package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +0 -76
- package/skills/industries-contact-center-app-layout-configure/SKILL.md +0 -88
- package/skills/industries-contact-center-components-configure/SKILL.md +0 -96
- package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +0 -95
- package/skills/industries-contact-center-user-access-assign/SKILL.md +0 -96
- package/skills/industries-course-waitlist-config-configure/SKILL.md +0 -162
- package/skills/industries-crisis-center-settings-configure/SKILL.md +0 -84
- package/skills/industries-custom-object-settings-configure/SKILL.md +0 -94
- package/skills/industries-data-cloud-integration-configure/SKILL.md +0 -88
- package/skills/industries-data-space-feature-mappings-configure/SKILL.md +0 -245
- package/skills/industries-decision-matrix-builder-configure/SKILL.md +0 -78
- package/skills/industries-decision-table-hbase-configure/SKILL.md +0 -87
- package/skills/industries-decision-table-version-configure/SKILL.md +0 -74
- package/skills/industries-decision-tables-builder-configure/SKILL.md +0 -253
- package/skills/industries-decision-tables-configure/SKILL.md +0 -439
- package/skills/industries-energy-utilities-configure/SKILL.md +0 -251
- package/skills/industries-eu-cloud-multisite-configure/SKILL.md +0 -1008
- package/skills/industries-eu-new-connections-configure/SKILL.md +0 -30
- package/skills/industries-explainability-msg-template-configure/SKILL.md +0 -135
- package/skills/industries-expression-set-message-token-configure/SKILL.md +0 -135
- package/skills/industries-field-service-settings-configure/SKILL.md +0 -82
- package/skills/industries-form-framework-settings-configure/SKILL.md +0 -30
- package/skills/industries-fsc-ai-settings-configure/SKILL.md +0 -57
- package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +0 -172
- package/skills/industries-fsc-b2b-settings-configure/SKILL.md +0 -61
- package/skills/industries-fsc-insurance-settings-configure/SKILL.md +0 -58
- package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +0 -103
- package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +0 -117
- package/skills/industries-fsc-wealth-settings-configure/SKILL.md +0 -99
- package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +0 -120
- package/skills/industries-fundraising-rfm-configure/SKILL.md +0 -128
- package/skills/industries-fundraising-settings-configure/SKILL.md +0 -145
- package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +0 -299
- package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +0 -87
- package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +0 -58
- package/skills/industries-hc-score-category-settings-configure/SKILL.md +0 -167
- package/skills/industries-health-engagement-settings-configure/SKILL.md +0 -218
- package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +0 -131
- package/skills/industries-home-health-bundling-policy-create/SKILL.md +0 -50
- package/skills/industries-home-health-entity-labels-configure/SKILL.md +0 -29
- package/skills/industries-home-health-fsl-package-deploy/SKILL.md +0 -71
- package/skills/industries-home-health-fsl-settings-validate/SKILL.md +0 -27
- package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +0 -80
- package/skills/industries-home-health-guided-setup-configure/SKILL.md +0 -836
- package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +0 -55
- package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +0 -61
- package/skills/industries-home-health-licenses-assign/SKILL.md +0 -27
- package/skills/industries-home-health-operating-hours-create/SKILL.md +0 -40
- package/skills/industries-home-health-scheduling-policy-create/SKILL.md +0 -41
- package/skills/industries-home-health-service-objective-create/SKILL.md +0 -22
- package/skills/industries-home-health-skills-create/SKILL.md +0 -31
- package/skills/industries-home-health-users-create/SKILL.md +0 -29
- package/skills/industries-icm-act3-toggles-configure/SKILL.md +0 -198
- package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +0 -361
- package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +0 -550
- package/skills/industries-integrated-care-management-configure/SKILL.md +0 -168
- package/skills/industries-object-enablement-configure/SKILL.md +0 -86
- package/skills/industries-tpm-system-processing-service-configure/SKILL.md +0 -64
- package/skills/integration-apex-settings-configure/SKILL.md +0 -61
- package/skills/marketing-e360-email-archiving-configure/SKILL.md +0 -73
- package/skills/platform-custom-permissions-configure/SKILL.md +0 -687
- package/skills/platform-label-workbench-import-create/SKILL.md +0 -67
- package/skills/platform-privacy-agent-settings-configure/SKILL.md +0 -752
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: industries-catalog-process-attributes-products-configure
|
|
3
|
-
description: "Use this skill when users want to cHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Trigger when users mention configure, unified, catalog, service, process, attributes, product, collection, automation, connect, api, service-automation-connect-api."
|
|
4
|
-
metadata:
|
|
5
|
-
version: "1.0"
|
|
6
|
-
accessCheck: "IndustriesEpc.orgHasUnifiedCatalog"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Managing Configure Unified Catalog Service Process Attributes And Product Collection
|
|
10
|
-
|
|
11
|
-
## When to Use This Skill
|
|
12
|
-
|
|
13
|
-
CHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Run standalone against an existing process (supply its catalogItemId), or as the phase that orchestrator routes to; for a NEW end-to-end process start at create-unified-catalog-service-process, which asks the creation fork FIRST.
|
|
14
|
-
Use this when an admin wants to define or edit the intake CONTENT — attributes and/or product collections — on a service process that ALREADY EXISTS, whether it was created from scratch or from a template. E.g. "add a Priority picklist and a laptops product collection to this service process". DONE when the chosen attributes and/or product collections read back on the verify GET with the anchor still intact. Org-gated on Unified Catalog. It does NOT create the process — run the create SOR first and pass its catalogItemId. The child lists (attributes, product collections) are MERGE-BY-ID — send only what you touch (see EDIT SEMANTICS in agent_guidance) — but the item's identity fields (anchor + intake container) ARE full-overwrite and must be re-sent every PATCH: see the content_patch_resends_anchor_and_container precondition and write-intake-content step for the DETACH TRAP; choice-backed-option rules are in the choice_backed_attributes_carry_inline_options precondition.
|
|
15
|
-
|
|
16
|
-
## Critical Constraints
|
|
17
|
-
|
|
18
|
-
**Preconditions:**
|
|
19
|
-
|
|
20
|
-
- Org must have Unified Catalog enabled.
|
|
21
|
-
(check: `Unified Product Catalog enabled`)
|
|
22
|
-
- HARD CONSTRAINT — the service process must ALREADY EXIST and its catalogItemId (== productId) must be known before this workflow runs. The first step (resolve-catalog-item) GETs the item to confirm it exists and is usedFor=ServiceProcess and to capture the anchor + intake container before any write; a 404 there means the id is wrong or the process was never created — create the process first, then re-run here with its catalogItemId.
|
|
23
|
-
(check: `process_exists_with_known_catalog_item_id`)
|
|
24
|
-
- HARD CONSTRAINT — the FIRST thing you ask each loop is the CONTENT TYPE: ATTRIBUTES (input fields), PRODUCT COLLECTION (products the requester picks), or DONE. This is the parent decision — it comes before any per-attribute detail. It is NOT either/or: the question repeats each loop, so a process can end up with BOTH attributes and product collections (add one this pass, the other next). Do NOT assume attributes and skip straight to defining fields; always offer the choice.
|
|
25
|
-
(check: `user_has_chosen_content_type`)
|
|
26
|
-
- HARD CONSTRAINT — inside the ATTRIBUTES branch, each attribute's binding mode is the user's choice, never inferred: for every attribute the user picks ANCHOR-mapped (writes to a real anchor field) vs CUSTOM (intake-only). A single attribute is one or the other, never both — but the loop re-asks this every iteration, so the same process can freely mix anchor-mapped AND custom attributes. Do NOT auto-classify attributes or invent an attribute list. Ask one attribute at a time, not as an upfront questionnaire.
|
|
27
|
-
(check: `user_has_chosen_attribute_binding_modes`)
|
|
28
|
-
- HARD CONSTRAINT — anchor-mapped attributes MUST use a real createable field on the process's anchor object (targetObject, captured on resolve-catalog-item), taken from describe-anchor-fields. The anchor object is one of three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum — the backend rejects any other SObject). Never guess an anchor field apiName.
|
|
29
|
-
(check: `anchor_attributes_use_real_createable_fields`)
|
|
30
|
-
- HARD CONSTRAINT — every choice-backed attribute (dataType Picklist / MultiSelectPicklist / RadioButton) MUST carry a NON-EMPTY picklistOptions[], whether it is anchor-mapped or custom. The backend does NOT inline a field's own values: an anchor-mapped picklist sent BARE (isMappedAnchorField:true with no picklistOptions) persists with picklistOptions:[], so the later generate-intake-form step builds an optionless ChoiceSet and fails "The data type of ChoiceSet_<field> can't be Picklist". Anchor-mapping a choice-backed field is FINE as long as you ALSO send its options inline: keep isMappedAnchorField:true + apiName AND populate picklistOptions[] from the describe projection's picklistOptions (the field's own picklistValues). A CUSTOM choice-backed attribute (no binding flags) likewise MUST carry user-typed picklistOptions[]. Either way every option needs a non-empty, distinct displayName.
|
|
31
|
-
(check: `choice_backed_attributes_carry_inline_options`)
|
|
32
|
-
- HARD CONSTRAINT — every REQUIRED attribute field must be collected non-empty from the user and saved. Required when defining an attribute: Name, API Name, Data Type, and (for choice-backed types Picklist / MultiSelectPicklist / RadioButton) a non-empty picklistOptions[] where EVERY option carries a non-empty, distinct displayName (blank displayNames make the later intake generate fail "Duplicate developer name: Choice_null_<apiName>"). Description is OPTIONAL. Do NOT skip, default, or invent a required field. Every required field the user supplied must read back on verify-content.
|
|
33
|
-
(check: `required_attribute_fields_collected_and_persisted`)
|
|
34
|
-
- HARD CONSTRAINT — an attribute's dataType MUST be one the intake BUILDER supports, NOT merely one the write API accepts. The write accepts a wider set of data types than the builder does; four values — Boolean, Password, List, Map — are write-accepted yet UI-UNSUPPORTED. Sending one persists silently but leaves the builder's Data Type UNSET (blank "Select an Option"), so the process later fails activation with INPUTPARAM_INCOMPATIBLE_DATATYPE, which also blocks binding any agent action. Use only the builder-supported set: Text, Number, Currency, Percentage, CheckBox, Date, Datetime, Time, Email, Url, Phone, Range, Lookup, Attachment, Picklist, MultiSelectPicklist, RadioButton, ListOfString, ListOfInteger, ListOfDouble, ListOfBoolean, ListOfMaps, ListOfAttachment. For a true/false field the builder value is CheckBox — there is NO Boolean option.
|
|
35
|
-
(check: `custom_attribute_datatype_is_ui_supported`)
|
|
36
|
-
- HARD CONSTRAINT — on the content PATCH (write-intake-content), the item's IDENTITY FIELDS are full-overwrite (unlike the child lists, which merge by id — see EDIT SEMANTICS). It MUST re-send those identity fields (targetObject, name, usedFor, isActive) captured on resolve-catalog-item, and carry the existing intake container forward as intakeForm:{id, operationType:"Update"} (plus intakeFormId + type when a Flow/OmniScript surface is already attached). Omitting targetObject CLEARS the anchor (it reads back absent on the next GET — NOT reset to a default); omitting the intakeForm block detaches the intake surface. The verify GET confirms the anchor and container are intact.
|
|
37
|
-
(check: `content_patch_resends_anchor_and_container`)
|
|
38
|
-
|
|
39
|
-
**Operational rules:**
|
|
40
|
-
|
|
41
|
-
- MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
|
|
42
|
-
1. RESOLVE the process first — run resolve-catalog-item (GET) and capture its identity
|
|
43
|
-
fields (name, usedFor, isActive, targetObject), its intakeForm (id + any attached
|
|
44
|
-
surface intakeFormId/type), and its CURRENT sections[].attributes + productRequests[]
|
|
45
|
-
(so you can show the user what already exists and target an edit/removal at the right
|
|
46
|
-
child by its id — the child lists are MERGE-BY-ID, see EDIT SEMANTICS). A 404 means
|
|
47
|
-
the catalogItemId is wrong or the process was never created; do NOT proceed.
|
|
48
|
-
[precondition: process_exists_with_known_catalog_item_id]
|
|
49
|
-
2. ASK the CONTENT TYPE (attributes / product-collection / done) first each loop —
|
|
50
|
-
never assume attributes. [precondition: user_has_chosen_content_type]
|
|
51
|
-
3. Per attribute, ASK anchor-mapped vs custom every iteration — never infer.
|
|
52
|
-
[precondition: user_has_chosen_attribute_binding_modes]
|
|
53
|
-
4. COPY anchor-mapped dataType from the describe; never author it. A CUSTOM attribute's
|
|
54
|
-
dataType MUST be one the intake builder supports (never Boolean/Password/List/Map; a
|
|
55
|
-
true/false field is CheckBox). For choice-backed attributes
|
|
56
|
-
(Picklist/MultiSelectPicklist/RadioButton), apply the inline-options rule.
|
|
57
|
-
[preconditions: custom_attribute_datatype_is_ui_supported,
|
|
58
|
-
choice_backed_attributes_carry_inline_options]
|
|
59
|
-
5. COLLECT every required attribute field non-empty (per the
|
|
60
|
-
required_attribute_fields_collected_and_persisted precondition) and verify round-trip.
|
|
61
|
-
6. WRITE via the single write-intake-content PATCH — see the DETACH TRAP.
|
|
62
|
-
[precondition: content_patch_resends_anchor_and_container]
|
|
63
|
-
- TIMING: resolve first, then run the content loop interactively, then write once, then verify. Ask every decision as you go, never as one upfront questionnaire.
|
|
64
|
-
ASK MODALITY: use a structured picker only for small bounded choices (it caps at a few options). Anchor fields are a BOUNDED palette (the object's createable fields the user chooses from) — list the COMPLETE set as numbered text and NEVER truncate or top-slice, so no valid field is hidden. For unbounded record lists (products), also list the fetched set as numbered text but PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row.
|
|
65
|
-
EDIT SEMANTICS: the child lists (sections[].attributes and productRequests[]) are MERGE-BY-ID, not overwrite. Send ONLY what you touch: add with operationType:"Create", change an existing child with operationType:"Update" by its id, remove one with operationType:"Delete" by its id. Untouched children persist on their own — do NOT re-send them (a stale or wrong id on a needless re-send risks a bad Update or Delete). This is the OPPOSITE of the item's identity fields (name, targetObject, usedFor, isActive) and the intake container, which ARE full-overwrite and MUST be re-sent every PATCH — see write-intake-content for the DETACH TRAP.
|
|
66
|
-
LOOP:
|
|
67
|
-
(a) Ask (yes/no) "Add or edit intake content now?" No -> done.
|
|
68
|
-
(b) Ask the CONTENT TYPE (choose-content-type; options in choice_points): ATTRIBUTES,
|
|
69
|
-
PRODUCT COLLECTION, or DONE. Never assume attributes. Not either/or — a process can
|
|
70
|
-
have both (see the user_has_chosen_content_type precondition).
|
|
71
|
-
(c) Collect per the chosen type. When the type is ATTRIBUTES, run an ATTRIBUTE LOOP:
|
|
72
|
-
each iteration FIRST asks the sub-kind (attribute-source) — "Select an existing
|
|
73
|
-
field (anchor-mapped) or type your own (custom)?" — then collects ONE attribute,
|
|
74
|
-
then asks "Add another attribute?" and REPEATS from the sub-kind question until
|
|
75
|
-
the user says no. Do NOT stay in one branch; do NOT stop after one attribute.
|
|
76
|
-
- ATTRIBUTES, anchor-mapped ("select existing"): run describe-anchor-fields and
|
|
77
|
-
list ALL createable fields as numbered text (label, API name, type); let the
|
|
78
|
-
user type which to add (they may pick several). The set is org/object-specific;
|
|
79
|
-
take it from the describe, never a fixed list. Build each attribute by copying
|
|
80
|
-
from the describe — do NOT ask the user for Name/API Name/Data Type/Description:
|
|
81
|
-
name = field label
|
|
82
|
-
apiName = field name
|
|
83
|
-
dataType = field dataType from the describe (never chosen by you)
|
|
84
|
-
isMappedAnchorField = true
|
|
85
|
-
description defaults to the field label. The only things worth asking are
|
|
86
|
-
behavior flags (Required, Visible, Read-only), and only if they matter.
|
|
87
|
-
CHOICE-BACKED ANCHOR FIELDS (dataType Picklist / MultiSelectPicklist / RadioButton,
|
|
88
|
-
i.e. describe projection isChoiceBacked==true): see the
|
|
89
|
-
choice_backed_attributes_carry_inline_options precondition for the inline-options rule.
|
|
90
|
-
- ATTRIBUTES, custom ("type your own"): collect ONE custom attribute (fields
|
|
91
|
-
below). Collect a non-empty value for every required field; do NOT skip,
|
|
92
|
-
default, or invent, and do NOT save until all are filled. Fields in order:
|
|
93
|
-
1. Name
|
|
94
|
-
2. API Name
|
|
95
|
-
3. Data Type — single-select; send the enum string exactly, and it MUST be one the
|
|
96
|
-
intake BUILDER supports (see the custom_attribute_datatype_is_ui_supported
|
|
97
|
-
precondition for the allowed set). For a true/false field use CheckBox — there is
|
|
98
|
-
NO "Boolean" option.
|
|
99
|
-
4. Description — OPTIONAL. Goes in the attribute's `description` property.
|
|
100
|
-
Offer it; do not block or fail if the user skips it.
|
|
101
|
-
5. Option values — REQUIRED when Data Type is Picklist, MultiSelectPicklist, or
|
|
102
|
-
RadioButton: elicit them via an "add value / add more" loop and send as
|
|
103
|
-
non-empty picklistOptions[]. Empty options break the later generate step.
|
|
104
|
-
Omit picklistOptions for all other types. A user-typed-options picklist is
|
|
105
|
-
custom (set NO binding flags).
|
|
106
|
-
Send each option with BOTH name AND a non-empty, distinct displayName (set
|
|
107
|
-
displayName to the option label). Blank displayNames break the later generate
|
|
108
|
-
step. displayName sets only on Create, not Update — to fix an option saved
|
|
109
|
-
blank, Delete it then re-Create it with displayName in a SEPARATE PATCH (a
|
|
110
|
-
combined delete+create in one PATCH drops the creates). A picklistOptions entry
|
|
111
|
-
may read back isVisible:false on a GET, but the runtime intake form renders it
|
|
112
|
-
regardless — do NOT treat that as a bug or fire follow-up Updates to flip it.
|
|
113
|
-
6. Required — ALWAYS ASK (yes/no) -> isMandatory (default false).
|
|
114
|
-
7. Visible to Requester — ALWAYS ASK (yes/no) -> isHidden INVERTED (there is no
|
|
115
|
-
isVisible field; Visible=yes means isHidden:false, default false).
|
|
116
|
-
8. Read-only (optional) -> isReadOnly (default false). Optionally defaultValue
|
|
117
|
-
and displayWidth (LayoutWidth enum: one, two, three, four, five, six, seven,
|
|
118
|
-
eight, nine, ten, eleven, twelve; default "twelve").
|
|
119
|
-
Set no binding flags on custom attributes.
|
|
120
|
-
- PRODUCT COLLECTION (one per section): Section Name; Products — query the
|
|
121
|
-
selectable Product2 records via `GET /services/data/v67.0/query?q=` with
|
|
122
|
-
`SELECT Id, Name, ProductCode FROM Product2 WHERE UsedFor != 'ServiceProcess'
|
|
123
|
-
ORDER BY Name` (this matches the UI's picker exactly — it EXCLUDES products
|
|
124
|
-
that are themselves service processes; `!=` intentionally KEEPS UsedFor=null
|
|
125
|
-
products, and the picker is NOT active-only, so do not add an IsActive filter).
|
|
126
|
-
Present the results as numbered text (name + id) and let the user type which to
|
|
127
|
-
include. Each chosen -> productDetails
|
|
128
|
-
{productId, operationType:"Create"}, never send `id`. Min/Max count
|
|
129
|
-
(sectionMinCount >= 0, sectionMaxCount > 0 and >= min — elicit both, don't
|
|
130
|
-
default); optional Section Description. Set `sequence` on every productRequests[]
|
|
131
|
-
entry you send (a 0-based ordinal ordering the sections — first section 0, next
|
|
132
|
-
1, ...), on Create AND Update. When you Update an existing section, re-send its
|
|
133
|
-
existing sequence (from resolve-catalog-item) so the Update does not null it;
|
|
134
|
-
sections you do not touch keep their sequence untouched (MERGE-BY-ID).
|
|
135
|
-
DEDICATED PRODUCT PAGE — REQUIRED for the runtime product picker. A collection
|
|
136
|
-
only renders a product-selection screen in the generated intake Flow when it sits
|
|
137
|
-
on its OWN layout page of type ProductRequestSection — NOT on an attribute section,
|
|
138
|
-
and NOT left in the "Existing Product Collection" bucket (a collection sent with no
|
|
139
|
-
page placement lands in that bucket, and generate-intake-form then produces a Flow
|
|
140
|
-
with NO product screen). So for every NEW collection, in the SAME write PATCH also
|
|
141
|
-
emit a sections[] entry: operationType:"Create", a client-chosen sectionUuid (any
|
|
142
|
-
unique string), a name, description "", a sequence, and attributes:[] — the empty
|
|
143
|
-
attributes array is MANDATORY (omitting it 400s UNKNOWN_EXCEPTION "Cannot invoke
|
|
144
|
-
List.iterator()"; empty attributes + a linked product group is how the server infers
|
|
145
|
-
Type=ProductRequestSection). Link the collection to that page by setting
|
|
146
|
-
svcProcessLayoutSectionUuid on its productRequests[] entry to the SAME sectionUuid
|
|
147
|
-
(use svcProcessLayoutSectionUuid, NOT svcProcessLayoutSectionId — the latter refers
|
|
148
|
-
to an already-existing section). When EDITING a collection that is ALREADY on a page,
|
|
149
|
-
do NOT create a new page — Update the productRequests[] entry by its sectionId; its
|
|
150
|
-
page persists. After this PATCH, the generate step (configure-intake SOR) will
|
|
151
|
-
include the product picker automatically.
|
|
152
|
-
(d) After each batch, ask "Add more content?" — LOOP back to (b) until the user says
|
|
153
|
-
done.
|
|
154
|
-
(e) Write the collected content in a SINGLE write step (write-intake-content) — never
|
|
155
|
-
one call per item. First prepare each content type that applies (prepare-attributes
|
|
156
|
-
shapes sections[]; prepare-product-collection shapes productRequests[]). Then
|
|
157
|
-
write-intake-content fires ONE PATCH: sections when attributes were defined,
|
|
158
|
-
productRequests when collections were defined, both together when both — always
|
|
159
|
-
re-sending the anchor identity fields and the existing intake container.
|
|
160
|
-
|
|
161
|
-
## Verification Checklist
|
|
162
|
-
|
|
163
|
-
After every write operation, confirm the effect by re-reading state:
|
|
164
|
-
|
|
165
|
-
- After `resolve-catalog-item`, `write-intake-content`: call `verify-content` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
|
|
166
|
-
|
|
167
|
-
## Operations Reference
|
|
168
|
-
|
|
169
|
-
Operations grouped by purpose. Use these as the building blocks for the workflows above.
|
|
170
|
-
|
|
171
|
-
### Summary
|
|
172
|
-
|
|
173
|
-
| Operation | Purpose | Status | Call | Depends on |
|
|
174
|
-
|-----------|---------|--------|------|------------|
|
|
175
|
-
| `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
|
|
176
|
-
| `describe-anchor-fields` | read | implemented | `GET /services/data/v67.0/sobjects/{targetObject}/describe` | `resolve-catalog-item` |
|
|
177
|
-
| `choose-content-type` | read | — | — | `resolve-catalog-item` |
|
|
178
|
-
| `prepare-attributes` | read | — | — | `resolve-catalog-item`, `choose-content-type`, `describe-anchor-fields` |
|
|
179
|
-
| `prepare-product-collection` | read | — | — | `resolve-catalog-item`, `choose-content-type` |
|
|
180
|
-
| `assemble-sections` | read | — | — | `prepare-attributes`, `prepare-product-collection` |
|
|
181
|
-
| `write-intake-content` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `choose-content-type`, `prepare-attributes`, `prepare-product-collection`, `assemble-sections` |
|
|
182
|
-
| `verify-content` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `write-intake-content` |
|
|
183
|
-
|
|
184
|
-
### Dependency graph
|
|
185
|
-
|
|
186
|
-
```mermaid
|
|
187
|
-
graph TD
|
|
188
|
-
resolve_catalog_item["resolve-catalog-item (read)"]
|
|
189
|
-
describe_anchor_fields["describe-anchor-fields (read)"]
|
|
190
|
-
choose_content_type["choose-content-type (read)"]
|
|
191
|
-
prepare_attributes["prepare-attributes (read)"]
|
|
192
|
-
prepare_product_collection["prepare-product-collection (read)"]
|
|
193
|
-
assemble_sections["assemble-sections (read)"]
|
|
194
|
-
write_intake_content["write-intake-content (write)"]
|
|
195
|
-
verify_content["verify-content (verify)"]
|
|
196
|
-
resolve_catalog_item --> describe_anchor_fields
|
|
197
|
-
resolve_catalog_item --> choose_content_type
|
|
198
|
-
resolve_catalog_item --> prepare_attributes
|
|
199
|
-
choose_content_type --> prepare_attributes
|
|
200
|
-
describe_anchor_fields --> prepare_attributes
|
|
201
|
-
resolve_catalog_item --> prepare_product_collection
|
|
202
|
-
choose_content_type --> prepare_product_collection
|
|
203
|
-
prepare_attributes --> assemble_sections
|
|
204
|
-
prepare_product_collection --> assemble_sections
|
|
205
|
-
resolve_catalog_item --> write_intake_content
|
|
206
|
-
choose_content_type --> write_intake_content
|
|
207
|
-
prepare_attributes --> write_intake_content
|
|
208
|
-
prepare_product_collection --> write_intake_content
|
|
209
|
-
assemble_sections --> write_intake_content
|
|
210
|
-
resolve_catalog_item --> verify_content
|
|
211
|
-
write_intake_content --> verify_content
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Read operations
|
|
215
|
-
|
|
216
|
-
#### `resolve-catalog-item`
|
|
217
|
-
|
|
218
|
-
CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the write must re-send (name, usedFor, isActive, targetObject), the intake container (intakeForm.id and any attached surface intakeFormId/type), and the CURRENT sections[].attributes + productRequests[] (so you can show the user what exists and target an edit/removal at the right child by its id — the child lists are MERGE-BY-ID, see EDIT SEMANTICS). Fails fast (404) if the catalogItemId is wrong or the process was never created.
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
**Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
222
|
-
|
|
223
|
-
**Inputs:**
|
|
224
|
-
|
|
225
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the EXISTING service process. If the user does not have it, the process must be created first before this workflow can run.
|
|
226
|
-
|
|
227
|
-
#### `describe-anchor-fields`
|
|
228
|
-
|
|
229
|
-
DISCOVERY — describe the process's anchor object (resolve-catalog-item.target_object) to get the valid anchor fields, on demand whenever the user picks an anchor-mapped attribute. The fields and their count are org/object-specific, never a fixed list. Filter to createable=true — those are the valid anchor targets. The sobject describe is a LARGE payload: do NOT read the whole thing into context or hand it to a model to eyeball — that drops fields non-deterministically. Extract with the filter below so the field list is complete and reproducible, then build the picker from the small projection. The projection gives, per createable field, a dataType (the agent copies it, never chooses it), an isChoiceBacked flag (true only for real picklist/multipicklist fields), and its picklistOptions. Filter to run:
|
|
230
|
-
jq --argjson sys '["Id","IsDeleted","CreatedById","CreatedDate","LastModifiedById","LastModifiedDate","SystemModstamp","OwnerId"]' '
|
|
231
|
-
[.fields[] | select(.createable==true and .type!="address" and .type!="location" and .type!="base64") | {
|
|
232
|
-
name, label, type, nillable, defaultedOnCreate, nameField,
|
|
233
|
-
dataType: (if .type=="picklist" then "Picklist"
|
|
234
|
-
elif .type=="multipicklist" then "MultiSelectPicklist"
|
|
235
|
-
elif .type=="boolean" then "CheckBox"
|
|
236
|
-
elif .type=="currency" then "Currency"
|
|
237
|
-
elif .type=="percent" then "Percentage"
|
|
238
|
-
elif (.type=="double" or .type=="int") then "Number"
|
|
239
|
-
elif .type=="date" then "Date"
|
|
240
|
-
elif .type=="datetime" then "Datetime"
|
|
241
|
-
elif .type=="time" then "Time"
|
|
242
|
-
elif .type=="reference" then "Lookup"
|
|
243
|
-
elif .type=="phone" then "Phone"
|
|
244
|
-
elif .type=="email" then "Email"
|
|
245
|
-
elif .type=="url" then "Url"
|
|
246
|
-
else "Text" end),
|
|
247
|
-
isChoiceBacked: (.type=="picklist" or .type=="multipicklist"),
|
|
248
|
-
referenceObject: (if .type=="reference" then ((.referenceTo // []) | join(";")) else null end),
|
|
249
|
-
picklistOptions: [ .picklistValues[]? | select(.active==true) | {name: .value, displayName: .label} ]
|
|
250
|
-
}]'
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
**Call:** `GET /services/data/v67.0/sobjects/{targetObject}/describe` — status: `implemented`
|
|
254
|
-
|
|
255
|
-
**Inputs:**
|
|
256
|
-
|
|
257
|
-
- `targetObject` *(`String`)* — The anchor object of the process — one of the three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum enforced by the backend). Captured on resolve-catalog-item. Must be that SAME value.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
**Depends on:** `resolve-catalog-item`
|
|
261
|
-
|
|
262
|
-
#### `choose-content-type`
|
|
263
|
-
|
|
264
|
-
DECISION STEP (no API call) — a real walked step, not prose. At the top of every content iteration, ASK the choice in choice_points[id=content-type] and record the answer; collect that content, then loop back until the user answers "done". The WRITE happens after the loop and depends on WHAT WAS COLLECTED across all iterations. Set has_attributes / has_product_collections to reflect the full collected set; those booleans gate the prep + write steps.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
**Depends on:** `resolve-catalog-item`
|
|
268
|
-
|
|
269
|
-
#### `prepare-attributes`
|
|
270
|
-
|
|
271
|
-
ASSEMBLY STEP (no API call) — shape the collected attributes into the sections[] payload write-intake-content sends (attributes nested under sections[].attributes; each with operationType Create/Update/Delete). Field order and wire mapping are in agent_guidance step (c) ATTRIBUTES. Enforce the required-field rule (see required_attribute_fields_collected_and_persisted precondition) HERE, before the write: do not emit any attribute missing a required field — go back and collect it. For every anchor-mapped attribute (isMappedAnchorField==true), copy dataType AND referenceObject from the matching describe-anchor-fields entry (dataType = projection[name==apiName].dataType, referenceObject = projection[name==apiName].referenceObject); do NOT re-derive them or accept a model-authored value. Only CUSTOM attributes take a user-supplied dataType. MERGE-BY-ID (see EDIT SEMANTICS): the sections[] this emits carries ONLY the attributes the user actually touched — new ones as operationType:"Create", an edited existing one as operationType:"Update" by its id (matched from resolve-catalog-item.existing_attributes by apiName), a removed one as operationType:"Delete" by its id. Do NOT re-emit untouched existing attributes — they persist on their own, and re-sending them risks a stale-id bad Update.
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
**Inputs:**
|
|
275
|
-
|
|
276
|
-
- `attributes` *(`array`)* — The attributes the user added or edited in the loop (anchor-mapped and/or custom).
|
|
277
|
-
|
|
278
|
-
- `existing_attributes` *(`array`)* — The attributes already on the process (from resolve-catalog-item). Used to LOOK UP the id of an attribute the user edits or removes (match by apiName) — NOT re-sent wholesale. Untouched existing attributes persist on their own (MERGE-BY-ID, see EDIT SEMANTICS).
|
|
279
|
-
|
|
280
|
-
- **Source:** output of `resolve-catalog-item`
|
|
281
|
-
- `anchor_field_projection` *(`array`)* — The per-field projection (name, label, type, dataType, isChoiceBacked, picklistOptions). For anchor-mapped attributes, dataType is copied from here by matching projection.name == attribute.apiName — never assumed by the agent. A choice-backed field (isChoiceBacked==true), whether anchor-mapped or custom, sources its picklistOptions from this entry's picklistOptions.
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
**Depends on:** `resolve-catalog-item`, `choose-content-type`, `describe-anchor-fields`
|
|
285
|
-
|
|
286
|
-
#### `prepare-product-collection`
|
|
287
|
-
|
|
288
|
-
ASSEMBLY STEP (no API call) — runs only if the user defined or edited one or more product collections. Assemble the productRequests[] payload from the collections collected in the loop, AND (for new collections) the ProductRequestSection page entries that go in sections[] (see agent_guidance DEDICATED PRODUCT PAGE). Product collections do NOT touch the ATTRIBUTE sections[], but each NEW collection DOES emit its own sections[] entry of type ProductRequestSection (operationType:"Create", a client sectionUuid, attributes:[]) so it lands on a real page and the generated Flow renders a product picker; the collection's productRequests[] entry links to it via svcProcessLayoutSectionUuid. MERGE-BY-ID (see EDIT SEMANTICS): emit ONLY the collections the user touched — new ones as operationType:"Create" (WITH a new page entry + svcProcessLayoutSectionUuid), an edited existing one as operationType:"Update" by its sectionId (re-sending that section's existing `sequence` so the Update does not null it, and NO new page — its page persists), a removed one as operationType:"Delete" by its sectionId. Do NOT re-emit untouched existing collections — they persist on their own.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
**Inputs:**
|
|
292
|
-
|
|
293
|
-
- `collections` *(`array`)* — The product collections collected or edited in the loop (section name, chosen products, min/max count, optional description).
|
|
294
|
-
|
|
295
|
-
- `existing_product_requests` *(`array`)* — The product collections already on the process (from resolve-catalog-item). Used to LOOK UP the sectionId (and existing sequence) of a collection the user edits or removes — NOT re-sent wholesale. Untouched existing collections persist on their own (MERGE-BY-ID, see EDIT SEMANTICS).
|
|
296
|
-
|
|
297
|
-
- **Source:** output of `resolve-catalog-item`
|
|
298
|
-
|
|
299
|
-
**Depends on:** `resolve-catalog-item`, `choose-content-type`
|
|
300
|
-
|
|
301
|
-
#### `assemble-sections`
|
|
302
|
-
|
|
303
|
-
ASSEMBLY STEP (no API call) — build the SINGLE sections[] array the write PATCH sends by CONCATENATING the attribute sections (prepare-attributes.sections, present when attributes were defined) and the ProductRequestSection page entries for new collections (prepare-product-collection.product_sections, present when a NEW collection was defined). Either source may be absent: in the product-collection-only path prepare-attributes does NOT run, so sections is just the product page entries; in the attributes-only path it is just the attribute sections; when both ran, it is both. If BOTH are empty, emit nothing (write-intake-content then omits the sections field entirely). This is the ONLY place the two section sources are merged — write-intake-content reads sections from HERE, never from prepare-attributes directly, so a new product page is guaranteed into the payload even when no attributes were touched (the product-collection-only path that would otherwise drop the ProductRequestSection page and leave the collection unplaced → no runtime picker).
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
**Inputs:**
|
|
307
|
-
|
|
308
|
-
- `attribute_sections` *(`array`)* — The attribute sections[] from prepare-attributes (attributes nested under sections[].attributes). Absent when has_attributes == false (that step did not run) — treat as empty.
|
|
309
|
-
|
|
310
|
-
- **Source:** output of `prepare-attributes`
|
|
311
|
-
- `product_sections` *(`array`)* — The ProductRequestSection page entries (one per NEW collection) from prepare-product-collection. Absent when has_product_collections == false or the user only edited/removed existing collections — treat as empty.
|
|
312
|
-
|
|
313
|
-
- **Source:** output of `prepare-product-collection`
|
|
314
|
-
|
|
315
|
-
**Depends on:** `prepare-attributes`, `prepare-product-collection`
|
|
316
|
-
|
|
317
|
-
### Write operations
|
|
318
|
-
|
|
319
|
-
#### `write-intake-content`
|
|
320
|
-
|
|
321
|
-
THE SINGLE WRITE — one PATCH that persists whatever content was prepared. Send only the blocks that apply: sections (from prepare-attributes) when attributes were defined; productRequests (from prepare-product-collection) when collections were defined; both together when both. Send intakeForm:{id, operationType:"Update"} using resolve-catalog-item.intake_form_id — the item always has a container here (resolve stopped if it did not). DETACH TRAP (see content_patch_resends_anchor_and_container precondition): for the item's IDENTITY FIELDS (targetObject + the intakeForm block), operationType:"Update" is a FULL overwrite — an omitted identity field is cleared. (The child lists are separate: they merge by id — see EDIT SEMANTICS.) Two identity levels to guard:
|
|
322
|
-
(1) intakeForm: if resolve-catalog-item captured intake_surface_form_id + intake_surface_type
|
|
323
|
-
(a Flow/OmniScript attached by a prior configure-intake run), carry them forward —
|
|
324
|
-
intakeForm:{id, operationType:"Update", intakeFormId:<surface id>, type:<type>} —
|
|
325
|
-
or the attached surface is silently detached. Omit intakeFormId/type ONLY when no
|
|
326
|
-
surface is attached yet.
|
|
327
|
-
(2) ANCHOR: this PATCH MUST re-send the item's identity fields — targetObject (the
|
|
328
|
-
anchor), name, usedFor, isActive — sourced from resolve-catalog-item, every time.
|
|
329
|
-
Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, NOT
|
|
330
|
-
reset to a default), and any anchor-mapped attributes in this same payload then have
|
|
331
|
-
no valid object to bind to. Confirm on the post-PATCH verify GET that targetObject
|
|
332
|
-
is unchanged.
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
**Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
336
|
-
|
|
337
|
-
**Inputs:**
|
|
338
|
-
|
|
339
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to update.
|
|
340
|
-
- `targetObject` *(`String`)* — The anchor object — one of the three valid values the API accepts: Case, Incident, or ServiceRequest (a closed enum enforced by the backend). Captured on resolve-catalog-item. MUST be re-sent on every Update or the anchor is CLEARED — it reads back absent, not reset to a default (see DETACH TRAP).
|
|
341
|
-
|
|
342
|
-
- `name` *(`String`)* — The process name — re-sent to preserve identity on this full-overwrite Update.
|
|
343
|
-
- `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
|
|
344
|
-
- `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
|
|
345
|
-
- `intakeFormId` *(`String`)* — The intake container id (from resolve-catalog-item), sent as intakeForm:{id:<this>, operationType:"Update"}. Carry intake_surface_form_id + intake_surface_type forward too when a surface is attached (see DETACH TRAP).
|
|
346
|
-
|
|
347
|
-
- **Source:** output of `resolve-catalog-item`
|
|
348
|
-
- `intakeSurfaceFormId` *(`String`)* — The attached surface's intakeFormId (from resolve-catalog-item), when a Flow/OmniScript is already bound. Included in the intakeForm block ONLY when present — the container block is a full overwrite, so sending id alone while a surface is attached detaches it (see DETACH TRAP). Empty (no surface attached yet) → omit intakeFormId + type entirely.
|
|
349
|
-
|
|
350
|
-
- **Source:** output of `resolve-catalog-item`
|
|
351
|
-
- `intakeSurfaceType` *(`String`)* — The attached surface's type (Flow or Omniscript, from resolve-catalog-item). Carried forward alongside intakeSurfaceFormId under the same present/absent rule (see DETACH TRAP).
|
|
352
|
-
|
|
353
|
-
- **Source:** output of `resolve-catalog-item`
|
|
354
|
-
- `sections` *(`array`)* — The single combined sections[] for the PATCH, from assemble-sections — the concatenation of the attribute sections (prepare-attributes.sections) AND the ProductRequestSection page entries for new collections (prepare-product-collection.product_sections). Sourced from assemble-sections (NOT prepare-attributes directly) so the product page entries reach this PATCH even in the product-collection-only path where prepare-attributes did not run. If assemble-sections produced nothing (neither source had entries), omit sections entirely.
|
|
355
|
-
|
|
356
|
-
- **Source:** output of `assemble-sections`
|
|
357
|
-
- `productRequests` *(`array`)* — The assembled productRequests[] from prepare-product-collection. Every entry carries `sequence` (0-based ordinal ordering the sections), on Create AND Update; a new collection also carries svcProcessLayoutSectionUuid matching its page entry in sections[].
|
|
358
|
-
|
|
359
|
-
- **Source:** output of `prepare-product-collection`
|
|
360
|
-
|
|
361
|
-
**Depends on:** `resolve-catalog-item`, `choose-content-type`, `prepare-attributes`, `prepare-product-collection`, `assemble-sections`
|
|
362
|
-
|
|
363
|
-
**Rollback:** To undo content written here, re-invoke this same PATCH with operationType=Delete on the specific children to remove (attributes, sections, and/or product-collection sections) — each identified by its server-assigned id, always re-sending the anchor identity fields and the full intakeForm block (id + intakeFormId + type when a surface exists) — the rollback PATCH is the same full-overwrite, so anchor-only re-send would wipe the surface. Removal is always via this PATCH; the catalog-item resource has no DELETE method.
|
|
364
|
-
|
|
365
|
-
### Verify operations
|
|
366
|
-
|
|
367
|
-
#### `verify-content`
|
|
368
|
-
|
|
369
|
-
Read the definition back and confirm the attributes and/or product collections are in place and the anchor + intake container held.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
**Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
373
|
-
|
|
374
|
-
**Inputs:**
|
|
375
|
-
|
|
376
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
|
|
377
|
-
- `isRuntime` *(`boolean`)* — Whether to fetch the runtime (intake) view. For design-time verification leave false/omit to read the full definition as authored.
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
**Depends on:** `resolve-catalog-item`, `write-intake-content`
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: industries-catalog-process-fulfillment-configure
|
|
3
|
-
description: "Use this skill when users want to cHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Trigger when users mention configure, unified, catalog, service, process, fulfillment, automation, connect, api, service-automation-connect-api."
|
|
4
|
-
metadata:
|
|
5
|
-
version: "1.0"
|
|
6
|
-
accessCheck: "IndustriesEpc.orgHasUnifiedCatalog"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Managing Configure Unified Catalog Service Process Fulfillment
|
|
10
|
-
|
|
11
|
-
## When to Use This Skill
|
|
12
|
-
|
|
13
|
-
CHILD of the create-unified-catalog-service-process orchestrator — one configuration pass over a service process that ALREADY EXISTS. Run standalone against an existing process (supply its catalogItemId), or as the phase that orchestrator routes to; for a NEW end-to-end process start at create-unified-catalog-service-process, which asks the creation fork FIRST.
|
|
14
|
-
Use this when an admin wants to associate a fulfilment flow with a service process that ALREADY EXISTS — e.g. "attach my order-fulfilment Flow Orchestrator to this service process" or "wire up the stage-management process for my replacement request". DONE when a Flow / Flow Orchestrator / Stage Management surface is bound to the process and reads back on the verify GET with the anchor still intact. Org-gated on Unified Catalog. One user decision drives the branch — the fulfilment type (Flow / FlowOrchestrator / StageManagement) — enforced in preconditions and a choice_point; step mechanics and the DETACH TRAP are in agent_guidance and step assertions. This attaches an EXISTING flow; it does not author the flow, orchestrator, or stage definition.
|
|
15
|
-
|
|
16
|
-
## Critical Constraints
|
|
17
|
-
|
|
18
|
-
**Preconditions:**
|
|
19
|
-
|
|
20
|
-
- Org must have Unified Catalog enabled.
|
|
21
|
-
(check: `Unified Product Catalog enabled`)
|
|
22
|
-
- HARD CONSTRAINT — the service process must ALREADY EXIST and its catalogItemId (== productId) must be known before this workflow runs. The first step (resolve-catalog-item) GETs the item to confirm it exists and is usedFor=ServiceProcess before any write; a 404 there means the id is wrong or the process was never created — the process must be created first, then re-run here with its catalogItemId.
|
|
23
|
-
(check: `process_exists_with_known_catalog_item_id`)
|
|
24
|
-
- HARD CONSTRAINT — the FULFILMENT TYPE (Flow vs FlowOrchestrator vs StageManagement) MUST be elicited from the user, never defaulted. It changes which list endpoint runs and the `type` sent when binding. Do NOT assume Flow.
|
|
25
|
-
(check: `user_has_chosen_fulfillment_type`)
|
|
26
|
-
- HARD CONSTRAINT — the fulfilment surface to attach MUST be a real id taken from the matching list step (list-fulfillment-flows for Flow, list-flow-orchestrations for FlowOrchestrator, list-stage-definitions for StageManagement) for THIS org. Never guess or hand-construct an id. List the eligible records, let the user pick one, and bind that exact id as fulfillmentFlow.fulfillmentFlowId.
|
|
27
|
-
(check: `attached_surface_is_a_real_listed_id`)
|
|
28
|
-
- HARD CONSTRAINT — binding via patchCatalogItemGet with operationType:"Update" is a FULL overwrite: it MUST re-send the item's identity fields (targetObject, name, usedFor, isActive). Omitting targetObject CLEARS the anchor — it reads back absent on the next GET, not reset to a default, even after it was set at create time. The intakeForm block is ALSO a full overwrite: sending it with only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type disappear). When the item has an intake surface, the bind MUST re-send intakeForm.intakeFormId AND intakeForm.type alongside the container id, not just the id. The bind PATCH always carries the four identity fields and re-sends the FULL intakeForm (id + intakeFormId + type) when one exists; the verify GET confirms the anchor and intake surface are intact.
|
|
29
|
-
(check: `bind_patch_resends_anchor_identity_fields`)
|
|
30
|
-
- HARD CONSTRAINT — the fulfillmentFlow block's operationType is COMPUTED, not fixed. The bind follows a Create/Update split (same as the intake container): if resolve-catalog-item returned NO fulfillmentFlow (nothing bound yet), send operationType:"Create" with NO fulfillmentFlow.id — this mints the ProductFulfillmentScenario and binds the flow. If a fulfillmentFlow IS already bound, send operationType:"Update" AND carry resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id — this repoints the existing scenario. A hardcoded operationType:"Update" on a first attach SILENTLY NO-OPS: the PATCH returns 200 but the fulfillmentFlow never persists (reads back absent on the verify GET). Determine Create-vs-Update from the presence of an existing fulfillmentFlow on resolve-catalog-item; never assume.
|
|
31
|
-
(check: `bind_fulfillment_operation_type_rule`)
|
|
32
|
-
- HARD CONSTRAINT — if resolve-catalog-item shows a fulfilment flow is ALREADY bound, binding a different one REPLACES it (the existing ProductFulfillmentScenario is repointed to the new flow). Before replacing, CONFIRM with the user that they want to swap the currently-bound flow; do NOT silently overwrite. First attach (no existing fulfillment flow) needs no confirmation.
|
|
33
|
-
(check: `replace_existing_fulfillment_confirmed`)
|
|
34
|
-
|
|
35
|
-
**Operational rules:**
|
|
36
|
-
|
|
37
|
-
- MUST-DO CONTRACT (read before executing — each rule is enforced by the named precondition/step; do NOT skip because the detail is further down):
|
|
38
|
-
1. CONFIRM the process exists first — run resolve-catalog-item (GET) and capture its
|
|
39
|
-
identity fields (name, usedFor, isActive, targetObject), its current intakeForm.id,
|
|
40
|
-
and its current fulfillmentFlow (if any). A 404 means the catalogItemId is wrong; do
|
|
41
|
-
NOT proceed. [precondition: process_exists_with_known_catalog_item_id]
|
|
42
|
-
2. ELICIT the fulfilment type (Flow / FlowOrchestrator / StageManagement) up front.
|
|
43
|
-
Never default it. [precondition: user_has_chosen_fulfillment_type]
|
|
44
|
-
3. LIST via the matching step (list-fulfillment-flows for Flow, list-flow-orchestrations
|
|
45
|
-
for FlowOrchestrator, list-stage-definitions for StageManagement), present the
|
|
46
|
-
COMPLETE set as numbered text, and let the user type their pick.
|
|
47
|
-
[precondition: attached_surface_is_a_real_listed_id]
|
|
48
|
-
4. IF a fulfilment flow is ALREADY bound (resolve-catalog-item returned a fulfillmentFlow),
|
|
49
|
-
CONFIRM with the user before replacing it — binding a different flow repoints the
|
|
50
|
-
existing scenario. First attach (nothing bound) needs no confirmation.
|
|
51
|
-
[precondition: replace_existing_fulfillment_confirmed]
|
|
52
|
-
5. BIND that exact id via patchCatalogItemGet, sending fulfillmentFlow:{fulfillmentFlowId,
|
|
53
|
-
type, operationType}. COMPUTE operationType: "Create" when NOTHING is bound yet (omit
|
|
54
|
-
fulfillmentFlow.id) — a hardcoded "Update" on first attach silently no-ops (200 but the
|
|
55
|
-
flow never persists); "Update" when replacing an existing binding, carrying
|
|
56
|
-
resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id.
|
|
57
|
-
The PATCH is a FULL overwrite — ALWAYS re-send targetObject + name + usedFor + isActive.
|
|
58
|
-
The intakeForm block is ALSO a full overwrite: when the item has an intake surface,
|
|
59
|
-
re-send the FULL block — intakeForm.id AND intakeForm.intakeFormId AND intakeForm.type
|
|
60
|
-
(operationType:Update). Sending only {id} preserves the container but WIPES the bound
|
|
61
|
-
surface. Omit intakeForm only when the item has no surface. Otherwise the
|
|
62
|
-
anchor clears (reads back absent) and/or the intake surface detaches.
|
|
63
|
-
[precondition: bind_fulfillment_operation_type_rule]
|
|
64
|
-
[precondition: bind_patch_resends_anchor_identity_fields]
|
|
65
|
-
6. VERIFY: GET the item and confirm fulfillmentFlow.fulFillmentFlowId + fulfillmentFlow.type
|
|
66
|
-
are the chosen surface AND targetObject is unchanged. [step: verify-fulfillment]
|
|
67
|
-
- ASK MODALITY: use a structured picker for the one bounded choice (fulfilment type). For the fulfilment surface list (Flows / Orchestrations / Stage Definitions), which is unbounded, list the COMPLETE set as numbered text (label, apiName/id) and let the user type their selection; PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row. The Flow and Orchestration lists are paged GraphQL queries (first:N + pageInfo.hasNextPage/endCursor) — page through to completeness before asking.
|
|
68
|
-
TIMING: ask fulfilment type up front (it selects the branch), then run only the lister that applies (the other two are guarded by applies_when), then the single shared bind.
|
|
69
|
-
BRANCHES (exactly one lister runs, then the shared bind):
|
|
70
|
-
- Flow -> list-fulfillment-flows -> bind-fulfillment-flow (type=Flow)
|
|
71
|
-
- FlowOrchestrator -> list-flow-orchestrations -> bind-fulfillment-flow (type=FlowOrchestrator)
|
|
72
|
-
- StageManagement -> list-stage-definitions -> bind-fulfillment-flow (type=StageManagement)
|
|
73
|
-
Every branch ends with verify-fulfillment. EXTENDING to a new fulfilment type: add it to choice_points[fulfillment-type].options, add its own lister step (guarded by applies_when on the new type value), and ensure bind-fulfillment-flow.fulfillmentType accepts the new wire value. No change to the anchor handling or verify.
|
|
74
|
-
|
|
75
|
-
## Verification Checklist
|
|
76
|
-
|
|
77
|
-
After every write operation, confirm the effect by re-reading state:
|
|
78
|
-
|
|
79
|
-
- After `resolve-catalog-item`, `bind-fulfillment-flow`: call `verify-fulfillment` (`GET /connect/service-automation/catalog/catalog-item/{catalogItemId}`)
|
|
80
|
-
|
|
81
|
-
## Operations Reference
|
|
82
|
-
|
|
83
|
-
Operations grouped by purpose. Use these as the building blocks for the workflows above.
|
|
84
|
-
|
|
85
|
-
### Summary
|
|
86
|
-
|
|
87
|
-
| Operation | Purpose | Status | Call | Depends on |
|
|
88
|
-
|-----------|---------|--------|------|------------|
|
|
89
|
-
| `resolve-catalog-item` | read | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | — |
|
|
90
|
-
| `list-fulfillment-flows` | read | implemented | `queryFulfillmentFlows` | `resolve-catalog-item` |
|
|
91
|
-
| `list-flow-orchestrations` | read | implemented | `queryFlowOrchestrations` | `resolve-catalog-item` |
|
|
92
|
-
| `list-stage-definitions` | read | implemented | `queryStageDefinitions` | `resolve-catalog-item` |
|
|
93
|
-
| `bind-fulfillment-flow` | write | implemented | `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions` |
|
|
94
|
-
| `verify-fulfillment` | verify | implemented | `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` | `resolve-catalog-item`, `bind-fulfillment-flow` |
|
|
95
|
-
|
|
96
|
-
### Dependency graph
|
|
97
|
-
|
|
98
|
-
```mermaid
|
|
99
|
-
graph TD
|
|
100
|
-
resolve_catalog_item["resolve-catalog-item (read)"]
|
|
101
|
-
list_fulfillment_flows["list-fulfillment-flows (read)"]
|
|
102
|
-
list_flow_orchestrations["list-flow-orchestrations (read)"]
|
|
103
|
-
list_stage_definitions["list-stage-definitions (read)"]
|
|
104
|
-
bind_fulfillment_flow["bind-fulfillment-flow (write)"]
|
|
105
|
-
verify_fulfillment["verify-fulfillment (verify)"]
|
|
106
|
-
resolve_catalog_item --> list_fulfillment_flows
|
|
107
|
-
resolve_catalog_item --> list_flow_orchestrations
|
|
108
|
-
resolve_catalog_item --> list_stage_definitions
|
|
109
|
-
resolve_catalog_item --> bind_fulfillment_flow
|
|
110
|
-
list_fulfillment_flows --> bind_fulfillment_flow
|
|
111
|
-
list_flow_orchestrations --> bind_fulfillment_flow
|
|
112
|
-
list_stage_definitions --> bind_fulfillment_flow
|
|
113
|
-
resolve_catalog_item --> verify_fulfillment
|
|
114
|
-
bind_fulfillment_flow --> verify_fulfillment
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Read operations
|
|
118
|
-
|
|
119
|
-
#### `resolve-catalog-item`
|
|
120
|
-
|
|
121
|
-
CONFIRM + CAPTURE — GET the existing service process to prove it exists and to capture the identity fields the later bind must re-send. Fails fast (404) if the catalogItemId is wrong or the process was never created. Capture name, usedFor, isActive, targetObject (the anchor), the current intake surface (intakeForm.id AND intakeForm.intakeFormId + intakeForm.type — the bound Flow/OmniScript, NOT just the container id, so the bind carries the WHOLE surface forward) and the current fulfillmentFlow (to show what is already attached, if anything) — the bind step re-sends the identity fields to avoid the DETACH TRAP.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
**Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
125
|
-
|
|
126
|
-
**Inputs:**
|
|
127
|
-
|
|
128
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the EXISTING service process. If the user does not have it, the process must be created first before this workflow can run.
|
|
129
|
-
|
|
130
|
-
#### `list-fulfillment-flows`
|
|
131
|
-
|
|
132
|
-
ATTACH, FLOW — list the org's autolaunched Flows selectable as a fulfilment flow via UIAPI GraphQL: FlowRecord filtered to a non-draft ProgressStatus and an autolaunched FlowType. Present the COMPLETE set as numbered text (FlowLabel, FlowRecord_ApiName, and the bindable id) and let the user type their pick; page via pageInfo.endCursor (first:2000 + hasNextPage) — PRESENT smartly: if the user already NAMED the target, match it in the fetched set and show only the matches; if the set is small (≤ ~25) list it all as numbered text; if it is large, do NOT dump every row — show the most-recently-modified top slice (or ask a narrowing keyword) and invite the user to type a name to search (the full set is already fetched, so the local match stays exact). TARGETED LOOKUP: when the user has already NAMED the flow, add a label predicate to the where filter — {FlowLabel: {like: "%<name>%"}}, AND-combined with the ProgressStatus/FlowType filters above — to fetch just the matches in ONE call instead of paging the whole list; fall back to the full paged listing only when no name was given or the filtered query returns nothing. The list is org-specific — take it from this call, never a fixed list. ID TO BIND: bind the node.Id (the FlowRecord version id, 2aF-prefix), read from the chosen edge. node.Id is present for EVERY listed flow — including managed/packaged flows — and is the value the ProductFulfillmentScenario actually stores. A node.FlowDefinition.value (300-prefix definition id) ALSO binds when present, but managed/packaged flows carry a null FlowDefinition.value, so node.Id is the universal choice that matches what the "Associate a Fulfilment flow" modal binds. The catalog-item bind resolves either id form; only a value that is not a resolvable flow id (e.g. a namespaced DeveloperName string) is rejected.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
**Call:** `queryFulfillmentFlows` — status: `implemented`
|
|
136
|
-
|
|
137
|
-
**Depends on:** `resolve-catalog-item`
|
|
138
|
-
|
|
139
|
-
#### `list-flow-orchestrations`
|
|
140
|
-
|
|
141
|
-
ATTACH, FLOW ORCHESTRATOR — list the org's Flow Orchestrations selectable as a fulfilment flow via UIAPI GraphQL: FlowOrchestration filtered to a non-draft Status. Present the COMPLETE set as numbered text (OrchestrationLabel, id) and let the user type their pick; page via pageInfo.endCursor (first:2000 + hasNextPage) — PRESENT smartly: if the user already NAMED the target, match it in the fetched set and show only the matches; if the set is small (≤ ~25) list it all as numbered text; if it is large, do NOT dump every row — show the most-recently-modified top slice (or ask a narrowing keyword) and invite the user to type a name to search (the full set is already fetched, so the local match stays exact). TARGETED LOOKUP: when the user has already NAMED the orchestration, add a label predicate to the where filter — {OrchestrationLabel: {like: "%<name>%"}}, AND-combined with the Status filter above — to fetch just the matches in ONE call instead of paging the whole list; fall back to the full paged listing only when no name was given or the filtered query returns nothing. The list is org-specific — take it from this call, never a fixed list. ID TO BIND: bind the node.Id (the FlowOrchestration record id, 1Fe-prefix), read from the chosen edge. node.Id is present for EVERY listed orchestration — including managed/packaged ones — and is what the ProductFulfillmentScenario stores. A node.OrchestrationDefinition.value (300-prefix definition id) ALSO binds when present, but managed/packaged orchestrations carry a null OrchestrationDefinition.value, so node.Id is the universal choice.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
**Call:** `queryFlowOrchestrations` — status: `implemented`
|
|
145
|
-
|
|
146
|
-
**Depends on:** `resolve-catalog-item`
|
|
147
|
-
|
|
148
|
-
#### `list-stage-definitions`
|
|
149
|
-
|
|
150
|
-
ATTACH, STAGE MANAGEMENT — list the org's Stage Definitions selectable as a fulfilment flow via a SOQL query over the StageDefinition SObject (Id, MasterLabel, DeveloperName, IsActive). Present the COMPLETE set as numbered text (MasterLabel, id) and let the user type their pick; PRESENT smartly — match a named target locally, list a small set in full, and narrow a large one (typed name or a recent top slice) rather than dumping every row. TARGETED LOOKUP: when the user has already NAMED the stage definition, append AND MasterLabel LIKE '%<name>%' to the SOQL WHERE to fetch just the matches in ONE call instead of paging the whole list; fall back to the full listing only when no name was given or the filter returns nothing. The list is org-specific — take it from this call, never a fixed list. The chosen record's Id becomes fulfillmentFlow.fulfillmentFlowId on the bind.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
**Call:** `queryStageDefinitions` — status: `implemented`
|
|
154
|
-
|
|
155
|
-
**Inputs:**
|
|
156
|
-
|
|
157
|
-
- `q` *(`string`)*
|
|
158
|
-
|
|
159
|
-
**Depends on:** `resolve-catalog-item`
|
|
160
|
-
|
|
161
|
-
### Write operations
|
|
162
|
-
|
|
163
|
-
#### `bind-fulfillment-flow`
|
|
164
|
-
|
|
165
|
-
ATTACH BIND — bind the chosen Flow / Flow Orchestrator / Stage Definition to the process via patchCatalogItemGet, sending fulfillmentFlow:{fulfillmentFlowId:<chosen id>, operationType:<computed>, type:<Flow|FlowOrchestrator|StageManagement>}. OPERATIONTYPE IS COMPUTED (Create/Update split, same as the intake container): if resolve-catalog-item returned NO fulfillmentFlow, send operationType:"Create" with NO fulfillmentFlow.id — this mints the ProductFulfillmentScenario and binds the flow. A hardcoded operationType:"Update" on a first attach SILENTLY NO-OPS (the PATCH 200s but the flow never persists — reads back absent on the verify GET). If a fulfillmentFlow is already bound, send operationType:"Update" AND carry resolve-catalog-item.existing_fulfillment_scenario_id forward as fulfillmentFlow.id to repoint the existing scenario. [precondition: bind_fulfillment_operation_type_rule] DETACH TRAP: the PATCH is a FULL overwrite — it MUST also re-send the item's identity fields (targetObject, name, usedFor, isActive), sourced from resolve-catalog-item. Omitting targetObject CLEARS the anchor (it reads back absent on the next GET, not reset to a default); omitting name/usedFor nulls them too. The intakeForm block is ALSO a full overwrite: when the item has an intake surface, re-send the FULL block — intakeForm.id (container) AND intakeForm.intakeFormId (the bound Flow/OmniScript) AND intakeForm.type, all from resolve-catalog-item, with operationType:"Update". Sending only {id, operationType:Update} preserves the container but WIPES the bound surface (intakeFormId + type vanish). Omit the intakeForm block only if resolve-catalog-item returned no intake_surface_id.
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
**Call:** `PATCH /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
169
|
-
|
|
170
|
-
**Inputs:**
|
|
171
|
-
|
|
172
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to bind the fulfilment flow to.
|
|
173
|
-
- `fulfillmentFlowId` *(`String`)* — The chosen fulfilment surface id — for a Flow, the node.Id (2aF-prefix FlowRecord version id) from list-fulfillment-flows.flows; present for every flow including managed/packaged ones and what the scenario stores (node.FlowDefinition.value, the 300-prefix definition id, also binds when non-null but is absent for managed flows); for a Flow Orchestrator, the node.Id (1Fe-prefix record id) from list-flow-orchestrations.orchestration_record_ids (present for every orchestration; OrchestrationDefinition.value also binds when non-null but is absent for managed orchestrations); for Stage Management, an Id from list-stage-definitions.stage_definition_ids. MUST be one of the listed ids for this org, never hand-constructed. Sent as fulfillmentFlow.fulfillmentFlowId.
|
|
174
|
-
|
|
175
|
-
- **Source:** output of `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions`
|
|
176
|
-
- `fulfillmentType` *(`String`)* — "Flow", "FlowOrchestrator", or "StageManagement" (the FulfillmentFlowEnums value) — the chosen fulfilment type. Sent as fulfillmentFlow.type.
|
|
177
|
-
|
|
178
|
-
- `fulfillmentOperationType` *(`String`)* — COMPUTED — "Create" when resolve-catalog-item returned NO fulfillmentFlow (first attach; mints the ProductFulfillmentScenario), "Update" when a fulfillmentFlow is already bound (repoints the existing scenario). Sent as fulfillmentFlow.operationType. A hardcoded "Update" on first attach silently no-ops. [precondition: bind_fulfillment_operation_type_rule]
|
|
179
|
-
|
|
180
|
-
- `fulfillmentScenarioId` *(`String`)* — The existing ProductFulfillmentScenario id (fulfillmentFlow.id, 1ax-prefix) from resolve-catalog-item — carried forward as fulfillmentFlow.id ONLY on the replace path (fulfillmentOperationType=="Update"). Omit fulfillmentFlow.id entirely on the first-attach (Create) path.
|
|
181
|
-
|
|
182
|
-
- **Source:** output of `resolve-catalog-item`
|
|
183
|
-
- `intakeContainerId` *(`String`)* — The existing intake container id (intakeForm.id) from resolve-catalog-item, carried forward as intakeForm.id (with operationType:"Update"). NOTE the container id alone is NOT enough — the intakeForm block is a full overwrite, so intakeSurfaceId + intakeSurfaceType below must also be re-sent or the bound surface is wiped. Omit the whole intakeForm block only when resolve-catalog-item returned no intake_surface_id.
|
|
184
|
-
|
|
185
|
-
- **Source:** output of `resolve-catalog-item`
|
|
186
|
-
- `intakeSurfaceId` *(`String`)* — The bound intake surface id (intakeForm.intakeFormId — the Flow/OmniScript definition id) from resolve-catalog-item. MUST be re-sent alongside the container id: sending intakeForm with only {id} wipes the surface. Present only when the item has a surface.
|
|
187
|
-
|
|
188
|
-
- **Source:** output of `resolve-catalog-item`
|
|
189
|
-
- `intakeSurfaceType` *(`String`)* — The bound intake surface type (intakeForm.type — "Flow" or "OmniScript") from resolve-catalog-item. Re-sent with intakeSurfaceId to preserve the bound surface.
|
|
190
|
-
|
|
191
|
-
- **Source:** output of `resolve-catalog-item`
|
|
192
|
-
- `targetObject` *(`String`)* — The anchor object — a CLOSED enum: Case, Incident, or ServiceRequest (TargetObjectEnums; other SObjects are rejected). Re-sent on this full-overwrite Update or the anchor CLEARS — it reads back absent on the next GET, not reset to a default (DETACH TRAP). Take the value from resolve-catalog-item, never a fixed assumption.
|
|
193
|
-
|
|
194
|
-
- **Source:** output of `resolve-catalog-item`
|
|
195
|
-
- `name` *(`String`)* — The process name — re-sent to preserve identity on this full-overwrite Update.
|
|
196
|
-
- `usedFor` *(`String`)* — The usedFor value (ServiceProcess) — re-sent to preserve identity.
|
|
197
|
-
- `isActive` *(`Boolean`)* — The isActive flag — re-sent to preserve identity.
|
|
198
|
-
|
|
199
|
-
**Depends on:** `resolve-catalog-item`, `list-fulfillment-flows`, `list-flow-orchestrations`, `list-stage-definitions`
|
|
200
|
-
|
|
201
|
-
**Rollback:** To unbind, re-invoke patchCatalogItemGet with fulfillmentFlow:{id:<the 1ax scenario id from fulfillment_scenario_id>, fulfillmentFlowId, type, operationType:"Delete"}, always re-sending the anchor identity fields AND the full intakeForm block (id + intakeFormId + type when a surface exists) — the unbind PATCH is the same full-overwrite, so anchor-only re-send would wipe the surface; the verify GET then shows no fulfillmentFlow. To swap instead of remove, re-bind a different surface with operationType:"Update" carrying the same scenario id. The catalog-item resource itself has no DELETE method.
|
|
202
|
-
|
|
203
|
-
### Verify operations
|
|
204
|
-
|
|
205
|
-
#### `verify-fulfillment`
|
|
206
|
-
|
|
207
|
-
Read the process back and confirm the fulfilment flow is bound and the anchor held. Works for every branch (Flow / FlowOrchestrator / StageManagement).
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
**Call:** `GET /connect/service-automation/catalog/catalog-item/{catalogItemId}` — status: `implemented`
|
|
211
|
-
|
|
212
|
-
**Inputs:**
|
|
213
|
-
|
|
214
|
-
- `catalogItemId` *(`String`)* — The catalogItemId (== productId) of the process to verify.
|
|
215
|
-
|
|
216
|
-
**Depends on:** `resolve-catalog-item`, `bind-fulfillment-flow`
|