dsh-live-voice-debugger 0.5.1 → 0.6.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/ARCHITECTURE.md +2 -2
- package/lib/client.js +1196 -59
- package/package.json +2 -2
package/lib/client.js
CHANGED
|
@@ -34,7 +34,7 @@ __export(apply_exports, {
|
|
|
34
34
|
inject: () => inject
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(apply_exports);
|
|
37
|
-
var
|
|
37
|
+
var import_react25 = __toESM(require("react"), 1);
|
|
38
38
|
|
|
39
39
|
// ../live-voice/src/shared/design-system/buttons/IconButton.tsx
|
|
40
40
|
var import_react2 = __toESM(require("react"), 1);
|
|
@@ -226,32 +226,44 @@ var import_react10 = __toESM(require("react"), 1);
|
|
|
226
226
|
// ../live-voice/src/shared/design-system/forms/SelectField.tsx
|
|
227
227
|
var import_react12 = __toESM(require("react"), 1);
|
|
228
228
|
|
|
229
|
-
// ../live-voice/src/shared/design-system/forms/
|
|
229
|
+
// ../live-voice/src/shared/design-system/forms/ShortcutField.tsx
|
|
230
230
|
var import_react13 = __toESM(require("react"), 1);
|
|
231
231
|
|
|
232
|
-
// ../live-voice/src/shared/design-system/forms/
|
|
232
|
+
// ../live-voice/src/shared/design-system/forms/keyboardShortcut.ts
|
|
233
|
+
var modifierFlags = {
|
|
234
|
+
Control: "ctrlKey",
|
|
235
|
+
Alt: "altKey",
|
|
236
|
+
Shift: "shiftKey",
|
|
237
|
+
Meta: "metaKey"
|
|
238
|
+
};
|
|
239
|
+
var modifiers = Object.keys(modifierFlags);
|
|
240
|
+
|
|
241
|
+
// ../live-voice/src/shared/design-system/forms/TextAreaField.tsx
|
|
233
242
|
var import_react14 = __toESM(require("react"), 1);
|
|
234
243
|
|
|
235
|
-
// ../live-voice/src/shared/design-system/
|
|
244
|
+
// ../live-voice/src/shared/design-system/forms/TextField.tsx
|
|
236
245
|
var import_react15 = __toESM(require("react"), 1);
|
|
237
246
|
|
|
247
|
+
// ../live-voice/src/shared/design-system/layout/SettingsCard.tsx
|
|
248
|
+
var import_react16 = __toESM(require("react"), 1);
|
|
249
|
+
|
|
238
250
|
// ../live-voice/src/shared/design-system/layout/SettingsSection.tsx
|
|
239
|
-
var
|
|
251
|
+
var import_react18 = __toESM(require("react"), 1);
|
|
240
252
|
|
|
241
253
|
// ../live-voice/src/shared/design-system/layout/SettingsSectionBody.tsx
|
|
242
|
-
var
|
|
254
|
+
var import_react17 = __toESM(require("react"), 1);
|
|
243
255
|
|
|
244
256
|
// ../live-voice/src/shared/design-system/layout/SettingsSubcard.tsx
|
|
245
|
-
var
|
|
257
|
+
var import_react19 = __toESM(require("react"), 1);
|
|
246
258
|
|
|
247
259
|
// ../live-voice/src/shared/design-system/layout/SettingsTabs.tsx
|
|
248
|
-
var
|
|
260
|
+
var import_react20 = __toESM(require("react"), 1);
|
|
249
261
|
|
|
250
262
|
// src/apply.tsx
|
|
251
263
|
var import_client = require("react-dom/client");
|
|
252
264
|
|
|
253
265
|
// src/DebuggerPanel.tsx
|
|
254
|
-
var
|
|
266
|
+
var import_react24 = __toESM(require("react"), 1);
|
|
255
267
|
|
|
256
268
|
// ../live-voice/src/modules/core/diagnostics.ts
|
|
257
269
|
var DIAGNOSTIC_KEY = /* @__PURE__ */ Symbol.for("dsh-live-voice.diagnostics.v1");
|
|
@@ -372,7 +384,7 @@ function createInspector(source, now = Date.now, limit = 200) {
|
|
|
372
384
|
}
|
|
373
385
|
|
|
374
386
|
// src/StateTree.tsx
|
|
375
|
-
var
|
|
387
|
+
var import_react21 = __toESM(require("react"), 1);
|
|
376
388
|
function StateTree({
|
|
377
389
|
name,
|
|
378
390
|
value,
|
|
@@ -380,9 +392,498 @@ function StateTree({
|
|
|
380
392
|
depth = 0
|
|
381
393
|
}) {
|
|
382
394
|
if (value === null || typeof value !== "object")
|
|
383
|
-
return /* @__PURE__ */
|
|
395
|
+
return /* @__PURE__ */ import_react21.default.createElement("div", { className: "dlvd-leaf" }, /* @__PURE__ */ import_react21.default.createElement("code", null, name), /* @__PURE__ */ import_react21.default.createElement("span", { "data-kind": typeof value }, String(value)));
|
|
384
396
|
const entries = Object.entries(value);
|
|
385
|
-
return /* @__PURE__ */
|
|
397
|
+
return /* @__PURE__ */ import_react21.default.createElement("details", { className: "dlvd-branch", open: depth < 3 }, /* @__PURE__ */ import_react21.default.createElement("summary", null, /* @__PURE__ */ import_react21.default.createElement("code", null, name), /* @__PURE__ */ import_react21.default.createElement("small", null, Array.isArray(value) ? "[" + entries.length + "]" : "{" + entries.length + "}")), entries.slice(0, 100).map(([key, child]) => /* @__PURE__ */ import_react21.default.createElement(StateTree, { key, name: key, value: child, omitted, depth: depth + 1 })), entries.length > 100 && /* @__PURE__ */ import_react21.default.createElement("p", null, omitted));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// src/RecordingPanel.tsx
|
|
401
|
+
var import_react22 = __toESM(require("react"), 1);
|
|
402
|
+
|
|
403
|
+
// ../live-voice/src/modules/recording/types.ts
|
|
404
|
+
var RECORDING_KEY = /* @__PURE__ */ Symbol.for("dsh-live-voice.recordings.v1");
|
|
405
|
+
var RECORDING_CHANGED = "dsh-live-voice:recordings-changed";
|
|
406
|
+
|
|
407
|
+
// src/recordingInspector.ts
|
|
408
|
+
function createRecordingInspector(target, changed) {
|
|
409
|
+
let disposed = false;
|
|
410
|
+
let generation = 0;
|
|
411
|
+
let selectedId = "";
|
|
412
|
+
let service = null;
|
|
413
|
+
let unsubscribe = null;
|
|
414
|
+
let runningGeneration = null;
|
|
415
|
+
let dirty = false;
|
|
416
|
+
let view = {
|
|
417
|
+
service: null,
|
|
418
|
+
sessions: [],
|
|
419
|
+
selected: null,
|
|
420
|
+
segments: [],
|
|
421
|
+
loading: false,
|
|
422
|
+
failed: false
|
|
423
|
+
};
|
|
424
|
+
const emit = (next) => {
|
|
425
|
+
if (disposed) return;
|
|
426
|
+
view = next;
|
|
427
|
+
changed(view);
|
|
428
|
+
};
|
|
429
|
+
const release = () => {
|
|
430
|
+
const previous = unsubscribe;
|
|
431
|
+
unsubscribe = null;
|
|
432
|
+
try {
|
|
433
|
+
previous?.();
|
|
434
|
+
} catch {
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
async function drain() {
|
|
438
|
+
if (runningGeneration === generation || disposed) return;
|
|
439
|
+
const worker = generation;
|
|
440
|
+
runningGeneration = worker;
|
|
441
|
+
try {
|
|
442
|
+
while (dirty && !disposed && worker === generation) {
|
|
443
|
+
dirty = false;
|
|
444
|
+
const current = service;
|
|
445
|
+
const token = generation;
|
|
446
|
+
if (!current) continue;
|
|
447
|
+
try {
|
|
448
|
+
const sessions = await current.list();
|
|
449
|
+
if (disposed || token !== generation) continue;
|
|
450
|
+
const id = sessions.some((s) => s.id === selectedId) ? selectedId : sessions[0]?.id ?? "";
|
|
451
|
+
const selected = id ? await current.get(id) : null;
|
|
452
|
+
if (disposed || token !== generation) continue;
|
|
453
|
+
const segments = selected ? current.segments(selected) : [];
|
|
454
|
+
selectedId = selected?.id ?? "";
|
|
455
|
+
emit({ service: current, sessions, selected, segments, loading: false, failed: false });
|
|
456
|
+
} catch {
|
|
457
|
+
if (!disposed && token === generation) emit({ ...view, loading: false, failed: true });
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
} finally {
|
|
461
|
+
if (runningGeneration === worker) runningGeneration = null;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const refresh = () => {
|
|
465
|
+
if (disposed || !service) return;
|
|
466
|
+
dirty = true;
|
|
467
|
+
void drain();
|
|
468
|
+
};
|
|
469
|
+
const discover = () => {
|
|
470
|
+
if (disposed) return;
|
|
471
|
+
try {
|
|
472
|
+
const candidate = target[RECORDING_KEY];
|
|
473
|
+
const next = candidate?.version === 1 && ["list", "get", "segments", "audio", "export", "remove", "setStarred", "subscribe"].every(
|
|
474
|
+
(k) => typeof candidate[k] === "function"
|
|
475
|
+
) ? candidate : null;
|
|
476
|
+
if (next === service) return;
|
|
477
|
+
++generation;
|
|
478
|
+
release();
|
|
479
|
+
service = next;
|
|
480
|
+
selectedId = "";
|
|
481
|
+
emit({
|
|
482
|
+
service,
|
|
483
|
+
sessions: [],
|
|
484
|
+
selected: null,
|
|
485
|
+
segments: [],
|
|
486
|
+
loading: !!service,
|
|
487
|
+
failed: false
|
|
488
|
+
});
|
|
489
|
+
if (service) {
|
|
490
|
+
unsubscribe = service.subscribe(refresh);
|
|
491
|
+
refresh();
|
|
492
|
+
}
|
|
493
|
+
} catch {
|
|
494
|
+
++generation;
|
|
495
|
+
release();
|
|
496
|
+
service = null;
|
|
497
|
+
emit({
|
|
498
|
+
service: null,
|
|
499
|
+
sessions: [],
|
|
500
|
+
selected: null,
|
|
501
|
+
segments: [],
|
|
502
|
+
loading: false,
|
|
503
|
+
failed: true
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
return {
|
|
508
|
+
discover,
|
|
509
|
+
refresh,
|
|
510
|
+
select(id) {
|
|
511
|
+
if (disposed || id === selectedId) return;
|
|
512
|
+
selectedId = id;
|
|
513
|
+
++generation;
|
|
514
|
+
emit({ ...view, selected: null, segments: [], loading: true });
|
|
515
|
+
refresh();
|
|
516
|
+
},
|
|
517
|
+
dispose() {
|
|
518
|
+
disposed = true;
|
|
519
|
+
++generation;
|
|
520
|
+
release();
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// src/RecordingPanel.tsx
|
|
526
|
+
function duration(samples, rate) {
|
|
527
|
+
const milliseconds = Math.max(0, Math.round(samples / Math.max(1, rate) * 1e3));
|
|
528
|
+
const seconds = Math.floor(milliseconds / 1e3);
|
|
529
|
+
return [Math.floor(seconds / 3600), Math.floor(seconds / 60) % 60, seconds % 60].map((n) => String(n).padStart(2, "0")).join(":") + "." + String(milliseconds % 1e3).padStart(3, "0");
|
|
530
|
+
}
|
|
531
|
+
var sourceKey = (session) => JSON.stringify([session.kind, session.sourceId]);
|
|
532
|
+
var sourceName = (session, copy) => (session.kind === "microphone" ? copy.recordingMicrophone : copy.recordingShared) + " \xB7 " + (session.label || session.sourceId) + " \xB7 " + session.sourceId;
|
|
533
|
+
function stateName(session, copy) {
|
|
534
|
+
return {
|
|
535
|
+
recording: copy.recordingActive,
|
|
536
|
+
completed: copy.recordingCompleted,
|
|
537
|
+
interrupted: copy.recordingInterrupted,
|
|
538
|
+
failed: copy.recordingFailed
|
|
539
|
+
}[session.state];
|
|
540
|
+
}
|
|
541
|
+
function RecordingPanel({ copy, target }) {
|
|
542
|
+
const [view, setView] = import_react22.default.useState({
|
|
543
|
+
service: null,
|
|
544
|
+
sessions: [],
|
|
545
|
+
selected: null,
|
|
546
|
+
segments: [],
|
|
547
|
+
loading: true,
|
|
548
|
+
failed: false
|
|
549
|
+
});
|
|
550
|
+
const inspector = import_react22.default.useRef(null);
|
|
551
|
+
const [filter, setFilter] = import_react22.default.useState("");
|
|
552
|
+
import_react22.default.useEffect(() => {
|
|
553
|
+
const current = createRecordingInspector(target, setView);
|
|
554
|
+
inspector.current = current;
|
|
555
|
+
current.discover();
|
|
556
|
+
const timer = setInterval(current.discover, 1e3);
|
|
557
|
+
target.addEventListener(RECORDING_CHANGED, current.discover);
|
|
558
|
+
return () => {
|
|
559
|
+
clearInterval(timer);
|
|
560
|
+
target.removeEventListener(RECORDING_CHANGED, current.discover);
|
|
561
|
+
current.dispose();
|
|
562
|
+
inspector.current = null;
|
|
563
|
+
};
|
|
564
|
+
}, [target]);
|
|
565
|
+
const sources = [
|
|
566
|
+
...new Map(view.sessions.map((session) => [sourceKey(session), session])).values()
|
|
567
|
+
];
|
|
568
|
+
const visible = view.sessions.filter((session) => !filter || sourceKey(session) === filter).slice().sort((a, b) => b.startedAt.localeCompare(a.startedAt));
|
|
569
|
+
import_react22.default.useEffect(() => {
|
|
570
|
+
if (!view.loading && filter && visible.length && !visible.some((s) => s.id === view.selected?.id))
|
|
571
|
+
inspector.current?.select(visible[0].id);
|
|
572
|
+
}, [filter, view.selected?.id, view.loading, visible[0]?.id]);
|
|
573
|
+
const selected = view.selected && visible.some((s) => s.id === view.selected?.id) ? view.selected : null;
|
|
574
|
+
return /* @__PURE__ */ import_react22.default.createElement("section", { className: "dlvd-recordings", "aria-label": copy.recordingTitle }, /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingHelp), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react22.default.createElement("label", null, copy.recordingSourceFilter, " ", /* @__PURE__ */ import_react22.default.createElement("select", { value: filter, onChange: (event) => setFilter(event.target.value) }, /* @__PURE__ */ import_react22.default.createElement("option", { value: "" }, copy.recordingAllSources), sources.map((session) => /* @__PURE__ */ import_react22.default.createElement("option", { key: sourceKey(session), value: sourceKey(session) }, sourceName(session, copy))))), /* @__PURE__ */ import_react22.default.createElement(
|
|
575
|
+
"button",
|
|
576
|
+
{
|
|
577
|
+
type: "button",
|
|
578
|
+
onClick: () => {
|
|
579
|
+
inspector.current?.discover();
|
|
580
|
+
inspector.current?.refresh();
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
copy.recordingRefresh
|
|
584
|
+
)), view.failed && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy.recordingLoadError), !view.service ? /* @__PURE__ */ import_react22.default.createElement("p", { role: "status" }, copy.recordingUnavailable) : /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, view.loading && /* @__PURE__ */ import_react22.default.createElement("p", { role: "status" }, copy.recordingLoading), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-recording-columns" }, /* @__PURE__ */ import_react22.default.createElement(
|
|
585
|
+
"div",
|
|
586
|
+
{
|
|
587
|
+
className: "dlvd-session-list dlvd-scroll",
|
|
588
|
+
tabIndex: 0,
|
|
589
|
+
"aria-label": copy.recordingTitle
|
|
590
|
+
},
|
|
591
|
+
!visible.length && !view.loading && /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingEmpty),
|
|
592
|
+
sources.filter((source) => !filter || sourceKey(source) === filter).map((source) => /* @__PURE__ */ import_react22.default.createElement("section", { key: sourceKey(source), "aria-label": sourceName(source, copy) }, /* @__PURE__ */ import_react22.default.createElement("h3", null, sourceName(source, copy)), /* @__PURE__ */ import_react22.default.createElement("table", null, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDate), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDuration), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingSaved))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, visible.filter((session) => sourceKey(session) === sourceKey(source)).map((session) => /* @__PURE__ */ import_react22.default.createElement("tr", { key: session.id, "data-selected": session.id === selected?.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, /* @__PURE__ */ import_react22.default.createElement(
|
|
593
|
+
"button",
|
|
594
|
+
{
|
|
595
|
+
type: "button",
|
|
596
|
+
"aria-pressed": session.id === selected?.id,
|
|
597
|
+
onClick: () => inspector.current?.select(session.id)
|
|
598
|
+
},
|
|
599
|
+
session.starred && /* @__PURE__ */ import_react22.default.createElement(
|
|
600
|
+
"span",
|
|
601
|
+
{
|
|
602
|
+
role: "img",
|
|
603
|
+
"aria-label": copy.recordingStarred,
|
|
604
|
+
title: copy.recordingStarHelp
|
|
605
|
+
},
|
|
606
|
+
"\u2605"
|
|
607
|
+
),
|
|
608
|
+
" ",
|
|
609
|
+
/* @__PURE__ */ import_react22.default.createElement("time", { dateTime: session.startedAt }, new Date(session.startedAt).toLocaleString())
|
|
610
|
+
)), /* @__PURE__ */ import_react22.default.createElement("td", null, stateName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(session.savedSamples, session.sampleRate), /* @__PURE__ */ import_react22.default.createElement("br", null), session.storage === "indexeddb" || session.persistent ? copy.recordingPersistent : copy.recordingMemory)))))))
|
|
611
|
+
), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-recording-detail dlvd-scroll", tabIndex: 0 }, selected ? /* @__PURE__ */ import_react22.default.createElement(
|
|
612
|
+
RecordingDetail,
|
|
613
|
+
{
|
|
614
|
+
key: selected.id,
|
|
615
|
+
copy,
|
|
616
|
+
session: selected,
|
|
617
|
+
service: view.service,
|
|
618
|
+
segments: view.segments,
|
|
619
|
+
refresh: () => inspector.current?.refresh()
|
|
620
|
+
}
|
|
621
|
+
) : /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingSelectSession)))));
|
|
622
|
+
}
|
|
623
|
+
function RecordingDetail({
|
|
624
|
+
copy,
|
|
625
|
+
session,
|
|
626
|
+
service,
|
|
627
|
+
segments,
|
|
628
|
+
refresh
|
|
629
|
+
}) {
|
|
630
|
+
const container = import_react22.default.useRef(null);
|
|
631
|
+
const audio = import_react22.default.useRef(null);
|
|
632
|
+
const playback = import_react22.default.useRef(null);
|
|
633
|
+
const download = import_react22.default.useRef(null);
|
|
634
|
+
const generation = import_react22.default.useRef(0);
|
|
635
|
+
const playGeneration = import_react22.default.useRef(0);
|
|
636
|
+
const [error, setError] = import_react22.default.useState(null);
|
|
637
|
+
const [playing, setPlaying] = import_react22.default.useState(false);
|
|
638
|
+
const [exporting, setExporting] = import_react22.default.useState(false);
|
|
639
|
+
const [deleting, setDeleting] = import_react22.default.useState(false);
|
|
640
|
+
const [starring, setStarring] = import_react22.default.useState(false);
|
|
641
|
+
const [confirmDelete, setConfirmDelete] = import_react22.default.useState(false);
|
|
642
|
+
const [selectedSegment, setSelectedSegment] = import_react22.default.useState("");
|
|
643
|
+
const clearPlayback = (player = audio.current) => {
|
|
644
|
+
++playGeneration.current;
|
|
645
|
+
if (player?.hasAttribute("src")) {
|
|
646
|
+
player.pause();
|
|
647
|
+
player.removeAttribute("src");
|
|
648
|
+
player.load();
|
|
649
|
+
}
|
|
650
|
+
if (playback.current) playback.current.api.revokeObjectURL(playback.current.url);
|
|
651
|
+
playback.current = null;
|
|
652
|
+
};
|
|
653
|
+
const clearDownload = () => {
|
|
654
|
+
if (download.current) download.current.api.revokeObjectURL(download.current.url);
|
|
655
|
+
download.current = null;
|
|
656
|
+
};
|
|
657
|
+
import_react22.default.useEffect(() => {
|
|
658
|
+
setStarring(false);
|
|
659
|
+
const owner = container.current?.ownerDocument.defaultView;
|
|
660
|
+
const player = audio.current;
|
|
661
|
+
const release = () => {
|
|
662
|
+
++generation.current;
|
|
663
|
+
clearPlayback(player);
|
|
664
|
+
clearDownload();
|
|
665
|
+
};
|
|
666
|
+
owner?.addEventListener("pagehide", release);
|
|
667
|
+
return () => {
|
|
668
|
+
owner?.removeEventListener("pagehide", release);
|
|
669
|
+
release();
|
|
670
|
+
};
|
|
671
|
+
}, [service, session.id]);
|
|
672
|
+
const play = async (segment) => {
|
|
673
|
+
clearPlayback();
|
|
674
|
+
const token = generation.current;
|
|
675
|
+
const request = playGeneration.current;
|
|
676
|
+
setPlaying(true);
|
|
677
|
+
setError(null);
|
|
678
|
+
setSelectedSegment(segment?.id ?? "");
|
|
679
|
+
try {
|
|
680
|
+
const blob = await service.audio(session.id, segment?.startSample, segment?.endSample);
|
|
681
|
+
if (token !== generation.current || request !== playGeneration.current) return;
|
|
682
|
+
const player = audio.current;
|
|
683
|
+
const api = player?.ownerDocument.defaultView?.URL;
|
|
684
|
+
if (!player || !api) return;
|
|
685
|
+
const url = api.createObjectURL(blob);
|
|
686
|
+
playback.current = { url, api };
|
|
687
|
+
player.src = url;
|
|
688
|
+
await player.play();
|
|
689
|
+
} catch {
|
|
690
|
+
if (token === generation.current && request === playGeneration.current) {
|
|
691
|
+
clearPlayback();
|
|
692
|
+
setError("recordingAudioError");
|
|
693
|
+
setPlaying(false);
|
|
694
|
+
}
|
|
695
|
+
} finally {
|
|
696
|
+
if (token === generation.current && request === playGeneration.current) setPlaying(false);
|
|
697
|
+
}
|
|
698
|
+
};
|
|
699
|
+
const exportSession = async () => {
|
|
700
|
+
const token = generation.current;
|
|
701
|
+
setExporting(true);
|
|
702
|
+
setError(null);
|
|
703
|
+
clearDownload();
|
|
704
|
+
try {
|
|
705
|
+
const blob = await service.export(session.id);
|
|
706
|
+
if (token !== generation.current) return;
|
|
707
|
+
const doc = container.current?.ownerDocument;
|
|
708
|
+
const api = doc?.defaultView?.URL;
|
|
709
|
+
if (!doc || !api) return;
|
|
710
|
+
const url = api.createObjectURL(blob);
|
|
711
|
+
download.current = { url, api };
|
|
712
|
+
const link = doc.createElement("a");
|
|
713
|
+
link.href = url;
|
|
714
|
+
link.download = "recording-" + session.id.replace(/[^a-zA-Z0-9_-]/g, "_") + ".json";
|
|
715
|
+
doc.body.appendChild(link);
|
|
716
|
+
try {
|
|
717
|
+
link.click();
|
|
718
|
+
} finally {
|
|
719
|
+
link.remove();
|
|
720
|
+
}
|
|
721
|
+
} catch {
|
|
722
|
+
if (token === generation.current) {
|
|
723
|
+
clearDownload();
|
|
724
|
+
setError("recordingExportError");
|
|
725
|
+
}
|
|
726
|
+
} finally {
|
|
727
|
+
if (token === generation.current) setExporting(false);
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
const toggleStarred = async () => {
|
|
731
|
+
const token = generation.current;
|
|
732
|
+
setStarring(true);
|
|
733
|
+
setError(null);
|
|
734
|
+
try {
|
|
735
|
+
await service.setStarred(session.id, !session.starred);
|
|
736
|
+
if (token === generation.current) refresh();
|
|
737
|
+
} catch {
|
|
738
|
+
if (token === generation.current) setError("recordingStarError");
|
|
739
|
+
} finally {
|
|
740
|
+
if (token === generation.current) setStarring(false);
|
|
741
|
+
}
|
|
742
|
+
};
|
|
743
|
+
const removeSession = async () => {
|
|
744
|
+
const token = ++generation.current;
|
|
745
|
+
setExporting(false);
|
|
746
|
+
setPlaying(false);
|
|
747
|
+
setDeleting(true);
|
|
748
|
+
setError(null);
|
|
749
|
+
clearPlayback();
|
|
750
|
+
clearDownload();
|
|
751
|
+
try {
|
|
752
|
+
await service.remove(session.id);
|
|
753
|
+
if (token === generation.current) {
|
|
754
|
+
setConfirmDelete(false);
|
|
755
|
+
refresh();
|
|
756
|
+
}
|
|
757
|
+
} catch {
|
|
758
|
+
if (token === generation.current) setError("recordingDeleteError");
|
|
759
|
+
} finally {
|
|
760
|
+
if (token === generation.current) setDeleting(false);
|
|
761
|
+
}
|
|
762
|
+
};
|
|
763
|
+
const length = Math.max(1, session.savedSamples);
|
|
764
|
+
const segmentName = (segment) => (segment.kind === "speech" ? copy.recordingSpeech : copy.recordingSilence) + " \xB7 " + duration(segment.startSample, session.sampleRate) + " \u2014 " + duration(segment.endSample, session.sampleRate);
|
|
765
|
+
return /* @__PURE__ */ import_react22.default.createElement("section", { ref: container, "aria-label": sourceName(session, copy) }, /* @__PURE__ */ import_react22.default.createElement("h3", null, sourceName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("dl", { className: "dlvd-recording-meta" }, /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingDate), /* @__PURE__ */ import_react22.default.createElement("dd", null, new Date(session.startedAt).toLocaleString()), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("dd", null, stateName(session, copy)), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingCaptured), /* @__PURE__ */ import_react22.default.createElement("dd", null, duration(session.capturedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingSaved), /* @__PURE__ */ import_react22.default.createElement("dd", null, duration(session.savedSamples, session.sampleRate), " \xB7", session.storage === "indexeddb" || session.persistent ? copy.recordingPersistent : copy.recordingMemory), session.endedAt && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement("dt", null, copy.recordingEnd), /* @__PURE__ */ import_react22.default.createElement("dd", null, new Date(session.endedAt).toLocaleString()))), session.error && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy.recordingError, ": ", session.error), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react22.default.createElement(
|
|
766
|
+
"button",
|
|
767
|
+
{
|
|
768
|
+
type: "button",
|
|
769
|
+
"aria-label": session.starred ? copy.recordingUnstar : copy.recordingStar,
|
|
770
|
+
"aria-pressed": !!session.starred,
|
|
771
|
+
title: session.starred ? copy.recordingUnstarHelp : copy.recordingStarHelp,
|
|
772
|
+
disabled: starring || deleting,
|
|
773
|
+
onClick: () => void toggleStarred()
|
|
774
|
+
},
|
|
775
|
+
session.starred ? "\u2605" : "\u2606"
|
|
776
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
777
|
+
"button",
|
|
778
|
+
{
|
|
779
|
+
type: "button",
|
|
780
|
+
disabled: playing || deleting || !session.savedSamples,
|
|
781
|
+
onClick: () => void play()
|
|
782
|
+
},
|
|
783
|
+
copy.recordingPlaySession
|
|
784
|
+
), /* @__PURE__ */ import_react22.default.createElement("button", { type: "button", disabled: exporting || deleting, onClick: () => void exportSession() }, copy.recordingExport), /* @__PURE__ */ import_react22.default.createElement(
|
|
785
|
+
"button",
|
|
786
|
+
{
|
|
787
|
+
type: "button",
|
|
788
|
+
disabled: deleting || starring,
|
|
789
|
+
onClick: () => setConfirmDelete(true)
|
|
790
|
+
},
|
|
791
|
+
copy.recordingDelete
|
|
792
|
+
)), confirmDelete && /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-delete-confirm", role: "group", "aria-label": copy.recordingConfirmDelete }, /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingConfirmDelete), /* @__PURE__ */ import_react22.default.createElement(
|
|
793
|
+
"button",
|
|
794
|
+
{
|
|
795
|
+
type: "button",
|
|
796
|
+
disabled: deleting || starring,
|
|
797
|
+
onClick: () => void removeSession()
|
|
798
|
+
},
|
|
799
|
+
copy.recordingDelete
|
|
800
|
+
), " ", /* @__PURE__ */ import_react22.default.createElement("button", { type: "button", disabled: deleting, onClick: () => setConfirmDelete(false) }, copy.recordingCancel)), error && /* @__PURE__ */ import_react22.default.createElement("p", { role: "alert" }, copy[error]), /* @__PURE__ */ import_react22.default.createElement(
|
|
801
|
+
"audio",
|
|
802
|
+
{
|
|
803
|
+
ref: audio,
|
|
804
|
+
controls: true,
|
|
805
|
+
preload: "none",
|
|
806
|
+
"aria-label": copy.recordingAudio,
|
|
807
|
+
onError: () => {
|
|
808
|
+
clearPlayback();
|
|
809
|
+
setError("recordingAudioError");
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
), /* @__PURE__ */ import_react22.default.createElement("h4", null, copy.recordingTimeline), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-timeline", role: "group", "aria-label": copy.recordingTimeline }, segments.map((segment) => /* @__PURE__ */ import_react22.default.createElement(
|
|
813
|
+
"button",
|
|
814
|
+
{
|
|
815
|
+
key: segment.id,
|
|
816
|
+
type: "button",
|
|
817
|
+
"data-kind": segment.kind,
|
|
818
|
+
"aria-label": segmentName(segment),
|
|
819
|
+
title: segmentName(segment),
|
|
820
|
+
"aria-pressed": selectedSegment === segment.id,
|
|
821
|
+
style: {
|
|
822
|
+
left: segment.startSample / length * 100 + "%",
|
|
823
|
+
width: Math.max(0, segment.endSample - segment.startSample) / length * 100 + "%"
|
|
824
|
+
},
|
|
825
|
+
onClick: () => {
|
|
826
|
+
clearPlayback();
|
|
827
|
+
setPlaying(false);
|
|
828
|
+
setSelectedSegment(segment.id);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
)), session.pins.map((pin) => /* @__PURE__ */ import_react22.default.createElement(
|
|
832
|
+
"span",
|
|
833
|
+
{
|
|
834
|
+
key: pin.id,
|
|
835
|
+
className: "dlvd-pin",
|
|
836
|
+
"aria-hidden": "true",
|
|
837
|
+
style: { left: Math.min(length, pin.atSample) / length * 100 + "%" },
|
|
838
|
+
title: (pin.kind === "speech-start" ? copy.recordingSpeech : copy.recordingSilence) + " \xB7 " + duration(pin.atSample, session.sampleRate)
|
|
839
|
+
}
|
|
840
|
+
))), /* @__PURE__ */ import_react22.default.createElement("div", { className: "dlvd-timeline-legend" }, /* @__PURE__ */ import_react22.default.createElement("span", { "data-kind": "speech" }, copy.recordingSpeech), " \xB7 ", /* @__PURE__ */ import_react22.default.createElement("span", { "data-kind": "silence" }, copy.recordingSilence), " \xB7 ", duration(session.savedSamples, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("h4", null, copy.recordingSegments), /* @__PURE__ */ import_react22.default.createElement("table", { className: "dlvd-segments" }, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingStart), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingEnd), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingDuration), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingAudio))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, segments.map((segment) => /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, { key: segment.id }, /* @__PURE__ */ import_react22.default.createElement("tr", { "data-selected": selectedSegment === segment.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, segment.kind === "speech" ? copy.recordingSpeech : copy.recordingSilence, segment.open && /* @__PURE__ */ import_react22.default.createElement("small", null, copy.recordingOpen)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.endSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(segment.endSample - segment.startSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, /* @__PURE__ */ import_react22.default.createElement(
|
|
841
|
+
"button",
|
|
842
|
+
{
|
|
843
|
+
type: "button",
|
|
844
|
+
disabled: deleting || segment.endSample <= segment.startSample,
|
|
845
|
+
"aria-label": copy.recordingPlay + " \xB7 " + segmentName(segment),
|
|
846
|
+
onClick: () => void play(segment)
|
|
847
|
+
},
|
|
848
|
+
copy.recordingPlay
|
|
849
|
+
))), segment.kind === "speech" && /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("td", { colSpan: 5 }, /* @__PURE__ */ import_react22.default.createElement("details", { open: selectedSegment === segment.id || void 0 }, /* @__PURE__ */ import_react22.default.createElement("summary", null, copy.recordingAttempts, " \xB7 ", segment.attempts.length), !segment.attempts.length && /* @__PURE__ */ import_react22.default.createElement("p", null, copy.recordingNoAttempts), segment.attempts.map((attempt) => /* @__PURE__ */ import_react22.default.createElement("article", { className: "dlvd-attempt", key: attempt.id }, /* @__PURE__ */ import_react22.default.createElement("div", null, copy.recordingEngine, ": ", attempt.engine, " \xB7", {
|
|
850
|
+
pending: copy.recordingPending,
|
|
851
|
+
success: copy.recordingSuccess,
|
|
852
|
+
error: copy.recordingError
|
|
853
|
+
}[attempt.status]), /* @__PURE__ */ import_react22.default.createElement("time", { dateTime: attempt.createdAt }, new Date(attempt.createdAt).toLocaleString()), attempt.finishedAt && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, " ", "\u2014", " ", /* @__PURE__ */ import_react22.default.createElement("time", { dateTime: attempt.finishedAt }, new Date(attempt.finishedAt).toLocaleString())), /* @__PURE__ */ import_react22.default.createElement("div", null, duration(attempt.startSample, session.sampleRate), " \u2014", " ", duration(attempt.endSample, session.sampleRate)), attempt.text != null && /* @__PURE__ */ import_react22.default.createElement("p", { className: "dlvd-transcript" }, attempt.text), attempt.error && /* @__PURE__ */ import_react22.default.createElement("p", { className: "dlvd-attempt-error" }, copy.recordingError, ": ", attempt.error)))))))))), /* @__PURE__ */ import_react22.default.createElement("details", null, /* @__PURE__ */ import_react22.default.createElement("summary", null, copy.recordingPins, " \xB7 ", session.pins.length), /* @__PURE__ */ import_react22.default.createElement("table", null, /* @__PURE__ */ import_react22.default.createElement("thead", null, /* @__PURE__ */ import_react22.default.createElement("tr", null, /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingState), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingStart), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingPinConfirmed), /* @__PURE__ */ import_react22.default.createElement("th", { scope: "col" }, copy.recordingPinDelay))), /* @__PURE__ */ import_react22.default.createElement("tbody", null, session.pins.map((pin) => /* @__PURE__ */ import_react22.default.createElement("tr", { key: pin.id }, /* @__PURE__ */ import_react22.default.createElement("td", null, pin.kind === "speech-start" ? copy.recordingSpeech : copy.recordingSilence), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.atSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.confirmedAtSample, session.sampleRate)), /* @__PURE__ */ import_react22.default.createElement("td", null, duration(pin.delaySamples, session.sampleRate))))))));
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// src/RuntimePanel.tsx
|
|
857
|
+
var import_react23 = __toESM(require("react"), 1);
|
|
858
|
+
function RuntimePanel({ data, copy }) {
|
|
859
|
+
const unknown = copy.runtimeUnavailable;
|
|
860
|
+
const bytes = (n) => typeof n === "number" && Number.isFinite(n) ? (n / 1073741824).toFixed(3) + " GiB (" + Math.round(n).toLocaleString() + " B)" : unknown;
|
|
861
|
+
const ms = (n) => typeof n === "number" && Number.isFinite(n) ? Math.round(n).toLocaleString() + " ms" : unknown;
|
|
862
|
+
const status = (v) => ({
|
|
863
|
+
loading: copy.recordingLoading,
|
|
864
|
+
ready: copy.runtimeReady,
|
|
865
|
+
error: copy.recordingError,
|
|
866
|
+
downloaded: copy.runtimeReleased,
|
|
867
|
+
absent: copy.runtimeReleased,
|
|
868
|
+
started: copy.runtimeStarted,
|
|
869
|
+
success: copy.runtimeSuccess,
|
|
870
|
+
released: copy.runtimeReleased,
|
|
871
|
+
cancelled: copy.runtimeCancelled
|
|
872
|
+
})[v] ?? unknown;
|
|
873
|
+
const row = (label, value) => /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, { key: label }, /* @__PURE__ */ import_react23.default.createElement("dt", null, label), /* @__PURE__ */ import_react23.default.createElement("dd", null, value));
|
|
874
|
+
return /* @__PURE__ */ import_react23.default.createElement("section", { className: "dlvd-runtimes dlvd-scroll", tabIndex: 0, "aria-label": copy.runtimeTitle }, /* @__PURE__ */ import_react23.default.createElement("h3", null, copy.runtimeTitle, " ", /* @__PURE__ */ import_react23.default.createElement(Hint, { label: copy.runtimeTitle }, copy.runtimeHelp)), /* @__PURE__ */ import_react23.default.createElement("dl", { className: "dlvd-recording-meta" }, row(
|
|
875
|
+
copy.runtimeVersions,
|
|
876
|
+
(data.versions?.onnx ?? unknown) + " / " + (data.versions?.transformers ?? unknown)
|
|
877
|
+
), row(copy.runtimeId, data.runtimeId ?? unknown), row(
|
|
878
|
+
copy.runtimeGpu,
|
|
879
|
+
data.gpu === "available" ? copy.runtimeYes : data.gpu === "unavailable" ? copy.runtimeNo : unknown
|
|
880
|
+
), row(copy.runtimeStorage, bytes(data.storageAvailableBytes)), row(copy.runtimeHeap, bytes(data.pageJsHeapBytes)), row(copy.runtimeRam, unknown), row(copy.runtimeVram, unknown)), (data.models ?? []).map((model) => /* @__PURE__ */ import_react23.default.createElement("article", { className: "dlvd-runtime-card", key: model.key }, /* @__PURE__ */ import_react23.default.createElement("h3", null, model.name), /* @__PURE__ */ import_react23.default.createElement("dl", { className: "dlvd-recording-meta" }, row(copy.runtimeStatus, status(model.phase)), row(
|
|
881
|
+
copy.runtimeDevice,
|
|
882
|
+
model.device === "webgpu" ? "WebGPU" : model.device === "wasm" ? "WebAssembly CPU" : unknown
|
|
883
|
+
), row(copy.runtimeWorker, model.workerActive ? copy.runtimeYes : copy.runtimeNo), row(copy.runtimeRevision, model.repository + " @ " + model.revision), row(copy.runtimeQuantization, model.encoderDtype + " / " + model.decoderDtype), row(copy.runtimeModelBytes, bytes(model.modelBytes)), row(copy.runtimeCache, bytes(model.cachedBytes)), row(copy.runtimePcm, bytes(model.pcmBytes)), row(copy.runtimeLoad, ms(model.loadMs) + " / " + ms(model.workerLoadMs)), row(copy.runtimeInference, ms(model.workerInferenceMs)), row(copy.runtimeAudio, ms(model.audioMs)), row(
|
|
884
|
+
copy.runtimeRatio,
|
|
885
|
+
model.workerInferenceMs != null && model.audioMs > 0 ? (model.workerInferenceMs / model.audioMs).toFixed(2) + "\xD7" : unknown
|
|
886
|
+
), row(copy.runtimeQueue, model.queued), row(copy.runtimeActive, model.active), row(copy.runtimePending, model.pendingRequests), row(copy.runtimeCompleted, model.completed), row(copy.runtimeFailed, model.failed)), model.error && /* @__PURE__ */ import_react23.default.createElement("p", { role: "alert" }, copy.runtimeError, ": ", /* @__PURE__ */ import_react23.default.createElement("code", null, model.error)))), /* @__PURE__ */ import_react23.default.createElement("h3", null, copy.runtimeEvents), /* @__PURE__ */ import_react23.default.createElement("div", { className: "dlvd-history" }, !data.events?.length && /* @__PURE__ */ import_react23.default.createElement("p", null, copy.empty), [...data.events ?? []].reverse().map((event) => /* @__PURE__ */ import_react23.default.createElement("div", { key: event.sequence, "data-level": event.status === "error" ? "error" : "debug" }, /* @__PURE__ */ import_react23.default.createElement("time", null, new Date(event.timeMs).toLocaleTimeString()), " \xB7 ", event.model, " \xB7", " ", event.operation === "load" ? copy.runtimeLoad : event.operation === "worker" ? copy.runtimeWorker : copy.runtimeInference, " ", "\xB7 ", status(event.status), event.durationMs != null ? " \xB7 " + ms(event.durationMs) : "", event.code && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, " ", "\xB7 ", /* @__PURE__ */ import_react23.default.createElement("code", null, event.code))))));
|
|
386
887
|
}
|
|
387
888
|
|
|
388
889
|
// src/DebuggerPanel.tsx
|
|
@@ -391,17 +892,19 @@ function DebuggerPanel({
|
|
|
391
892
|
onClose,
|
|
392
893
|
target = window
|
|
393
894
|
}) {
|
|
394
|
-
const [
|
|
395
|
-
const
|
|
396
|
-
const
|
|
397
|
-
const [
|
|
398
|
-
const
|
|
399
|
-
const [
|
|
400
|
-
const [
|
|
401
|
-
const [
|
|
402
|
-
const
|
|
403
|
-
const
|
|
404
|
-
|
|
895
|
+
const [tab, setTab] = import_react24.default.useState("recordings");
|
|
896
|
+
const tabsId = import_react24.default.useId();
|
|
897
|
+
const [frozen, setFrozen] = import_react24.default.useState(false);
|
|
898
|
+
const [refreshHz, setRefreshHz] = import_react24.default.useState(10);
|
|
899
|
+
const updateRef = import_react24.default.useRef(null);
|
|
900
|
+
const [content, setContent] = import_react24.default.useState(false);
|
|
901
|
+
const [module2, setModule] = import_react24.default.useState("");
|
|
902
|
+
const [view, setView] = import_react24.default.useState(null);
|
|
903
|
+
const [failed, setFailed] = import_react24.default.useState(false);
|
|
904
|
+
const [eventsPaused, setEventsPaused] = import_react24.default.useState(false);
|
|
905
|
+
const pausedRef = import_react24.default.useRef(false);
|
|
906
|
+
const inspectorRef = import_react24.default.useRef(null);
|
|
907
|
+
import_react24.default.useEffect(() => {
|
|
405
908
|
if (frozen) return;
|
|
406
909
|
let inspector = null;
|
|
407
910
|
let source = null;
|
|
@@ -434,47 +937,114 @@ function DebuggerPanel({
|
|
|
434
937
|
inspectorRef.current = null;
|
|
435
938
|
};
|
|
436
939
|
}, [frozen, content, target]);
|
|
437
|
-
|
|
940
|
+
import_react24.default.useEffect(() => {
|
|
438
941
|
if (frozen) return;
|
|
439
942
|
const timer = setInterval(() => updateRef.current?.(), 1e3 / refreshHz);
|
|
440
943
|
return () => clearInterval(timer);
|
|
441
944
|
}, [frozen, refreshHz]);
|
|
442
945
|
const modules = [...new Set(view?.transitions.map((entry) => entry.module) ?? [])].sort();
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
setFrozen(false);
|
|
451
|
-
setContent(event.target.checked);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
), copy.content)), failed ? /* @__PURE__ */ import_react21.default.createElement("p", { role: "alert" }, copy.error) : !view ? /* @__PURE__ */ import_react21.default.createElement("p", { role: "status" }, copy.waiting) : /* @__PURE__ */ import_react21.default.createElement("div", { className: "dlvd-columns" }, /* @__PURE__ */ import_react21.default.createElement("section", { className: "dlvd-state-pane", "aria-label": copy.states }, /* @__PURE__ */ import_react21.default.createElement("h3", null, copy.states), /* @__PURE__ */ import_react21.default.createElement("div", { className: "dlvd-scroll", tabIndex: 0 }, /* @__PURE__ */ import_react21.default.createElement(StateTree, { name: "context", value: view.state, omitted: copy.omitted }))), /* @__PURE__ */ import_react21.default.createElement("section", { className: "dlvd-event-pane", "aria-label": copy.transitions }, /* @__PURE__ */ import_react21.default.createElement("h3", null, copy.transitions), /* @__PURE__ */ import_react21.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
946
|
+
const runtimeData = view?.state?.runtimes;
|
|
947
|
+
const hasRuntimes = !!runtimeData?.models?.length;
|
|
948
|
+
const tabs = hasRuntimes ? ["recordings", "states", "runtimes"] : ["recordings", "states"];
|
|
949
|
+
import_react24.default.useEffect(() => {
|
|
950
|
+
if (tab === "runtimes" && !hasRuntimes) setTab("states");
|
|
951
|
+
}, [tab, hasRuntimes]);
|
|
952
|
+
return /* @__PURE__ */ import_react24.default.createElement("aside", { className: "dlvd-panel", "aria-label": copy.title }, /* @__PURE__ */ import_react24.default.createElement("header", null, /* @__PURE__ */ import_react24.default.createElement("strong", null, copy.title), /* @__PURE__ */ import_react24.default.createElement("span", null, refreshHz, " Hz"), /* @__PURE__ */ import_react24.default.createElement("button", { type: "button", onClick: onClose, "aria-label": copy.close }, "\xD7")), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-tabs", role: "tablist", "aria-label": copy.title }, tabs.map((name) => /* @__PURE__ */ import_react24.default.createElement(
|
|
455
953
|
"button",
|
|
456
954
|
{
|
|
457
955
|
type: "button",
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
956
|
+
key: name,
|
|
957
|
+
role: "tab",
|
|
958
|
+
id: tabsId + "-" + name + "-tab",
|
|
959
|
+
"aria-controls": tabsId + "-" + name,
|
|
960
|
+
"aria-selected": tab === name,
|
|
961
|
+
tabIndex: tab === name ? 0 : -1,
|
|
962
|
+
onClick: () => setTab(name),
|
|
963
|
+
onKeyDown: (event) => {
|
|
964
|
+
if (["ArrowLeft", "ArrowRight", "Home", "End"].includes(event.key)) {
|
|
965
|
+
event.preventDefault();
|
|
966
|
+
const index = tabs.indexOf(tab);
|
|
967
|
+
const next = event.key === "Home" ? tabs[0] : event.key === "End" ? tabs[tabs.length - 1] : tabs[(index + (event.key === "ArrowRight" ? 1 : tabs.length - 1)) % tabs.length];
|
|
968
|
+
setTab(next);
|
|
969
|
+
event.currentTarget.parentElement?.querySelector('[id="' + tabsId + "-" + next + '-tab"]')?.focus();
|
|
970
|
+
}
|
|
464
971
|
}
|
|
465
972
|
},
|
|
466
|
-
|
|
467
|
-
), /* @__PURE__ */
|
|
468
|
-
"
|
|
973
|
+
name === "recordings" ? copy.recordingTitle : name === "runtimes" ? copy.runtimeTitle : copy.states
|
|
974
|
+
))), /* @__PURE__ */ import_react24.default.createElement(
|
|
975
|
+
"div",
|
|
469
976
|
{
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
977
|
+
className: "dlvd-tab-panel",
|
|
978
|
+
role: "tabpanel",
|
|
979
|
+
id: tabsId + "-recordings",
|
|
980
|
+
"aria-labelledby": tabsId + "-recordings-tab",
|
|
981
|
+
hidden: tab !== "recordings"
|
|
982
|
+
},
|
|
983
|
+
tab === "recordings" && /* @__PURE__ */ import_react24.default.createElement(RecordingPanel, { copy, target })
|
|
984
|
+
), hasRuntimes && /* @__PURE__ */ import_react24.default.createElement(
|
|
985
|
+
"div",
|
|
986
|
+
{
|
|
987
|
+
className: "dlvd-tab-panel",
|
|
988
|
+
role: "tabpanel",
|
|
989
|
+
id: tabsId + "-runtimes",
|
|
990
|
+
"aria-labelledby": tabsId + "-runtimes-tab",
|
|
991
|
+
hidden: tab !== "runtimes"
|
|
475
992
|
},
|
|
476
|
-
copy
|
|
477
|
-
)
|
|
993
|
+
tab === "runtimes" && /* @__PURE__ */ import_react24.default.createElement(RuntimePanel, { data: runtimeData, copy })
|
|
994
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
995
|
+
"div",
|
|
996
|
+
{
|
|
997
|
+
className: "dlvd-tab-panel",
|
|
998
|
+
role: "tabpanel",
|
|
999
|
+
id: tabsId + "-states",
|
|
1000
|
+
"aria-labelledby": tabsId + "-states-tab",
|
|
1001
|
+
hidden: tab !== "states"
|
|
1002
|
+
},
|
|
1003
|
+
/* @__PURE__ */ import_react24.default.createElement("p", null, copy.help),
|
|
1004
|
+
/* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react24.default.createElement("label", null, copy.refreshRate, /* @__PURE__ */ import_react24.default.createElement(
|
|
1005
|
+
"select",
|
|
1006
|
+
{
|
|
1007
|
+
value: refreshHz,
|
|
1008
|
+
onChange: (event) => setRefreshHz(Number(event.target.value))
|
|
1009
|
+
},
|
|
1010
|
+
[1, 2, 5, 10, 20].map((hz) => /* @__PURE__ */ import_react24.default.createElement("option", { key: hz, value: hz }, hz, " Hz"))
|
|
1011
|
+
)), /* @__PURE__ */ import_react24.default.createElement("button", { type: "button", onClick: () => setFrozen(!frozen) }, frozen ? copy.resume : copy.freeze), /* @__PURE__ */ import_react24.default.createElement("label", null, /* @__PURE__ */ import_react24.default.createElement(
|
|
1012
|
+
"input",
|
|
1013
|
+
{
|
|
1014
|
+
type: "checkbox",
|
|
1015
|
+
checked: content,
|
|
1016
|
+
onChange: (event) => {
|
|
1017
|
+
setView(null);
|
|
1018
|
+
setFrozen(false);
|
|
1019
|
+
setContent(event.target.checked);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
), copy.content)),
|
|
1023
|
+
failed ? /* @__PURE__ */ import_react24.default.createElement("p", { role: "alert" }, copy.error) : !view ? /* @__PURE__ */ import_react24.default.createElement("p", { role: "status" }, copy.waiting) : /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-columns" }, /* @__PURE__ */ import_react24.default.createElement("section", { className: "dlvd-state-pane", "aria-label": copy.states }, /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.states), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-scroll", tabIndex: 0 }, /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "context", value: view.state, omitted: copy.omitted }))), /* @__PURE__ */ import_react24.default.createElement("section", { className: "dlvd-event-pane", "aria-label": copy.transitions }, /* @__PURE__ */ import_react24.default.createElement("h3", null, copy.transitions), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-toolbar" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
1024
|
+
"button",
|
|
1025
|
+
{
|
|
1026
|
+
type: "button",
|
|
1027
|
+
"aria-pressed": eventsPaused,
|
|
1028
|
+
onClick: () => {
|
|
1029
|
+
const paused = !eventsPaused;
|
|
1030
|
+
inspectorRef.current?.setPaused(paused);
|
|
1031
|
+
pausedRef.current = paused;
|
|
1032
|
+
setEventsPaused(paused);
|
|
1033
|
+
}
|
|
1034
|
+
},
|
|
1035
|
+
eventsPaused ? copy.eventsResume : copy.eventsPause
|
|
1036
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
1037
|
+
"button",
|
|
1038
|
+
{
|
|
1039
|
+
type: "button",
|
|
1040
|
+
onClick: () => {
|
|
1041
|
+
inspectorRef.current?.clear();
|
|
1042
|
+
setView((current) => current ? { ...current, transitions: [] } : current);
|
|
1043
|
+
}
|
|
1044
|
+
},
|
|
1045
|
+
copy.eventsClear
|
|
1046
|
+
)), /* @__PURE__ */ import_react24.default.createElement("label", null, copy.filter, /* @__PURE__ */ import_react24.default.createElement("select", { value: module2, onChange: (event) => setModule(event.target.value) }, /* @__PURE__ */ import_react24.default.createElement("option", { value: "" }, copy.all), modules.map((name) => /* @__PURE__ */ import_react24.default.createElement("option", { key: name }, name)))), /* @__PURE__ */ import_react24.default.createElement("div", { className: "dlvd-history dlvd-scroll", tabIndex: 0 }, view.transitions.filter((entry) => !module2 || entry.module === module2).slice().reverse().map((entry) => /* @__PURE__ */ import_react24.default.createElement("details", { key: entry.sequence, "data-level": entry.level }, /* @__PURE__ */ import_react24.default.createElement("summary", null, /* @__PURE__ */ import_react24.default.createElement("small", null, new Date(entry.timeMs).toLocaleTimeString()), " ", /* @__PURE__ */ import_react24.default.createElement("code", null, entry.sessionId, " / ", entry.module)), /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "before", value: entry.before, omitted: copy.omitted }), /* @__PURE__ */ import_react24.default.createElement(StateTree, { name: "after", value: entry.after, omitted: copy.omitted }))), !view.transitions.length && /* @__PURE__ */ import_react24.default.createElement("p", null, copy.empty))))
|
|
1047
|
+
));
|
|
478
1048
|
}
|
|
479
1049
|
|
|
480
1050
|
// src/locales.ts
|
|
@@ -497,8 +1067,102 @@ var dictionaries = {
|
|
|
497
1067
|
help: "Read-only state tree updated at 10 Hz. Text is hidden by default. This panel does not control voice.",
|
|
498
1068
|
omitted: "Additional items omitted",
|
|
499
1069
|
popupBlocked: "The browser blocked the debugger window. Allow popups for this site and try again.",
|
|
1070
|
+
recordingActive: "Recording",
|
|
1071
|
+
recordingAllSources: "All sources",
|
|
1072
|
+
recordingAttempts: "Transcription history",
|
|
1073
|
+
recordingAudio: "Recording playback",
|
|
1074
|
+
recordingAudioError: "Unable to load or play recording audio.",
|
|
1075
|
+
recordingCancel: "Cancel",
|
|
1076
|
+
recordingCaptured: "Captured audio",
|
|
1077
|
+
recordingCompleted: "Completed",
|
|
1078
|
+
recordingConfirmDelete: "Delete this entire recording, including its audio and transcription history? This cannot be undone. Deleting an active recording also discards its future saved audio.",
|
|
1079
|
+
recordingDate: "Started",
|
|
1080
|
+
recordingDelete: "Delete entire session",
|
|
1081
|
+
recordingDeleteError: "Unable to delete the recording.",
|
|
1082
|
+
recordingDuration: "Duration",
|
|
1083
|
+
recordingEmpty: "No recording sessions match this filter.",
|
|
1084
|
+
recordingEnd: "End",
|
|
1085
|
+
recordingEngine: "Engine",
|
|
1086
|
+
recordingError: "Error",
|
|
1087
|
+
recordingExport: "Export self-contained JSON",
|
|
1088
|
+
recordingExportError: "Unable to export the recording.",
|
|
1089
|
+
recordingFailed: "Failed",
|
|
1090
|
+
recordingHelp: "Inspect saved audio, speech/silence boundaries and transcription attempts. Audio and transcripts may be sensitive. Playback is local; export includes audio and text. Inspection never changes capture; only explicit deletion removes recordings.",
|
|
1091
|
+
recordingInterrupted: "Interrupted",
|
|
1092
|
+
recordingLoadError: "Unable to load recording sessions. Try refreshing.",
|
|
1093
|
+
recordingLoading: "Loading recordings\u2026",
|
|
1094
|
+
recordingMemory: "Memory only",
|
|
1095
|
+
recordingMicrophone: "Microphone",
|
|
1096
|
+
recordingNoAttempts: "No transcription attempts yet.",
|
|
1097
|
+
recordingOpen: "Open segment",
|
|
1098
|
+
recordingPending: "Pending",
|
|
1099
|
+
recordingPersistent: "Saved locally",
|
|
1100
|
+
recordingPinConfirmed: "Confirmed at",
|
|
1101
|
+
recordingPinDelay: "Confirmation delay",
|
|
1102
|
+
recordingPins: "Boundary pins",
|
|
1103
|
+
recordingPlay: "Play segment",
|
|
1104
|
+
recordingPlaySession: "Play saved session",
|
|
1105
|
+
recordingRefresh: "Refresh recordings",
|
|
1106
|
+
recordingSaved: "Saved audio",
|
|
1107
|
+
recordingSegments: "Segments",
|
|
1108
|
+
recordingSelectSession: "Select a recording session.",
|
|
1109
|
+
recordingShared: "Shared audio",
|
|
1110
|
+
recordingSilence: "Silence",
|
|
1111
|
+
recordingSource: "Source",
|
|
1112
|
+
recordingSourceFilter: "Filter sources",
|
|
1113
|
+
recordingSpeech: "Speech",
|
|
1114
|
+
recordingStar: "Keep indefinitely",
|
|
1115
|
+
recordingStarError: "Unable to change recording protection.",
|
|
1116
|
+
recordingStarHelp: "Exclude this recording from automatic cleanup and the retention count. Manual deletion is still allowed. This does not change browser storage or eviction protection.",
|
|
1117
|
+
recordingStarred: "Protected from automatic cleanup",
|
|
1118
|
+
recordingStart: "Start",
|
|
1119
|
+
recordingState: "State",
|
|
1120
|
+
recordingSuccess: "Success",
|
|
1121
|
+
recordingTimeline: "Speech / silence timeline",
|
|
1122
|
+
recordingTitle: "Recordings",
|
|
1123
|
+
recordingUnavailable: "Recording service unavailable. Enable recording in Live Voice settings with a compatible runtime.",
|
|
1124
|
+
recordingUnstar: "Remove protection",
|
|
1125
|
+
recordingUnstarHelp: "Allow automatic cleanup and include this recording in the retention count again. Manual deletion is still allowed. Browser storage and eviction protection are unchanged.",
|
|
500
1126
|
refreshRate: "Refresh rate",
|
|
501
1127
|
resume: "Resume updates",
|
|
1128
|
+
runtimeActive: "Active requests",
|
|
1129
|
+
runtimeAudio: "Last audio duration",
|
|
1130
|
+
runtimeCache: "Cached model files",
|
|
1131
|
+
runtimeCancelled: "Cancelled",
|
|
1132
|
+
runtimeCompleted: "Completed transcriptions",
|
|
1133
|
+
runtimeDevice: "Requested execution provider",
|
|
1134
|
+
runtimeError: "Error code",
|
|
1135
|
+
runtimeEvents: "Runtime events (last 100)",
|
|
1136
|
+
runtimeFailed: "Failed / cancelled transcriptions",
|
|
1137
|
+
runtimeGpu: "WebGPU adapter available",
|
|
1138
|
+
runtimeHeap: "Page JavaScript heap estimate",
|
|
1139
|
+
runtimeHelp: "Model/cache sizes are file bytes, not RAM. PCM counts only queued/active input buffers. Page JavaScript heap, when available, is a non-standard page-wide estimate and excludes complete worker/WASM/GPU memory. Model RAM and VRAM cannot be reliably measured here. WebGPU initialization does not prove every graph operator ran on GPU. Events are plugin lifecycle metadata, not raw ONNX logs; no audio or transcripts are retained.",
|
|
1140
|
+
runtimeId: "Worker identity",
|
|
1141
|
+
runtimeInference: "Last worker inference",
|
|
1142
|
+
runtimeLoad: "Load round trip / worker",
|
|
1143
|
+
runtimeMemory: "Memory and storage",
|
|
1144
|
+
runtimeModel: "Model",
|
|
1145
|
+
runtimeModelBytes: "Complete model download",
|
|
1146
|
+
runtimeNo: "No",
|
|
1147
|
+
runtimePcm: "Accounted input PCM",
|
|
1148
|
+
runtimePending: "Pending worker requests",
|
|
1149
|
+
runtimeQuantization: "Encoder / decoder precision",
|
|
1150
|
+
runtimeQueue: "Queued transcriptions",
|
|
1151
|
+
runtimeRam: "Model RAM",
|
|
1152
|
+
runtimeRatio: "Processing / audio ratio",
|
|
1153
|
+
runtimeReady: "Ready",
|
|
1154
|
+
runtimeReleased: "Released",
|
|
1155
|
+
runtimeRevision: "Pinned revision",
|
|
1156
|
+
runtimeStarted: "Started",
|
|
1157
|
+
runtimeStatus: "Status",
|
|
1158
|
+
runtimeStorage: "Available origin storage",
|
|
1159
|
+
runtimeSuccess: "Success",
|
|
1160
|
+
runtimeTitle: "Runtimes",
|
|
1161
|
+
runtimeUnavailable: "Unavailable",
|
|
1162
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1163
|
+
runtimeVram: "Model VRAM",
|
|
1164
|
+
runtimeWorker: "Worker active",
|
|
1165
|
+
runtimeYes: "Yes",
|
|
502
1166
|
states: "Current states",
|
|
503
1167
|
title: "Live Voice Debugger",
|
|
504
1168
|
transitions: "Recent state transitions",
|
|
@@ -521,8 +1185,102 @@ var dictionaries = {
|
|
|
521
1185
|
help: "\xC1rvore de estados somente leitura atualizada a 10 Hz. Texto oculto por padr\xE3o. Este painel n\xE3o controla a voz.",
|
|
522
1186
|
omitted: "Itens adicionais omitidos",
|
|
523
1187
|
popupBlocked: "O navegador bloqueou a janela do debugger. Permita pop-ups neste site e tente novamente.",
|
|
1188
|
+
recordingActive: "Gravando",
|
|
1189
|
+
recordingAllSources: "Todas as fontes",
|
|
1190
|
+
recordingAttempts: "Hist\xF3rico de transcri\xE7\xE3o",
|
|
1191
|
+
recordingAudio: "Reprodu\xE7\xE3o da grava\xE7\xE3o",
|
|
1192
|
+
recordingAudioError: "N\xE3o foi poss\xEDvel carregar ou reproduzir o \xE1udio.",
|
|
1193
|
+
recordingCancel: "Cancelar",
|
|
1194
|
+
recordingCaptured: "\xC1udio capturado",
|
|
1195
|
+
recordingCompleted: "Conclu\xEDda",
|
|
1196
|
+
recordingConfirmDelete: "Excluir esta grava\xE7\xE3o inteira, incluindo \xE1udio e hist\xF3rico de transcri\xE7\xE3o? N\xE3o \xE9 poss\xEDvel desfazer. Excluir uma grava\xE7\xE3o ativa tamb\xE9m descarta o \xE1udio salvo futuro.",
|
|
1197
|
+
recordingDate: "In\xEDcio",
|
|
1198
|
+
recordingDelete: "Excluir sess\xE3o inteira",
|
|
1199
|
+
recordingDeleteError: "N\xE3o foi poss\xEDvel excluir a grava\xE7\xE3o.",
|
|
1200
|
+
recordingDuration: "Dura\xE7\xE3o",
|
|
1201
|
+
recordingEmpty: "Nenhuma grava\xE7\xE3o corresponde ao filtro.",
|
|
1202
|
+
recordingEnd: "Fim",
|
|
1203
|
+
recordingEngine: "Motor",
|
|
1204
|
+
recordingError: "Erro",
|
|
1205
|
+
recordingExport: "Exportar JSON completo",
|
|
1206
|
+
recordingExportError: "N\xE3o foi poss\xEDvel exportar a grava\xE7\xE3o.",
|
|
1207
|
+
recordingFailed: "Falhou",
|
|
1208
|
+
recordingHelp: "Inspecione \xE1udio salvo, limites de fala/sil\xEAncio e tentativas de transcri\xE7\xE3o. \xC1udio e texto podem ser sens\xEDveis. Reprodu\xE7\xE3o local; a exporta\xE7\xE3o inclui \xE1udio e texto. Inspecionar n\xE3o altera a captura; apenas a exclus\xE3o expl\xEDcita remove grava\xE7\xF5es.",
|
|
1209
|
+
recordingInterrupted: "Interrompida",
|
|
1210
|
+
recordingLoadError: "N\xE3o foi poss\xEDvel carregar as grava\xE7\xF5es. Tente atualizar.",
|
|
1211
|
+
recordingLoading: "Carregando grava\xE7\xF5es\u2026",
|
|
1212
|
+
recordingMemory: "Somente na mem\xF3ria",
|
|
1213
|
+
recordingMicrophone: "Microfone",
|
|
1214
|
+
recordingNoAttempts: "Nenhuma tentativa de transcri\xE7\xE3o ainda.",
|
|
1215
|
+
recordingOpen: "Segmento aberto",
|
|
1216
|
+
recordingPending: "Pendente",
|
|
1217
|
+
recordingPersistent: "Salva localmente",
|
|
1218
|
+
recordingPinConfirmed: "Confirmado em",
|
|
1219
|
+
recordingPinDelay: "Atraso de confirma\xE7\xE3o",
|
|
1220
|
+
recordingPins: "Marcadores de limite",
|
|
1221
|
+
recordingPlay: "Reproduzir segmento",
|
|
1222
|
+
recordingPlaySession: "Reproduzir sess\xE3o salva",
|
|
1223
|
+
recordingRefresh: "Atualizar grava\xE7\xF5es",
|
|
1224
|
+
recordingSaved: "\xC1udio salvo",
|
|
1225
|
+
recordingSegments: "Segmentos",
|
|
1226
|
+
recordingSelectSession: "Selecione uma sess\xE3o de grava\xE7\xE3o.",
|
|
1227
|
+
recordingShared: "\xC1udio compartilhado",
|
|
1228
|
+
recordingSilence: "Sil\xEAncio",
|
|
1229
|
+
recordingSource: "Fonte",
|
|
1230
|
+
recordingSourceFilter: "Filtrar fontes",
|
|
1231
|
+
recordingSpeech: "Fala",
|
|
1232
|
+
recordingStar: "Manter por tempo indeterminado",
|
|
1233
|
+
recordingStarError: "N\xE3o foi poss\xEDvel alterar a prote\xE7\xE3o da grava\xE7\xE3o.",
|
|
1234
|
+
recordingStarHelp: "Exclui esta grava\xE7\xE3o da limpeza autom\xE1tica e da contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. N\xE3o altera o armazenamento nem a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador.",
|
|
1235
|
+
recordingStarred: "Protegida da limpeza autom\xE1tica",
|
|
1236
|
+
recordingStart: "In\xEDcio",
|
|
1237
|
+
recordingState: "Estado",
|
|
1238
|
+
recordingSuccess: "Sucesso",
|
|
1239
|
+
recordingTimeline: "Linha do tempo de fala / sil\xEAncio",
|
|
1240
|
+
recordingTitle: "Grava\xE7\xF5es",
|
|
1241
|
+
recordingUnavailable: "Servi\xE7o de grava\xE7\xE3o indispon\xEDvel. Ative a grava\xE7\xE3o nas configura\xE7\xF5es da Voz ao Vivo com um runtime compat\xEDvel.",
|
|
1242
|
+
recordingUnstar: "Remover prote\xE7\xE3o",
|
|
1243
|
+
recordingUnstarHelp: "Permite a limpeza autom\xE1tica e inclui novamente esta grava\xE7\xE3o na contagem de reten\xE7\xE3o. A exclus\xE3o manual continua permitida. O armazenamento e a prote\xE7\xE3o contra remo\xE7\xE3o pelo navegador n\xE3o mudam.",
|
|
524
1244
|
refreshRate: "Frequ\xEAncia de atualiza\xE7\xE3o",
|
|
525
1245
|
resume: "Retomar atualiza\xE7\xF5es",
|
|
1246
|
+
runtimeActive: "Requisi\xE7\xF5es ativas",
|
|
1247
|
+
runtimeAudio: "Dura\xE7\xE3o do \xFAltimo \xE1udio",
|
|
1248
|
+
runtimeCache: "Arquivos do modelo em cache",
|
|
1249
|
+
runtimeCancelled: "Cancelado",
|
|
1250
|
+
runtimeCompleted: "Transcri\xE7\xF5es conclu\xEDdas",
|
|
1251
|
+
runtimeDevice: "Provedor de execu\xE7\xE3o solicitado",
|
|
1252
|
+
runtimeError: "C\xF3digo do erro",
|
|
1253
|
+
runtimeEvents: "Eventos do runtime (\xFAltimos 100)",
|
|
1254
|
+
runtimeFailed: "Transcri\xE7\xF5es com falha / canceladas",
|
|
1255
|
+
runtimeGpu: "Adaptador WebGPU dispon\xEDvel",
|
|
1256
|
+
runtimeHeap: "Estimativa do heap JavaScript da p\xE1gina",
|
|
1257
|
+
runtimeHelp: "O tamanho do modelo/cache \xE9 de arquivos, n\xE3o RAM. PCM conta apenas buffers de entrada ativos/na fila. O heap JavaScript, quando dispon\xEDvel, \xE9 uma estimativa n\xE3o padronizada da p\xE1gina e n\xE3o inclui toda a mem\xF3ria dos workers/WASM/GPU. N\xE3o \xE9 poss\xEDvel medir com confian\xE7a a RAM/VRAM do modelo aqui. Inicializar WebGPU n\xE3o prova que todos os operadores rodaram na GPU. Os eventos s\xE3o metadados do ciclo de vida do plugin, n\xE3o logs brutos do ONNX; n\xE3o guardam \xE1udio nem transcri\xE7\xF5es.",
|
|
1258
|
+
runtimeId: "Identidade do worker",
|
|
1259
|
+
runtimeInference: "\xDAltima infer\xEAncia no worker",
|
|
1260
|
+
runtimeLoad: "Carregamento ida e volta / worker",
|
|
1261
|
+
runtimeMemory: "Mem\xF3ria e armazenamento",
|
|
1262
|
+
runtimeModel: "Modelo",
|
|
1263
|
+
runtimeModelBytes: "Download completo do modelo",
|
|
1264
|
+
runtimeNo: "N\xE3o",
|
|
1265
|
+
runtimePcm: "PCM de entrada contabilizado",
|
|
1266
|
+
runtimePending: "Requisi\xE7\xF5es pendentes no worker",
|
|
1267
|
+
runtimeQuantization: "Precis\xE3o do encoder / decoder",
|
|
1268
|
+
runtimeQueue: "Transcri\xE7\xF5es na fila",
|
|
1269
|
+
runtimeRam: "RAM do modelo",
|
|
1270
|
+
runtimeRatio: "Rela\xE7\xE3o processamento / \xE1udio",
|
|
1271
|
+
runtimeReady: "Pronto",
|
|
1272
|
+
runtimeReleased: "Liberado",
|
|
1273
|
+
runtimeRevision: "Revis\xE3o fixada",
|
|
1274
|
+
runtimeStarted: "Iniciado",
|
|
1275
|
+
runtimeStatus: "Estado",
|
|
1276
|
+
runtimeStorage: "Armazenamento dispon\xEDvel nesta origem",
|
|
1277
|
+
runtimeSuccess: "Sucesso",
|
|
1278
|
+
runtimeTitle: "Runtimes",
|
|
1279
|
+
runtimeUnavailable: "Indispon\xEDvel",
|
|
1280
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1281
|
+
runtimeVram: "VRAM do modelo",
|
|
1282
|
+
runtimeWorker: "Worker ativo",
|
|
1283
|
+
runtimeYes: "Sim",
|
|
526
1284
|
states: "Estados atuais",
|
|
527
1285
|
title: "Depurador da Voz ao Vivo",
|
|
528
1286
|
transitions: "Transi\xE7\xF5es de estado recentes",
|
|
@@ -545,8 +1303,102 @@ var dictionaries = {
|
|
|
545
1303
|
help: "\xC1rbol de estados de solo lectura actualizado a 10 Hz. Texto oculto por defecto. Este panel no controla la voz.",
|
|
546
1304
|
omitted: "Elementos adicionales omitidos",
|
|
547
1305
|
popupBlocked: "El navegador bloque\xF3 la ventana del depurador. Permita ventanas emergentes en este sitio e int\xE9ntelo de nuevo.",
|
|
1306
|
+
recordingActive: "Grabando",
|
|
1307
|
+
recordingAllSources: "Todas las fuentes",
|
|
1308
|
+
recordingAttempts: "Historial de transcripci\xF3n",
|
|
1309
|
+
recordingAudio: "Reproducci\xF3n de la grabaci\xF3n",
|
|
1310
|
+
recordingAudioError: "No se pudo cargar o reproducir el audio.",
|
|
1311
|
+
recordingCancel: "Cancelar",
|
|
1312
|
+
recordingCaptured: "Audio capturado",
|
|
1313
|
+
recordingCompleted: "Completada",
|
|
1314
|
+
recordingConfirmDelete: "\xBFEliminar toda esta grabaci\xF3n, incluido el audio y el historial de transcripci\xF3n? No se puede deshacer. Eliminar una grabaci\xF3n activa tambi\xE9n descarta su audio guardado futuro.",
|
|
1315
|
+
recordingDate: "Inicio",
|
|
1316
|
+
recordingDelete: "Eliminar sesi\xF3n completa",
|
|
1317
|
+
recordingDeleteError: "No se pudo eliminar la grabaci\xF3n.",
|
|
1318
|
+
recordingDuration: "Duraci\xF3n",
|
|
1319
|
+
recordingEmpty: "Ninguna grabaci\xF3n coincide con el filtro.",
|
|
1320
|
+
recordingEnd: "Fin",
|
|
1321
|
+
recordingEngine: "Motor",
|
|
1322
|
+
recordingError: "Error",
|
|
1323
|
+
recordingExport: "Exportar JSON completo",
|
|
1324
|
+
recordingExportError: "No se pudo exportar la grabaci\xF3n.",
|
|
1325
|
+
recordingFailed: "Fallida",
|
|
1326
|
+
recordingHelp: "Inspeccione audio guardado, l\xEDmites de voz/silencio e intentos de transcripci\xF3n. Audio y texto pueden ser sensibles. La reproducci\xF3n es local; la exportaci\xF3n incluye audio y texto. Inspeccionar no cambia la captura; solo la eliminaci\xF3n expl\xEDcita borra grabaciones.",
|
|
1327
|
+
recordingInterrupted: "Interrumpida",
|
|
1328
|
+
recordingLoadError: "No se pudieron cargar las grabaciones. Intente actualizar.",
|
|
1329
|
+
recordingLoading: "Cargando grabaciones\u2026",
|
|
1330
|
+
recordingMemory: "Solo en memoria",
|
|
1331
|
+
recordingMicrophone: "Micr\xF3fono",
|
|
1332
|
+
recordingNoAttempts: "Todav\xEDa no hay intentos de transcripci\xF3n.",
|
|
1333
|
+
recordingOpen: "Segmento abierto",
|
|
1334
|
+
recordingPending: "Pendiente",
|
|
1335
|
+
recordingPersistent: "Guardada localmente",
|
|
1336
|
+
recordingPinConfirmed: "Confirmado en",
|
|
1337
|
+
recordingPinDelay: "Demora de confirmaci\xF3n",
|
|
1338
|
+
recordingPins: "Marcadores de l\xEDmite",
|
|
1339
|
+
recordingPlay: "Reproducir segmento",
|
|
1340
|
+
recordingPlaySession: "Reproducir sesi\xF3n guardada",
|
|
1341
|
+
recordingRefresh: "Actualizar grabaciones",
|
|
1342
|
+
recordingSaved: "Audio guardado",
|
|
1343
|
+
recordingSegments: "Segmentos",
|
|
1344
|
+
recordingSelectSession: "Seleccione una sesi\xF3n de grabaci\xF3n.",
|
|
1345
|
+
recordingShared: "Audio compartido",
|
|
1346
|
+
recordingSilence: "Silencio",
|
|
1347
|
+
recordingSource: "Fuente",
|
|
1348
|
+
recordingSourceFilter: "Filtrar fuentes",
|
|
1349
|
+
recordingSpeech: "Voz",
|
|
1350
|
+
recordingStar: "Conservar indefinidamente",
|
|
1351
|
+
recordingStarError: "No se pudo cambiar la protecci\xF3n de la grabaci\xF3n.",
|
|
1352
|
+
recordingStarHelp: "Excluye esta grabaci\xF3n de la limpieza autom\xE1tica y del recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. No cambia el almacenamiento ni la protecci\xF3n contra eliminaci\xF3n del navegador.",
|
|
1353
|
+
recordingStarred: "Protegida de la limpieza autom\xE1tica",
|
|
1354
|
+
recordingStart: "Inicio",
|
|
1355
|
+
recordingState: "Estado",
|
|
1356
|
+
recordingSuccess: "\xC9xito",
|
|
1357
|
+
recordingTimeline: "Cronolog\xEDa de voz / silencio",
|
|
1358
|
+
recordingTitle: "Grabaciones",
|
|
1359
|
+
recordingUnavailable: "Servicio de grabaci\xF3n no disponible. Active la grabaci\xF3n en los ajustes de Voz en vivo con un runtime compatible.",
|
|
1360
|
+
recordingUnstar: "Quitar protecci\xF3n",
|
|
1361
|
+
recordingUnstarHelp: "Permite la limpieza autom\xE1tica e incluye de nuevo esta grabaci\xF3n en el recuento de retenci\xF3n. La eliminaci\xF3n manual sigue permitida. El almacenamiento y la protecci\xF3n contra eliminaci\xF3n del navegador no cambian.",
|
|
548
1362
|
refreshRate: "Frecuencia de actualizaci\xF3n",
|
|
549
1363
|
resume: "Reanudar actualizaciones",
|
|
1364
|
+
runtimeActive: "Solicitudes activas",
|
|
1365
|
+
runtimeAudio: "Duraci\xF3n del \xFAltimo audio",
|
|
1366
|
+
runtimeCache: "Archivos del modelo en cach\xE9",
|
|
1367
|
+
runtimeCancelled: "Cancelado",
|
|
1368
|
+
runtimeCompleted: "Transcripciones completadas",
|
|
1369
|
+
runtimeDevice: "Proveedor de ejecuci\xF3n solicitado",
|
|
1370
|
+
runtimeError: "C\xF3digo de error",
|
|
1371
|
+
runtimeEvents: "Eventos del runtime (\xFAltimos 100)",
|
|
1372
|
+
runtimeFailed: "Transcripciones fallidas / canceladas",
|
|
1373
|
+
runtimeGpu: "Adaptador WebGPU disponible",
|
|
1374
|
+
runtimeHeap: "Estimaci\xF3n del heap JavaScript de la p\xE1gina",
|
|
1375
|
+
runtimeHelp: "El tama\xF1o del modelo/cach\xE9 corresponde a archivos, no a RAM. PCM cuenta solo los b\xFAferes de entrada activos/en cola. El heap JavaScript es una estimaci\xF3n no est\xE1ndar de toda la p\xE1gina y no incluye toda la memoria de workers/WASM/GPU. La RAM/VRAM del modelo no se puede medir de forma fiable aqu\xED. Inicializar WebGPU no prueba que todos los operadores usen la GPU. Los eventos son metadatos del plugin, no logs brutos de ONNX; no guardan audio ni transcripciones.",
|
|
1376
|
+
runtimeId: "Identidad del worker",
|
|
1377
|
+
runtimeInference: "\xDAltima inferencia en el worker",
|
|
1378
|
+
runtimeLoad: "Carga ida y vuelta / worker",
|
|
1379
|
+
runtimeMemory: "Memoria y almacenamiento",
|
|
1380
|
+
runtimeModel: "Modelo",
|
|
1381
|
+
runtimeModelBytes: "Descarga completa del modelo",
|
|
1382
|
+
runtimeNo: "No",
|
|
1383
|
+
runtimePcm: "PCM de entrada contabilizado",
|
|
1384
|
+
runtimePending: "Solicitudes pendientes del worker",
|
|
1385
|
+
runtimeQuantization: "Precisi\xF3n del encoder / decoder",
|
|
1386
|
+
runtimeQueue: "Transcripciones en cola",
|
|
1387
|
+
runtimeRam: "RAM del modelo",
|
|
1388
|
+
runtimeRatio: "Relaci\xF3n procesamiento / audio",
|
|
1389
|
+
runtimeReady: "Listo",
|
|
1390
|
+
runtimeReleased: "Liberado",
|
|
1391
|
+
runtimeRevision: "Revisi\xF3n fijada",
|
|
1392
|
+
runtimeStarted: "Iniciado",
|
|
1393
|
+
runtimeStatus: "Estado",
|
|
1394
|
+
runtimeStorage: "Almacenamiento disponible de este origen",
|
|
1395
|
+
runtimeSuccess: "\xC9xito",
|
|
1396
|
+
runtimeTitle: "Runtimes",
|
|
1397
|
+
runtimeUnavailable: "No disponible",
|
|
1398
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1399
|
+
runtimeVram: "VRAM del modelo",
|
|
1400
|
+
runtimeWorker: "Worker activo",
|
|
1401
|
+
runtimeYes: "S\xED",
|
|
550
1402
|
states: "Estados actuales",
|
|
551
1403
|
title: "Depurador de Voz en vivo",
|
|
552
1404
|
transitions: "Transiciones de estado recientes",
|
|
@@ -569,8 +1421,102 @@ var dictionaries = {
|
|
|
569
1421
|
help: "Arbre des \xE9tats en lecture seule actualis\xE9 \xE0 10 Hz. Texte masqu\xE9 par d\xE9faut. Ce panneau ne contr\xF4le pas la voix.",
|
|
570
1422
|
omitted: "\xC9l\xE9ments suppl\xE9mentaires masqu\xE9s",
|
|
571
1423
|
popupBlocked: "Le navigateur a bloqu\xE9 la fen\xEAtre du d\xE9bogueur. Autorisez les fen\xEAtres contextuelles pour ce site et r\xE9essayez.",
|
|
1424
|
+
recordingActive: "Enregistrement",
|
|
1425
|
+
recordingAllSources: "Toutes les sources",
|
|
1426
|
+
recordingAttempts: "Historique des transcriptions",
|
|
1427
|
+
recordingAudio: "Lecture de l\u2019enregistrement",
|
|
1428
|
+
recordingAudioError: "Impossible de charger ou lire l\u2019audio.",
|
|
1429
|
+
recordingCancel: "Annuler",
|
|
1430
|
+
recordingCaptured: "Audio captur\xE9",
|
|
1431
|
+
recordingCompleted: "Termin\xE9",
|
|
1432
|
+
recordingConfirmDelete: "Supprimer cet enregistrement entier, y compris son audio et son historique de transcription ? Cette action est irr\xE9versible. Supprimer un enregistrement actif supprime aussi son futur audio enregistr\xE9.",
|
|
1433
|
+
recordingDate: "D\xE9but",
|
|
1434
|
+
recordingDelete: "Supprimer toute la session",
|
|
1435
|
+
recordingDeleteError: "Impossible de supprimer l\u2019enregistrement.",
|
|
1436
|
+
recordingDuration: "Dur\xE9e",
|
|
1437
|
+
recordingEmpty: "Aucun enregistrement ne correspond au filtre.",
|
|
1438
|
+
recordingEnd: "Fin",
|
|
1439
|
+
recordingEngine: "Moteur",
|
|
1440
|
+
recordingError: "Erreur",
|
|
1441
|
+
recordingExport: "Exporter le JSON autonome",
|
|
1442
|
+
recordingExportError: "Impossible d\u2019exporter l\u2019enregistrement.",
|
|
1443
|
+
recordingFailed: "\xC9chec",
|
|
1444
|
+
recordingHelp: "Inspectez l\u2019audio sauvegard\xE9, les limites parole/silence et les tentatives de transcription. Audio et texte peuvent \xEAtre sensibles. Lecture locale ; l\u2019export contient l\u2019audio et le texte. L\u2019inspection ne change pas la capture ; seule une suppression explicite efface les enregistrements.",
|
|
1445
|
+
recordingInterrupted: "Interrompu",
|
|
1446
|
+
recordingLoadError: "Impossible de charger les enregistrements. Actualisez la liste.",
|
|
1447
|
+
recordingLoading: "Chargement des enregistrements\u2026",
|
|
1448
|
+
recordingMemory: "En m\xE9moire uniquement",
|
|
1449
|
+
recordingMicrophone: "Microphone",
|
|
1450
|
+
recordingNoAttempts: "Aucune tentative de transcription.",
|
|
1451
|
+
recordingOpen: "Segment ouvert",
|
|
1452
|
+
recordingPending: "En attente",
|
|
1453
|
+
recordingPersistent: "Sauvegard\xE9 localement",
|
|
1454
|
+
recordingPinConfirmed: "Confirm\xE9 \xE0",
|
|
1455
|
+
recordingPinDelay: "D\xE9lai de confirmation",
|
|
1456
|
+
recordingPins: "Marqueurs de limite",
|
|
1457
|
+
recordingPlay: "Lire le segment",
|
|
1458
|
+
recordingPlaySession: "Lire la session sauvegard\xE9e",
|
|
1459
|
+
recordingRefresh: "Actualiser les enregistrements",
|
|
1460
|
+
recordingSaved: "Audio sauvegard\xE9",
|
|
1461
|
+
recordingSegments: "Segments",
|
|
1462
|
+
recordingSelectSession: "S\xE9lectionnez une session d\u2019enregistrement.",
|
|
1463
|
+
recordingShared: "Audio partag\xE9",
|
|
1464
|
+
recordingSilence: "Silence",
|
|
1465
|
+
recordingSource: "Source",
|
|
1466
|
+
recordingSourceFilter: "Filtrer les sources",
|
|
1467
|
+
recordingSpeech: "Parole",
|
|
1468
|
+
recordingStar: "Conserver ind\xE9finiment",
|
|
1469
|
+
recordingStarError: "Impossible de modifier la protection de l\u2019enregistrement.",
|
|
1470
|
+
recordingStarHelp: "Exclut cet enregistrement du nettoyage automatique et du nombre d\u2019enregistrements \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
|
|
1471
|
+
recordingStarred: "Prot\xE9g\xE9 du nettoyage automatique",
|
|
1472
|
+
recordingStart: "D\xE9but",
|
|
1473
|
+
recordingState: "\xC9tat",
|
|
1474
|
+
recordingSuccess: "R\xE9ussite",
|
|
1475
|
+
recordingTimeline: "Chronologie parole / silence",
|
|
1476
|
+
recordingTitle: "Enregistrements",
|
|
1477
|
+
recordingUnavailable: "Service d\u2019enregistrement indisponible. Activez l\u2019enregistrement dans les param\xE8tres de Voix en direct avec un runtime compatible.",
|
|
1478
|
+
recordingUnstar: "Retirer la protection",
|
|
1479
|
+
recordingUnstarHelp: "Autorise le nettoyage automatique et compte \xE0 nouveau cet enregistrement parmi ceux \xE0 conserver. La suppression manuelle reste autoris\xE9e. Le stockage et la protection contre l\u2019\xE9viction par le navigateur ne changent pas.",
|
|
572
1480
|
refreshRate: "Fr\xE9quence de mise \xE0 jour",
|
|
573
1481
|
resume: "Reprendre les mises \xE0 jour",
|
|
1482
|
+
runtimeActive: "Requ\xEAtes actives",
|
|
1483
|
+
runtimeAudio: "Dur\xE9e du dernier audio",
|
|
1484
|
+
runtimeCache: "Fichiers du mod\xE8le en cache",
|
|
1485
|
+
runtimeCancelled: "Annul\xE9",
|
|
1486
|
+
runtimeCompleted: "Transcriptions termin\xE9es",
|
|
1487
|
+
runtimeDevice: "Fournisseur d\u2019ex\xE9cution demand\xE9",
|
|
1488
|
+
runtimeError: "Code d\u2019erreur",
|
|
1489
|
+
runtimeEvents: "\xC9v\xE9nements du runtime (100 derniers)",
|
|
1490
|
+
runtimeFailed: "Transcriptions \xE9chou\xE9es / annul\xE9es",
|
|
1491
|
+
runtimeGpu: "Adaptateur WebGPU disponible",
|
|
1492
|
+
runtimeHeap: "Estimation du tas JavaScript de la page",
|
|
1493
|
+
runtimeHelp: "La taille du mod\xE8le/cache mesure les fichiers, pas la RAM. PCM compte seulement les buffers d\u2019entr\xE9e actifs/en attente. Le tas JavaScript est une estimation non standard de la page et exclut une partie de la m\xE9moire workers/WASM/GPU. La RAM/VRAM du mod\xE8le ne peut pas \xEAtre mesur\xE9e fiablement ici. Initialiser WebGPU ne prouve pas que tous les op\xE9rateurs utilisent le GPU. Les \xE9v\xE9nements sont des m\xE9tadonn\xE9es du plugin, pas des logs ONNX bruts ; aucun audio ni transcription conserv\xE9s.",
|
|
1494
|
+
runtimeId: "Identit\xE9 du worker",
|
|
1495
|
+
runtimeInference: "Derni\xE8re inf\xE9rence du worker",
|
|
1496
|
+
runtimeLoad: "Chargement aller-retour / worker",
|
|
1497
|
+
runtimeMemory: "M\xE9moire et stockage",
|
|
1498
|
+
runtimeModel: "Mod\xE8le",
|
|
1499
|
+
runtimeModelBytes: "T\xE9l\xE9chargement complet du mod\xE8le",
|
|
1500
|
+
runtimeNo: "Non",
|
|
1501
|
+
runtimePcm: "PCM d\u2019entr\xE9e comptabilis\xE9",
|
|
1502
|
+
runtimePending: "Requ\xEAtes du worker en attente",
|
|
1503
|
+
runtimeQuantization: "Pr\xE9cision encoder / decoder",
|
|
1504
|
+
runtimeQueue: "Transcriptions en attente",
|
|
1505
|
+
runtimeRam: "RAM du mod\xE8le",
|
|
1506
|
+
runtimeRatio: "Rapport traitement / audio",
|
|
1507
|
+
runtimeReady: "Pr\xEAt",
|
|
1508
|
+
runtimeReleased: "Lib\xE9r\xE9",
|
|
1509
|
+
runtimeRevision: "R\xE9vision fix\xE9e",
|
|
1510
|
+
runtimeStarted: "D\xE9marr\xE9",
|
|
1511
|
+
runtimeStatus: "\xC9tat",
|
|
1512
|
+
runtimeStorage: "Stockage disponible pour cette origine",
|
|
1513
|
+
runtimeSuccess: "Succ\xE8s",
|
|
1514
|
+
runtimeTitle: "Runtimes",
|
|
1515
|
+
runtimeUnavailable: "Indisponible",
|
|
1516
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1517
|
+
runtimeVram: "VRAM du mod\xE8le",
|
|
1518
|
+
runtimeWorker: "Worker actif",
|
|
1519
|
+
runtimeYes: "Oui",
|
|
574
1520
|
states: "\xC9tats actuels",
|
|
575
1521
|
title: "D\xE9bogueur Voix en direct",
|
|
576
1522
|
transitions: "Transitions r\xE9centes des \xE9tats",
|
|
@@ -593,8 +1539,102 @@ var dictionaries = {
|
|
|
593
1539
|
help: "\u0915\u0947\u0935\u0932 \u092A\u0922\u093C\u0928\u0947 \u0935\u093E\u0932\u093E \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u0940 10 Hz \u092A\u0930 \u0905\u092A\u0921\u0947\u091F \u0939\u094B\u0924\u093E \u0939\u0948\u0964 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0921\u093F\u092B\u093C\u0949\u0932\u094D\u091F \u0930\u0942\u092A \u0938\u0947 \u091B\u093F\u092A\u093E \u0939\u0948\u0964 \u092F\u0939 \u092A\u0948\u0928\u0932 \u0935\u0949\u0907\u0938 \u0915\u094B \u0928\u093F\u092F\u0902\u0924\u094D\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0915\u0930\u0924\u093E\u0964",
|
|
594
1540
|
omitted: "\u0905\u0924\u093F\u0930\u093F\u0915\u094D\u0924 \u0906\u0907\u091F\u092E \u091B\u093F\u092A\u093E\u090F \u0917\u090F",
|
|
595
1541
|
popupBlocked: "\u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0928\u0947 \u0921\u0940\u092C\u0917\u0930 \u0935\u093F\u0902\u0921\u094B \u092C\u094D\u0932\u0949\u0915 \u0915\u0930 \u0926\u0940\u0964 \u0907\u0938 \u0938\u093E\u0907\u091F \u0915\u0947 \u0932\u093F\u090F \u092A\u0949\u092A-\u0905\u092A \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
|
|
1542
|
+
recordingActive: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091C\u093E\u0930\u0940",
|
|
1543
|
+
recordingAllSources: "\u0938\u092D\u0940 \u0938\u094D\u0930\u094B\u0924",
|
|
1544
|
+
recordingAttempts: "\u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938",
|
|
1545
|
+
recordingAudio: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u092A\u094D\u0932\u0947\u092C\u0948\u0915",
|
|
1546
|
+
recordingAudioError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0911\u0921\u093F\u092F\u094B \u0932\u094B\u0921 \u092F\u093E \u091A\u0932\u093E\u092F\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
|
|
1547
|
+
recordingCancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
|
|
1548
|
+
recordingCaptured: "\u0915\u0948\u092A\u094D\u091A\u0930 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0911\u0921\u093F\u092F\u094B",
|
|
1549
|
+
recordingCompleted: "\u092A\u0942\u0930\u094D\u0923",
|
|
1550
|
+
recordingConfirmDelete: "\u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0907\u0924\u093F\u0939\u093E\u0938 \u0938\u0939\u093F\u0924 \u092F\u0939 \u092A\u0942\u0930\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901? \u0907\u0938\u0947 \u0935\u093E\u092A\u0938 \u0928\u0939\u0940\u0902 \u0932\u093E\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E\u0964 \u0938\u0915\u094D\u0930\u093F\u092F \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0928\u0947 \u092A\u0930 \u0906\u0917\u0947 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u093E \u0911\u0921\u093F\u092F\u094B \u092D\u0940 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
|
|
1551
|
+
recordingDate: "\u0936\u0941\u0930\u0941\u0906\u0924",
|
|
1552
|
+
recordingDelete: "\u092A\u0942\u0930\u0940 \u0938\u0924\u094D\u0930 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u090F\u0901",
|
|
1553
|
+
recordingDeleteError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0908 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
|
|
1554
|
+
recordingDuration: "\u0905\u0935\u0927\u093F",
|
|
1555
|
+
recordingEmpty: "\u0907\u0938 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0938\u0947 \u092E\u0947\u0932 \u0916\u093E\u0924\u0940 \u0915\u094B\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
|
|
1556
|
+
recordingEnd: "\u0905\u0902\u0924",
|
|
1557
|
+
recordingEngine: "\u0907\u0902\u091C\u0928",
|
|
1558
|
+
recordingError: "\u0924\u094D\u0930\u0941\u091F\u093F",
|
|
1559
|
+
recordingExport: "\u0938\u094D\u0935\u092F\u0902\u092A\u0942\u0930\u094D\u0923 JSON \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0915\u0930\u0947\u0902",
|
|
1560
|
+
recordingExportError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091C\u093E \u0938\u0915\u0940\u0964",
|
|
1561
|
+
recordingFailed: "\u0935\u093F\u092B\u0932",
|
|
1562
|
+
recordingHelp: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B, \u0906\u0935\u093E\u091C\u093C/\u092E\u094C\u0928 \u0938\u0940\u092E\u093E\u090F\u0901 \u0914\u0930 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0926\u0947\u0916\u0947\u0902\u0964 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0938\u0902\u0935\u0947\u0926\u0928\u0936\u0940\u0932 \u0939\u094B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u092A\u094D\u0932\u0947\u092C\u0948\u0915 \u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0939\u0948; \u0928\u093F\u0930\u094D\u092F\u093E\u0924 \u092E\u0947\u0902 \u0911\u0921\u093F\u092F\u094B \u0914\u0930 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0936\u093E\u092E\u093F\u0932 \u0939\u0948\u0902\u0964 \u0928\u093F\u0930\u0940\u0915\u094D\u0937\u0923 \u0915\u0948\u092A\u094D\u091A\u0930 \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u093E; \u0915\u0947\u0935\u0932 \u0938\u094D\u092A\u0937\u094D\u091F \u0939\u091F\u093E\u0928\u0947 \u0915\u0940 \u0915\u093E\u0930\u094D\u0930\u0935\u093E\u0908 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0939\u091F\u093E\u0924\u0940 \u0939\u0948\u0964",
|
|
1563
|
+
recordingInterrupted: "\u092C\u093E\u0927\u093F\u0924",
|
|
1564
|
+
recordingLoadError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u0932\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0947\u0964 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902\u0964",
|
|
1565
|
+
recordingLoading: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0932\u094B\u0921 \u0939\u094B \u0930\u0939\u0940 \u0939\u0948\u0902\u2026",
|
|
1566
|
+
recordingMemory: "\u0915\u0947\u0935\u0932 \u092E\u0947\u092E\u094B\u0930\u0940 \u092E\u0947\u0902",
|
|
1567
|
+
recordingMicrophone: "\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928",
|
|
1568
|
+
recordingNoAttempts: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u092A\u094D\u0930\u092F\u093E\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
|
|
1569
|
+
recordingOpen: "\u0916\u0941\u0932\u093E \u0916\u0902\u0921",
|
|
1570
|
+
recordingPending: "\u0932\u0902\u092C\u093F\u0924",
|
|
1571
|
+
recordingPersistent: "\u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0930\u0942\u092A \u0938\u0947 \u0938\u0939\u0947\u091C\u093E",
|
|
1572
|
+
recordingPinConfirmed: "\u092A\u0941\u0937\u094D\u091F\u093F \u0938\u092E\u092F",
|
|
1573
|
+
recordingPinDelay: "\u092A\u0941\u0937\u094D\u091F\u093F \u092E\u0947\u0902 \u0935\u093F\u0932\u0902\u092C",
|
|
1574
|
+
recordingPins: "\u0938\u0940\u092E\u093E \u091A\u093F\u0939\u094D\u0928",
|
|
1575
|
+
recordingPlay: "\u0916\u0902\u0921 \u091A\u0932\u093E\u090F\u0901",
|
|
1576
|
+
recordingPlaySession: "\u0938\u0939\u0947\u091C\u093E \u0938\u0924\u094D\u0930 \u091A\u0932\u093E\u090F\u0901",
|
|
1577
|
+
recordingRefresh: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0930\u0940\u092B\u093C\u094D\u0930\u0947\u0936 \u0915\u0930\u0947\u0902",
|
|
1578
|
+
recordingSaved: "\u0938\u0939\u0947\u091C\u093E \u0911\u0921\u093F\u092F\u094B",
|
|
1579
|
+
recordingSegments: "\u0916\u0902\u0921",
|
|
1580
|
+
recordingSelectSession: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0924\u094D\u0930 \u091A\u0941\u0928\u0947\u0902\u0964",
|
|
1581
|
+
recordingShared: "\u0938\u093E\u091D\u093E \u0911\u0921\u093F\u092F\u094B",
|
|
1582
|
+
recordingSilence: "\u092E\u094C\u0928",
|
|
1583
|
+
recordingSource: "\u0938\u094D\u0930\u094B\u0924",
|
|
1584
|
+
recordingSourceFilter: "\u0938\u094D\u0930\u094B\u0924 \u092B\u093C\u093F\u0932\u094D\u091F\u0930 \u0915\u0930\u0947\u0902",
|
|
1585
|
+
recordingSpeech: "\u0906\u0935\u093E\u091C\u093C",
|
|
1586
|
+
recordingStar: "\u0905\u0928\u093F\u0936\u094D\u091A\u093F\u0924 \u0915\u093E\u0932 \u0924\u0915 \u0930\u0916\u0947\u0902",
|
|
1587
|
+
recordingStarError: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092C\u0926\u0932\u0940 \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u0940\u0964",
|
|
1588
|
+
recordingStarHelp: "\u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0914\u0930 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u0938\u0947 \u092C\u093E\u0939\u0930 \u0930\u0916\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u0907\u0938\u0938\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u0947 \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u092F\u093E \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u092E\u0947\u0902 \u092C\u0926\u0932\u093E\u0935 \u0928\u0939\u0940\u0902 \u0939\u094B\u0924\u093E\u0964",
|
|
1589
|
+
recordingStarred: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924",
|
|
1590
|
+
recordingStart: "\u0936\u0941\u0930\u0941\u0906\u0924",
|
|
1591
|
+
recordingState: "\u0938\u094D\u0925\u093F\u0924\u093F",
|
|
1592
|
+
recordingSuccess: "\u0938\u092B\u0932",
|
|
1593
|
+
recordingTimeline: "\u0906\u0935\u093E\u091C\u093C / \u092E\u094C\u0928 \u0938\u092E\u092F\u0930\u0947\u0916\u093E",
|
|
1594
|
+
recordingTitle: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917",
|
|
1595
|
+
recordingUnavailable: "\u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0938\u0947\u0935\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0902\u0917\u0924 \u0930\u0928\u091F\u093E\u0907\u092E \u0915\u0947 \u0938\u093E\u0925 \u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u091A\u093E\u0932\u0942 \u0915\u0930\u0947\u0902\u0964",
|
|
1596
|
+
recordingUnstar: "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0939\u091F\u093E\u090F\u0901",
|
|
1597
|
+
recordingUnstarHelp: "\u0938\u094D\u0935\u091A\u093E\u0932\u093F\u0924 \u0938\u092B\u093C\u093E\u0908 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u0907\u0938 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u094B \u092B\u093F\u0930 \u0938\u0947 \u0930\u0916\u0940 \u091C\u093E\u0928\u0947 \u0935\u093E\u0932\u0940 \u0930\u093F\u0915\u0949\u0930\u094D\u0921\u093F\u0902\u0917 \u0915\u0940 \u0917\u093F\u0928\u0924\u0940 \u092E\u0947\u0902 \u0936\u093E\u092E\u093F\u0932 \u0915\u0930\u0947\u0902\u0964 \u092E\u0948\u0928\u094D\u092F\u0941\u0905\u0932 \u0930\u0942\u092A \u0938\u0947 \u0939\u091F\u093E\u0928\u093E \u0905\u092C \u092D\u0940 \u0938\u0902\u092D\u0935 \u0939\u0948\u0964 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u093E \u0938\u094D\u091F\u094B\u0930\u0947\u091C \u0914\u0930 \u0928\u093F\u0937\u094D\u0915\u093E\u0938\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0928\u0939\u0940\u0902 \u092C\u0926\u0932\u0924\u0947\u0964",
|
|
596
1598
|
refreshRate: "\u0905\u092A\u0921\u0947\u091F \u0906\u0935\u0943\u0924\u094D\u0924\u093F",
|
|
597
1599
|
resume: "\u0905\u092A\u0921\u0947\u091F \u092B\u093F\u0930 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
|
|
1600
|
+
runtimeActive: "\u0938\u0915\u094D\u0930\u093F\u092F \u0905\u0928\u0941\u0930\u094B\u0927",
|
|
1601
|
+
runtimeAudio: "\u092A\u093F\u091B\u0932\u0947 \u0911\u0921\u093F\u092F\u094B \u0915\u0940 \u0905\u0935\u0927\u093F",
|
|
1602
|
+
runtimeCache: "\u0915\u0948\u0936 \u0915\u0940 \u0917\u0908 \u092E\u0949\u0921\u0932 \u092B\u093C\u093E\u0907\u0932\u0947\u0902",
|
|
1603
|
+
runtimeCancelled: "\u0930\u0926\u094D\u0926",
|
|
1604
|
+
runtimeCompleted: "\u092A\u0942\u0930\u0940 \u0939\u0941\u0908 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
|
|
1605
|
+
runtimeDevice: "\u0905\u0928\u0941\u0930\u094B\u0927\u093F\u0924 \u0928\u093F\u0937\u094D\u092A\u093E\u0926\u0928 \u092A\u094D\u0930\u0926\u093E\u0924\u093E",
|
|
1606
|
+
runtimeError: "\u0924\u094D\u0930\u0941\u091F\u093F \u0915\u094B\u0921",
|
|
1607
|
+
runtimeEvents: "\u0930\u0928\u091F\u093E\u0907\u092E \u0918\u091F\u0928\u093E\u090F\u0901 (\u092A\u093F\u091B\u0932\u0940 100)",
|
|
1608
|
+
runtimeFailed: "\u0935\u093F\u092B\u0932 / \u0930\u0926\u094D\u0926 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
|
|
1609
|
+
runtimeGpu: "WebGPU \u090F\u0921\u093E\u092A\u094D\u091F\u0930 \u0909\u092A\u0932\u092C\u094D\u0927",
|
|
1610
|
+
runtimeHeap: "\u092A\u0947\u091C JavaScript \u0939\u0940\u092A \u0915\u093E \u0905\u0928\u0941\u092E\u093E\u0928",
|
|
1611
|
+
runtimeHelp: "\u092E\u0949\u0921\u0932/\u0915\u0948\u0936 \u0915\u093E \u0906\u0915\u093E\u0930 \u092B\u093C\u093E\u0907\u0932\u094B\u0902 \u0915\u093E \u0939\u0948, RAM \u0915\u093E \u0928\u0939\u0940\u0902\u0964 PCM \u0915\u0947\u0935\u0932 \u0938\u0915\u094D\u0930\u093F\u092F/\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u0907\u0928\u092A\u0941\u091F \u092C\u092B\u093C\u0930 \u0917\u093F\u0928\u0924\u093E \u0939\u0948\u0964 JavaScript \u0939\u0940\u092A \u092A\u0942\u0930\u0947 \u092A\u0947\u091C \u0915\u093E \u0917\u0948\u0930-\u092E\u093E\u0928\u0915 \u0905\u0928\u0941\u092E\u093E\u0928 \u0939\u0948 \u0914\u0930 \u092A\u0942\u0930\u0940 worker/WASM/GPU \u092E\u0947\u092E\u094B\u0930\u0940 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0924\u093E\u0964 \u092E\u0949\u0921\u0932 RAM/VRAM \u092F\u0939\u093E\u0901 \u092D\u0930\u094B\u0938\u0947\u092E\u0902\u0926 \u0924\u0930\u0940\u0915\u0947 \u0938\u0947 \u0928\u0939\u0940\u0902 \u092E\u093E\u092A\u0940 \u091C\u093E \u0938\u0915\u0924\u0940\u0964 WebGPU \u0936\u0941\u0930\u0942 \u0939\u094B\u0928\u0947 \u0915\u093E \u092E\u0924\u0932\u092C \u0938\u092D\u0940 \u0911\u092A\u0930\u0947\u091F\u0930 GPU \u092A\u0930 \u091A\u0932\u0947, \u092F\u0939 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0918\u091F\u0928\u093E\u090F\u0901 \u092A\u094D\u0932\u0917\u0907\u0928 \u091C\u0940\u0935\u0928\u091A\u0915\u094D\u0930 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0939\u0948\u0902, \u0915\u091A\u094D\u091A\u0947 ONNX \u0932\u0949\u0917 \u0928\u0939\u0940\u0902; \u0911\u0921\u093F\u092F\u094B \u092F\u093E \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0928\u0939\u0940\u0902 \u0930\u0916\u0924\u0947\u0964",
|
|
1612
|
+
runtimeId: "\u0935\u0930\u094D\u0915\u0930 \u092A\u0939\u091A\u093E\u0928",
|
|
1613
|
+
runtimeInference: "\u0935\u0930\u094D\u0915\u0930 \u0915\u093E \u092A\u093F\u091B\u0932\u093E \u0907\u0928\u094D\u092B\u093C\u0930\u0947\u0902\u0938",
|
|
1614
|
+
runtimeLoad: "\u0932\u094B\u0921 \u0930\u093E\u0909\u0902\u0921 \u091F\u094D\u0930\u093F\u092A / \u0935\u0930\u094D\u0915\u0930",
|
|
1615
|
+
runtimeMemory: "\u092E\u0947\u092E\u094B\u0930\u0940 \u0914\u0930 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
|
|
1616
|
+
runtimeModel: "\u092E\u0949\u0921\u0932",
|
|
1617
|
+
runtimeModelBytes: "\u092A\u0942\u0930\u093E \u092E\u0949\u0921\u0932 \u0921\u093E\u0909\u0928\u0932\u094B\u0921",
|
|
1618
|
+
runtimeNo: "\u0928\u0939\u0940\u0902",
|
|
1619
|
+
runtimePcm: "\u0917\u093F\u0928\u093E \u0917\u092F\u093E \u0907\u0928\u092A\u0941\u091F PCM",
|
|
1620
|
+
runtimePending: "\u0932\u0902\u092C\u093F\u0924 \u0935\u0930\u094D\u0915\u0930 \u0905\u0928\u0941\u0930\u094B\u0927",
|
|
1621
|
+
runtimeQuantization: "\u090F\u0928\u0915\u094B\u0921\u0930 / \u0921\u093F\u0915\u094B\u0921\u0930 \u092A\u0930\u093F\u0936\u0941\u0926\u094D\u0927\u0924\u093E",
|
|
1622
|
+
runtimeQueue: "\u0915\u0924\u093E\u0930\u092C\u0926\u094D\u0927 \u091F\u094D\u0930\u093E\u0902\u0938\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928",
|
|
1623
|
+
runtimeRam: "\u092E\u0949\u0921\u0932 RAM",
|
|
1624
|
+
runtimeRatio: "\u092A\u094D\u0930\u0938\u0902\u0938\u094D\u0915\u0930\u0923 / \u0911\u0921\u093F\u092F\u094B \u0905\u0928\u0941\u092A\u093E\u0924",
|
|
1625
|
+
runtimeReady: "\u0924\u0948\u092F\u093E\u0930",
|
|
1626
|
+
runtimeReleased: "\u092E\u0941\u0915\u094D\u0924",
|
|
1627
|
+
runtimeRevision: "\u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u0930\u093F\u0935\u093F\u091C\u093C\u0928",
|
|
1628
|
+
runtimeStarted: "\u0936\u0941\u0930\u0942",
|
|
1629
|
+
runtimeStatus: "\u0938\u094D\u0925\u093F\u0924\u093F",
|
|
1630
|
+
runtimeStorage: "\u0907\u0938 \u0913\u0930\u093F\u091C\u093F\u0928 \u0915\u093E \u0909\u092A\u0932\u092C\u094D\u0927 \u0938\u094D\u091F\u094B\u0930\u0947\u091C",
|
|
1631
|
+
runtimeSuccess: "\u0938\u092B\u0932",
|
|
1632
|
+
runtimeTitle: "\u0930\u0928\u091F\u093E\u0907\u092E",
|
|
1633
|
+
runtimeUnavailable: "\u0905\u0928\u0941\u092A\u0932\u092C\u094D\u0927",
|
|
1634
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1635
|
+
runtimeVram: "\u092E\u0949\u0921\u0932 VRAM",
|
|
1636
|
+
runtimeWorker: "\u0935\u0930\u094D\u0915\u0930 \u0938\u0915\u094D\u0930\u093F\u092F",
|
|
1637
|
+
runtimeYes: "\u0939\u093E\u0901",
|
|
598
1638
|
states: "\u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u0938\u094D\u0925\u093F\u0924\u093F\u092F\u093E\u0901",
|
|
599
1639
|
title: "\u0932\u093E\u0907\u0935 \u0935\u0949\u0907\u0938 \u0921\u0940\u092C\u0917\u0930",
|
|
600
1640
|
transitions: "\u0939\u093E\u0932 \u0915\u0947 \u0938\u094D\u091F\u0947\u091F \u091F\u094D\u0930\u093E\u0902\u091C\u093C\u093F\u0936\u0928",
|
|
@@ -617,8 +1657,102 @@ var dictionaries = {
|
|
|
617
1657
|
help: "\u53EA\u8BFB\u72B6\u6001\u6811\u4EE5 10 Hz \u66F4\u65B0\u3002\u9ED8\u8BA4\u9690\u85CF\u6587\u672C\u3002\u6B64\u9762\u677F\u4E0D\u63A7\u5236\u8BED\u97F3\u3002",
|
|
618
1658
|
omitted: "\u5DF2\u7701\u7565\u5176\u4ED6\u9879\u76EE",
|
|
619
1659
|
popupBlocked: "\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u8C03\u8BD5\u5668\u7A97\u53E3\u3002\u8BF7\u5141\u8BB8\u6B64\u7F51\u7AD9\u7684\u5F39\u51FA\u7A97\u53E3\uFF0C\u7136\u540E\u91CD\u8BD5\u3002",
|
|
1660
|
+
recordingActive: "\u6B63\u5728\u5F55\u5236",
|
|
1661
|
+
recordingAllSources: "\u6240\u6709\u6765\u6E90",
|
|
1662
|
+
recordingAttempts: "\u8F6C\u5F55\u5386\u53F2",
|
|
1663
|
+
recordingAudio: "\u5F55\u97F3\u64AD\u653E",
|
|
1664
|
+
recordingAudioError: "\u65E0\u6CD5\u52A0\u8F7D\u6216\u64AD\u653E\u5F55\u97F3\u97F3\u9891\u3002",
|
|
1665
|
+
recordingCancel: "\u53D6\u6D88",
|
|
1666
|
+
recordingCaptured: "\u5DF2\u6355\u83B7\u97F3\u9891",
|
|
1667
|
+
recordingCompleted: "\u5DF2\u5B8C\u6210",
|
|
1668
|
+
recordingConfirmDelete: "\u5220\u9664\u6574\u4E2A\u5F55\u97F3\uFF0C\u5305\u62EC\u97F3\u9891\u548C\u8F6C\u5F55\u5386\u53F2\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002\u5220\u9664\u6B63\u5728\u5F55\u5236\u7684\u4F1A\u8BDD\u8FD8\u4F1A\u4E22\u5F03\u540E\u7EED\u4FDD\u5B58\u7684\u97F3\u9891\u3002",
|
|
1669
|
+
recordingDate: "\u5F00\u59CB\u65F6\u95F4",
|
|
1670
|
+
recordingDelete: "\u5220\u9664\u6574\u4E2A\u4F1A\u8BDD",
|
|
1671
|
+
recordingDeleteError: "\u65E0\u6CD5\u5220\u9664\u5F55\u97F3\u3002",
|
|
1672
|
+
recordingDuration: "\u65F6\u957F",
|
|
1673
|
+
recordingEmpty: "\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u5F55\u97F3\u4F1A\u8BDD\u3002",
|
|
1674
|
+
recordingEnd: "\u7ED3\u675F",
|
|
1675
|
+
recordingEngine: "\u5F15\u64CE",
|
|
1676
|
+
recordingError: "\u9519\u8BEF",
|
|
1677
|
+
recordingExport: "\u5BFC\u51FA\u5B8C\u6574\u72EC\u7ACB JSON",
|
|
1678
|
+
recordingExportError: "\u65E0\u6CD5\u5BFC\u51FA\u5F55\u97F3\u3002",
|
|
1679
|
+
recordingFailed: "\u5931\u8D25",
|
|
1680
|
+
recordingHelp: "\u67E5\u770B\u5DF2\u4FDD\u5B58\u97F3\u9891\u3001\u8BED\u97F3/\u9759\u97F3\u8FB9\u754C\u548C\u8F6C\u5F55\u5C1D\u8BD5\u3002\u97F3\u9891\u548C\u6587\u672C\u53EF\u80FD\u654F\u611F\u3002\u64AD\u653E\u5728\u672C\u5730\u8FDB\u884C\uFF1B\u5BFC\u51FA\u5305\u542B\u97F3\u9891\u548C\u6587\u672C\u3002\u67E5\u770B\u4E0D\u4F1A\u66F4\u6539\u91C7\u96C6\uFF1B\u53EA\u6709\u660E\u786E\u5220\u9664\u64CD\u4F5C\u624D\u4F1A\u79FB\u9664\u5F55\u97F3\u3002",
|
|
1681
|
+
recordingInterrupted: "\u5DF2\u4E2D\u65AD",
|
|
1682
|
+
recordingLoadError: "\u65E0\u6CD5\u52A0\u8F7D\u5F55\u97F3\u4F1A\u8BDD\u3002\u8BF7\u5237\u65B0\u91CD\u8BD5\u3002",
|
|
1683
|
+
recordingLoading: "\u6B63\u5728\u52A0\u8F7D\u5F55\u97F3\u2026",
|
|
1684
|
+
recordingMemory: "\u4EC5\u5728\u5185\u5B58\u4E2D",
|
|
1685
|
+
recordingMicrophone: "\u9EA6\u514B\u98CE",
|
|
1686
|
+
recordingNoAttempts: "\u5C1A\u65E0\u8F6C\u5F55\u5C1D\u8BD5\u3002",
|
|
1687
|
+
recordingOpen: "\u672A\u7ED3\u675F\u7247\u6BB5",
|
|
1688
|
+
recordingPending: "\u5904\u7406\u4E2D",
|
|
1689
|
+
recordingPersistent: "\u5DF2\u4FDD\u5B58\u5230\u672C\u5730",
|
|
1690
|
+
recordingPinConfirmed: "\u786E\u8BA4\u65F6\u95F4",
|
|
1691
|
+
recordingPinDelay: "\u786E\u8BA4\u5EF6\u8FDF",
|
|
1692
|
+
recordingPins: "\u8FB9\u754C\u6807\u8BB0",
|
|
1693
|
+
recordingPlay: "\u64AD\u653E\u7247\u6BB5",
|
|
1694
|
+
recordingPlaySession: "\u64AD\u653E\u5DF2\u4FDD\u5B58\u4F1A\u8BDD",
|
|
1695
|
+
recordingRefresh: "\u5237\u65B0\u5F55\u97F3",
|
|
1696
|
+
recordingSaved: "\u5DF2\u4FDD\u5B58\u97F3\u9891",
|
|
1697
|
+
recordingSegments: "\u7247\u6BB5",
|
|
1698
|
+
recordingSelectSession: "\u8BF7\u9009\u62E9\u5F55\u97F3\u4F1A\u8BDD\u3002",
|
|
1699
|
+
recordingShared: "\u5171\u4EAB\u97F3\u9891",
|
|
1700
|
+
recordingSilence: "\u9759\u97F3",
|
|
1701
|
+
recordingSource: "\u6765\u6E90",
|
|
1702
|
+
recordingSourceFilter: "\u7B5B\u9009\u6765\u6E90",
|
|
1703
|
+
recordingSpeech: "\u8BED\u97F3",
|
|
1704
|
+
recordingStar: "\u65E0\u9650\u671F\u4FDD\u7559",
|
|
1705
|
+
recordingStarError: "\u65E0\u6CD5\u66F4\u6539\u5F55\u97F3\u4FDD\u62A4\u3002",
|
|
1706
|
+
recordingStarHelp: "\u5C06\u6B64\u5F55\u97F3\u6392\u9664\u5728\u81EA\u52A8\u6E05\u7406\u548C\u4FDD\u7559\u6570\u91CF\u7EDF\u8BA1\u4E4B\u5916\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u8FD9\u4E0D\u4F1A\u66F4\u6539\u6D4F\u89C8\u5668\u5B58\u50A8\u6216\u9632\u9010\u51FA\u4FDD\u62A4\u3002",
|
|
1707
|
+
recordingStarred: "\u53D7\u4FDD\u62A4\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6E05\u7406",
|
|
1708
|
+
recordingStart: "\u5F00\u59CB",
|
|
1709
|
+
recordingState: "\u72B6\u6001",
|
|
1710
|
+
recordingSuccess: "\u6210\u529F",
|
|
1711
|
+
recordingTimeline: "\u8BED\u97F3 / \u9759\u97F3\u65F6\u95F4\u7EBF",
|
|
1712
|
+
recordingTitle: "\u5F55\u97F3",
|
|
1713
|
+
recordingUnavailable: "\u5F55\u97F3\u670D\u52A1\u4E0D\u53EF\u7528\u3002\u8BF7\u5728\u517C\u5BB9\u7684\u5B9E\u65F6\u8BED\u97F3\u8BBE\u7F6E\u4E2D\u542F\u7528\u5F55\u97F3\u3002",
|
|
1714
|
+
recordingUnstar: "\u53D6\u6D88\u4FDD\u62A4",
|
|
1715
|
+
recordingUnstarHelp: "\u5141\u8BB8\u81EA\u52A8\u6E05\u7406\uFF0C\u5E76\u5C06\u6B64\u5F55\u97F3\u91CD\u65B0\u8BA1\u5165\u4FDD\u7559\u6570\u91CF\u3002\u4ECD\u53EF\u624B\u52A8\u5220\u9664\u3002\u6D4F\u89C8\u5668\u5B58\u50A8\u548C\u9632\u9010\u51FA\u4FDD\u62A4\u4FDD\u6301\u4E0D\u53D8\u3002",
|
|
620
1716
|
refreshRate: "\u66F4\u65B0\u9891\u7387",
|
|
621
1717
|
resume: "\u6062\u590D\u66F4\u65B0",
|
|
1718
|
+
runtimeActive: "\u6D3B\u52A8\u8BF7\u6C42",
|
|
1719
|
+
runtimeAudio: "\u4E0A\u6B21\u97F3\u9891\u65F6\u957F",
|
|
1720
|
+
runtimeCache: "\u6A21\u578B\u6587\u4EF6\u7F13\u5B58",
|
|
1721
|
+
runtimeCancelled: "\u5DF2\u53D6\u6D88",
|
|
1722
|
+
runtimeCompleted: "\u5DF2\u5B8C\u6210\u8F6C\u5F55",
|
|
1723
|
+
runtimeDevice: "\u8BF7\u6C42\u7684\u6267\u884C\u63D0\u4F9B\u7A0B\u5E8F",
|
|
1724
|
+
runtimeError: "\u9519\u8BEF\u4EE3\u7801",
|
|
1725
|
+
runtimeEvents: "\u8FD0\u884C\u65F6\u4E8B\u4EF6\uFF08\u6700\u8FD1100\u6761\uFF09",
|
|
1726
|
+
runtimeFailed: "\u5931\u8D25 / \u5DF2\u53D6\u6D88\u8F6C\u5F55",
|
|
1727
|
+
runtimeGpu: "WebGPU\u9002\u914D\u5668\u53EF\u7528",
|
|
1728
|
+
runtimeHeap: "\u9875\u9762JavaScript\u5806\u4F30\u8BA1",
|
|
1729
|
+
runtimeHelp: "\u6A21\u578B/\u7F13\u5B58\u5927\u5C0F\u662F\u6587\u4EF6\u5B57\u8282\u6570\uFF0C\u4E0D\u662F\u5185\u5B58\u3002PCM\u4EC5\u7EDF\u8BA1\u6D3B\u52A8/\u6392\u961F\u7684\u8F93\u5165\u7F13\u51B2\u533A\u3002JavaScript\u5806\u662F\u975E\u6807\u51C6\u7684\u9875\u9762\u7EA7\u4F30\u8BA1\uFF0C\u4E0D\u5305\u542B\u5B8C\u6574\u7684worker/WASM/GPU\u5185\u5B58\u3002\u6B64\u5904\u65E0\u6CD5\u53EF\u9760\u6D4B\u91CF\u6A21\u578BRAM/\u663E\u5B58\u3002WebGPU\u521D\u59CB\u5316\u6210\u529F\u4E0D\u4EE3\u8868\u5168\u90E8\u7B97\u5B50\u90FD\u5728GPU\u6267\u884C\u3002\u4E8B\u4EF6\u662F\u63D2\u4EF6\u751F\u547D\u5468\u671F\u5143\u6570\u636E\uFF0C\u4E0D\u662F\u539F\u59CBONNX\u65E5\u5FD7\uFF1B\u4E0D\u4FDD\u7559\u97F3\u9891\u6216\u8F6C\u5F55\u3002",
|
|
1730
|
+
runtimeId: "Worker\u6807\u8BC6",
|
|
1731
|
+
runtimeInference: "\u4E0A\u6B21Worker\u63A8\u7406",
|
|
1732
|
+
runtimeLoad: "\u52A0\u8F7D\u5F80\u8FD4 / Worker",
|
|
1733
|
+
runtimeMemory: "\u5185\u5B58\u4E0E\u5B58\u50A8",
|
|
1734
|
+
runtimeModel: "\u6A21\u578B",
|
|
1735
|
+
runtimeModelBytes: "\u5B8C\u6574\u6A21\u578B\u4E0B\u8F7D",
|
|
1736
|
+
runtimeNo: "\u5426",
|
|
1737
|
+
runtimePcm: "\u5DF2\u7EDF\u8BA1\u8F93\u5165PCM",
|
|
1738
|
+
runtimePending: "Worker\u5F85\u5904\u7406\u8BF7\u6C42",
|
|
1739
|
+
runtimeQuantization: "\u7F16\u7801\u5668 / \u89E3\u7801\u5668\u7CBE\u5EA6",
|
|
1740
|
+
runtimeQueue: "\u6392\u961F\u8F6C\u5F55",
|
|
1741
|
+
runtimeRam: "\u6A21\u578BRAM",
|
|
1742
|
+
runtimeRatio: "\u5904\u7406 / \u97F3\u9891\u6BD4\u7387",
|
|
1743
|
+
runtimeReady: "\u5C31\u7EEA",
|
|
1744
|
+
runtimeReleased: "\u5DF2\u91CA\u653E",
|
|
1745
|
+
runtimeRevision: "\u56FA\u5B9A\u7248\u672C",
|
|
1746
|
+
runtimeStarted: "\u5DF2\u5F00\u59CB",
|
|
1747
|
+
runtimeStatus: "\u72B6\u6001",
|
|
1748
|
+
runtimeStorage: "\u6B64\u6765\u6E90\u53EF\u7528\u5B58\u50A8",
|
|
1749
|
+
runtimeSuccess: "\u6210\u529F",
|
|
1750
|
+
runtimeTitle: "\u8FD0\u884C\u65F6",
|
|
1751
|
+
runtimeUnavailable: "\u4E0D\u53EF\u7528",
|
|
1752
|
+
runtimeVersions: "ONNX Runtime / Transformers.js",
|
|
1753
|
+
runtimeVram: "\u6A21\u578B\u663E\u5B58",
|
|
1754
|
+
runtimeWorker: "Worker\u6D3B\u52A8",
|
|
1755
|
+
runtimeYes: "\u662F",
|
|
622
1756
|
states: "\u5F53\u524D\u72B6\u6001",
|
|
623
1757
|
title: "\u5B9E\u65F6\u8BED\u97F3\u8C03\u8BD5\u5668",
|
|
624
1758
|
transitions: "\u6700\u8FD1\u7684\u72B6\u6001\u8F6C\u6362",
|
|
@@ -628,12 +1762,15 @@ var dictionaries = {
|
|
|
628
1762
|
|
|
629
1763
|
// src/styles.ts
|
|
630
1764
|
var styles = `
|
|
1765
|
+
.dlvd-runtimes{overflow-wrap:anywhere}.dlvd-runtimes h3{margin:8px 0}.dlvd-runtime-card{border-top:1px solid var(--dsw-alias-border-l2,#ffffff1f);padding:12px 0}.dlvd-runtimes .dlvd-history>div{border-bottom:1px solid var(--dsw-alias-border-l1,#ffffff0f);padding:6px 0}.dlvd-tabs{flex-wrap:wrap}
|
|
1766
|
+
|
|
631
1767
|
.dlvd-columns{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;flex:1;min-height:0;overflow:hidden}.dlvd-state-pane,.dlvd-event-pane{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden}.dlvd-event-pane{border-left:1px solid var(--dsw-alias-border-l1, #ffffff0f);padding-left:16px}.dlvd-columns h3{margin:0 0 10px}.dlvd-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding-right:8px}.dlvd-scroll:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary, #7aaaff);outline-offset:-2px}.dlvd-history summary{overflow-wrap:anywhere}.dlvd-panel>header,.dlvd-panel>p,.dlvd-panel>.dlvd-toolbar{flex-shrink:0}
|
|
632
1768
|
|
|
633
1769
|
.dlvd-window{margin:0;background:var(--dsw-alias-bg-base, #151517);color:var(--dsw-alias-label-primary, #f9fafb);color-scheme:var(--dlvd-color-scheme, dark)}.dlvd-window .dlvd-panel{position:static;width:100%;height:100dvh;max-height:none;min-width:0;resize:none;border:0;border-radius:0;box-shadow:none}
|
|
634
1770
|
.dlvd-panel{position:fixed;right:16px;top:16px;width:min(520px,calc(100vw - 32px));height:80vh;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;z-index:1000;padding:16px;border:1px solid var(--dsw-alias-border-l2, #ffffff1f);border-radius:14px;background:var(--dsw-alias-bg-base, #151517);color:var(--dsw-alias-label-primary, #f9fafb);box-shadow:0 12px 40px #0008;font:13px/1.6 system-ui;resize:both;min-width:280px;box-sizing:border-box;color-scheme:var(--dlvd-color-scheme, dark)}
|
|
635
1771
|
.dlvd-panel header{display:flex;align-items:center;gap:12px;position:sticky;top:-16px;background:var(--dsw-alias-bg-base, #151517);padding:8px 0;z-index:1}.dlvd-panel header strong{flex:1}.dlvd-panel button,.dlvd-panel select{background:var(--dsw-alias-bg-layer-1, #232324);color:var(--dsw-alias-label-primary, #f9fafb);border:1px solid var(--dsw-alias-border-l2, #ffffff1f);border-radius:6px;padding:5px 9px;cursor:pointer}.dlvd-panel button:focus-visible,.dlvd-panel summary:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary, #7aaaff)}.dlvd-toolbar{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:12px}.dlvd-panel p{color:var(--dsw-alias-label-tertiary, #adb2b8)}.dlvd-branch{margin-left:10px;border-left:1px solid var(--dsw-alias-border-l1, #ffffff0f);padding-left:9px}.dlvd-branch summary{cursor:pointer;padding:3px 0}.dlvd-panel small{color:var(--dsw-alias-label-tertiary, #adb2b8);margin-left:8px}.dlvd-leaf{display:flex;gap:12px;justify-content:space-between;padding:2px 0;overflow-wrap:anywhere}.dlvd-leaf code{color:var(--dsw-alias-label-secondary, #cfd3d6)}.dlvd-leaf span{white-space:pre-wrap;text-align:right;max-width:65%}.dlvd-leaf [data-kind=boolean]{color:var(--dsw-alias-label-primary, #f9fafb)}.dlvd-leaf [data-kind=number]{color:var(--dsw-alias-label-primary, #f9fafb)}.dlvd-history{margin-top:12px}.dlvd-history>details{border-top:1px solid var(--dsw-alias-border-l1, #ffffff0f);padding:6px 0}.dlvd-history [data-level=error]{border-left:3px solid var(--dsw-alias-state-error-primary, #f25a5a);padding-left:8px}
|
|
636
1772
|
.dlvd-panel button,.dlvd-panel select{font:inherit}.dlvd-panel button:hover{background:var(--dsw-alias-interactive-bg-hover, #ffffff14)}.dlvd-panel select:focus-visible,.dlvd-panel input:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary, #7aaaff);outline-offset:2px}.dlvd-panel input{accent-color:var(--dsw-alias-state-business-primary, #7aaaff)}.dlvd-scroll{scrollbar-color:var(--dsw-alias-scrollbar-bg-l1, #3c3c3d) transparent}.dlvd-panel [data-kind=boolean],.dlvd-panel [data-kind=number]{font-variant-numeric:tabular-nums}
|
|
1773
|
+
.dlvd-tabs{display:flex;gap:8px;margin:8px 0 12px}.dlvd-tabs [aria-selected=true]{border-color:var(--dsw-alias-state-business-primary,#7aaaff);background:var(--dsw-alias-interactive-bg-hover,#ffffff14)}.dlvd-tab-panel{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}.dlvd-tab-panel[hidden]{display:none}.dlvd-recordings{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}.dlvd-recordings>p{margin:0 0 12px}.dlvd-recording-columns{display:grid;grid-template-columns:minmax(220px,.9fr) minmax(0,1.5fr);gap:16px;flex:1;min-height:0;overflow:hidden}.dlvd-recording-detail{border-left:1px solid var(--dsw-alias-border-l2,#ffffff1f);padding-left:16px}.dlvd-recordings table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}.dlvd-recordings th,.dlvd-recordings td{text-align:left;vertical-align:top;padding:6px;border-bottom:1px solid var(--dsw-alias-border-l1,#ffffff0f);overflow-wrap:anywhere}.dlvd-recordings th{font-size:11px}.dlvd-recordings h3{margin:4px 0 10px;overflow-wrap:anywhere}.dlvd-recordings h4{margin:16px 0 6px}.dlvd-recordings tr[data-selected=true]{background:var(--dsw-alias-interactive-bg-hover,#ffffff14)}.dlvd-recording-meta{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 12px}.dlvd-recording-meta dd{margin:0;overflow-wrap:anywhere}.dlvd-recordings audio{width:100%;margin:8px 0}.dlvd-recordings button:disabled{opacity:.5;cursor:default}.dlvd-recordings summary{cursor:pointer}.dlvd-delete-confirm{padding:10px;border:1px solid var(--dsw-alias-state-error-primary,#f25a5a);border-radius:8px;margin-bottom:12px}.dlvd-attempt{padding:8px;border-left:2px solid var(--dsw-alias-border-l2,#ffffff1f);margin:8px 0}.dlvd-transcript{white-space:pre-wrap;overflow-wrap:anywhere}.dlvd-attempt-error{color:var(--dsw-alias-state-error-primary,#f25a5a)!important}.dlvd-timeline{position:relative;height:44px;overflow:hidden;border:1px solid var(--dsw-alias-border-l2,#ffffff1f);border-radius:6px;background:var(--dsw-alias-bg-layer-1,#232324)}.dlvd-timeline button{position:absolute;top:8px;height:28px;min-width:2px;padding:0;border:0;border-radius:0}.dlvd-timeline [data-kind=speech]{background:#278956}.dlvd-timeline [data-kind=silence]{background:#566578}.dlvd-timeline button[aria-pressed=true]{outline:2px solid var(--dsw-alias-label-primary,#f9fafb);outline-offset:-2px}.dlvd-pin{position:absolute;top:0;height:42px;width:2px;background:var(--dsw-alias-label-primary,#f9fafb);pointer-events:none}.dlvd-timeline-legend{font-size:12px;margin:4px 0}.dlvd-timeline-legend [data-kind=speech]{border-bottom:3px solid #278956}.dlvd-timeline-legend [data-kind=silence]{border-bottom:3px solid #566578}@media(max-width:850px){.dlvd-recording-columns{grid-template-columns:1fr;grid-template-rows:minmax(130px,.7fr) minmax(0,1.5fr)}.dlvd-recording-detail{border-left:0;border-top:1px solid var(--dsw-alias-border-l2,#ffffff1f);padding-left:0;padding-top:12px}}
|
|
637
1774
|
`;
|
|
638
1775
|
|
|
639
1776
|
// src/theme.ts
|
|
@@ -700,12 +1837,12 @@ function apply(ctx) {
|
|
|
700
1837
|
notify();
|
|
701
1838
|
};
|
|
702
1839
|
function Host() {
|
|
703
|
-
|
|
1840
|
+
import_react25.default.useSyncExternalStore(localeSubscribe, localeSnapshot);
|
|
704
1841
|
const labels = copy();
|
|
705
|
-
|
|
1842
|
+
import_react25.default.useEffect(() => {
|
|
706
1843
|
if (popup && !popup.closed) popup.document.title = labels.title;
|
|
707
1844
|
}, [labels.title]);
|
|
708
|
-
return /* @__PURE__ */
|
|
1845
|
+
return /* @__PURE__ */ import_react25.default.createElement(DebuggerPanel, { copy: labels, target: window, onClose: () => queueMicrotask(close) });
|
|
709
1846
|
}
|
|
710
1847
|
const open = () => {
|
|
711
1848
|
if (popup && !popup.closed) {
|
|
@@ -739,7 +1876,7 @@ function apply(ctx) {
|
|
|
739
1876
|
container.dataset.plugin = namespace;
|
|
740
1877
|
doc.body.appendChild(container);
|
|
741
1878
|
root = (0, import_client.createRoot)(container);
|
|
742
|
-
root.render(/* @__PURE__ */
|
|
1879
|
+
root.render(/* @__PURE__ */ import_react25.default.createElement(Host, null));
|
|
743
1880
|
enabled = true;
|
|
744
1881
|
closedTimer = setInterval(() => {
|
|
745
1882
|
if (popup?.closed) close();
|
|
@@ -754,10 +1891,10 @@ function apply(ctx) {
|
|
|
754
1891
|
}
|
|
755
1892
|
};
|
|
756
1893
|
function Settings() {
|
|
757
|
-
const failed =
|
|
758
|
-
|
|
1894
|
+
const failed = import_react25.default.useSyncExternalStore(subscribe, () => blocked);
|
|
1895
|
+
import_react25.default.useSyncExternalStore(localeSubscribe, localeSnapshot);
|
|
759
1896
|
const labels = copy();
|
|
760
|
-
return /* @__PURE__ */
|
|
1897
|
+
return /* @__PURE__ */ import_react25.default.createElement("div", { className: "dlv-diagnostics-launcher" }, /* @__PURE__ */ import_react25.default.createElement("button", { type: "button", className: "dlv-diagnostics-button", onClick: open }, /* @__PURE__ */ import_react25.default.createElement(Icon, { name: "bug" }), labels.diagnostics), /* @__PURE__ */ import_react25.default.createElement(Hint, { label: labels.diagnostics }, labels.activate), failed && /* @__PURE__ */ import_react25.default.createElement("p", { role: "alert" }, labels.popupBlocked));
|
|
761
1898
|
}
|
|
762
1899
|
ctx.effect(
|
|
763
1900
|
() => publishDeveloperExtension(window, {
|