@opengeni/react 0.57.0 → 2.2.0-canary.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 (174) hide show
  1. package/README.md +36 -11
  2. package/dist/artifacts-spreadsheet.js +1 -1
  3. package/dist/artifacts.js +1 -1
  4. package/dist/browser-viewer-GXUICIAG.js +14 -0
  5. package/dist/{chunk-R3AZOAB5.js → chunk-4MDLEHXL.js} +9 -115
  6. package/dist/chunk-4MDLEHXL.js.map +1 -0
  7. package/dist/{chunk-Y7OEDUJ5.js → chunk-5RZN3DD5.js} +1014 -420
  8. package/dist/chunk-5RZN3DD5.js.map +1 -0
  9. package/dist/chunk-5YK2ZDIG.js +116 -0
  10. package/dist/chunk-5YK2ZDIG.js.map +1 -0
  11. package/dist/chunk-H5YGYNXS.js +329 -0
  12. package/dist/chunk-H5YGYNXS.js.map +1 -0
  13. package/dist/{chunk-7WCLAEFV.js → chunk-ICA6R6TW.js} +2 -2
  14. package/dist/{chunk-7WCLAEFV.js.map → chunk-ICA6R6TW.js.map} +1 -1
  15. package/dist/{chunk-IGC6A2ZI.js → chunk-JOAVA2TW.js} +589 -217
  16. package/dist/chunk-JOAVA2TW.js.map +1 -0
  17. package/dist/{chunk-5UQPNLIO.js → chunk-LTCHJ4MS.js} +9 -9
  18. package/dist/chunk-LTCHJ4MS.js.map +1 -0
  19. package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
  20. package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
  21. package/dist/chunk-QGBJ6GHG.js +2300 -0
  22. package/dist/chunk-QGBJ6GHG.js.map +1 -0
  23. package/dist/{chunk-B6WPZSTT.js → chunk-UOLJWT5Y.js} +78 -16
  24. package/dist/chunk-UOLJWT5Y.js.map +1 -0
  25. package/dist/{chunk-MKPIAGVL.js → chunk-W6NFJXSA.js} +8 -19
  26. package/dist/chunk-W6NFJXSA.js.map +1 -0
  27. package/dist/{chunk-XBZWOM2K.js → chunk-X4A66EWZ.js} +8 -3
  28. package/dist/chunk-X4A66EWZ.js.map +1 -0
  29. package/dist/chunk-X4JAFD5R.js +3907 -0
  30. package/dist/chunk-X4JAFD5R.js.map +1 -0
  31. package/dist/{chunk-6KLX2RH5.js → chunk-XSA2QAKP.js} +334 -19
  32. package/dist/chunk-XSA2QAKP.js.map +1 -0
  33. package/dist/{chunk-HA46CYQK.js → chunk-XXWH2JLC.js} +792 -206
  34. package/dist/chunk-XXWH2JLC.js.map +1 -0
  35. package/dist/client.d.ts +2 -2
  36. package/dist/components/browser-viewer.d.ts +7 -1
  37. package/dist/components/computer-viewer.d.ts +4 -1
  38. package/dist/components/enrollment-consent.d.ts +6 -3
  39. package/dist/components/file-browser.d.ts +7 -1
  40. package/dist/components/human-input-form.d.ts +1 -1
  41. package/dist/components/human-input-surface.d.ts +1 -1
  42. package/dist/components/machine-card.d.ts +4 -1
  43. package/dist/components/machines/machine-detail.d.ts +4 -1
  44. package/dist/components/machines/machine-operation-policy.d.ts +11 -0
  45. package/dist/components/machines-dashboard.d.ts +3 -1
  46. package/dist/components/markdown.d.ts +20 -1
  47. package/dist/components/message-timeline.d.ts +1 -1
  48. package/dist/components/model-policy-picker.d.ts +2 -0
  49. package/dist/components/pierre-file.d.ts +1 -1
  50. package/dist/components/sandbox-files.d.ts +8 -2
  51. package/dist/components/sandbox-workspace.d.ts +33 -3
  52. package/dist/components/session-chrome.d.ts +15 -3
  53. package/dist/components/workspace-dock.d.ts +6 -2
  54. package/dist/composer.js +5 -5
  55. package/dist/computer-viewer-ZOP4Q7A7.js +16 -0
  56. package/dist/computer-viewer-ZOP4Q7A7.js.map +1 -0
  57. package/dist/hooks/channel-cache.d.ts +23 -0
  58. package/dist/hooks/shared-machines-list.d.ts +14 -0
  59. package/dist/hooks/use-attached-browsers.d.ts +2 -1
  60. package/dist/hooks/use-channels.d.ts +1 -0
  61. package/dist/hooks/use-composer.d.ts +37 -9
  62. package/dist/hooks/use-machine-chip.d.ts +3 -3
  63. package/dist/hooks/use-machines.d.ts +19 -1
  64. package/dist/hooks/use-sandbox-files.d.ts +1 -0
  65. package/dist/hooks/use-session-background-commands.d.ts +14 -0
  66. package/dist/hooks/use-turn-queue.d.ts +12 -0
  67. package/dist/hooks/use-workspace-sessions.d.ts +1 -0
  68. package/dist/index.d.ts +7 -5
  69. package/dist/index.js +1096 -623
  70. package/dist/index.js.map +1 -1
  71. package/dist/interaction.js +29 -181
  72. package/dist/interaction.js.map +1 -1
  73. package/dist/lib/interaction-errors.d.ts +3 -0
  74. package/dist/machines.d.ts +4 -2
  75. package/dist/machines.js +10 -2
  76. package/dist/model-policy.d.ts +1 -1
  77. package/dist/model-policy.js +1 -1
  78. package/dist/platform-activity-row-BJHUHXAT.js +169 -0
  79. package/dist/platform-activity-row-BJHUHXAT.js.map +1 -0
  80. package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-BSKUWHRI.js} +76 -16
  81. package/dist/queue-surface-implementation-BSKUWHRI.js.map +1 -0
  82. package/dist/realtime/realtime-control.d.ts +10 -3
  83. package/dist/realtime.js +138 -29
  84. package/dist/realtime.js.map +1 -1
  85. package/dist/session-ui.d.ts +1 -1
  86. package/dist/session-ui.js +6 -2
  87. package/dist/session.d.ts +2 -2
  88. package/dist/session.js +4 -4
  89. package/dist/timeline/index.d.ts +1 -1
  90. package/dist/timeline/platform-activity-row.d.ts +15 -0
  91. package/dist/timeline/screenshot-lightbox.d.ts +1 -1
  92. package/dist/timeline/shared.d.ts +4 -2
  93. package/dist/timeline/types.d.ts +48 -5
  94. package/dist/types/machines.d.ts +2 -2
  95. package/package.json +3 -3
  96. package/src/client.ts +12 -1
  97. package/src/components/artifacts/editable-spreadsheet.tsx +1 -1
  98. package/src/components/browser-viewer.tsx +361 -58
  99. package/src/components/chat-composer.tsx +1 -1
  100. package/src/components/composer.tsx +6 -6
  101. package/src/components/computer-viewer.tsx +368 -115
  102. package/src/components/enrollment-consent.tsx +64 -6
  103. package/src/components/file-browser.tsx +117 -2
  104. package/src/components/human-input-form.tsx +91 -55
  105. package/src/components/human-input-surface.tsx +1 -1
  106. package/src/components/machine-card.tsx +111 -0
  107. package/src/components/machine-input-display.ts +15 -0
  108. package/src/components/machines/machine-detail.tsx +47 -0
  109. package/src/components/machines/machine-operation-policy.tsx +179 -0
  110. package/src/components/machines-dashboard.tsx +6 -0
  111. package/src/components/markdown.tsx +174 -20
  112. package/src/components/message-timeline.tsx +162 -17
  113. package/src/components/model-policy-picker.tsx +9 -17
  114. package/src/components/pierre-file.tsx +1 -1
  115. package/src/components/queue-surface-implementation.tsx +82 -16
  116. package/src/components/sandbox-files.tsx +135 -19
  117. package/src/components/sandbox-workspace.tsx +204 -92
  118. package/src/components/session-chrome.tsx +415 -208
  119. package/src/components/session-status.tsx +1 -1
  120. package/src/components/user-message-body.tsx +168 -48
  121. package/src/components/workspace-dock.tsx +141 -175
  122. package/src/hooks/channel-cache.ts +104 -0
  123. package/src/hooks/shared-machines-list.ts +239 -0
  124. package/src/hooks/use-attached-browsers.ts +5 -1
  125. package/src/hooks/use-browser-frame-stream.ts +6 -1
  126. package/src/hooks/use-browser-session.ts +6 -4
  127. package/src/hooks/use-browser-sessions.ts +7 -1
  128. package/src/hooks/use-channels.ts +32 -10
  129. package/src/hooks/use-composer.ts +760 -291
  130. package/src/hooks/use-computer-frame-stream.ts +14 -9
  131. package/src/hooks/use-computer-session.ts +16 -14
  132. package/src/hooks/use-computer-sessions.ts +8 -1
  133. package/src/hooks/use-last-started-turn-policy.ts +1 -1
  134. package/src/hooks/use-machine-chip.ts +23 -6
  135. package/src/hooks/use-machines.ts +104 -6
  136. package/src/hooks/use-sandbox-files.ts +195 -140
  137. package/src/hooks/use-sandbox-git.ts +58 -29
  138. package/src/hooks/use-session-background-commands.ts +56 -0
  139. package/src/hooks/use-session-capabilities.ts +18 -0
  140. package/src/hooks/use-turn-queue.ts +111 -12
  141. package/src/hooks/use-workspace-sessions.ts +5 -1
  142. package/src/index.ts +26 -4
  143. package/src/lib/interaction-errors.ts +18 -0
  144. package/src/machines.ts +9 -1
  145. package/src/model-policy.ts +10 -2
  146. package/src/realtime/realtime-control.tsx +200 -37
  147. package/src/session-context.ts +1 -0
  148. package/src/session-ui.ts +6 -1
  149. package/src/session.ts +9 -1
  150. package/src/timeline/activity-rail.tsx +20 -75
  151. package/src/timeline/index.ts +4 -0
  152. package/src/timeline/platform-activity-row.tsx +201 -0
  153. package/src/timeline/projection.ts +476 -23
  154. package/src/timeline/screenshot-lightbox.tsx +48 -14
  155. package/src/timeline/shared.tsx +8 -2
  156. package/src/timeline/tool-renderers.tsx +104 -6
  157. package/src/timeline/turn-summary.tsx +6 -1
  158. package/src/timeline/types.ts +75 -2
  159. package/src/types/machines.ts +10 -0
  160. package/styles/compiled.css +115 -104
  161. package/dist/chunk-5UQPNLIO.js.map +0 -1
  162. package/dist/chunk-6KLX2RH5.js.map +0 -1
  163. package/dist/chunk-B6WPZSTT.js.map +0 -1
  164. package/dist/chunk-HA46CYQK.js.map +0 -1
  165. package/dist/chunk-IGC6A2ZI.js.map +0 -1
  166. package/dist/chunk-LLOLUHVG.js +0 -5937
  167. package/dist/chunk-LLOLUHVG.js.map +0 -1
  168. package/dist/chunk-MKPIAGVL.js.map +0 -1
  169. package/dist/chunk-R3AZOAB5.js.map +0 -1
  170. package/dist/chunk-XBZWOM2K.js.map +0 -1
  171. package/dist/chunk-Y7OEDUJ5.js.map +0 -1
  172. package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
  173. package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
  174. /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GXUICIAG.js.map} +0 -0
