realtime-avatar 0.1.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.
Files changed (109) hide show
  1. package/AGENTS.md +132 -0
  2. package/CLAUDE.md +17 -0
  3. package/LICENSE +21 -0
  4. package/README.md +254 -0
  5. package/dist/api-keys.d.ts +26 -0
  6. package/dist/api-keys.d.ts.map +1 -0
  7. package/dist/api-keys.js +88 -0
  8. package/dist/api-keys.js.map +1 -0
  9. package/dist/browser/audio.d.ts +65 -0
  10. package/dist/browser/audio.d.ts.map +1 -0
  11. package/dist/browser/audio.js +154 -0
  12. package/dist/browser/audio.js.map +1 -0
  13. package/dist/browser/boomerang.d.ts +38 -0
  14. package/dist/browser/boomerang.d.ts.map +1 -0
  15. package/dist/browser/boomerang.js +85 -0
  16. package/dist/browser/boomerang.js.map +1 -0
  17. package/dist/browser/index.d.ts +8 -0
  18. package/dist/browser/index.d.ts.map +1 -0
  19. package/dist/browser/index.js +8 -0
  20. package/dist/browser/index.js.map +1 -0
  21. package/dist/browser/media-session.d.ts +43 -0
  22. package/dist/browser/media-session.d.ts.map +1 -0
  23. package/dist/browser/media-session.js +169 -0
  24. package/dist/browser/media-session.js.map +1 -0
  25. package/dist/browser/player.d.ts +162 -0
  26. package/dist/browser/player.d.ts.map +1 -0
  27. package/dist/browser/player.js +514 -0
  28. package/dist/browser/player.js.map +1 -0
  29. package/dist/browser/view.d.ts +47 -0
  30. package/dist/browser/view.d.ts.map +1 -0
  31. package/dist/browser/view.js +7 -0
  32. package/dist/browser/view.js.map +1 -0
  33. package/dist/browser/webrtc.d.ts +21 -0
  34. package/dist/browser/webrtc.d.ts.map +1 -0
  35. package/dist/browser/webrtc.js +149 -0
  36. package/dist/browser/webrtc.js.map +1 -0
  37. package/dist/browser/yuv-canvas.d.ts +13 -0
  38. package/dist/browser/yuv-canvas.d.ts.map +1 -0
  39. package/dist/browser/yuv-canvas.js +95 -0
  40. package/dist/browser/yuv-canvas.js.map +1 -0
  41. package/dist/client.d.ts +195 -0
  42. package/dist/client.d.ts.map +1 -0
  43. package/dist/client.js +440 -0
  44. package/dist/client.js.map +1 -0
  45. package/dist/errors.d.ts +33 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +73 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/generated/openapi.d.ts +1523 -0
  50. package/dist/generated/openapi.d.ts.map +1 -0
  51. package/dist/generated/openapi.js +6 -0
  52. package/dist/generated/openapi.js.map +1 -0
  53. package/dist/index.d.ts +14 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +15 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/media.d.ts +40 -0
  58. package/dist/media.d.ts.map +1 -0
  59. package/dist/media.js +4 -0
  60. package/dist/media.js.map +1 -0
  61. package/dist/mux.d.ts +104 -0
  62. package/dist/mux.d.ts.map +1 -0
  63. package/dist/mux.js +290 -0
  64. package/dist/mux.js.map +1 -0
  65. package/dist/platform.d.ts +163 -0
  66. package/dist/platform.d.ts.map +1 -0
  67. package/dist/platform.js +5 -0
  68. package/dist/platform.js.map +1 -0
  69. package/dist/react/index.d.ts +5 -0
  70. package/dist/react/index.d.ts.map +1 -0
  71. package/dist/react/index.js +5 -0
  72. package/dist/react/index.js.map +1 -0
  73. package/dist/react/provider.d.ts +37 -0
  74. package/dist/react/provider.d.ts.map +1 -0
  75. package/dist/react/provider.js +33 -0
  76. package/dist/react/provider.js.map +1 -0
  77. package/dist/react/realtime.d.ts +74 -0
  78. package/dist/react/realtime.d.ts.map +1 -0
  79. package/dist/react/realtime.js +105 -0
  80. package/dist/react/realtime.js.map +1 -0
  81. package/dist/react/session.d.ts +91 -0
  82. package/dist/react/session.d.ts.map +1 -0
  83. package/dist/react/session.js +322 -0
  84. package/dist/react/session.js.map +1 -0
  85. package/dist/react/stage.d.ts +23 -0
  86. package/dist/react/stage.d.ts.map +1 -0
  87. package/dist/react/stage.js +62 -0
  88. package/dist/react/stage.js.map +1 -0
  89. package/dist/schemas.d.ts +59 -0
  90. package/dist/schemas.d.ts.map +1 -0
  91. package/dist/schemas.js +58 -0
  92. package/dist/schemas.js.map +1 -0
  93. package/dist/server.d.ts +2 -0
  94. package/dist/server.d.ts.map +1 -0
  95. package/dist/server.js +8 -0
  96. package/dist/server.js.map +1 -0
  97. package/dist/session-socket.d.ts +96 -0
  98. package/dist/session-socket.d.ts.map +1 -0
  99. package/dist/session-socket.js +299 -0
  100. package/dist/session-socket.js.map +1 -0
  101. package/dist/session.d.ts +107 -0
  102. package/dist/session.d.ts.map +1 -0
  103. package/dist/session.js +192 -0
  104. package/dist/session.js.map +1 -0
  105. package/dist/types.d.ts +24 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +2 -0
  108. package/dist/types.js.map +1 -0
  109. package/package.json +94 -0
