> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.forboc.ai/ue/bridge/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.forboc.ai/_mcp/server. # Bridge (Validation) > API-backed action validation, presets, and rulesets Bridge behavior in the UE plugin mirrors the core SDK bridge slice: validation requests go to the API, and the plugin caches validation state, active presets, and available rulesets in `BridgeSlice`. ## Core Types ```cpp USTRUCT(BlueprintType) struct FBridgeValidationContext { UPROPERTY(BlueprintReadOnly) FString NpcStateJson; UPROPERTY(BlueprintReadOnly) FString WorldStateJson; UPROPERTY(BlueprintReadOnly) FString ConstraintsJson; }; USTRUCT(BlueprintType) struct FValidationResult { UPROPERTY(BlueprintReadOnly) bool bValid; UPROPERTY(BlueprintReadOnly) FString Reason; UPROPERTY(BlueprintReadOnly) FAgentAction CorrectedAction; }; ``` `FBridgeRule` and `FDirectiveRuleSet` mirror the API-facing rule metadata returned by the current backend. ## Validate An Action ```cpp #include "RuntimeStore.h" #include "RuntimeConfig.h" #include "CLI/CliOperations.h" auto Store = createSDKStore(); SDKConfig::SetApiConfig(TEXT("https://api.forboc.ai"), ApiKey); FAgentAction Action = TypeFactory::Action(TEXT("OPEN_GATE"), TEXT("north_gate")); Action.PayloadJson = TEXT("{\"gateId\":\"north_gate\"}"); FBridgeValidationContext Context; Context.NpcStateJson = TEXT("{\"alertLevel\":0}"); Context.WorldStateJson = TEXT("{\"curfew\":false}"); FValidationResult Result = SDKOps::ValidateBridge(Store, Action, Context); ``` ## Rules And Presets Use the bridge thunks or the synchronous wrappers to inspect server-side rules: ```cpp TArray Rules = SDKOps::BridgeRules(Store); TArray Rulesets = SDKOps::RulesList(Store); TArray PresetIds = SDKOps::RulesPresets(Store); FDirectiveRuleSet Preset = SDKOps::BridgePreset(Store, TEXT("rpg")); ``` To register or delete a ruleset: ```cpp FDirectiveRuleSet Ruleset; Ruleset.Id = TEXT("market-curfew"); Ruleset.RulesetId = TEXT("market-curfew"); SDKOps::RulesRegister(Store, Ruleset); SDKOps::RulesDelete(Store, TEXT("market-curfew")); ``` ## Slice Behavior The current slice tracks: * `LastValidation` * `Status` * `Error` * `ActivePresets` * `AvailableRulesets` * `AvailablePresetIds` `ClearBridgeValidation` only clears the last validation/status/error fields. It does not wipe cached presets or rulesets. ## Direct Thunks If you want parity with `packages/core`, dispatch: * `rtk::validateBridgeThunk(Action, Context, NpcId)` * `rtk::getBridgeRulesThunk()` * `rtk::loadBridgePresetThunk(PresetName)` * `rtk::listRulesetsThunk()` * `rtk::listRulePresetsThunk()` * `rtk::registerRulesetThunk(Ruleset)` * `rtk::deleteRulesetThunk(RulesetId)` > API-backed action validation, presets, and rulesets