@wix/legends-platform-sdk 1.32.0 → 1.33.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 (73) hide show
  1. package/dist/cjs/components/ChromaKey/ChromaKey.js +14 -4
  2. package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
  3. package/dist/cjs/components/ChromaKey/chroma-key.js +3 -0
  4. package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
  5. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +32 -7
  6. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  7. package/dist/cjs/components/Video/Video.js +16 -2
  8. package/dist/cjs/components/Video/Video.js.map +1 -1
  9. package/dist/cjs/components/Video/types.js.map +1 -1
  10. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js +12 -3
  11. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  12. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +24 -14
  13. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  14. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +11 -3
  15. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  16. package/dist/cjs/sdk-consumer/context.js.map +1 -1
  17. package/dist/cjs/sdk.js +26 -0
  18. package/dist/cjs/sdk.js.map +1 -1
  19. package/dist/cjs/startup-telemetry/attempt.js +188 -0
  20. package/dist/cjs/startup-telemetry/attempt.js.map +1 -0
  21. package/dist/cjs/startup-telemetry/frame.js +83 -0
  22. package/dist/cjs/startup-telemetry/frame.js.map +1 -0
  23. package/dist/cjs/startup-telemetry/useStartupAttempt.js +15 -0
  24. package/dist/cjs/startup-telemetry/useStartupAttempt.js.map +1 -0
  25. package/dist/esm/components/ChromaKey/ChromaKey.js +12 -2
  26. package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
  27. package/dist/esm/components/ChromaKey/chroma-key.js +3 -0
  28. package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
  29. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +28 -3
  30. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  31. package/dist/esm/components/Video/Video.js +16 -1
  32. package/dist/esm/components/Video/Video.js.map +1 -1
  33. package/dist/esm/components/Video/types.js.map +1 -1
  34. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js +11 -2
  35. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  36. package/dist/esm/hooks/useConversation/livekit/useConversation.js +24 -14
  37. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  38. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +11 -3
  39. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  40. package/dist/esm/sdk-consumer/context.js.map +1 -1
  41. package/dist/esm/sdk.js +1 -0
  42. package/dist/esm/sdk.js.map +1 -1
  43. package/dist/esm/startup-telemetry/attempt.js +180 -0
  44. package/dist/esm/startup-telemetry/attempt.js.map +1 -0
  45. package/dist/esm/startup-telemetry/frame.js +77 -0
  46. package/dist/esm/startup-telemetry/frame.js.map +1 -0
  47. package/dist/esm/startup-telemetry/useStartupAttempt.js +10 -0
  48. package/dist/esm/startup-telemetry/useStartupAttempt.js.map +1 -0
  49. package/dist/types/components/ChromaKey/ChromaKey.d.ts +2 -0
  50. package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
  51. package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -0
  52. package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
  53. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +2 -0
  54. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
  55. package/dist/types/components/Video/Video.d.ts +1 -0
  56. package/dist/types/components/Video/Video.d.ts.map +1 -1
  57. package/dist/types/components/Video/types.d.ts +2 -0
  58. package/dist/types/components/Video/types.d.ts.map +1 -1
  59. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts +2 -0
  60. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts.map +1 -1
  61. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  62. package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
  63. package/dist/types/sdk-consumer/context.d.ts +2 -0
  64. package/dist/types/sdk-consumer/context.d.ts.map +1 -1
  65. package/dist/types/sdk.d.ts +2 -0
  66. package/dist/types/sdk.d.ts.map +1 -1
  67. package/dist/types/startup-telemetry/attempt.d.ts +71 -0
  68. package/dist/types/startup-telemetry/attempt.d.ts.map +1 -0
  69. package/dist/types/startup-telemetry/frame.d.ts +6 -0
  70. package/dist/types/startup-telemetry/frame.d.ts.map +1 -0
  71. package/dist/types/startup-telemetry/useStartupAttempt.d.ts +2 -0
  72. package/dist/types/startup-telemetry/useStartupAttempt.d.ts.map +1 -0
  73. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","Object","keys","forEach","key","exports","_useTextChat","_useTranscriptions","_useConversationStatus","_useMicrophone","_useSpeaker","_useCamera","_useMediaRecorder","_useConversationTimer","_useConversationEvents","_useUserActivity","_useAudio","_useConnectionState","_useActivityState","_usePictureInPicture","_useMediaPermissions","_useTools","_types2"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\n\nexport * from './conversation/types';\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","_useTextChat","_useTranscriptions","_useConversationStatus","_useMicrophone","_useSpeaker","_useCamera","_useMediaRecorder","_useConversationTimer","_useConversationEvents","_useUserActivity","_useAudio","_useConnectionState","_useActivityState","_usePictureInPicture","_useMediaPermissions","_useTools","_types2","_attempt","createStartupIntent","StartupAttempt"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\n\nexport * from './conversation/types';\n\nexport {\n createStartupIntent,\n StartupAttempt,\n} from './startup-telemetry/attempt';\nexport type {\n StartupIntent,\n StartupReport,\n StartupTelemetryOptions,\n} from './startup-telemetry/attempt';\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ exports.__esModule = true;
