***

title: Bridge (Validation)
description: 'API-backed action validation, presets, and rulesets'
slug: ue/bridge
---------------

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<FBridgeRule> Rules = SDKOps::BridgeRules(Store);
TArray<FDirectiveRuleSet> Rulesets = SDKOps::RulesList(Store);
TArray<FString> 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)`
