@lovelace_lol/polymer 0.0.9 → 0.0.11

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/dist/index.d.ts CHANGED
@@ -197,14 +197,14 @@ export interface HairPhysicsProfileConfig {
197
197
  impulseClipDuration?: number;
198
198
  direction?: { yawSign?: 1 | -1; pitchSign?: 1 | -1 };
199
199
  morphTargets?: {
200
- swayLeft?: HairMorphTargetMapping;
201
- swayRight?: HairMorphTargetMapping;
202
- swayFront?: HairMorphTargetMapping;
203
- fluffRight?: HairMorphTargetMapping;
204
- fluffBottom?: HairMorphTargetMapping;
205
- headUp?: Record<string, HairMorphTargetValueMapping>;
206
- headDown?: Record<string, HairMorphTargetValueMapping>;
207
- };
200
+ swayLeft?: HairMorphTargetMapping | null;
201
+ swayRight?: HairMorphTargetMapping | null;
202
+ swayFront?: HairMorphTargetMapping | null;
203
+ fluffRight?: HairMorphTargetMapping | null;
204
+ fluffBottom?: HairMorphTargetMapping | null;
205
+ headUp?: Record<string, HairMorphTargetValueMapping | null> | null;
206
+ headDown?: Record<string, HairMorphTargetValueMapping | null> | null;
207
+ } | null;
208
208
  }
209
209
 
210
210
  export type VRMHumanoidRole =
