@salesforce/afv-skills 1.46.0 → 1.48.0
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/agentforce-observe/SKILL.md +32 -4
- package/skills/agentforce-observe/references/ahm-alerts.md +719 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +275 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/README.md +32 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls +75 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls-meta.xml +5 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/interview-answers.json +13 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +10 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/create.json +20 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/update.json +16 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +273 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +236 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/references/reference-example-set-comment-value.md +132 -0
- package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +211 -0
- package/skills/dx-devops-project-manage/SKILL.md +197 -0
- package/skills/dx-devops-project-manage/examples/common-workflows.md +197 -0
- package/skills/dx-devops-project-manage/references/cli-commands.md +295 -0
- package/skills/dx-devops-project-manage/scripts/create-project.sh +48 -0
- package/skills/dx-devops-project-manage/scripts/list-projects.sh +51 -0
- package/skills/dx-devops-project-manage/scripts/update-project.sh +96 -0
- package/skills/education-cloud-academic-calendar-generate/SKILL.md +225 -0
- package/skills/education-cloud-academic-calendar-generate/examples/quarter-calendar.json +47 -0
- package/skills/education-cloud-academic-calendar-generate/examples/sample-output.md +57 -0
- package/skills/education-cloud-academic-calendar-generate/examples/semester-calendar.json +54 -0
- package/skills/education-cloud-academic-calendar-generate/references/calendar-systems.md +127 -0
- package/skills/education-cloud-academic-calendar-generate/references/date-validation.md +222 -0
- package/skills/education-cloud-academic-calendar-generate/references/foundation_prerequisites.md +40 -0
- package/skills/education-cloud-academic-calendar-generate/scripts/validate_calendar_dates.py +143 -0
- package/skills/education-cloud-course-catalog-migrate/SKILL.md +321 -0
- package/skills/education-cloud-course-catalog-migrate/references/gotchas-detail.md +16 -0
- package/skills/education-cloud-course-catalog-migrate/references/gotchas.md +16 -0
- package/skills/education-cloud-course-catalog-migrate/references/large-catalog-handling.md +42 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/batch_courses.py +36 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/detect_linked_courses.py +51 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/detect_modality_variants.py +48 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/resolve_api_version.py +43 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/split_course_code.py +39 -0
- package/skills/education-cloud-course-catalog-migrate/scripts/validate_completeness.py +54 -0
- package/skills/education-cloud-domain-configure/SKILL.md +234 -0
- package/skills/education-cloud-domain-configure/references/dependent-features.md +198 -0
- package/skills/education-cloud-domain-configure/references/domain-features/academic-operations.md +386 -0
- package/skills/education-cloud-domain-configure/references/domain-features/alumni-relations.md +155 -0
- package/skills/education-cloud-domain-configure/references/domain-features/cross-domain-dependencies.md +18 -0
- package/skills/education-cloud-domain-configure/references/domain-features/industriessettings-toggle-reference.md +43 -0
- package/skills/education-cloud-domain-configure/references/domain-features/mentoring.md +198 -0
- package/skills/education-cloud-domain-configure/references/domain-features/recruitment-admissions.md +315 -0
- package/skills/education-cloud-domain-configure/references/domain-features/student-management.md +155 -0
- package/skills/education-cloud-domain-configure/references/domain-features/student-success.md +249 -0
- package/skills/education-cloud-domain-configure/references/domain-features.md +27 -0
- package/skills/education-cloud-domain-configure/references/gotchas-extended.md +23 -0
- package/skills/education-cloud-domain-configure/references/toggle-write-path.md +67 -0
- package/skills/education-cloud-domain-configure/scripts/check_license_provisioned.py +62 -0
- package/skills/education-cloud-domain-configure/scripts/check_org_edition.py +44 -0
- package/skills/education-cloud-domain-configure/scripts/check_permission_assigned.py +39 -0
- package/skills/education-cloud-multi-campus-configure/SKILL.md +7 -0
- package/skills/education-cloud-multi-campus-configure/references/foundation_prerequisites.md +1 -2
- package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +177 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/agent-and-subagents.md +151 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/customer-narration.md +34 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/execution-model.md +54 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/flows.md +82 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/grounding.md +199 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/permissions.md +183 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/platform-enablement.md +82 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/prerequisites.md +158 -0
- package/skills/education-cloud-student-recruitment-agent-configure/references/routing.md +141 -0
- package/skills/experience-cms-brand-apply/SKILL.md +5 -5
- package/skills/experience-cms-brand-create/SKILL.md +2 -2
- package/skills/experience-cms-content-generate/SKILL.md +1 -0
- package/skills/experience-cms-content-render/SKILL.md +173 -0
- package/skills/experience-cms-content-render/assets/angular/DetailPage.component.ts +25 -0
- package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +133 -0
- package/skills/experience-cms-content-render/assets/angular/TypeList.component.ts +38 -0
- package/skills/experience-cms-content-render/assets/angular/TypeRenderer.component.ts +90 -0
- package/skills/experience-cms-content-render/assets/angular/cms-content.component.ts +248 -0
- package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +100 -0
- package/skills/experience-cms-content-render/assets/react/DetailPage.tsx +20 -0
- package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +129 -0
- package/skills/experience-cms-content-render/assets/react/TypeList.tsx +40 -0
- package/skills/experience-cms-content-render/assets/react/TypeRenderer.tsx +64 -0
- package/skills/experience-cms-content-render/assets/react/heuristicRenderer.tsx +310 -0
- package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +129 -0
- package/skills/experience-cms-content-render/assets/shared/cmsContentType.ts +49 -0
- package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +96 -0
- package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +55 -0
- package/skills/experience-cms-content-render/references/bulk-loading.md +60 -0
- package/skills/experience-cms-content-render/references/codegen-guardrails.md +111 -0
- package/skills/experience-cms-content-render/references/detail-pages.md +87 -0
- package/skills/experience-cms-content-render/references/embed-recipes.md +127 -0
- package/skills/experience-cms-content-render/references/failure-modes.md +96 -0
- package/skills/experience-cms-content-render/references/heuristic-render-rules.md +131 -0
- package/skills/experience-cms-content-render/references/init-scaffold.md +122 -0
- package/skills/experience-cms-content-render/references/interaction-model.md +173 -0
- package/skills/experience-cms-content-render/references/package-api.md +106 -0
- package/skills/experience-cms-content-render/references/schema-sync.md +114 -0
- package/skills/experience-cms-content-render/references/styling-scopes.md +65 -0
- package/skills/experience-cms-content-render/references/verify.md +49 -0
- package/skills/experience-cms-content-type-generate/SKILL.md +2 -2
- package/skills/experience-content-media-stock-image-search/SKILL.md +5 -4
- package/skills/experience-search-coordinate/SKILL.md +198 -0
- package/skills/experience-search-coordinate/assets/search-payload-template.json +25 -0
- package/skills/experience-search-coordinate/references/content-route.md +313 -0
- package/skills/experience-search-coordinate/references/content-type-discovery.md +57 -0
- package/skills/experience-search-coordinate/references/media-route.md +172 -0
- package/skills/experience-search-coordinate/references/scope-resolution.md +14 -0
- package/skills/experience-ui-bundle-localize/SKILL.md +1 -1
- package/skills/experience-ui-bundle-localize/references/i18n-setup.md +5 -3
- package/skills/experience-ui-bundle-project-generate/SKILL.md +18 -14
- package/skills/experience-ui-bundle-project-generate/references/angular-project-generate.md +22 -0
- package/skills/experience-ui-bundle-project-generate/references/react-project-generate.md +20 -0
- package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +58 -54
- package/skills/experience-ui-bundle-salesforce-data-access/references/caching.md +6 -0
- package/skills/experience-ui-bundle-salesforce-data-access/references/graphiti-cli.md +2 -2
- package/skills/experience-ui-bundle-salesforce-data-access/references/migration.md +6 -0
- package/skills/experience-ui-bundle-salesforce-data-access/references/rest-and-integration.md +2 -1
- package/skills/experience-ui-bundle-salesforce-data-access/references/sdk-api.md +6 -0
- package/skills/experience-ui-bundle-site-generate/SKILL.md +59 -8
- package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience.md +8 -3
- package/skills/experience-ui-bundle-site-generate/references/configure-metadata-language-settings.md +120 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +336 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +143 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +127 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-deploy-commands.md +116 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +111 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-overview.md +312 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +171 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-state-tracking.md +64 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-trigger-handlers.md +122 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-overview.md +335 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-user-provisioning-details.md +140 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-execution-state-and-recovery.md +196 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-metadata-cache-generation.md +155 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-overview.md +307 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-visit-creation-data.md +211 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/references/state-machine-and-changes.md +108 -0
- package/skills/life-sciences-kam-coordinate/SKILL.md +241 -0
- package/skills/life-sciences-kam-coordinate/references/orchestration-flow.md +152 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +79 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-deploy-commands.md +131 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-kam-config-records.md +85 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +112 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-overview.md +202 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +67 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-state-tracking.md +65 -0
- package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-trigger-handlers.md +123 -0
- package/skills/life-sciences-kam-coordinate/references/stage-4-participant-role-and-sprint.md +89 -0
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +337 -0
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-creation-data.md +248 -0
- package/skills/life-sciences-kam-coordinate/references/stage-6-ipad-validation-script.md +35 -0
- package/skills/life-sciences-kam-coordinate/references/stage-6-metadata-cache-generation.md +155 -0
- package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-details.md +146 -0
- package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-overview.md +89 -0
- package/skills/life-sciences-kam-coordinate/references/state-machine-and-changes.md +114 -0
- package/skills/life-sciences-prerequisites-validate/SKILL.md +138 -0
- package/skills/life-sciences-prerequisites-validate/references/checks-org-settings.md +190 -0
- package/skills/life-sciences-prerequisites-validate/references/checks-user-and-package.md +211 -0
- package/skills/life-sciences-territory-configure/SKILL.md +217 -0
- package/skills/life-sciences-territory-configure/references/territory-metadata.md +262 -0
- package/skills/platform-dsar-policy-manage/SKILL.md +272 -0
- package/skills/platform-dsar-policy-manage/references/configure.md +106 -0
- package/skills/platform-dsar-policy-manage/references/export-and-history.md +123 -0
- package/skills/platform-dsar-policy-manage/references/gap-analysis-guide.md +150 -0
- package/skills/platform-dsar-policy-manage/references/gap-scan.md +129 -0
- package/skills/platform-dsar-policy-manage/references/headless-sor.md +59 -0
- package/skills/platform-dsar-policy-manage/references/report-format.md +59 -0
- package/skills/platform-dsar-policy-manage/scripts/tests/__init__.py +0 -0
- package/skills/platform-dsar-policy-manage/scripts/tests/test_validate_policy_tree.py +76 -0
- package/skills/platform-dsar-policy-manage/scripts/validate-policy-tree.py +130 -0
- package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +359 -0
- package/skills/platform-salesforce-connect-adapter-generate/references/official-examples.md +69 -0
- package/skills/platform-salesforce-connect-adapter-generate/references/scenarios.md +187 -0
- package/skills/service-agentforce-channel-configure/SKILL.md +33 -28
- package/skills/service-agentforce-human-escalation-configure/SKILL.md +205 -0
- package/skills/service-agentforce-human-escalation-configure/assets/escalation-thresholds.instructions.md +37 -0
- package/skills/service-agentforce-human-escalation-configure/assets/force-app/main/default/flows/Human_Escalation_Outbound_Flow.flow-meta.xml +173 -0
- package/skills/service-agentforce-human-escalation-configure/assets/package.xml +8 -0
- package/skills/service-agentforce-human-escalation-configure/assets/sfdx-project.json +5 -0
- package/skills/service-agentforce-human-escalation-configure/references/classifier-contracts.md +103 -0
- package/skills/service-agentforce-human-escalation-configure/references/escalation-mechanism.md +63 -0
- package/skills/service-agentforce-human-escalation-configure/references/failure-policy.md +44 -0
- package/skills/service-agentforce-human-escalation-configure/references/nga-escalation.md +57 -0
- package/skills/service-agentforce-human-escalation-configure/references/runtime-verification.md +72 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/classify-agent-active.mjs +49 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/classify-nga-escalation.mjs +166 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/extract-outbound-route.mjs +67 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/patch-escalation-surfaces.mjs +131 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/__init__.py +0 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +249 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +899 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/verify-and-configure.sh +705 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/verify-escalation-config.mjs +89 -0
- package/skills/service-de-channel-routing-configure/SKILL.md +13 -5
- package/skills/service-de-channel-routing-configure/scripts/tests/test_skill_contract.py +25 -0
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +23 -10
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +63 -48
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +6 -2
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +20 -27
- package/skills/service-native-voice-recording-transcription-configure/SKILL.md +47 -27
- package/skills/service-native-voice-recording-transcription-configure/references/thunderbird-voice-settings.md +13 -9
- package/skills/service-native-voice-recording-transcription-configure/scripts/enable-recording-transcription.sh +104 -45
- package/skills/service-omni-agent-users-create/SKILL.md +96 -0
- package/skills/service-omni-agent-users-create/assets/create-users.apex.template +80 -0
- package/skills/service-omni-agent-users-create/references/apex-patterns.md +135 -0
- package/skills/service-omni-agent-users-create/references/apex-template-notes.md +40 -0
- package/skills/service-omni-agent-users-create/scripts/detect-and-create.sh +206 -0
- package/skills/service-omni-agent-users-create/scripts/detect-existing.sh +122 -0
- package/skills/service-omni-agent-users-create/scripts/run-create.sh +298 -0
- package/skills/service-omni-agent-users-create/scripts/tests/test_user_create_security.py +171 -0
- package/skills/service-omni-agent-work-sharing-configure/SKILL.md +78 -0
- package/skills/service-omni-agent-work-sharing-configure/references/api-notes.md +31 -0
- package/skills/service-omni-agent-work-sharing-configure/scripts/configure-and-report.sh +186 -0
- package/skills/service-omni-agent-work-sharing-configure/scripts/tests/_bootstrap.py +120 -0
- package/skills/service-omni-agent-work-sharing-configure/scripts/tests/test_agent_work_sharing_contracts.py +93 -0
- package/skills/service-omni-base-settings-configure/SKILL.md +77 -0
- package/skills/service-omni-base-settings-configure/assets/force-app/main/default/settings/OmniChannel.settings-meta.xml +8 -0
- package/skills/service-omni-base-settings-configure/assets/package.xml +8 -0
- package/skills/service-omni-base-settings-configure/assets/sfdx-project.json +12 -0
- package/skills/service-omni-base-settings-configure/references/api-notes.md +121 -0
- package/skills/service-omni-base-settings-configure/scripts/configure-and-report.sh +164 -0
- package/skills/service-omni-base-settings-configure/scripts/detect-existing.sh +69 -0
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +168 -0
- package/skills/service-omni-channel-setup-coordinate/examples/output-templates.md +161 -0
- package/skills/service-omni-channel-setup-coordinate/references/gap-catalog.md +99 -0
- package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +1542 -0
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/__init__.py +0 -0
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/_bootstrap.py +223 -0
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +804 -0
- package/skills/service-omni-command-center-analyze/SKILL.md +84 -0
- package/skills/service-omni-command-center-analyze/references/api-notes.md +54 -0
- package/skills/service-omni-command-center-analyze/scripts/analyze.sh +198 -0
- package/skills/service-omni-command-center-analyze/scripts/tests/_bootstrap.py +115 -0
- package/skills/service-omni-command-center-analyze/scripts/tests/test_command_center_analyze_contracts.py +165 -0
- package/skills/service-omni-permission-set-assign/SKILL.md +88 -0
- package/skills/service-omni-permission-set-assign/assets/package.xml +8 -0
- package/skills/service-omni-permission-set-assign/references/api-notes.md +143 -0
- package/skills/service-omni-permission-set-assign/scripts/verify-and-assign.sh +397 -0
- package/skills/service-omni-presence-status-deploy/SKILL.md +87 -0
- package/skills/service-omni-presence-status-deploy/assets/package.xml +12 -0
- package/skills/service-omni-presence-status-deploy/references/api-notes.md +115 -0
- package/skills/service-omni-presence-status-deploy/scripts/deploy-and-report.sh +422 -0
- package/skills/service-omni-presence-user-config-deploy/SKILL.md +80 -0
- package/skills/service-omni-presence-user-config-deploy/references/api-notes.md +60 -0
- package/skills/service-omni-presence-user-config-deploy/scripts/deploy-and-report.sh +261 -0
- package/skills/service-omni-presence-user-config-deploy/scripts/tests/_bootstrap.py +106 -0
- package/skills/service-omni-presence-user-config-deploy/scripts/tests/test_presence_user_config_contracts.py +142 -0
- package/skills/service-omni-queue-deploy/SKILL.md +91 -0
- package/skills/service-omni-queue-deploy/references/api-notes.md +140 -0
- package/skills/service-omni-queue-deploy/scripts/verify-and-align.sh +470 -0
- package/skills/service-omni-queue-members-assign/SKILL.md +93 -0
- package/skills/service-omni-queue-members-assign/references/api-notes.md +144 -0
- package/skills/service-omni-queue-members-assign/scripts/tests/_bootstrap.py +67 -0
- package/skills/service-omni-queue-members-assign/scripts/tests/test_queue_members_contracts.py +73 -0
- package/skills/service-omni-queue-members-assign/scripts/verify-and-bind.sh +362 -0
- package/skills/service-omni-queue-routing-config-deploy/SKILL.md +101 -0
- package/skills/service-omni-queue-routing-config-deploy/references/api-notes.md +127 -0
- package/skills/service-omni-queue-routing-config-deploy/scripts/tests/_bootstrap.py +90 -0
- package/skills/service-omni-queue-routing-config-deploy/scripts/tests/test_queue_routing_config_contracts.py +70 -0
- package/skills/service-omni-queue-routing-config-deploy/scripts/upsert-and-report.sh +538 -0
- package/skills/service-omni-routing-flow-deploy/SKILL.md +111 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.SkillsBased.flow-meta.xml +94 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.flow-meta.xml +88 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Cases.flow-meta.xml +144 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.SkillsBased.flow-meta.xml +94 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.flow-meta.xml +88 -0
- package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCalls.flow-meta.xml +144 -0
- package/skills/service-omni-routing-flow-deploy/assets/package.xml +11 -0
- package/skills/service-omni-routing-flow-deploy/assets/sfdx-project.json +11 -0
- package/skills/service-omni-routing-flow-deploy/references/api-notes.md +265 -0
- package/skills/service-omni-routing-flow-deploy/scripts/deploy-and-report.sh +684 -0
- package/skills/service-omni-service-channel-configure/SKILL.md +83 -0
- package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Cases.serviceChannel-meta.xml +9 -0
- package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Incidents.serviceChannel-meta.xml +9 -0
- package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/MessagingSessions.serviceChannel-meta.xml +9 -0
- package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/VoiceCalls.serviceChannel-meta.xml +9 -0
- package/skills/service-omni-service-channel-configure/assets/package.xml +11 -0
- package/skills/service-omni-service-channel-configure/assets/sfdx-project.json +12 -0
- package/skills/service-omni-service-channel-configure/references/api-notes.md +84 -0
- package/skills/service-omni-service-channel-configure/scripts/deploy-and-report.sh +383 -0
- package/skills/service-omni-sidebar-configure/SKILL.md +77 -0
- package/skills/service-omni-sidebar-configure/references/api-notes.md +51 -0
- package/skills/service-omni-sidebar-configure/scripts/enable-and-report.sh +315 -0
- package/skills/service-omni-sidebar-configure/scripts/tests/_bootstrap.py +142 -0
- package/skills/service-omni-sidebar-configure/scripts/tests/test_sidebar_contracts.py +139 -0
- package/skills/service-omni-skills-based-routing-configure/SKILL.md +81 -0
- package/skills/service-omni-skills-based-routing-configure/references/api-notes.md +50 -0
- package/skills/service-omni-skills-based-routing-configure/scripts/configure-and-report.sh +270 -0
- package/skills/service-omni-skills-based-routing-configure/scripts/tests/_bootstrap.py +120 -0
- package/skills/service-omni-skills-based-routing-configure/scripts/tests/test_sbr_contracts.py +129 -0
- package/skills/service-omni-supervisor-config-deploy/SKILL.md +97 -0
- package/skills/service-omni-supervisor-config-deploy/assets/force-app/main/default/omniSupervisorConfigs/Omni_Supervisor.omniSupervisorConfig-meta.xml +9 -0
- package/skills/service-omni-supervisor-config-deploy/assets/package.xml +8 -0
- package/skills/service-omni-supervisor-config-deploy/assets/sfdx-project.json +12 -0
- package/skills/service-omni-supervisor-config-deploy/references/api-notes.md +205 -0
- package/skills/service-omni-supervisor-config-deploy/scripts/deploy-and-report.sh +586 -0
- package/skills/service-omni-supervisor-config-deploy/scripts/tests/_bootstrap.py +153 -0
- package/skills/service-omni-supervisor-config-deploy/scripts/tests/test_supervisor_config_contracts.py +116 -0
- package/skills/service-omni-supervisor-permset-assign/SKILL.md +88 -0
- package/skills/service-omni-supervisor-permset-assign/references/api-notes.md +48 -0
- package/skills/service-omni-supervisor-permset-assign/scripts/verify-and-assign.sh +316 -0
- package/skills/service-omni-supervisor-surface-deploy/SKILL.md +85 -0
- package/skills/service-omni-supervisor-surface-deploy/references/api-notes.md +47 -0
- package/skills/service-omni-supervisor-surface-deploy/scripts/deploy-and-report.sh +216 -0
- package/skills/service-omni-supervisor-surface-deploy/scripts/tests/_bootstrap.py +95 -0
- package/skills/service-omni-supervisor-surface-deploy/scripts/tests/test_supervisor_surface_contracts.py +154 -0
- package/skills/service-omni-supervisor-users-create/SKILL.md +92 -0
- package/skills/service-omni-supervisor-users-create/assets/create-supervisors.apex.template +72 -0
- package/skills/service-omni-supervisor-users-create/references/apex-patterns.md +73 -0
- package/skills/service-omni-supervisor-users-create/references/apex-template-notes.md +41 -0
- package/skills/service-omni-supervisor-users-create/scripts/detect-and-create.sh +197 -0
- package/skills/service-omni-supervisor-users-create/scripts/detect-existing.sh +112 -0
- package/skills/service-omni-supervisor-users-create/scripts/run-create.sh +296 -0
- package/skills/service-omni-work-skill-routing-configure/SKILL.md +80 -0
- package/skills/service-omni-work-skill-routing-configure/references/api-notes.md +67 -0
- package/skills/service-omni-work-skill-routing-configure/scripts/configure-and-report.sh +262 -0
- package/skills/service-omni-work-skill-routing-configure/scripts/tests/_bootstrap.py +121 -0
- package/skills/service-omni-work-skill-routing-configure/scripts/tests/test_work_skill_routing_contracts.py +161 -0
package/skills/service-omni-skills-based-routing-configure/scripts/tests/test_sbr_contracts.py
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Contract tests for service-omni-skills-based-routing-configure/scripts/configure-and-report.sh."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import sys
|
|
7
|
+
import unittest
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
11
|
+
from _bootstrap import ( # noqa: E402
|
|
12
|
+
FakeSf,
|
|
13
|
+
_FAKE_SF_PROD,
|
|
14
|
+
_FAKE_SF_SANDBOX,
|
|
15
|
+
run,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _last_json(out: str) -> dict:
|
|
20
|
+
dec = json.JSONDecoder()
|
|
21
|
+
obj, i, n = None, 0, len(out)
|
|
22
|
+
while i < n:
|
|
23
|
+
if out[i] in "{[":
|
|
24
|
+
try:
|
|
25
|
+
cand, end = dec.raw_decode(out, i)
|
|
26
|
+
if isinstance(cand, dict):
|
|
27
|
+
obj = cand
|
|
28
|
+
i = end
|
|
29
|
+
continue
|
|
30
|
+
except json.JSONDecodeError:
|
|
31
|
+
pass
|
|
32
|
+
i += 1
|
|
33
|
+
assert obj is not None, f"no JSON object found in output:\n{out}"
|
|
34
|
+
return obj
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class InputContractTests(unittest.TestCase):
|
|
38
|
+
def test_missing_args_rejected(self):
|
|
39
|
+
rc, out = run(["myorg"], scrub_sf=True)
|
|
40
|
+
self.assertEqual(rc, 1, out)
|
|
41
|
+
self.assertIn("Usage", out)
|
|
42
|
+
|
|
43
|
+
def test_injection_shaped_skill_name_rejected(self):
|
|
44
|
+
rc, out = run(["myorg", "Bad Skill; DROP", "a@b.com"], scrub_sf=True)
|
|
45
|
+
self.assertEqual(rc, 1, out)
|
|
46
|
+
self.assertIn("Invalid skill_developer_name", out)
|
|
47
|
+
|
|
48
|
+
def test_missing_agents_rejected(self):
|
|
49
|
+
rc, out = run(["myorg", "Omni_Demo_Voice"], scrub_sf=True)
|
|
50
|
+
self.assertEqual(rc, 1, out)
|
|
51
|
+
self.assertIn("No agents supplied", out)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ProductionGuardTests(unittest.TestCase):
|
|
55
|
+
def test_refuses_production_org(self):
|
|
56
|
+
with FakeSf(_FAKE_SF_PROD) as p:
|
|
57
|
+
rc, out = run(["prodorg", "Omni_Demo_Voice", "agent1@example.com"], path_prefix=p)
|
|
58
|
+
self.assertEqual(rc, 1, out)
|
|
59
|
+
v = _last_json(out)
|
|
60
|
+
self.assertEqual(v["status"], "blocked", out)
|
|
61
|
+
self.assertIn("production", v["blocking_issue"].lower())
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ConfigureTests(unittest.TestCase):
|
|
65
|
+
def test_full_create_deploys_skill_and_binds(self):
|
|
66
|
+
with FakeSf(_FAKE_SF_SANDBOX) as p:
|
|
67
|
+
rc, out = run(["sandbox", "Omni_Demo_Voice", "agent1@example.com,agent2@example.com"],
|
|
68
|
+
path_prefix=p, extra_env={"FAKE_SKILL_PRESENT": "0", "FAKE_BIND_PRESENT": "0"})
|
|
69
|
+
self.assertEqual(rc, 0, out)
|
|
70
|
+
v = _last_json(out)
|
|
71
|
+
self.assertEqual(v["status"], "configured", out)
|
|
72
|
+
self.assertEqual(v["skill_configured"]["state"], "created", out)
|
|
73
|
+
self.assertEqual(v["created_counts"]["skill_bindings"], 2, out)
|
|
74
|
+
self.assertNotIn("service_resources", v["created_counts"], out)
|
|
75
|
+
self.assertTrue(all("skill_binding_id" in agent for agent in v["agents"]), out)
|
|
76
|
+
|
|
77
|
+
def test_reused_when_all_present_no_writes(self):
|
|
78
|
+
with FakeSf(_FAKE_SF_SANDBOX) as p:
|
|
79
|
+
calllog = str(Path(p) / "calls.log")
|
|
80
|
+
rc, out = run(["sandbox", "Omni_Demo_Voice", "agent1@example.com,agent2@example.com"],
|
|
81
|
+
path_prefix=p, extra_env={"FAKE_SKILL_PRESENT": "1", "FAKE_BIND_PRESENT": "1",
|
|
82
|
+
"FAKE_SF_CALLLOG": calllog})
|
|
83
|
+
log = Path(calllog).read_text() if Path(calllog).exists() else ""
|
|
84
|
+
self.assertEqual(rc, 0, out)
|
|
85
|
+
v = _last_json(out)
|
|
86
|
+
self.assertEqual(v["status"], "reused", out)
|
|
87
|
+
self.assertNotIn("project deploy", log, "reused must not deploy the skill")
|
|
88
|
+
self.assertNotIn("--method POST", log, "reused must not create bindings")
|
|
89
|
+
|
|
90
|
+
def test_partial_when_one_binding_post_fails(self):
|
|
91
|
+
with FakeSf(_FAKE_SF_SANDBOX) as p:
|
|
92
|
+
rc, out = run(["sandbox", "Omni_Demo_Voice", "agent1@example.com,agent2@example.com"],
|
|
93
|
+
path_prefix=p, extra_env={"FAKE_SKILL_PRESENT": "1", "FAKE_BIND_PRESENT": "0",
|
|
94
|
+
"FAKE_BIND_POST_FAIL": "1"})
|
|
95
|
+
self.assertEqual(rc, 0, out)
|
|
96
|
+
v = _last_json(out)
|
|
97
|
+
self.assertEqual(v["status"], "partial", out)
|
|
98
|
+
self.assertIn("skill binding failed", v["blocking_issue"])
|
|
99
|
+
self.assertEqual(v["created_counts"]["skill_bindings"], 1, out)
|
|
100
|
+
|
|
101
|
+
def test_duplicate_value_is_treated_as_reused(self):
|
|
102
|
+
with FakeSf(_FAKE_SF_SANDBOX) as p:
|
|
103
|
+
rc, out = run(["sandbox", "Omni_Demo_Voice", "agent1@example.com,agent2@example.com"],
|
|
104
|
+
path_prefix=p, extra_env={"FAKE_SKILL_PRESENT": "1", "FAKE_BIND_PRESENT": "0",
|
|
105
|
+
"FAKE_BIND_DUPLICATE": "1"})
|
|
106
|
+
self.assertEqual(rc, 0, out)
|
|
107
|
+
v = _last_json(out)
|
|
108
|
+
self.assertIsNone(v["blocking_issue"], out)
|
|
109
|
+
self.assertNotEqual(v["status"], "partial", out)
|
|
110
|
+
self.assertEqual(v["created_counts"]["skill_bindings"], 0, out)
|
|
111
|
+
self.assertEqual(v["reused_counts"]["skill_bindings"], 2, out)
|
|
112
|
+
|
|
113
|
+
def test_plan_only_reports_without_writing(self):
|
|
114
|
+
with FakeSf(_FAKE_SF_SANDBOX) as p:
|
|
115
|
+
calllog = str(Path(p) / "calls.log")
|
|
116
|
+
rc, out = run(["sandbox", "Omni_Demo_Voice", "agent1@example.com"],
|
|
117
|
+
path_prefix=p, extra_env={"FAKE_SKILL_PRESENT": "0", "PLAN_ONLY": "1",
|
|
118
|
+
"FAKE_SF_CALLLOG": calllog})
|
|
119
|
+
log = Path(calllog).read_text() if Path(calllog).exists() else ""
|
|
120
|
+
self.assertEqual(rc, 0, out)
|
|
121
|
+
v = _last_json(out)
|
|
122
|
+
self.assertTrue(v.get("plan_mode"), out)
|
|
123
|
+
self.assertEqual(v["status"], "action_needed", out)
|
|
124
|
+
self.assertNotIn("project deploy", log, "plan mode must not deploy")
|
|
125
|
+
self.assertNotIn("--method POST", log, "plan mode must not POST")
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if __name__ == "__main__":
|
|
129
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: service-omni-supervisor-config-deploy
|
|
3
|
+
description: "Use to stand up a headless Omni-Channel Supervisor Configuration by deploying the classic OmniSupervisorConfig (parent plus supervisor-user and queue companions) in one atomic Metadata API deploy, idempotent via the deploy state. Requires active supervisor users, Omni base settings, and the monitored queues. Triggers: set up Omni Supervisor, configure the classic Supervisor Command Center. Do not use to create supervisor users, assign the ContactCenterSupervisor permission set, or deploy queues, service channels, or presence statuses."
|
|
4
|
+
allowed-tools: Bash Read Write Edit Glob Grep
|
|
5
|
+
metadata:
|
|
6
|
+
version: "1.0"
|
|
7
|
+
domains: ["Service"]
|
|
8
|
+
minApiVersion: "66.0"
|
|
9
|
+
relatedSkills:
|
|
10
|
+
- "service-omni-agent-work-sharing-configure"
|
|
11
|
+
- "service-omni-base-settings-configure"
|
|
12
|
+
- "service-omni-channel-setup-coordinate"
|
|
13
|
+
- "service-omni-presence-status-deploy"
|
|
14
|
+
- "service-omni-queue-deploy"
|
|
15
|
+
- "service-omni-service-channel-configure"
|
|
16
|
+
- "service-omni-supervisor-permset-assign"
|
|
17
|
+
- "service-omni-supervisor-surface-deploy"
|
|
18
|
+
accessCheck:
|
|
19
|
+
- type: license
|
|
20
|
+
value: ServiceCloud
|
|
21
|
+
cliTools:
|
|
22
|
+
- tool: ["jq"]
|
|
23
|
+
semver: ">=1.6"
|
|
24
|
+
- tool: ["python3"]
|
|
25
|
+
semver: ">=3.9"
|
|
26
|
+
- tool: ["sf"]
|
|
27
|
+
semver: ">=2.139.6"
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# service-omni-supervisor-config-deploy
|
|
31
|
+
|
|
32
|
+
Deploy the classic Omni-Channel Supervisor Configuration (`OmniSupervisorConfig`) to a Salesforce org in a single Metadata API deploy. `OmniSupervisorConfig` is a full Metadata API type whose XSD embeds every companion as a repeatable child element, so the whole configuration — parent plus companions — lands atomically from one `.omniSupervisorConfig-meta.xml` file, and Salesforce rolls the companions back together on a partial failure. By default the deploy binds supervisors explicitly by user and lists the queues they monitor; profile scope is optional (see Behavior).
|
|
33
|
+
|
|
34
|
+
## Inputs
|
|
35
|
+
|
|
36
|
+
`bash scripts/deploy-and-report.sh <org-alias> [supervisor_count] [additional_queues_csv] [profiles_csv] [skill_visibility] [config_developer_name]`
|
|
37
|
+
|
|
38
|
+
- `org-alias` (required) — must resolve via `sf org display --target-org <alias>`.
|
|
39
|
+
- `supervisor_count` (optional, default `1`, range `1..5`) — how many active `supervisor{N}.<suffix>@example.com` users to detect and bind.
|
|
40
|
+
- `additional_queues_csv` (optional) — queue DeveloperNames to bind. When the coordinator supplies this list it is authoritative; when omitted, the canonical `CaseQueue`, `messagingqueue` defaults are used. Every requested queue must already exist on the org.
|
|
41
|
+
- `profiles_csv` (optional) — opt into profile-based fallback scope; supply metadata profile fullNames (e.g. `Standard,ServiceCloud`). Omit it to bind supervisors by user only.
|
|
42
|
+
- `skill_visibility` (optional, or `OMNI_SUPERVISOR_SKILL_VISIBILITY`) — `AllSkills` or `AnySkill`. Omitted values preserve an existing config's selection; a new config defaults to `AllSkills`.
|
|
43
|
+
- `config_developer_name` (optional, or `OMNI_SUPERVISOR_CONFIG_DEVELOPER_NAME`; default `Omni_Supervisor`) — the exact classic `OmniSupervisorConfig.DeveloperName` to create or reconcile. Supply it when an org has multiple supervisor configurations; the skill never guesses between candidates. `OMNI_SUPERVISOR_CONFIG_MASTER_LABEL` optionally sets the label for a new config. Existing labels are preserved by default.
|
|
44
|
+
|
|
45
|
+
## Preconditions and safety
|
|
46
|
+
|
|
47
|
+
- Target org authenticated via `sf` CLI, Service Cloud license present, `sf` CLI ≥ 2.139.6.
|
|
48
|
+
- Active supervisor users exist; their supervisor access is granted separately by `service-omni-supervisor-permset-assign`.
|
|
49
|
+
- Omni-Channel base settings are enabled (`service-omni-base-settings-configure`) and the monitored queues exist (`service-omni-queue-deploy`).
|
|
50
|
+
- **Production guardrail:** the script computes `safe_to_write` as `IsSandbox` OR `TrialExpirationDate != null` OR `OrganizationType` in {Developer Edition, Base Edition}, and blocks with no override when it is false. Any unmet precondition returns `status: blocked` with a `blocking_issue` and a click-path.
|
|
51
|
+
|
|
52
|
+
## Run
|
|
53
|
+
|
|
54
|
+
One script does detect, deploy, and verify:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
bash scripts/deploy-and-report.sh <org-alias> [supervisor_count] [additional_queues_csv] [profiles_csv] [skill_visibility] [config_developer_name]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
It resolves the deploy artifact's tokens from live org state (discovered supervisor users, verified queues, and — only when `profiles_csv` is given — validated profiles), materializes the selected DeveloperName into the metadata filename and package manifest, then re-queries that same selected config to confirm the parent and its companion rows persisted before emitting JSON to stdout. The coordinator (`service-omni-channel-setup-coordinate`) invokes it with the authoritative queue list and selected supervisor config; standalone runs use the canonical defaults.
|
|
61
|
+
|
|
62
|
+
## Behavior
|
|
63
|
+
|
|
64
|
+
**Companions.** The deployed config always carries `omniSupervisorConfigUser` (one per supervisor) and `omniSupervisorConfigQueue` (one per monitored queue). It follows the same single-file Metadata deploy shape as `service-omni-service-channel-configure` and `service-omni-presence-status-deploy`.
|
|
65
|
+
|
|
66
|
+
**Profile scope is a fallback, off by default.** Core resolves a supervisor's configuration by `OmniSupervisorConfigUser` first, and only falls back to `OmniSupervisorConfigProfile` — matched against *that supervisor's own profile* — when the supervisor has no user row (`RealTimeQueueServiceImpl.getSupervisorConfigId`). Because this skill binds every supervisor by user, profile companions are unnecessary and are omitted unless you pass `profiles_csv`. When supplied, values must be metadata fullNames (the `<profile>` element resolves against the fullName — `Standard`, `ServiceCloud`, `Admin` — not the SOQL `User.Profile.Name` label); the skill validates each against `sf org list metadata -m Profile` and blocks on any the org does not expose.
|
|
67
|
+
|
|
68
|
+
**Idempotency and surface preservation.** Status follows the Metadata deploy component state: `Unchanged` → `reused`, `Changed` → `updated`, `Created` → `created`. Any other state is a hard failure rather than a silent `reused`. Before updating an existing parent, the skill snapshots its reference-free `OmniSupervisorConfigAction` and `OmniSupervisorConfigTab` rows, validates that each can be recreated safely, then restores and re-queries them after the deploy. A custom/reference-bearing surface blocks before deployment instead of risking silent loss. When reconciling an existing config or verifying preservation, invoke only this skill; do not invoke `service-omni-supervisor-surface-deploy`, because adding standard rows afterward could mask a preservation failure. The companion surface skill remains responsible only for a separate request to add new standard actions or tabs.
|
|
69
|
+
|
|
70
|
+
**Fail-closed verification.** The deploy `status` must be `Succeeded` (not `SucceededPartial`). After the parent config is queryable, the script re-queries the child `OmniSupervisorConfigUser` and `OmniSupervisorConfigQueue` rows and requires at least the intended counts — the parent existing does not prove the companions landed. Every read must return a parseable `.result.records` array; an inconclusive read never counts as zero. Requested queues are validated against `^[A-Za-z0-9_]{1,80}$` before use, and every requested queue must exist or the run blocks (dropping one silently would under-provision the config).
|
|
71
|
+
|
|
72
|
+
## Output contract
|
|
73
|
+
|
|
74
|
+
A single JSON object to stdout. `status` is one of `created`, `updated`, `reused`, or `blocked`. The object also carries `config_developer_name`, `config_id`, `skill_visibility`, `surface_preservation` snapshot/restoration counts, `supervisor_users_bound`/`supervisor_users_count`, `queues_bound`/`queues_count`, `queue_source` (`caller_supplied` or `canonical_default`), the re-queried `verified_companion_user_count`/`verified_companion_queue_count`, `deploy_id`, `state`, `manual_actions`, and `blocking_issue`. `blocking_issue` is `null` unless `status: blocked`, in which case it names the missing prerequisite with a click-path in `manual_actions`. Re-running an unchanged config returns `reused` and performs no functional change.
|
|
75
|
+
|
|
76
|
+
Org-side spot-check:
|
|
77
|
+
|
|
78
|
+
```sql
|
|
79
|
+
SELECT Id, DeveloperName, MasterLabel FROM OmniSupervisorConfig WHERE DeveloperName='<config_developer_name>'
|
|
80
|
+
SELECT COUNT(Id) FROM OmniSupervisorConfigUser WHERE OmniSupervisorConfigId = :configId
|
|
81
|
+
SELECT COUNT(Id) FROM OmniSupervisorConfigQueue WHERE OmniSupervisorConfigId = :configId
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Limitations
|
|
85
|
+
|
|
86
|
+
- Populates user and queue companions (plus optional profile scope). Existing reference-free Action and Tab rows are preserved across an update; new standard rows are added separately by `service-omni-supervisor-surface-deploy`. Custom-action, FlexiPage, AWS-dashboard, and AI-agent rows require external references and therefore block an update rather than being reconstructed incompletely.
|
|
87
|
+
- Binds supervisor users discovered by the `supervisor{N}.<suffix>@example.com` pattern; it does not create them.
|
|
88
|
+
- Does not change AgentWork sharing because that org-wide access control is separate from `OmniSupervisorConfig`. Use `service-omni-agent-work-sharing-configure` for supported metadata detection and the explicitly confirmed `Private` to `Read` operation.
|
|
89
|
+
- Does not activate the Command Center V2 runtime (a separate settings flip).
|
|
90
|
+
|
|
91
|
+
## References
|
|
92
|
+
|
|
93
|
+
| File | When to read |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `references/api-notes.md` | On a deploy failure — field-by-field `OmniSupervisorConfig` schema and companion sObject semantics |
|
|
96
|
+
| `assets/force-app/main/default/omniSupervisorConfigs/Omni_Supervisor.omniSupervisorConfig-meta.xml` | The token-templated deploy artifact (`__MASTER_LABEL__`, `__SUPERVISOR_USERS_XML__`, `__PROFILE_SCOPE_XML__`, `__QUEUE_LIST_XML__`, `__SKILL_VISIBILITY__`); it is materialized under the selected DeveloperName at runtime |
|
|
97
|
+
| `assets/package.xml`, `assets/sfdx-project.json` | Manifest and project scaffold materialized into the temp deploy dir |
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<OmniSupervisorConfig xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
3
|
+
<isTimelineHidden>false</isTimelineHidden>
|
|
4
|
+
<masterLabel>__MASTER_LABEL__</masterLabel>
|
|
5
|
+
__PROFILE_SCOPE_XML__
|
|
6
|
+
__QUEUE_LIST_XML__
|
|
7
|
+
__SUPERVISOR_USERS_XML__
|
|
8
|
+
<skillVisibility>__SKILL_VISIBILITY__</skillVisibility>
|
|
9
|
+
</OmniSupervisorConfig>
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# OmniSupervisorConfig — API notes
|
|
2
|
+
|
|
3
|
+
Load this reference **only when the deploy fails or Salesforce reports unexpected state**. Under normal operation the skill's `deploy-and-report.sh` just runs and emits its JSON; this doc is for troubleshooting and future extensions.
|
|
4
|
+
|
|
5
|
+
**Metadata type:** `OmniSupervisorConfig` (dir `omniSupervisorConfigs`, suffix `omniSupervisorConfig`)
|
|
6
|
+
**API version:** v66. **Available in the Metadata API since:** v57 (Winter '23).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Why Metadata deploy (not REST POST)
|
|
11
|
+
|
|
12
|
+
`OmniSupervisorConfig` is a Metadata API type (since v57), so this skill deploys it as metadata rather than driving a REST POST loop per companion. Every companion sObject (User/Group/Profile/Queue/Skill/Action/Tab) embeds inside the parent as `maxOccurs="unbounded"` elements per the Metadata SOAP XSD.
|
|
13
|
+
|
|
14
|
+
Trade-off analysis:
|
|
15
|
+
|
|
16
|
+
| Dimension | REST POST (per-companion loop) | Metadata deploy (this skill) |
|
|
17
|
+
|-----------|-----------------|------------------------------|
|
|
18
|
+
| API calls | 8+ (1 parent + N companion POSTs) | 1 |
|
|
19
|
+
| Idempotency logic | Custom SOQL detect + skip in script | Platform-managed via `state:Unchanged` |
|
|
20
|
+
| Atomicity | Partial state on mid-flight failure | All or nothing |
|
|
21
|
+
| Source control | Detect scripts + JSON payloads | Single XML file, diff-friendly |
|
|
22
|
+
| Rollback | Manual cleanup on error | Automatic |
|
|
23
|
+
| Skill script size | ~200 lines | ~150 lines (mostly per-org discovery) |
|
|
24
|
+
| Alignment with other skills | Different pattern | Same as ServiceChannel and PresenceStatus skills |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Metadata SOAP XSD (v66, from core/shared/submodules/wsdl)
|
|
29
|
+
|
|
30
|
+
```xml
|
|
31
|
+
<xsd:complexType name="OmniSupervisorConfig">
|
|
32
|
+
<xsd:extension base="mns:Metadata">
|
|
33
|
+
<xsd:sequence>
|
|
34
|
+
<xsd:element name="isTimelineHidden" type="xsd:boolean"/>
|
|
35
|
+
<xsd:element name="masterLabel" type="xsd:string"/>
|
|
36
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSpvsrConfigAIAgent" type="mns:OmniSpvsrConfigAIAgent"/>
|
|
37
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigAction" type="mns:OmniSupervisorConfigAction"/>
|
|
38
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigGroup" type="mns:OmniSupervisorConfigGroup"/>
|
|
39
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigProfile" type="mns:OmniSupervisorConfigProfile"/>
|
|
40
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigQueue" type="mns:OmniSupervisorConfigQueue"/>
|
|
41
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigSkill" type="mns:OmniSupervisorConfigSkill"/>
|
|
42
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigTab" type="mns:OmniSupervisorConfigTab"/>
|
|
43
|
+
<xsd:element maxOccurs="unbounded" minOccurs="0" name="omniSupervisorConfigUser" type="mns:OmniSupervisorConfigUser"/>
|
|
44
|
+
<xsd:element minOccurs="0" name="skillVisibility" type="tns:OmniSuperSkillVisibilityType"/>
|
|
45
|
+
</xsd:sequence>
|
|
46
|
+
</xsd:extension>
|
|
47
|
+
</xsd:complexType>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Companion field definitions (all verified against v66 SOAP XSD)
|
|
51
|
+
|
|
52
|
+
| Companion | Fields | Notes |
|
|
53
|
+
|-----------|--------|-------|
|
|
54
|
+
| `omniSupervisorConfigUser` | `user` (Username) | Which supervisor(s) this config applies to |
|
|
55
|
+
| `omniSupervisorConfigQueue` | `queue` (Queue DeveloperName) | Queues shown in supervisor's queue-monitoring panel |
|
|
56
|
+
| `omniSupervisorConfigProfile` | `profile` (Profile **metadata fullName**, NOT the SOQL `User.Profile.Name` label — see note below) | Agent profiles the supervisor can see |
|
|
57
|
+
| `omniSupervisorConfigGroup` | `group` (Public Group DeveloperName) | Agent group scope (optional, we omit) |
|
|
58
|
+
| `omniSupervisorConfigSkill` | `skill` (Skill DeveloperName) | Skills the supervisor can filter by (optional, we omit) |
|
|
59
|
+
| `omniSupervisorConfigAction` | `actionName` (enum), `actionTab` (enum), `customActionFlow` (string, optional), `displayOrder` (int) | Which action buttons render; enums NOT yet exhaustively documented — v1 omits, uses platform defaults |
|
|
60
|
+
| `omniSupervisorConfigTab` | `displayOrder` (int), `flexiPage` (string, optional), `tabType` (enum) | Which tabs show; enums NOT yet exhaustively documented — v1 omits, uses platform defaults |
|
|
61
|
+
|
|
62
|
+
**Important:** `omniSpvsrConfigAIAgent` also embeds but requires bots enabled + UDD 256-era APIs. Kept out of scope until we have a bot to bind.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## The canonical template shipped by this skill
|
|
67
|
+
|
|
68
|
+
```xml
|
|
69
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
70
|
+
<OmniSupervisorConfig xmlns="http://soap.sforce.com/2006/04/metadata">
|
|
71
|
+
<masterLabel>Omni Supervisor Config</masterLabel>
|
|
72
|
+
<isTimelineHidden>false</isTimelineHidden>
|
|
73
|
+
<skillVisibility>All</skillVisibility>
|
|
74
|
+
<omniSupervisorConfigUser>
|
|
75
|
+
<user>{supervisor_username}</user>
|
|
76
|
+
</omniSupervisorConfigUser>
|
|
77
|
+
<omniSupervisorConfigProfile>
|
|
78
|
+
<profile>Standard</profile> <!-- metadata fullName; NOT the "Standard User" label -->
|
|
79
|
+
</omniSupervisorConfigProfile>
|
|
80
|
+
<omniSupervisorConfigQueue>
|
|
81
|
+
<queue>CaseQueue</queue>
|
|
82
|
+
</omniSupervisorConfigQueue>
|
|
83
|
+
<omniSupervisorConfigQueue>
|
|
84
|
+
<queue>messagingqueue</queue>
|
|
85
|
+
</omniSupervisorConfigQueue>
|
|
86
|
+
</OmniSupervisorConfig>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`__SUPERVISOR_USERS_XML__` gets replaced with 1..N `<omniSupervisorConfigUser>` blocks (per `supervisor_count`).
|
|
90
|
+
`__QUEUE_LIST_XML__` gets replaced with 1..N `<omniSupervisorConfigQueue>` blocks (canonical + `additional_queues_csv`).
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Idempotency contract
|
|
95
|
+
|
|
96
|
+
Salesforce Metadata deploy response `files[].state` field:
|
|
97
|
+
|
|
98
|
+
| `state` | Meaning | Skill-level `status` |
|
|
99
|
+
|---------|---------|---------------------|
|
|
100
|
+
| `Unchanged` | Payload matched org state byte-for-byte | `reused` |
|
|
101
|
+
| `Changed` | Config existed, some fields differed and were updated | `updated` |
|
|
102
|
+
| `Created` | Config did not exist, freshly created | `created` |
|
|
103
|
+
| `Failed` / other | Deploy did not succeed | `blocked` |
|
|
104
|
+
|
|
105
|
+
Re-running with no template drift returns `status: reused` in ~3 seconds. Adding a new supervisor to the org and re-running returns `status: updated` (adds the companion binding); no need to detect-before-POST because the template regeneration handles the delta.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Common failure modes
|
|
110
|
+
|
|
111
|
+
| Symptom | Likely cause | Fix |
|
|
112
|
+
|---------|--------------|-----|
|
|
113
|
+
| `INVALID_TYPE: OmniSupervisorConfig` on deploy | Deploying against pre-v57 org | Bump target `sourceApiVersion` to 57.0+ (v66 recommended) |
|
|
114
|
+
| `INVALID_FIELD: <fieldname>` on companion | Guessed enum value (actionName / tabType) | v1 template omits action + tab elements; if adding, retrieve a working config from another org first |
|
|
115
|
+
| `DUPLICATE_VALUE` on User binding | Same user already bound to another OmniSupervisorConfig | Salesforce allows one supervisor per config; if binding to multiple configs needed, split into separate configs |
|
|
116
|
+
| `INVALID_PERSON_OR_GROUP_ID` on queue | Queue DeveloperName typo or queue absent | Verify with: `sf data query -q "SELECT DeveloperName FROM Group WHERE Type='Queue'"` |
|
|
117
|
+
| Deploy hangs > 10 min | Retry storm or org load issue | Retrieve deploy status: `sf project deploy report --job-id <id>` |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Post-deploy SOQL verification
|
|
122
|
+
|
|
123
|
+
```sql
|
|
124
|
+
-- 1. Config exists
|
|
125
|
+
SELECT Id, DeveloperName, MasterLabel, CreatedDate
|
|
126
|
+
FROM OmniSupervisorConfig
|
|
127
|
+
WHERE DeveloperName='Omni_Supervisor'
|
|
128
|
+
|
|
129
|
+
-- 2. Supervisor bindings
|
|
130
|
+
SELECT UserId, User.Username
|
|
131
|
+
FROM OmniSupervisorConfigUser
|
|
132
|
+
WHERE OmniSupervisorConfigId IN (SELECT Id FROM OmniSupervisorConfig WHERE DeveloperName='Omni_Supervisor')
|
|
133
|
+
|
|
134
|
+
-- 3. Queue bindings
|
|
135
|
+
SELECT QueueId, Queue.DeveloperName
|
|
136
|
+
FROM OmniSupervisorConfigQueue
|
|
137
|
+
WHERE OmniSupervisorConfigId IN (SELECT Id FROM OmniSupervisorConfig WHERE DeveloperName='Omni_Supervisor')
|
|
138
|
+
|
|
139
|
+
-- 4. Profile scope
|
|
140
|
+
SELECT ProfileId, Profile.Name
|
|
141
|
+
FROM OmniSupervisorConfigProfile
|
|
142
|
+
WHERE OmniSupervisorConfigId IN (SELECT Id FROM OmniSupervisorConfig WHERE DeveloperName='Omni_Supervisor')
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Expected: 1 config, N supervisor bindings (matches `supervisor_count`), M queue bindings (matches `ALL_QUEUES` after discovery filter), and 1+ profile scope rows (one per resolved agent profile).
|
|
146
|
+
|
|
147
|
+
## Profile fullName vs. User.Profile.Name
|
|
148
|
+
|
|
149
|
+
The `<profile>` element resolves against a profile's **metadata fullName**, which for standard profiles differs from the SOQL `User.Profile.Name` label:
|
|
150
|
+
|
|
151
|
+
| `User.Profile.Name` (SOQL label) | Metadata `<profile>` fullName |
|
|
152
|
+
|----------------------------------|-------------------------------|
|
|
153
|
+
| `Standard User` | `Standard` |
|
|
154
|
+
| `Service Cloud` | `ServiceCloud` |
|
|
155
|
+
| `System Administrator` | `Admin` |
|
|
156
|
+
| Custom profiles | same as the profile Name |
|
|
157
|
+
|
|
158
|
+
Deploying a raw SOQL label fails with `In field: profile - no Profile named <label> found`. Profile companions are optional (omitted by default, since supervisors are bound by user); when you pass `profiles_csv`, supply metadata fullNames and `deploy-and-report.sh` validates each against `sf org list metadata -m Profile`, blocking on any the org does not expose. Get the exact fullNames for an org with:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
sf org list metadata -m Profile -o <org> --json | jq -r '.result[].fullName'
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Idempotency signal
|
|
165
|
+
|
|
166
|
+
`deploy-and-report.sh` maps the Metadata deploy component state to the skill status: `Unchanged` → `reused`, `Changed` → `updated`, `Created` → `created`. Any unrecognized state blocks rather than silently reporting `reused`. The `config_id` is stable across runs and no companion rows are duplicated on redeploy.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Deploy robustness — async + poll (not synchronous `--wait`)
|
|
171
|
+
|
|
172
|
+
`OmniSupervisorConfig` deploys are done **async**, then polled to a terminal state:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
id=$(sf project deploy start --manifest package.xml --target-org "$ORG" --async --json | jq -r '.result.id')
|
|
176
|
+
# poll until Succeeded | Failed | SucceededPartial | Canceled (each report call returns immediately)
|
|
177
|
+
sf project deploy report --job-id "$id" --target-org "$ORG" --json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Why not `--wait N`:** under heavy CDO load a synchronous `sf project deploy start --wait` can raise
|
|
181
|
+
`ClientTimeoutError` and exit non-zero even though the server-side deploy succeeds — a false failure.
|
|
182
|
+
Async start returns a job id instantly; polling `deploy report` in a loop means no single CLI call
|
|
183
|
+
can client-timeout, so the terminal server-side status is always the authority. Budget the poll loop
|
|
184
|
+
above the slowest deploy/retrieve you expect on a loaded org — the script uses ~20 min.
|
|
185
|
+
|
|
186
|
+
## Post-deploy verify — bounded retry with backoff
|
|
187
|
+
|
|
188
|
+
The deploy async+poll above protects the *deploy*; the post-deploy **verification** SOQL reads
|
|
189
|
+
(config_id fetch + companion `OmniSupervisorConfigUser`/`OmniSupervisorConfigQueue` counts) are the
|
|
190
|
+
remaining latency-fragile step. A slow/dropped query, or the just-persisted record/child rows not
|
|
191
|
+
yet visible, could otherwise flip an otherwise-successful deploy to blocked. Each verification read is therefore wrapped in a
|
|
192
|
+
**bounded retry loop with backoff** (5 attempts, 10→40s increasing sleeps): retry while the read is
|
|
193
|
+
inconclusive (not a parseable records array) *or* the count is still below what the deploy was asked
|
|
194
|
+
to bind, then fall through to the existing guards. **Fail-closed is preserved**: after the budget,
|
|
195
|
+
an inconclusive read still blocks, an empty/missing config Id still blocks, and a short companion
|
|
196
|
+
count still blocks as under-provisioned — retries only survive transient org latency, they never
|
|
197
|
+
manufacture success.
|
|
198
|
+
|
|
199
|
+
## Possible extensions
|
|
200
|
+
|
|
201
|
+
1. **Add a default action bar** — retrieve a working config from a full CDO to get valid `actionName` / `actionTab` enum values, then bake them into the template.
|
|
202
|
+
2. **Add a default tab list** — same as above for `tabType` enum values.
|
|
203
|
+
3. **Support `omniSupervisorConfigGroup`** — scope by Public Group in addition to profile.
|
|
204
|
+
4. **Support `omniSupervisorConfigSkill`** — scope by Skill for skill-based supervisors.
|
|
205
|
+
5. **Support `omniSpvsrConfigAIAgent`** — bind an Agentforce agent once one is available on the org.
|