@salesforce/afv-skills 1.14.0 → 1.16.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/activating-datacloud/SKILL.md +0 -1
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +0 -1
- package/skills/applying-slds/SKILL.md +322 -0
- package/skills/applying-slds/checklists.md +83 -0
- package/skills/applying-slds/examples.md +283 -0
- package/skills/applying-slds/guidance/README.md +83 -0
- package/skills/applying-slds/guidance/blueprints-index.md +213 -0
- package/skills/applying-slds/guidance/icons-guidance.md +186 -0
- package/skills/applying-slds/guidance/overviews/borders.md +236 -0
- package/skills/applying-slds/guidance/overviews/color.md +266 -0
- package/skills/applying-slds/guidance/overviews/display-density.md +366 -0
- package/skills/applying-slds/guidance/overviews/icons.md +240 -0
- package/skills/applying-slds/guidance/overviews/illustrations.md +235 -0
- package/skills/applying-slds/guidance/overviews/shadows.md +176 -0
- package/skills/applying-slds/guidance/overviews/spacing.md +216 -0
- package/skills/applying-slds/guidance/overviews/typography.md +323 -0
- package/skills/applying-slds/guidance/overviews/utilities.md +542 -0
- package/skills/applying-slds/guidance/slds-development-guide.md +288 -0
- package/skills/applying-slds/guidance/styling-hooks/borders.md +202 -0
- package/skills/applying-slds/guidance/styling-hooks/color/expressive-palette-hooks.md +153 -0
- package/skills/applying-slds/guidance/styling-hooks/color/index.md +171 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/accent-hooks.md +204 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/feedback-hooks.md +768 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/surface-hooks.md +337 -0
- package/skills/applying-slds/guidance/styling-hooks/color/system-hooks.md +132 -0
- package/skills/applying-slds/guidance/styling-hooks/index.md +327 -0
- package/skills/applying-slds/guidance/styling-hooks/shadows.md +238 -0
- package/skills/applying-slds/guidance/styling-hooks/spacing.md +254 -0
- package/skills/applying-slds/guidance/styling-hooks/typography.md +448 -0
- package/skills/applying-slds/guidance/utilities/alignment.md +119 -0
- package/skills/applying-slds/guidance/utilities/borders.md +131 -0
- package/skills/applying-slds/guidance/utilities/box.md +125 -0
- package/skills/applying-slds/guidance/utilities/color.md +165 -0
- package/skills/applying-slds/guidance/utilities/dark-mode.md +111 -0
- package/skills/applying-slds/guidance/utilities/description-list.md +168 -0
- package/skills/applying-slds/guidance/utilities/floats.md +117 -0
- package/skills/applying-slds/guidance/utilities/grid.md +264 -0
- package/skills/applying-slds/guidance/utilities/horizontal-list.md +110 -0
- package/skills/applying-slds/guidance/utilities/hyphenation.md +84 -0
- package/skills/applying-slds/guidance/utilities/index.md +205 -0
- package/skills/applying-slds/guidance/utilities/interactions.md +89 -0
- package/skills/applying-slds/guidance/utilities/layout.md +109 -0
- package/skills/applying-slds/guidance/utilities/line-clamp.md +131 -0
- package/skills/applying-slds/guidance/utilities/margin.md +155 -0
- package/skills/applying-slds/guidance/utilities/media-object.md +161 -0
- package/skills/applying-slds/guidance/utilities/name-value-list.md +152 -0
- package/skills/applying-slds/guidance/utilities/padding.md +155 -0
- package/skills/applying-slds/guidance/utilities/position.md +177 -0
- package/skills/applying-slds/guidance/utilities/print.md +114 -0
- package/skills/applying-slds/guidance/utilities/scrollable.md +126 -0
- package/skills/applying-slds/guidance/utilities/sizing.md +190 -0
- package/skills/applying-slds/guidance/utilities/themes.md +121 -0
- package/skills/applying-slds/guidance/utilities/truncate.md +127 -0
- package/skills/applying-slds/guidance/utilities/typography.md +166 -0
- package/skills/applying-slds/guidance/utilities/vertical-list.md +166 -0
- package/skills/applying-slds/guidance/utilities/visibility.md +228 -0
- package/skills/applying-slds/metadata/README.md +84 -0
- package/skills/applying-slds/metadata/blueprints/components/accordion.yaml +304 -0
- package/skills/applying-slds/metadata/blueprints/components/activity-timeline.yaml +92 -0
- package/skills/applying-slds/metadata/blueprints/components/alert.yaml +103 -0
- package/skills/applying-slds/metadata/blueprints/components/app-launcher.yaml +94 -0
- package/skills/applying-slds/metadata/blueprints/components/avatar-group.yaml +81 -0
- package/skills/applying-slds/metadata/blueprints/components/avatar.yaml +97 -0
- package/skills/applying-slds/metadata/blueprints/components/badges.yaml +102 -0
- package/skills/applying-slds/metadata/blueprints/components/brand-band.yaml +198 -0
- package/skills/applying-slds/metadata/blueprints/components/breadcrumbs.yaml +95 -0
- package/skills/applying-slds/metadata/blueprints/components/builder-header.yaml +192 -0
- package/skills/applying-slds/metadata/blueprints/components/button-groups.yaml +82 -0
- package/skills/applying-slds/metadata/blueprints/components/button-icons.yaml +295 -0
- package/skills/applying-slds/metadata/blueprints/components/buttons.yaml +230 -0
- package/skills/applying-slds/metadata/blueprints/components/cards.yaml +124 -0
- package/skills/applying-slds/metadata/blueprints/components/carousel.yaml +140 -0
- package/skills/applying-slds/metadata/blueprints/components/chat.yaml +179 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-button-group.yaml +192 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-button.yaml +204 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-toggle.yaml +177 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox.yaml +108 -0
- package/skills/applying-slds/metadata/blueprints/components/color-picker.yaml +172 -0
- package/skills/applying-slds/metadata/blueprints/components/combobox.yaml +136 -0
- package/skills/applying-slds/metadata/blueprints/components/counter.yaml +147 -0
- package/skills/applying-slds/metadata/blueprints/components/data-tables.yaml +157 -0
- package/skills/applying-slds/metadata/blueprints/components/datepickers.yaml +130 -0
- package/skills/applying-slds/metadata/blueprints/components/datetime-picker.yaml +155 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-composer.yaml +201 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-form-footer.yaml +161 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-utility-bar.yaml +175 -0
- package/skills/applying-slds/metadata/blueprints/components/drop-zone.yaml +115 -0
- package/skills/applying-slds/metadata/blueprints/components/dueling-picklist.yaml +196 -0
- package/skills/applying-slds/metadata/blueprints/components/dynamic-icons.yaml +128 -0
- package/skills/applying-slds/metadata/blueprints/components/dynamic-menu.yaml +141 -0
- package/skills/applying-slds/metadata/blueprints/components/expandable-section.yaml +115 -0
- package/skills/applying-slds/metadata/blueprints/components/expression.yaml +143 -0
- package/skills/applying-slds/metadata/blueprints/components/feeds.yaml +125 -0
- package/skills/applying-slds/metadata/blueprints/components/file-selector.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/files.yaml +119 -0
- package/skills/applying-slds/metadata/blueprints/components/form-element.yaml +145 -0
- package/skills/applying-slds/metadata/blueprints/components/global-header.yaml +120 -0
- package/skills/applying-slds/metadata/blueprints/components/global-navigation.yaml +100 -0
- package/skills/applying-slds/metadata/blueprints/components/icons.yaml +138 -0
- package/skills/applying-slds/metadata/blueprints/components/illustration.yaml +205 -0
- package/skills/applying-slds/metadata/blueprints/components/input.yaml +151 -0
- package/skills/applying-slds/metadata/blueprints/components/list-builder.yaml +127 -0
- package/skills/applying-slds/metadata/blueprints/components/lookups.yaml +132 -0
- package/skills/applying-slds/metadata/blueprints/components/map.yaml +118 -0
- package/skills/applying-slds/metadata/blueprints/components/menus.yaml +134 -0
- package/skills/applying-slds/metadata/blueprints/components/modals.yaml +152 -0
- package/skills/applying-slds/metadata/blueprints/components/notifications.yaml +88 -0
- package/skills/applying-slds/metadata/blueprints/components/page-headers.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/panels.yaml +149 -0
- package/skills/applying-slds/metadata/blueprints/components/path.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/picklist.yaml +125 -0
- package/skills/applying-slds/metadata/blueprints/components/pills.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/popovers.yaml +120 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-bar.yaml +110 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-indicator.yaml +133 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-ring.yaml +102 -0
- package/skills/applying-slds/metadata/blueprints/components/prompt.yaml +126 -0
- package/skills/applying-slds/metadata/blueprints/components/publishers.yaml +178 -0
- package/skills/applying-slds/metadata/blueprints/components/radio-button-group.yaml +172 -0
- package/skills/applying-slds/metadata/blueprints/components/radio-group.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/rich-text-editor.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/scoped-notifications.yaml +188 -0
- package/skills/applying-slds/metadata/blueprints/components/scoped-tabs.yaml +97 -0
- package/skills/applying-slds/metadata/blueprints/components/select.yaml +127 -0
- package/skills/applying-slds/metadata/blueprints/components/setup-assistant.yaml +152 -0
- package/skills/applying-slds/metadata/blueprints/components/slider.yaml +111 -0
- package/skills/applying-slds/metadata/blueprints/components/spinners.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/split-view.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/summary-detail.yaml +103 -0
- package/skills/applying-slds/metadata/blueprints/components/tabs.yaml +138 -0
- package/skills/applying-slds/metadata/blueprints/components/textarea.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/tiles.yaml +108 -0
- package/skills/applying-slds/metadata/blueprints/components/timepicker.yaml +111 -0
- package/skills/applying-slds/metadata/blueprints/components/toast.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/tooltips.yaml +107 -0
- package/skills/applying-slds/metadata/blueprints/components/tree-grid.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/trees.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/trial-bar.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/vertical-navigation.yaml +130 -0
- package/skills/applying-slds/metadata/blueprints/components/vertical-tabs.yaml +140 -0
- package/skills/applying-slds/metadata/blueprints/components/visual-picker.yaml +150 -0
- package/skills/applying-slds/metadata/blueprints/components/welcome-mat.yaml +136 -0
- package/skills/applying-slds/metadata/hooks-index.json +6272 -0
- package/skills/applying-slds/metadata/icon-metadata.json +38466 -0
- package/skills/applying-slds/metadata/utilities-index.json +21912 -0
- package/skills/applying-slds/references/component-selection.md +112 -0
- package/skills/applying-slds/references/icons-decision-guide.md +124 -0
- package/skills/applying-slds/references/styling-decision-guide.md +228 -0
- package/skills/applying-slds/references/utilities-quick-ref.md +125 -0
- package/skills/applying-slds/scripts/search-blueprints.cjs +117 -0
- package/skills/applying-slds/scripts/search-hooks.cjs +139 -0
- package/skills/applying-slds/scripts/search-icons.cjs +174 -0
- package/skills/applying-slds/scripts/search-utilities.cjs +161 -0
- package/skills/building-mobile-apps/SKILL.md +0 -1
- package/skills/building-omnistudio-callable-apex/SKILL.md +0 -1
- package/skills/building-omnistudio-datamapper/SKILL.md +0 -1
- package/skills/building-omnistudio-flexcard/SKILL.md +0 -1
- package/skills/building-omnistudio-integration-procedure/SKILL.md +0 -1
- package/skills/building-omnistudio-omniscript/SKILL.md +0 -1
- package/skills/building-sf-integrations/SKILL.md +0 -1
- package/skills/configuring-connected-apps/SKILL.md +0 -1
- package/skills/connecting-datacloud/SKILL.md +0 -1
- package/skills/creating-b2b-commerce-store/SKILL.md +0 -1
- package/skills/debugging-apex-logs/SKILL.md +0 -1
- package/skills/deploying-metadata/SKILL.md +0 -1
- package/skills/deploying-omnistudio-datapacks/SKILL.md +0 -1
- package/skills/developing-agentforce/SKILL.md +0 -1
- package/skills/fetching-salesforce-docs/SKILL.md +0 -1
- package/skills/generating-custom-lightning-type/SKILL.md +17 -39
- package/skills/generating-custom-lightning-type/assets/primitive-types-and-constraints.md +41 -0
- package/skills/generating-custom-lightning-type/references/widget-rendition.md +124 -0
- package/skills/generating-lwc-components/SKILL.md +0 -1
- package/skills/generating-mermaid-diagrams/SKILL.md +0 -1
- package/skills/generating-visual-diagrams/SKILL.md +0 -1
- package/skills/handling-sf-data/SKILL.md +0 -1
- package/skills/harmonizing-datacloud/SKILL.md +0 -1
- package/skills/integrating-b2b-commerce-open-code-components/SKILL.md +0 -1
- package/skills/investigating-agentforce-architecture/README.md +156 -0
- package/skills/investigating-agentforce-architecture/SKILL.md +230 -0
- package/skills/investigating-agentforce-architecture/assets/cli/describe_sobject.yaml +16 -0
- package/skills/investigating-agentforce-architecture/assets/cli/describe_tooling_sobject.yaml +17 -0
- package/skills/investigating-agentforce-architecture/assets/cli/list_metadata_genaiprompttemplate.yaml +17 -0
- package/skills/investigating-agentforce-architecture/assets/cli/org_display.yaml +15 -0
- package/skills/investigating-agentforce-architecture/assets/cli/retrieve_genai_plugin.yaml +18 -0
- package/skills/investigating-agentforce-architecture/assets/cli/show_access_token.yaml +27 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/action_tree.mmd +20 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/data_flow.mmd +19 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/dependency_graph.mmd +19 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/invocation_sequence.mmd +20 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/planner_state.mmd +18 -0
- package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_names.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/bot_definition_details.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/bot_version_lookup.soql +4 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_by_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_ids_by_names.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_view_by_durable_ids.soql +4 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_metadata_by_id.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/functions_by_plugins.soql +5 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_attrs_by_parent_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_bundle_functions.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_definition_by_agent_chain.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugin_functions_by_plugin_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugin_instructions_by_plugin_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugins_by_planner.soql +4 -0
- package/skills/investigating-agentforce-architecture/references/architecture_sections.md +243 -0
- package/skills/investigating-agentforce-architecture/references/contract.json +244 -0
- package/skills/investigating-agentforce-architecture/references/soql_fields.md +512 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/__init__.py +1 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/fs_guard.py +329 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/paths.py +110 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/runtime.py +59 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/sql.py +10 -0
- package/skills/investigating-agentforce-architecture/scripts/cache_check.py +234 -0
- package/skills/investigating-agentforce-architecture/scripts/config.py +131 -0
- package/skills/investigating-agentforce-architecture/scripts/fetch_soql.py +689 -0
- package/skills/investigating-agentforce-architecture/scripts/finalize.py +295 -0
- package/skills/investigating-agentforce-architecture/scripts/main.py +2835 -0
- package/skills/investigating-agentforce-architecture/scripts/metadata_listing.py +265 -0
- package/skills/investigating-agentforce-architecture/scripts/parallel_retrieve.py +69 -0
- package/skills/investigating-agentforce-architecture/scripts/parse_bundle.py +215 -0
- package/skills/investigating-agentforce-architecture/scripts/parse_wave.py +845 -0
- package/skills/investigating-agentforce-architecture/scripts/probe_channels.py +302 -0
- package/skills/investigating-agentforce-architecture/scripts/render_architecture.py +1043 -0
- package/skills/investigating-agentforce-architecture/scripts/resolve_bot.py +255 -0
- package/skills/investigating-agentforce-architecture/scripts/resolve_invocation_target.py +130 -0
- package/skills/investigating-agentforce-architecture/scripts/rest_client.py +763 -0
- package/skills/investigating-agentforce-architecture/scripts/retrieve_planner.py +13 -0
- package/skills/investigating-agentforce-architecture/scripts/sf_cli.py +242 -0
- package/skills/investigating-agentforce-architecture/scripts/soql_loader.py +253 -0
- package/skills/investigating-agentforce-architecture/scripts/summarize_tree.py +143 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/__init__.py +0 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/_bootstrap.py +23 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/genai_payloads.py +400 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check.py +307 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check_main.py +283 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_config.py +115 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_end_to_end_fixture.py +651 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_finalize.py +278 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_flow_children_inflation.py +582 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_fs_guard.py +113 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_iterative_wave_b.py +478 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_main_pipeline.py +3359 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parallel_retrieve.py +131 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_bundle.py +400 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave.py +644 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_classifiers.py +224 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_helpers.py +380 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_main.py +397 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_per_branch_visited.py +244 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_channels.py +359 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_cli_recipes.py +185 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_render_architecture.py +810 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_bot.py +203 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_creds.py +157 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_invocation_target.py +145 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_rest_client.py +1253 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_runtime_override.py +100 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_sf_cli.py +261 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_signature_stamping.py +466 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_soql_loader.py +501 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_summarize_tree.py +241 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_write_emit_ctx.py +480 -0
- package/skills/investigating-agentforce-architecture/tools/emit_env.py +157 -0
- package/skills/investigating-agentforce-architecture/tools/emit_result.py +262 -0
- package/skills/investigating-agentforce-architecture/tools/sanitize.py +33 -0
- package/skills/investigating-agentforce-architecture/tools/write_emit_ctx.py +332 -0
- package/skills/investigating-agentforce-d360/README.md +123 -0
- package/skills/investigating-agentforce-d360/SKILL.md +163 -0
- package/skills/investigating-agentforce-d360/assets/dc/app_generation.sql +51 -0
- package/skills/investigating-agentforce-d360/assets/dc/content_category.sql +44 -0
- package/skills/investigating-agentforce-d360/assets/dc/content_quality.sql +41 -0
- package/skills/investigating-agentforce-d360/assets/dc/discover_sessions.sql +36 -0
- package/skills/investigating-agentforce-d360/assets/dc/feedback.sql +47 -0
- package/skills/investigating-agentforce-d360/assets/dc/feedback_details.sql +38 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_records.sql +45 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_llm.sql +50 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_metadata.sql +44 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_tags.sql +42 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_requests.sql +89 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_responses.sql +43 -0
- package/skills/investigating-agentforce-d360/assets/dc/generations.sql +52 -0
- package/skills/investigating-agentforce-d360/assets/dc/interactions.sql +53 -0
- package/skills/investigating-agentforce-d360/assets/dc/messages.sql +53 -0
- package/skills/investigating-agentforce-d360/assets/dc/messaging_session.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/moment_interactions.sql +34 -0
- package/skills/investigating-agentforce-d360/assets/dc/moments.sql +39 -0
- package/skills/investigating-agentforce-d360/assets/dc/participants.sql +48 -0
- package/skills/investigating-agentforce-d360/assets/dc/sessions.sql +78 -0
- package/skills/investigating-agentforce-d360/assets/dc/steps.sql +64 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_associations.sql +46 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_definition_associations.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_definitions.sql +50 -0
- package/skills/investigating-agentforce-d360/assets/dc/tags.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/telemetry_spans.sql +55 -0
- package/skills/investigating-agentforce-d360/references/artifacts.md +50 -0
- package/skills/investigating-agentforce-d360/references/dc_dmo_fields.md +823 -0
- package/skills/investigating-agentforce-d360/references/dc_pipeline_contract.md +608 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/__init__.py +2 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/cli_override.py +98 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/fs_guard.py +334 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/paths.py +155 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/runtime.py +59 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/sql.py +14 -0
- package/skills/investigating-agentforce-d360/scripts/assemble_dc.py +1624 -0
- package/skills/investigating-agentforce-d360/scripts/config.py +45 -0
- package/skills/investigating-agentforce-d360/scripts/dc.py +188 -0
- package/skills/investigating-agentforce-d360/scripts/discover_sessions.py +556 -0
- package/skills/investigating-agentforce-d360/scripts/fetch_dc.py +1045 -0
- package/skills/investigating-agentforce-d360/scripts/render_dc.py +1750 -0
- package/skills/investigating-agentforce-d360/scripts/resolve_session.py +264 -0
- package/skills/investigating-agentforce-d360/scripts/storage.py +92 -0
- package/skills/investigating-agentforce-d360/scripts/tests/__init__.py +0 -0
- package/skills/investigating-agentforce-d360/scripts/tests/_bootstrap.py +15 -0
- package/skills/investigating-agentforce-d360/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/investigating-agentforce-d360/scripts/tests/fixtures/synthetic_session.py +424 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_bootstrap_and_mode.py +115 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct.py +220 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct_integration.py +158 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_helpers.py +287 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_integration.py +247 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_dc_and_resolve_session.py +433 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions.py +458 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions_grep_ci.py +193 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_helpers.py +266 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_identity.py +528 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_main.py +251 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall.py +229 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall_full.py +283 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_identity_coherence.py +327 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_branches.py +256 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_gateway_direct.py +130 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_helpers.py +291 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_integration.py +220 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_planner_llm_calls.py +284 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_show_prompts_gating.py +215 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_from_disk.py +100 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_session_main.py +149 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_runtime_override.py +104 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape.py +95 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape_dropped_by_stdm.py +85 -0
- package/skills/managing-managed-event-subscription/SKILL.md +152 -0
- package/skills/managing-managed-event-subscription/assets/managed-event-subscription-template.xml +20 -0
- package/skills/managing-managed-event-subscription/references/delete-guide.md +57 -0
- package/skills/managing-managed-event-subscription/references/topic-name-formats.md +26 -0
- package/skills/managing-managed-event-subscription/references/update-constraints.md +30 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +0 -1
- package/skills/observing-agentforce/SKILL.md +0 -1
- package/skills/orchestrating-datacloud/SKILL.md +0 -1
- package/skills/preparing-datacloud/SKILL.md +0 -1
- package/skills/querying-soql/SKILL.md +0 -1
- package/skills/retrieving-datacloud/SKILL.md +0 -1
- package/skills/running-apex-tests/SKILL.md +0 -1
- package/skills/running-code-analyzer/SKILL.md +0 -1
- package/skills/segmenting-datacloud/SKILL.md +0 -1
- package/skills/testing-agentforce/SKILL.md +0 -1
- package/skills/uplifting-components-to-slds2/SKILL.md +3 -2
- package/skills/uplifting-components-to-slds2/references/color-hooks-decision-guide.md +30 -9
- package/skills/uplifting-components-to-slds2/references/examples.md +24 -6
- package/skills/validating-slds/SKILL.md +262 -0
- package/skills/validating-slds/references/quality-checks.md +308 -0
- package/skills/validating-slds/references/report-format.md +302 -0
- package/skills/validating-slds/scripts/analyze-quality.cjs +521 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"""Channel probe — one-shot sf sobject describe per target type, cached 7 days.
|
|
2
|
+
|
|
3
|
+
channel probe with TTL (7d), mandatory-field gate, runtime
|
|
4
|
+
INVALID_FIELD re-probe, and a `--reprobe` CLI flag.
|
|
5
|
+
|
|
6
|
+
Rationale: Salesforce ships quarterly releases that can rename / deprecate
|
|
7
|
+
Tooling sObject fields. A long-lived cache would mask a schema drift for
|
|
8
|
+
weeks. A 7-day TTL bounds the exposure; the `invalidate_and_reprobe` hook
|
|
9
|
+
is the runtime escape valve when a SOQL returns `INVALID_FIELD` mid-run.
|
|
10
|
+
|
|
11
|
+
Security:
|
|
12
|
+
* Cache dir comes ONLY from `config.build_probe_cache_dir` (validated
|
|
13
|
+
path; no attacker-controlled segments).
|
|
14
|
+
* Cache file is written 0o600 — owner read-write only.
|
|
15
|
+
* No raw sObject describe REST calls here; we go through `sf_cli.run_sf`
|
|
16
|
+
which already enforces (yaml.safe_load) + (redacted stderr).
|
|
17
|
+
|
|
18
|
+
Mandatory vs optional fields: we ship a MANDATORY_FIELDS map of the fields
|
|
19
|
+
the skill's SOQL assets can't function without. A probe that sees ANY
|
|
20
|
+
mandatory field missing flags `status: "PROBE_FAILED"` so the caller can
|
|
21
|
+
surface a clean error instead of producing a subtly-wrong tree.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import tempfile
|
|
28
|
+
import time
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from typing import Any, Dict
|
|
31
|
+
|
|
32
|
+
# Local imports — sf_cli handles the actual describe calls + redaction.
|
|
33
|
+
from config import PROBE_TTL_DAYS, build_probe_cache_dir
|
|
34
|
+
from sf_cli import SfCliError, run_sf
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# -----------------------------------------------------------------------------
|
|
38
|
+
# critical sObjects the skill depends on.
|
|
39
|
+
# -----------------------------------------------------------------------------
|
|
40
|
+
# `api_kind`: which describe recipe we route the call through. BotDefinition
|
|
41
|
+
# / BotVersion are reachable via the Data API; the GenAi* sObjects are
|
|
42
|
+
# Tooling-API-only. The two recipes share the same shape (sObject name in,
|
|
43
|
+
# queryable fields list out) so downstream handling is uniform.
|
|
44
|
+
|
|
45
|
+
_DATA_API_SOBJECTS = ("BotDefinition", "BotVersion")
|
|
46
|
+
_TOOLING_API_SOBJECTS = (
|
|
47
|
+
"ApexClass",
|
|
48
|
+
"Flow",
|
|
49
|
+
"FlowDefinition",
|
|
50
|
+
"GenAiPlannerDefinition",
|
|
51
|
+
"GenAiPluginDefinition",
|
|
52
|
+
"GenAiFunctionDefinition",
|
|
53
|
+
"GenAiPlannerAttrDefinition",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
ALL_SOBJECTS: tuple[str, ...] = _DATA_API_SOBJECTS + _TOOLING_API_SOBJECTS
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# mandatory fields. These are the minimum set of fields the skill's
|
|
60
|
+
# SOQL assets reference by name. If a probe sees ANY of these missing, the
|
|
61
|
+
# probe status flips to PROBE_FAILED — we'd rather abort cleanly than
|
|
62
|
+
# produce a tree with silent holes from missing columns.
|
|
63
|
+
#
|
|
64
|
+
# Keep this list conservative — "mandatory" means "every code path needs
|
|
65
|
+
# it". Fields that only some branches use go in the queryable set without
|
|
66
|
+
# being gated.
|
|
67
|
+
MANDATORY_FIELDS: Dict[str, set[str]] = {
|
|
68
|
+
"BotDefinition": {"Id", "DeveloperName"},
|
|
69
|
+
"BotVersion": {"Id", "BotDefinitionId"},
|
|
70
|
+
"ApexClass": {"Id", "Name"},
|
|
71
|
+
"Flow": {"Id", "MasterLabel", "DefinitionId"},
|
|
72
|
+
"FlowDefinition": {"Id", "DeveloperName"},
|
|
73
|
+
"GenAiPlannerDefinition": {"Id", "DeveloperName", "PlannerType"},
|
|
74
|
+
"GenAiPluginDefinition": {"Id", "DeveloperName"},
|
|
75
|
+
"GenAiFunctionDefinition": {"Id", "DeveloperName", "InvocationTarget"},
|
|
76
|
+
"GenAiPlannerAttrDefinition": {"Id"},
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class ProbeError(RuntimeError):
|
|
81
|
+
"""Probe could not complete — surfaced to caller, redaction already applied."""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _describe_sobject(org_alias: str, sobject: str, is_tooling: bool) -> dict:
|
|
85
|
+
"""Describe a single sObject via `sf_cli.run_sf`.
|
|
86
|
+
|
|
87
|
+
Expected recipes (to be added alongside this module): `describe_sobject`
|
|
88
|
+
for the Data API and `describe_tooling_sobject` for Tooling. Both are
|
|
89
|
+
expected to return a dict of shape `{"status":0,"result":{"fields":
|
|
90
|
+
[{"name":"X","queryable":true}, ...]}}`.
|
|
91
|
+
|
|
92
|
+
We keep this helper tiny so tests can mock `run_sf` without touching
|
|
93
|
+
the wire. The recipes themselves are author-controlled YAML loaded
|
|
94
|
+
through `sf_cli` (yaml.safe_load).
|
|
95
|
+
|
|
96
|
+
NOTE: the recipes don't exist on disk yet — they land in the Batch-4
|
|
97
|
+
integration pass. This function is called only via `probe_channels`,
|
|
98
|
+
which every test mocks. The production path stays inert until the
|
|
99
|
+
recipes ship.
|
|
100
|
+
"""
|
|
101
|
+
recipe = "describe_tooling_sobject" if is_tooling else "describe_sobject"
|
|
102
|
+
try:
|
|
103
|
+
data = run_sf(recipe, ORG_ALIAS=org_alias, SOBJECT=sobject)
|
|
104
|
+
except SfCliError as e:
|
|
105
|
+
raise ProbeError(f"describe failed for {sobject}: {e}") from None
|
|
106
|
+
return data.get("result") or {}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _extract_queryable_fields(describe_result: dict) -> list[str]:
|
|
110
|
+
"""Pull queryable field names from a describe result.
|
|
111
|
+
|
|
112
|
+
Tolerant of both the shape `{"fields":[{"name":"X","queryable":true}]}`
|
|
113
|
+
and the bare `{"fields":[{"name":"X"}]}` (some endpoints omit the
|
|
114
|
+
queryable flag; we default to queryable=True when absent).
|
|
115
|
+
"""
|
|
116
|
+
fields = describe_result.get("fields") or []
|
|
117
|
+
out: list[str] = []
|
|
118
|
+
for f in fields:
|
|
119
|
+
if not isinstance(f, dict):
|
|
120
|
+
continue
|
|
121
|
+
name = f.get("name")
|
|
122
|
+
if not isinstance(name, str) or not name:
|
|
123
|
+
continue
|
|
124
|
+
queryable = f.get("queryable", True)
|
|
125
|
+
if queryable:
|
|
126
|
+
out.append(name)
|
|
127
|
+
return sorted(out)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _is_cache_fresh(path: Path, ttl_days: int) -> bool:
|
|
131
|
+
"""Return True if the cached channels.json is present and not stale.
|
|
132
|
+
|
|
133
|
+
Staleness is derived from the embedded `_built_at_utc` timestamp, NOT
|
|
134
|
+
filesystem mtime — mtime can be skewed by backup / restore / rsync.
|
|
135
|
+
|
|
136
|
+
reject future timestamps (`age_seconds < 0`) as stale. A
|
|
137
|
+
`_built_at_utc` in the future means clock-skew or tampering; either
|
|
138
|
+
way we can't trust the cache. The bound `0 <= age < ttl` is the
|
|
139
|
+
honest freshness predicate.
|
|
140
|
+
"""
|
|
141
|
+
if not path.is_file():
|
|
142
|
+
return False
|
|
143
|
+
try:
|
|
144
|
+
data = json.loads(path.read_text())
|
|
145
|
+
except (OSError, json.JSONDecodeError):
|
|
146
|
+
return False
|
|
147
|
+
built_at = data.get("_built_at_utc")
|
|
148
|
+
if not isinstance(built_at, (int, float)):
|
|
149
|
+
return False
|
|
150
|
+
age_seconds = time.time() - float(built_at)
|
|
151
|
+
# future timestamps (age < 0) are not fresh.
|
|
152
|
+
return 0 <= age_seconds < (ttl_days * 86400)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _write_cache(path: Path, payload: dict) -> None:
|
|
156
|
+
"""Write the probe payload atomically with 0o600 permissions.
|
|
157
|
+
|
|
158
|
+
adjacency: the path itself is built via `build_probe_cache_dir`
|
|
159
|
+
upstream, so every segment is regex-validated. Here we just enforce
|
|
160
|
+
owner-only read/write and atomic rename.
|
|
161
|
+
|
|
162
|
+
concurrent-safe tmp filename. `path.with_suffix(...+".tmp")`
|
|
163
|
+
produces the same deterministic name for every concurrent caller —
|
|
164
|
+
a second writer would either race on the final rename or clobber
|
|
165
|
+
the first writer's in-flight bytes. `tempfile.mkstemp(dir=...)`
|
|
166
|
+
returns a unique pathname per call, eliminating the collision.
|
|
167
|
+
|
|
168
|
+
normalize parent-dir perms to 0o700 after mkdir. Even if the
|
|
169
|
+
parent existed with looser permissions (umask or operator lapse),
|
|
170
|
+
the probe cache directory is a per-user-per-org artifact that
|
|
171
|
+
should not be world-readable.
|
|
172
|
+
"""
|
|
173
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
174
|
+
# normalize even if the dir pre-existed.
|
|
175
|
+
try:
|
|
176
|
+
os.chmod(path.parent, 0o700)
|
|
177
|
+
except OSError:
|
|
178
|
+
# Best-effort: on an exotic filesystem (e.g. FAT) chmod may fail.
|
|
179
|
+
# Don't block the cache write on it.
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
# unique tmp name per call, in the same directory as the final
|
|
183
|
+
# path so `os.replace` stays atomic (same-filesystem rename).
|
|
184
|
+
fd, tmp_str = tempfile.mkstemp(
|
|
185
|
+
dir=str(path.parent), prefix=".channels.", suffix=".tmp",
|
|
186
|
+
)
|
|
187
|
+
tmp = Path(tmp_str)
|
|
188
|
+
try:
|
|
189
|
+
with os.fdopen(fd, "w") as f:
|
|
190
|
+
f.write(json.dumps(payload, indent=2, sort_keys=True))
|
|
191
|
+
os.chmod(tmp, 0o600) # owner RW only
|
|
192
|
+
os.replace(tmp, path)
|
|
193
|
+
except Exception:
|
|
194
|
+
# Clean up the tmp file on error — mkstemp leaves it behind.
|
|
195
|
+
try:
|
|
196
|
+
tmp.unlink()
|
|
197
|
+
except FileNotFoundError:
|
|
198
|
+
pass
|
|
199
|
+
raise
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def probe_channels(
|
|
203
|
+
org_alias: str,
|
|
204
|
+
org_id_15: str,
|
|
205
|
+
api_version: str,
|
|
206
|
+
*,
|
|
207
|
+
force_refresh: bool = False,
|
|
208
|
+
) -> dict:
|
|
209
|
+
"""Run (or return cached) describes for every sObject the skill touches.
|
|
210
|
+
|
|
211
|
+
caller passes `force_refresh=True` via the `--reprobe` CLI flag
|
|
212
|
+
or via `invalidate_and_reprobe` when a runtime SOQL surfaces
|
|
213
|
+
`INVALID_FIELD`. Default behavior: return cached payload if present
|
|
214
|
+
AND younger than `PROBE_TTL_DAYS`.
|
|
215
|
+
|
|
216
|
+
Returns a dict of shape:
|
|
217
|
+
{
|
|
218
|
+
"_schema": "channels/1",
|
|
219
|
+
"_built_at_utc": <epoch>,
|
|
220
|
+
"status": "OK" | "PROBE_FAILED",
|
|
221
|
+
"channels": {
|
|
222
|
+
"BotDefinition": {
|
|
223
|
+
"queryable_fields": [...],
|
|
224
|
+
"mandatory_missing": [...],
|
|
225
|
+
"describe_error": None | "<redacted error>"
|
|
226
|
+
},
|
|
227
|
+
...
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
"""
|
|
231
|
+
cache_dir = build_probe_cache_dir(org_id_15, api_version)
|
|
232
|
+
cache_file = cache_dir / "channels.json"
|
|
233
|
+
|
|
234
|
+
if not force_refresh and _is_cache_fresh(cache_file, PROBE_TTL_DAYS):
|
|
235
|
+
return json.loads(cache_file.read_text())
|
|
236
|
+
|
|
237
|
+
channels: Dict[str, dict] = {}
|
|
238
|
+
any_mandatory_missing = False
|
|
239
|
+
|
|
240
|
+
for sobject in ALL_SOBJECTS:
|
|
241
|
+
is_tooling = sobject in _TOOLING_API_SOBJECTS
|
|
242
|
+
entry: Dict[str, Any] = {
|
|
243
|
+
"queryable_fields": [],
|
|
244
|
+
"mandatory_missing": [],
|
|
245
|
+
"describe_error": None,
|
|
246
|
+
}
|
|
247
|
+
try:
|
|
248
|
+
result = _describe_sobject(org_alias, sobject, is_tooling)
|
|
249
|
+
except ProbeError as e:
|
|
250
|
+
# Redaction already applied by sf_cli.run_sf; we're just
|
|
251
|
+
# passing the message along.
|
|
252
|
+
entry["describe_error"] = str(e)
|
|
253
|
+
channels[sobject] = entry
|
|
254
|
+
# A describe failure is treated as "all mandatory missing"
|
|
255
|
+
# for this sObject — the skill can't function against it.
|
|
256
|
+
entry["mandatory_missing"] = sorted(MANDATORY_FIELDS.get(sobject, set()))
|
|
257
|
+
if entry["mandatory_missing"]:
|
|
258
|
+
any_mandatory_missing = True
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
queryable = _extract_queryable_fields(result)
|
|
262
|
+
entry["queryable_fields"] = queryable
|
|
263
|
+
mandatory = MANDATORY_FIELDS.get(sobject, set())
|
|
264
|
+
missing = sorted(mandatory - set(queryable))
|
|
265
|
+
entry["mandatory_missing"] = missing
|
|
266
|
+
if missing:
|
|
267
|
+
any_mandatory_missing = True
|
|
268
|
+
|
|
269
|
+
channels[sobject] = entry
|
|
270
|
+
|
|
271
|
+
payload = {
|
|
272
|
+
"_schema": "channels/1",
|
|
273
|
+
"_built_at_utc": time.time(),
|
|
274
|
+
"status": "PROBE_FAILED" if any_mandatory_missing else "OK",
|
|
275
|
+
"channels": channels,
|
|
276
|
+
}
|
|
277
|
+
_write_cache(cache_file, payload)
|
|
278
|
+
return payload
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def invalidate_and_reprobe(
|
|
282
|
+
org_alias: str,
|
|
283
|
+
org_id_15: str,
|
|
284
|
+
api_version: str,
|
|
285
|
+
) -> dict:
|
|
286
|
+
"""Delete the cached channels.json and re-run the probe.
|
|
287
|
+
|
|
288
|
+
called when a runtime SOQL returns `INVALID_FIELD`. The cached
|
|
289
|
+
schema is stale (SF release renamed / removed a field); we can't trust
|
|
290
|
+
any of it, so unlink + re-probe.
|
|
291
|
+
|
|
292
|
+
Returns the fresh payload. On a subsequent INVALID_FIELD from the
|
|
293
|
+
re-probed schema, the caller should surface PROBE_FAILED rather than
|
|
294
|
+
re-enter this function — one reprobe per run, not a retry loop.
|
|
295
|
+
"""
|
|
296
|
+
cache_dir = build_probe_cache_dir(org_id_15, api_version)
|
|
297
|
+
cache_file = cache_dir / "channels.json"
|
|
298
|
+
try:
|
|
299
|
+
cache_file.unlink()
|
|
300
|
+
except FileNotFoundError:
|
|
301
|
+
pass
|
|
302
|
+
return probe_channels(org_alias, org_id_15, api_version, force_refresh=True)
|