@@ -0,0 +1,163 @@
1
+ import type { SourceVideoCacheSettings, VideoCachePlan } from "./types";
2
+ export declare const REALTIME_AVATAR_MODEL_IDS: {
3
+ readonly live: "realtime-avatar-live-v1";
4
+ readonly video: "realtime-avatar-video-v1";
5
+ };
6
+ export type RealtimeAvatarPlatformEnvironment = "live" | "test";
7
+ export type PlatformAssetKind = "image" | "video" | "audio";
8
+ export type PlatformAvatarSourceKind = "image" | "video";
9
+ export type PlatformAvatarModelId = (typeof REALTIME_AVATAR_MODEL_IDS)[keyof typeof REALTIME_AVATAR_MODEL_IDS];
10
+ export type PlatformAvatarStatus = "draft" | "preprocessing" | "ready" | "failed" | "disabled" | "deleted";
11
+ export type PlatformAvatarCacheStatus = "queued" | "registering" | "ready" | "stale" | "failed" | "deleted";
12
+ export type PlatformApiKeyScope = "*" | "api_keys:write" | "credits:read" | "avatars:read" | "avatars:write" | "realtime:write" | "usage:read" | "usage:write";
13
+ export type PlatformCreditBalance = {
14
+ tenantId: string;
15
+ balanceCreditMicros: number;
16
+ reservedCreditMicros: number;
17
+ availableCreditMicros: number;
18
+ lifetimeGrantedCreditMicros: number;
19
+ lifetimeUsedCreditMicros: number;
20
+ updatedAt: string;
21
+ };
22
+ export type PlatformAsset = {
23
+ id: string;
24
+ tenantId: string;
25
+ kind: PlatformAssetKind;
26
+ status: "pending_upload" | "uploaded" | "processing" | "ready" | "failed" | "deleted";
27
+ contentType: string;
28
+ sizeBytes: number;
29
+ sha256: string | null;
30
+ publicUrl: string | null;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ };
34
+ export type PlatformAvatar = {
35
+ id: string;
36
+ tenantId: string;
37
+ displayName: string;
38
+ sourceKind: PlatformAvatarSourceKind;
39
+ modelId: PlatformAvatarModelId;
40
+ sourceAssetId: string | null;
41
+ status: PlatformAvatarStatus;
42
+ defaultVoiceId: string | null;
43
+ cacheManifestId: string | null;
44
+ cacheVersion: number;
45
+ createdAt: string;
46
+ updatedAt: string;
47
+ };
48
+ export type UpdatePlatformAvatarRequest = {
49
+ displayName?: string;
50
+ defaultVoiceId?: string | null;
51
+ /** Free-form; `settings.persona` / `metadata.persona` drive the avatar's spoken context. */
52
+ settings?: Record<string, unknown>;
53
+ metadata?: Record<string, unknown>;
54
+ };
55
+ export type CreatePlatformAvatarRequest = {
56
+ displayName: string;
57
+ sourceKind: PlatformAvatarSourceKind;
58
+ modelId?: PlatformAvatarModelId;
59
+ sourceAssetId?: string;
60
+ defaultVoiceId?: string;
61
+ settings?: Record<string, unknown>;
62
+ metadata?: Record<string, unknown>;
63
+ };
64
+ export type UploadPlatformAssetOptions = {
65
+ kind?: PlatformAssetKind;
66
+ filename?: string;
67
+ contentType?: string;
68
+ };
69
+ export type CreateRemotePlatformAssetRequest = {
70
+ kind: PlatformAssetKind;
71
+ remoteUrl: string;
72
+ originalFilename?: string;
73
+ metadata?: Record<string, unknown>;
74
+ };
75
+ export type PlatformAvatarCacheManifest = {
76
+ id: string;
77
+ tenantId: string;
78
+ avatarId: string;
79
+ cacheKey: string;
80
+ sourceKind: PlatformAvatarSourceKind;
81
+ sourceAssetId: string | null;
82
+ status: PlatformAvatarCacheStatus;
83
+ modelId: PlatformAvatar["modelId"];
84
+ backendId: string;
85
+ modalVolumeName: string;
86
+ modalVolumePath: string;
87
+ readyMarkerPath: string | null;
88
+ artifactR2Key: string | null;
89
+ previewR2Key: string | null;
90
+ sourceFingerprint: string | null;
91
+ settingsFingerprint: string | null;
92
+ durationSeconds: number | null;
93
+ frameCount: number | null;
94
+ byteSize: number | null;
95
+ createdAt: string;
96
+ updatedAt: string;
97
+ };
98
+ export type PlanPlatformAvatarVideoCacheRequest = {
99
+ avatar_id: string;
100
+ video_cache?: Partial<SourceVideoCacheSettings>;
101
+ };
102
+ export type PlanPlatformAvatarVideoCacheResponse = {
103
+ status: "queued" | "ready";
104
+ plan: VideoCachePlan;
105
+ manifest: PlatformAvatarCacheManifest;
106
+ };
107
+ export type CreateImageAvatarOptions = {
108
+ displayName: string;
109
+ image: Blob;
110
+ filename?: string;
111
+ defaultVoiceId?: string;
112
+ settings?: Record<string, unknown>;
113
+ metadata?: Record<string, unknown>;
114
+ };
115
+ export type CreateVideoAvatarOptions = {
116
+ displayName: string;
117
+ video: Blob;
118
+ filename?: string;
119
+ defaultVoiceId?: string;
120
+ settings?: Record<string, unknown>;
121
+ metadata?: Record<string, unknown>;
122
+ videoCache?: Partial<SourceVideoCacheSettings>;
123
+ planCache?: boolean;
124
+ };
125
+ export type CreateVideoAvatarFromUrlOptions = {
126
+ displayName: string;
127
+ videoUrl: string;
128
+ filename?: string;
129
+ defaultVoiceId?: string;
130
+ settings?: Record<string, unknown>;
131
+ metadata?: Record<string, unknown>;
132
+ assetMetadata?: Record<string, unknown>;
133
+ videoCache?: Partial<SourceVideoCacheSettings>;
134
+ planCache?: boolean;
135
+ };
136
+ export type CreateImageAvatarResult = {
137
+ asset: PlatformAsset;
138
+ avatar: PlatformAvatar;
139
+ };
140
+ export type CreateVideoAvatarResult = {
141
+ asset: PlatformAsset;
142
+ avatar: PlatformAvatar;
143
+ videoCache: PlanPlatformAvatarVideoCacheResponse | null;
144
+ };
145
+ /**
146
+ * Non-streaming lipsync: render an audio URL to a talking-head MP4 and get back
147
+ * its public URL. Provide an existing `avatarId` or a `portraitUrl` to register
148
+ * on the fly.
149
+ */
150
+ export type LipsyncOptions = {
151
+ audioUrl: string;
152
+ avatarId?: string;
153
+ portraitUrl?: string;
154
+ backgroundId?: string;
155
+ };
156
+ export type LipsyncResult = {
157
+ url: string;
158
+ avatarId: string;
159
+ frames: number;
160
+ fps: number;
161
+ durationSeconds: number;
162
+ };
163
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export const REALTIME_AVATAR_MODEL_IDS = {
2
+ live: "realtime-avatar-live-v1",
3
+ video: "realtime-avatar-video-v1",
4
+ };
5
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,IAAI,EAAE,yBAAyB;IAC/B,KAAK,EAAE,0BAA0B;CACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./provider";
2
+ export * from "./session";
3
+ export * from "./stage";
4
+ export * from "./realtime";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./provider";
2
+ export * from "./session";
3
+ export * from "./stage";
4
+ export * from "./realtime";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import { RealtimeAvatarClient } from "../client";
3
+ import type { RealtimeTurnRequest } from "../types";
4
+ import type { CloudflareWhepPlaybackOptions } from "../browser/webrtc";
5
+ export type RealtimeAvatarProviderMediaOptions = {
6
+ sfu?: "auto" | "off";
7
+ waitForViewer?: boolean;
8
+ waitForViewerMs?: number;
9
+ whep?: CloudflareWhepPlaybackOptions;
10
+ };
11
+ export type RealtimeAvatarProviderDefaults = {
12
+ mode?: "interactive" | "livestream" | "compat";
13
+ media?: "auto" | "off" | RealtimeAvatarProviderMediaOptions;
14
+ transport?: "auto" | "http";
15
+ connectTimeoutMs?: number;
16
+ playoutDelayMs?: number | "adaptive";
17
+ turnDefaults?: Partial<RealtimeTurnRequest>;
18
+ };
19
+ export type RealtimeAvatarProviderProps = {
20
+ /** Shared SDK client. Browser apps usually pass `RealtimeAvatarClient.webProxy(...)`. */
21
+ client?: RealtimeAvatarClient;
22
+ /** Defaults merged into every `useRealtimeAvatar()` call below this provider. */
23
+ defaults?: RealtimeAvatarProviderDefaults;
24
+ children?: ReactNode;
25
+ };
26
+ export type RealtimeAvatarContextValue = {
27
+ client: RealtimeAvatarClient;
28
+ defaults: RealtimeAvatarProviderDefaults;
29
+ };
30
+ /**
31
+ * Optional app-level SDK configuration. Most apps can skip this; use it when
32
+ * self-hosting routes, testing with a mock client, or setting global defaults.
33
+ */
34
+ export declare function RealtimeAvatarProvider(props: RealtimeAvatarProviderProps): ReactElement;
35
+ export declare function useRealtimeAvatarClient(): RealtimeAvatarClient;
36
+ export declare function useRealtimeAvatarContext(): RealtimeAvatarContextValue;
37
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,6BAA6B,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,kCAAkC,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,yFAAyF;IACzF,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,8BAA8B,CAAC;CAC1C,CAAC;AAKF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,YAAY,CASvF;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,wBAAgB,wBAAwB,IAAI,0BAA0B,CAKrE"}
@@ -0,0 +1,33 @@
1
+ import { createContext, createElement, useContext, useMemo } from "react";
2
+ import { RealtimeAvatarClient } from "../client";
3
+ const RealtimeAvatarContext = createContext(null);
4
+ let defaultBrowserClient = null;
5
+ /**
6
+ * Optional app-level SDK configuration. Most apps can skip this; use it when
7
+ * self-hosting routes, testing with a mock client, or setting global defaults.
8
+ */
9
+ export function RealtimeAvatarProvider(props) {
10
+ const { client, defaults, children } = props;
11
+ const fallbackClient = useMemo(() => client ?? RealtimeAvatarClient.webProxy(), [client]);
12
+ const defaultsKey = stableJson(defaults ?? {});
13
+ const value = useMemo(() => ({ client: fallbackClient, defaults: defaults ?? {} }), [fallbackClient, defaultsKey]);
14
+ return createElement(RealtimeAvatarContext.Provider, { value }, children);
15
+ }
16
+ export function useRealtimeAvatarClient() {
17
+ return useRealtimeAvatarContext().client;
18
+ }
19
+ export function useRealtimeAvatarContext() {
20
+ const context = useContext(RealtimeAvatarContext);
21
+ if (context)
22
+ return context;
23
+ defaultBrowserClient ??= RealtimeAvatarClient.webProxy();
24
+ return { client: defaultBrowserClient, defaults: {} };
25
+ }
26
+ function stableJson(value) {
27
+ return JSON.stringify(value, (_key, item) => {
28
+ if (!item || typeof item !== "object" || Array.isArray(item))
29
+ return item;
30
+ return Object.fromEntries(Object.entries(item).sort(([a], [b]) => a.localeCompare(b)));
31
+ });
32
+ }
33
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/react/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAiCjD,MAAM,qBAAqB,GAAG,aAAa,CAAoC,IAAI,CAAC,CAAC;AACrF,IAAI,oBAAoB,GAAgC,IAAI,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,oBAAoB,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,EAC5D,CAAC,cAAc,EAAE,WAAW,CAAC,CAC9B,CAAC;IACF,OAAO,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,wBAAwB,EAAE,CAAC,MAAM,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAClD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,oBAAoB,KAAK,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IACzD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { ReactElement } from "react";
2
+ import { RealtimeAvatarClient } from "../client";
3
+ import type { RealtimeTurnRequest } from "../types";
4
+ import type { CloudflareWhepPlaybackOptions } from "../browser/webrtc";
5
+ import { type UseAvatarSessionResult } from "./session";
6
+ import { type AvatarStageProps } from "./stage";
7
+ export type RealtimeAvatarMode = "interactive" | "livestream" | "compat";
8
+ export type RealtimeAvatarSource = {
9
+ kind: "portrait";
10
+ url?: string | null;
11
+ } | {
12
+ kind: "video";
13
+ url?: string | null;
14
+ cacheId?: string | null;
15
+ };
16
+ export type RealtimeAvatarMediaOptions = {
17
+ /**
18
+ * "auto" attaches the granted SFU/WHEP playback when available. Defaults to
19
+ * "off" in interactive/compat and "auto" in livestream.
20
+ */
21
+ sfu?: "auto" | "off";
22
+ /** If true, prepare does not resolve until WHEP is ready or waitForViewerMs expires. */
23
+ waitForViewer?: boolean;
24
+ waitForViewerMs?: number;
25
+ /** Advanced Cloudflare WHEP tuning. Most apps should omit this. */
26
+ whep?: CloudflareWhepPlaybackOptions;
27
+ };
28
+ export type UseRealtimeAvatarOptions = {
29
+ /**
30
+ * Browser apps usually omit this and let the SDK call `RealtimeAvatarClient.webProxy()`
31
+ * or read the shared client from `RealtimeAvatarProvider`.
32
+ */
33
+ client?: RealtimeAvatarClient;
34
+ avatarId: string;
35
+ source?: RealtimeAvatarSource;
36
+ mode?: RealtimeAvatarMode;
37
+ voiceId?: string;
38
+ backgroundId?: string;
39
+ turnDefaults?: Partial<RealtimeTurnRequest>;
40
+ autoPrepare?: boolean;
41
+ /**
42
+ * Simple form: "auto" | "off". Object form exposes SFU preconnect policy.
43
+ * By default, interactive avoids SFU overhead; livestream preconnects it.
44
+ */
45
+ media?: "auto" | "off" | RealtimeAvatarMediaOptions;
46
+ /** Rare override. Defaults: "auto" except compat => "http". */
47
+ transport?: "auto" | "http";
48
+ connectTimeoutMs?: number;
49
+ playoutDelayMs?: number | "adaptive";
50
+ };
51
+ export type UseRealtimeAvatarResult = UseAvatarSessionResult & {
52
+ mode: RealtimeAvatarMode;
53
+ source: RealtimeAvatarSource | null;
54
+ /** Product-facing alias for `send()`. */
55
+ chat: UseAvatarSessionResult["send"];
56
+ };
57
+ /**
58
+ * Product-facing React hook for app developers. It chooses the right transport
59
+ * policy for the use case:
60
+ * - interactive: lowest-latency WS/canvas, no SFU overhead by default.
61
+ * - livestream: WS/canvas immediately, Cloudflare WHEP/SFU preconnected for viewers.
62
+ * - compat: HTTP streaming only.
63
+ */
64
+ export declare function useRealtimeAvatar(options: UseRealtimeAvatarOptions): UseRealtimeAvatarResult;
65
+ export type RealtimeAvatarViewProps = Omit<AvatarStageProps, "session" | "idleVideoUrl" | "portraitUrl"> & {
66
+ avatar: UseRealtimeAvatarResult;
67
+ /** Override the idle loop inferred from `source.kind === "video"`. */
68
+ idleVideoUrl?: string | null;
69
+ /** Override the portrait/poster inferred from `source.kind === "portrait"`. */
70
+ poster?: string | null;
71
+ };
72
+ /** Product-facing stage for `useRealtimeAvatar()`. */
73
+ export declare function RealtimeAvatarView(props: RealtimeAvatarViewProps): ReactElement;
74
+ //# sourceMappingURL=realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/react/realtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,wFAAwF;IACxF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,IAAI,CAAC,EAAE,6BAA6B,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,0BAA0B,CAAC;IACpD,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,yCAAyC;IACzC,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB,CAqE5F;AAED,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG;IACzG,MAAM,EAAE,uBAAuB,CAAC;IAChC,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,YAAY,CAQ/E"}
@@ -0,0 +1,105 @@
1
+ import { createElement, useMemo } from "react";
2
+ import { useRealtimeAvatarContext } from "./provider";
3
+ import { useAvatarSession } from "./session";
4
+ import { AvatarStage } from "./stage";
5
+ /**
6
+ * Product-facing React hook for app developers. It chooses the right transport
7
+ * policy for the use case:
8
+ * - interactive: lowest-latency WS/canvas, no SFU overhead by default.
9
+ * - livestream: WS/canvas immediately, Cloudflare WHEP/SFU preconnected for viewers.
10
+ * - compat: HTTP streaming only.
11
+ */
12
+ export function useRealtimeAvatar(options) {
13
+ const context = useRealtimeAvatarContext();
14
+ const { client, avatarId, source, mode: modeOption, voiceId, backgroundId, turnDefaults, autoPrepare, media: mediaOption, transport: transportOption, connectTimeoutMs: connectTimeoutMsOption, playoutDelayMs: playoutDelayMsOption, } = options;
15
+ const defaultClient = client ?? context.client;
16
+ const mode = modeOption ?? context.defaults.mode ?? "interactive";
17
+ const media = mediaOption ?? context.defaults.media;
18
+ const transport = transportOption ?? context.defaults.transport;
19
+ const connectTimeoutMs = connectTimeoutMsOption ?? context.defaults.connectTimeoutMs;
20
+ const playoutDelayMs = playoutDelayMsOption ?? context.defaults.playoutDelayMs;
21
+ const mediaKey = stableJson({ mode, media });
22
+ const mediaPolicy = useMemo(() => normalizeRealtimeAvatarMedia(mode, media), [mediaKey]);
23
+ const sourceKind = source?.kind;
24
+ const sourceUrl = source?.url ?? null;
25
+ const sourceCacheId = source?.kind === "video" ? source.cacheId ?? null : null;
26
+ const sessionSource = useMemo(() => sessionSourceFromRealtimeSource(source), [sourceKind, sourceUrl, sourceCacheId]);
27
+ const normalizedSource = useMemo(() => {
28
+ if (!sourceKind)
29
+ return null;
30
+ return sourceKind === "video"
31
+ ? { kind: "video", url: sourceUrl, cacheId: sourceCacheId }
32
+ : { kind: "portrait", url: sourceUrl };
33
+ }, [sourceKind, sourceUrl, sourceCacheId]);
34
+ const turnDefaultsKey = stableJson({ provider: context.defaults.turnDefaults ?? {}, local: turnDefaults ?? {} });
35
+ const resolvedTurnDefaults = useMemo(() => ({
36
+ max_buffer_delay_ms: 90,
37
+ low_latency_first_chunk: true,
38
+ ...(context.defaults.turnDefaults ?? {}),
39
+ ...turnDefaults,
40
+ }), [turnDefaultsKey]);
41
+ const session = useAvatarSession({
42
+ client: defaultClient,
43
+ avatarId,
44
+ ...sessionSource,
45
+ voiceId,
46
+ backgroundId,
47
+ turnDefaults: resolvedTurnDefaults,
48
+ autoPrepare,
49
+ transport: transport ?? (mode === "compat" ? "http" : "auto"),
50
+ media: mediaPolicy.media,
51
+ whep: mediaPolicy.whep,
52
+ waitForMedia: mediaPolicy.waitForMedia,
53
+ waitForMediaMs: mediaPolicy.waitForMediaMs,
54
+ connectTimeoutMs,
55
+ playoutDelayMs,
56
+ });
57
+ return {
58
+ ...session,
59
+ mode,
60
+ source: normalizedSource,
61
+ chat: session.send,
62
+ };
63
+ }
64
+ /** Product-facing stage for `useRealtimeAvatar()`. */
65
+ export function RealtimeAvatarView(props) {
66
+ const { avatar, idleVideoUrl, poster, ...stageProps } = props;
67
+ return createElement(AvatarStage, {
68
+ ...stageProps,
69
+ session: avatar,
70
+ idleVideoUrl: idleVideoUrl ?? (avatar.source?.kind === "video" ? avatar.source.url : null),
71
+ portraitUrl: poster ?? (avatar.source?.kind === "portrait" ? avatar.source.url : null),
72
+ });
73
+ }
74
+ function sessionSourceFromRealtimeSource(source) {
75
+ if (!source)
76
+ return {};
77
+ if (source.kind === "portrait") {
78
+ return { sourceKind: "portrait", portraitUrl: source.url ?? null };
79
+ }
80
+ return {
81
+ sourceKind: "source_video",
82
+ sourceVideoUrl: source.url ?? null,
83
+ videoCacheId: source.cacheId ?? null,
84
+ };
85
+ }
86
+ function normalizeRealtimeAvatarMedia(mode, media) {
87
+ const modeDefault = mode === "livestream" ? "auto" : "off";
88
+ if (!media || typeof media === "string") {
89
+ return { media: media ?? modeDefault };
90
+ }
91
+ return {
92
+ media: media.sfu ?? modeDefault,
93
+ whep: media.whep,
94
+ waitForMedia: media.waitForViewer,
95
+ waitForMediaMs: media.waitForViewerMs,
96
+ };
97
+ }
98
+ function stableJson(value) {
99
+ return JSON.stringify(value, (_key, item) => {
100
+ if (!item || typeof item !== "object" || Array.isArray(item))
101
+ return item;
102
+ return Object.fromEntries(Object.entries(item).sort(([a], [b]) => a.localeCompare(b)));
103
+ });
104
+ }
105
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/react/realtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import type { RefObject } from "react";
2
+ import type { RealtimeAvatarClient } from "../client";
3
+ import type { AvatarSessionConfig, AvatarSessionTransport } from "../session";
4
+ import type { RealtimePrepareResponse, RealtimeTurnRequest } from "../types";
5
+ import { type AvatarPlayerMetrics, type AvatarPlaySummary } from "../browser/player";
6
+ import { type AvatarSessionMediaState } from "../browser/media-session";
7
+ import type { CloudflareWhepPlaybackOptions } from "../browser/webrtc";
8
+ import type { RealtimeMediaPlan } from "../media";
9
+ export type UseAvatarSessionStatus = "idle" | "preparing" | "ready" | "thinking" | "speaking" | "error";
10
+ export type UseAvatarSessionOptions = AvatarSessionConfig & {
11
+ client: RealtimeAvatarClient;
12
+ /** Prepare automatically whenever the avatar/source changes. Default true. */
13
+ autoPrepare?: boolean;
14
+ /**
15
+ * "auto" (default): pin prepare + turns to one GPU container over a single
16
+ * WebSocket when the client supports it, falling back to HTTP transparently.
17
+ * "http": skip the socket entirely.
18
+ */
19
+ transport?: "auto" | "http";
20
+ /** Enables SDK-managed Cloudflare WHEP when the platform grants a media plan. Default "auto". */
21
+ media?: "auto" | "off";
22
+ /** Optional WHEP tuning. The socket/canvas mux remains fallback unless WHEP reaches "playing". */
23
+ whep?: CloudflareWhepPlaybackOptions;
24
+ /** Strict mode only: wait for WHEP before reporting ready. Default false. */
25
+ waitForMedia?: boolean;
26
+ waitForMediaMs?: number;
27
+ /** Cap socket prepare before falling back to HTTP. Defaults to 5s; pass 0 to disable. */
28
+ connectTimeoutMs?: number;
29
+ /** "adaptive" (default) starts playout on the first decodable video frame; a number fixes the legacy delay in ms. */
30
+ playoutDelayMs?: number | "adaptive";
31
+ };
32
+ export type AvatarTurnOptions = {
33
+ /** Prior chat context to send before the user's new message. */
34
+ history?: RealtimeTurnRequest["messages"];
35
+ /** Per-turn request overrides, e.g. source_start_frame or voice settings. */
36
+ turn?: Partial<RealtimeTurnRequest>;
37
+ };
38
+ export type UseAvatarSessionResult = {
39
+ canvasRef: RefObject<HTMLCanvasElement | null>;
40
+ /** Bind to a muted <video> when using SDK-managed WebRTC media. Safe across remounts. */
41
+ videoRef: (node: HTMLVideoElement | null) => void;
42
+ /** Current video element, for apps that need imperative inspection. Prefer `videoRef` for binding. */
43
+ videoElementRef: RefObject<HTMLVideoElement | null>;
44
+ status: UseAvatarSessionStatus;
45
+ ready: boolean;
46
+ busy: boolean;
47
+ error: string | null;
48
+ /** Original error object for callers that need structured details (for example billing/paywall codes). */
49
+ lastError: unknown;
50
+ /** Streaming assistant reply for the current/last turn. */
51
+ text: string;
52
+ /** Last successful prepare response, including runtime timings and source-video cache metadata. */
53
+ prepared: RealtimePrepareResponse | null;
54
+ metrics: AvatarPlayerMetrics;
55
+ /** How turns are running right now ("socket" = single-container low-latency path). */
56
+ transport: AvatarSessionTransport;
57
+ /** Optional media-plane plan returned by the session grant. */
58
+ mediaPlan: RealtimeMediaPlan | null;
59
+ /** WebRTC media state; WS mux/canvas remains the fallback unless this is "playing". */
60
+ mediaState: AvatarSessionMediaState;
61
+ mediaError: string | null;
62
+ /** True once the fallback canvas has drawn a frame for the current turn. */
63
+ canvasLive: boolean;
64
+ /** True once the WHEP video has decoded enough to show. */
65
+ webrtcLive: boolean;
66
+ /** Last play summary, useful for source-video handoff or analytics. */
67
+ lastSummary: AvatarPlaySummary | null;
68
+ /** Unlock browser audio from a user gesture before autoplaying later turns. */
69
+ unlockAudio: () => Promise<void>;
70
+ /** Audio stream tap for recording the exact player output; call `unlockAudio()` first. */
71
+ captureAudioStream: () => MediaStream | null;
72
+ send: (text: string, options?: AvatarTurnOptions) => Promise<AvatarPlaySummary | null>;
73
+ speak: (text: string, options?: Omit<AvatarTurnOptions, "history">) => Promise<AvatarPlaySummary | null>;
74
+ prepare: (options?: {
75
+ signal?: AbortSignal;
76
+ }) => Promise<void>;
77
+ stop: () => void;
78
+ disconnect: () => void;
79
+ };
80
+ /**
81
+ * Drop-in realtime avatar session for React. Owns prepare lifecycle + audio-
82
+ * clocked playback; bind `canvasRef` to a `<canvas>` and call `send`.
83
+ *
84
+ * const avatar = useAvatarSession({ client, avatarId });
85
+ * return <>
86
+ * <canvas ref={avatar.canvasRef} />
87
+ * <button onClick={() => avatar.send("hi")} disabled={!avatar.ready}>Send</button>
88
+ * </>;
89
+ */
90
+ export declare function useAvatarSession(options: UseAvatarSessionOptions): UseAvatarSessionResult;
91
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/react/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAgC,MAAM,WAAW,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAoB,MAAM,YAAY,CAAC;AAChG,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAgB,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAA0B,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAExG,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG;IAC1D,MAAM,EAAE,oBAAoB,CAAC;IAC7B,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,kGAAkG;IAClG,IAAI,CAAC,EAAE,6BAA6B,CAAC;IACrC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qHAAqH;IACrH,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gEAAgE;IAChE,OAAO,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1C,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC/C,yFAAyF;IACzF,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,sGAAsG;IACtG,eAAe,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0GAA0G;IAC1G,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACzC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,sFAAsF;IACtF,SAAS,EAAE,sBAAsB,CAAC;IAClC,+DAA+D;IAC/D,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,uFAAuF;IACvF,UAAU,EAAE,uBAAuB,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,+EAA+E;IAC/E,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,0FAA0F;IAC1F,kBAAkB,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAC7C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACvF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACzG,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAcF;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAqTzF"}