Skip to content
Tuxedo CatSTUDIO
Menu

FrameLocalParticipantBindings

Review draft. This source page has not completed website editorial and release-specific verification.

# Frame-Local Participant Bindings

Each active Dialogue call frame owns the participant bindings for its Dialogue Definition. The root frame receives the bindings supplied to BeginConversationSession. Participant lookup reads only the current frame; it never searches caller frames.

SubDialogue payloads can explicitly project participant objects into a child frame. Each mapping is authored as callee role <- caller role. The caller role is resolved in the immediate current frame, and its exact UObject is bound to the selected callee role in the child frame. Unmapped callee roles remain unbound. Every authored mapping must resolve its caller role to an active binding before the child frame is committed.

Mappings are definition-local stable role identities. Display-name equality, matching IDs across definitions, role order, and likely participant types do not create implicit mappings. Independent clone remaps caller-side role references to cloned roles and preserves the external callee-side role reference.

Nested calls resolve against the immediate caller frame. Popping a child frame restores the caller’s original bindings automatically. The existing ContextKey inheritance and history identity behavior are unchanged.

The canonical V1 typed interchange field is participantRoleMappings, an array of objects containing calleeRoleId and callerRoleId. Both values use the existing structural role identity object (stableId and guid). An empty array is valid. Schema version remains 1.

Runtime snapshots preserve active frame order, navigation state, and the stable identities of root roles that had bindings. They never serialize participant UObject references, weak target identity, or runtime object paths. Active restore is two-phase: Dialogue first restores the semantic stack, then reports RestoredNeedsParticipantRebind when bound root roles must be supplied again. Until root rebinding succeeds, execution and evaluation are blocked while read-only session inspection remains available.

Gameplay supplies only root participant bindings through ReplaceActiveConversationParticipantBindings or ReplaceActiveConversationParticipantObjectBindings. Dialogue transactionally rebuilds all child frame bindings by replaying each saved caller SubDialogue node’s explicit mappings through the immediate parent frame. A missing required root role or an unreplayable nested mapping rejects the replacement without changing any frame. Live root binding replacement uses the same reprojection path. If no root roles were bound and the nested stack has no mapping requiring a binding, restore completes without a meaningless empty rebind call.

When the canonical Dialogue.SaveGame integration is installed, DirectorBridge registers the Dialogue contributor and SaveGame Director transports the Dialogue-owned snapshot through its normal save/load workflow. Dialogue owns snapshot validation and restore semantics. A structurally valid active snapshot can restore as RestoredNeedsParticipantRebind; Dialogue keeps execution blocked until gameplay supplies the required root objects, then reprojects nested frames. No participant object identity is serialized. DialogueDirectorSaveGameDirectorBridge is retired and removed.

The caller SubDialogue node identity already stored on each child frame provides exact callsite provenance; no additional snapshot provenance field is needed. Save Director transports the Dialogue snapshot only. Gameplay remains responsible for supplying live root objects before an active restored conversation resumes.

Skill consumers use these same frame-local bindings. At runtime, Dialogue resolves the selected role in the current frame and passes its Actor to the optional Skill query or mutation bridge. Skill values and Skill Director state are not stored in participant bindings or Dialogue snapshots.