package/dist/realtime.js CHANGED
@@ -3,15 +3,15 @@ import {
3
3
  PickerAnimatedPage,
4
4
  PickerBackHeader,
5
5
  PickerNavRow
6
- } from "./chunk-MKPIAGVL.js";
7
- import "./chunk-XBZWOM2K.js";
6
+ } from "./chunk-W6NFJXSA.js";
7
+ import "./chunk-X4A66EWZ.js";
8
8
  import {
9
9
  usePortalTokenSource,
10
10
  usePortalTokenStyle
11
11
  } from "./chunk-VZTQ73XT.js";
12
12
  import {
13
13
  useEmbeddedRealtimeSession
14
- } from "./chunk-C5ZPSSS5.js";
14
+ } from "./chunk-NEXLLTP4.js";
15
15
  import {
16
16
  cn
17
17
  } from "./chunk-22KP6LR5.js";
@@ -206,6 +206,72 @@ var REALTIME_PROVIDER_META = {
206
206
  "Your Gateway": { billingClass: "byok", hint: "Billed to your AI Gateway" }
207
207
  };
208
208
  var REALTIME_MODEL_STORAGE_PREFIX = "opengeni:realtime-model";
209
+ var REALTIME_MODEL_CATALOG_CACHE_TTL_MS = 6e4;
210
+ var REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES = 64;
211
+ var realtimeModelCatalogCache = /* @__PURE__ */ new WeakMap();
212
+ function realtimeModelFallback(codexConnected) {
213
+ return [
214
+ {
215
+ ...CODEX_LIVE_MODEL,
216
+ available: codexConnected,
217
+ unavailableReason: codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason
218
+ }
219
+ ];
220
+ }
221
+ function realtimeModelCatalogCacheFor(client) {
222
+ const existing = realtimeModelCatalogCache.get(client);
223
+ if (existing) return existing;
224
+ const created = /* @__PURE__ */ new Map();
225
+ realtimeModelCatalogCache.set(client, created);
226
+ return created;
227
+ }
228
+ function readCachedRealtimeModelCatalog(client, workspaceId, now = Date.now()) {
229
+ const cache = realtimeModelCatalogCache.get(client);
230
+ const entry = cache?.get(workspaceId);
231
+ if (!entry || entry.state === "loading") return null;
232
+ if (entry.expiresAt > now) return entry.models;
233
+ cache?.delete(workspaceId);
234
+ return null;
235
+ }
236
+ function pruneRealtimeModelCatalogCache(cache, now) {
237
+ for (const [workspaceId, entry] of cache) {
238
+ if (entry.state === "ready" && entry.expiresAt <= now) cache.delete(workspaceId);
239
+ }
240
+ while (cache.size >= REALTIME_MODEL_CATALOG_CACHE_MAX_WORKSPACES) {
241
+ const oldestWorkspaceId = cache.keys().next().value;
242
+ if (oldestWorkspaceId === void 0) return;
243
+ cache.delete(oldestWorkspaceId);
244
+ }
245
+ }
246
+ function loadRealtimeModelCatalog(client, workspaceId) {
247
+ const load = client.getWorkspaceRealtimeModelCatalog;
248
+ if (!load) return null;
249
+ const now = Date.now();
250
+ const cache = realtimeModelCatalogCacheFor(client);
251
+ const entry = cache.get(workspaceId);
252
+ if (entry?.state === "loading") return entry.promise;
253
+ if (entry?.state === "ready" && entry.expiresAt > now) return Promise.resolve(entry.models);
254
+ if (entry) cache.delete(workspaceId);
255
+ pruneRealtimeModelCatalogCache(cache, now);
256
+ const promise = load.call(client, workspaceId).then((response) => response.models.map(toRealtimeModelOption)).then((models) => {
257
+ const current = cache.get(workspaceId);
258
+ if (current?.state === "loading" && current.promise === promise) {
259
+ cache.delete(workspaceId);
260
+ cache.set(workspaceId, {
261
+ state: "ready",
262
+ models,
263
+ expiresAt: Date.now() + REALTIME_MODEL_CATALOG_CACHE_TTL_MS
264
+ });
265
+ }
266
+ return models;
267
+ }).catch((error) => {
268
+ const current = cache.get(workspaceId);
269
+ if (current?.state === "loading" && current.promise === promise) cache.delete(workspaceId);
270
+ throw error;
271
+ });
272
+ cache.set(workspaceId, { state: "loading", promise });
273
+ return promise;
274
+ }
209
275
  function codexRealtimeAdmissionAllowed(input) {
210
276
  return codexRealtimeAdmissionBlocker(input) === null;
211
277
  }