5
+ exports.StartupTelemetrySession = exports.StartupAttempt = void 0;
6
+ exports.createStartupIntent = createStartupIntent;
7
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ /* eslint-env es2020 */
9
+ /** All elapsed times belong to one browser document's monotonic clock. */
10
+
11
+ function newId() {
12
+ var _globalThis$crypto;
13
+ return ((_globalThis$crypto = globalThis.crypto) == null || _globalThis$crypto.randomUUID == null ? void 0 : _globalThis$crypto.randomUUID()) || `startup-${Date.now()}-${Math.random().toString(36).slice(2)}`;
14
+ }
15
+ function createStartupIntent() {
16
+ return {
17
+ id: newId(),
18
+ startedAt: performance.now(),
19
+ timeOrigin: performance.timeOrigin
20
+ };
21
+ }
22
+ class StartupAttempt {
23
+ constructor(options, chatId, intent) {
24
+ this.options = options;
25
+ this.chatId = chatId;
26
+ (0, _defineProperty2.default)(this, "terminal", false);
27
+ (0, _defineProperty2.default)(this, "adoptedBySdk", false);
28
+ (0, _defineProperty2.default)(this, "seen", new Set());
29
+ (0, _defineProperty2.default)(this, "conversationId", void 0);
30
+ (0, _defineProperty2.default)(this, "timeout", void 0);
31
+ (0, _defineProperty2.default)(this, "id", void 0);
32
+ (0, _defineProperty2.default)(this, "startedAt", void 0);
33
+ (0, _defineProperty2.default)(this, "startBoundary", void 0);
34
+ (0, _defineProperty2.default)(this, "visibilityChanged", () => {
35
+ if (document.visibilityState !== 'visible') {
36
+ this.finish('unmeasurable', 'hidden_document');
37
+ }
38
+ });
39
+ const now = performance.now();
40
+ const valid = intent && intent.timeOrigin === performance.timeOrigin && Number.isFinite(intent.startedAt) && intent.startedAt >= 0 && intent.startedAt <= now;
41
+ this.id = valid ? intent.id : newId();
42
+ this.startedAt = valid ? intent.startedAt : now;
43
+ this.startBoundary = valid ? 'user_intent' : 'sdk_create';
44
+ this.timeout = setTimeout(() => this.finish('timeout'), Math.max(0, 120000 - (now - this.startedAt)));
45
+ this.mark('attempt_started');
46
+ if (typeof document !== 'undefined') {
47
+ document.addEventListener('visibilitychange', this.visibilityChanged);
48
+ this.visibilityChanged();
49
+ }
50
+ }
51
+
52
+ /** A pre-SDK terminal attempt must be adopted once, not counted again. */
53
+ claimForSdk() {
54
+ if (this.adoptedBySdk) {
55
+ return false;
56
+ }
57
+ this.adoptedBySdk = true;
58
+ return true;
59
+ }
60
+ get completed() {
61
+ return this.terminal;
62
+ }
63
+ attachChat(chatId) {
64
+ this.chatId = chatId;
65
+ }
66
+ bind(conversationId) {
67
+ this.conversationId = conversationId;
68
+ }
69
+ mark(milestone, method) {
70
+ if (this.terminal || this.seen.has(milestone)) {
71
+ return;
72
+ }
73
+ this.seen.add(milestone);
74
+ this.send(milestone, 'pending', method);
75
+ }
76
+ frame(method) {
77
+ this.finish('success', method);
78
+ }
79
+ finish(outcome, method) {
80
+ if (this.terminal) {
81
+ return;
82
+ }
83
+ this.terminal = true;
84
+ clearTimeout(this.timeout);
85
+ if (typeof document !== 'undefined') {
86
+ document.removeEventListener('visibilitychange', this.visibilityChanged);
87
+ }
88
+ this.send(outcome === 'success' ? 'first_frame' : 'terminal', outcome, method);
89
+ }
90
+ send(milestone, outcome, method) {
91
+ const elapsed = performance.now() - this.startedAt;
92
+ if (!Number.isFinite(elapsed) || elapsed < 0) {
93
+ return;
94
+ }
95
+ try {
96
+ var _this$options$report, _this$options;
97
+ const result = (_this$options$report = (_this$options = this.options).report) == null ? void 0 : _this$options$report.call(_this$options, {
98
+ attemptId: this.id,
99
+ chatId: this.chatId,
100
+ conversationId: this.conversationId,
101
+ milestone,
102
+ elapsedMs: Math.ceil(elapsed),
103
+ clientStartUnixMs: Math.floor(performance.timeOrigin + this.startedAt),
104
+ outcome,
105
+ startBoundary: this.startBoundary,
106
+ method,
107
+ application: this.options.application,
108
+ applicationVersion: this.options.applicationVersion,
109
+ entryCoverage: this.options.entryCoverage || 'sdk_only',
110
+ measurementVersion: 1
111
+ });
112
+ // BI failures must not produce unhandled promise rejections or break media.
113
+ if (result) {
114
+ void Promise.resolve(result).catch(() => undefined);
115
+ }
116
+ } catch {
117
+ /* Reporting is best effort; conversation behavior is unchanged. */
118
+ }
119
+ }
120
+ }
121
+ exports.StartupAttempt = StartupAttempt;
122
+ class StartupTelemetrySession {
123
+ constructor(options, chatId) {
124
+ this.options = options;
125
+ this.chatId = chatId;
126
+ (0, _defineProperty2.default)(this, "attempts", new Map());
127
+ (0, _defineProperty2.default)(this, "leases", new Map());
128
+ (0, _defineProperty2.default)(this, "active", void 0);
129
+ (0, _defineProperty2.default)(this, "terminalAtCreation", void 0);
130
+ (0, _defineProperty2.default)(this, "intentConsumed", false);
131
+ }
132
+ start() {
133
+ if (!this.options.enabled || !this.options.report) {
134
+ return undefined;
135
+ }
136
+ if (this.active && (!this.active.completed || this.active === this.terminalAtCreation && (this.leases.get(this.active) || 0) === 0)) {
137
+ this.leases.set(this.active, (this.leases.get(this.active) || 0) + 1);
138
+ return this.active;
139
+ }
140
+ const provided = !this.intentConsumed && this.options.attempt && this.options.attempt.claimForSdk() ? this.options.attempt : undefined;
141
+ const attempt = provided || new StartupAttempt({
142
+ ...this.options,
143
+ entryCoverage: 'sdk_only'
144
+ }, this.chatId, this.intentConsumed ? undefined : this.options.intent);
145
+ attempt.attachChat(this.chatId);
146
+ this.intentConsumed = true;
147
+ this.active = attempt;
148
+ this.terminalAtCreation = attempt.completed ? attempt : undefined;
149
+ this.leases.set(attempt, 1);
150
+ return attempt;
151
+ }
152
+ bind(attempt, id) {
153
+ if (!attempt) {
154
+ return;
155
+ }
156
+ attempt.bind(id);
157
+ this.attempts.set(id, attempt);
158
+ // A provider normally owns one conversation; bound memory across retries.
159
+ if (this.attempts.size > 8) {
160
+ var _this$attempts$get;
161
+ const oldest = this.attempts.keys().next().value;
162
+ (_this$attempts$get = this.attempts.get(oldest)) == null || _this$attempts$get.finish('cancelled');
163
+ this.attempts.delete(oldest);
164
+ }
165
+ }
166
+ get(id) {
167
+ return id ? this.attempts.get(id) : undefined;
168
+ }
169
+ release(attempt) {
170
+ if (!attempt) {
171
+ return;
172
+ }
173
+ this.leases.set(attempt, Math.max(0, (this.leases.get(attempt) || 0) - 1));
174
+ // StrictMode immediately replays effects. Cancel only if no setup reclaimed
175
+ // this attempt by the microtask boundary; real unmounts still terminate it.
176
+ void Promise.resolve().then(() => {
177
+ if (this.leases.get(attempt) === 0) {
178
+ attempt.finish('cancelled');
179
+ this.leases.delete(attempt);
180
+ if (this.active === attempt) {
181
+ this.active = undefined;
182
+ }
183
+ }
184
+ });
185
+ }
186
+ }
187
+ exports.StartupTelemetrySession = StartupTelemetrySession;
188
+ //# sourceMappingURL=attempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["newId","_globalThis$crypto","globalThis","crypto","randomUUID","Date","now","Math","random","toString","slice","createStartupIntent","id","startedAt","performance","timeOrigin","StartupAttempt","constructor","options","chatId","intent","_defineProperty2","default","Set","document","visibilityState","finish","valid","Number","isFinite","startBoundary","timeout","setTimeout","max","mark","addEventListener","visibilityChanged","claimForSdk","adoptedBySdk","completed","terminal","attachChat","bind","conversationId","milestone","method","seen","has","add","send","frame","outcome","clearTimeout","removeEventListener","elapsed","_this$options$report","_this$options","result","report","call","attemptId","elapsedMs","ceil","clientStartUnixMs","floor","application","applicationVersion","entryCoverage","measurementVersion","Promise","resolve","catch","undefined","exports","StartupTelemetrySession","Map","start","enabled","active","terminalAtCreation","leases","get","set","provided","intentConsumed","attempt","attempts","size","_this$attempts$get","oldest","keys","next","value","delete","release","then"],"sources":["../../../src/startup-telemetry/attempt.ts"],"sourcesContent":["/* eslint-env es2020 */\n/** All elapsed times belong to one browser document's monotonic clock. */\nexport type StartupMilestone =\n | 'attempt_started'\n | 'api_request'\n | 'api_response'\n | 'join_requested'\n | 'room_connected'\n | 'agent_joined'\n | 'track_subscribed'\n | 'first_frame'\n | 'terminal';\nexport type StartupOutcome =\n | 'pending'\n | 'success'\n | 'error'\n | 'cancelled'\n | 'timeout'\n | 'unmeasurable';\nexport type StartupIntent = {\n id: string;\n startedAt: number;\n timeOrigin: number;\n};\nexport type StartupReport = {\n attemptId: string;\n chatId: string;\n conversationId?: string;\n milestone: StartupMilestone;\n elapsedMs: number;\n clientStartUnixMs: number;\n outcome: StartupOutcome;\n startBoundary: 'user_intent' | 'sdk_create';\n method?: string;\n application: string;\n applicationVersion?: string;\n entryCoverage: 'user_handler' | 'sdk_only';\n measurementVersion: number;\n};\nexport type StartupTelemetryOptions = {\n enabled: boolean;\n intent?: StartupIntent;\n attempt?: StartupAttempt;\n application: string;\n applicationVersion?: string;\n entryCoverage?: 'user_handler' | 'sdk_only';\n report?: (event: StartupReport) => void | Promise<unknown>;\n};\n\nfunction newId() {\n return (\n globalThis.crypto?.randomUUID?.() ||\n `startup-${Date.now()}-${Math.random().toString(36).slice(2)}`\n );\n}\n\nexport function createStartupIntent(): StartupIntent {\n return {\n id: newId(),\n startedAt: performance.now(),\n timeOrigin: performance.timeOrigin,\n };\n}\n\nexport class StartupAttempt {\n private terminal = false;\n private adoptedBySdk = false;\n private seen = new Set<StartupMilestone>();\n private conversationId?: string;\n private timeout?: ReturnType<typeof setTimeout>;\n readonly id: string;\n readonly startedAt: number;\n readonly startBoundary: 'user_intent' | 'sdk_create';\n private visibilityChanged = () => {\n if (document.visibilityState !== 'visible') {\n this.finish('unmeasurable', 'hidden_document');\n }\n };\n\n constructor(\n private options: StartupTelemetryOptions,\n private chatId: string,\n intent?: StartupIntent,\n ) {\n const now = performance.now();\n const valid =\n intent &&\n intent.timeOrigin === performance.timeOrigin &&\n Number.isFinite(intent.startedAt) &&\n intent.startedAt >= 0 &&\n intent.startedAt <= now;\n this.id = valid ? intent.id : newId();\n this.startedAt = valid ? intent.startedAt : now;\n this.startBoundary = valid ? 'user_intent' : 'sdk_create';\n this.timeout = setTimeout(\n () => this.finish('timeout'),\n Math.max(0, 120000 - (now - this.startedAt)),\n );\n this.mark('attempt_started');\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.visibilityChanged);\n this.visibilityChanged();\n }\n }\n\n /** A pre-SDK terminal attempt must be adopted once, not counted again. */\n claimForSdk() {\n if (this.adoptedBySdk) {\n return false;\n }\n this.adoptedBySdk = true;\n return true;\n }\n\n get completed() {\n return this.terminal;\n }\n\n attachChat(chatId: string) {\n this.chatId = chatId;\n }\n\n bind(conversationId: string) {\n this.conversationId = conversationId;\n }\n\n mark(milestone: StartupMilestone, method?: string) {\n if (this.terminal || this.seen.has(milestone)) {\n return;\n }\n this.seen.add(milestone);\n this.send(milestone, 'pending', method);\n }\n\n frame(method: string) {\n this.finish('success', method);\n }\n\n finish(outcome: Exclude<StartupOutcome, 'pending'>, method?: string) {\n if (this.terminal) {\n return;\n }\n this.terminal = true;\n clearTimeout(this.timeout);\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.visibilityChanged);\n }\n this.send(\n outcome === 'success' ? 'first_frame' : 'terminal',\n outcome,\n method,\n );\n }\n\n private send(\n milestone: StartupMilestone,\n outcome: StartupOutcome,\n method?: string,\n ) {\n const elapsed = performance.now() - this.startedAt;\n if (!Number.isFinite(elapsed) || elapsed < 0) {\n return;\n }\n try {\n const result = this.options.report?.({\n attemptId: this.id,\n chatId: this.chatId,\n conversationId: this.conversationId,\n milestone,\n elapsedMs: Math.ceil(elapsed),\n clientStartUnixMs: Math.floor(performance.timeOrigin + this.startedAt),\n outcome,\n startBoundary: this.startBoundary,\n method,\n application: this.options.application,\n applicationVersion: this.options.applicationVersion,\n entryCoverage: this.options.entryCoverage || 'sdk_only',\n measurementVersion: 1,\n });\n // BI failures must not produce unhandled promise rejections or break media.\n if (result) {\n void Promise.resolve(result).catch(() => undefined);\n }\n } catch {\n /* Reporting is best effort; conversation behavior is unchanged. */\n }\n }\n}\n\nexport class StartupTelemetrySession {\n private attempts = new Map<string, StartupAttempt>();\n private leases = new Map<StartupAttempt, number>();\n private active?: StartupAttempt;\n private terminalAtCreation?: StartupAttempt;\n private intentConsumed = false;\n constructor(\n private options: StartupTelemetryOptions,\n private chatId: string,\n ) {}\n\n start(): StartupAttempt | undefined {\n if (!this.options.enabled || !this.options.report) {\n return undefined;\n }\n if (\n this.active &&\n (!this.active.completed ||\n (this.active === this.terminalAtCreation &&\n (this.leases.get(this.active) || 0) === 0))\n ) {\n this.leases.set(this.active, (this.leases.get(this.active) || 0) + 1);\n return this.active;\n }\n const provided =\n !this.intentConsumed &&\n this.options.attempt &&\n this.options.attempt.claimForSdk()\n ? this.options.attempt\n : undefined;\n const attempt =\n provided ||\n new StartupAttempt(\n { ...this.options, entryCoverage: 'sdk_only' },\n this.chatId,\n this.intentConsumed ? undefined : this.options.intent,\n );\n attempt.attachChat(this.chatId);\n this.intentConsumed = true;\n this.active = attempt;\n this.terminalAtCreation = attempt.completed ? attempt : undefined;\n this.leases.set(attempt, 1);\n return attempt;\n }\n\n bind(attempt: StartupAttempt | undefined, id: string) {\n if (!attempt) {\n return;\n }\n attempt.bind(id);\n this.attempts.set(id, attempt);\n // A provider normally owns one conversation; bound memory across retries.\n if (this.attempts.size > 8) {\n const oldest = this.attempts.keys().next().value as string;\n this.attempts.get(oldest)?.finish('cancelled');\n this.attempts.delete(oldest);\n }\n }\n\n get(id?: string) {\n return id ? this.attempts.get(id) : undefined;\n }\n release(attempt?: StartupAttempt) {\n if (!attempt) {\n return;\n }\n this.leases.set(attempt, Math.max(0, (this.leases.get(attempt) || 0) - 1));\n // StrictMode immediately replays effects. Cancel only if no setup reclaimed\n // this attempt by the microtask boundary; real unmounts still terminate it.\n void Promise.resolve().then(() => {\n if (this.leases.get(attempt) === 0) {\n attempt.finish('cancelled');\n this.leases.delete(attempt);\n if (this.active === attempt) {\n this.active = undefined;\n }\n }\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.isSurfaceVisible = isSurfaceVisible;
5
+ exports.observeVideoFrame = observeVideoFrame;
6
+ exports.recordCanvasFrame = recordCanvasFrame;
7
+ /** A presentation milestone, not proof of photons or user attention. */
8
+ function isSurfaceVisible(element) {
9
+ if (document.visibilityState !== 'visible' || !element.isConnected) {
10
+ return false;
11
+ }
12
+ const bounds = element.getBoundingClientRect();
13
+ if (bounds.width <= 0 || bounds.height <= 0 || bounds.bottom <= 0 || bounds.right <= 0 || bounds.top >= innerHeight || bounds.left >= innerWidth) {
14
+ return false;
15
+ }
16
+ for (let current = element; current; current = current.parentElement) {
17
+ const style = getComputedStyle(current);
18
+ if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || style.opacity !== '' && Number(style.opacity) === 0) {
19
+ return false;
20
+ }
21
+ }
22
+ return true;
23
+ }
24
+ function recordCanvasFrame(attempt, canvas, video) {
25
+ if (!attempt || attempt.completed || video.readyState < 2 || !canvas.width || !canvas.height) {
26
+ return;
27
+ }
28
+ if (document.visibilityState !== 'visible') {
29
+ attempt.finish('unmeasurable', 'hidden_document');
30
+ return;
31
+ }
32
+ if (isSurfaceVisible(canvas)) {
33
+ attempt.frame('canvas_draw');
34
+ }
35
+ }
36
+ function observeVideoFrame(attempt, video) {
37
+ if (attempt.completed) {
38
+ return () => undefined;
39
+ }
40
+ if (document.visibilityState !== 'visible') {
41
+ attempt.finish('unmeasurable', 'hidden_document');
42
+ return () => undefined;
43
+ }
44
+ if (!video.requestVideoFrameCallback) {
45
+ attempt.finish('unmeasurable', 'unsupported_video_frame_callback');
46
+ return () => undefined;
47
+ }
48
+ let active = true;
49
+ let handle;
50
+ const stop = () => {
51
+ active = false;
52
+ document.removeEventListener('visibilitychange', visibilityChanged);
53
+ if (handle !== undefined) {
54
+ video.cancelVideoFrameCallback(handle);
55
+ }
56
+ };
57
+ function visibilityChanged() {
58
+ if (document.visibilityState !== 'visible') {
59
+ attempt.finish('unmeasurable', 'hidden_document');
60
+ stop();
61
+ }
62
+ }
63
+ const frame = () => {
64
+ if (!active || attempt.completed) {
65
+ stop();
66
+ return;
67
+ }
68
+ if (document.visibilityState !== 'visible') {
69
+ visibilityChanged();
70
+ return;
71
+ }
72
+ if (isSurfaceVisible(video)) {
73
+ attempt.frame('video_frame_callback');
74
+ stop();
75
+ return;
76
+ }
77
+ handle = video.requestVideoFrameCallback(frame);
78
+ };
79
+ document.addEventListener('visibilitychange', visibilityChanged);
80
+ handle = video.requestVideoFrameCallback(frame);
81
+ return stop;
82
+ }
83
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isSurfaceVisible","element","document","visibilityState","isConnected","bounds","getBoundingClientRect","width","height","bottom","right","top","innerHeight","left","innerWidth","current","parentElement","style","getComputedStyle","display","visibility","opacity","Number","recordCanvasFrame","attempt","canvas","video","completed","readyState","finish","frame","observeVideoFrame","undefined","requestVideoFrameCallback","active","handle","stop","removeEventListener","visibilityChanged","cancelVideoFrameCallback","addEventListener"],"sources":["../../../src/startup-telemetry/frame.ts"],"sourcesContent":["import type { StartupAttempt } from './attempt';\n\n/** A presentation milestone, not proof of photons or user attention. */\nexport function isSurfaceVisible(element: HTMLElement): boolean {\n if (document.visibilityState !== 'visible' || !element.isConnected) {\n return false;\n }\n const bounds = element.getBoundingClientRect();\n if (\n bounds.width <= 0 ||\n bounds.height <= 0 ||\n bounds.bottom <= 0 ||\n bounds.right <= 0 ||\n bounds.top >= innerHeight ||\n bounds.left >= innerWidth\n ) {\n return false;\n }\n for (\n let current: HTMLElement | null = element;\n current;\n current = current.parentElement\n ) {\n const style = getComputedStyle(current);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n style.visibility === 'collapse' ||\n (style.opacity !== '' && Number(style.opacity) === 0)\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function recordCanvasFrame(\n attempt: StartupAttempt | undefined,\n canvas: HTMLCanvasElement,\n video: HTMLVideoElement,\n) {\n if (\n !attempt ||\n attempt.completed ||\n video.readyState < 2 ||\n !canvas.width ||\n !canvas.height\n ) {\n return;\n }\n if (document.visibilityState !== 'visible') {\n attempt.finish('unmeasurable', 'hidden_document');\n return;\n }\n if (isSurfaceVisible(canvas)) {\n attempt.frame('canvas_draw');\n }\n}\n\nexport function observeVideoFrame(\n attempt: StartupAttempt,\n video: HTMLVideoElement,\n): () => void {\n if (attempt.completed) {\n return () => undefined;\n }\n if (document.visibilityState !== 'visible') {\n attempt.finish('unmeasurable', 'hidden_document');\n return () => undefined;\n }\n if (!video.requestVideoFrameCallback) {\n attempt.finish('unmeasurable', 'unsupported_video_frame_callback');\n return () => undefined;\n }\n let active = true;\n let handle: number | undefined;\n const stop = () => {\n active = false;\n document.removeEventListener('visibilitychange', visibilityChanged);\n if (handle !== undefined) {\n video.cancelVideoFrameCallback(handle);\n }\n };\n function visibilityChanged() {\n if (document.visibilityState !== 'visible') {\n attempt.finish('unmeasurable', 'hidden_document');\n stop();\n }\n }\n const frame = () => {\n if (!active || attempt.completed) {\n stop();\n return;\n }\n if (document.visibilityState !== 'visible') {\n visibilityChanged();\n return;\n }\n if (isSurfaceVisible(video)) {\n attempt.frame('video_frame_callback');\n stop();\n return;\n }\n handle = video.requestVideoFrameCallback(frame);\n };\n document.addEventListener('visibilitychange', visibilityChanged);\n handle = video.requestVideoFrameCallback(frame);\n return stop;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useStartupAttempt = useStartupAttempt;
5
+ var _jotai = require("jotai");
6
+ var _conversation = require("../conversation");
7
+ var _sdkConsumer = require("../sdk-consumer");
8
+ function useStartupAttempt() {
9
+ const {
10
+ startupTelemetrySession
11
+ } = (0, _sdkConsumer.useSdkConsumer)();
12
+ const conversation = (0, _jotai.useAtomValue)(_conversation.state.conversation);
13
+ return startupTelemetrySession == null ? void 0 : startupTelemetrySession.get(conversation == null ? void 0 : conversation.id);
14
+ }
15
+ //# sourceMappingURL=useStartupAttempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_jotai","require","_conversation","_sdkConsumer","useStartupAttempt","startupTelemetrySession","useSdkConsumer","conversation","useAtomValue","state","get","id"],"sources":["../../../src/startup-telemetry/useStartupAttempt.ts"],"sourcesContent":["import { useAtomValue } from 'jotai';\nimport { state } from '../conversation';\nimport { useSdkConsumer } from '../sdk-consumer';\n\nexport function useStartupAttempt() {\n const { startupTelemetrySession } = useSdkConsumer();\n const conversation = useAtomValue(state.conversation);\n return startupTelemetrySession?.get(conversation?.id);\n}\n"],"mappings":";;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAEO,SAASG,iBAAiBA,CAAA,EAAG;EAClC,MAAM;IAAEC;EAAwB,CAAC,GAAG,IAAAC,2BAAc,EAAC,CAAC;EACpD,MAAMC,YAAY,GAAG,IAAAC,mBAAY,EAACC,mBAAK,CAACF,YAAY,CAAC;EACrD,OAAOF,uBAAuB,oBAAvBA,uBAAuB,CAAEK,GAAG,CAACH,YAAY,oBAAZA,YAAY,CAAEI,EAAE,CAAC;AACvD","ignoreList":[]}
@@ -1,5 +1,7 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
2
2
  const _excluded = ["className", "style", "width", "height", "pip", "pipFallback", "onPiPEnter", "onPiPExit", "onPiPError"];
3
+ import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';
4
+ import { recordCanvasFrame } from '../../startup-telemetry/frame';
3
5
  import React, { useEffect, useRef, useState } from 'react';
4
6
  import { chromaKey } from './chroma-key';
5
7
  import { pipActiveAtom, usePictureInPictureAuto } from '../../hooks/usePictureInPicture';
@@ -35,6 +37,8 @@ export function ChromaKey(props) {
35
37
  const _useState2 = useState(null),
36
38
  isWebGLAvailable = _useState2[0],
37
39
  setIsWebGLAvailable = _useState2[1];
40
+ const startupAttempt = useStartupAttempt();
41
+ const visibleAttempt = children.props.type === 'agent' ? startupAttempt : undefined;
38
42
  const $video = useRef(null);
39
43
  const $canvas = useRef(null);
40
44
  const isPiPActive = useAtomValue(pipActiveAtom);
@@ -59,7 +63,12 @@ export function ChromaKey(props) {
59
63
  spill,
60
64
  similarity,
61
65
  smoothness,
62
- background
66
+ background,
67
+ onFrameDrawn: () => {
68
+ if ($canvas.current && $video.current) {
69
+ recordCanvasFrame(visibleAttempt, $canvas.current, $video.current);
70
+ }
71
+ }
63
72
  });
64
73
  setIsWebGLAvailable(process !== null);
65
74
  if (!process) {
@@ -86,7 +95,7 @@ export function ChromaKey(props) {
86
95
  isActive = false;
87
96
  cancelAnimationFrame(rafId);
88
97
  };
89
- }, [color, spill, similarity, smoothness, isPlayable, debug, background]);
98
+ }, [color, spill, similarity, smoothness, isPlayable, debug, background, visibleAttempt]);
90
99
  return /*#__PURE__*/React.createElement("div", {
91
100
  className: className,
92
101
  style: {
@@ -111,6 +120,7 @@ export function ChromaKey(props) {
111
120
  }), !isPlayable && fallback, showPipFallback && pipFallback, /*#__PURE__*/React.cloneElement(children, {
112
121
  ...restVideoProps,
113
122
  // cloneElement retains original props; only ChromaKey should own PiP.
123
+ startupRenderSurface: useVideoFallback ? 'video' : 'canvas',
114
124
  pip: false,
115
125
  pipFallback: undefined,
116
126
  onPiPEnter: undefined,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","useState","chromaKey","pipActiveAtom","usePictureInPictureAuto","useAtomValue","ChromaKey","props","_props$debug","debug","children","_props$color","color","_props$spill","spill","_props$smoothness","smoothness","_props$similarity","similarity","fallback","background","_children$props","className","style","width","height","pip","pipFallback","onPiPEnter","onPiPExit","onPiPError","restVideoProps","_objectWithoutPropertiesLoose","_excluded","_useState","isPlayable","setIsPlayable","_useState2","isWebGLAvailable","setIsWebGLAvailable","$video","$canvas","isPiPActive","useVideoFallback","pipElement","current","element","onEnter","onExit","onError","showPipFallback","console","warn","process","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","ref","display","position","opacity","pointerEvents","visibility","zIndex","cloneElement","undefined","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n pip?: boolean;\n pipFallback?: React.ReactNode;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n pipFallback,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n const [isWebGLAvailable, setIsWebGLAvailable] = useState<boolean | null>(\n null,\n );\n\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n const useVideoFallback = isWebGLAvailable === false;\n const pipElement =\n isWebGLAvailable === null\n ? null\n : useVideoFallback\n ? $video.current\n : $canvas.current;\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? pipElement : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n });\n setIsWebGLAvailable(process !== null);\n if (!process) {\n return;\n }\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [color, spill, similarity, smoothness, isPlayable, debug, background]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: useVideoFallback || showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n {showPipFallback && pipFallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n // cloneElement retains original props; only ChromaKey should own PiP.\n pip: false,\n pipFallback: undefined,\n onPiPEnter: undefined,\n onPiPExit: undefined,\n onPiPError: undefined,\n ref: $video,\n style: useVideoFallback\n ? {\n width: '100%',\n height: '100%',\n ...style,\n display: isPlayable && !showPipFallback ? style?.display : 'none',\n }\n : { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useStartupAttempt","recordCanvasFrame","React","useEffect","useRef","useState","chromaKey","pipActiveAtom","usePictureInPictureAuto","useAtomValue","ChromaKey","props","_props$debug","debug","children","_props$color","color","_props$spill","spill","_props$smoothness","smoothness","_props$similarity","similarity","fallback","background","_children$props","className","style","width","height","pip","pipFallback","onPiPEnter","onPiPExit","onPiPError","restVideoProps","_objectWithoutPropertiesLoose","_excluded","_useState","isPlayable","setIsPlayable","_useState2","isWebGLAvailable","setIsWebGLAvailable","startupAttempt","visibleAttempt","type","undefined","$video","$canvas","isPiPActive","useVideoFallback","pipElement","current","element","onEnter","onExit","onError","showPipFallback","console","warn","process","onFrameDrawn","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","ref","display","position","opacity","pointerEvents","visibility","zIndex","cloneElement","startupRenderSurface","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';\nimport { recordCanvasFrame } from '../../startup-telemetry/frame';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n startupRenderSurface?: 'video' | 'canvas';\n type?: 'agent' | 'user' | 'screen';\n pip?: boolean;\n pipFallback?: React.ReactNode;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n pipFallback,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n const [isWebGLAvailable, setIsWebGLAvailable] = useState<boolean | null>(\n null,\n );\n\n const startupAttempt = useStartupAttempt();\n const visibleAttempt =\n children.props.type === 'agent' ? startupAttempt : undefined;\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n const useVideoFallback = isWebGLAvailable === false;\n const pipElement =\n isWebGLAvailable === null\n ? null\n : useVideoFallback\n ? $video.current\n : $canvas.current;\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? pipElement : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n onFrameDrawn: () => {\n if ($canvas.current && $video.current) {\n recordCanvasFrame(visibleAttempt, $canvas.current, $video.current);\n }\n },\n });\n setIsWebGLAvailable(process !== null);\n if (!process) {\n return;\n }\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [\n color,\n spill,\n similarity,\n smoothness,\n isPlayable,\n debug,\n background,\n visibleAttempt,\n ]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: useVideoFallback || showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n {showPipFallback && pipFallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n // cloneElement retains original props; only ChromaKey should own PiP.\n startupRenderSurface: useVideoFallback ? 'video' : 'canvas',\n pip: false,\n pipFallback: undefined,\n onPiPEnter: undefined,\n onPiPExit: undefined,\n onPiPError: undefined,\n ref: $video,\n style: useVideoFallback\n ? {\n width: '100%',\n height: '100%',\n ...style,\n display: isPlayable && !showPipFallback ? style?.display : 'none',\n }\n : { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -88,6 +88,9 @@ export function chromaKey($video, $canvas, options) {
88
88
  gl.uniform3f($color$, parseInt(color.substr(1, 2), 16) / 255, parseInt(color.substr(3, 2), 16) / 255, parseInt(color.substr(5, 2), 16) / 255);
89
89
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);
90
90
  gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
91
+ if (!gl.isContextLost()) {
92
+ options.onFrameDrawn == null || options.onFrameDrawn();
93
+ }
91
94
  };
92
95
  }
