@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.
- package/README.md +36 -11
- package/dist/artifacts-spreadsheet.js +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/browser-viewer-GXUICIAG.js +14 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-4MDLEHXL.js} +9 -115
- package/dist/chunk-4MDLEHXL.js.map +1 -0
- package/dist/{chunk-Y7OEDUJ5.js → chunk-5RZN3DD5.js} +1014 -420
- package/dist/chunk-5RZN3DD5.js.map +1 -0
- package/dist/chunk-5YK2ZDIG.js +116 -0
- package/dist/chunk-5YK2ZDIG.js.map +1 -0
- package/dist/chunk-H5YGYNXS.js +329 -0
- package/dist/chunk-H5YGYNXS.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-ICA6R6TW.js} +2 -2
- package/dist/{chunk-7WCLAEFV.js.map → chunk-ICA6R6TW.js.map} +1 -1
- package/dist/{chunk-IGC6A2ZI.js → chunk-JOAVA2TW.js} +589 -217
- package/dist/chunk-JOAVA2TW.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-LTCHJ4MS.js} +9 -9
- package/dist/chunk-LTCHJ4MS.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-QGBJ6GHG.js +2300 -0
- package/dist/chunk-QGBJ6GHG.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-UOLJWT5Y.js} +78 -16
- package/dist/chunk-UOLJWT5Y.js.map +1 -0
- package/dist/{chunk-MKPIAGVL.js → chunk-W6NFJXSA.js} +8 -19
- package/dist/chunk-W6NFJXSA.js.map +1 -0
- package/dist/{chunk-XBZWOM2K.js → chunk-X4A66EWZ.js} +8 -3
- package/dist/chunk-X4A66EWZ.js.map +1 -0
- package/dist/chunk-X4JAFD5R.js +3907 -0
- package/dist/chunk-X4JAFD5R.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-XSA2QAKP.js} +334 -19
- package/dist/chunk-XSA2QAKP.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-XXWH2JLC.js} +792 -206
- package/dist/chunk-XXWH2JLC.js.map +1 -0
- package/dist/client.d.ts +2 -2
- package/dist/components/browser-viewer.d.ts +7 -1
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +7 -1
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +1 -1
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown.d.ts +20 -1
- package/dist/components/message-timeline.d.ts +1 -1
- package/dist/components/model-policy-picker.d.ts +2 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/sandbox-files.d.ts +8 -2
- package/dist/components/sandbox-workspace.d.ts +33 -3
- package/dist/components/session-chrome.d.ts +15 -3
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.js +5 -5
- package/dist/computer-viewer-ZOP4Q7A7.js +16 -0
- package/dist/computer-viewer-ZOP4Q7A7.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-composer.d.ts +37 -9
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +1 -0
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-workspace-sessions.d.ts +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.js +1096 -623
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +29 -181
- package/dist/interaction.js.map +1 -1
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +10 -2
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/platform-activity-row-BJHUHXAT.js +169 -0
- package/dist/platform-activity-row-BJHUHXAT.js.map +1 -0
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-BSKUWHRI.js} +76 -16
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +10 -3
- package/dist/realtime.js +138 -29
- package/dist/realtime.js.map +1 -1
- package/dist/session-ui.d.ts +1 -1
- package/dist/session-ui.js +6 -2
- package/dist/session.d.ts +2 -2
- package/dist/session.js +4 -4
- package/dist/timeline/index.d.ts +1 -1
- package/dist/timeline/platform-activity-row.d.ts +15 -0
- package/dist/timeline/screenshot-lightbox.d.ts +1 -1
- package/dist/timeline/shared.d.ts +4 -2
- package/dist/timeline/types.d.ts +48 -5
- package/dist/types/machines.d.ts +2 -2
- package/package.json +3 -3
- package/src/client.ts +12 -1
- package/src/components/artifacts/editable-spreadsheet.tsx +1 -1
- package/src/components/browser-viewer.tsx +361 -58
- package/src/components/chat-composer.tsx +1 -1
- package/src/components/composer.tsx +6 -6
- package/src/components/computer-viewer.tsx +368 -115
- package/src/components/enrollment-consent.tsx +64 -6
- package/src/components/file-browser.tsx +117 -2
- package/src/components/human-input-form.tsx +91 -55
- package/src/components/human-input-surface.tsx +1 -1
- package/src/components/machine-card.tsx +111 -0
- package/src/components/machine-input-display.ts +15 -0
- package/src/components/machines/machine-detail.tsx +47 -0
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +6 -0
- package/src/components/markdown.tsx +174 -20
- package/src/components/message-timeline.tsx +162 -17
- package/src/components/model-policy-picker.tsx +9 -17
- package/src/components/pierre-file.tsx +1 -1
- package/src/components/queue-surface-implementation.tsx +82 -16
- package/src/components/sandbox-files.tsx +135 -19
- package/src/components/sandbox-workspace.tsx +204 -92
- package/src/components/session-chrome.tsx +415 -208
- package/src/components/session-status.tsx +1 -1
- package/src/components/user-message-body.tsx +168 -48
- package/src/components/workspace-dock.tsx +141 -175
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-browser-frame-stream.ts +6 -1
- package/src/hooks/use-browser-session.ts +6 -4
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-composer.ts +760 -291
- package/src/hooks/use-computer-frame-stream.ts +14 -9
- package/src/hooks/use-computer-session.ts +16 -14
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-last-started-turn-policy.ts +1 -1
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +195 -140
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +56 -0
- package/src/hooks/use-session-capabilities.ts +18 -0
- package/src/hooks/use-turn-queue.ts +111 -12
- package/src/hooks/use-workspace-sessions.ts +5 -1
- package/src/index.ts +26 -4
- package/src/lib/interaction-errors.ts +18 -0
- package/src/machines.ts +9 -1
- package/src/model-policy.ts +10 -2
- package/src/realtime/realtime-control.tsx +200 -37
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +6 -1
- package/src/session.ts +9 -1
- package/src/timeline/activity-rail.tsx +20 -75
- package/src/timeline/index.ts +4 -0
- package/src/timeline/platform-activity-row.tsx +201 -0
- package/src/timeline/projection.ts +476 -23
- package/src/timeline/screenshot-lightbox.tsx +48 -14
- package/src/timeline/shared.tsx +8 -2
- package/src/timeline/tool-renderers.tsx +104 -6
- package/src/timeline/turn-summary.tsx +6 -1
- package/src/timeline/types.ts +75 -2
- package/src/types/machines.ts +10 -0
- package/styles/compiled.css +115 -104
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js +0 -5937
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- /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-
|
|
7
|
-
import "./chunk-
|
|
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-
|
|
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
|
|
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 ||
|
|
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
|
-
|
|
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
|
|
441
|
-
|
|
442
|
-
|
|
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
|
|
453
|
-
|
|
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
|
-
|
|
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
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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 ??
|
|
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";
|