@@ -226,6 +292,8 @@ function useSessionRealtime(options) {
226
292
  const audioRef = useRef(null);
227
293
  const controllerRef = useRef(null);
228
294
  const controllerModelRef = useRef(null);
295
+ const modelContextProviderRef = useRef(options.getModelContext);
296
+ modelContextProviderRef.current = options.getModelContext;
229
297
  const [snapshot, setSnapshot] = useState(() => ({
230
298
  status: hasStoredSessionRealtimeOwnerProof({
231
299
  workspaceId,
@@ -252,7 +320,7 @@ function useSessionRealtime(options) {
252
320
  const eventsReadyRef = useRef(options.eventsReady);
253
321
  lifecycleRef.current = lifecycle;
254
322
  eventsReadyRef.current = options.eventsReady;
255
- const lifecycleActive = lifecycle?.state === "active";
323
+ const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
256
324
  useEffect(() => {
257
325
  let disposed = false;
258
326
  let controller = null;
@@ -265,7 +333,8 @@ function useSessionRealtime(options) {
265
333
  workspaceId,
266
334
  sessionId: options.sessionId,
267
335
  ...audioRef.current ? { remoteAudio: audioRef.current } : {},
268
- model
336
+ model,
337
+ getModelContext: () => modelContextProviderRef.current?.()
269
338
  });
270
339
  controllerRef.current = controller;
271
340
  controllerModelRef.current = model;
@@ -356,13 +425,19 @@ function useSessionRealtime(options) {
356
425
  setOutputMuted
357
426
  };
358
427
  }
428
+ function sessionRealtimeLifecycleIsActive(lifecycle) {
429
+ if (lifecycle?.state !== "active") return false;
430
+ const leaseExpiresAt = Date.parse(lifecycle.leaseExpiresAt);
431
+ return !Number.isFinite(leaseExpiresAt) || leaseExpiresAt > Date.now();
432
+ }
359
433
  function SessionRealtimeControl(props) {
360
434
  const lifecycle = useMemo(() => projectSessionRealtimeLifecycle(props.events), [props.events]);
435
+ const lifecycleActive = sessionRealtimeLifecycleIsActive(lifecycle);
361
436
  const selection = useRealtimeModelSelection({
362
437
  client: props.client,
363
438
  workspaceId: props.workspaceId,
364
439
  codexConnected: props.codexConnected,
365
- activeModel: lifecycle?.state === "active" ? lifecycle.model : null
440
+ activeModel: lifecycleActive && lifecycle?.state === "active" ? lifecycle.model : null
366
441
  });
367
442
  const selectedModel = selection.selectedModel;
368
443
  const realtime = useSessionRealtime({
@@ -383,7 +458,7 @@ function SessionRealtimeControl(props) {
383
458
  }, [onVoiceActiveChange, voiceActive]);
384
459
  useEffect(() => {
385
460
  const pending = autostartModelRef.current;
386
- if (!pending || autostartStartedRef.current || lifecycle?.state === "active") return;
461
+ if (!pending || autostartStartedRef.current || lifecycleActive) return;
387
462
  const available = models.some((model) => model.id === pending && model.available);
388
463
  if (!available) return;
389
464
  if (selectedRealtimeModel.id !== pending) {
@@ -400,7 +475,7 @@ function SessionRealtimeControl(props) {
400
475
  });
401
476
  }, [
402
477
  canStart,
403
- lifecycle?.state,
478
+ lifecycleActive,
404
479
  models,
405
480
  props.sessionId,
406
481
  props.workspaceId,
@@ -418,6 +493,7 @@ function SessionRealtimeControl(props) {
418
493
  modelAvailable: selectedModel.available,
419
494
  menuSide: "top",
420
495
  modelMenu: props.modelMenu ?? "split",
496
+ showDiagnostics: props.showDiagnostics,
421
497
  audioRef: realtime.audioRef,
422
498
  selectedModel,
423
499
  models: selection.models,
@@ -437,28 +513,46 @@ function useRealtimeModelSelection(options) {
437
513
  workspaceId: options.workspaceId
438
514
  });
439
515
  const activeModel = options.activeModel;
440
- const [catalog, setCatalog] = useState(() => [
441
- {
442
- ...CODEX_LIVE_MODEL,
443
- available: options.codexConnected,
444
- unavailableReason: options.codexConnected ? null : CODEX_LIVE_MODEL.unavailableReason
445
- }
446
- ]);
447
- const [selectedModelId, setSelectedModelId] = useState(
448
- () => readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id
516
+ const initialCachedCatalog = readCachedRealtimeModelCatalog(client, workspaceId);
517
+ const [catalog, setCatalog] = useState(
518
+ () => initialCachedCatalog ?? realtimeModelFallback(options.codexConnected)
449
519
  );
520
+ const catalogScopeRef = useRef({
521
+ client,
522
+ workspaceId,
523
+ source: initialCachedCatalog ? "cache" : "fallback"
524
+ });
525
+ const [selectedModelId, setSelectedModelId] = useState(() => {
526
+ const preferred = readRealtimeModelPreference(workspaceId) ?? CODEX_LIVE_MODEL.id;
527
+ if (!initialCachedCatalog) return preferred;
528
+ if (initialCachedCatalog.some((model) => model.id === preferred && model.available)) {
529
+ return preferred;
530
+ }
531
+ return initialCachedCatalog.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
532
+ });
450
533
  useEffect(() => {
451
534
  let disposed = false;
452
- const load = client.getWorkspaceRealtimeModelCatalog;
453
- if (!load) return;
454
- void load.call(client, workspaceId).then((response) => {
455
- if (disposed) return;
456
- const models = response.models.map(toRealtimeModelOption);
535
+ const applyCatalog = (models) => {
536
+ catalogScopeRef.current = { client, workspaceId, source: "cache" };
457
537
  setCatalog(models);
458
538
  setSelectedModelId((current) => {
459
539
  if (models.some((model) => model.id === current && model.available)) return current;
460
540
  return models.find((model) => model.available)?.id ?? CODEX_LIVE_MODEL.id;
461
541
  });
542
+ };
543
+ const cached = readCachedRealtimeModelCatalog(client, workspaceId);
544
+ if (cached) {
545
+ const scope = catalogScopeRef.current;
546
+ if (scope.client !== client || scope.workspaceId !== workspaceId || scope.source !== "cache") {
547
+ applyCatalog(cached);
548
+ }
549
+ return;
550
+ }
551
+ const loading = loadRealtimeModelCatalog(client, workspaceId);
552
+ if (!loading) return;
553
+ void loading.then((models) => {
554
+ if (disposed) return;
555
+ applyCatalog(models);
462
556
  }).catch(() => void 0);
463
557
  return () => {
464
558
  disposed = true;
@@ -498,16 +592,31 @@ var IDLE_REALTIME_SNAPSHOT = {
498
592
  error: null
499
593
  };
500
594
  function NewSessionRealtimeControl(props) {
501
- const internalSelection = useRealtimeModelSelection({
595
+ if (props.models && props.selectedModel && props.onSelectModel) {
596
+ return /* @__PURE__ */ jsx2(
597
+ NewSessionRealtimeControlView,
598
+ {
599
+ ...props,
600
+ selection: {
601
+ models: props.models,
602
+ selectedModel: props.selectedModel,
603
+ selectModel: props.onSelectModel
604
+ }
605
+ }
606
+ );
607
+ }
608
+ return /* @__PURE__ */ jsx2(NewSessionRealtimeControlWithInternalSelection, { ...props });
609
+ }
610
+ function NewSessionRealtimeControlWithInternalSelection(props) {
611
+ const selection = useRealtimeModelSelection({
502
612
  client: props.client,
503
613
  workspaceId: props.workspaceId,
504
614
  codexConnected: props.codexConnected
505
615
  });
506
- const selection = props.models && props.selectedModel && props.onSelectModel ? {
507
- models: props.models,
508
- selectedModel: props.selectedModel,
509
- selectModel: props.onSelectModel
510
- } : internalSelection;
616
+ return /* @__PURE__ */ jsx2(NewSessionRealtimeControlView, { ...props, selection });
617
+ }
618
+ function NewSessionRealtimeControlView(props) {
619
+ const selection = props.selection;
511
620
  const audioRef = useRef(null);
512
621
  const [starting, setStarting] = useState(false);
513
622
  const [error, setError] = useState(null);
@@ -576,7 +685,7 @@ function RealtimeVoiceControl(props) {
576
685
  const mainDisabled = props.snapshot.status === "stopping" || props.snapshot.status === "lost_owner" || !modeOwned && !props.canStart || props.snapshot.status === "starting" && !modeOwned;
577
686
  const mainLabel = audioBlocked ? "Resume voice audio" : retryConnection ? "Retry voice connection" : modeOwned ? "End voice conversation" : `Start voice with ${selectedModel.label}`;
578
687
  const runMainAction = audioBlocked ? props.onRetryAudibleOutput : retryConnection ? props.onRetry : modeOwned ? props.onStop : props.onStart;
579
- const diagnosticsVisible = props.showDiagnostics ?? import.meta.env.DEV;
688
+ const diagnosticsVisible = props.showDiagnostics ?? false;
580
689
  const modelMenu = props.modelMenu ?? "split";
581
690
  const showAttachedModelMenu = modelMenu === "split" || modelMenu === "split-desktop";
582
691
  const desktopOnlyModelMenu = modelMenu === "split-desktop";