93
96
  //# sourceMappingURL=chroma-key.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["invariant","shaders","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","r","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback | null {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n if (!gl) {\n return null;\n }\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["invariant","shaders","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","r","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN","isContextLost","onFrameDrawn"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n onFrameDrawn?: () => void;\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback | null {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n if (!gl) {\n return null;\n }\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n if (!gl.isContextLost()) {\n options.onFrameDrawn?.();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,13 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useMemo, useRef } from 'react';
2
2
  import { Provider, createStore } from 'jotai';
3
3
  import { LiveKitRoom } from '@livekit/components-react';
4
4
  import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
5
5
  import { Provider as BusProvider } from 'react-bus';
6
6
  import { FetchPersonaChatService } from '../../services/FetchPersonaChatService';
7
7
  import { SdkConsumerContext } from '../../sdk-consumer';
8
+ import { StartupTelemetrySession } from '../../startup-telemetry/attempt';
8
9
  export function LegendsPlatform(props) {
10
+ var _props$startupTelemet, _props$startupTelemet2, _props$startupTelemet3;
9
11
  const chatId = props.chatId,
10
12
  namespace = props.namespace,
11
13
  children = props.children,
@@ -32,12 +34,35 @@ export function LegendsPlatform(props) {
32
34
  }
33
35
  return undefined;
34
36
  }, [personaChatService, apiKey]);