@@ -369,13 +369,6 @@ export interface Profile {
369
369
  annotationRegions?: Region[];
370
370
  disabledRegions?: string[];
371
371
  hairPhysics?: HairPhysicsProfileConfig;
372
- gazeCalibration?: {
373
- head?: { opticalAxis?: PolymerVector3 };
374
- leftEye?: { opticalAxis?: PolymerVector3 };
375
- rightEye?: { opticalAxis?: PolymerVector3 };
376
- /** Authored model coordinate units per physical meter, before root scaling. */
377
- modelUnitsPerMeter?: number;
378
- };
379
372
  humanoidCharacterization?: HumanoidCharacterization;
380
373
  /** Authored overrides may patch individual fields; null removes a preset control. */
381
374
  bodyControls?: Record<string, Partial<BodyControlDefinition> | null>;
@@ -488,8 +481,6 @@ export interface ModelAnalysisReport { model: ModelData; validation?: Validation
488
481
 
489
482
  export interface AnnotationLaterality { leftSideX: 1 | -1; confidence: number; evidence: string[]; }
490
483
  export interface BoneResolutionProfile { bonePrefix?: string; boneSuffix?: string; boneNodes?: Record<string, string>; suffixPattern?: string; }
491
- export interface CameraRelativeGazeOffset { x: number; y: number; }
492
- export interface CameraRelativeGazeOptions { yawWeight?: number; pitchWeight?: number; epsilon?: number; }
493
484
  export interface MarkerEndpointSeparationOptions { starts: ArrayLike<number>; ends: ArrayLike<number>; modelCenter: { x: number; y: number; z: number }; modelHeight: number; }
494
485
 
495
486
  export interface HumanoidSkeletonTemplateBone { readonly name: string; readonly parent: string | null; readonly translation: HumanoidSkeletonTemplateVec3; }
@@ -509,7 +500,7 @@ export interface CharacterHostCharacterOptions extends CharacterModelTransform {
509
500
  export interface CharacterHostExternalScene { scene: Scene; renderer: CharacterSceneRenderer; backend?: CharacterSceneBackend; rendering?: CharacterSceneRenderingController; camera: Camera; mountCanvas?: boolean; manageResize?: boolean; }
510
501
  /** Cancellation applies only until creation resolves; dispose the resolved host explicitly. */
511
502
  export interface CharacterHostOptions { signal?: AbortSignal; container: HTMLElement; character: CharacterHostCharacterOptions; embody?: RustEmbodyHostConfig; scene?: Omit<DefaultCharacterSceneAsyncOptions, 'signal'>; external?: CharacterHostExternalScene; loader?: CharacterModelLoadOptions; autoStart?: boolean; renderLoop?: boolean; autoFrame?: boolean; }
512
- export interface CharacterHost { engine: Embody; scene: Scene; readonly renderer: CharacterSceneRenderer; readonly backend: CharacterSceneBackend | null; readonly rendering: CharacterSceneRenderingController | null; camera: Camera | PerspectiveCamera; model: Object3D; meshes: Mesh[]; animations: AnimationClip[]; lighting: DefaultCharacterLightingController | null; ownsScene: boolean; container: HTMLElement; setCharacter(character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions): Promise<void>; resize(): void; dispose(): Promise<void>; }
503
+ export interface CharacterHost { engine: Embody; scene: Scene; readonly renderer: CharacterSceneRenderer | null; readonly backend: CharacterSceneBackend | null; readonly rendering: CharacterSceneRenderingController | null; camera: Camera | PerspectiveCamera; model: Object3D; meshes: Mesh[]; animations: AnimationClip[]; lighting: DefaultCharacterLightingController | null; ownsScene: boolean; container: HTMLElement; setCharacter(character: CharacterHostCharacterOptions, loader?: CharacterModelLoadOptions): Promise<void>; resize(): void; dispose(): Promise<void>; }
513
504
 
514
505
  export interface CharacterRegistry { characters: CharacterConfig[]; defaultCharacter?: string; }
515
506
  export type AnimationSource = 'baked' | 'clip' | 'snippet';
@@ -612,11 +603,8 @@ export interface WasmRuntimeCore {
612
603
  get_viseme(index: number): number;
613
604
  get_viseme_jaw_scale(index: number): number;
614
605
  set_viseme_slot_count(count: number): void;
615
- transition_au(id: number, to: number, durationMs: number, balance: number): void;
616
- transition_viseme(index: number, to: number, durationMs: number, jawScale: number): void;
617
- update(dtSeconds: number): number;
618
- active_transition_count(): number;
619
- clear_transitions(): void;
606
+ build_live_clip(name: string, durationSec: number): string;
607
+ build_live_release_clip(name: string, previousClipJSON: string, durationSec: number): string;
620
608
  clear(): void;
621
609
  evaluate_morph_frame_delta(): Float32Array;
622
610
  evaluate_bone_frame_delta(): Float32Array;
@@ -654,19 +642,6 @@ export interface EmbodyCoreWasmModule {
654
642
  manualScale: number,
655
643
  manualTranslation: Float32Array
656
644
  ): Float32Array;
657
- solve_profile_screen_space_gaze(
658
- profileJson: string,
659
- screenTarget: Float32Array,
660
- cameraPosition: Float32Array,
661
- cameraQuaternion: Float32Array,
662
- gazeOrigin: Float32Array,
663
- modelQuaternion: Float32Array,
664
- verticalFovDegrees: number,
665
- aspect: number,
666
- eyesEnabled: boolean,
667
- headEnabled: boolean,
668
- headFollowFraction: number
669
- ): Float32Array;
670
645
  default_hair_physics_config_values(): Float32Array;
671
646
  list_presets(): string[];
672
647
  has_preset(presetId: string): boolean;
@@ -701,13 +676,11 @@ export type RustEmbodyHostConfig =
701
676
  };
702
677
 
703
678
  /**
704
- * Polymer's CLJS-owned character runtime contract.
705
- *
706
- * Rust owns profile intake and frame evaluation. The remaining methods are the
707
- * public Three.js and AnimationMixer capabilities consumed by application
708
- * hosts; no concrete TypeScript Embody class is implied.
679
+ * Public character controls implemented by Embody's Three.js connector.
680
+ * Rust compiles clips; the existing Three renderer advances native playback.
709
681
  */
710
682
  export interface PolymerCharacterRuntime {
683
+ readonly model: Object3D | undefined;
711
684
  readonly meshes: unknown[];
712
685
  readonly meshByName: Map<string, unknown>;
713
686
  readonly bones: Record<string, unknown>;
@@ -734,7 +707,7 @@ export interface PolymerCharacterRuntime {
734
707
  applySemanticPose(pose: SemanticPose): void;
735
708
  validateSemanticAnimation(animation: SemanticAnimation, options?: SemanticAnimationOptions): void;
736
709
  semanticAnimationToClip(name: string, animation: SemanticAnimation, options?: SemanticAnimationOptions): AnimationPlaybackHandle;
737
- /** Reset configured body actions atomically and apply one procedural frame. */
710
+ /** Reset configured body actions atomically; the next native mixer frame applies the pose. */
738
711
  resetBodyControls(): void;
739
712
  setContinuum(negAU: number, posAU: number, value: number, balance?: number): void;
740
713
  getContinuum(negAU: number, posAU: number): number;
@@ -746,7 +719,7 @@ export interface PolymerCharacterRuntime {
746
719
  /** Canonical direct jaw scale; unset, cleared or out-of-range slots return 1. */
747
720
  getVisemeJawScale(index: number): number;
748
721
  setVisemeById(slotId: string, value: number, jawScale?: number): void;
749
- /** Mixer-timed live control; defaults to 80 ms. getViseme reports the sampled direct value. */
722
+ /** Mixer-timed live control; defaults to 80 ms. getViseme reports its destination immediately. */
750
723
  transitionViseme(index: number, to: number, durationMs?: number, jawScale?: number): TransitionHandle;
751
724
  transitionVisemeById(slotId: string, to: number, durationMs?: number, jawScale?: number): TransitionHandle;
752
725
  setAUMixWeight(id: number, weight: number): void;
@@ -792,7 +765,6 @@ export interface PolymerCharacterRuntime {
792
765
  setHairPhysicsConfig(config: HairPhysicsRuntimeConfigUpdate): void;
793
766
  getHairPhysicsConfig(): HairPhysicsRuntimeConfig;
794
767
  validateHairMorphTargets(): string[];
795
- updateHairPhysics(dtSeconds: number): void;
796
768
  loadAnimationClips(clips: unknown[]): void;
797
769
  /**
798
770
  * Register additional baked sources on a bound model without starting clips
@@ -824,13 +796,6 @@ export interface PolymerCharacterRuntime {
824
796
  options?: Record<string, unknown>
825
797
  ): AnimationPlaybackHandle;
826
798
  cleanupSnippet(name: string): void;
827
- /** Read-only seed for gaze motor controls in the current evaluated pose. */
828
- getGazeControlState(options?: { worldTarget?: PolymerVector3; headIntensity?: number; eyeIntensity?: number }): GazeControlState | null;
829
- /** Last evaluated optical-ray diagnostics; null without active focus controls. */
830
- getGazeFocusDiagnostics(): GazeFocusDiagnostics | null;
831
- /** Fresh immutable copy of the last positive-dt pose update; polling does not renew its stamp. */
832
- getGazeObservation(): GazeObservation | null;
833
- update(dtSeconds: number): void;
834
799
  start(): void;
835
800
  stop(): void;
836
801
  clear(): void;
@@ -838,7 +803,18 @@ export interface PolymerCharacterRuntime {
838
803
  dispose(): void;
839
804
  }
840
805
 
841
- export interface AnimationPlaybackHandle extends TransitionHandle {
806
+ export interface AnimationPlaybackEvent {
807
+ type: 'completed' | 'cancelled' | 'error';
808
+ handle: string;
809
+ actionId?: string;
810
+ clipName?: string;
811
+ reason?: string;
812
+ message?: string;
813
+ }
814
+
815
+ export interface AnimationPlaybackHandle extends Omit<TransitionHandle, 'promise'> {
816
+ promise: Promise<AnimationPlaybackEvent>;
817
+ finished: Promise<AnimationPlaybackEvent>;
842
818
  name: string;
843
819
  actionId?: string;
844
820
  play(): AnimationPlaybackHandle;
@@ -856,6 +832,8 @@ export declare class Embody {
856
832
  [key: string]: any;
857
833
  }
858
834
 
835
+ export declare function createScenePlaybackFrame(scene: Object3D, document?: Document): { onFrame(timestamp?: number): void; dispose(): void };
836
+
859
837
  export declare function createRustEmbodyHost(
860
838
  model: unknown,
861
839
  config?: RustEmbodyHostConfig
@@ -910,17 +888,9 @@ export declare function resolveBoneAxisChannel(profile: Profile, boneName: strin
910
888
  export declare function resolveBoneNameForNodeKey(profile: Profile, nodeKey: string): string | null;
911
889
  export declare function resolveContinuumDisplayLabel(profile: Pick<Profile, 'continuumPairs' | 'continuumLabels' | 'auInfo' | 'boneNodes' | 'bonePrefix' | 'boneSuffix'>, negativeAuId: number, positiveAuId: number): string;
912
890
  export declare function stripConfiguredBoneAffixes(profile: { bonePrefix?: string; boneSuffix?: string } | null | undefined, boneName: string): string;
913
- export declare function computeCameraRelativeGazeOffset(model: Object3D | null, cameraPosition: { x: number; y: number; z: number }, targetPosition: { x: number; y: number; z: number }, options?: CameraRelativeGazeOptions): CameraRelativeGazeOffset;
914
- export declare function solveScreenSpaceGaze(options: ScreenSpaceGazeOptions): ScreenSpaceGazeSolution;
915
- export declare function createEmbodyGazeRuntime(
916
- profileProvider: Profile | (() => Profile),
917
- host?: Pick<PolymerCharacterRuntime, 'getGazeControlState'>
918
- ): EmbodyGazeRuntime;
919
891
  export declare function fuzzyNameMatch(objectName: string, targetName: string, suffixPattern?: string): boolean;
920
892
  export declare function getMeshNamesForAUProfile(profile: Profile, auId: number): string[];
921
- export declare function hasLeftRightMorphs(auId: number): boolean;
922
893
  export declare function hasLeftRightMorphs(profile: Profile, auId: number): boolean;
923
- export declare function isMixedAU(auId: number): boolean;
924
894
  export declare function isMixedAU(profile: Profile, auId: number): boolean;
925
895
  export declare function resolveBoneNames(names: string[] | undefined, profile?: BoneResolutionProfile): string[];
926
896
  /** All 55 VRM 1.0 roles, including required flags and optional-parent rules. */
@@ -932,8 +902,6 @@ export declare function setAUMorphTargets(profile: Profile, auId: number, side:
932
902
  export declare function resolveHumanoidCharacterization(profile: Profile): HumanoidCharacterizationResolution;
933
903
  /** With a model, reports missing bone/morph targets against the actual scene. */
934
904
  export declare function getBodyControls(profile: Profile, model?: Object3D): BodyControlDescriptor[];
935
- export declare function resolveCharacterGazeOrigin(model: Object3D, profile?: Profile | null): Vector3 | null;
936
- export declare const CC4_BONES: Record<string, string>;
937
905
  export declare const VISEME_KEYS: string[];
938
906
  export declare const HAIR_COLOR_PRESETS: Record<string, HairColorAppearance>;
939
907
  export declare const DEFAULT_HAIR_COLOR_APPEARANCE: HairColorAppearance;
@@ -984,409 +952,12 @@ export interface BlinkState {
984
952
 
985
953
  export type BlinkAgencyConfig = Partial<Omit<BlinkState, 'agency'>>;
986
954
 
987
- export interface GazeTarget {
955
+ export interface PerceptionTarget {
988
956
  x: number;
989
957
  y: number;
990
958
  z?: number;
991
959
  }
992
960
 
993
- export interface GazeControlState {
994
- headSeedLimited?: boolean;
995
- eyeSeedLimited?: boolean;
996
- target?: Required<GazeTarget>;
997
- eyeTarget: Required<GazeTarget>;
998
- headTarget: Required<GazeTarget>;
999
- headRoll: number;
1000
- }
1001
-
1002
- export interface GazeFocusRequest {
1003
- worldTarget: PolymerVector3;
1004
- target: Required<GazeTarget>;
1005
- headTarget?: Required<GazeTarget>;
1006
- eyesEnabled: boolean;
1007
- headEnabled: boolean;
1008
- /** Tracking contribution in [0, 1]; older values above 1 normalize to 1. Live changes use scheduled motion. */
1009
- eyeIntensity?: number;
1010
- /** Tracking contribution in [0, 1], composed over authored head motion. Live changes use scheduled motion. */
1011
- headIntensity?: number;
1012
- initialState?: GazeControlState;
1013
- }
1014
-
1015
- export interface GazeFocusDiagnostics {
1016
- target: PolymerVector3;
1017
- eyes: Array<{ name: string; origin: PolymerVector3; direction: PolymerVector3; errorDegrees: number; limited: boolean }>;
1018
- headLimited: boolean;
1019
- missingHead: boolean;
1020
- missingEyes: boolean;
1021
- }
1022
-
1023
- export interface GazeObservation {
1024
- sampleSequence: number;
1025
- observedAt: number;
1026
- bindingGeneration: number;
1027
- requestId: string | null;
1028
- diagnostics: GazeFocusDiagnostics;
1029
- }
1030
-
1031
- export interface GazeAttentionOutcome {
1032
- status: 'moving' | 'settled' | 'unavailable' | 'failed';
1033
- reason: string;
1034
- angularErrorDeg?: number;
1035
- sampleSequence?: number;
1036
- observedAt?: number;
1037
- bindingGeneration?: number;
1038
- }
1039
- export interface GazeRetainedCandidate {
1040
- id: string;
1041
- source: string;
1042
- provenance: 'synthetic' | 'peer';
1043
- target: GazeTarget;
1044
- targetSpace: string;
1045
- confidence: number;
1046
- salience: number;
1047
- influence: number;
1048
- /** Actual accepted Society credit for peers, null for synthetic fixtures. */
1049
- routeCredit: number | null;
1050
- edgeId: string | null;
1051
- score: number;
1052
- observedAt: number;
1053
- expiresAt: number;
1054
- eligible: boolean;
1055
- reason: string;
1056
- lastOutcome?: GazeAttentionOutcome;
1057
- }
1058
- export interface GazeAttentionState {
1059
- /** The POC accepts static Conversation facts; live perception arbitration is deferred. */
1060
- lastRejectedInput?: { source: string; reason: 'moving-peer-arbitration-deferred' };
1061
- active: boolean;
1062
- sessionId: string | null;
1063
- scenario: GazeAttentionScenario | null;
1064
- phase: 'inactive' | 'waiting' | 'moving' | 'settled' | 'unavailable' | 'failed';
1065
- reason: string;
1066
- selectedId: string | null;
1067
- requestId: string | null;
1068
- configurationRevision: number;
1069
- candidates: GazeRetainedCandidate[];
1070
- feedback: GazeAttentionOutcome | null;
1071
- decisionCount: number;
1072
- updatedAt?: number;
1073
- }
1074
- export type GazeAttentionScenario = 'competition' | 'equal-score' | 'expiry' | 'unreachable';
1075
-
1076
- export interface ScreenSpaceGazeSolution {
1077
- kind: 'gaze.screen-space' | 'gaze.viewer-space';
1078
- focus?: GazeFocusRequest;
1079
- target: Required<GazeTarget>;
1080
- eyeTarget: Required<GazeTarget>;
1081
- headTarget: Required<GazeTarget>;
1082
- angles: {
1083
- yawDegrees: number;
1084
- pitchDegrees: number;
1085
- cameraYawDegrees: number;
1086
- cameraPitchDegrees: number;
1087
- };
1088
- /** World-space distance from the character's binocular eye origin to the render camera. */
1089
- distance: number;
1090
- viewerTarget: PolymerVector3;
1091
- screenTarget: Required<GazeTarget>;
1092
- }
1093
-
1094
- export interface ScreenSpaceGazeOptions {
1095
- profile?: Profile;
1096
- screenTarget: GazeTarget;
1097
- cameraPosition: PolymerVector3;
1098
- cameraQuaternion: PolymerQuaternion;
1099
- gazeOrigin: PolymerVector3;
1100
- modelQuaternion: PolymerQuaternion;
1101
- verticalFovDegrees: number;
1102
- aspect: number;
1103
- eyesEnabled?: boolean;
1104
- headEnabled?: boolean;
1105
- /** Defaults to 1: full target bearing, bounded by the profile's head AU limits. */
1106
- headFollowFraction?: number;
1107
- }
1108
-
1109
- export interface CameraGazeGeometry {
1110
- cameraPosition: PolymerVector3;
1111
- cameraQuaternion: PolymerQuaternion;
1112
- gazeOrigin: PolymerVector3;
1113
- modelQuaternion: PolymerQuaternion;
1114
- verticalFovDegrees: number;
1115
- aspect: number;
1116
- gazeGeometryComplete: boolean;
1117
- worldUnitsPerMeter?: number;
1118
- }
1119
-
1120
- export interface EmbodyGazeRuntime {
1121
- solveTarget(
1122
- screenTarget: GazeTarget,
1123
- cameraFact: CameraGazeGeometry & Record<string, unknown>,
1124
- options: GazeApplyOptions & { eyesEnabled: boolean; headEnabled: boolean; headFollowEyes: boolean; headIntensity?: number }
1125
- ): ScreenSpaceGazeSolution;
1126
- }
1127
-
1128
- export interface GazeConfig {
1129
- /** Explicitly synthetic lab:A and lab:B receiver influences, not graph-edge weights. */
1130
- attentionInfluenceA?: number;
1131
- attentionInfluenceB?: number;
1132
- attentionDwellMs?: number;
1133
- attentionSwitchMargin?: number;
1134
- attentionToleranceDeg?: number;
1135
- attentionTimeoutMs?: number;
1136
- enabled?: boolean;
1137
- eyesEnabled?: boolean;
1138
- headEnabled?: boolean;
1139
- /** Default true: follow the full target turn from reference neutral within head AU limits. False prefers neutral, with eye-limit overflow assistance. */
1140
- headFollowEyes?: boolean;
1141
- headFollowDelay?: number;
1142
- mirrored?: boolean;
1143
- smoothFactor?: number;
1144
- predictionEnabled?: boolean;
1145
- predictionFactor?: number;
1146
- maxPredictionDelta?: number;
1147
- minDelta?: number;
1148
- transitionDurationMs?: number;
1149
- /** Tracking contribution in [0, 1]; older values above 1 normalize to 1. With geometry-backed focus, live changes move directly toward the latest value without angular reversal braking. */
1150
- eyeIntensity?: number;
1151
- /** Tracking contribution in [0, 1], composed over authored head motion. With geometry-backed focus, live changes move directly toward the latest value without angular reversal braking. */
1152
- headIntensity?: number;
1153
- trackingSpeed?: number;
1154
- /** Braking interval for angular direction changes; geometry-backed strength changes bypass it. */
1155
- courseChangeDurationMs?: number;
1156
- coalesceMs?: number;
1157
- }
1158
-
1159
- export interface GazeState {
1160
- attention: GazeAttentionState;
1161
- configuration: AgencyConfigurationState;
1162
- lastDecision: GazeDecision | null;
1163
- agency: 'gaze';
1164
- status: string;
1165
- mode: string;
1166
- active: boolean;
1167
- rawTarget: Required<GazeTarget>;
1168
- target: Required<GazeTarget>;
1169
- baseTarget: Required<GazeTarget>;
1170
- baseOptions: GazeApplyOptions;
1171
- cameraInvalidated: boolean;
1172
- sourceAvailable: boolean;
1173
- cameraRelativeOffset: Required<GazeTarget>;
1174
- lastCameraFact: null | Record<string, unknown>;
1175
- lastGazeSolution: ScreenSpaceGazeSolution | null;
1176
- lastRequestedTarget: Required<GazeTarget>;
1177
- pendingRequest: GazeLookRequest | null;
1178
- lastRequest: GazeLookRequest | GazeResetRequest | null;
1179
- lastIgnored: null | Record<string, unknown>;
1180
- lastPlan: null | Record<string, unknown>;
1181
- lastEvent: null | Record<string, unknown>;
1182
- receivedCount: number;
1183
- plannedCount: number;
1184
- requestedCount: number;
1185
- ignoredCount: number;
1186
- resetCount: number;
1187
- cancelCount: number;
1188
- config: Required<GazeConfig>;
1189
- }
1190
-
1191
- export interface GazeApplyOptions {
1192
- eyeEnabled?: boolean;
1193
- headEnabled?: boolean;
1194
- headFollowEyes?: boolean;
1195
- headFollowDelay?: number;
1196
- /** Fraction of total target bearing assigned to the head from reference neutral. Defaults to 1; head AU limits still apply. */
1197
- headFollowFraction?: number;
1198
- viewerTarget?: PolymerVector3;
1199
- viewerTargetSpace?: 'webcam.viewer';
1200
- viewerVerticalFovDegrees?: number;
1201
- viewerAspect?: number;
1202
- rawViewerTarget?: PolymerVector3;
1203
- /** Default false. True explicitly prefers the camera bearing instead of reference-neutral target following. */
1204
- lockHeadToCamera?: boolean;
1205
- force?: boolean;
1206
- }
1207
-
1208
- export interface GazeAttentionCandidate {
1209
- target?: GazeTarget;
1210
- screenTarget?: GazeTarget;
1211
- gazeTarget?: GazeTarget;
1212
- lookTarget?: GazeTarget;
1213
- x?: number;
1214
- y?: number;
1215
- z?: number;
1216
- priority?: number;
1217
- weight?: number;
1218
- confidence?: number;
1219
- source?: string;
1220
- label?: string;
1221
- id?: string;
1222
- }
1223
-
1224
- export type GazeDispatch =
1225
- | { type: 'attention.start' | 'attention.stop'; sessionId: string }
1226
- | { type: 'attention.scenario'; sessionId: string; scenario: GazeAttentionScenario }
1227
- | { type: 'configure'; config: GazeConfig }
1228
- | { type: 'setMode' | 'set-mode'; mode: string }
1229
- | { type: 'setActive' | 'set-active'; active: boolean }
1230
- | { type: 'enable' }
1231
- | { type: 'disable' }
1232
- | { type: 'setTarget' | 'set-target' | 'focusTarget'; target: GazeTarget; options?: GazeApplyOptions }
1233
- | { type: 'attention.fact'; targets?: GazeAttentionCandidate[]; target?: GazeTarget; screenTarget?: GazeTarget; targetSpace?: string; source?: string }
1234
- | ({ type: 'camera.fact'; relativeOffset: GazeTarget; source?: string } & Partial<CameraGazeGeometry>)
1235
- | { type: 'camera.stale' | 'clearCameraOffset'; reason?: string; source?: string }
1236
- | Extract<PolymerDomainEvent, { type: 'userPerception.faceLost' | 'userPerception.status' }>
1237
- | { type: 'reset'; durationMs?: number; eyes?: boolean; head?: boolean }
1238
- | { type: 'cancel'; reason?: string };
1239
-
1240
- export interface GazeLookRequest {
1241
- attentionFeedback?: { sessionId: string; requestId: string; worldTarget: PolymerVector3 | null; timeoutMs: number; toleranceDeg: number } | null;
1242
- configurationRevision?: number;
1243
- coalesceMs?: number;
1244
- type: 'eyeHeadTracking.requestGaze';
1245
- agency: 'gaze';
1246
- targetAgency: 'eyeHeadTracking';
1247
- requestId: string;
1248
- source?: string;
1249
- label?: string;
1250
- mode: string;
1251
- target: Required<GazeTarget>;
1252
- eyeTarget: Required<GazeTarget>;
1253
- headTarget: Required<GazeTarget>;
1254
- gazeSolution?: ScreenSpaceGazeSolution;
1255
- rawTarget: Required<GazeTarget>;
1256
- predictedTarget: Required<GazeTarget>;
1257
- predictive: boolean;
1258
- previousTarget: Required<GazeTarget>;
1259
- eyeEnabled: boolean;
1260
- headEnabled: boolean;
1261
- headFollowEyes: boolean;
1262
- eyeIntensity: number;
1263
- headIntensity: number;
1264
- eyeDurationMs: number;
1265
- headDurationMs: number;
1266
- createdAt: number;
1267
- queuedAt?: number;
1268
- publishedAt?: number;
1269
- }
1270
-
1271
- export interface GazeResetRequest {
1272
- type: 'eyeHeadTracking.requestReset';
1273
- agency: 'gaze';
1274
- targetAgency: 'eyeHeadTracking';
1275
- requestId: string;
1276
- durationMs: number;
1277
- eyes: boolean;
1278
- head: boolean;
1279
- requestedAt: number;
1280
- }
1281
-
1282
- export interface GazeCancelRequest {
1283
- type: 'eyeHeadTracking.requestCancel';
1284
- agency: 'gaze';
1285
- targetAgency: 'eyeHeadTracking';
1286
- requestId: string;
1287
- reason: string;
1288
- requestedAt: number;
1289
- }
1290
-
1291
- export interface EyeHeadTrackingConfig {
1292
- gazeMode?: 'engine' | 'legacy' | 'experimental';
1293
- enabled?: boolean;
1294
- eyeTrackingEnabled?: boolean;
1295
- eyeSaccadeSpeed?: number;
1296
- eyeSmoothPursuit?: boolean;
1297
- eyeBlinkRate?: number;
1298
- headTrackingEnabled?: boolean;
1299
- headFollowEyes?: boolean;
1300
- headFollowDelay?: number;
1301
- headSpeed?: number;
1302
- lookAtSpeaker?: boolean;
1303
- idleVariation?: boolean;
1304
- idleVariationInterval?: number;
1305
- /** Tracking contribution in [0, 1]; older values above 1 normalize to 1. With geometry-backed focus, live changes move toward the latest value without angular reversal braking. */
1306
- eyeIntensity?: number;
1307
- eyeBlendWeight?: number;
1308
- /** Tracking contribution in [0, 1], composed over authored head motion. With geometry-backed focus, live changes move toward the latest value without angular reversal braking. */
1309
- headIntensity?: number;
1310
- trackingSpeed?: number;
1311
- /** Angular braking interval; geometry-backed strength changes bypass it. */
1312
- courseChangeDurationMs?: number;
1313
- headBlendWeight?: number;
1314
- headRoll?: number;
1315
- eyePriority?: number;
1316
- headPriority?: number;
1317
- snippetPriority?: number;
1318
- transitionDurationMs?: number;
1319
- agencyTransitionDuration?: number;
1320
- returnToCenterDurationMs?: number;
1321
- returnToNeutralEnabled?: boolean;
1322
- returnToNeutralDelay?: number;
1323
- returnToNeutralDuration?: number;
1324
- coalesceMs?: number;
1325
- replaceExisting?: boolean;
1326
- webcamTrackingEnabled?: boolean;
1327
- webcamLookAtUser?: boolean;
1328
- webcamActivationInterval?: number;
1329
- mouthSyncEnabled?: boolean;
1330
- engine?: Embody | EmbodyRuntime | unknown;
1331
- cameraController?: unknown;
1332
- animationAgency?: AnimationService | unknown;
1333
- useAnimationAgency?: boolean;
1334
- }
1335
-
1336
- export interface EyeHeadTrackingState {
1337
- agency: 'eyeHeadTracking';
1338
- status: string;
1339
- mode: string;
1340
- currentTarget: Required<GazeTarget>;
1341
- pendingRequest: EyeHeadGazeRequest | null;
1342
- lastRequest: EyeHeadGazeRequest | null;
1343
- lastSnippet: PolymerAnimationSnippet | null;
1344
- activeSnippetNames: string[];
1345
- lastIgnored: null | Record<string, unknown>;
1346
- lastPlan: null | Record<string, unknown>;
1347
- scheduledCount: number;
1348
- removedCount: number;
1349
- resetCount: number;
1350
- cancelCount: number;
1351
- ignoredCount: number;
1352
- config: Required<EyeHeadTrackingConfig>;
1353
- }
1354
-
1355
- export interface EyeHeadGazeRequest {
1356
- type: 'eyeHeadTracking.requestGaze';
1357
- agency: 'eyeHeadTracking' | 'gaze';
1358
- sourceAgency?: string;
1359
- requestId: string;
1360
- target: Required<GazeTarget>;
1361
- eyeTarget?: Required<GazeTarget>;
1362
- headTarget?: Required<GazeTarget>;
1363
- gazeSolution?: ScreenSpaceGazeSolution;
1364
- gazeFocus?: GazeFocusRequest;
1365
- rawTarget?: Required<GazeTarget>;
1366
- mode?: string;
1367
- eyeEnabled?: boolean;
1368
- headEnabled?: boolean;
1369
- headFollowEyes?: boolean;
1370
- headFollowDelay?: number;
1371
- /** Tracking contribution in [0, 1]; older values above 1 normalize to 1. Live changes use scheduled motion. */
1372
- eyeIntensity?: number;
1373
- /** Tracking contribution in [0, 1], composed over authored head motion. Live changes use scheduled motion. */
1374
- headIntensity?: number;
1375
- headRoll?: number;
1376
- eyeDurationMs?: number;
1377
- headDurationMs?: number;
1378
- createdAt?: number;
1379
- }
1380
-
1381
- export type EyeHeadTrackingDispatch =
1382
- | { type: 'configure'; config: EyeHeadTrackingConfig }
1383
- | { type: 'enable' }
1384
- | { type: 'disable' }
1385
- | { type: 'setTarget' | 'set-target' | 'requestGaze'; target: GazeTarget }
1386
- | EyeHeadGazeRequest
1387
- | { type: 'reset' | 'eyeHeadTracking.requestReset'; durationMs?: number; eyes?: boolean; head?: boolean; reason?: string }
1388
- | { type: 'cancel' | 'eyeHeadTracking.requestCancel'; reason?: string };
1389
-
1390
961
  export interface BlinkTriggerOptions {
1391
962
  intensity?: number;
1392
963
  duration?: number;
@@ -1543,12 +1114,10 @@ export interface PolymerAnimationHandle {
1543
1114
  seek?: (offsetSec: number) => unknown;
1544
1115
  updateParams?: (params: Record<string, unknown>) => unknown;
1545
1116
  setParams?: (params: Record<string, unknown>) => unknown;
1546
- finished?: Promise<unknown> | { then: (onFulfilled?: () => unknown, onRejected?: (error: unknown) => unknown) => unknown };
1117
+ finished?: Promise<AnimationPlaybackEvent>;
1547
1118
  }
1548
1119
 
1549
1120
  export interface PolymerAnimationRuntime {
1550
- /** Optional capability. Unsupported engines never produce confirmed Gaze alignment. */
1551
- getGazeObservation?: () => GazeObservation | null;
1552
1121
  buildClip?: (
1553
1122
  name: string,
1554
1123
  curves: Record<string, PolymerSnippetKeyframe[]>,
@@ -1900,10 +1469,6 @@ export interface ProsodicParameter extends AgencyParameter<keyof ProsodicEditabl
1900
1469
  export type GestureEditableConfiguration = Pick<GestureConfig,
1901
1470
  'intensity' | 'priority' | 'defaultDurationMs' | 'cooldownMs' | 'rampRatio'
1902
1471
  | 'holdRatio' | 'returnToBase' | 'replaceActive' | 'maxActive'>;
1903
- export type GazeEditableConfiguration = Pick<GazeConfig,
1904
- 'headFollowDelay' | 'predictionEnabled' | 'trackingSpeed' | 'coalesceMs'
1905
- | 'attentionInfluenceA' | 'attentionInfluenceB' | 'attentionDwellMs'
1906
- | 'attentionSwitchMargin' | 'attentionToleranceDeg' | 'attentionTimeoutMs'>;
1907
1472
  export type CameraContextEditableConfiguration = Pick<CameraContextConfig,
1908
1473
  'coalesceMs' | 'staleAfterMs' | 'yawWeight' | 'pitchWeight'>;
1909
1474
 
@@ -1913,12 +1478,6 @@ export interface GestureDefinition {
1913
1478
  definitionVersion: 1;
1914
1479
  parameters: AgencyParameter<keyof GestureEditableConfiguration>[];
1915
1480
  }
1916
- export interface GazeDefinition {
1917
- id: 'gaze';
1918
- family: 'cognition';
1919
- definitionVersion: 2;
1920
- parameters: AgencyParameter<keyof GazeEditableConfiguration>[];
1921
- }
1922
1481
  export interface CameraContextDefinition {
1923
1482
  id: 'cameraContext';
1924
1483
  family: 'perception';
@@ -1927,18 +1486,6 @@ export interface CameraContextDefinition {
1927
1486
  }
1928
1487
 
1929
1488
  /** Safe decision projection, not an execution receipt or replay record. */
1930
- export interface GazeDecision {
1931
- trigger: string;
1932
- configurationRevision: number;
1933
- source: string;
1934
- mode: string;
1935
- predictive: boolean;
1936
- outcome: 'requested' | 'reset-requested' | 'cancel-requested' | 'ignored' | 'rejected' | 'state-updated';
1937
- reason: string | null;
1938
- confirmation: 'unobserved';
1939
- at: number;
1940
- }
1941
-
1942
1489
  export interface GestureDecision {
1943
1490
  sequence: number;
1944
1491
  trigger: string;
@@ -2054,7 +1601,6 @@ export interface ConversationConfig {
2054
1601
  /** Minimum playback time for transcript fallback; sustained audio is accepted immediately. */
2055
1602
  minSpeakTime?: number;
2056
1603
  allowTranscriptInterruptionFallback?: boolean;
2057
- eyeHeadTracking?: EyeHeadTrackingService | unknown;
2058
1604
  prosodicService?: unknown;
2059
1605
  }
2060
1606
 
@@ -2293,7 +1839,7 @@ export interface CameraContextState {
2293
1839
  verticalFovDegrees: number;
2294
1840
  aspect: number;
2295
1841
  gazeGeometryComplete: boolean;
2296
- relativeOffset: Required<GazeTarget>;
1842
+ relativeOffset: Required<PerceptionTarget>;
2297
1843
  lastUpdatedAt: number | null;
2298
1844
  lastPublishedAt: number | null;
2299
1845
  lastFact: Record<string, unknown> | null;
@@ -2404,7 +1950,7 @@ export interface UserPerceptionState {
2404
1950
  modelStatus: string;
2405
1951
  faceDetected: boolean;
2406
1952
  selectedFaceConfidence: number | null;
2407
- target: Required<GazeTarget>;
1953
+ target: Required<PerceptionTarget>;
2408
1954
  /** Fixed display-right/up normalized eye-midpoint offset for this activation; never persisted across sessions. */
2409
1955
  eyeContactReference: { x: number; y: number } | null;
2410
1956
  lastObservationAt: number | null;
@@ -2697,12 +2243,6 @@ export interface PolymerInputStream<TCommand> extends PolymerStream<{ type: 'com
2697
2243
 
2698
2244
 
2699
2245
  export type PolymerDomainEvent =
2700
- | { type: 'gaze.attention'; agency: 'gaze'; attention: GazeAttentionState }
2701
- | { type: 'animation.requestObserveGaze'; agency: 'eyeHeadTracking'; requestId: string; sessionId: string; worldTarget: PolymerVector3 | null; timeoutMs: number; toleranceDeg: number }
2702
- | { type: 'animation.requestCancelGazeObservation'; agency: 'eyeHeadTracking'; requestId: string | null }
2703
- | { type: 'animation.gazeFeedback'; agency: 'animation'; requestId: string; status: 'observed' | 'unavailable'; reason: string; angularErrorDeg?: number; sampleSequence?: number; observedAt?: number; bindingGeneration?: number }
2704
- | { type: 'gaze.configurationChanged'; agency: 'gaze'; configuration: AgencyConfigurationState; configure: GazeEditableConfiguration }
2705
- | { type: 'gaze.decision'; agency: 'gaze'; decision: GazeDecision }
2706
2246
  | { type: 'gestureDecision'; agency: 'gesture'; decision: GestureDecision }
2707
2247
  | { type: 'gestureCommandRejected'; agency: 'gesture'; commandType: string; reason: 'revision-exhausted' }
2708
2248
  | {
@@ -2723,7 +2263,7 @@ export type PolymerDomainEvent =
2723
2263
  }
2724
2264
  | {
2725
2265
  type: 'animation.requestScheduleSnippet';
2726
- agency: 'blink' | 'lipSync' | 'gesture' | 'prosodic' | 'eyeHeadTracking';
2266
+ agency: 'blink' | 'lipSync' | 'gesture' | 'prosodic';
2727
2267
  requestId: string;
2728
2268
  snippet: PolymerAnimationSnippet;
2729
2269
  options: { autoPlay?: boolean; [key: string]: unknown };
@@ -2733,7 +2273,7 @@ export type PolymerDomainEvent =
2733
2273
  }
2734
2274
  | {
2735
2275
  type: 'animation.requestRemoveSnippet';
2736
- agency: 'lipSync' | 'gesture' | 'prosodic' | 'eyeHeadTracking';
2276
+ agency: 'lipSync' | 'gesture' | 'prosodic';
2737
2277
  requestId: string;
2738
2278
  name: string;
2739
2279
  reason: string;
@@ -2797,31 +2337,6 @@ export type PolymerDomainEvent =
2797
2337
  nextDelayMs: number | null;
2798
2338
  }
2799
2339
  | { type: 'signal'; agency: 'blink'; signal: 'blink-fast'; plan: Record<string, unknown> }
2800
- | { type: 'gaze.status'; agency: 'gaze'; status: string; mode: string; active: boolean; enabled: boolean; reason?: string; at: number }
2801
- | { type: 'gaze.targetReceived'; agency: 'gaze'; requestId: string; rawTarget: Required<GazeTarget>; source?: string; label?: string; at: number }
2802
- | {
2803
- type: 'gaze.targetPlanned';
2804
- agency: 'gaze';
2805
- requestId: string;
2806
- rawTarget: Required<GazeTarget>;
2807
- target: Required<GazeTarget>;
2808
- delta: number;
2809
- eyeDurationMs: number;
2810
- headDurationMs: number;
2811
- at: number;
2812
- }
2813
- | {
2814
- type: 'gaze.targetIgnored';
2815
- agency: 'gaze';
2816
- requestId: string;
2817
- rawTarget: Required<GazeTarget>;
2818
- target: Required<GazeTarget>;
2819
- reason: 'disabled' | 'min-delta' | string;
2820
- ignoredAt: number;
2821
- }
2822
- | GazeLookRequest
2823
- | GazeResetRequest
2824
- | GazeCancelRequest
2825
2340
  | { type: 'camera.status'; agency: 'cameraContext'; status: string; stale: boolean; reason?: string; at: number; configurationRevision: number }
2826
2341
  | {
2827
2342
  type: 'camera.fact';
@@ -2840,7 +2355,7 @@ export type PolymerDomainEvent =
2840
2355
  verticalFovDegrees: number;
2841
2356
  aspect: number;
2842
2357
  gazeGeometryComplete: boolean;
2843
- relativeOffset: Required<GazeTarget>;
2358
+ relativeOffset: Required<PerceptionTarget>;
2844
2359
  stale: false;
2845
2360
  }
2846
2361
  | {
@@ -2851,7 +2366,7 @@ export type PolymerDomainEvent =
2851
2366
  invalidatedAt: number;
2852
2367
  lastPublishedAt?: number;
2853
2368
  lastObservedAt?: number;
2854
- lastRelativeOffset?: Required<GazeTarget>;
2369
+ lastRelativeOffset?: Required<PerceptionTarget>;
2855
2370
  }
2856
2371
  | {
2857
2372
  type: 'userPerception.status';
@@ -2870,23 +2385,21 @@ export type PolymerDomainEvent =
2870
2385
  | {
2871
2386
  type: 'attention.fact';
2872
2387
  agency: 'userPerception';
2873
- targetAgency: 'gaze';
2874
2388
  source: 'userPerception';
2875
2389
  label: string;
2876
2390
  observedAt: number;
2877
2391
  confidence?: number | null;
2878
2392
  priority: number;
2879
- target: Required<GazeTarget>;
2880
- screenTarget: Required<GazeTarget>;
2393
+ target: Required<PerceptionTarget>;
2394
+ screenTarget: Required<PerceptionTarget>;
2881
2395
  targetSpace: 'screen.ndc';
2882
- viewerTarget: Required<GazeTarget>;
2396
+ viewerTarget: Required<PerceptionTarget>;
2883
2397
  viewerTargetSpace: 'webcam.viewer';
2884
2398
  viewerVerticalFovDegrees: number;
2885
2399
  viewerAspect: number;
2886
2400
  cameraMetadata?: UserPerceptionCameraMetadata | null;
2887
- rawViewerTarget: Required<GazeTarget>;
2888
- options?: GazeApplyOptions;
2889
- rawTarget: Required<GazeTarget>;
2401
+ rawViewerTarget: Required<PerceptionTarget>;
2402
+ rawTarget: Required<PerceptionTarget>;
2890
2403
  face: Pick<UserPerceptionFaceObservation, 'id' | 'bounds' | 'eyeMidpoint' | 'interocularDistance' | 'headPose' | 'irisDirection'>;
2891
2404
  }
2892
2405
  | {
@@ -2894,38 +2407,14 @@ export type PolymerDomainEvent =
2894
2407
  agency: 'userPerception';
2895
2408
  observedAt: number;
2896
2409
  confidence?: number | null;
2897
- target: Required<GazeTarget>;
2898
- viewerTarget: Required<GazeTarget>;
2410
+ target: Required<PerceptionTarget>;
2411
+ viewerTarget: Required<PerceptionTarget>;
2899
2412
  cameraMetadata?: UserPerceptionCameraMetadata | null;
2900
2413
  face: Record<string, unknown>;
2901
2414
  at: number;
2902
2415
  }
2903
2416
  | { type: 'userPerception.faceLost'; agency: 'userPerception'; reason: string; lastSeenAt?: number; at: number }
2904
2417
  | { type: 'userPerception.ignored'; agency: 'userPerception'; reason: string; commandType?: string; at: number }
2905
- | {
2906
- type: 'eyeHeadTracking.status';
2907
- agency: 'eyeHeadTracking';
2908
- status: string;
2909
- enabled: boolean;
2910
- activeSnippetNames: string[];
2911
- reason?: string;
2912
- at: number;
2913
- }
2914
- | {
2915
- type: 'eyeHeadTracking.requestIgnored';
2916
- agency: 'eyeHeadTracking';
2917
- requestId: string;
2918
- reason: string;
2919
- target?: Required<GazeTarget>;
2920
- ignoredAt: number;
2921
- }
2922
- | {
2923
- type: 'eyeHeadTracking.cancelled';
2924
- agency: 'eyeHeadTracking';
2925
- requestId: string;
2926
- reason: string;
2927
- at: number;
2928
- }
2929
2418
  | { type: 'lipSyncPlanCreated'; agency: 'lipSync'; plan: Record<string, unknown> }
2930
2419
  | { type: 'lipSyncConfigChanged'; agency: 'lipSync'; state: LipSyncState }
2931
2420
  | {
@@ -3040,8 +2529,6 @@ export type PolymerDomainEvent =
3040
2529
  | 'character'
3041
2530
  | 'blink'
3042
2531
  | 'animation'
3043
- | 'gaze'
3044
- | 'eyeHeadTracking'
3045
2532
  | 'lipSync'
3046
2533
  | 'tts'
3047
2534
  | 'gesture'
@@ -3101,55 +2588,6 @@ export interface AnimationAgency {
3101
2588
  dispose(): void;
3102
2589
  }
3103
2590
 
3104
- export interface GazeAgency {
3105
- /** Applies between decisions; pending requests retain their accepted policy. */
3106
- applyConfiguration(update: { revision: number; configure: GazeEditableConfiguration }): AgencyConfigurationReceipt;
3107
- input: PolymerInputStream<GazeDispatch>;
3108
- events: PolymerStream<PolymerDomainEvent>;
3109
- dispatch(command: GazeDispatch): void;
3110
- snapshot(): GazeState;
3111
- subscribeInput(listener: (event: { type: 'command'; agency: 'gaze'; command: GazeDispatch }) => void): () => void;
3112
- subscribeEvents(listener: (event: PolymerDomainEvent) => void): () => void;
3113
- /** Compatibility alias for events. Prefer subscribeEvents. */
3114
- subscribe(listener: (event: PolymerStatusEvent) => void): () => void;
3115
- /** Compatibility alias for events. Prefer subscribeEvents. */
3116
- subscribeStatus(listener: (event: PolymerStatusEvent) => void): () => void;
3117
- setTarget(target: GazeTarget, options?: GazeApplyOptions): void;
3118
- focusTarget(target: GazeTarget): void;
3119
- configure(config: GazeConfig): void;
3120
- setMode(mode: string): void;
3121
- setActive(active: boolean): void;
3122
- enable(): void;
3123
- disable(): void;
3124
- reset(durationMs?: number): void;
3125
- cancel(reason?: string): void;
3126
- flush(): void;
3127
- queue(): Array<Record<string, unknown>>;
3128
- dispose(): void;
3129
- }
3130
-
3131
- export interface EyeHeadTrackingAgency {
3132
- input: PolymerInputStream<EyeHeadTrackingDispatch>;
3133
- events: PolymerStream<PolymerDomainEvent>;
3134
- dispatch(command: EyeHeadTrackingDispatch): void;
3135
- snapshot(): EyeHeadTrackingState;
3136
- subscribeInput(listener: (event: { type: 'command'; agency: 'eyeHeadTracking'; command: EyeHeadTrackingDispatch }) => void): () => void;
3137
- subscribeEvents(listener: (event: PolymerDomainEvent) => void): () => void;
3138
- /** Compatibility alias for events. Prefer subscribeEvents. */
3139
- subscribe(listener: (event: PolymerStatusEvent) => void): () => void;
3140
- /** Compatibility alias for events. Prefer subscribeEvents. */
3141
- subscribeStatus(listener: (event: PolymerStatusEvent) => void): () => void;
3142
- setTarget(target: GazeTarget): void;
3143
- configure(config: EyeHeadTrackingConfig): void;
3144
- enable(): void;
3145
- disable(): void;
3146
- reset(durationMs?: number): void;
3147
- cancel(reason?: string): void;
3148
- flush(): void;
3149
- queue(): Array<Record<string, unknown>>;
3150
- dispose(): void;
3151
- }
3152
-
3153
2591
  export interface LipSyncAgency {
3154
2592
  input: PolymerInputStream<LipSyncDispatch>;
3155
2593
  events: PolymerStream<PolymerDomainEvent>;
@@ -3328,8 +2766,6 @@ export interface UserPerceptionAgency {
3328
2766
 
3329
2767
  export interface CharacterAgencySnapshot {
3330
2768
  blink: BlinkState;
3331
- gaze: GazeState;
3332
- eyeHeadTracking: EyeHeadTrackingState;
3333
2769
  gesture: GestureState;
3334
2770
  cameraContext: CameraContextState;
3335
2771
  userPerception: UserPerceptionState;
@@ -3344,8 +2780,6 @@ export interface CharacterAgencySnapshot {
3344
2780
 
3345
2781
  export type CharacterAgencyDispatch =
3346
2782
  | { agency: 'blink'; command: BlinkDispatch }
3347
- | { agency: 'gaze'; command: GazeDispatch }
3348
- | { agency: 'eyeHeadTracking'; command: EyeHeadTrackingDispatch }
3349
2783
  | { agency: 'gesture'; command: GestureDispatch }
3350
2784
  | { agency: 'cameraContext'; command: CameraContextDispatch }
3351
2785
  | { agency: 'userPerception'; command: UserPerceptionDispatch }
@@ -3369,8 +2803,6 @@ export interface CharacterAgencies {
3369
2803
  updateSocietyRouting(society: AgencySociety): AgencySociety;
3370
2804
  agency(name: 'animation'): AnimationAgency;
3371
2805
  agency(name: 'blink'): BlinkAgency | null;
3372
- agency(name: 'gaze'): GazeAgency | null;
3373
- agency(name: 'eyeHeadTracking'): EyeHeadTrackingAgency | null;
3374
2806
  agency(name: 'gesture'): GestureAgency | null;
3375
2807
  agency(name: 'cameraContext'): CameraContextAgency | null;
3376
2808
  agency(name: 'userPerception'): UserPerceptionAgency | null;
@@ -3398,8 +2830,7 @@ export type MixerLoopMode = 'repeat' | 'once' | 'pingpong';
3398
2830
  export type SnippetCategoryKey =
3399
2831
  | 'emotionAnimationsList'
3400
2832
  | 'speakingAnimationsList'
3401
- | 'visemeAnimationsList'
3402
- | 'eyeHeadTrackingAnimationsList';
2833
+ | 'visemeAnimationsList';
3403
2834
 
3404
2835
  export interface AIExpressionInterpretationMetadata {
3405
2836
  emotion?: string;
@@ -3438,7 +2869,7 @@ export interface Snippet {
3438
2869
  maxTime?: number;
3439
2870
  cleanupMaxTime?: number;
3440
2871
  duration?: number;
3441
- snippetCategory?: 'auSnippet' | 'visemeSnippet' | 'eyeHeadTracking' | 'combined' | 'default' | string;
2872
+ snippetCategory?: 'auSnippet' | 'visemeSnippet' | 'combined' | 'default' | string;
3442
2873
  snippetPriority?: number;
3443
2874
  snippetPlaybackRate?: number;
3444
2875
  snippetIntensityScale?: number;
@@ -3467,7 +2898,7 @@ export interface NormalizedSnippet extends Snippet {
3467
2898
  lastLoopTime: number;
3468
2899
  snippetPlaybackRate: number;
3469
2900
  snippetIntensityScale: number;
3470
- snippetCategory: 'auSnippet' | 'visemeSnippet' | 'eyeHeadTracking' | 'combined' | 'default' | string;
2901
+ snippetCategory: 'auSnippet' | 'visemeSnippet' | 'combined' | 'default' | string;
3471
2902
  snippetPriority: number;
3472
2903
  snippetBlendMode: 'replace' | 'additive';
3473
2904
  snippetJawScale: number;
@@ -3683,65 +3114,6 @@ export interface AnimationService {
3683
3114
  getPlayingBakedAnimations(): BakedAnimationUIState[];
3684
3115
  }
3685
3116
 
3686
- export interface EyeHeadTrackingRuntimeState {
3687
- eyeStatus: 'idle' | 'tracking' | 'lagging';
3688
- headStatus: 'idle' | 'tracking' | 'lagging';
3689
- currentGaze: GazeTarget;
3690
- targetGaze: GazeTarget;
3691
- eyeIntensity: number;
3692
- lastBlinkTime: number | null;
3693
- headIntensity: number;
3694
- headFollowTimer: number | null;
3695
- isSpeaking: boolean;
3696
- isListening: boolean;
3697
- returnToNeutralTimer: number | null;
3698
- lastGazeUpdateTime: number;
3699
- mode?: string;
3700
- }
3701
-
3702
- export interface EyeHeadTrackingCallbacks {
3703
- onEyeStart?: () => void;
3704
- onEyeStop?: () => void;
3705
- onHeadStart?: () => void;
3706
- onHeadStop?: () => void;
3707
- onGazeChange?: (target: GazeTarget) => void;
3708
- onBlink?: () => void;
3709
- onError?: (error: Error) => void;
3710
- }
3711
-
3712
- export interface EyeHeadTrackingMachineContext {
3713
- config: EyeHeadTrackingConfig;
3714
- mode: 'manual' | 'mouse' | 'webcam' | string;
3715
- target: GazeTarget;
3716
- lastApplied: GazeTarget;
3717
- status: {
3718
- eye: 'idle' | 'tracking' | 'lagging';
3719
- head: 'idle' | 'tracking' | 'lagging';
3720
- };
3721
- }
3722
-
3723
- export interface EyeHeadTrackingService {
3724
- start(): void;
3725
- stop(): void;
3726
- setGazeTarget(target: GazeTarget): void;
3727
- resetToNeutral(durationMs?: number): void;
3728
- blink(): void;
3729
- setSpeaking(isSpeaking: boolean): void;
3730
- setListening(isListening: boolean): void;
3731
- setEyeBlendWeight(value: number): void;
3732
- setHeadBlendWeight(value: number): void;
3733
- updateConfig(config: Partial<EyeHeadTrackingConfig>): void;
3734
- getState(): EyeHeadTrackingRuntimeState;
3735
- getMachineContext(): EyeHeadTrackingMachineContext | null;
3736
- getSnippets(): { eye: Map<string, unknown>; head: Map<string, unknown> };
3737
- setMode(mode: 'manual' | 'mouse' | 'webcam' | string): void;
3738
- getMode(): 'manual' | 'mouse' | 'webcam' | string;
3739
- subscribeToWebcam(callback: (detected: boolean, landmarks?: Array<{ x: number; y: number }>) => void): () => void;
3740
- getWebcamVideoElement(): HTMLVideoElement | null;
3741
- isWebcamActive(): boolean;
3742
- dispose(): void;
3743
- }
3744
-
3745
3117
  export interface BoundaryEvent {
3746
3118
  word: string;
3747
3119
  index: number;
@@ -3865,17 +3237,12 @@ export function createAnimationService(
3865
3237
  engine: Embody | EmbodyRuntime,
3866
3238
  options?: { agency?: AnimationAgency },
3867
3239
  ): AnimationService;
3868
- export function createEyeHeadTrackingService(config?: EyeHeadTrackingConfig, callbacks?: EyeHeadTrackingCallbacks): EyeHeadTrackingService;
3869
3240
  export function createTranscriptionService(config?: TranscriptionConfig, callbacks?: TranscriptionCallbacks): TranscriptionService;
3870
3241
  export function createCharacterConversationService(agencies: CharacterAgencies, config?: ConversationConfig, callbacks?: ConversationCallbacks): ConversationService;
3871
3242
  /** @deprecated Character hosts should use createCharacterConversationService. */
3872
3243
  export function createConversationService(tts: { speak(text: string): Promise<unknown>; stop(): void }, transcription: TranscriptionService, config?: ConversationConfig, callbacks?: ConversationCallbacks): ConversationService;
3873
3244
  export const DEFAULT_HAIR_PHYSICS_ENABLED: boolean;
3874
3245
  export const DEFAULT_AGENCY_SOCIETY: AgencySociety;
3875
- export const DEFAULT_EYE_HEAD_CONFIG: Required<Pick<EyeHeadTrackingConfig, 'gazeMode' | 'eyeTrackingEnabled' | 'headTrackingEnabled' | 'headFollowEyes' | 'eyeIntensity' | 'headIntensity' | 'returnToNeutralEnabled' | 'returnToNeutralDelay' | 'returnToNeutralDuration' | 'useAnimationAgency'>>;
3876
- export const DEFAULT_ANIMATION_KEYS: Record<string, string>;
3877
- export const EYE_AUS: Record<string, number>;
3878
- export const HEAD_AUS: Record<string, number>;
3879
3246
  export function getBundledSnippetNames(listKey: SnippetCategoryKey): string[];
3880
3247
  export function getStoredSnippetNames(listKey: SnippetCategoryKey, storage?: Pick<Storage, 'getItem' | 'removeItem'>): string[];
3881
3248
  export function getAvailableSnippetNames(listKey: SnippetCategoryKey, storage?: Pick<Storage, 'getItem' | 'removeItem'>): string[];
@@ -3928,14 +3295,11 @@ export interface AgencySociety {
3928
3295
 
3929
3296
  export function createBlinkAgency(config?: BlinkAgencyConfig): BlinkAgency;
3930
3297
  export function createAnimationAgency(config?: AnimationAgencyConfig): AnimationAgency;
3931
- export function createGazeAgency(config?: GazeConfig, runtime?: EmbodyGazeRuntime): GazeAgency;
3932
- export function createEyeHeadTrackingAgency(config?: EyeHeadTrackingConfig): EyeHeadTrackingAgency;
3933
3298
  export function createLipSyncAgency(config?: LipSyncConfig, runtime?: LipSyncRuntime): LipSyncAgency;
3934
3299
  export function createTTSAgency(config?: TTSConfig): TTSAgency;
3935
3300
  export function createGestureAgency(config?: GestureOptions): GestureAgency;
3936
3301
  export function getProsodicDefinition(): ProsodicDefinition;
3937
3302
  export function getGestureDefinition(): GestureDefinition;
3938
- export function getGazeDefinition(): GazeDefinition;
3939
3303
  export function getCameraContextDefinition(): CameraContextDefinition;
3940
3304
  export function createProsodicAgency(config?: ProsodicOptions): ProsodicAgency;
3941
3305
  export function createConversationAgency(config?: ConversationAgencyConfig): ConversationAgency;
@@ -3944,9 +3308,6 @@ export function createCameraContextAgency(config?: CameraContextConfig): CameraC
3944
3308
  export function createUserPerceptionAgency(config?: UserPerceptionConfig, runtime?: UserPerceptionRuntime): UserPerceptionAgency;
3945
3309
  export function createCharacterAgencies(config?: {
3946
3310
  blink?: BlinkAgencyConfig;
3947
- gaze?: GazeConfig;
3948
- gazeRuntime?: EmbodyGazeRuntime;
3949
- eyeHeadTracking?: EyeHeadTrackingConfig;
3950
3311
  gesture?: GestureOptions;
3951
3312
  cameraContext?: CameraContextConfig;
3952
3313
  userPerception?: UserPerceptionConfig;