@salesforce/afv-skills 1.21.0 → 1.22.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-architecture-analyze/README.md +156 -0
- package/skills/agentforce-architecture-analyze/SKILL.md +230 -0
- package/skills/agentforce-architecture-analyze/assets/cli/describe_sobject.yaml +16 -0
- package/skills/agentforce-architecture-analyze/assets/cli/describe_tooling_sobject.yaml +17 -0
- package/skills/agentforce-architecture-analyze/assets/cli/list_metadata_genaiprompttemplate.yaml +17 -0
- package/skills/agentforce-architecture-analyze/assets/cli/org_display.yaml +15 -0
- package/skills/agentforce-architecture-analyze/assets/cli/retrieve_genai_plugin.yaml +18 -0
- package/skills/agentforce-architecture-analyze/assets/cli/show_access_token.yaml +27 -0
- package/skills/agentforce-architecture-analyze/assets/mermaid/action_tree.mmd +20 -0
- package/skills/agentforce-architecture-analyze/assets/mermaid/data_flow.mmd +19 -0
- package/skills/agentforce-architecture-analyze/assets/mermaid/dependency_graph.mmd +19 -0
- package/skills/agentforce-architecture-analyze/assets/mermaid/invocation_sequence.mmd +20 -0
- package/skills/agentforce-architecture-analyze/assets/mermaid/planner_state.mmd +18 -0
- package/skills/agentforce-architecture-analyze/assets/soql/apex_class_bodies_by_ids.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/apex_class_bodies_by_names.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/bot_definition_details.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/bot_version_lookup.soql +4 -0
- package/skills/agentforce-architecture-analyze/assets/soql/flow_definition_by_ids.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/flow_definition_ids_by_names.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/flow_definition_view_by_durable_ids.soql +4 -0
- package/skills/agentforce-architecture-analyze/assets/soql/flow_metadata_by_id.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/functions_by_plugins.soql +5 -0
- package/skills/agentforce-architecture-analyze/assets/soql/planner_attrs_by_parent_ids.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/planner_bundle_functions.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/planner_definition_by_agent_chain.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/plugin_functions_by_plugin_ids.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/plugin_instructions_by_plugin_ids.soql +3 -0
- package/skills/agentforce-architecture-analyze/assets/soql/plugins_by_planner.soql +4 -0
- package/skills/agentforce-architecture-analyze/references/architecture_sections.md +243 -0
- package/skills/agentforce-architecture-analyze/references/contract.json +244 -0
- package/skills/agentforce-architecture-analyze/references/soql_fields.md +512 -0
- package/skills/agentforce-architecture-analyze/scripts/_shared/__init__.py +1 -0
- package/skills/agentforce-architecture-analyze/scripts/_shared/fs_guard.py +329 -0
- package/skills/agentforce-architecture-analyze/scripts/_shared/paths.py +110 -0
- package/skills/agentforce-architecture-analyze/scripts/_shared/runtime.py +59 -0
- package/skills/agentforce-architecture-analyze/scripts/_shared/sql.py +10 -0
- package/skills/agentforce-architecture-analyze/scripts/cache_check.py +234 -0
- package/skills/agentforce-architecture-analyze/scripts/config.py +131 -0
- package/skills/agentforce-architecture-analyze/scripts/fetch_soql.py +689 -0
- package/skills/agentforce-architecture-analyze/scripts/finalize.py +295 -0
- package/skills/agentforce-architecture-analyze/scripts/main.py +2835 -0
- package/skills/agentforce-architecture-analyze/scripts/metadata_listing.py +265 -0
- package/skills/agentforce-architecture-analyze/scripts/parallel_retrieve.py +69 -0
- package/skills/agentforce-architecture-analyze/scripts/parse_bundle.py +215 -0
- package/skills/agentforce-architecture-analyze/scripts/parse_wave.py +845 -0
- package/skills/agentforce-architecture-analyze/scripts/probe_channels.py +302 -0
- package/skills/agentforce-architecture-analyze/scripts/render_architecture.py +1043 -0
- package/skills/agentforce-architecture-analyze/scripts/resolve_bot.py +255 -0
- package/skills/agentforce-architecture-analyze/scripts/resolve_invocation_target.py +130 -0
- package/skills/agentforce-architecture-analyze/scripts/rest_client.py +763 -0
- package/skills/agentforce-architecture-analyze/scripts/retrieve_planner.py +13 -0
- package/skills/agentforce-architecture-analyze/scripts/sf_cli.py +242 -0
- package/skills/agentforce-architecture-analyze/scripts/soql_loader.py +253 -0
- package/skills/agentforce-architecture-analyze/scripts/summarize_tree.py +143 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/__init__.py +0 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/_bootstrap.py +23 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/fixtures/genai_payloads.py +400 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_cache_check.py +307 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_cache_check_main.py +283 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_config.py +115 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_end_to_end_fixture.py +651 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_finalize.py +278 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_flow_children_inflation.py +582 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_fs_guard.py +113 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_iterative_wave_b.py +478 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_main_pipeline.py +3359 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parallel_retrieve.py +131 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parse_bundle.py +400 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parse_wave.py +644 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parse_wave_classifiers.py +224 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parse_wave_helpers.py +380 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_parse_wave_main.py +397 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_per_branch_visited.py +244 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_probe_channels.py +359 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_probe_cli_recipes.py +185 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_render_architecture.py +810 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_resolve_bot.py +203 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_resolve_creds.py +157 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_resolve_invocation_target.py +145 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_rest_client.py +1253 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_runtime_override.py +100 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_sf_cli.py +261 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_signature_stamping.py +466 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_soql_loader.py +501 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_summarize_tree.py +241 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_write_emit_ctx.py +480 -0
- package/skills/agentforce-architecture-analyze/tools/emit_env.py +157 -0
- package/skills/agentforce-architecture-analyze/tools/emit_result.py +262 -0
- package/skills/agentforce-architecture-analyze/tools/sanitize.py +33 -0
- package/skills/agentforce-architecture-analyze/tools/write_emit_ctx.py +332 -0
- package/skills/agentforce-d360-analyze/README.md +123 -0
- package/skills/agentforce-d360-analyze/SKILL.md +163 -0
- package/skills/agentforce-d360-analyze/assets/dc/app_generation.sql +51 -0
- package/skills/agentforce-d360-analyze/assets/dc/content_category.sql +44 -0
- package/skills/agentforce-d360-analyze/assets/dc/content_quality.sql +41 -0
- package/skills/agentforce-d360-analyze/assets/dc/discover_sessions.sql +36 -0
- package/skills/agentforce-d360-analyze/assets/dc/feedback.sql +47 -0
- package/skills/agentforce-d360-analyze/assets/dc/feedback_details.sql +38 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_records.sql +45 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_request_llm.sql +50 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_request_metadata.sql +44 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_request_tags.sql +42 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_requests.sql +89 -0
- package/skills/agentforce-d360-analyze/assets/dc/gateway_responses.sql +43 -0
- package/skills/agentforce-d360-analyze/assets/dc/generations.sql +52 -0
- package/skills/agentforce-d360-analyze/assets/dc/interactions.sql +53 -0
- package/skills/agentforce-d360-analyze/assets/dc/messages.sql +53 -0
- package/skills/agentforce-d360-analyze/assets/dc/messaging_session.sql +37 -0
- package/skills/agentforce-d360-analyze/assets/dc/moment_interactions.sql +34 -0
- package/skills/agentforce-d360-analyze/assets/dc/moments.sql +39 -0
- package/skills/agentforce-d360-analyze/assets/dc/participants.sql +48 -0
- package/skills/agentforce-d360-analyze/assets/dc/sessions.sql +78 -0
- package/skills/agentforce-d360-analyze/assets/dc/steps.sql +64 -0
- package/skills/agentforce-d360-analyze/assets/dc/tag_associations.sql +46 -0
- package/skills/agentforce-d360-analyze/assets/dc/tag_definition_associations.sql +37 -0
- package/skills/agentforce-d360-analyze/assets/dc/tag_definitions.sql +50 -0
- package/skills/agentforce-d360-analyze/assets/dc/tags.sql +37 -0
- package/skills/agentforce-d360-analyze/assets/dc/telemetry_spans.sql +55 -0
- package/skills/agentforce-d360-analyze/references/artifacts.md +50 -0
- package/skills/agentforce-d360-analyze/references/dc_dmo_fields.md +823 -0
- package/skills/agentforce-d360-analyze/references/dc_pipeline_contract.md +608 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/__init__.py +2 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/cli_override.py +98 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/fs_guard.py +334 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/paths.py +155 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/runtime.py +59 -0
- package/skills/agentforce-d360-analyze/scripts/_shared/sql.py +14 -0
- package/skills/agentforce-d360-analyze/scripts/assemble_dc.py +1624 -0
- package/skills/agentforce-d360-analyze/scripts/config.py +45 -0
- package/skills/agentforce-d360-analyze/scripts/dc.py +188 -0
- package/skills/agentforce-d360-analyze/scripts/discover_sessions.py +556 -0
- package/skills/agentforce-d360-analyze/scripts/fetch_dc.py +1045 -0
- package/skills/agentforce-d360-analyze/scripts/render_dc.py +1750 -0
- package/skills/agentforce-d360-analyze/scripts/resolve_session.py +264 -0
- package/skills/agentforce-d360-analyze/scripts/storage.py +92 -0
- package/skills/agentforce-d360-analyze/scripts/tests/__init__.py +0 -0
- package/skills/agentforce-d360-analyze/scripts/tests/_bootstrap.py +15 -0
- package/skills/agentforce-d360-analyze/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/agentforce-d360-analyze/scripts/tests/fixtures/synthetic_session.py +424 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_assemble_dc_bootstrap_and_mode.py +115 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_assemble_dc_gateway_direct.py +220 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_assemble_dc_gateway_direct_integration.py +158 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_assemble_dc_helpers.py +287 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_assemble_dc_integration.py +247 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_dc_and_resolve_session.py +433 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_discover_sessions.py +458 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_discover_sessions_grep_ci.py +193 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_fetch_dc_helpers.py +266 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_fetch_dc_identity.py +528 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_fetch_dc_main.py +251 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_fetch_dc_waterfall.py +229 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_fetch_dc_waterfall_full.py +283 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_identity_coherence.py +327 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_branches.py +256 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_gateway_direct.py +130 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_helpers.py +291 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_integration.py +220 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_planner_llm_calls.py +284 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_render_dc_show_prompts_gating.py +215 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_resolve_from_disk.py +100 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_resolve_session_main.py +149 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_runtime_override.py +104 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_session_shape.py +95 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_session_shape_dropped_by_stdm.py +85 -0
- package/skills/agentforce-generate/README.md +112 -0
- package/skills/agentforce-generate/SKILL.md +518 -0
- package/skills/agentforce-generate/assets/README-legacy.md +89 -0
- package/skills/agentforce-generate/assets/agent-spec-template.md +90 -0
- package/skills/agentforce-generate/assets/agents/README.md +45 -0
- package/skills/agentforce-generate/assets/agents/hello-world.agent +60 -0
- package/skills/agentforce-generate/assets/agents/multi-subagent.agent +105 -0
- package/skills/agentforce-generate/assets/agents/order-service.agent +272 -0
- package/skills/agentforce-generate/assets/agents/production-faq.agent +101 -0
- package/skills/agentforce-generate/assets/agents/production-faq.bundle-meta.xml +4 -0
- package/skills/agentforce-generate/assets/agents/simple-qa.agent +72 -0
- package/skills/agentforce-generate/assets/agents/verification-gate.agent +280 -0
- package/skills/agentforce-generate/assets/apex/models-api-queueable.cls +225 -0
- package/skills/agentforce-generate/assets/bundle-meta.xml +23 -0
- package/skills/agentforce-generate/assets/components/apex-action.agent +52 -0
- package/skills/agentforce-generate/assets/components/error-handling.agent +58 -0
- package/skills/agentforce-generate/assets/components/escalation-setup.agent +169 -0
- package/skills/agentforce-generate/assets/components/flow-action.agent +66 -0
- package/skills/agentforce-generate/assets/components/n-ary-conditions.agent +110 -0
- package/skills/agentforce-generate/assets/components/subagent-with-actions.agent +40 -0
- package/skills/agentforce-generate/assets/deterministic-routing.agent +166 -0
- package/skills/agentforce-generate/assets/escalation-pattern.agent +209 -0
- package/skills/agentforce-generate/assets/flow-action-lookup.agent +115 -0
- package/skills/agentforce-generate/assets/hub-and-spoke.agent +104 -0
- package/skills/agentforce-generate/assets/invocable-apex-template.cls +187 -0
- package/skills/agentforce-generate/assets/local-info-agent-annotated.agent +355 -0
- package/skills/agentforce-generate/assets/metadata/basic-prompt-template.promptTemplate-meta.xml +109 -0
- package/skills/agentforce-generate/assets/metadata/genai-function-apex.xml +92 -0
- package/skills/agentforce-generate/assets/metadata/genai-function-flow.xml +57 -0
- package/skills/agentforce-generate/assets/metadata/genai-plugin.xml +72 -0
- package/skills/agentforce-generate/assets/metadata/http-callout-flow.flow-meta.xml +348 -0
- package/skills/agentforce-generate/assets/metadata/record-grounded-prompt.promptTemplate-meta.xml +136 -0
- package/skills/agentforce-generate/assets/minimal-starter.agent +42 -0
- package/skills/agentforce-generate/assets/patterns/README.md +254 -0
- package/skills/agentforce-generate/assets/patterns/action-callbacks.agent +178 -0
- package/skills/agentforce-generate/assets/patterns/advanced-input-bindings.agent +141 -0
- package/skills/agentforce-generate/assets/patterns/bidirectional-routing.agent +156 -0
- package/skills/agentforce-generate/assets/patterns/critical-input-collection.agent +244 -0
- package/skills/agentforce-generate/assets/patterns/delegation-routing.agent +89 -0
- package/skills/agentforce-generate/assets/patterns/lifecycle-events.agent +127 -0
- package/skills/agentforce-generate/assets/patterns/llm-controlled-actions.agent +184 -0
- package/skills/agentforce-generate/assets/patterns/multi-step-workflow.agent +282 -0
- package/skills/agentforce-generate/assets/patterns/open-gate-routing.agent +287 -0
- package/skills/agentforce-generate/assets/patterns/procedural-instructions.agent +273 -0
- package/skills/agentforce-generate/assets/patterns/prompt-template-action.agent +188 -0
- package/skills/agentforce-generate/assets/patterns/system-instruction-overrides.agent +293 -0
- package/skills/agentforce-generate/assets/prompt-rag-search.agent +131 -0
- package/skills/agentforce-generate/assets/template-multi-subagent.agent +160 -0
- package/skills/agentforce-generate/assets/template-single-subagent.agent +81 -0
- package/skills/agentforce-generate/assets/verification-gate.agent +208 -0
- package/skills/agentforce-generate/references/action-prompt-templates.md +164 -0
- package/skills/agentforce-generate/references/actions-reference.md +612 -0
- package/skills/agentforce-generate/references/agent-access-guide.md +72 -0
- package/skills/agentforce-generate/references/agent-design-and-spec-creation.md +1010 -0
- package/skills/agentforce-generate/references/agent-metadata-and-lifecycle.md +575 -0
- package/skills/agentforce-generate/references/agent-script-core-language.md +1255 -0
- package/skills/agentforce-generate/references/agent-subagent-map-diagrams.md +323 -0
- package/skills/agentforce-generate/references/agent-user-setup.md +529 -0
- package/skills/agentforce-generate/references/agent-validation-and-debugging.md +805 -0
- package/skills/agentforce-generate/references/architecture-patterns.md +158 -0
- package/skills/agentforce-generate/references/complex-data-types.md +57 -0
- package/skills/agentforce-generate/references/deploy-reference.md +134 -0
- package/skills/agentforce-generate/references/discover-reference.md +102 -0
- package/skills/agentforce-generate/references/examples.md +350 -0
- package/skills/agentforce-generate/references/feature-validity.md +43 -0
- package/skills/agentforce-generate/references/instruction-resolution.md +545 -0
- package/skills/agentforce-generate/references/known-issues.md +353 -0
- package/skills/agentforce-generate/references/minimal-examples.md +67 -0
- package/skills/agentforce-generate/references/production-gotchas.md +300 -0
- package/skills/agentforce-generate/references/safety-review-reference.md +145 -0
- package/skills/agentforce-generate/references/salesforce-cli-for-agents.md +395 -0
- package/skills/agentforce-generate/references/scaffold-reference.md +153 -0
- package/skills/agentforce-generate/references/scoring-rubric.md +24 -0
- package/skills/agentforce-generate/references/version-history.md +23 -0
- package/skills/agentforce-observe/SKILL.md +366 -0
- package/skills/agentforce-observe/apex/AgentforceOptimizeService.cls +1262 -0
- package/skills/agentforce-observe/apex/AgentforceOptimizeService.cls-meta.xml +5 -0
- package/skills/agentforce-observe/references/improve-reference.md +359 -0
- package/skills/agentforce-observe/references/issue-classification.md +220 -0
- package/skills/agentforce-observe/references/reproduce-reference.md +131 -0
- package/skills/agentforce-observe/references/stdm-queries.md +373 -0
- package/skills/agentforce-observe/references/stdm-schema.md +189 -0
- package/skills/agentforce-test/SKILL.md +333 -0
- package/skills/agentforce-test/assets/basic-test-spec.yaml +63 -0
- package/skills/agentforce-test/assets/guardrail-test-spec.yaml +105 -0
- package/skills/agentforce-test/assets/standard-test-spec.yaml +127 -0
- package/skills/agentforce-test/references/action-execution.md +241 -0
- package/skills/agentforce-test/references/batch-testing.md +274 -0
- package/skills/agentforce-test/references/preview-testing.md +353 -0
- package/skills/agentforce-test/references/test-report-format.md +160 -0
- package/skills/agentforce-test/references/troubleshooting.md +73 -0
- package/skills/analyzing-test-failures/SKILL.md +1 -1
- package/skills/automation-flow-generate/SKILL.md +372 -0
- package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +165 -0
- package/skills/commerce-b2b-store-create/SKILL.md +167 -0
- package/skills/commerce-b2b-store-create/references/store-vs-storefront.md +169 -0
- package/skills/creating-fix-work-item/SKILL.md +1 -1
- package/skills/data360-activate/CREDITS.md +5 -0
- package/skills/data360-activate/README.md +39 -0
- package/skills/data360-activate/SKILL.md +117 -0
- package/skills/data360-connect/CREDITS.md +5 -0
- package/skills/data360-connect/README.md +59 -0
- package/skills/data360-connect/SKILL.md +154 -0
- package/skills/data360-connect/examples/connections/heroku-postgres.json +15 -0
- package/skills/data360-connect/examples/connections/ingest-api-connection.json +5 -0
- package/skills/data360-connect/examples/connections/ingest-api-schema.json +31 -0
- package/skills/data360-connect/examples/connections/redshift.json +16 -0
- package/skills/data360-connect/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/data360-connect/examples/connections/snowflake-connection.json +42 -0
- package/skills/data360-harmonize/CREDITS.md +3 -0
- package/skills/data360-harmonize/README.md +31 -0
- package/skills/data360-harmonize/SKILL.md +116 -0
- package/skills/data360-orchestrate/CREDITS.md +15 -0
- package/skills/data360-orchestrate/README.md +127 -0
- package/skills/data360-orchestrate/SKILL.md +235 -0
- package/skills/data360-orchestrate/UPSTREAM.md +45 -0
- package/skills/data360-orchestrate/assets/definitions/activation-target.template.json +5 -0
- package/skills/data360-orchestrate/assets/definitions/activation.template.json +7 -0
- package/skills/data360-orchestrate/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/data360-orchestrate/assets/definitions/data-action-target.template.json +5 -0
- package/skills/data360-orchestrate/assets/definitions/data-action.template.json +5 -0
- package/skills/data360-orchestrate/assets/definitions/data-graph.template.json +21 -0
- package/skills/data360-orchestrate/assets/definitions/data-stream.template.json +55 -0
- package/skills/data360-orchestrate/assets/definitions/dmo.template.json +17 -0
- package/skills/data360-orchestrate/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/data360-orchestrate/assets/definitions/mapping.template.json +14 -0
- package/skills/data360-orchestrate/assets/definitions/relationship.template.json +12 -0
- package/skills/data360-orchestrate/assets/definitions/search-index.template.json +9 -0
- package/skills/data360-orchestrate/assets/definitions/segment.template.json +16 -0
- package/skills/data360-orchestrate/references/feature-readiness.md +157 -0
- package/skills/data360-orchestrate/references/plugin-setup.md +138 -0
- package/skills/data360-orchestrate/scripts/bootstrap-plugin.sh +53 -0
- package/skills/data360-orchestrate/scripts/diagnose-org.mjs +511 -0
- package/skills/data360-orchestrate/scripts/generate-manifest.mjs +68 -0
- package/skills/data360-orchestrate/scripts/verify-plugin.sh +58 -0
- package/skills/data360-prepare/CREDITS.md +7 -0
- package/skills/data360-prepare/README.md +51 -0
- package/skills/data360-prepare/SKILL.md +190 -0
- package/skills/data360-prepare/examples/ingestion-api/.env.example +8 -0
- package/skills/data360-prepare/examples/ingestion-api/README.md +48 -0
- package/skills/data360-prepare/examples/ingestion-api/send-data.py +144 -0
- package/skills/data360-query/CREDITS.md +7 -0
- package/skills/data360-query/README.md +44 -0
- package/skills/data360-query/SKILL.md +119 -0
- package/skills/data360-query/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/data360-query/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/data360-segment/CREDITS.md +3 -0
- package/skills/data360-segment/README.md +36 -0
- package/skills/data360-segment/SKILL.md +114 -0
- package/skills/design-systems-slds-apply/SKILL.md +322 -0
- package/skills/design-systems-slds-apply/checklists.md +83 -0
- package/skills/design-systems-slds-apply/examples.md +283 -0
- package/skills/design-systems-slds-apply/guidance/README.md +83 -0
- package/skills/design-systems-slds-apply/guidance/blueprints-index.md +213 -0
- package/skills/design-systems-slds-apply/guidance/icons-guidance.md +186 -0
- package/skills/design-systems-slds-apply/guidance/overviews/borders.md +236 -0
- package/skills/design-systems-slds-apply/guidance/overviews/color.md +266 -0
- package/skills/design-systems-slds-apply/guidance/overviews/display-density.md +366 -0
- package/skills/design-systems-slds-apply/guidance/overviews/icons.md +240 -0
- package/skills/design-systems-slds-apply/guidance/overviews/illustrations.md +235 -0
- package/skills/design-systems-slds-apply/guidance/overviews/shadows.md +176 -0
- package/skills/design-systems-slds-apply/guidance/overviews/spacing.md +216 -0
- package/skills/design-systems-slds-apply/guidance/overviews/typography.md +323 -0
- package/skills/design-systems-slds-apply/guidance/overviews/utilities.md +542 -0
- package/skills/design-systems-slds-apply/guidance/slds-development-guide.md +288 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/borders.md +202 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/expressive-palette-hooks.md +153 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/index.md +171 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/semantic/accent-hooks.md +204 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/semantic/feedback-hooks.md +768 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/semantic/surface-hooks.md +337 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/color/system-hooks.md +132 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/index.md +327 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/shadows.md +238 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/spacing.md +254 -0
- package/skills/design-systems-slds-apply/guidance/styling-hooks/typography.md +448 -0
- package/skills/design-systems-slds-apply/guidance/utilities/alignment.md +119 -0
- package/skills/design-systems-slds-apply/guidance/utilities/borders.md +131 -0
- package/skills/design-systems-slds-apply/guidance/utilities/box.md +125 -0
- package/skills/design-systems-slds-apply/guidance/utilities/color.md +165 -0
- package/skills/design-systems-slds-apply/guidance/utilities/dark-mode.md +111 -0
- package/skills/design-systems-slds-apply/guidance/utilities/description-list.md +168 -0
- package/skills/design-systems-slds-apply/guidance/utilities/floats.md +117 -0
- package/skills/design-systems-slds-apply/guidance/utilities/grid.md +264 -0
- package/skills/design-systems-slds-apply/guidance/utilities/horizontal-list.md +110 -0
- package/skills/design-systems-slds-apply/guidance/utilities/hyphenation.md +84 -0
- package/skills/design-systems-slds-apply/guidance/utilities/index.md +205 -0
- package/skills/design-systems-slds-apply/guidance/utilities/interactions.md +89 -0
- package/skills/design-systems-slds-apply/guidance/utilities/layout.md +109 -0
- package/skills/design-systems-slds-apply/guidance/utilities/line-clamp.md +131 -0
- package/skills/design-systems-slds-apply/guidance/utilities/margin.md +155 -0
- package/skills/design-systems-slds-apply/guidance/utilities/media-object.md +161 -0
- package/skills/design-systems-slds-apply/guidance/utilities/name-value-list.md +152 -0
- package/skills/design-systems-slds-apply/guidance/utilities/padding.md +155 -0
- package/skills/design-systems-slds-apply/guidance/utilities/position.md +177 -0
- package/skills/design-systems-slds-apply/guidance/utilities/print.md +114 -0
- package/skills/design-systems-slds-apply/guidance/utilities/scrollable.md +126 -0
- package/skills/design-systems-slds-apply/guidance/utilities/sizing.md +190 -0
- package/skills/design-systems-slds-apply/guidance/utilities/themes.md +121 -0
- package/skills/design-systems-slds-apply/guidance/utilities/truncate.md +127 -0
- package/skills/design-systems-slds-apply/guidance/utilities/typography.md +166 -0
- package/skills/design-systems-slds-apply/guidance/utilities/vertical-list.md +166 -0
- package/skills/design-systems-slds-apply/guidance/utilities/visibility.md +228 -0
- package/skills/design-systems-slds-apply/metadata/README.md +84 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/accordion.yaml +304 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/activity-timeline.yaml +92 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/alert.yaml +103 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/app-launcher.yaml +94 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/avatar-group.yaml +81 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/avatar.yaml +97 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/badges.yaml +102 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/brand-band.yaml +198 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/breadcrumbs.yaml +95 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/builder-header.yaml +192 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/button-groups.yaml +82 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/button-icons.yaml +295 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/buttons.yaml +230 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/cards.yaml +124 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/carousel.yaml +140 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/chat.yaml +179 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/checkbox-button-group.yaml +192 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/checkbox-button.yaml +204 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/checkbox-toggle.yaml +177 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/checkbox.yaml +108 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/color-picker.yaml +172 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/combobox.yaml +136 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/counter.yaml +147 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/data-tables.yaml +157 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/datepickers.yaml +130 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/datetime-picker.yaml +155 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/docked-composer.yaml +201 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/docked-form-footer.yaml +161 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/docked-utility-bar.yaml +175 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/drop-zone.yaml +115 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/dueling-picklist.yaml +196 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/dynamic-icons.yaml +128 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/dynamic-menu.yaml +141 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/expandable-section.yaml +115 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/expression.yaml +143 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/feeds.yaml +125 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/file-selector.yaml +154 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/files.yaml +119 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/form-element.yaml +145 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/global-header.yaml +120 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/global-navigation.yaml +100 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/icons.yaml +138 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/illustration.yaml +205 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/input.yaml +151 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/list-builder.yaml +127 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/lookups.yaml +132 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/map.yaml +118 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/menus.yaml +134 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/modals.yaml +152 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/notifications.yaml +88 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/page-headers.yaml +135 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/panels.yaml +149 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/path.yaml +154 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/picklist.yaml +125 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/pills.yaml +154 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/popovers.yaml +120 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/progress-bar.yaml +110 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/progress-indicator.yaml +133 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/progress-ring.yaml +102 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/prompt.yaml +126 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/publishers.yaml +178 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/radio-button-group.yaml +172 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/radio-group.yaml +112 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/rich-text-editor.yaml +135 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/scoped-notifications.yaml +188 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/scoped-tabs.yaml +97 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/select.yaml +127 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/setup-assistant.yaml +152 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/slider.yaml +111 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/spinners.yaml +135 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/split-view.yaml +112 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/summary-detail.yaml +103 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/tabs.yaml +138 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/textarea.yaml +116 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/tiles.yaml +108 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/timepicker.yaml +111 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/toast.yaml +154 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/tooltips.yaml +107 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/tree-grid.yaml +116 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/trees.yaml +116 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/trial-bar.yaml +112 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/vertical-navigation.yaml +130 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/vertical-tabs.yaml +140 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/visual-picker.yaml +150 -0
- package/skills/design-systems-slds-apply/metadata/blueprints/components/welcome-mat.yaml +136 -0
- package/skills/design-systems-slds-apply/metadata/hooks-index.json +6272 -0
- package/skills/design-systems-slds-apply/metadata/icon-metadata.json +38466 -0
- package/skills/design-systems-slds-apply/metadata/utilities-index.json +21912 -0
- package/skills/design-systems-slds-apply/references/component-selection.md +112 -0
- package/skills/design-systems-slds-apply/references/icons-decision-guide.md +124 -0
- package/skills/design-systems-slds-apply/references/styling-decision-guide.md +228 -0
- package/skills/design-systems-slds-apply/references/utilities-quick-ref.md +125 -0
- package/skills/design-systems-slds-apply/scripts/search-blueprints.cjs +117 -0
- package/skills/design-systems-slds-apply/scripts/search-hooks.cjs +139 -0
- package/skills/design-systems-slds-apply/scripts/search-icons.cjs +174 -0
- package/skills/design-systems-slds-apply/scripts/search-utilities.cjs +161 -0
- package/skills/design-systems-slds-validate/SKILL.md +262 -0
- package/skills/design-systems-slds-validate/references/quality-checks.md +308 -0
- package/skills/design-systems-slds-validate/references/report-format.md +302 -0
- package/skills/design-systems-slds-validate/scripts/analyze-quality.cjs +521 -0
- package/skills/design-systems-slds2-migrate/SKILL.md +239 -0
- package/skills/design-systems-slds2-migrate/references/color-hooks-decision-guide.md +459 -0
- package/skills/design-systems-slds2-migrate/references/common-patterns.md +87 -0
- package/skills/design-systems-slds2-migrate/references/examples.md +461 -0
- package/skills/design-systems-slds2-migrate/references/migration-checklist.md +67 -0
- package/skills/design-systems-slds2-migrate/references/non-color-hooks-decision-guide.md +333 -0
- package/skills/design-systems-slds2-migrate/references/rule-lwc-token-to-slds-hook.md +135 -0
- package/skills/design-systems-slds2-migrate/references/rule-no-deprecated-tokens-slds1.md +211 -0
- package/skills/design-systems-slds2-migrate/references/rule-no-hardcoded-values.md +160 -0
- package/skills/design-systems-slds2-migrate/references/rule-no-slds-class-overrides.md +126 -0
- package/skills/dx-app-analytics-query/SKILL.md +135 -0
- package/skills/dx-code-analyzer-configure/SKILL.md +482 -0
- package/skills/dx-code-analyzer-configure/examples/apex-project-config.yml +41 -0
- package/skills/dx-code-analyzer-configure/examples/ci-github-actions.yml +96 -0
- package/skills/dx-code-analyzer-configure/examples/fullstack-project-config.yml +46 -0
- package/skills/dx-code-analyzer-configure/examples/lwc-project-config.yml +26 -0
- package/skills/dx-code-analyzer-configure/references/ci-cd-templates.md +648 -0
- package/skills/dx-code-analyzer-configure/references/config-schema.md +257 -0
- package/skills/dx-code-analyzer-configure/references/diagnostic-flow.md +70 -0
- package/skills/dx-code-analyzer-configure/references/engine-prerequisites.md +276 -0
- package/skills/dx-code-analyzer-configure/references/rule-name-resolution.md +67 -0
- package/skills/dx-code-analyzer-configure/references/troubleshooting.md +298 -0
- package/skills/dx-code-analyzer-configure/scripts/check-prerequisites.sh +189 -0
- package/skills/dx-code-analyzer-configure/scripts/generate-config.sh +143 -0
- package/skills/dx-code-analyzer-configure/scripts/validate-config.sh +153 -0
- package/skills/dx-code-analyzer-run/SKILL.md +495 -0
- package/skills/dx-code-analyzer-run/examples/README.md +38 -0
- package/skills/dx-code-analyzer-run/examples/basic-scan-output.json +92 -0
- package/skills/dx-code-analyzer-run/examples/command-variations.md +333 -0
- package/skills/dx-code-analyzer-run/examples/fix-application-before-after.md +142 -0
- package/skills/dx-code-analyzer-run/examples/large-scan-output.json +67 -0
- package/skills/dx-code-analyzer-run/examples/security-focused-output.json +95 -0
- package/skills/dx-code-analyzer-run/references/command-examples.md +27 -0
- package/skills/dx-code-analyzer-run/references/engine-reference.md +34 -0
- package/skills/dx-code-analyzer-run/references/error-handling.md +29 -0
- package/skills/dx-code-analyzer-run/references/flag-reference.md +96 -0
- package/skills/dx-code-analyzer-run/references/post-scan-workflows.md +286 -0
- package/skills/dx-code-analyzer-run/references/quick-start.md +28 -0
- package/skills/dx-code-analyzer-run/references/special-behaviors.md +83 -0
- package/skills/dx-code-analyzer-run/references/vendor-file-handling.md +239 -0
- package/skills/dx-code-analyzer-run/scripts/apply-fixes.js +86 -0
- package/skills/dx-code-analyzer-run/scripts/describe-rule.js +382 -0
- package/skills/dx-code-analyzer-run/scripts/discover-fixes.js +34 -0
- package/skills/dx-code-analyzer-run/scripts/filter-violations.js +405 -0
- package/skills/dx-code-analyzer-run/scripts/list-rules.js +260 -0
- package/skills/dx-code-analyzer-run/scripts/parse-results.js +59 -0
- package/skills/dx-code-analyzer-run/scripts/query-results.js +230 -0
- package/skills/dx-code-analyzer-run/scripts/summarize-fixes.js +32 -0
- package/skills/dx-code-analyzer-run/scripts/verify-execution.sh +28 -0
- package/skills/dx-org-switch/SKILL.md +28 -0
- package/skills/experience-cms-brand-apply/SKILL.md +170 -0
- package/skills/experience-content-media-search/SKILL.md +348 -0
- package/skills/experience-lwc-generate/CREDITS.md +5 -0
- package/skills/experience-lwc-generate/README.md +126 -0
- package/skills/experience-lwc-generate/SKILL.md +190 -0
- package/skills/experience-lwc-generate/assets/apex-controller/LwcController.cls +327 -0
- package/skills/experience-lwc-generate/assets/basic-component/basicComponent.css +72 -0
- package/skills/experience-lwc-generate/assets/basic-component/basicComponent.html +111 -0
- package/skills/experience-lwc-generate/assets/basic-component/basicComponent.js +163 -0
- package/skills/experience-lwc-generate/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/experience-lwc-generate/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/experience-lwc-generate/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/experience-lwc-generate/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/experience-lwc-generate/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/experience-lwc-generate/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/experience-lwc-generate/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/experience-lwc-generate/assets/form-component/formComponent.html +165 -0
- package/skills/experience-lwc-generate/assets/form-component/formComponent.js +275 -0
- package/skills/experience-lwc-generate/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/experience-lwc-generate/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/experience-lwc-generate/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/experience-lwc-generate/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/experience-lwc-generate/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/experience-lwc-generate/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/experience-lwc-generate/assets/modal-component/modalComponent.html +85 -0
- package/skills/experience-lwc-generate/assets/modal-component/modalComponent.js +199 -0
- package/skills/experience-lwc-generate/assets/record-picker/recordPicker.html +55 -0
- package/skills/experience-lwc-generate/assets/record-picker/recordPicker.js +199 -0
- package/skills/experience-lwc-generate/assets/state-store/store.js +282 -0
- package/skills/experience-lwc-generate/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/experience-lwc-generate/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/experience-lwc-generate/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/experience-lwc-generate/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/experience-lwc-generate/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/experience-lwc-generate/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/experience-lwc-generate/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/experience-lwc-generate/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/experience-lwc-generate/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/experience-lwc-generate/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/experience-lwc-generate/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/experience-lwc-generate/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/experience-lwc-generate/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/experience-lwc-generate/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/experience-lwc-generate/hooks/scripts/template_validator.py +332 -0
- package/skills/experience-lwc-generate/hooks/scripts/validate_slds.py +595 -0
- package/skills/experience-lwc-generate/references/accessibility-guide.md +843 -0
- package/skills/experience-lwc-generate/references/advanced-features.md +108 -0
- package/skills/experience-lwc-generate/references/async-notification-patterns.md +661 -0
- package/skills/experience-lwc-generate/references/cli-commands.md +545 -0
- package/skills/experience-lwc-generate/references/component-patterns.md +1476 -0
- package/skills/experience-lwc-generate/references/flow-integration-guide.md +675 -0
- package/skills/experience-lwc-generate/references/jest-testing.md +1011 -0
- package/skills/experience-lwc-generate/references/lms-guide.md +860 -0
- package/skills/experience-lwc-generate/references/lwc-best-practices.md +1310 -0
- package/skills/experience-lwc-generate/references/performance-guide.md +861 -0
- package/skills/experience-lwc-generate/references/scoring-and-testing.md +116 -0
- package/skills/experience-lwc-generate/references/slds-blueprints.json +14389 -0
- package/skills/experience-lwc-generate/references/slds-design-guide.md +166 -0
- package/skills/experience-lwc-generate/references/state-management.md +642 -0
- package/skills/experience-lwc-generate/references/template-anti-patterns.md +948 -0
- package/skills/experience-lwc-generate/references/triangle-pattern.md +365 -0
- package/skills/experience-lwc-generate/scripts/local-dev-preview.sh +34 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/SKILL.md +280 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/agent-id-resolution.md +46 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/constraints.md +134 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/examples.md +132 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/style-tokens.md +260 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/troubleshooting.md +57 -0
- package/skills/experience-ui-bundle-app-coordinate/SKILL.md +350 -0
- package/skills/experience-ui-bundle-custom-app-generate/SKILL.md +93 -0
- package/skills/experience-ui-bundle-custom-app-generate/docs/configure-metadata-custom-application.md +70 -0
- package/skills/experience-ui-bundle-deploy/SKILL.md +79 -0
- package/skills/experience-ui-bundle-features-generate/SKILL.md +47 -0
- package/skills/experience-ui-bundle-file-upload-generate/SKILL.md +398 -0
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +135 -0
- package/skills/experience-ui-bundle-frontend-generate/implementation/component.md +78 -0
- package/skills/experience-ui-bundle-frontend-generate/implementation/header-footer.md +132 -0
- package/skills/experience-ui-bundle-frontend-generate/implementation/page.md +93 -0
- package/skills/experience-ui-bundle-metadata-generate/SKILL.md +153 -0
- package/skills/experience-ui-bundle-metadata-generate/implementation/csp-metadata-format.md +281 -0
- package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +638 -0
- package/skills/experience-ui-bundle-salesforce-data-access/scripts/graphql-search.sh +191 -0
- package/skills/experience-ui-bundle-site-generate/SKILL.md +92 -0
- package/skills/experience-ui-bundle-site-generate/docs/configure-metadata-custom-site.md +41 -0
- package/skills/experience-ui-bundle-site-generate/docs/configure-metadata-digital-experience-bundle.md +17 -0
- package/skills/experience-ui-bundle-site-generate/docs/configure-metadata-digital-experience-config.md +21 -0
- package/skills/experience-ui-bundle-site-generate/docs/configure-metadata-digital-experience.md +40 -0
- package/skills/experience-ui-bundle-site-generate/docs/configure-metadata-network.md +72 -0
- package/skills/experience-ui-bundle-site-generate/docs/update-site-urls.md +100 -0
- package/skills/external-diagram-mermaid-generate/CREDITS.md +46 -0
- package/skills/external-diagram-mermaid-generate/README.md +114 -0
- package/skills/external-diagram-mermaid-generate/SKILL.md +217 -0
- package/skills/external-diagram-mermaid-generate/assets/agentforce/agent-flow.md +313 -0
- package/skills/external-diagram-mermaid-generate/assets/architecture/system-landscape.md +351 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/consent-erd.md +262 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/files-erd.md +266 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/fsl-erd.md +332 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/party-model-erd.md +237 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/external-diagram-mermaid-generate/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/external-diagram-mermaid-generate/assets/integration/api-sequence.md +387 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/authorization-code.md +152 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/client-credentials.md +233 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/device-authorization.md +295 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/jwt-bearer.md +256 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/refresh-token.md +281 -0
- package/skills/external-diagram-mermaid-generate/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/external-diagram-mermaid-generate/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/external-diagram-mermaid-generate/references/color-palette.md +464 -0
- package/skills/external-diagram-mermaid-generate/references/diagram-conventions.md +313 -0
- package/skills/external-diagram-mermaid-generate/references/erd-conventions.md +320 -0
- package/skills/external-diagram-mermaid-generate/references/mermaid-reference.md +434 -0
- package/skills/external-diagram-mermaid-generate/references/mermaid-styling.md +81 -0
- package/skills/external-diagram-mermaid-generate/references/preview-guide.md +46 -0
- package/skills/external-diagram-mermaid-generate/references/usage-examples.md +340 -0
- package/skills/external-diagram-mermaid-generate/scripts/README.md +160 -0
- package/skills/external-diagram-mermaid-generate/scripts/mermaid_preview.py +654 -0
- package/skills/external-diagram-mermaid-generate/scripts/query-org-metadata.py +293 -0
- package/skills/external-diagram-visual-generate/CREDITS.md +80 -0
- package/skills/external-diagram-visual-generate/README.md +83 -0
- package/skills/external-diagram-visual-generate/SKILL.md +207 -0
- package/skills/external-diagram-visual-generate/assets/architecture/integration-flow.md +55 -0
- package/skills/external-diagram-visual-generate/assets/erd/core-objects.md +131 -0
- package/skills/external-diagram-visual-generate/assets/erd/custom-objects.md +60 -0
- package/skills/external-diagram-visual-generate/assets/lwc/dashboard-card.md +45 -0
- package/skills/external-diagram-visual-generate/assets/lwc/data-table.md +57 -0
- package/skills/external-diagram-visual-generate/assets/lwc/record-form.md +60 -0
- package/skills/external-diagram-visual-generate/assets/review/apex-review.md +57 -0
- package/skills/external-diagram-visual-generate/assets/review/lwc-review.md +48 -0
- package/skills/external-diagram-visual-generate/references/architect-aesthetic-guide.md +257 -0
- package/skills/external-diagram-visual-generate/references/examples-index.md +35 -0
- package/skills/external-diagram-visual-generate/references/gemini-cli-setup.md +65 -0
- package/skills/external-diagram-visual-generate/references/interview-questions.md +529 -0
- package/skills/external-diagram-visual-generate/references/iteration-workflow.md +173 -0
- package/skills/external-diagram-visual-generate/scripts/check-prerequisites.sh +101 -0
- package/skills/external-diagram-visual-generate/scripts/generate_image.py +243 -0
- package/skills/getting-metadata-api-context/README.md +79 -0
- package/skills/getting-metadata-api-context/SKILL.md +466 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AIApplication.json +37 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AIApplicationConfig.json +53 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AIReplyRecommendationsSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AIScoringModelDefinition.json +87 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AIUsecaseDefinition.json +215 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountInsightsSettings.json +30 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountIntelligenceSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountPlanObjMeasCalcDef.json +86 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountPlanSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountRelationshipShareRule.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountSettings.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountingFieldMapping.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountingModelConfig.json +94 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AccountingSettings.json +53 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActionLinkGroupTemplate.json +118 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActionOverride.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActionPlanTemplate.json +166 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActionableListDefinition.json +114 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActionsSettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActivationPlatform.json +95 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActivationPlatformActvAttr.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActivationPlatformField.json +55 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActivitiesSettings.json +136 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActvPfrmDataConnectorS3.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActvPlatformAdncIdentifier.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ActvPlatformFieldValue.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AddressSettings.json +90 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AdvAccountForecastSet.json +261 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AffinityScoreDefinition.json +74 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AgentPlatformSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AgentforceForDevelopersSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AiAuthoringBundle.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AiEvaluationDefinition.json +153 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AiPluginUtteranceDef.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AllOrNoneHeader.json +17 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnalyticSnapshot.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnalyticsDashboard.json +369 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnalyticsSettings.json +488 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnalyticsVisualization.json +180 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnalyticsWorkspace.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AnimationRule.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexClass.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexComponent.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexEmailNotifications.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexPage.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexSettings.json +96 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexTestSuite.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApexTrigger.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppAnalyticsSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppExperienceSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppFrameworkTemplateBundle.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppMenu.json +10 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppointmentAssignmentPolicy.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AppointmentSchedulingPolicy.json +102 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ApprovalProcess.json +234 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ArticleType.json +81 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ArticleType_CustomField.json +88 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ArticleType_Layout.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AssessmentQuestion.json +117 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AssessmentQuestionSet.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AssignmentRules.json +87 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AssociationEngineSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AsyncResult.json +89 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Audience.json +172 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AuraDefinitionBundle.json +94 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AuthProvider.json +169 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AutoResponseRules.json +79 -0
- package/skills/getting-metadata-api-context/data/metadata_api/AutomatedContactsSettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BaseSharingRule.json +24 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BatchCalcJobDefinition.json +849 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BatchProcessJobDefinition.json +175 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BillingSettings.json +152 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BlacklistedConsumer.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Bot.json +197 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BotBlock.json +86 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BotSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BotTemplate.json +96 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BotVersion.json +667 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BranchManagementSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BrandingSet.json +146 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BriefcaseDefinition.json +127 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BusinessHoursSettings.json +175 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BusinessProcess.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/BusinessProcessGroup.json +91 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CMSConnectSource.json +197 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CallCenter.json +124 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CallCenterRoutingMap.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CallCoachingMediaProvider.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CallOptions.json +17 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CampaignInfluenceModel.json +59 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CampaignSettings.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CancelDeployResult.json +10 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CareBenefitVerifySettings.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CareLimitType.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CareProviderSearchConfig.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CareRequestConfiguration.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CareSystemFieldMapping.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CaseSettings.json +423 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CaseSubjectParticle.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CatalogedApi.json +97 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CatalogedApiArtifactVersionInfo.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CatalogedApiVersion.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Certificate.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChannelLayout.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChatterAnswersSettings.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChatterEmailsMDSettings.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChatterExtension.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChatterSettings.json +92 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ChoiceList.json +66 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ClaimFinancialSettings.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ClauseCatgConfiguration.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CleanDataService.json +166 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CodeBuilderSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CollectionsDashboardSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CommerceSettings.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CommunitiesSettings.json +116 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Community.json +121 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CommunityTemplateDefinition.json +116 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CommunityThemeDefinition.json +146 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CompactLayout.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CompanySettings.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConnectedApp.json +384 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConnectedAppSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ContentAsset.json +121 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ContentSettings.json +116 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ContentTypeBundle.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ContextDefinition.json +340 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ContractSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConvIntelligenceSignalRule.json +106 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConversationChannelDefinition.json +140 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConversationMessageDefinition.json +380 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConversationMessageDefinitionTranslation.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConversationVendorInfo.json +148 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ConversationalIntelligenceSettings.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CorsWhitelistOrigin.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CriteriaBasedSharingRule.json +206 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CspTrustedSite.json +82 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CurrencySettings.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomAddressFieldSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomApplication.json +453 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomApplicationComponent.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomFeedFilter.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomField.json +392 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomFieldDisplay.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomHelpMenuSection.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomIndex.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomLabels.json +69 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomMetadata.json +90 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomNotificationType.json +94 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomObject.json +313 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomObjectTranslation.json +319 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomPageWebLink.json +121 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomPermission.json +65 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomSite.json +288 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomTab.json +97 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomValue.json +85 -0
- package/skills/getting-metadata-api-context/data/metadata_api/CustomerDataPlatformSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Dashboard.json +584 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataCategoryGroup.json +81 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataConnector.json +230 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataConnectorIngestApi.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataConnectorS3.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataDotComSettings.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataImportManagementSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataKitObjectDependency.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataKitObjectTemplate.json +59 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataObjectBuildOrgTemplate.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataObjectSearchIndexConf.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataPackageKitDefinition.json +74 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataPackageKitObject.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSource.json +29 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSourceBundleDefinition.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSourceField.json +115 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSourceObject.json +93 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSourceTenant.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataSrcDataModelFieldMap.json +69 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataStreamDefinition.json +105 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataStreamTemplate.json +99 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DataWeaveResource.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DebuggingHeader.json +20 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DecisionMatrixDefinition.json +140 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DecisionTable.json +211 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DecisionTableDatasetLink.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DelegateGroup.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DeleteResult.json +22 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DeployResult.json +253 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DeploymentSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DescribeMetadataResult.json +31 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DescribeValueTypeResult.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DevHubSettings.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DgtAssetMgmtProvider.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DgtAssetMgmtPrvdLghtCpnt.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DigitalExperienceBundle.json +102 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DigitalExperienceBundle_Marketing_Workspace_Bundle_and_Folders.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DigitalExperienceBundle_Site_Workspace_Bundle_and_Folders.json +541 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DigitalExperienceConfig.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DisclosureDefinition.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DisclosureDefinitionVersion.json +78 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DisclosureType.json +53 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DiscoveryAIModel.json +263 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DiscoveryGoal.json +361 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DiscoveryStory.json +98 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Document.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DocumentCategory.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DocumentCategoryDocumentType.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DocumentChecklistSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DocumentGenerationSetting.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DocumentType.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DuplicateRule.json +160 -0
- package/skills/getting-metadata-api-context/data/metadata_api/DynamicFormsSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EACSettings.json +112 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EclairGeoData.json +73 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EinsteinAISettings.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EinsteinAgentSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EinsteinGptSettings.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailAdministrationSettings.json +104 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailAuthorizationSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailIntegrationSettings.json +92 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailServicesFunction.json +116 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailTemplate.json +116 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmailTemplateSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceBranding.json +78 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceConfig.json +318 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceFieldService.json +73 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceFlowConfig.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceLiveAgent.json +141 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmbeddedServiceMenuSettings.json +165 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EmployeeUserSettings.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EnablementMeasureDefinition.json +139 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EnablementProgramDefinition.json +241 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EnblProgramTaskSubCategory.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EncryptionKeySettings.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EnhancedNotesSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EntitlementProcess.json +147 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EntitlementSettings.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EntitlementTemplate.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Error.json +25 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EscalationRules.json +117 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EventDelivery.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EventRelayConfig.json +55 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EventSettings.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/EventSubscription.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExperienceBundle.json +387 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExperienceBundleSettings.json +25 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExperiencePropertyTypeBundle.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExplainabilityMsgTemplate.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExpressionSetDefinition.json +496 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExpressionSetMessageToken.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExpressionSetObjectAlias.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalAIModel.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalAuthIdentityProvider.json +79 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalClientAppSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalClientApplication.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalCredential.json +94 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalDataConnector.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalDataSource.json +162 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalDataTranObject.json +191 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalDataTransportFieldTemplate.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalDataTransportObjectTemplate.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalServiceRegistration.json +121 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExternalServicesSettings.json +34 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppCanvasSettings.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppConfigurablePolicies.json +75 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppGlobalOauthSettings.json +135 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppMobileConfigurablePolicies.json +34 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppMobileSettings.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppNotificationSettings.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppOauthConfigurablePolicies.json +153 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppOauthSettings.json +120 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppPushConfigurablePolicies.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppPushSettings.json +93 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ExtlClntAppSamlConfigurablePolicies.json +119 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FeatureParameterBoolean.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FeatureParameterDate.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FeatureParameterInteger.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FieldMappingConfig.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FieldRestrictionRule.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FieldServiceSettings.json +226 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FieldSet.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FieldSrcTrgtRelationship.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FileUploadAndDownloadSecuritySettings.json +53 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FilesConnectSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlexiPage.json +355 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Flow.json +2377 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlowCategory.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlowDefinition.json +37 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlowSettings.json +124 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlowTest.json +205 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FlowValueMap.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Folder.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FolderShare.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingFilter.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingFilterCondition.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingObjectListSettings.json +77 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingSettings.json +303 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingSourceDefinition.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingType.json +100 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ForecastingTypeSource.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FuelType.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FuelTypeSustnUom.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FunctionReference.json +31 -0
- package/skills/getting-metadata-api-context/data/metadata_api/FundraisingConfig.json +86 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GatewayProviderPaymentMethodType.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiFunction.json +171 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPlanner.json +215 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPlannerBundle.json +220 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPlugin.json +87 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPluginInstructionDef.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPromptTemplate.json +183 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GenAiPromptTemplateActv.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GiftEntryGridTemplate.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GlobalPicklist.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GlobalPicklistValue.json +81 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GlobalValueSet.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GlobalValueSetTranslation.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/GoogleAppsSettings.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Group.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/HighVelocitySalesSettings.json +96 -0
- package/skills/getting-metadata-api-context/data/metadata_api/HistoryRetentionPolicy.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/HomePageComponent.json +66 -0
- package/skills/getting-metadata-api-context/data/metadata_api/HomePageLayout.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IPAddressRange.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IdeasSettings.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IdentityProviderSettings.json +39 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IdentityVerificationProcDef.json +173 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IdentityVerificationProcDtl.json +136 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IdentityVerificationProcFld.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IframeWhiteListUrlSettings.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InboundCertificate.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InboundNetworkConnection.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IncidentMgmtSettings.json +140 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Index.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesEinsteinFeatureSettings.json +34 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesLoyaltySettings.json +108 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesPricingSettings.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesRatingSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesSettings.json +731 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IndustriesUnifiedInventorySettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InsPlcyLimitConsumptionRule.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InstalledPackage.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IntegArtifactDef.json +10 -0
- package/skills/getting-metadata-api-context/data/metadata_api/IntegrationProviderDef.json +155 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InterestTaggingSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InternalDataConnector.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InvLatePymntRiskCalcSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InventorySettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InvocableActionExtension.json +84 -0
- package/skills/getting-metadata-api-context/data/metadata_api/InvocableActionSettings.json +28 -0
- package/skills/getting-metadata-api-context/data/metadata_api/KeywordList.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/KnowledgeSettings.json +280 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LanguageSettings.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Layout.json +659 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LeadConfigSettings.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LeadConvertSettings.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LearningItemType.json +65 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Letterhead.json +119 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningBolt.json +103 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningComponentBundle.json +109 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningExperienceSettings.json +191 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningExperienceTheme.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningMessageChannel.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningOnboardingConfig.json +62 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LightningTypeBundle.json +88 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ListMetadataQuery.json +10 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ListView.json +86 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveAgentSettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveChatAgentConfig.json +188 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveChatButton.json +188 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveChatDeployment.json +81 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveChatSensitiveDataRule.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LiveMessageSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/LoyaltyProgramSetup.json +297 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MLDataDefinition.json +146 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MLPredictionDefinition.json +67 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MacroSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MailMergeSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ManagedContentType.json +86 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ManagedEventSubscription.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ManagedTopics.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MapAndLocationSettings.json +34 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MarketSegmentDefinition.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MarketingAppExtension.json +139 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MatchingRule.json +69 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MeetingsSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MessagingChannel.json +278 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MetadataWithContent.json +24 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Metadata_Type_Limits.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MfgProgramTemplate.json +88 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MfgServiceConsoleSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MilestoneType.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MktCalcInsightObjectDef.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MktDataTranObject.json +99 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MlDomain.json +136 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MobSecurityCertPinConfig.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MobileApplicationDetail.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MobileSecurityAssignment.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MobileSecurityPolicy.json +75 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MobileSettings.json +121 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ModerationRule.json +99 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MutingPermissionSet.json +33 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MyDomainDiscoverableLogin.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/MyDomainSettings.json +140 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NameSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NamedCredential.json +205 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NamedFilter.json +89 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NavigationMenu.json +101 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Network.json +606 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NetworkBranding.json +117 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NotificationTypeConfig.json +75 -0
- package/skills/getting-metadata-api-context/data/metadata_api/NotificationsSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OauthCustomScope.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OauthOidcSettings.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OauthTokenExchangeHandler.json +119 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ObjectHierarchyRelationship.json +108 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ObjectLinkingSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ObjectSourceTargetMap.json +85 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OcrSampleDocument.json +158 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OcrTemplate.json +180 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniChannelSettings.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniExtTrackingDef.json +66 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniInteractionAccessConfig.json +90 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniInteractionConfig.json +37 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniScript.json +204 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniSupervisorConfig.json +156 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OmniTrackingGroup.json +77 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OnboardingDataObjectGroup.json +131 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OpportunityInsightsSettings.json +30 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OpportunityScoreSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OpportunitySettings.json +132 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OrchestrationPlanCtxMapping.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OrderManagementSettings.json +52 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OrderSettings.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OrgPreferenceSettings.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OrgSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OutboundNetworkConnection.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/OwnerSharingRule.json +206 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Package.json +19 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PardotEinsteinSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PardotSettings.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ParticipantRole.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PartyDataModelSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PathAssistant.json +74 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PathAssistantSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PaymentGatewayProvider.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PaymentsSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PermissionSet.json +372 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PermissionSetGroup.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PermissionSetLicenseDefinition.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PersonAccountOwnerPowerUser.json +38 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Picklist.json +43 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PicklistSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PipelineInspMetricConfig.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformCachePartition.json +79 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEncryptionSettings.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEventChannel.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEventChannelMember.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEventMigration.json +39 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEventSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PlatformEventSubscriberConfig.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Portal.json +137 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PortalDelegablePermissionSet.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PostTemplate.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PredictionBuilderSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PresenceDeclineReason.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PresenceUserConfig.json +122 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PricingActionParameters.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PricingRecipe.json +117 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PrivacySettings.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProcessFlowMigration.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProductAttributeSet.json +33 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProductSettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Profile.json +492 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProfileActionOverride.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProfilePasswordPolicy.json +80 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProfileSearchLayouts.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ProfileSessionSetting.json +55 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Prompt.json +255 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PublicKeyCertificate.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/PublicKeyCertificateSet.json +65 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Queue.json +123 -0
- package/skills/getting-metadata-api-context/data/metadata_api/QueueRoutingConfig.json +96 -0
- package/skills/getting-metadata-api-context/data/metadata_api/QuickAction.json +175 -0
- package/skills/getting-metadata-api-context/data/metadata_api/QuoteSettings.json +36 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ReadResult.json +16 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RealTimeEventSettings.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecommendationStrategy.json +327 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecordActionDeployment.json +184 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecordAggregationDefinition.json +148 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecordAlertCategory.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecordPageSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RecordType.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RedirectWhitelistUrl.json +26 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ReferencedDashboard.json +55 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RegisteredExternalService.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RelatedRecordAssocCriteria.json +75 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RelationshipGraphDefinition.json +63 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RemoteSiteSetting.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Report.json +715 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ReportType.json +118 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RestrictionRule.json +71 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RetailExecutionSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RetrievalSummaryDefinition.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RetrieveRequest.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RetrieveResult.json +103 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Role.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/RoleOrTerritory.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SalesAgreementSettings.json +180 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SalesWorkQueueSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SamlSsoConfig.json +128 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SandboxSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SaveResult.json +22 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SchedulingObjective.json +66 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SchedulingRule.json +66 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SchemaSettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Scontrol.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SearchCustomization.json +120 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SearchLayouts.json +64 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SearchOrgWideObjectConfig.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SearchSettings.json +155 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SecuritySettings.json +437 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceAISetupDefinition.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceAISetupField.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceChannel.json +123 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceCloudVoiceSettings.json +83 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServicePresenceStatus.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceProcess.json +141 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ServiceSetupAssistantSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SessionHeader.json +17 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharedTo.json +105 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingBaseRule.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingReason.json +34 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingRecalculation.json +29 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingRules.json +186 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingSet.json +78 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SharingSettings.json +92 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SiteDotCom.json +37 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SiteSettings.json +60 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Skill.json +69 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SocialCustomerServiceSettings.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SocialProfileSettings.json +35 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SourceTrackingSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StageAssignment.json +113 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StageDefinition.json +237 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StandardValueSet.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StandardValueSetTranslation.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StaticResource.json +49 -0
- package/skills/getting-metadata-api-context/data/metadata_api/StreamingAppDataConnector.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SubscriptionManagementSettings.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SurveySettings.json +44 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SustainabilityUom.json +61 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SustnUomConversion.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SvcCatalogCategory.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SvcCatalogFulfillmentFlow.json +99 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SvcCatalogItemDef.json +202 -0
- package/skills/getting-metadata-api-context/data/metadata_api/SynonymDictionary.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Tag.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TagSet.json +47 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory.json +39 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory2.json +112 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory2Model.json +41 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory2Rule.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory2Settings.json +111 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Territory2Type.json +42 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TimeSheetTemplate.json +75 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TimelineObjectDefinition.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TopicsForObjects.json +38 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TrailheadSettings.json +40 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TransactionSecurityPolicy.json +127 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Translations.json +976 -0
- package/skills/getting-metadata-api-context/data/metadata_api/TrialOrgSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UIBundle.json +54 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UIObjectRelationConfig.json +101 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UiFormatSpecificationSet.json +103 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UiPreviewMessageTabDef.json +70 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UpsertResult.json +25 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserAccessPolicy.json +120 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserAuthCertificate.json +57 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserCriteria.json +48 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserEngagementSettings.json +136 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserInterfaceSettings.json +96 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserManagementSettings.json +108 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserProfileSearchScope.json +8 -0
- package/skills/getting-metadata-api-context/data/metadata_api/UserProvisioningConfig.json +72 -0
- package/skills/getting-metadata-api-context/data/metadata_api/ValidationRule.json +51 -0
- package/skills/getting-metadata-api-context/data/metadata_api/VirtualVisitConfig.json +97 -0
- package/skills/getting-metadata-api-context/data/metadata_api/VoiceSettings.json +68 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WarrantyLifeCycleMgmtSettings.json +32 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveAnalyticAssetCollection.json +73 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveApplication.json +56 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveComponent.json +46 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveDashboard.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveDataflow.json +45 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveDataset.json +50 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveLens.json +59 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveRecipe.json +58 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveTemplateBundle.json +37 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WaveXmd.json +567 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WebLink.json +117 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WebStoreBundle.json +10 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WebStoreTemplate.json +166 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WorkDotComSettings.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WorkSkillRouting.json +76 -0
- package/skills/getting-metadata-api-context/data/metadata_api/Workflow.json +415 -0
- package/skills/getting-metadata-api-context/data/metadata_api/WorkforceEngagementSettings.json +56 -0
- package/skills/getting-metadata-api-context/examples/README.md +169 -0
- package/skills/getting-metadata-api-context/examples/bash_section_loading.sh +142 -0
- package/skills/getting-metadata-api-context/examples/javascript_section_loading.js +162 -0
- package/skills/getting-metadata-api-context/examples/python_section_loading.py +112 -0
- package/skills/getting-metadata-api-context/references/metadata_index_table.md +654 -0
- package/skills/getting-metadata-api-context/references/usage_guide.md +420 -0
- package/skills/integration-connectivity-connected-app-configure/CREDITS.md +3 -0
- package/skills/integration-connectivity-connected-app-configure/README.md +99 -0
- package/skills/integration-connectivity-connected-app-configure/SKILL.md +223 -0
- package/skills/integration-connectivity-connected-app-configure/assets/connected-app-basic.xml +29 -0
- package/skills/integration-connectivity-connected-app-configure/assets/connected-app-canvas.xml +62 -0
- package/skills/integration-connectivity-connected-app-configure/assets/connected-app-jwt.xml +49 -0
- package/skills/integration-connectivity-connected-app-configure/assets/connected-app-oauth.xml +65 -0
- package/skills/integration-connectivity-connected-app-configure/assets/eca-global-oauth.xml +36 -0
- package/skills/integration-connectivity-connected-app-configure/assets/eca-oauth-settings.xml +36 -0
- package/skills/integration-connectivity-connected-app-configure/assets/eca-policies.xml +36 -0
- package/skills/integration-connectivity-connected-app-configure/assets/external-client-app.xml +35 -0
- package/skills/integration-connectivity-connected-app-configure/references/example-usage.md +256 -0
- package/skills/integration-connectivity-connected-app-configure/references/migration-guide.md +328 -0
- package/skills/integration-connectivity-connected-app-configure/references/oauth-flows-reference.md +660 -0
- package/skills/integration-connectivity-connected-app-configure/references/security-checklist.md +209 -0
- package/skills/integration-connectivity-connected-app-configure/references/testing-validation-guide.md +275 -0
- package/skills/integration-connectivity-generate/CREDITS.md +5 -0
- package/skills/integration-connectivity-generate/README.md +95 -0
- package/skills/integration-connectivity-generate/SKILL.md +191 -0
- package/skills/integration-connectivity-generate/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/integration-connectivity-generate/assets/callouts/http-response-handler.cls +257 -0
- package/skills/integration-connectivity-generate/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/integration-connectivity-generate/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/integration-connectivity-generate/assets/cdc/cdc-handler.cls +246 -0
- package/skills/integration-connectivity-generate/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/integration-connectivity-generate/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/integration-connectivity-generate/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/integration-connectivity-generate/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/integration-connectivity-generate/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/integration-connectivity-generate/assets/external-services/external-service-operations.md +221 -0
- package/skills/integration-connectivity-generate/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/integration-connectivity-generate/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/integration-connectivity-generate/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/integration-connectivity-generate/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/integration-connectivity-generate/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/integration-connectivity-generate/assets/platform-events/event-publisher.cls +191 -0
- package/skills/integration-connectivity-generate/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/integration-connectivity-generate/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/integration-connectivity-generate/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/integration-connectivity-generate/assets/soap/soap-callout-service.cls +186 -0
- package/skills/integration-connectivity-generate/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/integration-connectivity-generate/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/integration-connectivity-generate/hooks/scripts/validate_integration.py +363 -0
- package/skills/integration-connectivity-generate/references/callout-patterns.md +719 -0
- package/skills/integration-connectivity-generate/references/cdc-guide.md +288 -0
- package/skills/integration-connectivity-generate/references/cli-reference.md +94 -0
- package/skills/integration-connectivity-generate/references/event-driven-architecture-guide.md +266 -0
- package/skills/integration-connectivity-generate/references/event-patterns.md +838 -0
- package/skills/integration-connectivity-generate/references/external-services-guide.md +303 -0
- package/skills/integration-connectivity-generate/references/messaging-api-v2.md +609 -0
- package/skills/integration-connectivity-generate/references/named-credentials-automation.md +201 -0
- package/skills/integration-connectivity-generate/references/named-credentials-guide.md +173 -0
- package/skills/integration-connectivity-generate/references/platform-events-guide.md +288 -0
- package/skills/integration-connectivity-generate/references/rest-callout-patterns.md +288 -0
- package/skills/integration-connectivity-generate/references/scoring-rubric.md +59 -0
- package/skills/integration-connectivity-generate/references/security-best-practices.md +248 -0
- package/skills/integration-connectivity-generate/scripts/README.md +100 -0
- package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +236 -0
- package/skills/integration-connectivity-generate/scripts/set-api-credential.sh +146 -0
- package/skills/integration-connectivity-generate/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/integration-eventing-cdc-configure/SKILL.md +164 -0
- package/skills/integration-eventing-cdc-configure/assets/PlatformEventChannel-template.xml +5 -0
- package/skills/integration-eventing-cdc-configure/assets/PlatformEventChannelMember-template.xml +11 -0
- package/skills/integration-eventing-cdc-configure/references/deploy-troubleshooting.md +73 -0
- package/skills/integration-eventing-cdc-configure/references/filter-expressions.md +93 -0
- package/skills/integration-eventing-subscription-configure/SKILL.md +152 -0
- package/skills/integration-eventing-subscription-configure/assets/managed-event-subscription-template.xml +20 -0
- package/skills/integration-eventing-subscription-configure/references/delete-guide.md +57 -0
- package/skills/integration-eventing-subscription-configure/references/topic-name-formats.md +26 -0
- package/skills/integration-eventing-subscription-configure/references/update-constraints.md +30 -0
- package/skills/managing-suite-assignments/SKILL.md +1 -1
- package/skills/mobile-apps-create/SKILL.md +69 -0
- package/skills/mobile-platform-native-capabilities-integrate/SKILL.md +181 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/app-review.md +68 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/ar-space-capture.md +125 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/barcode-scanner.md +219 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/base-capability.md +22 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/biometrics.md +90 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/calendar.md +213 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/contacts.md +232 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/document-scanner.md +342 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/geofencing.md +123 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/location.md +158 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/mobile-capabilities.md +30 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/nfc.md +181 -0
- package/skills/mobile-platform-native-capabilities-integrate/references/payments.md +95 -0
- package/skills/mobile-platform-offline-validate/SKILL.md +167 -0
- package/skills/mobile-platform-offline-validate/references/grounding.md +7 -0
- package/skills/mobile-platform-offline-validate/references/inline-graphql.md +43 -0
- package/skills/mobile-platform-offline-validate/references/komaci-eslint.md +125 -0
- package/skills/mobile-platform-offline-validate/references/lwc-if.md +78 -0
- package/skills/mobile-platform-offline-validate/scripts/komaci.config.mjs +18 -0
- package/skills/mobile-platform-offline-validate/scripts/package.json +10 -0
- package/skills/mobile-platform-offline-validate/scripts/run-komaci.sh +69 -0
- package/skills/omnistudio-callable-apex-generate/CREDITS.md +9 -0
- package/skills/omnistudio-callable-apex-generate/README.md +80 -0
- package/skills/omnistudio-callable-apex-generate/SKILL.md +275 -0
- package/skills/omnistudio-callable-apex-generate/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/omnistudio-callable-apex-generate/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/omnistudio-callable-apex-generate/assets/pattern_migration.cls +54 -0
- package/skills/omnistudio-callable-apex-generate/assets/pattern_openinterface.cls +45 -0
- package/skills/omnistudio-callable-apex-generate/assets/pattern_test_class.cls +65 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/omnistudio-callable-apex-generate/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/omnistudio-datamapper-generate/CREDITS.md +5 -0
- package/skills/omnistudio-datamapper-generate/SKILL.md +269 -0
- package/skills/omnistudio-datamapper-generate/assets/completion-summary-template.md +28 -0
- package/skills/omnistudio-datamapper-generate/assets/omni-data-transform-extract.json +6 -0
- package/skills/omnistudio-datamapper-generate/assets/omni-data-transform-item.json +12 -0
- package/skills/omnistudio-datamapper-generate/assets/omni-data-transform-load.json +6 -0
- package/skills/omnistudio-datamapper-generate/assets/omni-data-transform-transform.json +6 -0
- package/skills/omnistudio-datamapper-generate/references/best-practices.md +277 -0
- package/skills/omnistudio-datamapper-generate/references/naming-conventions.md +145 -0
- package/skills/omnistudio-datapacks-deploy/CREDITS.md +5 -0
- package/skills/omnistudio-datapacks-deploy/README.md +88 -0
- package/skills/omnistudio-datapacks-deploy/SKILL.md +173 -0
- package/skills/omnistudio-datapacks-deploy/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/omnistudio-datapacks-deploy/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/omnistudio-datapacks-deploy/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/omnistudio-datapacks-deploy/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/omnistudio-datapacks-deploy/references/job-file-template.md +42 -0
- package/skills/omnistudio-datapacks-deploy/references/troubleshooting-matrix.md +24 -0
- package/skills/omnistudio-dependencies-analyze/CREDITS.md +5 -0
- package/skills/omnistudio-dependencies-analyze/SKILL.md +476 -0
- package/skills/omnistudio-dependencies-analyze/references/dependency-patterns.md +508 -0
- package/skills/omnistudio-dependencies-analyze/references/namespace-guide.md +300 -0
- package/skills/omnistudio-epc-catalog-generate/CREDITS.md +14 -0
- package/skills/omnistudio-epc-catalog-generate/README.md +89 -0
- package/skills/omnistudio-epc-catalog-generate/SKILL.md +394 -0
- package/skills/omnistudio-epc-catalog-generate/assets/attribute-assignment-template.json +402 -0
- package/skills/omnistudio-epc-catalog-generate/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/omnistudio-epc-catalog-generate/assets/completion-block-template.txt +8 -0
- package/skills/omnistudio-epc-catalog-generate/assets/decomposition-relationships-template.json +233 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/omnistudio-epc-catalog-generate/assets/object-field-attributes-template.json +138 -0
- package/skills/omnistudio-epc-catalog-generate/assets/orchestration-scenarios-template.json +54 -0
- package/skills/omnistudio-epc-catalog-generate/assets/override-definitions-template.json +134 -0
- package/skills/omnistudio-epc-catalog-generate/assets/parent-keys-template.json +29 -0
- package/skills/omnistudio-epc-catalog-generate/assets/price-list-entries-template.json +158 -0
- package/skills/omnistudio-epc-catalog-generate/assets/pricebook-entries-template.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/assets/product-child-item-template.json +338 -0
- package/skills/omnistudio-epc-catalog-generate/assets/product2-offer-template.json +527 -0
- package/skills/omnistudio-epc-catalog-generate/examples/.gitkeep +1 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/omnistudio-epc-catalog-generate/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/omnistudio-epc-catalog-generate/references/epc-field-guide.md +90 -0
- package/skills/omnistudio-epc-catalog-generate/references/naming-conventions.md +80 -0
- package/skills/omnistudio-epc-catalog-generate/references/scoring-model.md +57 -0
- package/skills/omnistudio-epc-catalog-generate/scripts/cli-validation-commands.sh +19 -0
- package/skills/omnistudio-epc-catalog-generate/scripts/sample-invocations.sh +18 -0
- package/skills/omnistudio-flexcard-generate/CREDITS.md +5 -0
- package/skills/omnistudio-flexcard-generate/SKILL.md +324 -0
- package/skills/omnistudio-flexcard-generate/assets/omni-ui-card.json +10 -0
- package/skills/omnistudio-flexcard-generate/references/best-practices.md +291 -0
- package/skills/omnistudio-flexcard-generate/references/data-binding-guide.md +311 -0
- package/skills/omnistudio-flexcard-generate/references/scoring-rubric.md +66 -0
- package/skills/omnistudio-flexcard-generate/scripts/flexcard-commands.sh +24 -0
- package/skills/omnistudio-integration-procedure-generate/CREDITS.md +5 -0
- package/skills/omnistudio-integration-procedure-generate/SKILL.md +274 -0
- package/skills/omnistudio-integration-procedure-generate/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/omnistudio-integration-procedure-generate/assets/omni-process-element-set-values.json +10 -0
- package/skills/omnistudio-integration-procedure-generate/assets/omni-process-ip.json +12 -0
- package/skills/omnistudio-integration-procedure-generate/assets/scoring-report-format.txt +14 -0
- package/skills/omnistudio-integration-procedure-generate/references/best-practices.md +388 -0
- package/skills/omnistudio-integration-procedure-generate/references/element-types.md +588 -0
- package/skills/omnistudio-integration-procedure-generate/scripts/cli-commands.sh +18 -0
- package/skills/omnistudio-omniscript-generate/CREDITS.md +5 -0
- package/skills/omnistudio-omniscript-generate/SKILL.md +366 -0
- package/skills/omnistudio-omniscript-generate/assets/omni-process-element-step.json +10 -0
- package/skills/omnistudio-omniscript-generate/assets/omni-process-element-text-block.json +11 -0
- package/skills/omnistudio-omniscript-generate/assets/omni-process-omniscript.json +12 -0
- package/skills/omnistudio-omniscript-generate/references/best-practices.md +480 -0
- package/skills/omnistudio-omniscript-generate/references/element-types.md +1172 -0
- package/skills/omnistudio-omniscript-generate/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/omnistudio-omniscript-generate/scripts/cli-reference.sh +21 -0
- package/skills/omnistudio-omniscript-generate/scripts/deploy-omniscript.sh +29 -0
- package/skills/platform-agentexchange-partner-offers-configure/SKILL.md +111 -0
- package/skills/platform-agentexchange-partner-offers-configure/assets/org-pref-template.md +27 -0
- package/skills/platform-agentexchange-partner-offers-configure/examples/org-preference-settings.xml +4 -0
- package/skills/platform-apex-generate/CREDITS.md +5 -0
- package/skills/platform-apex-generate/SKILL.md +409 -0
- package/skills/platform-apex-generate/assets/abstract.cls +131 -0
- package/skills/platform-apex-generate/assets/batch.cls +124 -0
- package/skills/platform-apex-generate/assets/domain.cls +101 -0
- package/skills/platform-apex-generate/assets/dto.cls +107 -0
- package/skills/platform-apex-generate/assets/exception.cls +50 -0
- package/skills/platform-apex-generate/assets/interface.cls +24 -0
- package/skills/platform-apex-generate/assets/invocable.cls +114 -0
- package/skills/platform-apex-generate/assets/queueable.cls +91 -0
- package/skills/platform-apex-generate/assets/rest-resource.cls +300 -0
- package/skills/platform-apex-generate/assets/schedulable.cls +74 -0
- package/skills/platform-apex-generate/assets/selector.cls +91 -0
- package/skills/platform-apex-generate/assets/service.cls +68 -0
- package/skills/platform-apex-generate/assets/trigger.cls +45 -0
- package/skills/platform-apex-generate/assets/utility.cls +96 -0
- package/skills/platform-apex-generate/references/AccountDeduplicationBatch.cls +147 -0
- package/skills/platform-apex-generate/references/AccountSelector.cls +192 -0
- package/skills/platform-apex-generate/references/AccountService.cls +200 -0
- package/skills/platform-apex-logs-debug/CREDITS.md +22 -0
- package/skills/platform-apex-logs-debug/README.md +74 -0
- package/skills/platform-apex-logs-debug/SKILL.md +171 -0
- package/skills/platform-apex-logs-debug/assets/benchmarking-template.cls +327 -0
- package/skills/platform-apex-logs-debug/assets/cpu-heap-optimization.cls +307 -0
- package/skills/platform-apex-logs-debug/assets/dml-in-loop-fix.cls +219 -0
- package/skills/platform-apex-logs-debug/assets/null-pointer-fix.cls +252 -0
- package/skills/platform-apex-logs-debug/assets/soql-in-loop-fix.cls +157 -0
- package/skills/platform-apex-logs-debug/references/analysis-playbook.md +53 -0
- package/skills/platform-apex-logs-debug/references/benchmarking-guide.md +287 -0
- package/skills/platform-apex-logs-debug/references/cli-commands.md +368 -0
- package/skills/platform-apex-logs-debug/references/common-issues.md +68 -0
- package/skills/platform-apex-logs-debug/references/debug-log-reference.md +328 -0
- package/skills/platform-apex-logs-debug/references/log-analysis-tools.md +248 -0
- package/skills/platform-apex-logs-debug/references/scoring-rubric.md +21 -0
- package/skills/platform-apex-test-generate/CREDITS.md +5 -0
- package/skills/platform-apex-test-generate/SKILL.md +201 -0
- package/skills/platform-apex-test-generate/assets/test-class-template.cls +93 -0
- package/skills/platform-apex-test-generate/assets/test-data-factory-template.cls +111 -0
- package/skills/platform-apex-test-generate/references/assertion-patterns.md +108 -0
- package/skills/platform-apex-test-generate/references/async-testing.md +193 -0
- package/skills/platform-apex-test-generate/references/mocking-patterns.md +220 -0
- package/skills/platform-apex-test-generate/references/test-data-factory.md +75 -0
- package/skills/platform-apex-test-run/CREDITS.md +22 -0
- package/skills/platform-apex-test-run/README.md +94 -0
- package/skills/platform-apex-test-run/SKILL.md +157 -0
- package/skills/platform-apex-test-run/assets/basic-test.cls +169 -0
- package/skills/platform-apex-test-run/assets/bulk-test.cls +255 -0
- package/skills/platform-apex-test-run/assets/dml-mock.cls +339 -0
- package/skills/platform-apex-test-run/assets/mock-callout-test.cls +353 -0
- package/skills/platform-apex-test-run/assets/stub-provider-example.cls +364 -0
- package/skills/platform-apex-test-run/assets/test-data-factory.cls +328 -0
- package/skills/platform-apex-test-run/hooks/scripts/parse-test-results.py +364 -0
- package/skills/platform-apex-test-run/references/cli-commands.md +289 -0
- package/skills/platform-apex-test-run/references/mocking-patterns.md +500 -0
- package/skills/platform-apex-test-run/references/performance-optimization.md +283 -0
- package/skills/platform-apex-test-run/references/test-fix-loop.md +49 -0
- package/skills/platform-apex-test-run/references/test-patterns.md +154 -0
- package/skills/platform-apex-test-run/references/testing-best-practices.md +509 -0
- package/skills/platform-custom-application-generate/SKILL.md +211 -0
- package/skills/platform-custom-field-generate/SKILL.md +503 -0
- package/skills/platform-custom-lightning-type-generate/SKILL.md +180 -0
- package/skills/platform-custom-lightning-type-generate/assets/primitive-types-and-constraints.md +41 -0
- package/skills/platform-custom-lightning-type-generate/references/widget-rendition.md +124 -0
- package/skills/platform-custom-object-generate/SKILL.md +240 -0
- package/skills/platform-custom-tab-generate/SKILL.md +156 -0
- package/skills/platform-data-manage/CREDITS.md +5 -0
- package/skills/platform-data-manage/README.md +112 -0
- package/skills/platform-data-manage/SKILL.md +234 -0
- package/skills/platform-data-manage/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/platform-data-manage/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/platform-data-manage/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/platform-data-manage/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/platform-data-manage/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/platform-data-manage/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/platform-data-manage/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/platform-data-manage/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/platform-data-manage/assets/csv/account-import.csv +11 -0
- package/skills/platform-data-manage/assets/csv/contact-import.csv +11 -0
- package/skills/platform-data-manage/assets/csv/custom-object-import.csv +11 -0
- package/skills/platform-data-manage/assets/csv/opportunity-import.csv +11 -0
- package/skills/platform-data-manage/assets/factories/account-factory.apex +165 -0
- package/skills/platform-data-manage/assets/factories/case-factory.apex +237 -0
- package/skills/platform-data-manage/assets/factories/contact-factory.apex +168 -0
- package/skills/platform-data-manage/assets/factories/custom-object-factory.apex +260 -0
- package/skills/platform-data-manage/assets/factories/event-factory.apex +275 -0
- package/skills/platform-data-manage/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/platform-data-manage/assets/factories/lead-factory.apex +190 -0
- package/skills/platform-data-manage/assets/factories/opportunity-factory.apex +206 -0
- package/skills/platform-data-manage/assets/factories/task-factory.apex +246 -0
- package/skills/platform-data-manage/assets/factories/user-factory.apex +278 -0
- package/skills/platform-data-manage/assets/json/account-contact-tree.json +130 -0
- package/skills/platform-data-manage/assets/json/account-opportunity-tree.json +110 -0
- package/skills/platform-data-manage/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/platform-data-manage/assets/soql/aggregate.soql +226 -0
- package/skills/platform-data-manage/assets/soql/child-to-parent.soql +162 -0
- package/skills/platform-data-manage/assets/soql/parent-to-child.soql +153 -0
- package/skills/platform-data-manage/assets/soql/polymorphic.soql +198 -0
- package/skills/platform-data-manage/assets/soql/subquery.soql +287 -0
- package/skills/platform-data-manage/references/anonymous-apex-guide.md +98 -0
- package/skills/platform-data-manage/references/bulk-operations-guide.md +94 -0
- package/skills/platform-data-manage/references/bulk-testing-example.md +194 -0
- package/skills/platform-data-manage/references/cleanup-rollback-example.md +322 -0
- package/skills/platform-data-manage/references/cleanup-rollback-guide.md +84 -0
- package/skills/platform-data-manage/references/crud-workflow-example.md +183 -0
- package/skills/platform-data-manage/references/governor-limits-reference.md +74 -0
- package/skills/platform-data-manage/references/orchestration.md +174 -0
- package/skills/platform-data-manage/references/relationship-query-examples.md +249 -0
- package/skills/platform-data-manage/references/sf-cli-data-commands.md +158 -0
- package/skills/platform-data-manage/references/soql-relationship-guide.md +84 -0
- package/skills/platform-data-manage/references/test-data-best-practices.md +104 -0
- package/skills/platform-data-manage/references/test-data-factory-usage.md +290 -0
- package/skills/platform-data-manage/references/test-data-patterns.md +98 -0
- package/skills/platform-data-manage/scripts/soql_validator.py +292 -0
- package/skills/platform-data-manage/scripts/validate_data_operation.py +379 -0
- package/skills/platform-docs-get/README.md +66 -0
- package/skills/platform-docs-get/SKILL.md +208 -0
- package/skills/platform-docs-get/requirements.txt +2 -0
- package/skills/platform-docs-get/scripts/extract_help_salesforce.py +497 -0
- package/skills/platform-docs-get/scripts/extract_salesforce_doc.py +357 -0
- package/skills/platform-docs-get/scripts/runtime_bootstrap.py +58 -0
- package/skills/platform-flexipage-generate/SKILL.md +522 -0
- package/skills/platform-lightning-app-coordinate/SKILL.md +423 -0
- package/skills/platform-list-view-generate/SKILL.md +218 -0
- package/skills/platform-metadata-api-context-get/README.md +79 -0
- package/skills/platform-metadata-api-context-get/SKILL.md +466 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AIApplication.json +37 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AIApplicationConfig.json +53 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AIReplyRecommendationsSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AIScoringModelDefinition.json +87 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AIUsecaseDefinition.json +215 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountInsightsSettings.json +30 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountIntelligenceSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountPlanObjMeasCalcDef.json +86 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountPlanSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountRelationshipShareRule.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountSettings.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountingFieldMapping.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountingModelConfig.json +94 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AccountingSettings.json +53 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActionLinkGroupTemplate.json +118 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActionOverride.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActionPlanTemplate.json +166 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActionableListDefinition.json +114 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActionsSettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActivationPlatform.json +95 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActivationPlatformActvAttr.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActivationPlatformField.json +55 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActivitiesSettings.json +136 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActvPfrmDataConnectorS3.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActvPlatformAdncIdentifier.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ActvPlatformFieldValue.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AddressSettings.json +90 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AdvAccountForecastSet.json +261 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AffinityScoreDefinition.json +74 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AgentPlatformSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AgentforceForDevelopersSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AiAuthoringBundle.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AiEvaluationDefinition.json +153 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AiPluginUtteranceDef.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AllOrNoneHeader.json +17 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnalyticSnapshot.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnalyticsDashboard.json +369 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnalyticsSettings.json +488 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnalyticsVisualization.json +180 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnalyticsWorkspace.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AnimationRule.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexClass.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexComponent.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexEmailNotifications.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexPage.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexSettings.json +96 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexTestSuite.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApexTrigger.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppAnalyticsSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppExperienceSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppFrameworkTemplateBundle.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppMenu.json +10 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppointmentAssignmentPolicy.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AppointmentSchedulingPolicy.json +102 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ApprovalProcess.json +234 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ArticleType.json +81 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ArticleType_CustomField.json +88 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ArticleType_Layout.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AssessmentQuestion.json +117 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AssessmentQuestionSet.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AssignmentRules.json +87 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AssociationEngineSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AsyncResult.json +89 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Audience.json +172 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AuraDefinitionBundle.json +94 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AuthProvider.json +169 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AutoResponseRules.json +79 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/AutomatedContactsSettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BaseSharingRule.json +24 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BatchCalcJobDefinition.json +849 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BatchProcessJobDefinition.json +175 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BillingSettings.json +152 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BlacklistedConsumer.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Bot.json +197 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BotBlock.json +86 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BotSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BotTemplate.json +96 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BotVersion.json +667 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BranchManagementSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BrandingSet.json +146 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BriefcaseDefinition.json +127 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BusinessHoursSettings.json +175 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BusinessProcess.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/BusinessProcessGroup.json +91 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CMSConnectSource.json +197 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CallCenter.json +124 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CallCenterRoutingMap.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CallCoachingMediaProvider.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CallOptions.json +17 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CampaignInfluenceModel.json +59 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CampaignSettings.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CancelDeployResult.json +10 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CareBenefitVerifySettings.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CareLimitType.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CareProviderSearchConfig.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CareRequestConfiguration.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CareSystemFieldMapping.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CaseSettings.json +423 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CaseSubjectParticle.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CatalogedApi.json +97 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CatalogedApiArtifactVersionInfo.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CatalogedApiVersion.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Certificate.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChannelLayout.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChatterAnswersSettings.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChatterEmailsMDSettings.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChatterExtension.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChatterSettings.json +92 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ChoiceList.json +66 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ClaimFinancialSettings.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ClauseCatgConfiguration.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CleanDataService.json +166 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CodeBuilderSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CollectionsDashboardSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CommerceSettings.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CommunitiesSettings.json +116 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Community.json +121 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CommunityTemplateDefinition.json +116 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CommunityThemeDefinition.json +146 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CompactLayout.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CompanySettings.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConnectedApp.json +384 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConnectedAppSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ContentAsset.json +121 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ContentSettings.json +116 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ContentTypeBundle.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ContextDefinition.json +340 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ContractSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConvIntelligenceSignalRule.json +106 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConversationChannelDefinition.json +140 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConversationMessageDefinition.json +380 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConversationMessageDefinitionTranslation.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConversationVendorInfo.json +148 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ConversationalIntelligenceSettings.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CorsWhitelistOrigin.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CriteriaBasedSharingRule.json +206 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CspTrustedSite.json +82 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CurrencySettings.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomAddressFieldSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomApplication.json +453 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomApplicationComponent.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomFeedFilter.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomField.json +392 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomFieldDisplay.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomHelpMenuSection.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomIndex.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomLabels.json +69 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomMetadata.json +90 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomNotificationType.json +94 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomObject.json +313 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomObjectTranslation.json +319 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomPageWebLink.json +121 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomPermission.json +65 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomSite.json +288 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomTab.json +97 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomValue.json +85 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/CustomerDataPlatformSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Dashboard.json +584 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataCategoryGroup.json +81 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataConnector.json +230 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataConnectorIngestApi.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataConnectorS3.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataDotComSettings.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataImportManagementSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataKitObjectDependency.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataKitObjectTemplate.json +59 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataObjectBuildOrgTemplate.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataObjectSearchIndexConf.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataPackageKitDefinition.json +74 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataPackageKitObject.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSource.json +29 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSourceBundleDefinition.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSourceField.json +115 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSourceObject.json +93 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSourceTenant.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataSrcDataModelFieldMap.json +69 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataStreamDefinition.json +105 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataStreamTemplate.json +99 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DataWeaveResource.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DebuggingHeader.json +20 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DecisionMatrixDefinition.json +140 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DecisionTable.json +211 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DecisionTableDatasetLink.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DelegateGroup.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DeleteResult.json +22 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DeployResult.json +253 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DeploymentSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DescribeMetadataResult.json +31 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DescribeValueTypeResult.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DevHubSettings.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DgtAssetMgmtProvider.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DgtAssetMgmtPrvdLghtCpnt.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DigitalExperienceBundle.json +102 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DigitalExperienceBundle_Marketing_Workspace_Bundle_and_Folders.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DigitalExperienceBundle_Site_Workspace_Bundle_and_Folders.json +541 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DigitalExperienceConfig.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DisclosureDefinition.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DisclosureDefinitionVersion.json +78 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DisclosureType.json +53 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DiscoveryAIModel.json +263 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DiscoveryGoal.json +361 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DiscoveryStory.json +98 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Document.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DocumentCategory.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DocumentCategoryDocumentType.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DocumentChecklistSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DocumentGenerationSetting.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DocumentType.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DuplicateRule.json +160 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/DynamicFormsSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EACSettings.json +112 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EclairGeoData.json +73 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EinsteinAISettings.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EinsteinAgentSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EinsteinGptSettings.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailAdministrationSettings.json +104 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailAuthorizationSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailIntegrationSettings.json +92 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailServicesFunction.json +116 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailTemplate.json +116 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmailTemplateSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceBranding.json +78 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceConfig.json +318 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceFieldService.json +73 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceFlowConfig.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceLiveAgent.json +141 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmbeddedServiceMenuSettings.json +165 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EmployeeUserSettings.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EnablementMeasureDefinition.json +139 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EnablementProgramDefinition.json +241 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EnblProgramTaskSubCategory.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EncryptionKeySettings.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EnhancedNotesSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EntitlementProcess.json +147 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EntitlementSettings.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EntitlementTemplate.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Error.json +25 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EscalationRules.json +117 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EventDelivery.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EventRelayConfig.json +55 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EventSettings.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/EventSubscription.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExperienceBundle.json +387 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExperienceBundleSettings.json +25 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExperiencePropertyTypeBundle.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExplainabilityMsgTemplate.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExpressionSetDefinition.json +496 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExpressionSetMessageToken.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExpressionSetObjectAlias.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalAIModel.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalAuthIdentityProvider.json +79 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalClientAppSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalClientApplication.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalCredential.json +94 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalDataConnector.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalDataSource.json +162 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalDataTranObject.json +191 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalDataTransportFieldTemplate.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalDataTransportObjectTemplate.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalServiceRegistration.json +121 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExternalServicesSettings.json +34 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppCanvasSettings.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppConfigurablePolicies.json +75 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppGlobalOauthSettings.json +135 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppMobileConfigurablePolicies.json +34 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppMobileSettings.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppNotificationSettings.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppOauthConfigurablePolicies.json +153 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppOauthSettings.json +120 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppPushConfigurablePolicies.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppPushSettings.json +93 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ExtlClntAppSamlConfigurablePolicies.json +119 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FeatureParameterBoolean.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FeatureParameterDate.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FeatureParameterInteger.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FieldMappingConfig.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FieldRestrictionRule.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FieldServiceSettings.json +226 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FieldSet.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FieldSrcTrgtRelationship.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FileUploadAndDownloadSecuritySettings.json +53 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FilesConnectSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlexiPage.json +355 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Flow.json +2377 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlowCategory.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlowDefinition.json +37 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlowSettings.json +124 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlowTest.json +205 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FlowValueMap.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Folder.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FolderShare.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingFilter.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingFilterCondition.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingObjectListSettings.json +77 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingSettings.json +303 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingSourceDefinition.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingType.json +100 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ForecastingTypeSource.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FuelType.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FuelTypeSustnUom.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FunctionReference.json +31 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/FundraisingConfig.json +86 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GatewayProviderPaymentMethodType.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiFunction.json +171 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPlanner.json +215 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPlannerBundle.json +220 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPlugin.json +87 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPluginInstructionDef.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPromptTemplate.json +183 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GenAiPromptTemplateActv.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GiftEntryGridTemplate.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GlobalPicklist.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GlobalPicklistValue.json +81 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GlobalValueSet.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GlobalValueSetTranslation.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/GoogleAppsSettings.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Group.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/HighVelocitySalesSettings.json +96 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/HistoryRetentionPolicy.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/HomePageComponent.json +66 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/HomePageLayout.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IPAddressRange.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IdeasSettings.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IdentityProviderSettings.json +39 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IdentityVerificationProcDef.json +173 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IdentityVerificationProcDtl.json +136 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IdentityVerificationProcFld.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IframeWhiteListUrlSettings.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InboundCertificate.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InboundNetworkConnection.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IncidentMgmtSettings.json +140 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Index.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesEinsteinFeatureSettings.json +34 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesLoyaltySettings.json +108 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesPricingSettings.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesRatingSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesSettings.json +731 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IndustriesUnifiedInventorySettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InsPlcyLimitConsumptionRule.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InstalledPackage.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IntegArtifactDef.json +10 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/IntegrationProviderDef.json +155 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InterestTaggingSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InternalDataConnector.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InvLatePymntRiskCalcSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InventorySettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InvocableActionExtension.json +84 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/InvocableActionSettings.json +28 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/KeywordList.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/KnowledgeSettings.json +280 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LanguageSettings.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Layout.json +659 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LeadConfigSettings.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LeadConvertSettings.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LearningItemType.json +65 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Letterhead.json +119 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningBolt.json +103 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningComponentBundle.json +109 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningExperienceSettings.json +191 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningExperienceTheme.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningMessageChannel.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningOnboardingConfig.json +62 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LightningTypeBundle.json +88 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ListMetadataQuery.json +10 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ListView.json +86 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveAgentSettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveChatAgentConfig.json +188 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveChatButton.json +188 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveChatDeployment.json +81 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveChatSensitiveDataRule.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LiveMessageSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/LoyaltyProgramSetup.json +297 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MLDataDefinition.json +146 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MLPredictionDefinition.json +67 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MacroSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MailMergeSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ManagedContentType.json +86 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ManagedEventSubscription.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ManagedTopics.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MapAndLocationSettings.json +34 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MarketSegmentDefinition.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MarketingAppExtension.json +139 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MatchingRule.json +69 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MeetingsSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MessagingChannel.json +278 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MetadataWithContent.json +24 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Metadata_Type_Limits.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MfgProgramTemplate.json +88 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MfgServiceConsoleSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MilestoneType.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MktCalcInsightObjectDef.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MktDataTranObject.json +99 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MlDomain.json +136 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MobSecurityCertPinConfig.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MobileApplicationDetail.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MobileSecurityAssignment.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MobileSecurityPolicy.json +75 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MobileSettings.json +121 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ModerationRule.json +99 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MutingPermissionSet.json +33 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MyDomainDiscoverableLogin.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/MyDomainSettings.json +140 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NameSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NamedCredential.json +205 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NamedFilter.json +89 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NavigationMenu.json +101 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Network.json +606 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NetworkBranding.json +117 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NotificationTypeConfig.json +75 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/NotificationsSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OauthCustomScope.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OauthOidcSettings.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OauthTokenExchangeHandler.json +119 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ObjectHierarchyRelationship.json +108 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ObjectLinkingSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ObjectSourceTargetMap.json +85 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OcrSampleDocument.json +158 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OcrTemplate.json +180 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniChannelSettings.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniExtTrackingDef.json +66 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniInteractionAccessConfig.json +90 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniInteractionConfig.json +37 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniScript.json +204 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniSupervisorConfig.json +156 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OmniTrackingGroup.json +77 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OnboardingDataObjectGroup.json +131 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OpportunityInsightsSettings.json +30 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OpportunityScoreSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OpportunitySettings.json +132 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OrchestrationPlanCtxMapping.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OrderManagementSettings.json +52 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OrderSettings.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OrgPreferenceSettings.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OrgSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OutboundNetworkConnection.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/OwnerSharingRule.json +206 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Package.json +19 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PardotEinsteinSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PardotSettings.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ParticipantRole.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PartyDataModelSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PathAssistant.json +74 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PathAssistantSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PaymentGatewayProvider.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PaymentsSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PermissionSet.json +372 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PermissionSetGroup.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PermissionSetLicenseDefinition.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PersonAccountOwnerPowerUser.json +38 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Picklist.json +43 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PicklistSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PipelineInspMetricConfig.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformCachePartition.json +79 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEncryptionSettings.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEventChannel.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEventChannelMember.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEventMigration.json +39 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEventSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PlatformEventSubscriberConfig.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Portal.json +137 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PortalDelegablePermissionSet.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PostTemplate.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PredictionBuilderSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PresenceDeclineReason.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PresenceUserConfig.json +122 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PricingActionParameters.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PricingRecipe.json +117 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PrivacySettings.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProcessFlowMigration.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProductAttributeSet.json +33 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProductSettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Profile.json +492 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProfileActionOverride.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProfilePasswordPolicy.json +80 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProfileSearchLayouts.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ProfileSessionSetting.json +55 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Prompt.json +255 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PublicKeyCertificate.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/PublicKeyCertificateSet.json +65 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Queue.json +123 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/QueueRoutingConfig.json +96 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/QuickAction.json +175 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/QuoteSettings.json +36 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ReadResult.json +16 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RealTimeEventSettings.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecommendationStrategy.json +327 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecordActionDeployment.json +184 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecordAggregationDefinition.json +148 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecordAlertCategory.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecordPageSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RecordType.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RedirectWhitelistUrl.json +26 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ReferencedDashboard.json +55 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RegisteredExternalService.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RelatedRecordAssocCriteria.json +75 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RelationshipGraphDefinition.json +63 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RemoteSiteSetting.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Report.json +715 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ReportType.json +118 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RestrictionRule.json +71 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RetailExecutionSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RetrievalSummaryDefinition.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RetrieveRequest.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RetrieveResult.json +103 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Role.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/RoleOrTerritory.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SalesAgreementSettings.json +180 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SalesWorkQueueSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SamlSsoConfig.json +128 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SandboxSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SaveResult.json +22 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SchedulingObjective.json +66 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SchedulingRule.json +66 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SchemaSettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Scontrol.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SearchCustomization.json +120 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SearchLayouts.json +64 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SearchOrgWideObjectConfig.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SearchSettings.json +155 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SecuritySettings.json +437 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceAISetupDefinition.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceAISetupField.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceChannel.json +123 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceCloudVoiceSettings.json +83 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServicePresenceStatus.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceProcess.json +141 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ServiceSetupAssistantSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SessionHeader.json +17 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharedTo.json +105 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingBaseRule.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingReason.json +34 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingRecalculation.json +29 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingRules.json +186 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingSet.json +78 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SharingSettings.json +92 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SiteDotCom.json +37 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SiteSettings.json +60 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Skill.json +69 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SocialCustomerServiceSettings.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SocialProfileSettings.json +35 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SourceTrackingSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StageAssignment.json +113 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StageDefinition.json +237 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StandardValueSet.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StandardValueSetTranslation.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StaticResource.json +49 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/StreamingAppDataConnector.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SubscriptionManagementSettings.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SurveySettings.json +44 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SustainabilityUom.json +61 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SustnUomConversion.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SvcCatalogCategory.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SvcCatalogFulfillmentFlow.json +99 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SvcCatalogItemDef.json +202 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/SynonymDictionary.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Tag.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TagSet.json +47 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory.json +39 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory2.json +112 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory2Model.json +41 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory2Rule.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory2Settings.json +111 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Territory2Type.json +42 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TimeSheetTemplate.json +75 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TimelineObjectDefinition.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TopicsForObjects.json +38 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TrailheadSettings.json +40 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TransactionSecurityPolicy.json +127 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Translations.json +976 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/TrialOrgSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UIBundle.json +54 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UIObjectRelationConfig.json +101 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UiFormatSpecificationSet.json +103 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UiPreviewMessageTabDef.json +70 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UpsertResult.json +25 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserAccessPolicy.json +120 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserAuthCertificate.json +57 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserCriteria.json +48 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserEngagementSettings.json +136 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserInterfaceSettings.json +96 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserManagementSettings.json +108 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserProfileSearchScope.json +8 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/UserProvisioningConfig.json +72 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/ValidationRule.json +51 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/VirtualVisitConfig.json +97 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/VoiceSettings.json +68 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WarrantyLifeCycleMgmtSettings.json +32 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveAnalyticAssetCollection.json +73 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveApplication.json +56 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveComponent.json +46 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveDashboard.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveDataflow.json +45 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveDataset.json +50 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveLens.json +59 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveRecipe.json +58 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveTemplateBundle.json +37 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WaveXmd.json +567 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WebLink.json +117 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WebStoreBundle.json +10 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WebStoreTemplate.json +166 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WorkDotComSettings.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WorkSkillRouting.json +76 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/Workflow.json +415 -0
- package/skills/platform-metadata-api-context-get/data/metadata_api/WorkforceEngagementSettings.json +56 -0
- package/skills/platform-metadata-api-context-get/examples/README.md +169 -0
- package/skills/platform-metadata-api-context-get/examples/bash_section_loading.sh +142 -0
- package/skills/platform-metadata-api-context-get/examples/javascript_section_loading.js +162 -0
- package/skills/platform-metadata-api-context-get/examples/python_section_loading.py +112 -0
- package/skills/platform-metadata-api-context-get/references/metadata_index_table.md +654 -0
- package/skills/platform-metadata-api-context-get/references/usage_guide.md +420 -0
- package/skills/platform-metadata-deploy/CREDITS.md +25 -0
- package/skills/platform-metadata-deploy/README.md +104 -0
- package/skills/platform-metadata-deploy/SKILL.md +213 -0
- package/skills/platform-metadata-deploy/assets/destructiveChanges.xml +143 -0
- package/skills/platform-metadata-deploy/assets/package.xml +121 -0
- package/skills/platform-metadata-deploy/references/agent-deployment-guide.md +628 -0
- package/skills/platform-metadata-deploy/references/deploy.sh +73 -0
- package/skills/platform-metadata-deploy/references/deployment-report-template.md +89 -0
- package/skills/platform-metadata-deploy/references/deployment-workflows.md +395 -0
- package/skills/platform-metadata-deploy/references/orchestration.md +183 -0
- package/skills/platform-metadata-deploy/references/trigger-deployment-safety.md +376 -0
- package/skills/platform-permission-set-generate/SKILL.md +189 -0
- package/skills/platform-soql-query/CREDITS.md +21 -0
- package/skills/platform-soql-query/README.md +41 -0
- package/skills/platform-soql-query/SKILL.md +142 -0
- package/skills/platform-soql-query/assets/aggregate-queries.soql +242 -0
- package/skills/platform-soql-query/assets/basic-queries.soql +188 -0
- package/skills/platform-soql-query/assets/bulkified-query-pattern.cls +280 -0
- package/skills/platform-soql-query/assets/optimization-patterns.soql +259 -0
- package/skills/platform-soql-query/assets/relationship-queries.soql +203 -0
- package/skills/platform-soql-query/assets/selector-class.cls +219 -0
- package/skills/platform-soql-query/references/anti-patterns.md +348 -0
- package/skills/platform-soql-query/references/cli-commands.md +358 -0
- package/skills/platform-soql-query/references/field-coverage-rules.md +514 -0
- package/skills/platform-soql-query/references/query-optimization.md +142 -0
- package/skills/platform-soql-query/references/selector-patterns.md +479 -0
- package/skills/platform-soql-query/references/soql-reference.md +227 -0
- package/skills/platform-soql-query/references/soql-syntax-reference.md +208 -0
- package/skills/platform-soql-query/scripts/post-tool-validate.py +322 -0
- package/skills/platform-trust-archive-manage/SKILL.md +121 -0
- package/skills/platform-trust-archive-manage/examples/monitor-failed-jobs.md +47 -0
- package/skills/platform-trust-archive-manage/references/archive-activity-entity.md +59 -0
- package/skills/platform-trust-archive-manage/references/connect-api-operations.md +157 -0
- package/skills/platform-validation-rule-generate/SKILL.md +74 -0
- package/skills/recommending-devops-tests/SKILL.md +1 -1
- package/skills/running-devops-test-suite/SKILL.md +1 -1
- package/skills/activating-datacloud/CREDITS.md +0 -5
|
@@ -0,0 +1,2835 @@
|
|
|
1
|
+
"""Phase 2 Batch 1: pipeline orchestrator for investigating-agentforce-architecture.
|
|
2
|
+
|
|
3
|
+
Composes Phase 1 primitives (config, rest_client, sf_cli, soql_loader,
|
|
4
|
+
probe_channels, fetch_soql, parallel_retrieve, parse_wave, finalize) into
|
|
5
|
+
the 13-phase flow defined in the plan.
|
|
6
|
+
|
|
7
|
+
NOT a credential holder. Credentials live in a single mutable cell
|
|
8
|
+
(`_creds_cell`) that both `creds_provider()` and `refresh_fn()` close over.
|
|
9
|
+
Every SOQL call uses `creds_provider` so `retry_on_401`'s refresh path
|
|
10
|
+
can deliver fresh creds into the retry — storing the URL/token
|
|
11
|
+
in function args would defeat the refresh entirely.
|
|
12
|
+
|
|
13
|
+
Phase ordering:
|
|
14
|
+
1 parse args (Bash harness does phases 1-3 today;
|
|
15
|
+
2 resolve creds (sf org display) P2 Batch 1 runs them in-process too)
|
|
16
|
+
3 probe channels
|
|
17
|
+
4 resolve bot + version
|
|
18
|
+
5 cache check
|
|
19
|
+
6 Wave A (7 parallel Tooling queries, DAG-ordered)
|
|
20
|
+
7 join Wave A → _bundle_parsed.json-shaped dict
|
|
21
|
+
8 Wave B (Flow + Apex bodies, parallel)
|
|
22
|
+
9 parse_wave -> declared_action_tree.json
|
|
23
|
+
10 render architecture.md (Batch 2 — stubbed)
|
|
24
|
+
11 finalize (atomic writes + manifest)
|
|
25
|
+
12 emit RESULT
|
|
26
|
+
"""
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import argparse
|
|
30
|
+
import json
|
|
31
|
+
import os
|
|
32
|
+
import sys
|
|
33
|
+
import threading
|
|
34
|
+
import time
|
|
35
|
+
from functools import partial
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
from typing import Callable, Tuple
|
|
38
|
+
|
|
39
|
+
# Phase 2 Batch 1: all cross-module wiring routes through config so a future
|
|
40
|
+
# relocation of DATA_ROOT / CACHE_ROOT only touches one file.
|
|
41
|
+
from config import (
|
|
42
|
+
CACHE_TTL_DAYS,
|
|
43
|
+
DATA_ROOT,
|
|
44
|
+
SCHEMA_VERSION,
|
|
45
|
+
build_agent_cache_dir,
|
|
46
|
+
build_agent_data_dir,
|
|
47
|
+
)
|
|
48
|
+
from rest_client import RestClientError, redact_error
|
|
49
|
+
from sf_cli import AuthRequired, SfCliError, run_sf
|
|
50
|
+
from soql_loader import SoqlParamError
|
|
51
|
+
|
|
52
|
+
# Phase 2 Batch 1 imports — functional pipeline primitives.
|
|
53
|
+
from fetch_soql import (
|
|
54
|
+
fetch_apex_bodies_by_ids,
|
|
55
|
+
fetch_apex_bodies_by_names,
|
|
56
|
+
fetch_bot_definition_details,
|
|
57
|
+
fetch_bot_versions,
|
|
58
|
+
fetch_flow_definition_by_ids,
|
|
59
|
+
fetch_flow_definition_ids_by_names,
|
|
60
|
+
fetch_flow_metadata,
|
|
61
|
+
fetch_functions_by_plugins,
|
|
62
|
+
fetch_planner_attrs,
|
|
63
|
+
fetch_planner_bundle_functions,
|
|
64
|
+
fetch_planner_definition,
|
|
65
|
+
fetch_plugin_functions,
|
|
66
|
+
fetch_plugin_instructions,
|
|
67
|
+
fetch_plugins_by_planner,
|
|
68
|
+
)
|
|
69
|
+
from metadata_listing import (
|
|
70
|
+
list_prompt_template_metadata,
|
|
71
|
+
retrieve_prompt_templates,
|
|
72
|
+
)
|
|
73
|
+
from parallel_retrieve import fetch_bodies_parallel
|
|
74
|
+
from parse_bundle import classify_generation
|
|
75
|
+
from probe_channels import probe_channels
|
|
76
|
+
from resolve_invocation_target import looks_like_sf_id, resolve_or_unresolved
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
# CLI
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
85
|
+
p = argparse.ArgumentParser(prog="architecture")
|
|
86
|
+
p.add_argument("--org-alias", required=True)
|
|
87
|
+
p.add_argument("--agent", required=True, dest="agent_api_name")
|
|
88
|
+
p.add_argument("--version", dest="agent_version")
|
|
89
|
+
p.add_argument("--force", action="store_true", dest="force_refresh")
|
|
90
|
+
# --reprobe forces a fresh channel-probe run on pipeline start.
|
|
91
|
+
p.add_argument("--reprobe", action="store_true")
|
|
92
|
+
p.add_argument("--parallelism", type=int, default=5)
|
|
93
|
+
p.add_argument("--max-mermaid-nodes", type=int, default=80)
|
|
94
|
+
p.add_argument("--work-dir", required=True)
|
|
95
|
+
# Runtime-agnostic path overrides. Defaults are
|
|
96
|
+
# ~/.vibe/{data,cache}/investigating-agentforce-architecture/.
|
|
97
|
+
# Other runtimes (AFV OOTB, Codex, Cursor, OpenCode) pass these to land
|
|
98
|
+
# artifacts under their own distribution layout.
|
|
99
|
+
p.add_argument(
|
|
100
|
+
"--data-dir",
|
|
101
|
+
type=Path,
|
|
102
|
+
default=None,
|
|
103
|
+
help="Override data root (default: ~/.vibe/data/investigating-agentforce-architecture).",
|
|
104
|
+
)
|
|
105
|
+
p.add_argument(
|
|
106
|
+
"--cache-dir",
|
|
107
|
+
type=Path,
|
|
108
|
+
default=None,
|
|
109
|
+
help="Override cache root (default: ~/.vibe/cache/investigating-agentforce-architecture).",
|
|
110
|
+
)
|
|
111
|
+
return p.parse_args(argv)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# ---------------------------------------------------------------------------
|
|
115
|
+
# Three-level rebind for --data-dir / --cache-dir overrides.
|
|
116
|
+
#
|
|
117
|
+
# Python's `from X import Y` snapshots Y into the importer's local namespace.
|
|
118
|
+
# Mutating X.Y later does NOT update the importer's local binding. main.py
|
|
119
|
+
# does `from config import DATA_ROOT, ...` at module top, so without a
|
|
120
|
+
# global rebind, line 2221's `str(DATA_ROOT)` would write the default path
|
|
121
|
+
# even when --data-dir was passed.
|
|
122
|
+
#
|
|
123
|
+
# Levels rebound:
|
|
124
|
+
# 1. paths.DATA_ROOT (the source of truth)
|
|
125
|
+
# 2. config.DATA_ROOT (the re-export)
|
|
126
|
+
# 3. main.DATA_ROOT (THIS module's local snapshot — via global)
|
|
127
|
+
#
|
|
128
|
+
# Plus: config.PROBE_CACHE_ROOT (derived from CACHE_ROOT at import time).
|
|
129
|
+
# ---------------------------------------------------------------------------
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _apply_path_overrides(args: argparse.Namespace) -> None:
|
|
133
|
+
"""Apply --data-dir / --cache-dir overrides across all 3 namespace levels.
|
|
134
|
+
|
|
135
|
+
Must be called BEFORE any pipeline code reads DATA_ROOT or CACHE_ROOT.
|
|
136
|
+
"""
|
|
137
|
+
if not (args.data_dir or args.cache_dir):
|
|
138
|
+
return
|
|
139
|
+
global DATA_ROOT # rebind level 1: this module
|
|
140
|
+
from _shared import runtime, paths
|
|
141
|
+
import config
|
|
142
|
+
|
|
143
|
+
skill_name = "investigating-agentforce-architecture"
|
|
144
|
+
if args.data_dir:
|
|
145
|
+
runtime.set_data_root_override(args.data_dir)
|
|
146
|
+
new_data = runtime.resolve_data_root(skill_name)
|
|
147
|
+
paths.DATA_ROOT = new_data # level 2: paths module
|
|
148
|
+
config.DATA_ROOT = new_data # level 3: config module re-export
|
|
149
|
+
DATA_ROOT = new_data # level 1: main.py local
|
|
150
|
+
if args.cache_dir:
|
|
151
|
+
runtime.set_cache_root_override(args.cache_dir)
|
|
152
|
+
new_cache = runtime.resolve_cache_root(skill_name)
|
|
153
|
+
paths.CACHE_ROOT = new_cache
|
|
154
|
+
config.CACHE_ROOT = new_cache
|
|
155
|
+
config.PROBE_CACHE_ROOT = new_cache / "_channel_probe"
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# ---------------------------------------------------------------------------
|
|
159
|
+
# Phase 2 Batch 1: credentials
|
|
160
|
+
# ---------------------------------------------------------------------------
|
|
161
|
+
# Single mutable cell read by `creds_provider`. `refresh_fn` rewrites the
|
|
162
|
+
# cell. `retry_on_401` in rest_client invokes refresh_fn for side effect;
|
|
163
|
+
# the next invocation of creds_provider picks up the new tuple. See
|
|
164
|
+
# rest_client
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _build_creds_plumbing(
|
|
168
|
+
initial_creds: Tuple[str, str],
|
|
169
|
+
resolve_creds: Callable[[], Tuple[str, str]],
|
|
170
|
+
*,
|
|
171
|
+
dedupe_window_s: float = 1.0,
|
|
172
|
+
) -> Tuple[
|
|
173
|
+
Callable[[], Tuple[str, str]],
|
|
174
|
+
Callable[[], Tuple[str, str]],
|
|
175
|
+
"list[Tuple[str, str]]",
|
|
176
|
+
]:
|
|
177
|
+
"""Build the (creds_provider, refresh_fn, creds_cell) triple.
|
|
178
|
+
|
|
179
|
+
+ `creds_provider` re-reads `creds_cell`
|
|
180
|
+
on every call so a refresh actually lands in the NEXT SOQL attempt.
|
|
181
|
+
`refresh_fn` is serialized by an internal `threading.Lock` + a
|
|
182
|
+
`time.monotonic()` dedupe window — N concurrent 401s against the same
|
|
183
|
+
stale token collapse to ONE `resolve_creds()` spawn per window. That
|
|
184
|
+
caps real `sf org display` spawns at roughly 1/second regardless of
|
|
185
|
+
pool size.
|
|
186
|
+
|
|
187
|
+
Extracted from `main()` so the closure is testable without threading
|
|
188
|
+
a whole pipeline run through argparse + mocks.
|
|
189
|
+
|
|
190
|
+
Returns (creds_provider, refresh_fn, creds_cell). The cell is
|
|
191
|
+
returned so callers/tests can inspect the current tuple directly
|
|
192
|
+
(it's the single source of truth the provider reads from).
|
|
193
|
+
"""
|
|
194
|
+
creds_cell: list[Tuple[str, str]] = [initial_creds]
|
|
195
|
+
lock = threading.Lock()
|
|
196
|
+
last_refresh_mono = [0.0]
|
|
197
|
+
|
|
198
|
+
def creds_provider() -> Tuple[str, str]:
|
|
199
|
+
return creds_cell[0]
|
|
200
|
+
|
|
201
|
+
def refresh_fn() -> Tuple[str, str]:
|
|
202
|
+
with lock:
|
|
203
|
+
now = time.monotonic()
|
|
204
|
+
if now - last_refresh_mono[0] < dedupe_window_s:
|
|
205
|
+
# Another thread refreshed within the dedupe window — reuse.
|
|
206
|
+
return creds_cell[0]
|
|
207
|
+
creds_cell[0] = resolve_creds()
|
|
208
|
+
last_refresh_mono[0] = now
|
|
209
|
+
return creds_cell[0]
|
|
210
|
+
|
|
211
|
+
return creds_provider, refresh_fn, creds_cell
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
_REDACTION_MARKER_FRAGMENT = "show-access-token"
|
|
215
|
+
"""Substring that uniquely identifies the sf CLI v2 redaction placeholder
|
|
216
|
+
(`"[REDACTED] Use 'sf org auth show-access-token' to view"`). We match on
|
|
217
|
+
this fragment rather than the full literal because the upstream wording
|
|
218
|
+
has shifted between sf CLI builds, but the embedded subcommand name has
|
|
219
|
+
been stable since cli#3560 landed."""
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _resolve_creds(org_alias: str) -> Tuple[str, str]:
|
|
223
|
+
"""Resolve (instance_url, access_token) for ``org_alias``.
|
|
224
|
+
|
|
225
|
+
Two-path strategy per forcedotcom/cli#3560 (effective 2026-05-27):
|
|
226
|
+
|
|
227
|
+
1. **Primary** — call ``sf org display`` for instanceUrl, then
|
|
228
|
+
``sf org auth show-access-token`` for the access token. This is
|
|
229
|
+
the upstream long-term path; ``SF_TEMP_SHOW_SECRETS`` is
|
|
230
|
+
decommissioned in summer 2026.
|
|
231
|
+
2. **Fallback** — if the dedicated command isn't shipped in the
|
|
232
|
+
installed sf CLI version (older releases), fall back to the
|
|
233
|
+
legacy ``sf org display --verbose`` with the
|
|
234
|
+
``SF_TEMP_SHOW_SECRETS=true`` env var that ``run_sf`` injects
|
|
235
|
+
unconditionally. The fallback is detected by the redaction
|
|
236
|
+
placeholder appearing in the ``accessToken`` field — exact match
|
|
237
|
+
on the substring ``show-access-token`` (see
|
|
238
|
+
``_REDACTION_MARKER_FRAGMENT``).
|
|
239
|
+
|
|
240
|
+
sf_cli.run_sf already redacts stderr on failure paths. Any
|
|
241
|
+
exception surfaces as `AuthRequired` / `SfCliError`; caller routes
|
|
242
|
+
through `_emit_fail`.
|
|
243
|
+
"""
|
|
244
|
+
display_data = run_sf("org_display", ORG_ALIAS=org_alias)
|
|
245
|
+
display_result = display_data.get("result") or {}
|
|
246
|
+
instance_url = display_result.get("instanceUrl") or ""
|
|
247
|
+
if not instance_url:
|
|
248
|
+
raise AuthRequired(
|
|
249
|
+
"sf org display returned an incomplete payload (missing instanceUrl)"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Primary path: dedicated command. Catches both the unknown-command
|
|
253
|
+
# case (older sf CLI) and any AuthRequired surfaced from the recipe.
|
|
254
|
+
try:
|
|
255
|
+
token_data = run_sf("show_access_token", ORG_ALIAS=org_alias)
|
|
256
|
+
except SfCliError:
|
|
257
|
+
# Older sf CLI versions emit "is not a sf command" on stderr; the
|
|
258
|
+
# recipe surfaces that as SfCliError. Fall back to the
|
|
259
|
+
# SF_TEMP_SHOW_SECRETS path via the org_display payload we
|
|
260
|
+
# already have.
|
|
261
|
+
access_token = display_result.get("accessToken") or ""
|
|
262
|
+
else:
|
|
263
|
+
token_result = token_data.get("result") or {}
|
|
264
|
+
access_token = token_result.get("accessToken") or ""
|
|
265
|
+
|
|
266
|
+
# Defensive fallback: if the dedicated command silently returned an
|
|
267
|
+
# empty token OR sf CLI redacted the org_display token to the
|
|
268
|
+
# placeholder, try the org_display payload directly. SF_TEMP_SHOW_SECRETS
|
|
269
|
+
# is set unconditionally by run_sf so this works as long as the env
|
|
270
|
+
# var is still honoured by the installed sf CLI.
|
|
271
|
+
if not access_token or _REDACTION_MARKER_FRAGMENT in access_token:
|
|
272
|
+
legacy_token = display_result.get("accessToken") or ""
|
|
273
|
+
if legacy_token and _REDACTION_MARKER_FRAGMENT not in legacy_token:
|
|
274
|
+
access_token = legacy_token
|
|
275
|
+
|
|
276
|
+
if not access_token or _REDACTION_MARKER_FRAGMENT in access_token:
|
|
277
|
+
raise AuthRequired(
|
|
278
|
+
"could not retrieve a usable access token via sf org auth "
|
|
279
|
+
"show-access-token (primary) or sf org display (fallback); "
|
|
280
|
+
"ensure sf CLI is logged in for this org and either the "
|
|
281
|
+
"dedicated command is available or SF_TEMP_SHOW_SECRETS is "
|
|
282
|
+
"still honoured."
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
return instance_url, access_token
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def _derive_org_ids(org_alias: str) -> Tuple[str, str, str]:
|
|
289
|
+
"""Run `sf org display --json` once more for org_id_15 + org_id_18 +
|
|
290
|
+
api_version.
|
|
291
|
+
|
|
292
|
+
Reused call: the second `sf org display` is cheap and keeps the
|
|
293
|
+
creds-resolve + org-ids functions uncoupled. When a run passes both
|
|
294
|
+
through together, the overhead is two spawn()s not one — fine given
|
|
295
|
+
the whole pipeline is O(seconds).
|
|
296
|
+
|
|
297
|
+
Returns (org_id_15, org_id_18, api_version) — all strings. api_version
|
|
298
|
+
matches `vNN.N` (validated by probe_channels' path builder downstream).
|
|
299
|
+
|
|
300
|
+
Gap 3 fix (2026-05-05): returns the 18-char id as well so downstream
|
|
301
|
+
emit helpers can populate the RESULT-block `ORG_ID_18` field. The
|
|
302
|
+
18-char value comes straight from `sf org display`; we do NOT compute
|
|
303
|
+
it from the 15-char prefix.
|
|
304
|
+
"""
|
|
305
|
+
data = run_sf("org_display", ORG_ALIAS=org_alias)
|
|
306
|
+
result = data.get("result") or {}
|
|
307
|
+
org_id_18 = result.get("id") or ""
|
|
308
|
+
# SF org id is 18 chars; the 15-char slice is the stable prefix used
|
|
309
|
+
# everywhere in this skill. Fail fast if shorter.
|
|
310
|
+
if len(org_id_18) < 15:
|
|
311
|
+
raise SfCliError(f"sf org display returned malformed id (len={len(org_id_18)})")
|
|
312
|
+
org_id_15 = org_id_18[:15]
|
|
313
|
+
api_version_raw = str(result.get("apiVersion") or "")
|
|
314
|
+
# apiVersion from sf CLI is "60.0" shape; our validator requires "v60.0".
|
|
315
|
+
api_version = api_version_raw if api_version_raw.startswith("v") else f"v{api_version_raw}"
|
|
316
|
+
return org_id_15, org_id_18, api_version
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
# ---------------------------------------------------------------------------
|
|
320
|
+
# Phase 4: bot resolution (in-process; Data API via fetch_soql)
|
|
321
|
+
# ---------------------------------------------------------------------------
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def _resolve_bot(
|
|
325
|
+
agent_api_name: str,
|
|
326
|
+
explicit_version: str | None,
|
|
327
|
+
creds_provider: Callable[[], Tuple[str, str]],
|
|
328
|
+
refresh_fn: Callable[[], Tuple[str, str]],
|
|
329
|
+
*,
|
|
330
|
+
api_version: str,
|
|
331
|
+
) -> dict | None:
|
|
332
|
+
"""Resolve (bot_id, version, master_label, planner_name, bot_def_details).
|
|
333
|
+
|
|
334
|
+
Returns a dict with:
|
|
335
|
+
bot_id, version, master_label, version_auto_picked (bool),
|
|
336
|
+
bot_definition (dict row from BotDefinition details query),
|
|
337
|
+
all_versions (list of {version, status}) — retained for error ctx.
|
|
338
|
+
|
|
339
|
+
Returns None on AGENT_NOT_FOUND. Caller distinguishes by checking the
|
|
340
|
+
absence — not by catching an exception — to keep the error-emit path
|
|
341
|
+
a flat if-chain.
|
|
342
|
+
|
|
343
|
+
`api_version` is threaded in from
|
|
344
|
+
`_derive_org_ids`. The Data-API helpers require it — see
|
|
345
|
+
`rest_client.data_query` for why the old hardcoded `v60.0` was
|
|
346
|
+
wrong (real orgs run v66 and expose fields v60 does not).
|
|
347
|
+
"""
|
|
348
|
+
versions = fetch_bot_versions(
|
|
349
|
+
agent_api_name, creds_provider,
|
|
350
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
351
|
+
)
|
|
352
|
+
if not versions:
|
|
353
|
+
return None
|
|
354
|
+
|
|
355
|
+
# Natural-key sort: v10 > v9 > v2 > v1. Copy the scheme from
|
|
356
|
+
# resolve_bot.py so multi-version bots rank consistently across the
|
|
357
|
+
# in-process + shell-out entry points.
|
|
358
|
+
def _natural_key(v: dict) -> list:
|
|
359
|
+
import re
|
|
360
|
+
dn = v.get("DeveloperName") or ""
|
|
361
|
+
return [int(p) if p.isdigit() else p for p in re.split(r"(\d+)", dn)]
|
|
362
|
+
|
|
363
|
+
versions.sort(key=_natural_key, reverse=True)
|
|
364
|
+
|
|
365
|
+
picked = None
|
|
366
|
+
if explicit_version:
|
|
367
|
+
for v in versions:
|
|
368
|
+
if v.get("DeveloperName") == explicit_version:
|
|
369
|
+
picked = v
|
|
370
|
+
break
|
|
371
|
+
version_auto_picked = False
|
|
372
|
+
else:
|
|
373
|
+
for v in versions:
|
|
374
|
+
if v.get("Status") == "Active":
|
|
375
|
+
picked = v
|
|
376
|
+
break
|
|
377
|
+
version_auto_picked = True
|
|
378
|
+
|
|
379
|
+
if not picked:
|
|
380
|
+
# Signal "version miss" distinctly from "bot miss". Caller emits
|
|
381
|
+
# STATUS=AGENT_VERSION_NOT_FOUND with AVAILABLE_VERSIONS.
|
|
382
|
+
return {
|
|
383
|
+
"bot_id": "",
|
|
384
|
+
"version": explicit_version or "",
|
|
385
|
+
"master_label": "",
|
|
386
|
+
"version_auto_picked": False,
|
|
387
|
+
"all_versions": [
|
|
388
|
+
{
|
|
389
|
+
"version": v.get("DeveloperName") or "",
|
|
390
|
+
"status": v.get("Status") or "",
|
|
391
|
+
}
|
|
392
|
+
for v in versions
|
|
393
|
+
],
|
|
394
|
+
"_version_not_found": True,
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
bot_id = picked.get("BotDefinitionId") or ""
|
|
398
|
+
bd_node = picked.get("BotDefinition") or {}
|
|
399
|
+
master_label = bd_node.get("MasterLabel") or ""
|
|
400
|
+
chosen_version = picked.get("DeveloperName") or ""
|
|
401
|
+
|
|
402
|
+
# Phase 2 Batch 1: pull BotDefinition metadata once for the tree's
|
|
403
|
+
# `agent` block. Non-fatal if the second query fails — tree falls
|
|
404
|
+
# back to defaults.
|
|
405
|
+
try:
|
|
406
|
+
bot_def = fetch_bot_definition_details(
|
|
407
|
+
agent_api_name, creds_provider,
|
|
408
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
409
|
+
)
|
|
410
|
+
except (RestClientError, SoqlParamError):
|
|
411
|
+
bot_def = None
|
|
412
|
+
|
|
413
|
+
# Planner-name resolution moved to Wave A — `fetch_planner_definition`
|
|
414
|
+
# now takes (agent_api_name, chosen_version) and performs a chain-LIKE
|
|
415
|
+
# lookup (`<agent>%\_<vN>`). The canonical planner DeveloperName comes
|
|
416
|
+
# back on the row and propagates downstream via the bundle join.
|
|
417
|
+
return {
|
|
418
|
+
"bot_id": bot_id,
|
|
419
|
+
"version": chosen_version,
|
|
420
|
+
"master_label": master_label,
|
|
421
|
+
"version_auto_picked": version_auto_picked,
|
|
422
|
+
"bot_definition": bot_def or {},
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
# ---------------------------------------------------------------------------
|
|
427
|
+
# Phase 5: cache check
|
|
428
|
+
# ---------------------------------------------------------------------------
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def _cache_is_fresh(cache_dir: Path) -> dict | None:
|
|
432
|
+
"""Return the manifest dict if the cache is hot + fresh, else None.
|
|
433
|
+
|
|
434
|
+
Checks: manifest exists, schema_version matches, TTL not expired,
|
|
435
|
+
data_path is a real file. Any failure degrades to `None` so the
|
|
436
|
+
caller falls through to the pipeline-run path.
|
|
437
|
+
|
|
438
|
+
Mirrors cache_check.py's shell-level logic; duplicated in-process so
|
|
439
|
+
main.py can branch without shelling out.
|
|
440
|
+
"""
|
|
441
|
+
import datetime as dt
|
|
442
|
+
|
|
443
|
+
manifest_path = cache_dir / "manifest.json"
|
|
444
|
+
if not manifest_path.is_file():
|
|
445
|
+
return None
|
|
446
|
+
try:
|
|
447
|
+
manifest = json.loads(manifest_path.read_text())
|
|
448
|
+
except (OSError, json.JSONDecodeError):
|
|
449
|
+
return None
|
|
450
|
+
|
|
451
|
+
if str(manifest.get("schema_version") or "0") != SCHEMA_VERSION:
|
|
452
|
+
return None
|
|
453
|
+
|
|
454
|
+
data_path_s = manifest.get("data_path") or ""
|
|
455
|
+
if not data_path_s or not Path(data_path_s).is_file():
|
|
456
|
+
return None
|
|
457
|
+
|
|
458
|
+
try:
|
|
459
|
+
built = dt.datetime.fromisoformat(
|
|
460
|
+
(manifest.get("built_at_utc") or "").replace("Z", "+00:00")
|
|
461
|
+
)
|
|
462
|
+
except ValueError:
|
|
463
|
+
return None
|
|
464
|
+
|
|
465
|
+
age_days = (dt.datetime.now(dt.timezone.utc) - built).days
|
|
466
|
+
ttl = int(manifest.get("ttl_days") or CACHE_TTL_DAYS)
|
|
467
|
+
if age_days > ttl:
|
|
468
|
+
return None
|
|
469
|
+
|
|
470
|
+
return manifest
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
# ---------------------------------------------------------------------------
|
|
474
|
+
# Phase 6: Wave A
|
|
475
|
+
# ---------------------------------------------------------------------------
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def _run_wave_a(
|
|
479
|
+
agent_api_name: str,
|
|
480
|
+
version: str | None,
|
|
481
|
+
creds_provider: Callable[[], Tuple[str, str]],
|
|
482
|
+
refresh_fn: Callable[[], Tuple[str, str]],
|
|
483
|
+
*,
|
|
484
|
+
api_version: str,
|
|
485
|
+
parallelism: int = 5,
|
|
486
|
+
) -> dict | None:
|
|
487
|
+
"""Run the 7-query GenAi normalized DAG in layered parallel steps.
|
|
488
|
+
|
|
489
|
+
A1 resolves the live `GenAiPlannerDefinition` from (agent_api_name,
|
|
490
|
+
version) via a chain-LIKE lookup — Agentforce's accretive planner
|
|
491
|
+
naming (v1=`<Agent>`, v2=`<Agent>_v2`, v3=`<Agent>_v2_v3`, ...) means
|
|
492
|
+
(agent, version) alone is the only reliable key. The resolved row's
|
|
493
|
+
`DeveloperName` is the canonical planner_name that propagates
|
|
494
|
+
downstream via the bundle join in `_join_wave_a_to_bundle`.
|
|
495
|
+
|
|
496
|
+
Returns a dict:
|
|
497
|
+
{
|
|
498
|
+
"planner": {...},
|
|
499
|
+
"plugins": [...], # A2
|
|
500
|
+
"bundle_functions_join": [...], # A3
|
|
501
|
+
"functions": [...], # A4
|
|
502
|
+
"instructions": [...], # A5
|
|
503
|
+
"plugin_functions_join": [...], # A6
|
|
504
|
+
"attrs": [...], # A7
|
|
505
|
+
"unresolved": [...], # per-channel A2..A6 failures
|
|
506
|
+
}
|
|
507
|
+
Returns None if A1 yields no planner row — caller emits a clean
|
|
508
|
+
error instead of failing later in the join.
|
|
509
|
+
|
|
510
|
+
Failures:
|
|
511
|
+
* RestClientError / HTTPError on A1 → propagates. No graceful path
|
|
512
|
+
when the planner itself is unreachable.
|
|
513
|
+
* A2..A6 failures: one failure in a parallel layer doesn't abort
|
|
514
|
+
the layer (fetch_bodies_parallel's contract). The failed channel
|
|
515
|
+
yields an empty data list AND an entry in `unresolved` keyed by
|
|
516
|
+
channel with reason `wave-a-<channel>-failed:<redacted>`. The
|
|
517
|
+
caller folds these into `tree["_unresolved"]` so STATUS flips
|
|
518
|
+
to PARTIAL_OK.
|
|
519
|
+
"""
|
|
520
|
+
# A1 — scalar, no parallelism. api_version threads through
|
|
521
|
+
# every fetcher; see module docstring + fetch_soql.py.
|
|
522
|
+
planner = fetch_planner_definition(
|
|
523
|
+
agent_api_name, version, creds_provider,
|
|
524
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
525
|
+
)
|
|
526
|
+
if not planner:
|
|
527
|
+
return None
|
|
528
|
+
|
|
529
|
+
planner_id = planner.get("Id")
|
|
530
|
+
if not planner_id:
|
|
531
|
+
# Planner row missing Id — malformed response. Treat as miss.
|
|
532
|
+
return None
|
|
533
|
+
|
|
534
|
+
unresolved: list[dict] = []
|
|
535
|
+
|
|
536
|
+
# Layer 2: A2 + A3 in parallel
|
|
537
|
+
layer2 = fetch_bodies_parallel(
|
|
538
|
+
[
|
|
539
|
+
partial(
|
|
540
|
+
fetch_plugins_by_planner,
|
|
541
|
+
planner_id, creds_provider,
|
|
542
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
543
|
+
),
|
|
544
|
+
partial(
|
|
545
|
+
fetch_planner_bundle_functions,
|
|
546
|
+
planner_id, creds_provider,
|
|
547
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
548
|
+
),
|
|
549
|
+
],
|
|
550
|
+
max_workers=parallelism,
|
|
551
|
+
)
|
|
552
|
+
plugins = layer2[0][1] if layer2[0][0] else []
|
|
553
|
+
bundle_functions_join = layer2[1][1] if layer2[1][0] else []
|
|
554
|
+
for channel, (ok, r) in zip(("plugins", "bundle-functions"), layer2):
|
|
555
|
+
if not ok:
|
|
556
|
+
entry = {
|
|
557
|
+
"kind": "WAVE_A",
|
|
558
|
+
"channel": channel,
|
|
559
|
+
"reason": f"wave-a-{channel}-failed:{redact_error(r)}",
|
|
560
|
+
}
|
|
561
|
+
preview = getattr(r, "_response_body_preview", None)
|
|
562
|
+
if preview:
|
|
563
|
+
entry["response_body_preview"] = preview
|
|
564
|
+
unresolved.append(entry)
|
|
565
|
+
|
|
566
|
+
plugin_ids = [p.get("Id") for p in plugins if p.get("Id")]
|
|
567
|
+
|
|
568
|
+
# Layer 3: A4 + A5 + A6 in parallel
|
|
569
|
+
layer3 = fetch_bodies_parallel(
|
|
570
|
+
[
|
|
571
|
+
partial(
|
|
572
|
+
fetch_functions_by_plugins,
|
|
573
|
+
plugin_ids, creds_provider,
|
|
574
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
575
|
+
),
|
|
576
|
+
partial(
|
|
577
|
+
fetch_plugin_instructions,
|
|
578
|
+
plugin_ids, creds_provider,
|
|
579
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
580
|
+
),
|
|
581
|
+
partial(
|
|
582
|
+
fetch_plugin_functions,
|
|
583
|
+
plugin_ids, creds_provider,
|
|
584
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
585
|
+
),
|
|
586
|
+
],
|
|
587
|
+
max_workers=parallelism,
|
|
588
|
+
)
|
|
589
|
+
functions = layer3[0][1] if layer3[0][0] else []
|
|
590
|
+
instructions = layer3[1][1] if layer3[1][0] else []
|
|
591
|
+
plugin_functions_join = layer3[2][1] if layer3[2][0] else []
|
|
592
|
+
for channel, (ok, r) in zip(
|
|
593
|
+
("functions", "instructions", "plugin-functions"), layer3,
|
|
594
|
+
):
|
|
595
|
+
if not ok:
|
|
596
|
+
entry = {
|
|
597
|
+
"kind": "WAVE_A",
|
|
598
|
+
"channel": channel,
|
|
599
|
+
"reason": f"wave-a-{channel}-failed:{redact_error(r)}",
|
|
600
|
+
}
|
|
601
|
+
preview = getattr(r, "_response_body_preview", None)
|
|
602
|
+
if preview:
|
|
603
|
+
entry["response_body_preview"] = preview
|
|
604
|
+
unresolved.append(entry)
|
|
605
|
+
|
|
606
|
+
# Layer 4: A7 alone, parent_ids = function_ids. Planner-level attrs
|
|
607
|
+
# returned 0 rows live (a planner never carries direct attrs) so the
|
|
608
|
+
# prior `function_ids ∪ {planner_id}` widened the IN-list for no
|
|
609
|
+
# payoff. Keep the list minimal; dedupe defensively in case a
|
|
610
|
+
# function Id repeats across bundles.
|
|
611
|
+
parent_ids = list(dict.fromkeys(
|
|
612
|
+
f.get("Id") for f in functions if f.get("Id")
|
|
613
|
+
))
|
|
614
|
+
try:
|
|
615
|
+
attrs = fetch_planner_attrs(
|
|
616
|
+
parent_ids, creds_provider,
|
|
617
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
618
|
+
)
|
|
619
|
+
except (RestClientError, SoqlParamError):
|
|
620
|
+
attrs = []
|
|
621
|
+
|
|
622
|
+
return {
|
|
623
|
+
"planner": planner,
|
|
624
|
+
"plugins": plugins,
|
|
625
|
+
"bundle_functions_join": bundle_functions_join,
|
|
626
|
+
"functions": functions,
|
|
627
|
+
"instructions": instructions,
|
|
628
|
+
"plugin_functions_join": plugin_functions_join,
|
|
629
|
+
"attrs": attrs,
|
|
630
|
+
"unresolved": unresolved,
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
# ---------------------------------------------------------------------------
|
|
635
|
+
# Phase 7: join Wave A → _bundle_parsed.json shape
|
|
636
|
+
# ---------------------------------------------------------------------------
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def _join_wave_a_to_bundle(
|
|
640
|
+
bot_info: dict,
|
|
641
|
+
wave_a: dict,
|
|
642
|
+
) -> dict:
|
|
643
|
+
"""Reshape normalized Wave-A rows into the bundle dict parse_wave expects.
|
|
644
|
+
|
|
645
|
+
`parse_bundle.py` wrote XML-shaped bundles keyed by:
|
|
646
|
+
plannerType, plannerName, generation, description, masterLabel,
|
|
647
|
+
topics[{name, actions[{name, invocationTarget, invocationTargetType, ...}]}],
|
|
648
|
+
plannerActions[{...}]
|
|
649
|
+
|
|
650
|
+
We reconstruct that shape from the Tooling rows so parse_wave's
|
|
651
|
+
`init_tree` + `build_root_children` accept the dict unchanged.
|
|
652
|
+
"""
|
|
653
|
+
planner = wave_a["planner"]
|
|
654
|
+
planner_type = planner.get("PlannerType") or ""
|
|
655
|
+
generation = classify_generation(planner_type)
|
|
656
|
+
|
|
657
|
+
functions_by_id = {f.get("Id"): f for f in wave_a["functions"] if f.get("Id")}
|
|
658
|
+
# Plugin join: map plugin_id → ordered function_ids
|
|
659
|
+
plugin_fn_map: dict[str, list[str]] = {}
|
|
660
|
+
for row in wave_a["plugin_functions_join"]:
|
|
661
|
+
pid = row.get("PluginId")
|
|
662
|
+
fn_id = row.get("Function")
|
|
663
|
+
if pid and fn_id:
|
|
664
|
+
plugin_fn_map.setdefault(pid, []).append(fn_id)
|
|
665
|
+
|
|
666
|
+
def _action_dict(fn: dict) -> dict:
|
|
667
|
+
"""Shape a GenAiFunctionDefinition row as a bundle-action dict."""
|
|
668
|
+
return {
|
|
669
|
+
"name": fn.get("DeveloperName") or fn.get("Id") or "",
|
|
670
|
+
"localDeveloperName": fn.get("LocalDeveloperName"),
|
|
671
|
+
"masterLabel": fn.get("MasterLabel"),
|
|
672
|
+
"description": fn.get("Description"),
|
|
673
|
+
"invocationTarget": fn.get("InvocationTarget"),
|
|
674
|
+
"invocationTargetType": (fn.get("InvocationTargetType") or "").strip(),
|
|
675
|
+
"source": fn.get("Source"),
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
topics = []
|
|
679
|
+
for plugin in wave_a["plugins"]:
|
|
680
|
+
pid = plugin.get("Id")
|
|
681
|
+
fn_ids = plugin_fn_map.get(pid, [])
|
|
682
|
+
actions = [
|
|
683
|
+
_action_dict(functions_by_id[fid])
|
|
684
|
+
for fid in fn_ids if fid in functions_by_id
|
|
685
|
+
]
|
|
686
|
+
topics.append({
|
|
687
|
+
"name": plugin.get("DeveloperName") or "",
|
|
688
|
+
"localDeveloperName": plugin.get("LocalDeveloperName"),
|
|
689
|
+
"masterLabel": plugin.get("MasterLabel"),
|
|
690
|
+
"description": plugin.get("Description"),
|
|
691
|
+
"canEscalate": bool(plugin.get("CanEscalate")),
|
|
692
|
+
"pluginType": plugin.get("PluginType"),
|
|
693
|
+
"actions": actions,
|
|
694
|
+
})
|
|
695
|
+
|
|
696
|
+
# A planner never has direct functions (user invariant, verified
|
|
697
|
+
# against my-org-alias). The previous `PlannerId`-leg query leaked
|
|
698
|
+
# orphan rows (e.g. `AnswerQuestionsWithKnowledge_*`) as root-level
|
|
699
|
+
# children. Key retained for downstream compatibility with callers
|
|
700
|
+
# that read `bundle.get("plannerActions", [])` (parse_wave, a few
|
|
701
|
+
# _route / _normalize paths); always emits an empty list now.
|
|
702
|
+
return {
|
|
703
|
+
"plannerType": planner_type,
|
|
704
|
+
"plannerName": planner.get("DeveloperName"),
|
|
705
|
+
"generation": generation,
|
|
706
|
+
"description": planner.get("Description"),
|
|
707
|
+
"masterLabel": planner.get("MasterLabel"),
|
|
708
|
+
"topics": topics,
|
|
709
|
+
"plannerActions": [],
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
# ---------------------------------------------------------------------------
|
|
714
|
+
# Phase 8: Wave B (Flow + Apex body fetches)
|
|
715
|
+
# ---------------------------------------------------------------------------
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def _collect_wave_b_targets(bundle_parsed: dict) -> dict[str, list[str]]:
|
|
719
|
+
"""Walk topics + plannerActions. Return {kind: [invocation_target, ...]}.
|
|
720
|
+
|
|
721
|
+
Deduplicates per-kind. Caller routes each kind through the appropriate
|
|
722
|
+
fetch_soql helper.
|
|
723
|
+
"""
|
|
724
|
+
apex_names: set[str] = set()
|
|
725
|
+
apex_ids: set[str] = set()
|
|
726
|
+
flow_names: set[str] = set()
|
|
727
|
+
flow_ids: set[str] = set()
|
|
728
|
+
# Bug 1 fix (2026-05-05): prompt-template targets can arrive as either
|
|
729
|
+
# DeveloperNames (classic) OR 0hf-prefix Ids (observed in live orgs —
|
|
730
|
+
# GenAiFunctionDefinition.InvocationTarget sometimes stores the Id).
|
|
731
|
+
# Route to separate buckets so the Id bucket can be resolved → DevName
|
|
732
|
+
# by _normalize_prompt_template_id_targets before Wave B retrieve.
|
|
733
|
+
prompt_template_ids: set[str] = set()
|
|
734
|
+
unresolved: list[dict] = []
|
|
735
|
+
|
|
736
|
+
def _route(target: str, ttype: str) -> None:
|
|
737
|
+
t = (ttype or "").lower()
|
|
738
|
+
if not target:
|
|
739
|
+
return
|
|
740
|
+
# Bug 1 fix: prompt-template targets can arrive as either
|
|
741
|
+
# DeveloperNames (classic) OR 0hf-prefix Ids. The Metadata API
|
|
742
|
+
# retrieve expects DeveloperName; an Id sent verbatim returns
|
|
743
|
+
# zero members and the target stays in _pending_fetches forever.
|
|
744
|
+
# Route 0hf Ids into a separate bucket for post-lookup rewrite
|
|
745
|
+
# via _normalize_prompt_template_id_targets (parallel to the
|
|
746
|
+
# existing _normalize_flow_id_targets pattern).
|
|
747
|
+
if t in ("prompttemplate", "generatepromptresponse") or t.startswith("prompt") or t.startswith("genai"):
|
|
748
|
+
if looks_like_sf_id(target) and target[:3].lower() == "0hf":
|
|
749
|
+
prompt_template_ids.add(target)
|
|
750
|
+
return
|
|
751
|
+
# bundle-declared kinds that never carry an Id.
|
|
752
|
+
# Standard actions store their identifier (not an SF Id) directly
|
|
753
|
+
# in InvocationTarget. Skip the ID router entirely — routing them
|
|
754
|
+
# through resolve_or_unresolved would pollute `_unresolved` with
|
|
755
|
+
# misleading "invalid-id-format" entries.
|
|
756
|
+
if t == "standardinvocableaction":
|
|
757
|
+
return
|
|
758
|
+
# for flow/apex, only consult the ID router
|
|
759
|
+
# when the target actually looks like a Salesforce Id. Classic
|
|
760
|
+
# DeveloperNames (e.g. `MyFlow`, `AGNT_Foo`) don't
|
|
761
|
+
# match the Id shape and used to land in _unresolved with reason
|
|
762
|
+
# `invalid-id-format` — noise. Short-circuit: if it's not an Id
|
|
763
|
+
# shape, skip the router and trust the invocationTargetType.
|
|
764
|
+
if t in ("flow", "apex") and looks_like_sf_id(target):
|
|
765
|
+
kind, _channel = resolve_or_unresolved(target, unresolved)
|
|
766
|
+
if kind == "apex":
|
|
767
|
+
apex_ids.add(target)
|
|
768
|
+
return
|
|
769
|
+
if kind in ("flow_definition", "flow_version"):
|
|
770
|
+
flow_ids.add(target)
|
|
771
|
+
return
|
|
772
|
+
# Unknown Id prefix: resolve_or_unresolved already appended
|
|
773
|
+
# to `unresolved` with reason "unknown-id-prefix:..." — fall
|
|
774
|
+
# through; the target stays unrouted and surfaces there.
|
|
775
|
+
return
|
|
776
|
+
# Classic path: InvocationTarget is a DeveloperName.
|
|
777
|
+
if t == "apex":
|
|
778
|
+
apex_names.add(target)
|
|
779
|
+
elif t == "flow":
|
|
780
|
+
flow_names.add(target)
|
|
781
|
+
# Any other unrecognized type: silently skip. parse_wave will
|
|
782
|
+
# classify the node as UNKNOWN and it surfaces via _kind_counts.
|
|
783
|
+
|
|
784
|
+
for topic in bundle_parsed.get("topics", []) or []:
|
|
785
|
+
for a in topic.get("actions", []) or []:
|
|
786
|
+
_route(a.get("invocationTarget") or "",
|
|
787
|
+
a.get("invocationTargetType") or "")
|
|
788
|
+
for a in bundle_parsed.get("plannerActions", []) or []:
|
|
789
|
+
_route(a.get("invocationTarget") or "",
|
|
790
|
+
a.get("invocationTargetType") or "")
|
|
791
|
+
|
|
792
|
+
return {
|
|
793
|
+
"apex_names": sorted(apex_names),
|
|
794
|
+
"apex_ids": sorted(apex_ids),
|
|
795
|
+
"flow_names": sorted(flow_names),
|
|
796
|
+
"flow_ids": sorted(flow_ids),
|
|
797
|
+
"prompt_template_ids": sorted(prompt_template_ids),
|
|
798
|
+
"_unresolved": unresolved,
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
def _fetch_wave_b_by_names(
|
|
803
|
+
*,
|
|
804
|
+
apex_names: list[str],
|
|
805
|
+
apex_ids: list[str],
|
|
806
|
+
flow_names: list[str],
|
|
807
|
+
flow_ids: list[str],
|
|
808
|
+
prompt_template_ids: list[str] | None = None,
|
|
809
|
+
creds_provider: Callable[[], Tuple[str, str]],
|
|
810
|
+
refresh_fn: Callable[[], Tuple[str, str]],
|
|
811
|
+
api_version: str,
|
|
812
|
+
org_alias: str,
|
|
813
|
+
parallelism: int = 5,
|
|
814
|
+
) -> dict:
|
|
815
|
+
"""Fire body fetches for an explicit set of Apex/Flow identifiers.
|
|
816
|
+
|
|
817
|
+
Factored out of `_run_wave_b` so the iterative Wave B caller
|
|
818
|
+
(`_iterate_wave_b`) can reuse the same shape on subflow rounds —
|
|
819
|
+
every round's fetch concurrency + error handling semantics must
|
|
820
|
+
match the initial round exactly (same parallel layer, same
|
|
821
|
+
unresolved bookkeeping).
|
|
822
|
+
|
|
823
|
+
Returns a dict with:
|
|
824
|
+
apex_rows: list of ApexClass records (Name keyed)
|
|
825
|
+
flow_def_rows: list of FlowDefinition records (DeveloperName keyed)
|
|
826
|
+
flow_metadata: dict {version_id: Flow record}
|
|
827
|
+
unresolved: list of {id, reason} from fetch failures
|
|
828
|
+
|
|
829
|
+
Any empty input list short-circuits that branch — callers can pass
|
|
830
|
+
subsets safely (e.g. subflow rounds typically pass only flow_names).
|
|
831
|
+
"""
|
|
832
|
+
unresolved: list[dict] = []
|
|
833
|
+
|
|
834
|
+
# First hop: resolve IDs back to names where applicable. The results
|
|
835
|
+
# merge into the same rowsets the name-keyed path produces.
|
|
836
|
+
# api_version threads into every fetch call.
|
|
837
|
+
if apex_ids:
|
|
838
|
+
try:
|
|
839
|
+
apex_by_id_rows = fetch_apex_bodies_by_ids(
|
|
840
|
+
apex_ids, creds_provider,
|
|
841
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
842
|
+
)
|
|
843
|
+
except (RestClientError, SoqlParamError) as e:
|
|
844
|
+
unresolved.append({"kind": "APEX", "reason": f"apex-by-id-failed:{redact_error(e)}"})
|
|
845
|
+
apex_by_id_rows = []
|
|
846
|
+
else:
|
|
847
|
+
apex_by_id_rows = []
|
|
848
|
+
|
|
849
|
+
if flow_ids:
|
|
850
|
+
try:
|
|
851
|
+
flow_def_by_id_rows = fetch_flow_definition_by_ids(
|
|
852
|
+
flow_ids, creds_provider,
|
|
853
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
854
|
+
)
|
|
855
|
+
except (RestClientError, SoqlParamError) as e:
|
|
856
|
+
unresolved.append({"kind": "FLOW", "reason": f"flow-def-by-id-failed:{redact_error(e)}"})
|
|
857
|
+
flow_def_by_id_rows = []
|
|
858
|
+
else:
|
|
859
|
+
flow_def_by_id_rows = []
|
|
860
|
+
|
|
861
|
+
# Bug 1 fix: GenAiPromptTemplate is NOT SOQL-queryable (not on Tooling,
|
|
862
|
+
# not on Data API). The only way to resolve Id → DeveloperName is
|
|
863
|
+
# `sf org list metadata -m GenAiPromptTemplate`. We list every prompt
|
|
864
|
+
# template in the org, build an Id → fullName map, filter to the Ids
|
|
865
|
+
# we care about, and project to the same {Id, DeveloperName} shape the
|
|
866
|
+
# rest of the pipeline expects.
|
|
867
|
+
#
|
|
868
|
+
# Failure is non-fatal — the Ids stay in the bucket and surface in
|
|
869
|
+
# `_pending_fetches` rather than masking the real issue.
|
|
870
|
+
if prompt_template_ids:
|
|
871
|
+
try:
|
|
872
|
+
rows = list_prompt_template_metadata(org_alias)
|
|
873
|
+
except (SfCliError, AuthRequired) as e:
|
|
874
|
+
unresolved.append({
|
|
875
|
+
"kind": "PROMPT_TEMPLATE",
|
|
876
|
+
"reason": f"prompt-template-listmetadata-failed:{redact_error(e)}",
|
|
877
|
+
})
|
|
878
|
+
rows = []
|
|
879
|
+
wanted = set(prompt_template_ids)
|
|
880
|
+
prompt_template_id_rows = [
|
|
881
|
+
{"Id": r["id"], "DeveloperName": r["fullName"]}
|
|
882
|
+
for r in rows
|
|
883
|
+
if isinstance(r, dict) and r.get("id") in wanted and r.get("fullName")
|
|
884
|
+
]
|
|
885
|
+
else:
|
|
886
|
+
prompt_template_id_rows = []
|
|
887
|
+
|
|
888
|
+
# Parallel layer: apex-by-name + flow-def-by-name. Empty name lists
|
|
889
|
+
# still produce a task, but the downstream fetcher short-circuits on
|
|
890
|
+
# empty input — the overhead is a single worker dispatch which is
|
|
891
|
+
# cheaper than conditionally building the task list.
|
|
892
|
+
name_layer = fetch_bodies_parallel(
|
|
893
|
+
[
|
|
894
|
+
partial(
|
|
895
|
+
fetch_apex_bodies_by_names,
|
|
896
|
+
apex_names, creds_provider,
|
|
897
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
898
|
+
),
|
|
899
|
+
partial(
|
|
900
|
+
fetch_flow_definition_ids_by_names,
|
|
901
|
+
flow_names, creds_provider,
|
|
902
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
903
|
+
),
|
|
904
|
+
],
|
|
905
|
+
max_workers=parallelism,
|
|
906
|
+
)
|
|
907
|
+
apex_name_rows = name_layer[0][1] if name_layer[0][0] else []
|
|
908
|
+
flow_def_name_rows = name_layer[1][1] if name_layer[1][0] else []
|
|
909
|
+
# Bug D.1 fix: include the response body preview captured by
|
|
910
|
+
# rest_client._query_once when the failure was an HTTPError. Without
|
|
911
|
+
# it, all wave-B 400s collapse to "HTTP Error 400: Bad Request" with
|
|
912
|
+
# no signal about which name caused the malformed query. Falls back
|
|
913
|
+
# to None (existing shape) for non-HTTPError failures.
|
|
914
|
+
for ok, r in (name_layer[0], name_layer[1]):
|
|
915
|
+
if not ok:
|
|
916
|
+
entry = {"kind": "APEX_OR_FLOW", "reason": f"wave-b-batch-failed:{redact_error(r)}"}
|
|
917
|
+
preview = getattr(r, "_response_body_preview", None)
|
|
918
|
+
if preview:
|
|
919
|
+
entry["response_body_preview"] = preview
|
|
920
|
+
unresolved.append(entry)
|
|
921
|
+
|
|
922
|
+
apex_rows = [*apex_name_rows, *apex_by_id_rows]
|
|
923
|
+
flow_def_rows = [*flow_def_name_rows, *flow_def_by_id_rows]
|
|
924
|
+
|
|
925
|
+
# Second hop: one Flow.Metadata single-row call per ActiveVersionId.
|
|
926
|
+
# Parallelized via fetch_bodies_parallel.
|
|
927
|
+
version_ids = [
|
|
928
|
+
r.get("ActiveVersionId") for r in flow_def_rows
|
|
929
|
+
if r.get("ActiveVersionId")
|
|
930
|
+
]
|
|
931
|
+
metadata_tasks = [
|
|
932
|
+
partial(
|
|
933
|
+
fetch_flow_metadata,
|
|
934
|
+
vid, creds_provider,
|
|
935
|
+
api_version=api_version, on_401_refresh=refresh_fn,
|
|
936
|
+
)
|
|
937
|
+
for vid in version_ids
|
|
938
|
+
]
|
|
939
|
+
metadata_results = fetch_bodies_parallel(
|
|
940
|
+
metadata_tasks, max_workers=parallelism,
|
|
941
|
+
)
|
|
942
|
+
flow_metadata: dict[str, dict] = {}
|
|
943
|
+
for vid, (ok, result_or_exc) in zip(version_ids, metadata_results):
|
|
944
|
+
if ok and isinstance(result_or_exc, dict):
|
|
945
|
+
flow_metadata[vid] = result_or_exc
|
|
946
|
+
elif not ok:
|
|
947
|
+
unresolved.append({
|
|
948
|
+
"kind": "FLOW",
|
|
949
|
+
"version_id": vid,
|
|
950
|
+
"reason": f"flow-metadata-failed:{redact_error(result_or_exc)}",
|
|
951
|
+
})
|
|
952
|
+
|
|
953
|
+
return {
|
|
954
|
+
"apex_rows": apex_rows,
|
|
955
|
+
"flow_def_rows": flow_def_rows,
|
|
956
|
+
"flow_metadata": flow_metadata,
|
|
957
|
+
"prompt_template_id_rows": prompt_template_id_rows,
|
|
958
|
+
"unresolved": unresolved,
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
def _run_wave_b(
|
|
963
|
+
bundle_parsed: dict,
|
|
964
|
+
creds_provider: Callable[[], Tuple[str, str]],
|
|
965
|
+
refresh_fn: Callable[[], Tuple[str, str]],
|
|
966
|
+
*,
|
|
967
|
+
api_version: str,
|
|
968
|
+
org_alias: str,
|
|
969
|
+
parallelism: int = 5,
|
|
970
|
+
) -> dict:
|
|
971
|
+
"""Fire body fetches for every Apex/Flow target in the bundle.
|
|
972
|
+
|
|
973
|
+
Returns a dict with:
|
|
974
|
+
apex_rows: list of ApexClass records (Name keyed)
|
|
975
|
+
flow_def_rows: list of FlowDefinition records (DeveloperName keyed)
|
|
976
|
+
flow_metadata: dict {version_id: Flow record}
|
|
977
|
+
unresolved: list of {id, reason} from NGA ID routing
|
|
978
|
+
|
|
979
|
+
Only covers the top-level identifiers enumerated directly in
|
|
980
|
+
`bundle_parsed`. Subflows referenced inside fetched Flow.Metadata
|
|
981
|
+
bodies (e.g. shared utility flows like `handleFlowFault`) are
|
|
982
|
+
discovered AFTER this function returns and need a second round of
|
|
983
|
+
fetching — see `_iterate_wave_b`.
|
|
984
|
+
"""
|
|
985
|
+
targets = _collect_wave_b_targets(bundle_parsed)
|
|
986
|
+
|
|
987
|
+
fetched = _fetch_wave_b_by_names(
|
|
988
|
+
apex_names=targets["apex_names"],
|
|
989
|
+
apex_ids=targets["apex_ids"],
|
|
990
|
+
flow_names=targets["flow_names"],
|
|
991
|
+
flow_ids=targets["flow_ids"],
|
|
992
|
+
prompt_template_ids=targets.get("prompt_template_ids") or [],
|
|
993
|
+
creds_provider=creds_provider,
|
|
994
|
+
refresh_fn=refresh_fn,
|
|
995
|
+
api_version=api_version,
|
|
996
|
+
org_alias=org_alias,
|
|
997
|
+
parallelism=parallelism,
|
|
998
|
+
)
|
|
999
|
+
|
|
1000
|
+
# Merge the routing-layer unresolved entries (unknown-id-prefix, etc.)
|
|
1001
|
+
# with the fetch-layer ones. Order: routing first, fetch second — it's
|
|
1002
|
+
# the order they're discovered in the pipeline.
|
|
1003
|
+
fetched["unresolved"] = [*targets["_unresolved"], *fetched["unresolved"]]
|
|
1004
|
+
return fetched
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
# ---------------------------------------------------------------------------
|
|
1008
|
+
# iterative Wave B for nested-subflow discovery
|
|
1009
|
+
# ---------------------------------------------------------------------------
|
|
1010
|
+
|
|
1011
|
+
|
|
1012
|
+
def _extract_refs_from_flow_metadata(
|
|
1013
|
+
flow_metadata: dict[str, dict],
|
|
1014
|
+
) -> Tuple[set[str], set[str]]:
|
|
1015
|
+
"""Scan fetched Flow.Metadata dicts for downstream subflow + apex refs.
|
|
1016
|
+
|
|
1017
|
+
Returns `(subflow_names, apex_names)` — both DeveloperName sets.
|
|
1018
|
+
Subsets of the data that `_build_flow_children` walks, narrowed to
|
|
1019
|
+
just the name-extraction we need before we have enough information
|
|
1020
|
+
to build the full child list.
|
|
1021
|
+
|
|
1022
|
+
The extractor is intentionally permissive: missing keys / non-dict
|
|
1023
|
+
entries / blank names all drop silently. Parsing shape mirrors the
|
|
1024
|
+
`Metadata.actionCalls[]` + `Metadata.subflows[]` layout documented
|
|
1025
|
+
in the fetch_flow_metadata docstring and exercised by the
|
|
1026
|
+
CLASSIC_FLOW_METADATA fixture.
|
|
1027
|
+
|
|
1028
|
+
Apex discovery from actionCalls is deliberate — a subflow body CAN
|
|
1029
|
+
reference a new Apex class the parent tree didn't see (actionType
|
|
1030
|
+
== "apex" && actionName == <new class>). Missing those means the
|
|
1031
|
+
iterated tree has unexpanded APEX leaves even after flows resolve.
|
|
1032
|
+
"""
|
|
1033
|
+
subflow_names: set[str] = set()
|
|
1034
|
+
apex_names: set[str] = set()
|
|
1035
|
+
for record in (flow_metadata or {}).values():
|
|
1036
|
+
if not isinstance(record, dict):
|
|
1037
|
+
continue
|
|
1038
|
+
md = record.get("Metadata")
|
|
1039
|
+
if not isinstance(md, dict):
|
|
1040
|
+
continue
|
|
1041
|
+
for ac in md.get("actionCalls") or []:
|
|
1042
|
+
if not isinstance(ac, dict):
|
|
1043
|
+
continue
|
|
1044
|
+
if (ac.get("actionType") or "") == "apex":
|
|
1045
|
+
nm = ac.get("actionName") or ""
|
|
1046
|
+
if nm:
|
|
1047
|
+
apex_names.add(nm)
|
|
1048
|
+
for sub in md.get("subflows") or []:
|
|
1049
|
+
if not isinstance(sub, dict):
|
|
1050
|
+
continue
|
|
1051
|
+
nm = sub.get("flowName") or ""
|
|
1052
|
+
if nm:
|
|
1053
|
+
subflow_names.add(nm)
|
|
1054
|
+
return subflow_names, apex_names
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
def _iterate_wave_b(
|
|
1058
|
+
initial_wave_b: dict,
|
|
1059
|
+
creds_provider: Callable[[], Tuple[str, str]],
|
|
1060
|
+
refresh_fn: Callable[[], Tuple[str, str]],
|
|
1061
|
+
*,
|
|
1062
|
+
api_version: str,
|
|
1063
|
+
org_alias: str,
|
|
1064
|
+
parallelism: int = 5,
|
|
1065
|
+
max_iterations: int = 5,
|
|
1066
|
+
) -> dict:
|
|
1067
|
+
"""Drive Wave B to fixed-point for nested subflow / apex discovery.
|
|
1068
|
+
|
|
1069
|
+
The initial `_run_wave_b` call only enumerates top-level flow refs
|
|
1070
|
+
from `bundle_parsed`. When those flow bodies reference subflows
|
|
1071
|
+
(via `Metadata.subflows[].flowName`) or new Apex classes (via
|
|
1072
|
+
`Metadata.actionCalls[]`), their bodies were never fetched — so
|
|
1073
|
+
`_build_flow_children` would shape them as leaf nodes with no
|
|
1074
|
+
children even though the real subtree has content.
|
|
1075
|
+
|
|
1076
|
+
Per round:
|
|
1077
|
+
1. Extract subflow + apex refs from the current flow_metadata.
|
|
1078
|
+
2. Diff against already-fetched DeveloperNames.
|
|
1079
|
+
3. If diff empty → converged, return.
|
|
1080
|
+
4. Fetch the diff via `_fetch_wave_b_by_names`.
|
|
1081
|
+
5. Merge into the running wave_b dict.
|
|
1082
|
+
6. Repeat.
|
|
1083
|
+
|
|
1084
|
+
Safety:
|
|
1085
|
+
* `max_iterations=5` — empirically 2-3 is enough on real bots
|
|
1086
|
+
(handleFlowFault etc.). Hit the cap → remaining unfetched names
|
|
1087
|
+
surface via parse_wave's `_pending_fetches.FLOW` (their names
|
|
1088
|
+
are never added to `visited_by_kind["FLOW"]` since they're
|
|
1089
|
+
absent from `flow_def_rows`) and a marker lands in `unresolved`
|
|
1090
|
+
for triage.
|
|
1091
|
+
* Fetch failures in a round are tolerated by `_fetch_wave_b_by_names`
|
|
1092
|
+
— the affected names simply don't make it into `flow_def_rows`
|
|
1093
|
+
and naturally surface as pending.
|
|
1094
|
+
|
|
1095
|
+
Returns the (possibly enlarged) wave_b dict; caller mutates nothing.
|
|
1096
|
+
"""
|
|
1097
|
+
if max_iterations <= 0:
|
|
1098
|
+
return initial_wave_b
|
|
1099
|
+
|
|
1100
|
+
# Running state: copy so callers see their original dict untouched.
|
|
1101
|
+
merged_apex_rows = list(initial_wave_b.get("apex_rows") or [])
|
|
1102
|
+
merged_flow_def_rows = list(initial_wave_b.get("flow_def_rows") or [])
|
|
1103
|
+
merged_flow_metadata: dict[str, dict] = dict(
|
|
1104
|
+
initial_wave_b.get("flow_metadata") or {}
|
|
1105
|
+
)
|
|
1106
|
+
merged_unresolved = list(initial_wave_b.get("unresolved") or [])
|
|
1107
|
+
|
|
1108
|
+
fetched_flow_names: set[str] = {
|
|
1109
|
+
r.get("DeveloperName") for r in merged_flow_def_rows
|
|
1110
|
+
if r.get("DeveloperName")
|
|
1111
|
+
}
|
|
1112
|
+
fetched_apex_names: set[str] = {
|
|
1113
|
+
r.get("Name") for r in merged_apex_rows if r.get("Name")
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
for _round in range(max_iterations):
|
|
1117
|
+
subflow_names, apex_names = _extract_refs_from_flow_metadata(
|
|
1118
|
+
merged_flow_metadata
|
|
1119
|
+
)
|
|
1120
|
+
new_flow_names = sorted(subflow_names - fetched_flow_names)
|
|
1121
|
+
new_apex_names = sorted(apex_names - fetched_apex_names)
|
|
1122
|
+
if not new_flow_names and not new_apex_names:
|
|
1123
|
+
# Fixed-point reached.
|
|
1124
|
+
return {
|
|
1125
|
+
"apex_rows": merged_apex_rows,
|
|
1126
|
+
"flow_def_rows": merged_flow_def_rows,
|
|
1127
|
+
"flow_metadata": merged_flow_metadata,
|
|
1128
|
+
"prompt_template_id_rows": initial_wave_b.get(
|
|
1129
|
+
"prompt_template_id_rows"
|
|
1130
|
+
) or [],
|
|
1131
|
+
"unresolved": merged_unresolved,
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
round_result = _fetch_wave_b_by_names(
|
|
1135
|
+
apex_names=new_apex_names,
|
|
1136
|
+
apex_ids=[],
|
|
1137
|
+
flow_names=new_flow_names,
|
|
1138
|
+
flow_ids=[],
|
|
1139
|
+
creds_provider=creds_provider,
|
|
1140
|
+
refresh_fn=refresh_fn,
|
|
1141
|
+
api_version=api_version,
|
|
1142
|
+
org_alias=org_alias,
|
|
1143
|
+
parallelism=parallelism,
|
|
1144
|
+
)
|
|
1145
|
+
merged_apex_rows.extend(round_result["apex_rows"])
|
|
1146
|
+
merged_flow_def_rows.extend(round_result["flow_def_rows"])
|
|
1147
|
+
merged_flow_metadata.update(round_result["flow_metadata"])
|
|
1148
|
+
merged_unresolved.extend(round_result["unresolved"])
|
|
1149
|
+
|
|
1150
|
+
# Update fetched-name bookkeeping — we only track rows we
|
|
1151
|
+
# actually received (fetch failure ⇒ not fetched ⇒ will be
|
|
1152
|
+
# retried next round, bounded by the iteration cap).
|
|
1153
|
+
for r in round_result["flow_def_rows"]:
|
|
1154
|
+
nm = r.get("DeveloperName")
|
|
1155
|
+
if nm:
|
|
1156
|
+
fetched_flow_names.add(nm)
|
|
1157
|
+
for r in round_result["apex_rows"]:
|
|
1158
|
+
nm = r.get("Name")
|
|
1159
|
+
if nm:
|
|
1160
|
+
fetched_apex_names.add(nm)
|
|
1161
|
+
|
|
1162
|
+
# Iteration cap hit. Scan one more time to see what's still pending
|
|
1163
|
+
# so we can surface it clearly in `unresolved`. These names will also
|
|
1164
|
+
# land in `_pending_fetches.FLOW` via parse_wave's visited-vs-pending
|
|
1165
|
+
# diff (they're absent from flow_def_rows ⇒ absent from
|
|
1166
|
+
# visited_by_kind["FLOW"]).
|
|
1167
|
+
subflow_names, apex_names = _extract_refs_from_flow_metadata(
|
|
1168
|
+
merged_flow_metadata
|
|
1169
|
+
)
|
|
1170
|
+
still_pending_flows = sorted(subflow_names - fetched_flow_names)
|
|
1171
|
+
still_pending_apex = sorted(apex_names - fetched_apex_names)
|
|
1172
|
+
for nm in still_pending_flows:
|
|
1173
|
+
merged_unresolved.append({
|
|
1174
|
+
"kind": "FLOW",
|
|
1175
|
+
"api_name": nm,
|
|
1176
|
+
"reason": f"wave-b-iteration-cap:{max_iterations}-rounds-exhausted",
|
|
1177
|
+
})
|
|
1178
|
+
for nm in still_pending_apex:
|
|
1179
|
+
merged_unresolved.append({
|
|
1180
|
+
"kind": "APEX",
|
|
1181
|
+
"api_name": nm,
|
|
1182
|
+
"reason": f"wave-b-iteration-cap:{max_iterations}-rounds-exhausted",
|
|
1183
|
+
})
|
|
1184
|
+
|
|
1185
|
+
return {
|
|
1186
|
+
"apex_rows": merged_apex_rows,
|
|
1187
|
+
"flow_def_rows": merged_flow_def_rows,
|
|
1188
|
+
"flow_metadata": merged_flow_metadata,
|
|
1189
|
+
"prompt_template_id_rows": initial_wave_b.get(
|
|
1190
|
+
"prompt_template_id_rows"
|
|
1191
|
+
) or [],
|
|
1192
|
+
"unresolved": merged_unresolved,
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
# ---------------------------------------------------------------------------
|
|
1197
|
+
# build flow_children from in-memory Wave B metadata
|
|
1198
|
+
# ---------------------------------------------------------------------------
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
def _build_flow_children(
|
|
1202
|
+
flow_metadata: dict[str, dict],
|
|
1203
|
+
flow_def_rows: list[dict],
|
|
1204
|
+
) -> dict[str, list[dict]]:
|
|
1205
|
+
"""Produce `{flow_developer_name: [child_ref, ...]}` from Wave B data.
|
|
1206
|
+
|
|
1207
|
+
Mirrors the shape `parse_wave.harvest_waves` produces from on-disk
|
|
1208
|
+
flow XML, but sourced from the in-memory `Flow.Metadata` JSON that
|
|
1209
|
+
Wave B already fetched via the Tooling REST API (the `Metadata`
|
|
1210
|
+
complexvalue field decodes to a plain dict — see
|
|
1211
|
+
`fetch_flow_metadata` + test fixture `CLASSIC_FLOW_METADATA`). The
|
|
1212
|
+
shape parse_wave expects per child:
|
|
1213
|
+
|
|
1214
|
+
{"kind": "APEX", "api_name": <name>, "element_name": <elem>}
|
|
1215
|
+
{"kind": "PROMPT_TEMPLATE", "api_name": <name>, "element_name": <elem>}
|
|
1216
|
+
{"kind": "STANDARD_ACTION", "api_name": <name>, "element_name": <elem>,
|
|
1217
|
+
"invocation_type": <actionType>}
|
|
1218
|
+
{"kind": "FLOW", "api_name": <target_flow_name>,
|
|
1219
|
+
"element_name": <elem>}
|
|
1220
|
+
{"kind": "UNKNOWN", "api_name": <name>, "element_name": <elem>,
|
|
1221
|
+
"invocation_type": <actionType>}
|
|
1222
|
+
|
|
1223
|
+
Keying is by FlowDefinition.DeveloperName (not ActiveVersionId) —
|
|
1224
|
+
`walk_and_inflate` looks up by `leaf["api_name"]`, which the bundle
|
|
1225
|
+
populates with the Flow's DeveloperName.
|
|
1226
|
+
|
|
1227
|
+
Flows whose ActiveVersionId is missing (inactive / draft-only) or
|
|
1228
|
+
whose fetched metadata was None are silently skipped — they never
|
|
1229
|
+
had a body to walk. actionCall entries missing required fields
|
|
1230
|
+
(`actionType`, `actionName`, or `name`) degrade to UNKNOWN via
|
|
1231
|
+
`classify_action_call`, which already tolerates blanks. Subflow
|
|
1232
|
+
entries missing `flowName` are dropped entirely (no api_name to
|
|
1233
|
+
descend into).
|
|
1234
|
+
"""
|
|
1235
|
+
import parse_wave
|
|
1236
|
+
|
|
1237
|
+
# Build ActiveVersionId → DeveloperName lookup. FlowDefinition rows with
|
|
1238
|
+
# no ActiveVersionId (inactive flows, or flows only materializing a
|
|
1239
|
+
# Latest version) skip this map — `flow_metadata` is keyed on
|
|
1240
|
+
# ActiveVersionId too, so they drop out symmetrically.
|
|
1241
|
+
version_to_name: dict[str, str] = {}
|
|
1242
|
+
for row in flow_def_rows or []:
|
|
1243
|
+
vid = row.get("ActiveVersionId")
|
|
1244
|
+
dev_name = row.get("DeveloperName")
|
|
1245
|
+
if vid and dev_name:
|
|
1246
|
+
version_to_name[vid] = dev_name
|
|
1247
|
+
|
|
1248
|
+
flow_children: dict[str, list[dict]] = {}
|
|
1249
|
+
for version_id, record in (flow_metadata or {}).items():
|
|
1250
|
+
flow_name = version_to_name.get(version_id)
|
|
1251
|
+
if not flow_name:
|
|
1252
|
+
# No matching FlowDefinition row — can't key the children list.
|
|
1253
|
+
continue
|
|
1254
|
+
if not isinstance(record, dict):
|
|
1255
|
+
continue
|
|
1256
|
+
md = record.get("Metadata") or {}
|
|
1257
|
+
if not isinstance(md, dict):
|
|
1258
|
+
continue
|
|
1259
|
+
|
|
1260
|
+
children: list[dict] = []
|
|
1261
|
+
|
|
1262
|
+
# actionCalls — each entry has `name` (element id), `actionType`,
|
|
1263
|
+
# `actionName`. `actionType`/`actionName` may be missing on edge
|
|
1264
|
+
# cases (flow authored against an older API version that omits
|
|
1265
|
+
# the field); classify_action_call tolerates empty strings and
|
|
1266
|
+
# will return UNKNOWN.
|
|
1267
|
+
for ac in md.get("actionCalls") or []:
|
|
1268
|
+
if not isinstance(ac, dict):
|
|
1269
|
+
continue
|
|
1270
|
+
element_name = ac.get("name")
|
|
1271
|
+
action_type = ac.get("actionType") or ""
|
|
1272
|
+
action_name = ac.get("actionName") or ""
|
|
1273
|
+
if not element_name:
|
|
1274
|
+
# An unnamed actionCall can't be addressed in the tree
|
|
1275
|
+
# view; drop rather than synthesize a placeholder.
|
|
1276
|
+
continue
|
|
1277
|
+
children.append(
|
|
1278
|
+
parse_wave.classify_action_call(action_type, action_name, element_name)
|
|
1279
|
+
)
|
|
1280
|
+
|
|
1281
|
+
# subflows — each has `name` (element id) + `flowName` (target).
|
|
1282
|
+
for sub in md.get("subflows") or []:
|
|
1283
|
+
if not isinstance(sub, dict):
|
|
1284
|
+
continue
|
|
1285
|
+
element_name = sub.get("name")
|
|
1286
|
+
target = sub.get("flowName")
|
|
1287
|
+
if not element_name or not target:
|
|
1288
|
+
continue
|
|
1289
|
+
children.append({
|
|
1290
|
+
"kind": "FLOW",
|
|
1291
|
+
"element_name": element_name,
|
|
1292
|
+
"api_name": target,
|
|
1293
|
+
})
|
|
1294
|
+
|
|
1295
|
+
flow_children[flow_name] = children
|
|
1296
|
+
|
|
1297
|
+
return flow_children
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
# ---------------------------------------------------------------------------
|
|
1301
|
+
# Flow-ID → DeveloperName normalization
|
|
1302
|
+
# ---------------------------------------------------------------------------
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
def _normalize_flow_id_targets(bundle_parsed: dict, flow_def_rows: list[dict]) -> None:
|
|
1306
|
+
"""Rewrite action invocationTargets that are Flow IDs → DeveloperNames.
|
|
1307
|
+
|
|
1308
|
+
Mutates `bundle_parsed` in place. No-op when no flow_def_rows match.
|
|
1309
|
+
|
|
1310
|
+
Classic bots occasionally store 300Uv-prefix FlowDefinition IDs or
|
|
1311
|
+
301-prefix Flow version IDs in `GenAiFunctionDefinition.InvocationTarget`
|
|
1312
|
+
instead of DeveloperNames. Wave B's FlowDefinition fetch (by-id branch)
|
|
1313
|
+
already resolved those IDs; the rows carry both Id + ActiveVersionId +
|
|
1314
|
+
DeveloperName. We build a bi-directional map (300-id → name, 301-id →
|
|
1315
|
+
name via ActiveVersionId) and rewrite every action whose target is a
|
|
1316
|
+
known ID.
|
|
1317
|
+
|
|
1318
|
+
Unmatched IDs (Flow genuinely not queryable or belongs to a managed
|
|
1319
|
+
package we can't see) stay as-is so the pipeline surfaces them in
|
|
1320
|
+
_pending_fetches rather than silently discarding.
|
|
1321
|
+
"""
|
|
1322
|
+
# Build ID → DeveloperName lookup from both Id and ActiveVersionId keys.
|
|
1323
|
+
id_to_name: dict[str, str] = {}
|
|
1324
|
+
for row in flow_def_rows or []:
|
|
1325
|
+
dev_name = row.get("DeveloperName")
|
|
1326
|
+
if not dev_name:
|
|
1327
|
+
continue
|
|
1328
|
+
row_id = row.get("Id")
|
|
1329
|
+
if row_id:
|
|
1330
|
+
id_to_name[row_id] = dev_name
|
|
1331
|
+
active_ver = row.get("ActiveVersionId")
|
|
1332
|
+
if active_ver:
|
|
1333
|
+
id_to_name[active_ver] = dev_name
|
|
1334
|
+
|
|
1335
|
+
if not id_to_name:
|
|
1336
|
+
return
|
|
1337
|
+
|
|
1338
|
+
def _rewrite_action(action: dict) -> None:
|
|
1339
|
+
target = action.get("invocationTarget")
|
|
1340
|
+
ttype = (action.get("invocationTargetType") or "").strip().lower()
|
|
1341
|
+
if ttype != "flow" or not isinstance(target, str):
|
|
1342
|
+
return
|
|
1343
|
+
resolved = id_to_name.get(target)
|
|
1344
|
+
if resolved:
|
|
1345
|
+
# Preserve the original ID for traceability — consumers that
|
|
1346
|
+
# need it can still read `_original_invocation_target_id`.
|
|
1347
|
+
action["_original_invocation_target_id"] = target
|
|
1348
|
+
action["invocationTarget"] = resolved
|
|
1349
|
+
|
|
1350
|
+
for topic in bundle_parsed.get("topics") or []:
|
|
1351
|
+
for action in topic.get("actions") or []:
|
|
1352
|
+
_rewrite_action(action)
|
|
1353
|
+
for action in bundle_parsed.get("plannerActions") or []:
|
|
1354
|
+
_rewrite_action(action)
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
def _normalize_prompt_template_id_targets(
|
|
1358
|
+
bundle_parsed: dict, prompt_template_rows: list[dict],
|
|
1359
|
+
) -> None:
|
|
1360
|
+
"""Rewrite action invocationTargets that are GenAiPromptTemplate Ids
|
|
1361
|
+
(0hf-prefix) → DeveloperNames.
|
|
1362
|
+
|
|
1363
|
+
Bug 1 fix (2026-05-05): when GenAiFunctionDefinition.InvocationTarget
|
|
1364
|
+
stores a 0hf-prefix prompt template Id instead of a DeveloperName
|
|
1365
|
+
(observed in live my-org-alias org), the Metadata API retrieve
|
|
1366
|
+
can't match it — Wave B enqueues the Id as-is and the template
|
|
1367
|
+
stays in `_pending_fetches.PROMPT_TEMPLATE` forever.
|
|
1368
|
+
|
|
1369
|
+
Parallel to `_normalize_flow_id_targets`: build an Id → DeveloperName
|
|
1370
|
+
map from `list_prompt_template_metadata` rows (projected to
|
|
1371
|
+
{Id, DeveloperName} shape by `_fetch_wave_b_by_names`), mutate the
|
|
1372
|
+
bundle in place. Unmatched Ids stay as-is (genuinely missing template,
|
|
1373
|
+
or the Metadata API listing failed).
|
|
1374
|
+
"""
|
|
1375
|
+
id_to_name: dict[str, str] = {}
|
|
1376
|
+
for row in prompt_template_rows or []:
|
|
1377
|
+
row_id = row.get("Id")
|
|
1378
|
+
dev_name = row.get("DeveloperName")
|
|
1379
|
+
if row_id and dev_name:
|
|
1380
|
+
id_to_name[row_id] = dev_name
|
|
1381
|
+
|
|
1382
|
+
if not id_to_name:
|
|
1383
|
+
return
|
|
1384
|
+
|
|
1385
|
+
def _rewrite_action(action: dict) -> None:
|
|
1386
|
+
target = action.get("invocationTarget")
|
|
1387
|
+
ttype = (action.get("invocationTargetType") or "").strip().lower()
|
|
1388
|
+
# Match the same ttype predicate used by _route for prompt-template
|
|
1389
|
+
# targets — otherwise a Flow action whose target happens to collide
|
|
1390
|
+
# with a prompt template Id (unlikely but possible) wouldn't be
|
|
1391
|
+
# caught. _route's predicate is the authority on what's a prompt.
|
|
1392
|
+
is_prompt_ttype = (
|
|
1393
|
+
ttype in ("prompttemplate", "generatepromptresponse")
|
|
1394
|
+
or ttype.startswith("prompt")
|
|
1395
|
+
or ttype.startswith("genai")
|
|
1396
|
+
)
|
|
1397
|
+
if not is_prompt_ttype or not isinstance(target, str):
|
|
1398
|
+
return
|
|
1399
|
+
resolved = id_to_name.get(target)
|
|
1400
|
+
if resolved:
|
|
1401
|
+
action["_original_invocation_target_id"] = target
|
|
1402
|
+
action["invocationTarget"] = resolved
|
|
1403
|
+
|
|
1404
|
+
for topic in bundle_parsed.get("topics") or []:
|
|
1405
|
+
for action in topic.get("actions") or []:
|
|
1406
|
+
_rewrite_action(action)
|
|
1407
|
+
for action in bundle_parsed.get("plannerActions") or []:
|
|
1408
|
+
_rewrite_action(action)
|
|
1409
|
+
|
|
1410
|
+
|
|
1411
|
+
def _normalize_apex_id_targets(
|
|
1412
|
+
bundle_parsed: dict, apex_by_id_rows: list[dict],
|
|
1413
|
+
) -> None:
|
|
1414
|
+
"""Rewrite action invocationTargets that are Apex (01p-prefix Id)
|
|
1415
|
+
-> ApexClass Name.
|
|
1416
|
+
|
|
1417
|
+
Gap B fix (2026-05-05): when GenAiFunctionDefinition.InvocationTarget
|
|
1418
|
+
stores a 01p-prefix ApexClass Id instead of a class Name (observed in
|
|
1419
|
+
live my-org-alias org, e.g. 01p000000000000AAA ->
|
|
1420
|
+
MyController), downstream Wave B body retrieval enqueues
|
|
1421
|
+
the Id as-is into `_pending_fetches.APEX` and the tree renders the raw
|
|
1422
|
+
Id instead of the class name.
|
|
1423
|
+
|
|
1424
|
+
Parallel to `_normalize_prompt_template_id_targets`: build an Id ->
|
|
1425
|
+
Name map from `fetch_apex_bodies_by_ids` rows (ApexClass uses `Name`,
|
|
1426
|
+
not `DeveloperName`), mutate the bundle in place. Unmatched Ids stay
|
|
1427
|
+
as-is (genuinely missing class, or the by-Id fetch failed).
|
|
1428
|
+
"""
|
|
1429
|
+
id_to_name: dict[str, str] = {}
|
|
1430
|
+
for row in apex_by_id_rows or []:
|
|
1431
|
+
row_id = row.get("Id")
|
|
1432
|
+
class_name = row.get("Name")
|
|
1433
|
+
if row_id and class_name:
|
|
1434
|
+
id_to_name[row_id] = class_name
|
|
1435
|
+
|
|
1436
|
+
if not id_to_name:
|
|
1437
|
+
return
|
|
1438
|
+
|
|
1439
|
+
def _rewrite_action(action: dict) -> None:
|
|
1440
|
+
target = action.get("invocationTarget")
|
|
1441
|
+
ttype = (action.get("invocationTargetType") or "").strip().lower()
|
|
1442
|
+
# Match the same ttype predicate used by _route for apex targets.
|
|
1443
|
+
# Mirrors the prompt-template normalizer's ttype gate so a Flow
|
|
1444
|
+
# action whose target happens to collide with an ApexClass Id
|
|
1445
|
+
# (unlikely but possible) isn't miscaught.
|
|
1446
|
+
is_apex_ttype = ttype in ("apex", "apexaction") or ttype.startswith("apex")
|
|
1447
|
+
if not is_apex_ttype or not isinstance(target, str):
|
|
1448
|
+
return
|
|
1449
|
+
# Prefix-gate the rewrite to the ApexClass key prefix (01p).
|
|
1450
|
+
# Mirrors the `target[:3].lower() == "01p"` check in _collect_wave_b_targets.
|
|
1451
|
+
if target[:3].lower() != "01p":
|
|
1452
|
+
return
|
|
1453
|
+
resolved = id_to_name.get(target)
|
|
1454
|
+
if resolved:
|
|
1455
|
+
action["_original_invocation_target_id"] = target
|
|
1456
|
+
action["invocationTarget"] = resolved
|
|
1457
|
+
|
|
1458
|
+
for topic in bundle_parsed.get("topics") or []:
|
|
1459
|
+
for action in topic.get("actions") or []:
|
|
1460
|
+
_rewrite_action(action)
|
|
1461
|
+
for action in bundle_parsed.get("plannerActions") or []:
|
|
1462
|
+
_rewrite_action(action)
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
# ---------------------------------------------------------------------------
|
|
1466
|
+
# Signature derivation — Apex + Flow (rendered in Section 7 of architecture.md)
|
|
1467
|
+
# ---------------------------------------------------------------------------
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
def _derive_apex_signature(apex_row: dict) -> str | None:
|
|
1471
|
+
"""Return a compact one-line signature string for an Apex class, or None.
|
|
1472
|
+
|
|
1473
|
+
Sourced from `SymbolTable.methods[]` on the ApexClass Tooling row. Picks
|
|
1474
|
+
the "primary" method:
|
|
1475
|
+
1. Prefer a method annotated `@InvocableMethod` (what Flow / Agentforce
|
|
1476
|
+
actually invoke — typically exactly one per Agentforce-relevant
|
|
1477
|
+
class).
|
|
1478
|
+
2. Else prefer a `global` or `public static` non-constructor method.
|
|
1479
|
+
3. Else fall back to the first method in SymbolTable source order.
|
|
1480
|
+
|
|
1481
|
+
Format: `<modifiers> <returnType> <name>(<p1_type> <p1_name>, ...)`. If
|
|
1482
|
+
`returnType` is absent (constructor shape) it's omitted. Parameters are
|
|
1483
|
+
rendered as `<type> <name>`; empty param list becomes `()`.
|
|
1484
|
+
|
|
1485
|
+
Returns None when `SymbolTable` is missing/empty or contains no method
|
|
1486
|
+
candidates. Body parsing is intentionally NOT attempted — too brittle.
|
|
1487
|
+
"""
|
|
1488
|
+
if not isinstance(apex_row, dict):
|
|
1489
|
+
return None
|
|
1490
|
+
symbol_table = apex_row.get("SymbolTable")
|
|
1491
|
+
if not isinstance(symbol_table, dict):
|
|
1492
|
+
return None
|
|
1493
|
+
methods = symbol_table.get("methods")
|
|
1494
|
+
if not isinstance(methods, list) or not methods:
|
|
1495
|
+
return None
|
|
1496
|
+
|
|
1497
|
+
def _is_invocable(m: dict) -> bool:
|
|
1498
|
+
anns = m.get("annotations") or []
|
|
1499
|
+
for ann in anns:
|
|
1500
|
+
if isinstance(ann, dict):
|
|
1501
|
+
if (ann.get("name") or "").lower() == "invocablemethod":
|
|
1502
|
+
return True
|
|
1503
|
+
elif isinstance(ann, str):
|
|
1504
|
+
if ann.lower() == "invocablemethod":
|
|
1505
|
+
return True
|
|
1506
|
+
return False
|
|
1507
|
+
|
|
1508
|
+
def _is_constructor(m: dict) -> bool:
|
|
1509
|
+
# SymbolTable represents constructors via `constructors[]`, but some
|
|
1510
|
+
# payloads fold them into `methods[]` with a null/empty returnType.
|
|
1511
|
+
rt = m.get("returnType")
|
|
1512
|
+
return not rt
|
|
1513
|
+
|
|
1514
|
+
def _is_promoted(m: dict) -> bool:
|
|
1515
|
+
mods = [str(x).lower() for x in (m.get("modifiers") or [])]
|
|
1516
|
+
if _is_constructor(m):
|
|
1517
|
+
return False
|
|
1518
|
+
if "global" in mods:
|
|
1519
|
+
return True
|
|
1520
|
+
if "public" in mods and "static" in mods:
|
|
1521
|
+
return True
|
|
1522
|
+
return False
|
|
1523
|
+
|
|
1524
|
+
candidates = [m for m in methods if isinstance(m, dict)]
|
|
1525
|
+
if not candidates:
|
|
1526
|
+
return None
|
|
1527
|
+
|
|
1528
|
+
primary: dict | None = next((m for m in candidates if _is_invocable(m)), None)
|
|
1529
|
+
if primary is None:
|
|
1530
|
+
primary = next((m for m in candidates if _is_promoted(m)), None)
|
|
1531
|
+
if primary is None:
|
|
1532
|
+
# Last-resort: first method. Skip if it's purely a private/local helper
|
|
1533
|
+
# with no chance of being the public entry point — those add noise.
|
|
1534
|
+
primary = candidates[0]
|
|
1535
|
+
mods = [str(x).lower() for x in (primary.get("modifiers") or [])]
|
|
1536
|
+
if "private" in mods and not _is_invocable(primary):
|
|
1537
|
+
return None
|
|
1538
|
+
|
|
1539
|
+
modifiers = [str(x) for x in (primary.get("modifiers") or [])]
|
|
1540
|
+
return_type = primary.get("returnType") or ""
|
|
1541
|
+
name = primary.get("name") or ""
|
|
1542
|
+
if not name:
|
|
1543
|
+
return None
|
|
1544
|
+
|
|
1545
|
+
params_out: list[str] = []
|
|
1546
|
+
for p in primary.get("parameters") or []:
|
|
1547
|
+
if not isinstance(p, dict):
|
|
1548
|
+
continue
|
|
1549
|
+
p_type = p.get("type") or ""
|
|
1550
|
+
p_name = p.get("name") or ""
|
|
1551
|
+
if p_type and p_name:
|
|
1552
|
+
params_out.append(f"{p_type} {p_name}")
|
|
1553
|
+
elif p_type:
|
|
1554
|
+
params_out.append(p_type)
|
|
1555
|
+
elif p_name:
|
|
1556
|
+
params_out.append(p_name)
|
|
1557
|
+
params_str = ", ".join(params_out)
|
|
1558
|
+
|
|
1559
|
+
parts: list[str] = []
|
|
1560
|
+
if modifiers:
|
|
1561
|
+
parts.append(" ".join(modifiers))
|
|
1562
|
+
if return_type:
|
|
1563
|
+
parts.append(return_type)
|
|
1564
|
+
parts.append(f"{name}({params_str})")
|
|
1565
|
+
return " ".join(parts)
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
def _derive_flow_signature(flow_metadata_record: dict) -> str | None:
|
|
1569
|
+
"""Return a compact signature string for a Flow, or None.
|
|
1570
|
+
|
|
1571
|
+
Sourced from `Metadata.variables[]` on the Tooling Flow record
|
|
1572
|
+
(`fetch_flow_metadata` output — the `flow_metadata_record` is the
|
|
1573
|
+
full Tooling row, and `.Metadata` is the decoded complexvalue dict).
|
|
1574
|
+
|
|
1575
|
+
Flow variables carry boolean `isInput` / `isOutput` flags. A variable
|
|
1576
|
+
with `isInput: true` contributes to the `in:` side; `isOutput: true`
|
|
1577
|
+
contributes to the `out:` side; a variable can set both (round-trip)
|
|
1578
|
+
and will appear on BOTH sides. Variables with neither flag are locals
|
|
1579
|
+
and are skipped.
|
|
1580
|
+
|
|
1581
|
+
Format: `in: <name>: <type>[, ...] | out: <name>: <type>[, ...]`.
|
|
1582
|
+
If only one side has entries, only that side is emitted. Returns None
|
|
1583
|
+
when neither side has entries.
|
|
1584
|
+
|
|
1585
|
+
Collection variables render as `List<<dataType>>`. sObject variables
|
|
1586
|
+
use the `objectType` field (e.g. `List<Case>` rather than
|
|
1587
|
+
`List<SObject>`). Insertion order from `variables[]` is preserved —
|
|
1588
|
+
we deliberately do not sort, to keep the signature aligned with the
|
|
1589
|
+
flow author's declared order.
|
|
1590
|
+
"""
|
|
1591
|
+
if not isinstance(flow_metadata_record, dict):
|
|
1592
|
+
return None
|
|
1593
|
+
md = flow_metadata_record.get("Metadata")
|
|
1594
|
+
if not isinstance(md, dict):
|
|
1595
|
+
# Test convenience: accept a bare Metadata dict, not just the full row.
|
|
1596
|
+
if "variables" in flow_metadata_record:
|
|
1597
|
+
md = flow_metadata_record
|
|
1598
|
+
else:
|
|
1599
|
+
return None
|
|
1600
|
+
|
|
1601
|
+
variables = md.get("variables") or []
|
|
1602
|
+
if not isinstance(variables, list):
|
|
1603
|
+
return None
|
|
1604
|
+
|
|
1605
|
+
def _render_type(var: dict) -> str:
|
|
1606
|
+
data_type = (var.get("dataType") or "").strip()
|
|
1607
|
+
obj_type = (var.get("objectType") or "").strip()
|
|
1608
|
+
apex_class = (var.get("apexClass") or "").strip()
|
|
1609
|
+
dt_lower = data_type.lower()
|
|
1610
|
+
# sObject variables carry the concrete SObject name in `objectType`
|
|
1611
|
+
# (e.g. `Case`). Apex-typed variables carry the concrete class name
|
|
1612
|
+
# in `apexClass` (e.g. `CX_OrgSelector.Org`). Without the apexClass
|
|
1613
|
+
# branch, collections of Apex-typed values render as the useless
|
|
1614
|
+
# `List<Apex>` instead of `List<CX_OrgSelector.Org>`.
|
|
1615
|
+
if dt_lower == "sobject" and obj_type:
|
|
1616
|
+
base = obj_type
|
|
1617
|
+
elif dt_lower == "apex" and apex_class:
|
|
1618
|
+
base = apex_class
|
|
1619
|
+
else:
|
|
1620
|
+
base = data_type or "Object"
|
|
1621
|
+
if var.get("isCollection"):
|
|
1622
|
+
return f"List<{base}>"
|
|
1623
|
+
return base
|
|
1624
|
+
|
|
1625
|
+
inputs: list[str] = []
|
|
1626
|
+
outputs: list[str] = []
|
|
1627
|
+
for v in variables:
|
|
1628
|
+
if not isinstance(v, dict):
|
|
1629
|
+
continue
|
|
1630
|
+
name = v.get("name")
|
|
1631
|
+
if not name:
|
|
1632
|
+
continue
|
|
1633
|
+
rendered = f"{name}: {_render_type(v)}"
|
|
1634
|
+
if v.get("isInput"):
|
|
1635
|
+
inputs.append(rendered)
|
|
1636
|
+
if v.get("isOutput"):
|
|
1637
|
+
outputs.append(rendered)
|
|
1638
|
+
|
|
1639
|
+
if not inputs and not outputs:
|
|
1640
|
+
return None
|
|
1641
|
+
|
|
1642
|
+
parts: list[str] = []
|
|
1643
|
+
if inputs:
|
|
1644
|
+
parts.append("in: " + ", ".join(inputs))
|
|
1645
|
+
if outputs:
|
|
1646
|
+
parts.append("out: " + ", ".join(outputs))
|
|
1647
|
+
return " | ".join(parts)
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
def _stamp_signatures(
|
|
1651
|
+
node: dict,
|
|
1652
|
+
apex_sigs: dict[str, str],
|
|
1653
|
+
flow_sigs: dict[str, str],
|
|
1654
|
+
flow_reasons: dict[str, str] | None = None,
|
|
1655
|
+
) -> None:
|
|
1656
|
+
"""Recursively stamp `node["signature"]` on matching APEX / FLOW leaves.
|
|
1657
|
+
|
|
1658
|
+
Shared utility flows / helpers that appear in multiple branches all
|
|
1659
|
+
receive the same stamped signature — they point at the same
|
|
1660
|
+
FlowDefinition / ApexClass, so the signature is the same.
|
|
1661
|
+
|
|
1662
|
+
Gap 2 fix (2026-05-05): when a FLOW leaf has no signature but *does*
|
|
1663
|
+
have an explanation in `flow_reasons` (e.g. managed-pkg body not
|
|
1664
|
+
retrievable via the Data API fallback), stamp `node["_signature_reason"]`
|
|
1665
|
+
so the renderer can distinguish a silent hole from a known limitation.
|
|
1666
|
+
"""
|
|
1667
|
+
if not isinstance(node, dict):
|
|
1668
|
+
return
|
|
1669
|
+
kind = node.get("kind")
|
|
1670
|
+
name = node.get("api_name")
|
|
1671
|
+
if kind == "APEX" and name and name in apex_sigs:
|
|
1672
|
+
node["signature"] = apex_sigs[name]
|
|
1673
|
+
elif kind == "FLOW" and name:
|
|
1674
|
+
if name in flow_sigs:
|
|
1675
|
+
node["signature"] = flow_sigs[name]
|
|
1676
|
+
elif flow_reasons and name in flow_reasons:
|
|
1677
|
+
node["_signature_reason"] = flow_reasons[name]
|
|
1678
|
+
for child in node.get("children") or []:
|
|
1679
|
+
_stamp_signatures(child, apex_sigs, flow_sigs, flow_reasons)
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
# ---------------------------------------------------------------------------
|
|
1683
|
+
# Gap C (2026-05-05): prompt template body retrieve + stamp
|
|
1684
|
+
# ---------------------------------------------------------------------------
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
def _is_prompt_ttype(ttype: str) -> bool:
|
|
1688
|
+
"""Mirror the ttype predicate used by `_route` /
|
|
1689
|
+
`_normalize_prompt_template_id_targets` so collection + rewrite +
|
|
1690
|
+
retrieve all recognize the same action kind."""
|
|
1691
|
+
t = (ttype or "").strip().lower()
|
|
1692
|
+
return (
|
|
1693
|
+
t in ("prompttemplate", "generatepromptresponse")
|
|
1694
|
+
or t.startswith("prompt")
|
|
1695
|
+
or t.startswith("genai")
|
|
1696
|
+
)
|
|
1697
|
+
|
|
1698
|
+
|
|
1699
|
+
def _collect_prompt_template_names(bundle_parsed: dict) -> set[str]:
|
|
1700
|
+
"""Walk topics + plannerActions, collect prompt-template DeveloperNames.
|
|
1701
|
+
|
|
1702
|
+
Called AFTER `_normalize_prompt_template_id_targets` — any 0hf-prefix
|
|
1703
|
+
Id that resolved via Wave B's Id-list-metadata should already be a
|
|
1704
|
+
DeveloperName. Defensive: drop anything that still looks Id-shaped
|
|
1705
|
+
(0hf prefix) so we don't send a malformed
|
|
1706
|
+
`GenAiPromptTemplate:0hfUv...` spec to the retrieve CLI.
|
|
1707
|
+
"""
|
|
1708
|
+
names: set[str] = set()
|
|
1709
|
+
|
|
1710
|
+
def _collect(action: dict) -> None:
|
|
1711
|
+
ttype = action.get("invocationTargetType") or ""
|
|
1712
|
+
if not _is_prompt_ttype(ttype):
|
|
1713
|
+
return
|
|
1714
|
+
target = action.get("invocationTarget")
|
|
1715
|
+
if not isinstance(target, str) or not target:
|
|
1716
|
+
return
|
|
1717
|
+
if target[:3].lower() == "0hf":
|
|
1718
|
+
# Id never got rewritten — the list_metadata lookup missed it
|
|
1719
|
+
# (managed-pkg template, permission issue). Skip; it stays in
|
|
1720
|
+
# _pending_fetches with the Id as the key.
|
|
1721
|
+
return
|
|
1722
|
+
names.add(target)
|
|
1723
|
+
|
|
1724
|
+
for topic in bundle_parsed.get("topics") or []:
|
|
1725
|
+
for action in topic.get("actions") or []:
|
|
1726
|
+
_collect(action)
|
|
1727
|
+
for action in bundle_parsed.get("plannerActions") or []:
|
|
1728
|
+
_collect(action)
|
|
1729
|
+
return names
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
def _collect_flow_nested_prompt_template_names(
|
|
1733
|
+
node: dict,
|
|
1734
|
+
already_retrieved: dict[str, dict],
|
|
1735
|
+
out: set[str],
|
|
1736
|
+
) -> None:
|
|
1737
|
+
"""Walk the finalized tree and collect PROMPT_TEMPLATE leaves whose
|
|
1738
|
+
body wasn't stamped during the bundle-scoped retrieve.
|
|
1739
|
+
|
|
1740
|
+
Bundle-scoped `_collect_prompt_template_names` only sees prompt
|
|
1741
|
+
templates declared as top-level topic/planner InvocationTargets.
|
|
1742
|
+
Prompt templates referenced from inside a Flow (via a
|
|
1743
|
+
`generatePromptResponse` actionCall) are discovered later during
|
|
1744
|
+
Wave B's BFS of flow XML and end up as PROMPT_TEMPLATE leaves in the
|
|
1745
|
+
tree — but their names never reached the first retrieve, so their
|
|
1746
|
+
`_body_available` stays False and content is silently lost.
|
|
1747
|
+
|
|
1748
|
+
Defensive: drop 0hf-Id-shape names (managed-pkg templates whose Id
|
|
1749
|
+
never rewrote to a DeveloperName) — sending
|
|
1750
|
+
`GenAiPromptTemplate:0hfUv...` to the retrieve CLI yields a
|
|
1751
|
+
malformed spec; the Id stays in `_pending_fetches.PROMPT_TEMPLATE`
|
|
1752
|
+
as intended.
|
|
1753
|
+
"""
|
|
1754
|
+
if not isinstance(node, dict):
|
|
1755
|
+
return
|
|
1756
|
+
if node.get("kind") == "PROMPT_TEMPLATE":
|
|
1757
|
+
name = node.get("api_name")
|
|
1758
|
+
if (
|
|
1759
|
+
isinstance(name, str)
|
|
1760
|
+
and name
|
|
1761
|
+
and name[:3].lower() != "0hf"
|
|
1762
|
+
and not node.get("_body_available", False)
|
|
1763
|
+
):
|
|
1764
|
+
body = already_retrieved.get(name)
|
|
1765
|
+
if not (body and body.get("content")):
|
|
1766
|
+
out.add(name)
|
|
1767
|
+
for child in node.get("children") or []:
|
|
1768
|
+
_collect_flow_nested_prompt_template_names(child, already_retrieved, out)
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
def _stamp_prompt_template_bodies(
|
|
1772
|
+
node: dict,
|
|
1773
|
+
bodies: dict[str, dict],
|
|
1774
|
+
) -> None:
|
|
1775
|
+
"""Recursively stamp prompt-template body fields onto matching
|
|
1776
|
+
PROMPT_TEMPLATE leaves.
|
|
1777
|
+
|
|
1778
|
+
For each leaf whose `api_name` matches a key in `bodies`, attach:
|
|
1779
|
+
- master_label, content, inputs, active_version_identifier
|
|
1780
|
+
- _body_available = True
|
|
1781
|
+
|
|
1782
|
+
Leaves with no matching body get `_body_available = False` so the
|
|
1783
|
+
renderer can distinguish "no body retrieved" from "body successfully
|
|
1784
|
+
empty". Shared templates appearing in multiple branches receive the
|
|
1785
|
+
same stamped body (they reference the same DeveloperName).
|
|
1786
|
+
"""
|
|
1787
|
+
if not isinstance(node, dict):
|
|
1788
|
+
return
|
|
1789
|
+
kind = node.get("kind")
|
|
1790
|
+
name = node.get("api_name")
|
|
1791
|
+
if kind == "PROMPT_TEMPLATE" and name:
|
|
1792
|
+
body = bodies.get(name)
|
|
1793
|
+
if body:
|
|
1794
|
+
node["master_label"] = body.get("masterLabel")
|
|
1795
|
+
node["content"] = body.get("content")
|
|
1796
|
+
node["inputs"] = body.get("inputs") or []
|
|
1797
|
+
node["active_version_identifier"] = body.get(
|
|
1798
|
+
"activeVersionIdentifier"
|
|
1799
|
+
)
|
|
1800
|
+
node["_body_available"] = True
|
|
1801
|
+
else:
|
|
1802
|
+
node["_body_available"] = False
|
|
1803
|
+
for child in node.get("children") or []:
|
|
1804
|
+
_stamp_prompt_template_bodies(child, bodies)
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
# ---------------------------------------------------------------------------
|
|
1808
|
+
# Phase 9: build declared_action_tree.json via parse_wave primitives
|
|
1809
|
+
# ---------------------------------------------------------------------------
|
|
1810
|
+
|
|
1811
|
+
|
|
1812
|
+
def _run_parse_wave(
|
|
1813
|
+
bot_info: dict,
|
|
1814
|
+
bundle_parsed: dict,
|
|
1815
|
+
wave_b: dict,
|
|
1816
|
+
args: argparse.Namespace,
|
|
1817
|
+
work_dir: Path,
|
|
1818
|
+
) -> dict:
|
|
1819
|
+
"""Invoke parse_wave's init_tree + root-children builder in-process.
|
|
1820
|
+
|
|
1821
|
+
parse_wave was written to be invoked as a subprocess with env vars
|
|
1822
|
+
carrying AGENT_API_NAME / AGENT_VERSION / BOT_ID / etc. For Phase 2
|
|
1823
|
+
Batch 1 we set those env vars transiently and call the module's
|
|
1824
|
+
public helpers — no subprocess overhead, same behavior.
|
|
1825
|
+
"""
|
|
1826
|
+
import parse_wave
|
|
1827
|
+
|
|
1828
|
+
# parse_wave reads these via os.environ.
|
|
1829
|
+
prior_env = {
|
|
1830
|
+
"AGENT_API_NAME": os.environ.get("AGENT_API_NAME"),
|
|
1831
|
+
"AGENT_VERSION": os.environ.get("AGENT_VERSION"),
|
|
1832
|
+
"BOT_ID": os.environ.get("BOT_ID"),
|
|
1833
|
+
"BOT_MASTER_LABEL": os.environ.get("BOT_MASTER_LABEL"),
|
|
1834
|
+
"VERSION_AUTO_PICKED": os.environ.get("VERSION_AUTO_PICKED"),
|
|
1835
|
+
}
|
|
1836
|
+
os.environ["AGENT_API_NAME"] = args.agent_api_name
|
|
1837
|
+
os.environ["AGENT_VERSION"] = bot_info["version"]
|
|
1838
|
+
os.environ["BOT_ID"] = bot_info["bot_id"]
|
|
1839
|
+
os.environ["BOT_MASTER_LABEL"] = bot_info["master_label"]
|
|
1840
|
+
os.environ["VERSION_AUTO_PICKED"] = "true" if bot_info["version_auto_picked"] else "false"
|
|
1841
|
+
|
|
1842
|
+
try:
|
|
1843
|
+
# Persist the bundle for parse_wave's finalize_cap path.
|
|
1844
|
+
bundle_out = work_dir / "_bundle_parsed.json"
|
|
1845
|
+
bundle_out.write_text(json.dumps(bundle_parsed, indent=2))
|
|
1846
|
+
|
|
1847
|
+
# Persist a fake _bot_definition.json so init_tree reads real
|
|
1848
|
+
# metadata for the agent block.
|
|
1849
|
+
bd_file = work_dir / "_bot_definition.json"
|
|
1850
|
+
bd_file.write_text(json.dumps({
|
|
1851
|
+
"result": {"records": [bot_info.get("bot_definition") or {}]},
|
|
1852
|
+
}))
|
|
1853
|
+
|
|
1854
|
+
tree = parse_wave.init_tree(work_dir, bundle_parsed)
|
|
1855
|
+
|
|
1856
|
+
# Build root children + track bundle-derived BFS refs.
|
|
1857
|
+
# call the public `empty_kind_sets` /
|
|
1858
|
+
# `BFS_KINDS` symbols — reaching into `parse_wave._*` reopened the
|
|
1859
|
+
# leading-underscore surface that closed for `redact_text`.
|
|
1860
|
+
visited_by_kind = parse_wave.empty_kind_sets()
|
|
1861
|
+
aux_visited: set[tuple[str, str]] = set()
|
|
1862
|
+
children, bundle_refs = parse_wave.build_root_children(
|
|
1863
|
+
bundle_parsed, visited_by_kind, aux_visited,
|
|
1864
|
+
)
|
|
1865
|
+
tree["root"]["children"] = children
|
|
1866
|
+
|
|
1867
|
+
# Merge Flow metadata into flow_children. parse_wave wants this as
|
|
1868
|
+
# `{flow_name: [child_refs]}`. Build it from the in-memory
|
|
1869
|
+
# `Flow.Metadata` JSON Wave B already fetched — the Tooling REST
|
|
1870
|
+
# API decodes the `Metadata` complexvalue field into a plain dict,
|
|
1871
|
+
# so no XML parsing is needed (see `_build_flow_children` +
|
|
1872
|
+
# fixture `CLASSIC_FLOW_METADATA`). Without this, every FLOW leaf
|
|
1873
|
+
# in `metadata_tree.json` shipped with `children: []` and the
|
|
1874
|
+
# user's recursive-tree view was flat.
|
|
1875
|
+
flow_children = _build_flow_children(
|
|
1876
|
+
wave_b["flow_metadata"], wave_b["flow_def_rows"],
|
|
1877
|
+
)
|
|
1878
|
+
|
|
1879
|
+
# BFS routing for bundle refs.
|
|
1880
|
+
pending_by_kind, _cycles = parse_wave.bfs_step(
|
|
1881
|
+
parse_wave.empty_kind_sets(), visited_by_kind, bundle_refs,
|
|
1882
|
+
)
|
|
1883
|
+
|
|
1884
|
+
# Depth-cap accumulator threaded through inflate.
|
|
1885
|
+
depth_cap_pending = parse_wave.empty_kind_sets()
|
|
1886
|
+
parse_wave.walk_and_inflate(
|
|
1887
|
+
tree["root"], flow_children, pending_out=depth_cap_pending,
|
|
1888
|
+
)
|
|
1889
|
+
|
|
1890
|
+
# Merge any Apex / Flow we actually fetched into visited — they
|
|
1891
|
+
# no longer count as pending.
|
|
1892
|
+
for row in wave_b["apex_rows"]:
|
|
1893
|
+
nm = row.get("Name")
|
|
1894
|
+
if nm:
|
|
1895
|
+
visited_by_kind["APEX"].add(nm)
|
|
1896
|
+
for row in wave_b["flow_def_rows"]:
|
|
1897
|
+
nm = row.get("DeveloperName")
|
|
1898
|
+
if nm:
|
|
1899
|
+
visited_by_kind["FLOW"].add(nm)
|
|
1900
|
+
# Gap C (2026-05-05): prompt templates whose bodies we retrieved
|
|
1901
|
+
# count as visited and must drop out of _pending_fetches.
|
|
1902
|
+
# Templates the retrieve didn't return (permission / managed-pkg /
|
|
1903
|
+
# retrieve failure) stay out of `visited` so they surface there,
|
|
1904
|
+
# mirroring the Flow-by-name "no rows = stays pending" pattern.
|
|
1905
|
+
prompt_template_bodies = wave_b.get("prompt_template_bodies") or {}
|
|
1906
|
+
for name in prompt_template_bodies:
|
|
1907
|
+
if name:
|
|
1908
|
+
visited_by_kind["PROMPT_TEMPLATE"].add(name)
|
|
1909
|
+
|
|
1910
|
+
# Stamp Apex / Flow signatures onto every matching tree node so
|
|
1911
|
+
# render_architecture.py can populate Section 7. Wave B already
|
|
1912
|
+
# fetched SymbolTable (Apex) + Metadata (Flow); we just project it
|
|
1913
|
+
# onto `{kind, api_name}` leaves here. Shared utility flows /
|
|
1914
|
+
# helpers that appear in multiple positions all receive the same
|
|
1915
|
+
# stamped signature — that's the correct behavior (same definition).
|
|
1916
|
+
apex_sigs: dict[str, str] = {}
|
|
1917
|
+
for row in wave_b["apex_rows"]:
|
|
1918
|
+
nm = row.get("Name")
|
|
1919
|
+
if not nm:
|
|
1920
|
+
continue
|
|
1921
|
+
sig = _derive_apex_signature(row)
|
|
1922
|
+
if sig:
|
|
1923
|
+
apex_sigs[nm] = sig
|
|
1924
|
+
|
|
1925
|
+
flow_sigs: dict[str, str] = {}
|
|
1926
|
+
# Gap 2 fix (2026-05-05): explain silent signature holes. Managed
|
|
1927
|
+
# flows come back from `fetch_flow_definition_ids_by_names` via the
|
|
1928
|
+
# FlowDefinitionView fallback with _source="FlowDefinitionView",
|
|
1929
|
+
# ActiveVersionId=None, _body_available=False — by design, since
|
|
1930
|
+
# managed-pkg flow bodies are IP-protected. Previously every such
|
|
1931
|
+
# row produced an unexplained "_Signature not captured._" in the
|
|
1932
|
+
# rendered markdown. Now we surface the structural reason.
|
|
1933
|
+
#
|
|
1934
|
+
# For the generic "no usable metadata record" case (Tooling row
|
|
1935
|
+
# present but flow_metadata missing — e.g. metadata fetch failed
|
|
1936
|
+
# or the flow has no active version at all) we also stamp a reason
|
|
1937
|
+
# so the renderer never silently drops the node.
|
|
1938
|
+
flow_reasons: dict[str, str] = {}
|
|
1939
|
+
flow_metadata_by_vid = wave_b.get("flow_metadata") or {}
|
|
1940
|
+
for row in wave_b["flow_def_rows"]:
|
|
1941
|
+
dev_name = row.get("DeveloperName") or row.get("_bare_developer_name")
|
|
1942
|
+
if not dev_name:
|
|
1943
|
+
continue
|
|
1944
|
+
source = row.get("_source") or ""
|
|
1945
|
+
if source == "FlowDefinitionView":
|
|
1946
|
+
ns = row.get("NamespacePrefix") or ""
|
|
1947
|
+
reason = (
|
|
1948
|
+
f"managed-package (ns={ns}); body not retrievable via Tooling/Metadata API"
|
|
1949
|
+
if ns
|
|
1950
|
+
else "managed-package; body not retrievable via Tooling/Metadata API"
|
|
1951
|
+
)
|
|
1952
|
+
flow_reasons[dev_name] = reason
|
|
1953
|
+
continue
|
|
1954
|
+
active_ver = row.get("ActiveVersionId")
|
|
1955
|
+
if not active_ver:
|
|
1956
|
+
flow_reasons[dev_name] = "no active version"
|
|
1957
|
+
continue
|
|
1958
|
+
md_record = flow_metadata_by_vid.get(active_ver)
|
|
1959
|
+
if not md_record:
|
|
1960
|
+
flow_reasons[dev_name] = "flow metadata fetch returned no record"
|
|
1961
|
+
continue
|
|
1962
|
+
sig = _derive_flow_signature(md_record)
|
|
1963
|
+
if sig:
|
|
1964
|
+
flow_sigs[dev_name] = sig
|
|
1965
|
+
else:
|
|
1966
|
+
flow_reasons[dev_name] = "flow metadata has no in/out params"
|
|
1967
|
+
|
|
1968
|
+
_stamp_signatures(tree["root"], apex_sigs, flow_sigs, flow_reasons)
|
|
1969
|
+
|
|
1970
|
+
# Gap C: stamp retrieved prompt-template bodies onto the tree.
|
|
1971
|
+
# Leaves with a matching body gain content/master_label/inputs;
|
|
1972
|
+
# leaves without get `_body_available = False` so the renderer
|
|
1973
|
+
# can distinguish "retrieve missed" from "body truly absent".
|
|
1974
|
+
_stamp_prompt_template_bodies(tree["root"], prompt_template_bodies)
|
|
1975
|
+
|
|
1976
|
+
for kind in parse_wave.BFS_KINDS:
|
|
1977
|
+
pending_by_kind[kind] |= depth_cap_pending.get(kind, set())
|
|
1978
|
+
|
|
1979
|
+
depth_cap_tripped = any(depth_cap_pending[k] for k in parse_wave.BFS_KINDS)
|
|
1980
|
+
|
|
1981
|
+
tree["_pending_fetches"] = {
|
|
1982
|
+
k: sorted(pending_by_kind.get(k, set()) - visited_by_kind.get(k, set()))
|
|
1983
|
+
for k in parse_wave.BFS_KINDS
|
|
1984
|
+
}
|
|
1985
|
+
|
|
1986
|
+
any_pending = any(tree["_pending_fetches"][k] for k in parse_wave.BFS_KINDS)
|
|
1987
|
+
if depth_cap_tripped:
|
|
1988
|
+
tree["_partial"] = True
|
|
1989
|
+
tree["_partial_reason"] = "max-depth-cap"
|
|
1990
|
+
elif any_pending:
|
|
1991
|
+
tree["_partial"] = True
|
|
1992
|
+
if not tree.get("_partial_reason"):
|
|
1993
|
+
tree["_partial_reason"] = "pending-refs"
|
|
1994
|
+
else:
|
|
1995
|
+
tree["_partial"] = False
|
|
1996
|
+
tree["_partial_reason"] = None
|
|
1997
|
+
|
|
1998
|
+
# Surface Wave-B-level unresolved items (e.g. unknown ID prefixes).
|
|
1999
|
+
for u in wave_b.get("unresolved", []) or []:
|
|
2000
|
+
tree.setdefault("_unresolved", []).append(u)
|
|
2001
|
+
|
|
2002
|
+
node_count, depth, kind_counts = parse_wave.compute_stats(tree["root"])
|
|
2003
|
+
tree["node_count"] = node_count
|
|
2004
|
+
tree["depth"] = depth
|
|
2005
|
+
tree["_kind_counts"] = kind_counts
|
|
2006
|
+
|
|
2007
|
+
all_visited: set[tuple[str, str]] = set(aux_visited)
|
|
2008
|
+
for kind, names in visited_by_kind.items():
|
|
2009
|
+
for n in names:
|
|
2010
|
+
all_visited.add((kind, n))
|
|
2011
|
+
tree["_visited"] = [list(v) for v in sorted(all_visited)]
|
|
2012
|
+
|
|
2013
|
+
tree_path = work_dir / "declared_action_tree.json"
|
|
2014
|
+
tmp = tree_path.with_suffix(tree_path.suffix + ".tmp")
|
|
2015
|
+
tmp.write_text(json.dumps(tree, indent=2))
|
|
2016
|
+
os.replace(tmp, tree_path)
|
|
2017
|
+
return tree
|
|
2018
|
+
finally:
|
|
2019
|
+
# Restore env so test runners that reuse the process don't leak
|
|
2020
|
+
# state across invocations.
|
|
2021
|
+
for k, v in prior_env.items():
|
|
2022
|
+
if v is None:
|
|
2023
|
+
os.environ.pop(k, None)
|
|
2024
|
+
else:
|
|
2025
|
+
os.environ[k] = v
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
# ---------------------------------------------------------------------------
|
|
2029
|
+
# Phase 11: finalize
|
|
2030
|
+
# ---------------------------------------------------------------------------
|
|
2031
|
+
|
|
2032
|
+
|
|
2033
|
+
def _swap_dir_atomic(target: Path, staging: Path) -> None:
|
|
2034
|
+
"""Per-file overwrite from `staging` into `target` — preserves any
|
|
2035
|
+
unrelated sibling content already present in `target`.
|
|
2036
|
+
|
|
2037
|
+
P0 fix (2026-05-05): the prior implementation did
|
|
2038
|
+
``os.replace(target, backup); os.replace(staging, target)`` — an
|
|
2039
|
+
atomic whole-directory swap that was correct in isolation but
|
|
2040
|
+
DESTRUCTIVE of co-tenants. The `<agent>__<ver>/` dir is co-tenanted:
|
|
2041
|
+
co-tenants write per-session subdirs
|
|
2042
|
+
(`<session_id>/`) alongside architecture's files. Swapping the whole
|
|
2043
|
+
directory silently wiped every cached session trace.
|
|
2044
|
+
|
|
2045
|
+
New behavior: iterate `staging`'s immediate children and `os.replace`
|
|
2046
|
+
each one into `target`. The directory `target` itself is never
|
|
2047
|
+
moved or deleted, so any session subdirs under it survive.
|
|
2048
|
+
|
|
2049
|
+
Trade-off: the old helper supported atomic rollback (restore from
|
|
2050
|
+
backup on failure). The per-file pattern cannot — a crash partway
|
|
2051
|
+
through the loop leaves architecture's output in a split state
|
|
2052
|
+
(some new files, some old). This is acceptable because:
|
|
2053
|
+
- per-file `os.replace` is still atomic (no empty-path window
|
|
2054
|
+
for any individual file, so the "concurrent reader sees
|
|
2055
|
+
empty dir" bug that addressed is still closed);
|
|
2056
|
+
- `last_built_at.txt` is written LAST by the caller, so
|
|
2057
|
+
consumers can treat its presence as the success sentinel;
|
|
2058
|
+
- architecture is re-runnable, co-tenant session traces are not.
|
|
2059
|
+
|
|
2060
|
+
Callers must still guarantee `staging` is on the same filesystem as
|
|
2061
|
+
`target` (helper constructs `staging` as a sibling of `target`, so
|
|
2062
|
+
that holds by construction).
|
|
2063
|
+
"""
|
|
2064
|
+
import shutil
|
|
2065
|
+
|
|
2066
|
+
if not staging.is_dir():
|
|
2067
|
+
raise OSError(f"staging dir missing: {staging}")
|
|
2068
|
+
|
|
2069
|
+
target.mkdir(parents=True, exist_ok=True)
|
|
2070
|
+
|
|
2071
|
+
for src in staging.iterdir():
|
|
2072
|
+
dst = target / src.name
|
|
2073
|
+
# Clear any existing destination so `os.replace` lands cleanly
|
|
2074
|
+
# when the incoming type differs (file replacing dir or vice
|
|
2075
|
+
# versa). For same-type overwrites `os.replace` would handle
|
|
2076
|
+
# files on its own, but directories require an empty target or
|
|
2077
|
+
# same-name existing dir — safer to unify both here.
|
|
2078
|
+
if dst.exists() or dst.is_symlink():
|
|
2079
|
+
if dst.is_dir() and not dst.is_symlink():
|
|
2080
|
+
shutil.rmtree(dst)
|
|
2081
|
+
else:
|
|
2082
|
+
dst.unlink()
|
|
2083
|
+
os.replace(src, dst)
|
|
2084
|
+
|
|
2085
|
+
# Staging should be empty now; best-effort teardown.
|
|
2086
|
+
try:
|
|
2087
|
+
staging.rmdir()
|
|
2088
|
+
except OSError:
|
|
2089
|
+
shutil.rmtree(staging, ignore_errors=True)
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
def _run_finalize(
|
|
2093
|
+
data_dir: Path,
|
|
2094
|
+
cache_dir: Path,
|
|
2095
|
+
tree: dict,
|
|
2096
|
+
work_dir: Path,
|
|
2097
|
+
agent_api_name: str,
|
|
2098
|
+
agent_version: str,
|
|
2099
|
+
planner_name: str,
|
|
2100
|
+
) -> None:
|
|
2101
|
+
"""Atomic-write tree + summary + manifest. Keep it simple.
|
|
2102
|
+
|
|
2103
|
+
For Phase 2 Batch 1 we replicate finalize.py's essential behavior
|
|
2104
|
+
(tree + manifest) but skip the sf_meta mirror — there's no
|
|
2105
|
+
sf_meta dir when main.py runs the pipeline SOQL-first. Metadata-API
|
|
2106
|
+
retrieves land in Batch 2/3.
|
|
2107
|
+
|
|
2108
|
+
both `data_dir` and `cache_dir` are swapped
|
|
2109
|
+
via `_swap_dir_atomic` to close the "rmtree then rename" empty-dir
|
|
2110
|
+
window. A crash during the second swap restores the original from
|
|
2111
|
+
the staging-sibling `.<name>.backup.<pid>` rather than leaving an
|
|
2112
|
+
empty path.
|
|
2113
|
+
"""
|
|
2114
|
+
import datetime as dt
|
|
2115
|
+
import shutil
|
|
2116
|
+
|
|
2117
|
+
built_at = dt.datetime.now(dt.timezone.utc).isoformat().replace("+00:00", "Z")
|
|
2118
|
+
tree_base = f"{agent_api_name}_{agent_version}_metadata_tree"
|
|
2119
|
+
|
|
2120
|
+
# Finalize's _partial computation. Mirrors finalize.py:109-117 — both
|
|
2121
|
+
# buckets (_pending_fetches AND _unresolved) must be empty for a
|
|
2122
|
+
# clean run. _unresolved captures wave-B failures (HTTP 4xx,
|
|
2123
|
+
# iteration-cap exhaustion, managed-flow filter misses) that have
|
|
2124
|
+
# already been moved out of _pending_fetches; checking only the
|
|
2125
|
+
# latter would silently call a partial run "converged".
|
|
2126
|
+
planner_ok = bool(planner_name)
|
|
2127
|
+
pending_total = sum(len(v) for v in (tree.get("_pending_fetches") or {}).values())
|
|
2128
|
+
unresolved_count = len(tree.get("_unresolved") or [])
|
|
2129
|
+
waves_converged = pending_total == 0 and unresolved_count == 0
|
|
2130
|
+
tree["_partial"] = not (planner_ok and waves_converged)
|
|
2131
|
+
tree.pop("_visited", None)
|
|
2132
|
+
|
|
2133
|
+
# Pin deterministic child ordering as the last assembly step before
|
|
2134
|
+
# the authoritative write. Shared with the standalone `finalize.py`
|
|
2135
|
+
# subprocess so both paths produce byte-identical trees. Downstream
|
|
2136
|
+
# readers see one canonical order from disk; they do not re-sort.
|
|
2137
|
+
from finalize import sort_tree_in_place
|
|
2138
|
+
sort_tree_in_place(tree.get("root") or {})
|
|
2139
|
+
|
|
2140
|
+
# staging names are siblings (same parent) so the
|
|
2141
|
+
# `os.replace` used by `_swap_dir_atomic` is a same-filesystem atomic
|
|
2142
|
+
# rename. `.staging.<pid>` disambiguates concurrent pipelines on the
|
|
2143
|
+
# same host.
|
|
2144
|
+
data_parent = data_dir.parent
|
|
2145
|
+
data_staging = data_parent / f".{data_dir.name}.staging.{os.getpid()}"
|
|
2146
|
+
if data_staging.exists():
|
|
2147
|
+
shutil.rmtree(data_staging)
|
|
2148
|
+
data_staging.mkdir(parents=True)
|
|
2149
|
+
tree_out = data_staging / f"{tree_base}.json"
|
|
2150
|
+
tree_out.write_text(json.dumps(tree, indent=2))
|
|
2151
|
+
|
|
2152
|
+
# P2.2-1: phase 10 (architecture.md renderer). Imported lazily so a
|
|
2153
|
+
# renderer bug can't break the existing Batch 1 pipeline before the
|
|
2154
|
+
# tree JSON has been written — the tree + manifest remain the
|
|
2155
|
+
# authoritative outputs, architecture.md is a derived artifact.
|
|
2156
|
+
#
|
|
2157
|
+
# filename now self-identifying —
|
|
2158
|
+
# `{agent_api_name}_{agent_version}_architecture.md` (e.g.
|
|
2159
|
+
# `MyAgent_v5_architecture.md`). Same shape as the tree JSON,
|
|
2160
|
+
# minus the `_metadata_tree` suffix. The `.error` sidecar follows
|
|
2161
|
+
# the same shape.
|
|
2162
|
+
arch_base = f"{agent_api_name}_{agent_version}"
|
|
2163
|
+
arch_name = f"{arch_base}_architecture.md"
|
|
2164
|
+
arch_error_name = f"{arch_base}_architecture.md.error"
|
|
2165
|
+
try:
|
|
2166
|
+
from render_architecture import render as _render_architecture
|
|
2167
|
+
_render_architecture(tree_out, data_staging / arch_name)
|
|
2168
|
+
except Exception as e:
|
|
2169
|
+
# Best-effort: a render failure downgrades the run to "tree OK,
|
|
2170
|
+
# architecture skipped" rather than aborting finalize. The
|
|
2171
|
+
# reason string surfaces in the next-run logs for triage.
|
|
2172
|
+
(data_staging / arch_error_name).write_text(
|
|
2173
|
+
f"render_architecture failed: {type(e).__name__}: {e}\n"
|
|
2174
|
+
)
|
|
2175
|
+
|
|
2176
|
+
# dropped `{tree_base}.summary.md` from the output contract —
|
|
2177
|
+
# was a redundant summary of the tree JSON; consumers should read the
|
|
2178
|
+
# JSON directly. See CHANGELOG for details.
|
|
2179
|
+
(data_staging / "last_built_at.txt").write_text(built_at + "\n")
|
|
2180
|
+
|
|
2181
|
+
_swap_dir_atomic(data_dir, data_staging)
|
|
2182
|
+
|
|
2183
|
+
# CACHE_DIR staging — same two-phase swap.
|
|
2184
|
+
cache_parent = cache_dir.parent
|
|
2185
|
+
cache_staging = cache_parent / f".{cache_dir.name}.staging.{os.getpid()}"
|
|
2186
|
+
if cache_staging.exists():
|
|
2187
|
+
shutil.rmtree(cache_staging)
|
|
2188
|
+
cache_staging.mkdir(parents=True)
|
|
2189
|
+
|
|
2190
|
+
manifest = {
|
|
2191
|
+
"built_at_utc": built_at,
|
|
2192
|
+
"schema_version": tree.get("_schema_version", SCHEMA_VERSION),
|
|
2193
|
+
"agent": tree.get("agent", {}),
|
|
2194
|
+
"node_count": tree.get("node_count", 0),
|
|
2195
|
+
"depth": tree.get("depth", 0),
|
|
2196
|
+
"kind_counts": tree.get("_kind_counts", {}),
|
|
2197
|
+
"ttl_days": CACHE_TTL_DAYS,
|
|
2198
|
+
"data_path": str(data_dir / f"{tree_base}.json"),
|
|
2199
|
+
"partial": tree.get("_partial", False),
|
|
2200
|
+
"unresolved_count": len(tree.get("_unresolved", []) or []),
|
|
2201
|
+
}
|
|
2202
|
+
(cache_staging / "manifest.json").write_text(json.dumps(manifest, indent=2))
|
|
2203
|
+
# Copy tree + bundle sidecar for cache replay
|
|
2204
|
+
(cache_staging / "declared_action_tree.json").write_text(json.dumps(tree, indent=2))
|
|
2205
|
+
bundle_src = work_dir / "_bundle_parsed.json"
|
|
2206
|
+
if bundle_src.is_file():
|
|
2207
|
+
(cache_staging / "_bundle_parsed.json").write_text(bundle_src.read_text())
|
|
2208
|
+
|
|
2209
|
+
_swap_dir_atomic(cache_dir, cache_staging)
|
|
2210
|
+
|
|
2211
|
+
|
|
2212
|
+
# ---------------------------------------------------------------------------
|
|
2213
|
+
# Emit helpers
|
|
2214
|
+
# ---------------------------------------------------------------------------
|
|
2215
|
+
|
|
2216
|
+
|
|
2217
|
+
def _read_built_at_utc(cache_dir: Path | None) -> str:
|
|
2218
|
+
if cache_dir is None:
|
|
2219
|
+
return ""
|
|
2220
|
+
try:
|
|
2221
|
+
return json.loads((cache_dir / "manifest.json").read_text()).get("built_at_utc", "") or ""
|
|
2222
|
+
except (OSError, ValueError):
|
|
2223
|
+
return ""
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
def _emit_fail(
|
|
2227
|
+
args: argparse.Namespace,
|
|
2228
|
+
extra_ctx: dict | None,
|
|
2229
|
+
status: str,
|
|
2230
|
+
error_detail: str = "",
|
|
2231
|
+
start_epoch: float | None = None,
|
|
2232
|
+
) -> int:
|
|
2233
|
+
"""Write an .emit_ctx.json with STATUS=<status>.
|
|
2234
|
+
|
|
2235
|
+
STATUS enum (from emit_result.py):
|
|
2236
|
+
OK, PARTIAL_OK, INVALID_INPUT, AUTH_REQUIRED, AGENT_NOT_FOUND,
|
|
2237
|
+
AGENT_VERSION_NOT_FOUND, RETRIEVE_FAILED, WRITE_FAILED.
|
|
2238
|
+
|
|
2239
|
+
For probe failures, the plan's description suggested SCHEMA_DRIFT
|
|
2240
|
+
but emit_result doesn't carry that enum value. We map probe failures
|
|
2241
|
+
to RETRIEVE_FAILED with an explicit error_detail — the RESULT block's
|
|
2242
|
+
ERROR_DETAIL carries the "schema-drift" reason. Adding a new enum
|
|
2243
|
+
value would require touching emit_result (out of scope P1 primitive);
|
|
2244
|
+
the mapping preserves emit_result's existing contract.
|
|
2245
|
+
|
|
2246
|
+
Returns the exit code the caller should return.
|
|
2247
|
+
"""
|
|
2248
|
+
work_dir = Path(args.work_dir)
|
|
2249
|
+
work_dir.mkdir(parents=True, exist_ok=True)
|
|
2250
|
+
ctx = {
|
|
2251
|
+
"status": status,
|
|
2252
|
+
"error_detail": error_detail,
|
|
2253
|
+
"agent_api_name": args.agent_api_name,
|
|
2254
|
+
"agent_version": args.agent_version or "",
|
|
2255
|
+
"version_auto_picked": False,
|
|
2256
|
+
"agent_generation": "unknown",
|
|
2257
|
+
"bot_id": "",
|
|
2258
|
+
"org_id_15": "",
|
|
2259
|
+
"org_id_18": "",
|
|
2260
|
+
"cache_hit": False,
|
|
2261
|
+
"cached_at_utc": "",
|
|
2262
|
+
"cache_path": "",
|
|
2263
|
+
"output_json_path": "",
|
|
2264
|
+
"output_summary_path": "",
|
|
2265
|
+
"node_count": 0,
|
|
2266
|
+
"depth": 0,
|
|
2267
|
+
"partial": status == "PARTIAL_OK",
|
|
2268
|
+
"partial_reason": "",
|
|
2269
|
+
"pending_fetches_count": 0,
|
|
2270
|
+
"unresolved_count": 0,
|
|
2271
|
+
"available_bots": "",
|
|
2272
|
+
"available_versions": "",
|
|
2273
|
+
# Bug fix (2026-05-05): start_epoch captured once at pipeline entry
|
|
2274
|
+
# and threaded through every _emit_* helper. Previously each helper
|
|
2275
|
+
# re-captured time.time() AFTER the pipeline had already run, so
|
|
2276
|
+
# emit_result.py computed WALL_TIME_SECONDS against a timestamp taken
|
|
2277
|
+
# ~tens of seconds AFTER the real work finished and reported ~0.0s.
|
|
2278
|
+
"start_epoch": start_epoch if start_epoch is not None else time.time(),
|
|
2279
|
+
"data_dir": str(DATA_ROOT),
|
|
2280
|
+
"work_dir": str(work_dir),
|
|
2281
|
+
# failure paths never invoke the renderer.
|
|
2282
|
+
"architecture_path": "",
|
|
2283
|
+
"render_failed": False,
|
|
2284
|
+
"render_error_detail": "",
|
|
2285
|
+
}
|
|
2286
|
+
if extra_ctx:
|
|
2287
|
+
ctx.update(extra_ctx)
|
|
2288
|
+
(work_dir / ".emit_ctx.json").write_text(json.dumps(ctx, indent=2))
|
|
2289
|
+
return 1
|
|
2290
|
+
|
|
2291
|
+
|
|
2292
|
+
def _emit_cache_hit(
|
|
2293
|
+
args: argparse.Namespace,
|
|
2294
|
+
data_dir: Path,
|
|
2295
|
+
cache_dir: Path,
|
|
2296
|
+
manifest: dict,
|
|
2297
|
+
start_epoch: float | None = None,
|
|
2298
|
+
*,
|
|
2299
|
+
org_id_15: str = "",
|
|
2300
|
+
org_id_18: str = "",
|
|
2301
|
+
) -> int:
|
|
2302
|
+
work_dir = Path(args.work_dir)
|
|
2303
|
+
work_dir.mkdir(parents=True, exist_ok=True)
|
|
2304
|
+
agent_version = manifest.get("agent", {}).get("version", "")
|
|
2305
|
+
tree_base = f"{args.agent_api_name}_{agent_version}_metadata_tree"
|
|
2306
|
+
|
|
2307
|
+
# on a cache hit the renderer is NOT re-invoked — but the
|
|
2308
|
+
# architecture.md from the prior run is a legitimate output of the
|
|
2309
|
+
# cached data_dir. Surface it when present, skip the .error sidecar
|
|
2310
|
+
# since render_failed semantics only apply to THIS run's renderer.
|
|
2311
|
+
# filename rename to `{agent}_{ver}_architecture.md` —
|
|
2312
|
+
# NB `tree_base` above still carries the `_metadata_tree` suffix (it
|
|
2313
|
+
# names the JSON); architecture filenames drop the suffix.
|
|
2314
|
+
arch_base = f"{args.agent_api_name}_{agent_version}"
|
|
2315
|
+
arch_path = data_dir / f"{arch_base}_architecture.md"
|
|
2316
|
+
architecture_path = str(arch_path) if arch_path.is_file() else ""
|
|
2317
|
+
|
|
2318
|
+
ctx = {
|
|
2319
|
+
"status": "OK",
|
|
2320
|
+
"error_detail": "",
|
|
2321
|
+
"agent_api_name": args.agent_api_name,
|
|
2322
|
+
"agent_version": manifest.get("agent", {}).get("version", ""),
|
|
2323
|
+
"version_auto_picked": manifest.get("agent", {}).get("_version_auto_picked", False),
|
|
2324
|
+
"agent_generation": manifest.get("agent", {}).get("generation", "unknown"),
|
|
2325
|
+
"bot_id": manifest.get("agent", {}).get("bot_id", ""),
|
|
2326
|
+
"org_id_15": org_id_15,
|
|
2327
|
+
"org_id_18": org_id_18,
|
|
2328
|
+
"cache_hit": True,
|
|
2329
|
+
"cached_at_utc": manifest.get("built_at_utc", ""),
|
|
2330
|
+
"cache_path": str(cache_dir),
|
|
2331
|
+
"output_json_path": str(data_dir / f"{tree_base}.json"),
|
|
2332
|
+
# summary.md dropped from the output contract. Field kept
|
|
2333
|
+
# empty for RESULT-block shape stability.
|
|
2334
|
+
"output_summary_path": "",
|
|
2335
|
+
"node_count": int(manifest.get("node_count", 0) or 0),
|
|
2336
|
+
"depth": int(manifest.get("depth", 0) or 0),
|
|
2337
|
+
"partial": bool(manifest.get("partial", False)),
|
|
2338
|
+
"partial_reason": "",
|
|
2339
|
+
"pending_fetches_count": 0,
|
|
2340
|
+
"unresolved_count": int(manifest.get("unresolved_count", 0) or 0),
|
|
2341
|
+
"available_bots": "",
|
|
2342
|
+
"available_versions": "",
|
|
2343
|
+
# Bug fix (2026-05-05): see _emit_fail note — start_epoch is captured
|
|
2344
|
+
# at pipeline entry and threaded through. Cache-hit paths are short-
|
|
2345
|
+
# running so the drift is smaller, but the field should still reflect
|
|
2346
|
+
# the invocation's real wall time.
|
|
2347
|
+
"start_epoch": start_epoch if start_epoch is not None else time.time(),
|
|
2348
|
+
"data_dir": str(data_dir),
|
|
2349
|
+
"work_dir": str(work_dir),
|
|
2350
|
+
# architecture-render outcome signals. render_failed
|
|
2351
|
+
# stays False for cache replays — that flag tracks THIS run's
|
|
2352
|
+
# renderer, not the cached run's; a cache hit implies no retry.
|
|
2353
|
+
"architecture_path": architecture_path,
|
|
2354
|
+
"render_failed": False,
|
|
2355
|
+
"render_error_detail": "",
|
|
2356
|
+
}
|
|
2357
|
+
(work_dir / ".emit_ctx.json").write_text(json.dumps(ctx, indent=2))
|
|
2358
|
+
return 0
|
|
2359
|
+
|
|
2360
|
+
|
|
2361
|
+
def _emit_ok(
|
|
2362
|
+
args: argparse.Namespace,
|
|
2363
|
+
data_dir: Path,
|
|
2364
|
+
tree: dict,
|
|
2365
|
+
bot_info: dict,
|
|
2366
|
+
org_id_15: str,
|
|
2367
|
+
start_epoch: float | None = None,
|
|
2368
|
+
cache_dir: Path | None = None,
|
|
2369
|
+
org_id_18: str = "",
|
|
2370
|
+
) -> int:
|
|
2371
|
+
work_dir = Path(args.work_dir)
|
|
2372
|
+
work_dir.mkdir(parents=True, exist_ok=True)
|
|
2373
|
+
agent_version = bot_info["version"]
|
|
2374
|
+
tree_base = f"{args.agent_api_name}_{agent_version}_metadata_tree"
|
|
2375
|
+
pending_total = sum(len(v) for v in (tree.get("_pending_fetches") or {}).values())
|
|
2376
|
+
|
|
2377
|
+
# surface architecture-render outcome on the success path.
|
|
2378
|
+
# finalize writes either `{agent}_{ver}_architecture.md` (render OK) or
|
|
2379
|
+
# `{agent}_{ver}_architecture.md.error` (render raised) into the
|
|
2380
|
+
# data_dir; we read whichever is present and plumb the fields through
|
|
2381
|
+
# the ctx. emit_result consumes the boolean to auto-promote
|
|
2382
|
+
# OK -> PARTIAL_OK when the tree landed but the diagram render failed.
|
|
2383
|
+
# filename rename — self-identifying shape. `tree_base` above
|
|
2384
|
+
# is for the JSON path (carries `_metadata_tree`); architecture uses
|
|
2385
|
+
# the unsuffixed agent+version base.
|
|
2386
|
+
arch_base = f"{args.agent_api_name}_{agent_version}"
|
|
2387
|
+
arch_path = data_dir / f"{arch_base}_architecture.md"
|
|
2388
|
+
arch_sidecar = data_dir / f"{arch_base}_architecture.md.error"
|
|
2389
|
+
architecture_path = str(arch_path) if arch_path.is_file() else ""
|
|
2390
|
+
render_failed = arch_sidecar.is_file()
|
|
2391
|
+
render_error_detail = ""
|
|
2392
|
+
if render_failed:
|
|
2393
|
+
try:
|
|
2394
|
+
raw = arch_sidecar.read_text(errors="replace").strip()
|
|
2395
|
+
except OSError:
|
|
2396
|
+
raw = ""
|
|
2397
|
+
if raw:
|
|
2398
|
+
# Single-line cap, 200-char truncation, scrubbed via the
|
|
2399
|
+
# rest_client redactor (same contract as write_emit_ctx).
|
|
2400
|
+
from rest_client import redact_text as _redact
|
|
2401
|
+
render_error_detail = _redact(raw.splitlines()[0])[:200]
|
|
2402
|
+
|
|
2403
|
+
ctx = {
|
|
2404
|
+
"status": "PARTIAL_OK" if tree.get("_partial") else "OK",
|
|
2405
|
+
"error_detail": "",
|
|
2406
|
+
"agent_api_name": args.agent_api_name,
|
|
2407
|
+
"agent_version": bot_info["version"],
|
|
2408
|
+
"version_auto_picked": bot_info["version_auto_picked"],
|
|
2409
|
+
"agent_generation": tree.get("agent", {}).get("generation", "unknown"),
|
|
2410
|
+
"bot_id": bot_info["bot_id"],
|
|
2411
|
+
"org_id_15": org_id_15,
|
|
2412
|
+
# Gap 3 fix (2026-05-05): the 18-char id is available from
|
|
2413
|
+
# `sf org display` in _derive_org_ids but was previously dropped.
|
|
2414
|
+
# Now threaded from pipeline entry so the RESULT contract field is
|
|
2415
|
+
# actually populated on success.
|
|
2416
|
+
"org_id_18": org_id_18,
|
|
2417
|
+
"cache_hit": False,
|
|
2418
|
+
"cached_at_utc": _read_built_at_utc(cache_dir),
|
|
2419
|
+
# Gap 4 fix (2026-05-05): non-cache-hit runs write the manifest into
|
|
2420
|
+
# `cache_dir` (see _run_finalize) so the field should point at the
|
|
2421
|
+
# same path a subsequent invocation would probe. Caller passes the
|
|
2422
|
+
# already-computed cache_dir; we skip the leading-empty fallback
|
|
2423
|
+
# only when it's truly unknown (shouldn't happen on _emit_ok).
|
|
2424
|
+
"cache_path": str(cache_dir) if cache_dir is not None else "",
|
|
2425
|
+
"output_json_path": str(data_dir / f"{tree_base}.json"),
|
|
2426
|
+
# summary.md dropped from the output contract.
|
|
2427
|
+
"output_summary_path": "",
|
|
2428
|
+
"node_count": int(tree.get("node_count", 0) or 0),
|
|
2429
|
+
"depth": int(tree.get("depth", 0) or 0),
|
|
2430
|
+
"partial": bool(tree.get("_partial", False)),
|
|
2431
|
+
"partial_reason": tree.get("_partial_reason") or "",
|
|
2432
|
+
"pending_fetches_count": pending_total,
|
|
2433
|
+
"unresolved_count": len(tree.get("_unresolved", []) or []),
|
|
2434
|
+
"available_bots": "",
|
|
2435
|
+
"available_versions": "",
|
|
2436
|
+
# Bug fix (2026-05-05): see _emit_fail note — start_epoch threaded
|
|
2437
|
+
# from pipeline entry so WALL_TIME_SECONDS reflects the full run.
|
|
2438
|
+
"start_epoch": start_epoch if start_epoch is not None else time.time(),
|
|
2439
|
+
"data_dir": str(data_dir),
|
|
2440
|
+
"work_dir": str(work_dir),
|
|
2441
|
+
# architecture-render outcome signals.
|
|
2442
|
+
"architecture_path": architecture_path,
|
|
2443
|
+
"render_failed": render_failed,
|
|
2444
|
+
"render_error_detail": render_error_detail,
|
|
2445
|
+
}
|
|
2446
|
+
(work_dir / ".emit_ctx.json").write_text(json.dumps(ctx, indent=2))
|
|
2447
|
+
return 0
|
|
2448
|
+
|
|
2449
|
+
|
|
2450
|
+
# ---------------------------------------------------------------------------
|
|
2451
|
+
# Entry point
|
|
2452
|
+
# ---------------------------------------------------------------------------
|
|
2453
|
+
|
|
2454
|
+
|
|
2455
|
+
def _run_pipeline(args: argparse.Namespace, start_epoch: float) -> int: # noqa: PLR0911, PLR0915
|
|
2456
|
+
"""Execute the 12-phase pipeline. Extracted from `main()` so the
|
|
2457
|
+
top-level entry point can wrap any uncaught exception in a RESULT
|
|
2458
|
+
block .
|
|
2459
|
+
|
|
2460
|
+
Every structured failure path here already routes through
|
|
2461
|
+
`_emit_fail` and returns a non-zero exit code. Exceptions that
|
|
2462
|
+
escape this function are, by definition, bugs we hadn't thought of
|
|
2463
|
+
yet — `main()` catches them so the skill contract (RESULT block on
|
|
2464
|
+
every exit path) holds regardless.
|
|
2465
|
+
"""
|
|
2466
|
+
work_dir = Path(args.work_dir)
|
|
2467
|
+
work_dir.mkdir(parents=True, exist_ok=True)
|
|
2468
|
+
|
|
2469
|
+
# Phase 2 Batch 1: single creds cell shared between provider + refresh.
|
|
2470
|
+
# Refresh mutates the cell; provider reads it on every attempt — this
|
|
2471
|
+
# is the `` refresh contract.
|
|
2472
|
+
#
|
|
2473
|
+
# Wave B fetches run N concurrent Flow.Metadata
|
|
2474
|
+
# calls through parallel_retrieve.fetch_bodies_parallel. `refresh_fn`
|
|
2475
|
+
# serializes behind a lock + 1-second monotonic dedupe window so
|
|
2476
|
+
# concurrent 401s don't each fork their own `sf org display`. See
|
|
2477
|
+
# `_build_creds_plumbing`.
|
|
2478
|
+
try:
|
|
2479
|
+
initial = _resolve_creds(args.org_alias)
|
|
2480
|
+
except (AuthRequired, SfCliError) as e:
|
|
2481
|
+
return _emit_fail(
|
|
2482
|
+
args, None, "AUTH_REQUIRED",
|
|
2483
|
+
error_detail=redact_error(e),
|
|
2484
|
+
start_epoch=start_epoch,
|
|
2485
|
+
)
|
|
2486
|
+
|
|
2487
|
+
creds_provider, refresh_fn, _creds_cell = _build_creds_plumbing(
|
|
2488
|
+
initial,
|
|
2489
|
+
resolve_creds=lambda: _resolve_creds(args.org_alias),
|
|
2490
|
+
)
|
|
2491
|
+
|
|
2492
|
+
# Phase 2.5: derive org_id_15 + org_id_18 + api_version
|
|
2493
|
+
try:
|
|
2494
|
+
org_id_15, org_id_18, api_version = _derive_org_ids(args.org_alias)
|
|
2495
|
+
except (AuthRequired, SfCliError) as e:
|
|
2496
|
+
return _emit_fail(
|
|
2497
|
+
args, None, "AUTH_REQUIRED",
|
|
2498
|
+
error_detail=redact_error(e),
|
|
2499
|
+
start_epoch=start_epoch,
|
|
2500
|
+
)
|
|
2501
|
+
|
|
2502
|
+
# Phase 3: probe channels
|
|
2503
|
+
channels = probe_channels(
|
|
2504
|
+
args.org_alias, org_id_15, api_version,
|
|
2505
|
+
force_refresh=args.reprobe,
|
|
2506
|
+
)
|
|
2507
|
+
if channels.get("status") == "PROBE_FAILED":
|
|
2508
|
+
# Plan suggested STATUS=SCHEMA_DRIFT; emit_result's STATUS enum
|
|
2509
|
+
# doesn't include that value. Mapping to RETRIEVE_FAILED with a
|
|
2510
|
+
# "schema-drift" ERROR_DETAIL preserves the existing enum
|
|
2511
|
+
# contract while surfacing the cause. A future batch may add
|
|
2512
|
+
# SCHEMA_DRIFT to the enum; that change lives in emit_result.
|
|
2513
|
+
missing = [
|
|
2514
|
+
(sobj, e.get("mandatory_missing", []))
|
|
2515
|
+
for sobj, e in (channels.get("channels") or {}).items()
|
|
2516
|
+
if e.get("mandatory_missing")
|
|
2517
|
+
]
|
|
2518
|
+
return _emit_fail(
|
|
2519
|
+
args, None, "RETRIEVE_FAILED",
|
|
2520
|
+
error_detail=f"schema-drift: mandatory fields missing: {missing[:3]}",
|
|
2521
|
+
start_epoch=start_epoch,
|
|
2522
|
+
)
|
|
2523
|
+
|
|
2524
|
+
# Phase 4: resolve bot + version
|
|
2525
|
+
try:
|
|
2526
|
+
bot_info = _resolve_bot(
|
|
2527
|
+
args.agent_api_name, args.agent_version,
|
|
2528
|
+
creds_provider, refresh_fn,
|
|
2529
|
+
api_version=api_version,
|
|
2530
|
+
)
|
|
2531
|
+
except (RestClientError, SoqlParamError) as e:
|
|
2532
|
+
return _emit_fail(
|
|
2533
|
+
args, None, "AUTH_REQUIRED",
|
|
2534
|
+
error_detail=redact_error(e),
|
|
2535
|
+
start_epoch=start_epoch,
|
|
2536
|
+
)
|
|
2537
|
+
|
|
2538
|
+
if bot_info is None:
|
|
2539
|
+
# AGENT_NOT_FOUND — emit without a list-of-available-bots context.
|
|
2540
|
+
# The unbounded bot-list SELECT was removed (LIMIT-less unfiltered
|
|
2541
|
+
# query on BotDefinition). Operators can run their own SOQL if
|
|
2542
|
+
# they need to enumerate available bots.
|
|
2543
|
+
return _emit_fail(
|
|
2544
|
+
args,
|
|
2545
|
+
{"org_id_15": org_id_15},
|
|
2546
|
+
"AGENT_NOT_FOUND",
|
|
2547
|
+
error_detail=f"BotDefinition.DeveloperName '{args.agent_api_name}' not found",
|
|
2548
|
+
start_epoch=start_epoch,
|
|
2549
|
+
)
|
|
2550
|
+
|
|
2551
|
+
if bot_info.get("_version_not_found"):
|
|
2552
|
+
vers_csv = ",".join(
|
|
2553
|
+
f"{v['version']}({v['status']})" for v in bot_info.get("all_versions", [])
|
|
2554
|
+
)
|
|
2555
|
+
return _emit_fail(
|
|
2556
|
+
args,
|
|
2557
|
+
{"available_versions": vers_csv, "org_id_15": org_id_15},
|
|
2558
|
+
"AGENT_VERSION_NOT_FOUND",
|
|
2559
|
+
error_detail=f"No matching BotVersion (requested: {args.agent_version!r})",
|
|
2560
|
+
start_epoch=start_epoch,
|
|
2561
|
+
)
|
|
2562
|
+
|
|
2563
|
+
# Phase 5: cache check
|
|
2564
|
+
data_dir = build_agent_data_dir(org_id_15, args.agent_api_name, bot_info["version"])
|
|
2565
|
+
cache_dir = build_agent_cache_dir(org_id_15, args.agent_api_name, bot_info["version"])
|
|
2566
|
+
if not args.force_refresh:
|
|
2567
|
+
manifest = _cache_is_fresh(cache_dir)
|
|
2568
|
+
if manifest is not None:
|
|
2569
|
+
return _emit_cache_hit(
|
|
2570
|
+
args, data_dir, cache_dir, manifest,
|
|
2571
|
+
start_epoch=start_epoch,
|
|
2572
|
+
org_id_15=org_id_15,
|
|
2573
|
+
org_id_18=org_id_18,
|
|
2574
|
+
)
|
|
2575
|
+
|
|
2576
|
+
# Phase 6: Wave A — 7 queries, DAG-ordered parallel layers. A1 now
|
|
2577
|
+
# takes (agent_api_name, version) and resolves the canonical planner
|
|
2578
|
+
# DeveloperName from the live chain naming invariant (v1 = <Agent>,
|
|
2579
|
+
# vN = <Agent>...%\_vN); the row's DeveloperName becomes the
|
|
2580
|
+
# authoritative `planner_name` for finalize/render downstream.
|
|
2581
|
+
try:
|
|
2582
|
+
wave_a = _run_wave_a(
|
|
2583
|
+
args.agent_api_name, bot_info["version"],
|
|
2584
|
+
creds_provider, refresh_fn,
|
|
2585
|
+
api_version=api_version,
|
|
2586
|
+
parallelism=args.parallelism,
|
|
2587
|
+
)
|
|
2588
|
+
except (RestClientError, SoqlParamError) as e:
|
|
2589
|
+
return _emit_fail(
|
|
2590
|
+
args, None, "RETRIEVE_FAILED",
|
|
2591
|
+
error_detail=f"wave-a-failed:{redact_error(e)}",
|
|
2592
|
+
start_epoch=start_epoch,
|
|
2593
|
+
)
|
|
2594
|
+
|
|
2595
|
+
if wave_a is None:
|
|
2596
|
+
return _emit_fail(
|
|
2597
|
+
args, {"org_id_15": org_id_15},
|
|
2598
|
+
"AGENT_NOT_FOUND",
|
|
2599
|
+
error_detail=(
|
|
2600
|
+
f"GenAiPlannerDefinition chain not found for "
|
|
2601
|
+
f"agent={args.agent_api_name!r} version={bot_info['version']!r}"
|
|
2602
|
+
),
|
|
2603
|
+
start_epoch=start_epoch,
|
|
2604
|
+
)
|
|
2605
|
+
|
|
2606
|
+
# Phase 7: join Wave A → bundle-shaped dict
|
|
2607
|
+
bundle_parsed = _join_wave_a_to_bundle(bot_info, wave_a)
|
|
2608
|
+
|
|
2609
|
+
# Phase 8: Wave B — body fetches
|
|
2610
|
+
try:
|
|
2611
|
+
wave_b = _run_wave_b(
|
|
2612
|
+
bundle_parsed,
|
|
2613
|
+
creds_provider, refresh_fn,
|
|
2614
|
+
api_version=api_version,
|
|
2615
|
+
org_alias=args.org_alias,
|
|
2616
|
+
parallelism=args.parallelism,
|
|
2617
|
+
)
|
|
2618
|
+
except (RestClientError, SoqlParamError) as e:
|
|
2619
|
+
return _emit_fail(
|
|
2620
|
+
args, None, "RETRIEVE_FAILED",
|
|
2621
|
+
error_detail=f"wave-b-failed:{redact_error(e)}",
|
|
2622
|
+
start_epoch=start_epoch,
|
|
2623
|
+
)
|
|
2624
|
+
|
|
2625
|
+
# Phase 8.5: iterative Wave B — follow subflow + apex refs from fetched
|
|
2626
|
+
# Flow.Metadata bodies until fixed-point. Without this pass, shared
|
|
2627
|
+
# utility flows (handleFlowFault) and nested subflows ship as empty
|
|
2628
|
+
# leaves even though their bodies are reachable via Tooling API.
|
|
2629
|
+
# Iteration cap safeguards against pathological flow graphs.
|
|
2630
|
+
try:
|
|
2631
|
+
wave_b = _iterate_wave_b(
|
|
2632
|
+
wave_b,
|
|
2633
|
+
creds_provider, refresh_fn,
|
|
2634
|
+
api_version=api_version,
|
|
2635
|
+
org_alias=args.org_alias,
|
|
2636
|
+
parallelism=args.parallelism,
|
|
2637
|
+
max_iterations=5,
|
|
2638
|
+
)
|
|
2639
|
+
except (RestClientError, SoqlParamError) as e:
|
|
2640
|
+
return _emit_fail(
|
|
2641
|
+
args, None, "RETRIEVE_FAILED",
|
|
2642
|
+
error_detail=f"wave-b-iter-failed:{redact_error(e)}",
|
|
2643
|
+
start_epoch=start_epoch,
|
|
2644
|
+
)
|
|
2645
|
+
|
|
2646
|
+
# Surface Wave-A layer-2/3 task failures alongside Wave-B's so the
|
|
2647
|
+
# downstream `_run_parse_wave` sweep folds them into `tree["_unresolved"]`
|
|
2648
|
+
# and `_partial_reason` flips to PARTIAL_OK.
|
|
2649
|
+
wave_a_unresolved = wave_a.get("unresolved") or []
|
|
2650
|
+
if wave_a_unresolved:
|
|
2651
|
+
wave_b["unresolved"] = [*wave_a_unresolved, *(wave_b.get("unresolved") or [])]
|
|
2652
|
+
|
|
2653
|
+
# normalize Flow-ID InvocationTargets → DeveloperName.
|
|
2654
|
+
# Classic ReAct bots occasionally store NGA-style 300Uv-prefix Flow IDs
|
|
2655
|
+
# in GenAiFunctionDefinition.InvocationTarget (observed in one real-org
|
|
2656
|
+
# benchmark run, 6 flows out of 6). Wave B's fetch_flow_definition_by_ids
|
|
2657
|
+
# successfully resolves them, but the resolved DeveloperName never
|
|
2658
|
+
# propagates back into bundle_parsed — so parse_wave sees the raw ID as
|
|
2659
|
+
# the flow's api_name, which never matches visited["FLOW"] (keyed on
|
|
2660
|
+
# DeveloperName), and every such flow ends up in _pending_fetches.
|
|
2661
|
+
# Result: PARTIAL_OK on what should be OK, plus unreadable Flow IDs in
|
|
2662
|
+
# rendered architecture.md.
|
|
2663
|
+
#
|
|
2664
|
+
# Fix: rewrite bundle_parsed's action invocationTarget in-place from
|
|
2665
|
+
# ID → DeveloperName using wave_b["flow_def_rows"] (both the IN-by-names
|
|
2666
|
+
# and the IN-by-ids branches populate it). Unresolved IDs (Flow not
|
|
2667
|
+
# found in the org) stay as-is and will land in _pending_fetches as
|
|
2668
|
+
# intended (they really are unresolved).
|
|
2669
|
+
_normalize_flow_id_targets(bundle_parsed, wave_b["flow_def_rows"])
|
|
2670
|
+
|
|
2671
|
+
# Bug 1 fix (2026-05-05): analogous rewrite for GenAiPromptTemplate Ids.
|
|
2672
|
+
# Wave B's prompt-template Id fetch resolves 0hf-prefix Ids to
|
|
2673
|
+
# DeveloperNames; without this rewrite the bundle would enqueue the
|
|
2674
|
+
# raw Id into _pending_fetches.PROMPT_TEMPLATE and the downstream
|
|
2675
|
+
# Metadata retrieve would never match.
|
|
2676
|
+
_normalize_prompt_template_id_targets(
|
|
2677
|
+
bundle_parsed, wave_b.get("prompt_template_id_rows") or [],
|
|
2678
|
+
)
|
|
2679
|
+
|
|
2680
|
+
# Gap B fix (2026-05-05): analogous rewrite for ApexClass Ids.
|
|
2681
|
+
# Wave B's fetch_apex_bodies_by_ids resolves 01p-prefix Ids to ApexClass
|
|
2682
|
+
# Name; without this rewrite the bundle would enqueue the raw Id into
|
|
2683
|
+
# _pending_fetches.APEX and the tree would render the bare Id instead
|
|
2684
|
+
# of the class name.
|
|
2685
|
+
_normalize_apex_id_targets(
|
|
2686
|
+
bundle_parsed, wave_b.get("apex_rows") or [],
|
|
2687
|
+
)
|
|
2688
|
+
|
|
2689
|
+
# Gap C fix (2026-05-05): retrieve GenAiPromptTemplate bodies.
|
|
2690
|
+
# GenAiPromptTemplate is NOT SOQL-queryable (Tooling or Data API). The
|
|
2691
|
+
# only way to fetch the body is `sf project retrieve start
|
|
2692
|
+
# --metadata GenAiPromptTemplate:<name>,...`. After
|
|
2693
|
+
# _normalize_prompt_template_id_targets has rewritten 0hf-Ids to
|
|
2694
|
+
# DeveloperNames, collect the names and retrieve in a single sf
|
|
2695
|
+
# subprocess call. The resulting bodies get stashed on wave_b so
|
|
2696
|
+
# _run_parse_wave can stamp them onto PROMPT_TEMPLATE leaves (parallel
|
|
2697
|
+
# to the Apex/Flow signature stamping pattern).
|
|
2698
|
+
prompt_template_names = _collect_prompt_template_names(bundle_parsed)
|
|
2699
|
+
prompt_template_bodies: dict[str, dict] = {}
|
|
2700
|
+
if prompt_template_names:
|
|
2701
|
+
try:
|
|
2702
|
+
prompt_template_bodies = retrieve_prompt_templates(
|
|
2703
|
+
args.org_alias,
|
|
2704
|
+
sorted(prompt_template_names),
|
|
2705
|
+
work_dir,
|
|
2706
|
+
)
|
|
2707
|
+
except AuthRequired:
|
|
2708
|
+
raise
|
|
2709
|
+
except SfCliError as e:
|
|
2710
|
+
wave_b.setdefault("unresolved", []).append({
|
|
2711
|
+
"kind": "PROMPT_TEMPLATE",
|
|
2712
|
+
"reason": f"prompt-template-retrieve-failed:{redact_error(e)}",
|
|
2713
|
+
})
|
|
2714
|
+
wave_b["prompt_template_bodies"] = prompt_template_bodies
|
|
2715
|
+
|
|
2716
|
+
# Phase 9: parse_wave -> declared_action_tree.json
|
|
2717
|
+
try:
|
|
2718
|
+
tree = _run_parse_wave(bot_info, bundle_parsed, wave_b, args, work_dir)
|
|
2719
|
+
except (OSError, KeyError) as e:
|
|
2720
|
+
return _emit_fail(
|
|
2721
|
+
args, None, "WRITE_FAILED",
|
|
2722
|
+
error_detail=f"parse-wave-failed:{redact_error(e)}",
|
|
2723
|
+
start_epoch=start_epoch,
|
|
2724
|
+
)
|
|
2725
|
+
|
|
2726
|
+
# Phase 10: render architecture.md — invoked inline from _run_finalize
|
|
2727
|
+
# so the write lands in the same staging dir as the tree JSON and
|
|
2728
|
+
# participates in the atomic _swap_dir_atomic below. See P2.2-1.
|
|
2729
|
+
|
|
2730
|
+
# Flow-nested prompt-template catch-up (2026-05-05). The bundle-scoped
|
|
2731
|
+
# retrieve at step 1 above only covers prompt templates declared as
|
|
2732
|
+
# top-level topic/planner InvocationTargets. Templates referenced from
|
|
2733
|
+
# inside a Flow (via a `generatePromptResponse` actionCall) are
|
|
2734
|
+
# discovered during parse_wave's BFS of flow XML — too late for the
|
|
2735
|
+
# first retrieve. Without this second pass their `_body_available`
|
|
2736
|
+
# stays False and the md renders `_Body not retrieved._` with no
|
|
2737
|
+
# PARTIAL flag (silent content loss). `_stamp_prompt_template_bodies`
|
|
2738
|
+
# is idempotent, so re-stamping already-stamped leaves is safe.
|
|
2739
|
+
flow_nested_names: set[str] = set()
|
|
2740
|
+
_collect_flow_nested_prompt_template_names(
|
|
2741
|
+
tree["root"], prompt_template_bodies, flow_nested_names,
|
|
2742
|
+
)
|
|
2743
|
+
if flow_nested_names:
|
|
2744
|
+
try:
|
|
2745
|
+
more_bodies = retrieve_prompt_templates(
|
|
2746
|
+
args.org_alias,
|
|
2747
|
+
sorted(flow_nested_names),
|
|
2748
|
+
work_dir,
|
|
2749
|
+
)
|
|
2750
|
+
except AuthRequired:
|
|
2751
|
+
raise
|
|
2752
|
+
except SfCliError as e:
|
|
2753
|
+
tree.setdefault("_unresolved", []).append({
|
|
2754
|
+
"kind": "PROMPT_TEMPLATE",
|
|
2755
|
+
"reason": f"prompt-template-retrieve-failed:{redact_error(e)}",
|
|
2756
|
+
})
|
|
2757
|
+
else:
|
|
2758
|
+
prompt_template_bodies.update(more_bodies)
|
|
2759
|
+
_stamp_prompt_template_bodies(tree["root"], prompt_template_bodies)
|
|
2760
|
+
# _kind_counts / _pending_fetches are unchanged: the leaves
|
|
2761
|
+
# already existed and were counted; this pass only attaches
|
|
2762
|
+
# body content to them. No BFS-kind reshuffling needed.
|
|
2763
|
+
|
|
2764
|
+
# Phase 11: finalize. The canonical planner_name now comes from the
|
|
2765
|
+
# resolved planner row (Wave A), which joins into bundle_parsed as
|
|
2766
|
+
# `plannerName`; fall back to the agent api name if the resolver
|
|
2767
|
+
# returned a row without a DeveloperName (shouldn't happen on a
|
|
2768
|
+
# healthy planner but keeps finalize's _partial flag well-defined).
|
|
2769
|
+
planner_name = bundle_parsed.get("plannerName") or args.agent_api_name
|
|
2770
|
+
try:
|
|
2771
|
+
_run_finalize(
|
|
2772
|
+
data_dir, cache_dir, tree, work_dir,
|
|
2773
|
+
args.agent_api_name, bot_info["version"],
|
|
2774
|
+
planner_name,
|
|
2775
|
+
)
|
|
2776
|
+
except OSError as e:
|
|
2777
|
+
return _emit_fail(
|
|
2778
|
+
args, None, "WRITE_FAILED",
|
|
2779
|
+
error_detail=f"finalize-failed:{redact_error(e)}",
|
|
2780
|
+
start_epoch=start_epoch,
|
|
2781
|
+
)
|
|
2782
|
+
|
|
2783
|
+
# Phase 12: emit RESULT
|
|
2784
|
+
return _emit_ok(
|
|
2785
|
+
args, data_dir, tree, bot_info, org_id_15,
|
|
2786
|
+
start_epoch=start_epoch,
|
|
2787
|
+
cache_dir=cache_dir,
|
|
2788
|
+
org_id_18=org_id_18,
|
|
2789
|
+
)
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
def main(argv: list[str] | None = None) -> int:
|
|
2793
|
+
"""Entry point — parses args, runs pipeline, guarantees a RESULT block.
|
|
2794
|
+
|
|
2795
|
+
the skill contract promises that every exit
|
|
2796
|
+
path emits `=== RESULT ===` with a structured STATUS. The prior
|
|
2797
|
+
implementation let any uncaught exception from the pipeline (e.g.
|
|
2798
|
+
the HTTP 405 from , or any future bug we haven't foreseen)
|
|
2799
|
+
propagate to the top of the process — the user saw a Python
|
|
2800
|
+
traceback on stderr and the wrapper skill never got its RESULT
|
|
2801
|
+
block. We now wrap `_run_pipeline` in a broad `except Exception` and
|
|
2802
|
+
funnel uncaught failures through `_emit_fail` with
|
|
2803
|
+
STATUS=RETRIEVE_FAILED + ERROR_DETAIL="uncaught-exception: <redacted
|
|
2804
|
+
message>". `redact_error` keeps tokens / full-URL querystrings out
|
|
2805
|
+
of the ctx file. `SystemExit` + `KeyboardInterrupt` are NOT caught —
|
|
2806
|
+
argparse's `--help` path + Ctrl-C must propagate normally.
|
|
2807
|
+
"""
|
|
2808
|
+
args = parse_args(argv)
|
|
2809
|
+
# MUST happen before any pipeline phase reads DATA_ROOT / CACHE_ROOT.
|
|
2810
|
+
# See _apply_path_overrides docstring for the 3-level rebind contract.
|
|
2811
|
+
_apply_path_overrides(args)
|
|
2812
|
+
# Bug fix (2026-05-05): capture start_epoch ONCE at real pipeline entry
|
|
2813
|
+
# and thread it through every _emit_* call so WALL_TIME_SECONDS measures
|
|
2814
|
+
# actual pipeline duration, not ctx-write→emit_result drift.
|
|
2815
|
+
start_epoch = time.time()
|
|
2816
|
+
try:
|
|
2817
|
+
return _run_pipeline(args, start_epoch)
|
|
2818
|
+
except Exception as exc:
|
|
2819
|
+
# broad catch — anything that reaches here is a bug
|
|
2820
|
+
# but the skill contract requires a structured exit. redact_error
|
|
2821
|
+
# strips bearer tokens and accessToken values from the message
|
|
2822
|
+
# ; the exception class name leads the detail so triage
|
|
2823
|
+
# can still identify the shape even when the message is terse.
|
|
2824
|
+
redacted = redact_error(exc)
|
|
2825
|
+
return _emit_fail(
|
|
2826
|
+
args,
|
|
2827
|
+
None,
|
|
2828
|
+
"RETRIEVE_FAILED",
|
|
2829
|
+
error_detail=f"uncaught-exception: {redacted}",
|
|
2830
|
+
start_epoch=start_epoch,
|
|
2831
|
+
)
|
|
2832
|
+
|
|
2833
|
+
|
|
2834
|
+
if __name__ == "__main__":
|
|
2835
|
+
sys.exit(main())
|