37
+ const telemetryRef = useRef(props.startupTelemetry);
38
+ telemetryRef.current = props.startupTelemetry;
39
+ const telemetryEnabled = (_props$startupTelemet = props.startupTelemetry) == null ? void 0 : _props$startupTelemet.enabled;
40
+ const intentId = (_props$startupTelemet2 = props.startupTelemetry) == null || (_props$startupTelemet2 = _props$startupTelemet2.intent) == null ? void 0 : _props$startupTelemet2.id;
41
+ const attemptId = (_props$startupTelemet3 = props.startupTelemetry) == null || (_props$startupTelemet3 = _props$startupTelemet3.attempt) == null ? void 0 : _props$startupTelemet3.id;
42
+ const startupTelemetrySession = useMemo(() => {
43
+ const config = telemetryRef.current;
44
+ if (!telemetryEnabled || !config) {
45
+ return undefined;
46
+ }
47
+ return new StartupTelemetrySession({
48
+ ...config,
49
+ report: event => {
50
+ var _telemetryRef$current;
51
+ if ((_telemetryRef$current = telemetryRef.current) != null && _telemetryRef$current.enabled) {
52
+ return telemetryRef.current.report == null ? void 0 : telemetryRef.current.report(event);
53
+ }
54
+ return undefined;
55
+ }
56
+ }, chatId);
57
+ // A new intent/attempt changes ownership; report callbacks stay live via the ref.
58
+ }, [chatId, telemetryEnabled, intentId, attemptId]);
35
59
  const consumer = useMemo(() => ({
36
60
  chatId,
37
61
  namespace,
38
62
  tools,
39
- personaChatService: resolvedService
40
- }), [chatId, namespace, tools, resolvedService]);
63
+ personaChatService: resolvedService,
64
+ startupTelemetrySession
65
+ }), [chatId, namespace, tools, resolvedService, startupTelemetrySession]);
41
66
  return /*#__PURE__*/React.createElement(SdkConsumerContext.Provider, {
42
67
  value: consumer
43
68
  }, /*#__PURE__*/React.createElement(QueryClientProvider, {