@dxos/react-ui-transcription 0.9.1-staging.ee54ba693a → 0.11.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/dist/lib/index.mjs +963 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/types/src/capture/create-transcriber.d.ts +1 -1
- package/dist/types/src/capture/media-stream-recorder.d.ts +1 -1
- package/dist/types/src/capture/media-stream-recorder.d.ts.map +1 -1
- package/dist/types/src/components/PipelineStatus/PipelineStatus.d.ts +1 -1
- package/dist/types/src/components/Transcription/Transcription.d.ts +1 -1
- package/dist/types/src/components/Transcription/Transcription.d.ts.map +1 -1
- package/dist/types/src/hooks/useRecordingPipeline.d.ts +1 -1
- package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +23 -24
- package/src/capture/create-transcriber.ts +1 -1
- package/src/capture/media-stream-recorder.ts +1 -3
- package/src/components/PipelineStatus/PipelineStatus.tsx +1 -1
- package/src/hooks/useRecordingPipeline.ts +1 -1
- package/src/hooks/useTranscriber.ts +1 -1
- package/src/index.ts +0 -1
- package/dist/lib/browser/index.mjs +0 -1002
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -1004
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/types/src/util/index.d.ts +0 -2
- package/dist/types/src/util/index.d.ts.map +0 -1
- package/dist/types/src/util/render-byline.d.ts +0 -4
- package/dist/types/src/util/render-byline.d.ts.map +0 -1
- package/src/util/index.ts +0 -5
- package/src/util/render-byline.ts +0 -32
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capture/create-transcriber.ts", "../../../src/capture/media-stream-recorder.ts", "../../../src/components/MicSettings/MicSettings.tsx", "../../../src/components/PipelineStatus/PipelineStatus.tsx", "../../../src/components/Transcription/Transcription.tsx", "../../../src/components/Transcription/transcription-extension.ts", "../../../src/model/transcript-model.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useFeedModelAdapter.ts", "../../../src/hooks/useIsSpeaking.ts", "../../../src/hooks/useRecordingPipeline.ts", "../../../src/hooks/useSpeechRecognition.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/util/render-byline.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type TranscribeConfig, type TranscribeFn, Transcriber } from '@dxos/transcription-pipeline';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\n\n// Recorder chunk interval (ms).\nconst RECORD_INTERVAL = 200;\n// Chunks retained before the user starts speaking, to catch the onset of speech.\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n// Chunks transcribed automatically; combined should stay under ~25MB or Whisper fails.\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type CreateTranscriberOptions = {\n audioStreamTrack: MediaStreamTrack;\n onSegments: (segments: ContentBlock.Transcript[]) => Promise<void>;\n transcriberConfig?: Partial<TranscribeConfig>;\n recorderConfig?: { interval?: number };\n transcribe?: TranscribeFn;\n};\n\n/**\n * Builds a {@link Transcriber} backed by a browser {@link MediaStreamRecorder} for the given track —\n * the low-level audio→text construction, co-located with the recorder so it can be tested outside the\n * plugin. Consumed directly via the {@link useTranscriber} hook.\n */\nexport const createTranscriber = ({\n audioStreamTrack,\n onSegments,\n transcriberConfig,\n recorderConfig,\n transcribe,\n}: CreateTranscriberOptions): Transcriber =>\n new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n ...transcriberConfig,\n },\n recorder: new MediaStreamRecorder({\n mediaStreamTrack: audioStreamTrack,\n config: { interval: RECORD_INTERVAL, ...recorderConfig },\n }),\n onSegments,\n transcribe,\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\nimport { type AudioChunk, type AudioRecorder, type WavConfig } from '@dxos/transcription-pipeline';\n\n// `extendable-media-recorder` references browser-only globals (Worker/AudioWorklet) at module load,\n// so it is imported lazily — keeping this package importable in non-browser contexts (node tests,\n// Cloudflare Workers) where the recorder is never started.\nlet MediaRecorderClass: typeof import('extendable-media-recorder').MediaRecorder | undefined;\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { MediaRecorder, register } = await import('extendable-media-recorder');\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n MediaRecorderClass = MediaRecorder;\n};\n\nexport type MediaStreamRecorderProps = {\n mediaStreamTrack: MediaStreamTrack;\n config: {\n interval: number;\n };\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _config: MediaStreamRecorderProps['config'];\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, config }: MediaStreamRecorderProps) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._config = config;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n // `@synchronized` serializes start/stop (they share the instance lock) so a rapid stop→start cycle\n // (e.g. React StrictMode double-mount) cannot initiate a new WAV encoding before the previous one\n // has flushed — which throws \"Another request was made to initiate an encoding\" and kills capture.\n @synchronized\n async start(): Promise<void> {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (this._mediaRecorder?.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n invariant(MediaRecorderClass, 'MediaStreamRecorder: extendable-media-recorder not initialized');\n // Fresh recorder per session so a previously-stopped (encoder-flushed) instance is never reused.\n const stream = new MediaStream([this._mediaStreamTrack]);\n const recorder = new MediaRecorderClass(stream, { mimeType: 'audio/wav' });\n recorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder = recorder;\n recorder.start(this._config.interval);\n }\n\n @synchronized\n async stop(): Promise<void> {\n const recorder = this._mediaRecorder;\n if (!recorder || recorder.state !== 'recording') {\n return;\n }\n // Await the actual stop (final dataavailable + encoder flush) before releasing the recorder, so a\n // subsequent start() does not collide with an in-progress encoding.\n await new Promise<void>((resolve) => {\n recorder.addEventListener('stop', () => resolve(), { once: true });\n recorder.stop();\n });\n this._mediaRecorder = undefined;\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent): Promise<void> {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DropdownMenu, Icon, IconButton, useTranslation } from '@dxos/react-ui';\n\n/** Recording trigger mode: toggle on/off, or hold-to-record (push-to-talk). */\nexport type RecordMode = 'toggle' | 'hold';\n\nexport type AudioInputDevice = {\n deviceId: string;\n label: string;\n};\n\nexport type MicSettingsProps = {\n /** Translation namespace for the option labels (owned by the consuming plugin). */\n translationNs: string;\n recordMode: RecordMode;\n entityExtraction: boolean;\n devices: AudioInputDevice[];\n /** Empty string selects the system default device. */\n selectedDeviceId: string;\n onRecordModeChange: (mode: RecordMode) => void;\n onEntityExtractionChange: (value: boolean) => void;\n onSelectDevice: (deviceId: string) => void;\n};\n\n/**\n * Dropdown of recording options for the mic: record mode (toggle/push-to-talk), the input device,\n * and whether entity extraction is applied. Presentational — state lives in the consumer.\n */\nexport const MicSettings = ({\n translationNs,\n recordMode,\n entityExtraction,\n devices,\n selectedDeviceId,\n onRecordModeChange,\n onEntityExtractionChange,\n onSelectDevice,\n}: MicSettingsProps) => {\n const { t } = useTranslation(translationNs);\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon='ph--caret-down--regular'\n iconOnly\n label={t('recording-options.label')}\n variant='ghost'\n // Half-width slim caret abutting the mic (split-control affordance).\n classNames='w-4'\n data-testid='transcription.record.options'\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n <DropdownMenu.GroupLabel>{t('record-mode.label')}</DropdownMenu.GroupLabel>\n <SelectableItem\n label={t('record-mode.toggle.label')}\n selected={recordMode === 'toggle'}\n onSelect={() => onRecordModeChange('toggle')}\n />\n <SelectableItem\n label={t('record-mode.hold.label')}\n selected={recordMode === 'hold'}\n onSelect={() => onRecordModeChange('hold')}\n />\n\n <DropdownMenu.Separator />\n\n <DropdownMenu.GroupLabel>{t('audio-device.label')}</DropdownMenu.GroupLabel>\n <SelectableItem\n label={t('audio-device.default.label')}\n selected={selectedDeviceId === ''}\n onSelect={() => onSelectDevice('')}\n />\n {devices.map((device) => (\n <SelectableItem\n key={device.deviceId}\n label={device.label}\n selected={selectedDeviceId === device.deviceId}\n onSelect={() => onSelectDevice(device.deviceId)}\n />\n ))}\n\n <DropdownMenu.Separator />\n\n <DropdownMenu.CheckboxItem\n checked={entityExtraction}\n onCheckedChange={onEntityExtractionChange}\n classNames='gap-2'\n data-testid='transcription.entity-extraction'\n >\n <span className='grow truncate'>{t('settings.entity-extraction.label')}</span>\n <DropdownMenu.ItemIndicator asChild>\n <Icon icon='ph--check--regular' size={4} />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.CheckboxItem>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n};\n\ntype SelectableItemProps = {\n label: string;\n selected: boolean;\n onSelect: () => void;\n};\n\n// The design system's `DropdownMenu.RadioItem` renders a plain item (no radio semantics), so\n// single-select is modelled with a plain item and an explicit trailing check. `onSelect` (not\n// `onClick`) so keyboard activation works.\nconst SelectableItem = ({ label, selected, onSelect }: SelectableItemProps) => (\n <DropdownMenu.Item classNames='gap-2' onSelect={onSelect}>\n <span className='grow truncate'>{label}</span>\n {selected && <Icon icon='ph--check--regular' size={4} />}\n </DropdownMenu.Item>\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { Fragment } from 'react';\n\nimport { type TelemetryEvent } from '@dxos/transcription-pipeline';\n\nimport { type PipelinePhase } from '../../types';\n\nexport type PipelineStatusProps = {\n /** Live lifecycle phase published by the transcription driver. */\n phase?: PipelinePhase;\n /** Ordered stage ids being run (e.g. correct → extract → summarize). */\n stages?: readonly string[];\n /** Per-stage telemetry emitted by `PipelineRuntime`. */\n telemetry?: readonly TelemetryEvent[];\n /** Cumulative summary produced by the summarization stage. */\n summary?: string;\n};\n\n/**\n * Read-only status panel reflecting the transcription/pipeline state: mic + pipeline phase, the\n * active stage list, per-stage telemetry, and the running summary. Driven by the `PipelineStatus`\n * capability (phase) and `PipelineRuntime` telemetry.\n */\nexport const PipelineStatus = ({ phase = 'idle', stages, telemetry, summary }: PipelineStatusProps) => (\n <div className='flex flex-col gap-3 overflow-y-auto p-2 text-sm'>\n <Section title='Status'>\n <div className='grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-description'>\n <span>Mic</span>\n <span>{phase === 'recording' ? '● on' : '○ off'}</span>\n <span>Pipeline</span>\n <span>{phase}</span>\n </div>\n </Section>\n\n {stages && (\n <Section title='Stages'>\n <div className='text-description'>{stages.join(' → ') || '(none)'}</div>\n </Section>\n )}\n\n {telemetry && telemetry.length > 0 && (\n <Section title='Telemetry'>\n <div className='grid w-fit grid-cols-[1fr_auto_auto] gap-x-4 gap-y-1'>\n {telemetry.map((event, index) => (\n <Fragment key={index}>\n <span>{event.stageId}</span>\n <span className='text-description'>{event.outcome}</span>\n <span className='text-right tabular-nums text-description'>{event.durationMs}ms</span>\n </Fragment>\n ))}\n </div>\n </Section>\n )}\n\n {summary && (\n <Section title='Summary'>\n <p className='text-description'>{summary}</p>\n </Section>\n )}\n </div>\n);\n\nconst Section = ({ title, children }: { title: string; children: React.ReactNode }) => (\n <div>\n <h3 className='mb-1 font-medium'>{title}</h3>\n {children}\n </div>\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { composable, composableProps, useThemeContext } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\nimport { type Message, type Transcript } from '@dxos/types';\nimport {\n AnchorWidget,\n type XmlWidgetProps,\n type XmlWidgetRegistry,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n decorateMarkdown,\n documentSlots,\n scroller,\n xmlTags,\n} from '@dxos/ui-editor';\n\nimport { type TranscriptModel } from '../../model';\nimport { transcription } from './transcription-extension';\n\nconst inlinePreviewRegistry: XmlWidgetRegistry = {\n 'link-preview': {\n block: false,\n urlSchemes: ['dxn:', 'echo:'],\n factory: ({ label, dxn }: XmlWidgetProps<{ label: string; dxn: string }>) =>\n typeof label === 'string' && typeof dxn === 'string' ? new AnchorWidget(label, dxn) : null,\n },\n};\n\nexport type TranscriptionProps = {\n transcript?: Transcript.Transcript;\n model: TranscriptModel<Message.Message>;\n};\n\n// TODO(burdon): Rename Transcript.\nexport const Transcription = composable<HTMLDivElement, TranscriptionProps>(\n ({ transcript: object, model, children, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n extensions: [\n createBasicExtensions({ readOnly: true, lineWrapping: true, search: true }),\n createThemeExtensions({ themeMode, slots: documentSlots }),\n createMarkdownExtensions(),\n // xmlTags() handles dxn:/echo: links via url-scheme widgets; skip here to avoid double-processing.\n decorateMarkdown({ skip: ({ url }) => url.startsWith('dxn:') || url.startsWith('echo:') }),\n xmlTags({ registry: inlinePreviewRegistry }),\n transcription({ model, started: object?.started ? new Date(object.started) : undefined }),\n scroller(),\n ],\n };\n }, [model, themeMode]);\n\n return (\n <div\n {...composableProps(props, { classNames: 'dx-container' })}\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, GutterMarker, ViewPlugin, type ViewUpdate, gutter } from '@codemirror/view';\nimport { format } from 'date-fns/format';\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\n\nimport { type CleanupFn, addEventListener, combine } from '@dxos/async';\nimport { type Message } from '@dxos/types';\n\nimport { EditorChunkDocument, type TranscriptModel } from '../../model';\n\n/**\n * Data structure that maps Chunks queue to lines with transcript state.\n */\nexport type TranscriptionOptions = {\n model: TranscriptModel<Message.Message>;\n started?: Date;\n};\n\n/**\n * Scrolling transcript with timestamps.\n */\nexport const transcription = ({ model, started }: TranscriptionOptions): Extension => {\n return [\n // Show timestamps in the gutter.\n gutter({\n class: 'cm-timestamp-gutter',\n lineMarkerChange: (update) => update.docChanged || update.viewportChanged,\n markers: (view) => {\n const start = getStartTime(started, model.chunks[0]);\n const builder = new RangeSetBuilder<GutterMarker>();\n for (const { from, to } of view.visibleRanges) {\n let line = view.state.doc.lineAt(from);\n while (line.from <= to) {\n const block = model.getChunkAtLine(line.number)?.blocks[0];\n const timestamp = block?._tag === 'transcript' && block.started;\n if (timestamp) {\n builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));\n }\n\n if (line.to + 1 > view.state.doc.length) {\n break;\n }\n\n line = view.state.doc.lineAt(line.to + 1);\n }\n }\n\n return builder.finish();\n },\n }),\n\n // Listen for model updates.\n ViewPlugin.fromClass(\n class {\n private readonly _controls?: HTMLDivElement;\n private readonly _cleanup: CleanupFn;\n private readonly _adapter: EditorChunkDocument;\n private _initialized = false;\n\n constructor(view: EditorView) {\n this._adapter = new EditorChunkDocument(view);\n\n const scroller = view.scrollDOM;\n let isAutoScrolling = false;\n let hasScrolled = false;\n\n let timeout: NodeJS.Timeout | undefined;\n const scrollToBottom = (smooth = false) => {\n scroller.style.scrollBehavior = smooth ? 'smooth' : '';\n\n // Temporarily hide scrollbar to prevent flicker.\n scroller.classList.add('cm-hide-scrollbar');\n isAutoScrolling = true;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n this._controls?.classList.add('opacity-0');\n scroller.classList.remove('cm-hide-scrollbar');\n isAutoScrolling = false;\n }, 500);\n\n // Scroll to bottom.\n view.dispatch({\n effects: EditorView.scrollIntoView(view.state.doc.length, { y: 'end' }),\n });\n };\n\n // Event listeners.\n this._cleanup = combine(\n addEventListener(view.scrollDOM, 'scroll', () => {\n if (!isAutoScrolling) {\n hasScrolled = true;\n this._controls?.classList.remove('opacity-0');\n }\n }),\n\n model.update.on(() => {\n // Check if clamped to bottom.\n const autoScroll =\n scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;\n\n // Sync.\n model.sync(this._adapter);\n\n // Scroll.\n if (autoScroll) {\n scrollToBottom(true);\n }\n }),\n );\n }\n\n update(_update: ViewUpdate) {\n // Initial sync.\n if (!this._initialized) {\n this._initialized = true;\n setTimeout(() => {\n model.sync(this._adapter);\n });\n }\n }\n\n destroy() {\n this._controls?.remove();\n this._cleanup();\n }\n },\n ),\n\n EditorView.theme({\n '.cm-gutters': {\n backgroundColor: 'var(--color-base-surface)',\n },\n '.cm-timestamp-gutter': {\n width: '6rem',\n paddingLeft: '0.5rem',\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter > .cm-gutterElement > div': {\n display: 'inline-flex',\n textAlign: 'right',\n padding: '3px',\n },\n }),\n ];\n};\n\n/**\n * Gutter marker that displays a timestamp.\n */\nclass TimestampMarker extends GutterMarker {\n constructor(\n readonly _line: number,\n readonly _timestamp: Date,\n readonly _started?: Date,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._timestamp === other._timestamp;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('div');\n el.className = 'text-sm text-subdued hover:bg-hover-surface cursor-pointer';\n el.textContent = formatTimestamp(this._timestamp, this._started);\n // TODO(burdon): Click to bookmark or copy hyperlink.\n el.onclick = () => {\n const pos = view.state.doc.line(this._line).from;\n view.dispatch({\n effects: EditorView.scrollIntoView(pos, { y: 'start' }),\n });\n };\n\n return el;\n }\n}\n\nconst getStartTime = (started?: Date, message?: Message.Message): Date | undefined => {\n if (started) {\n return started;\n }\n\n if (message?.blocks[0]?._tag === 'transcript' && message.blocks[0].started) {\n return new Date(message.blocks[0].started);\n }\n\n return undefined;\n};\n\nconst formatTimestamp = (timestamp: Date, relative?: Date) => {\n if (relative) {\n const pad = (n = 0) => String(n).padStart(2, '0');\n const { hours, minutes, seconds } = intervalToDuration({ start: relative, end: timestamp });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n } else {\n return format(timestamp, 'HH:mm:ss');\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Text } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nexport type Chunk = { id: string };\n\n/**\n * Covert block to a set of markdown lines.\n */\nexport type ChunkRenderer<T extends Chunk> = (chunk: T, index: number, debug?: boolean) => string[];\n\n/**\n * Abstract representation of the document model.\n */\nexport interface ChunkDocument {\n lineCount(): number;\n replaceLines(from: number, remove: number, insert: string[]): void;\n}\n\n/**\n * CodeMirror-backed {@link ChunkDocument}.\n */\nexport class EditorChunkDocument implements ChunkDocument {\n constructor(private readonly _view: EditorView) {}\n\n /** The document must always have at least one line. */\n lineCount(): number {\n return this._view.state.doc.lines - 1;\n }\n\n replaceLines(from: number, remove: number, insert: string[]): void {\n log('replaceLines', { count: this._view.state.doc.lines, from, remove, insert });\n\n const numLines = this._view.state.doc.lines;\n const posFrom = this._view.state.doc.line(from).from;\n const posTo = remove === 0 ? posFrom : this._view.state.doc.line(Math.min(numLines, from + remove)).from;\n\n // Don't remove the last line.\n let text = insert.join('\\n');\n if (posTo === this._view.state.doc.length) {\n text += '\\n';\n }\n\n this._view.dispatch({\n changes: { from: posFrom, to: posTo, insert: text },\n });\n }\n}\n\ntype ChunkChange<T extends Chunk> =\n | {\n type: 'append';\n index: number;\n chunk: T;\n }\n | {\n type: 'update';\n index: number;\n chunk: T;\n }\n | {\n type: 'delete';\n index: number;\n id: string;\n };\n\n/**\n * Each Chunk can be converted into a set of lines.\n * Chunks can be added, updated or deleted from the Queue.\n * A Document is an immutable projection that represents a flat list of lines corresponding to the Queue.\n *\n * Ideally we would implement a custom virtual Text model for the View, but this currently isn't possible in Codemirror.\n * Instead this model tracks changes and syncs them with the ChunkDocument.\n */\nexport class TranscriptModel<T extends Chunk> {\n /** Emits when the document is updated. */\n public readonly update = new Event<void>();\n\n /** Ordered set of chunks. */\n private readonly _chunks: T[] = [];\n\n /** Map of chunk IDs to their current line counts. */\n private readonly _chunkLineCounts = new Map<string, number>();\n\n /** Map of line numbers to chunk IDs. */\n private readonly _lineToChunk = new Map<number, T>();\n\n /** Track chunk changes since last sync. */\n private readonly _changes: Array<ChunkChange<T>> = [];\n\n constructor(\n private readonly _renderer: ChunkRenderer<T>,\n initialChunks: T[] = [],\n ) {\n initialChunks.forEach((chunk) => {\n this.appendChunk(chunk);\n });\n }\n\n toJSON(): { chunks: number; changes: number } {\n return {\n chunks: this._chunks.length,\n changes: this._changes.length,\n };\n }\n\n get doc() {\n return Text.of([...this._chunks.flatMap((chunk, index) => this._renderer(chunk, index)), '']);\n }\n\n get chunks() {\n return this._chunks;\n }\n\n /**\n * Get the block ID at the given line number.\n */\n getChunkAtLine(line: number): T | undefined {\n return this._lineToChunk.get(line);\n }\n\n reset(): this {\n this._chunks.length = 0;\n this._chunkLineCounts.clear();\n this._lineToChunk.clear();\n this.update.emit();\n return this;\n }\n\n appendChunk(chunk: T): this {\n const index = this._chunks.length;\n this._chunks.push(chunk);\n this._changes.push({ type: 'append', index, chunk });\n this.update.emit();\n return this;\n }\n\n updateChunk(chunk: T): this {\n const index = this._chunks.findIndex((c) => c.id === chunk.id);\n invariant(index !== -1);\n this._chunks[index] = chunk;\n this._changes.push({ type: 'update', index, chunk });\n this.update.emit();\n return this;\n }\n\n deleteBlock(id: string): this {\n const index = this._chunks.findIndex((c) => c.id === id);\n invariant(index !== -1);\n this._chunks.splice(index, 1);\n this._changes.push({ type: 'delete', index, id });\n this.update.emit();\n return this;\n }\n\n /**\n * Syncs the tracked changes with the ChunkDocument.\n */\n sync(document: ChunkDocument): this {\n log('sync', { changes: this._changes });\n\n // Process each change in order.\n for (const change of this._changes) {\n switch (change.type) {\n case 'append': {\n // For appends, convert block to lines and add at the end.\n const lines = this._renderer(change.chunk, change.index);\n const lastLine = document.lineCount();\n document.replaceLines(lastLine + 1, 0, lines);\n break;\n }\n\n case 'update': {\n // For updates, find the block's line range and replace with new lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.chunk.id)!;\n const newLines = this._renderer(change.chunk, change.index);\n document.replaceLines(lineStart, previousLineCount, newLines);\n break;\n }\n\n case 'delete': {\n // For deletes, find the block's line range and remove those lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.id)!;\n document.replaceLines(lineStart, previousLineCount, []);\n break;\n }\n }\n }\n\n // Clear the line-to-block mapping.\n this._lineToChunk.clear();\n\n // Update all block line counts and line-to-block mapping after processing changes.\n let currentLine = 1;\n for (const [index, chunk] of this._chunks.entries()) {\n const lineCount = this._renderer(chunk, index).length;\n this._chunkLineCounts.set(chunk.id, lineCount);\n this._lineToChunk.set(currentLine, chunk);\n currentLine += lineCount;\n }\n\n // Clean up deleted blocks.\n const chunkIds = new Set(this._chunks.map((chunk) => chunk.id));\n for (const id of this._chunkLineCounts.keys()) {\n if (!chunkIds.has(id)) {\n this._chunkLineCounts.delete(id);\n }\n }\n\n // Clear changes after sync.\n this._changes.length = 0;\n return this;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nexport type UseAudioState = {\n audio?: HTMLAudioElement;\n stream?: MediaStream;\n track?: MediaStreamTrack;\n};\n\nexport const useAudioFile = (audioUrl: string, constraints?: MediaTrackConstraints): UseAudioState => {\n const [{ audio, stream, track }, setStream] = useState<UseAudioState>({});\n useEffect(() => {\n const ctx = new Context();\n\n scheduleTask(ctx, async () => {\n // TODO(wittjosiah): Fetch to external url fails in headless storybook test.\n try {\n const response = await fetch(audioUrl);\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n ctx.onDispose(() => {\n URL.revokeObjectURL(objectUrl);\n });\n\n const audio = new Audio();\n audio.src = objectUrl;\n\n await new Promise<void>((resolve, reject) => {\n audio.addEventListener(\n 'error',\n (err) => {\n log.error('error', { err });\n reject(err);\n },\n { once: true },\n );\n audio.addEventListener(\n 'canplay',\n async () => {\n resolve();\n },\n { once: true },\n );\n audio.load();\n });\n\n const audioCtx = new AudioContext();\n\n // Resume AudioContext if it's suspended.\n if (audioCtx.state === 'suspended') {\n await audioCtx.resume();\n }\n\n const destination = audioCtx.createMediaStreamDestination();\n destination.channelCount = 1;\n\n const source = audioCtx.createMediaElementSource(audio);\n source.connect(destination);\n const track = destination.stream.getAudioTracks()[0];\n if (constraints) {\n await track.applyConstraints(constraints).catch((err) => log.catch(err));\n }\n\n // Also connect to speakers so audio is audible.\n setStream({\n audio,\n stream: destination.stream,\n track: destination.stream.getAudioTracks()[0],\n });\n } catch (err) {\n log.catch(err);\n }\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [audioUrl]);\n\n return { audio, stream, track };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\n/**\n * Acquires a microphone audio track while `active`. Re-acquires when the `constraints` change (e.g.\n * a different input device is selected) so the new device takes effect without a remount.\n */\n// TODO(burdon): Reconcile with react-ui-experimental and plugin-calls.\nexport const useAudioTrack = (active?: boolean, constraints?: MediaTrackConstraints): MediaStreamTrack | undefined => {\n const [track, setTrack] = useState<MediaStreamTrack>();\n // Re-acquire on a value change, not on every re-created constraints object identity.\n const constraintsKey = constraints ? JSON.stringify(constraints) : '';\n useEffect(() => {\n if (!active) {\n track?.stop();\n setTrack(undefined);\n return;\n }\n\n let cancelled = false;\n let acquired: MediaStreamTrack | undefined;\n // Drop any previous (now-stopped) track while reacquiring, so callers never hold a dead track.\n setTrack(undefined);\n const initAudio = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: constraints ?? true });\n const [next] = stream.getAudioTracks();\n if (cancelled || !next) {\n next?.stop();\n return;\n }\n acquired = next;\n setTrack(next);\n } catch {\n // Permission denied / device unavailable: leave the track cleared rather than rejecting.\n if (!cancelled) {\n setTrack(undefined);\n }\n }\n };\n\n void initAudio();\n\n return () => {\n cancelled = true;\n acquired?.stop();\n };\n // `constraints` is read via the serialized `constraintsKey`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active, constraintsKey]);\n\n return track;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport type { Obj } from '@dxos/echo';\n\nimport { type ChunkRenderer, TranscriptModel } from '../model';\n\n/**\n * Feeds an array of objects (typically from `useQuery(db, Query.from(feed))`) into a\n * `TranscriptModel`, appending each new tail item as the array grows.\n *\n * @param renderer - chunk renderer.\n * @param objects - current snapshot of feed items.\n * @param initialChunks - chunks to seed the model with on first render.\n */\nexport const useFeedModelAdapter = <T extends Obj.Unknown>(\n renderer: ChunkRenderer<T>,\n objects: readonly T[],\n initialChunks: T[] = [],\n): TranscriptModel<T> => {\n const model = useMemo(() => new TranscriptModel<T>(renderer, initialChunks), [renderer]);\n\n // Seed the model with the current snapshot on first render and whenever the\n // identity of `objects` changes (e.g. feed swapped).\n useEffect(() => {\n for (const chunk of objects) {\n model.appendChunk(chunk);\n }\n }, [model, objects]);\n\n // Append new tail items as the array grows.\n useEffect(() => {\n if (model.chunks.length === objects.length) {\n return;\n }\n const chunk = objects.at(-1);\n if (chunk) {\n model.appendChunk(chunk);\n }\n }, [model, objects.length]);\n\n return model;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { SpeakingMonitor } from '@dxos/av';\nimport { Context } from '@dxos/context';\n\n/**\n * Tracks voice activity on an audio track via {@link SpeakingMonitor}.\n */\nexport const useIsSpeaking = (track?: MediaStreamTrack) => {\n const [isSpeaking, setIsSpeaking] = useState(false);\n const speakingMonitor = useMemo(() => {\n if (!track) {\n return;\n }\n\n return new SpeakingMonitor(track);\n }, [track]);\n\n useEffect(() => {\n if (!speakingMonitor) {\n return;\n }\n\n const ctx = new Context();\n scheduleTask(ctx, async () => {\n speakingMonitor.speakingChanged.on(ctx, () => setIsSpeaking(speakingMonitor.isSpeaking));\n await speakingMonitor.open();\n ctx.onDispose(() => speakingMonitor.close());\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [speakingMonitor]);\n\n return isSpeaking;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport {\n type AsrPipeline,\n type CommitFn,\n type EntityLookup,\n type Stage,\n type TranscribeConfig,\n runAsrPipeline,\n} from '@dxos/transcription-pipeline';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { MediaStreamRecorder } from '../capture';\nimport { type PipelinePhase } from '../types';\nimport { useAudioTrack } from './useAudioTrack';\n\n// Recorder chunk interval; the transcriber's chunk threshold derives from this.\nconst RECORDER_INTERVAL_MS = 200;\n\n// Silence reported on drain so on-silence stages (e.g. summarization) fire over the final window.\nconst DRAIN_SILENCE_MS = 5_000;\n\nconst DEFAULT_TRANSCRIBE_CONFIG: TranscribeConfig = {\n transcribeAfterChunksAmount: 50,\n prefixBufferChunksAmount: 10,\n};\n\nexport type RecordingPipelineOptions = {\n /** Override the transcriber chunk configuration. */\n config?: Partial<TranscribeConfig>;\n /** Re-segment ASR output into complete sentences before the pipeline (merges mid-sentence cuts). */\n segmentSentences?: boolean;\n /**\n * Raw capture flag — recording (mic) or playing (file). When it flips false the hook drains\n * (flushing the transcriber's buffered audio) before returning to idle.\n */\n active: boolean;\n /** Use the microphone as the ASR source; the hook owns the track and keeps it alive through drain. */\n microphone?: boolean;\n /** Externally-supplied track (file source). Used only when `microphone` is false. */\n track?: MediaStreamTrack;\n /** Audio constraints for the microphone source. */\n audioConstraints?: MediaTrackConstraints;\n /** Ordered pipeline stages applied to captured blocks. */\n stages: readonly Stage<any, any>[];\n /** Commit sink for enriched stage output. */\n commit: CommitFn;\n /** Optional entity-reference resolver injected into stages. */\n lookup?: EntityLookup;\n /** Optional raw-segment hook (pre-pipeline), e.g. for live display before enrichment. */\n onSegment?: (block: ContentBlock.Transcript) => void;\n};\n\nexport type RecordingPipeline = {\n /** Lifecycle phase (idle → recording → draining → idle). */\n phase: PipelinePhase;\n};\n\n/**\n * Single ASR-capture engine binding for React consumers: drives an {@link AsrPipeline}\n * ({@link runAsrPipeline}) off a capture flag, sourcing audio from the microphone (owned here) or an\n * external track. The editor driver, message-list recording, and stories all build on this — varying\n * only by source, stages, and commit sink.\n */\nexport const useRecordingPipeline = ({\n active,\n microphone,\n track: externalTrack,\n audioConstraints,\n stages,\n commit,\n lookup,\n onSegment,\n config,\n segmentSentences,\n}: RecordingPipelineOptions): RecordingPipeline => {\n // Phase machine: hold 'recording' for the commit when `active` flips off, then 'draining' until the\n // transcriber flushes, then 'idle' — so the tail of speech and its enrichment are not lost.\n const [phase, setPhase] = useState<PipelinePhase>('idle');\n const inUse = phase !== 'idle';\n useEffect(() => {\n setPhase((current) => (active ? 'recording' : current === 'recording' ? 'draining' : current));\n }, [active]);\n\n // Keep the mic alive through the drain; external (file) tracks are owned by the caller.\n const micTrack = useAudioTrack(!!microphone && inUse, audioConstraints);\n const track = microphone ? micTrack : externalTrack;\n\n // A fresh recorder per track so a stopped (encoder-flushed) instance is never reused.\n const recorder = useMemo(\n () =>\n track\n ? new MediaStreamRecorder({ mediaStreamTrack: track, config: { interval: RECORDER_INTERVAL_MS } })\n : undefined,\n [track],\n );\n\n const pipelineRef = useRef<AsrPipeline | null>(null);\n\n // Start a live ASR pipeline session when recording. Stages/commit/lookup are captured for the\n // lifetime of the session (a config change mid-recording would orphan the run).\n useEffect(() => {\n if (phase !== 'recording' || !recorder) {\n return;\n }\n const asr = runAsrPipeline({\n recorder,\n config: { ...DEFAULT_TRANSCRIBE_CONFIG, ...config },\n segmentSentences,\n stages,\n commit,\n lookup,\n onSegment,\n drainSilenceMs: DRAIN_SILENCE_MS,\n });\n pipelineRef.current = asr;\n let cancelled = false;\n void asr.open().then(\n () => {\n if (!cancelled) {\n asr.start();\n }\n },\n (err) => {\n if (!cancelled) {\n log.catch(err);\n setPhase('idle');\n }\n },\n );\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [phase, recorder]);\n\n // Drain on stop: flush buffered audio, signal silence, end the session.\n useEffect(() => {\n if (phase !== 'draining') {\n return;\n }\n let cancelled = false;\n void (async () => {\n try {\n await pipelineRef.current?.end();\n } catch (err) {\n log.catch(err);\n } finally {\n pipelineRef.current = null;\n if (!cancelled) {\n setPhase((current) => (current === 'draining' ? 'idle' : current));\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [phase]);\n\n return { phase };\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { log } from '@dxos/log';\n\nconst cleanText = (text: string) =>\n text\n .toLowerCase()\n .replace(/[.,!?]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n\nexport type UseSpeechRecognitionProps = {\n active: boolean;\n onTranscript: (transcript: string) => void;\n};\n\n/**\n * Use browser speech recognition API to transcribe speech to text.\n */\nexport const useSpeechRecognition = ({ active, onTranscript }: UseSpeechRecognitionProps) => {\n const recognition = useMemo(() => {\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n const SpeechGrammarList = (window as any).SpeechGrammarList || (window as any).webkitSpeechGrammarList;\n if (!SpeechRecognition || !SpeechGrammarList) {\n log.error('Speech recognition not supported');\n return;\n }\n\n return Object.assign(new SpeechRecognition(), {\n grammars: new SpeechGrammarList(),\n continuous: true,\n interimResults: true,\n lang: 'en-US',\n maxAlternatives: 1,\n onresult: (event: any) => {\n const transcript = cleanText(event.results[event.resultIndex][0].transcript);\n onTranscript(transcript);\n },\n onerror: (event: any) => {\n log.error('Speech recognition error', { error: event.error });\n },\n });\n }, [onTranscript]);\n\n useEffect(() => {\n if (active) {\n recognition?.start();\n } else {\n recognition?.stop();\n }\n }, [active, recognition]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { type Transcriber } from '@dxos/transcription-pipeline';\n\nimport { type CreateTranscriberOptions, createTranscriber } from '../capture';\n\n/**\n * Records audio while the user is speaking and transcribes it after they pause. Builds a\n * {@link Transcriber} directly from {@link createTranscriber} (no app-framework capability needed,\n * since the browser construction lives in this package); returns `undefined` until a track and\n * `onSegments` handler are supplied.\n */\nexport const useTranscriber = ({\n audioStreamTrack,\n recorderConfig,\n transcriberConfig,\n transcribe,\n onSegments,\n}: Partial<CreateTranscriberOptions>): Transcriber | undefined => {\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!audioStreamTrack || !onSegments) {\n return undefined;\n }\n\n return createTranscriber({\n audioStreamTrack,\n recorderConfig,\n transcriberConfig,\n transcribe,\n onSegments,\n });\n }, [audioStreamTrack, recorderConfig, transcriberConfig, transcribe, onSegments]);\n\n useEffect(() => {\n return () => {\n void transcriber?.close();\n };\n }, [transcriber]);\n\n return transcriber;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type Message } from '@dxos/types';\n\nexport const renderByline =\n (identities: Identity[]) =>\n (message: Message.Message, index: number, debug = false): string[] => {\n if (message.sender.role === 'assistant') {\n // Start/stop block.\n return [message.blocks.find((block) => block._tag === 'transcript')?.text ?? '', ''];\n }\n\n // TODO(burdon): Use link/reference markup for users (with popover).\n // TODO(burdon): Color and avatar.\n const identity = identities.find((identity) => identity.did === message.sender.identityDid);\n const name =\n identity?.profile?.displayName ??\n message.sender.contact?.target?.fullName ??\n message.sender.name ??\n message.sender.email ??\n message.sender.identityDid;\n const blocks = message.blocks.filter((block) => block._tag === 'transcript');\n return [\n // TODO(thure): Use an XML tag with the bits needed here.\n `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ''),\n blocks.map((block) => block.text.trim()).join(' '),\n '',\n ];\n };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Transcriber", "synchronized", "invariant", "log", "trace", "initializingPromise", "connect", "register", "MediaRecorderClass", "MediaRecorder", "_mediaStreamTrack", "_mediaRecorder", "_header", "undefined", "_onChunk", "mediaStreamTrack", "_config", "config", "settings", "channels", "sampleRate", "bitDepthCode", "setOnChunk", "onChunk", "err", "state", "mimeType", "recorder", "addEventListener", "once", "data", "uint8Array", "wav", "isHeader", "WaveFile", "slice", "timestamp", "getSamples", "resource", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "createTranscriber", "audioStreamTrack", "onSegments", "transcriberConfig", "recorderConfig", "transcribe", "Transcriber", "config", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "MediaStreamRecorder", "mediaStreamTrack", "interval", "React", "DropdownMenu", "Icon", "IconButton", "useTranslation", "MicSettings", "translationNs", "recordMode", "entityExtraction", "devices", "selectedDeviceId", "onRecordModeChange", "onEntityExtractionChange", "onSelectDevice", "t", "Root", "Trigger", "asChild", "icon", "iconOnly", "label", "variant", "classNames", "data-testid", "Portal", "Content", "Viewport", "GroupLabel", "SelectableItem", "selected", "onSelect", "Separator", "map", "device", "key", "deviceId", "CheckboxItem", "checked", "onCheckedChange", "span", "className", "ItemIndicator", "size", "Arrow", "Item", "React", "Fragment", "PipelineStatus", "phase", "stages", "telemetry", "summary", "div", "className", "Section", "title", "span", "join", "length", "map", "event", "index", "key", "stageId", "outcome", "durationMs", "p", "children", "h3", "React", "composable", "composableProps", "useThemeContext", "useTextEditor", "AnchorWidget", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "decorateMarkdown", "documentSlots", "scroller", "xmlTags", "RangeSetBuilder", "EditorView", "GutterMarker", "ViewPlugin", "gutter", "format", "intervalToDuration", "addEventListener", "combine", "Text", "Event", "invariant", "log", "__dxlog_file", "_view", "replaceLines", "from", "remove", "insert", "count", "state", "posFrom", "line", "posTo", "text", "dispatch", "_chunkLineCounts", "_lineToChunk", "_changes", "_renderer", "initialChunks", "forEach", "chunk", "appendChunk", "toJSON", "chunks", "changes", "doc", "reset", "clear", "update", "_chunks", "push", "type", "index", "updateChunk", "deleteBlock", "splice", "id", "change", "document", "lastLine", "lines", "lineStart", "previousLineCount", "get", "newLines", "currentLine", "lineCount", "set", "chunkIds", "transcription", "model", "started", "gutter", "class", "lineMarkerChange", "update", "docChanged", "viewportChanged", "markers", "view", "start", "getStartTime", "chunks", "builder", "RangeSetBuilder", "from", "to", "visibleRanges", "line", "state", "doc", "lineAt", "block", "getChunkAtLine", "number", "blocks", "timestamp", "_tag", "add", "TimestampMarker", "Date", "length", "finish", "ViewPlugin", "fromClass", "_controls", "_cleanup", "_adapter", "_initialized", "EditorChunkDocument", "scroller", "scrollDOM", "isAutoScrolling", "hasScrolled", "timeout", "scrollToBottom", "smooth", "style", "scrollBehavior", "classList", "clearTimeout", "setTimeout", "remove", "dispatch", "effects", "EditorView", "scrollIntoView", "y", "combine", "addEventListener", "on", "autoScroll", "scrollHeight", "scrollTop", "clientHeight", "sync", "_update", "destroy", "theme", "backgroundColor", "width", "paddingLeft", "paddingRight", "display", "textAlign", "padding", "GutterMarker", "_line", "_timestamp", "_started", "eq", "other", "toDOM", "el", "document", "createElement", "className", "textContent", "formatTimestamp", "onclick", "pos", "message", "undefined", "relative", "pad", "n", "String", "padStart", "hours", "minutes", "seconds", "intervalToDuration", "end", "format", "inlinePreviewRegistry", "block", "urlSchemes", "factory", "label", "dxn", "AnchorWidget", "Transcription", "composable", "transcript", "object", "model", "children", "props", "forwardedRef", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "extensions", "createBasicExtensions", "readOnly", "lineWrapping", "search", "createThemeExtensions", "slots", "documentSlots", "createMarkdownExtensions", "decorateMarkdown", "skip", "url", "startsWith", "xmlTags", "registry", "transcription", "started", "Date", "undefined", "scroller", "React", "div", "composableProps", "classNames", "data-popover-collision-boundary", "ref", "useEffect", "useState", "scheduleTask", "Context", "log", "__dxlog_file", "useAudioFile", "objectUrl", "createObjectURL", "ctx", "onDispose", "URL", "revokeObjectURL", "audio", "Audio", "Promise", "resolve", "addEventListener", "err", "reject", "once", "audioCtx", "state", "destination", "source", "createMediaElementSource", "connect", "track", "constraints", "applyConstraints", "catch", "setStream", "stream", "audioUrl", "useEffect", "useState", "useAudioTrack", "active", "constraints", "track", "setTrack", "constraintsKey", "JSON", "stringify", "stop", "undefined", "cancelled", "acquired", "initAudio", "stream", "navigator", "mediaDevices", "getUserMedia", "audio", "next", "getAudioTracks", "useEffect", "useMemo", "useFeedModelAdapter", "renderer", "objects", "initialChunks", "model", "useMemo", "TranscriptModel", "useEffect", "chunk", "appendChunk", "chunks", "length", "at", "useEffect", "useMemo", "useState", "scheduleTask", "SpeakingMonitor", "Context", "__dxlog_file", "speakingMonitor", "track", "speakingChanged", "ctx", "setIsSpeaking", "open", "close", "useEffect", "useMemo", "useRef", "useState", "log", "runAsrPipeline", "__dxlog_file", "DRAIN_SILENCE_MS", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "useEffect", "useState", "setPhase", "current", "active", "recorder", "useMemo", "RECORDER_INTERVAL_MS", "undefined", "track", "config", "segmentSentences", "stages", "commit", "lookup", "onSegment", "drainSilenceMs", "pipelineRef", "open", "cancelled", "asr", "start", "err", "log", "catch", "phase", "useEffect", "useMemo", "log", "__dxlog_file", "cleanText", "SpeechRecognition", "window", "SpeechGrammarList", "continuous", "interimResults", "lang", "maxAlternatives", "onresult", "transcript", "onTranscript", "onerror", "event", "error", "recognition", "stop", "active", "useEffect", "useMemo", "useTranscriber", "audioStreamTrack", "recorderConfig", "transcriberConfig", "transcribe", "onSegments", "transcriber", "useMemo", "undefined", "createTranscriber", "useEffect", "close", "renderByline", "identities", "message", "index", "debug", "sender", "role", "blocks", "find", "block", "_tag", "text", "identity", "did", "identityDid", "name", "profile", "displayName", "contact", "target", "fullName", "email", "filter", "id", "map", "trim", "join"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"inputs":{"src/capture/media-stream-recorder.ts":{"bytes":16870,"imports":[{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"extendable-media-recorder","kind":"dynamic-import","external":true},{"path":"extendable-media-recorder-wav-encoder","kind":"dynamic-import","external":true}],"format":"esm"},"src/capture/create-transcriber.ts":{"bytes":4899,"imports":[{"path":"@dxos/transcription-pipeline","kind":"import-statement","external":true},{"path":"src/capture/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"}],"format":"esm"},"src/capture/index.ts":{"bytes":523,"imports":[{"path":"src/capture/create-transcriber.ts","kind":"import-statement","original":"./create-transcriber"},{"path":"src/capture/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"}],"format":"esm"},"src/components/MicSettings/MicSettings.tsx":{"bytes":12439,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"src/components/MicSettings/index.ts":{"bytes":387,"imports":[{"path":"src/components/MicSettings/MicSettings.tsx","kind":"import-statement","original":"./MicSettings"}],"format":"esm"},"src/components/PipelineStatus/PipelineStatus.tsx":{"bytes":7080,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/PipelineStatus/index.ts":{"bytes":394,"imports":[{"path":"src/components/PipelineStatus/PipelineStatus.tsx","kind":"import-statement","original":"./PipelineStatus"}],"format":"esm"},"src/model/transcript-model.ts":{"bytes":23259,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/model/index.ts":{"bytes":396,"imports":[{"path":"src/model/transcript-model.ts","kind":"import-statement","original":"./transcript-model"}],"format":"esm"},"src/components/Transcription/transcription-extension.ts":{"bytes":21401,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/intervalToDuration","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"src/model/index.ts","kind":"import-statement","original":"../../model"}],"format":"esm"},"src/components/Transcription/Transcription.tsx":{"bytes":7686,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"src/components/Transcription/transcription-extension.ts","kind":"import-statement","original":"./transcription-extension"}],"format":"esm"},"src/components/Transcription/index.ts":{"bytes":516,"imports":[{"path":"src/components/Transcription/Transcription.tsx","kind":"import-statement","original":"./Transcription"},{"path":"src/components/Transcription/transcription-extension.ts","kind":"import-statement","original":"./transcription-extension"}],"format":"esm"},"src/components/index.ts":{"bytes":594,"imports":[{"path":"src/components/MicSettings/index.ts","kind":"import-statement","original":"./MicSettings"},{"path":"src/components/PipelineStatus/index.ts","kind":"import-statement","original":"./PipelineStatus"},{"path":"src/components/Transcription/index.ts","kind":"import-statement","original":"./Transcription"}],"format":"esm"},"src/hooks/useAudioFile.ts":{"bytes":9098,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useAudioTrack.ts":{"bytes":5954,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useFeedModelAdapter.ts":{"bytes":4236,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/model/index.ts","kind":"import-statement","original":"../model"}],"format":"esm"},"src/hooks/useIsSpeaking.ts":{"bytes":3896,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/av","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRecordingPipeline.ts":{"bytes":14853,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/transcription-pipeline","kind":"import-statement","external":true},{"path":"src/capture/index.ts","kind":"import-statement","original":"../capture"},{"path":"src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"}],"format":"esm"},"src/hooks/useSpeechRecognition.ts":{"bytes":5846,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useTranscriber.ts":{"bytes":3924,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/capture/index.ts","kind":"import-statement","original":"../capture"}],"format":"esm"},"src/hooks/index.ts":{"bytes":1051,"imports":[{"path":"src/hooks/useAudioFile.ts","kind":"import-statement","original":"./useAudioFile"},{"path":"src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"src/hooks/useFeedModelAdapter.ts","kind":"import-statement","original":"./useFeedModelAdapter"},{"path":"src/hooks/useIsSpeaking.ts","kind":"import-statement","original":"./useIsSpeaking"},{"path":"src/hooks/useRecordingPipeline.ts","kind":"import-statement","original":"./useRecordingPipeline"},{"path":"src/hooks/useSpeechRecognition.ts","kind":"import-statement","original":"./useSpeechRecognition"},{"path":"src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"}],"format":"esm"},"src/util/render-byline.ts":{"bytes":4251,"imports":[],"format":"esm"},"src/util/index.ts":{"bytes":389,"imports":[{"path":"src/util/render-byline.ts","kind":"import-statement","original":"./render-byline"}],"format":"esm"},"src/types.ts":{"bytes":519,"imports":[],"format":"esm"},"src/index.ts":{"bytes":788,"imports":[{"path":"src/capture/index.ts","kind":"import-statement","original":"./capture"},{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"src/model/index.ts","kind":"import-statement","original":"./model"},{"path":"src/util/index.ts","kind":"import-statement","original":"./util"},{"path":"src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":71817},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/transcription-pipeline","kind":"import-statement","external":true},{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"extendable-media-recorder","kind":"dynamic-import","external":true},{"path":"extendable-media-recorder-wav-encoder","kind":"dynamic-import","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/intervalToDuration","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/av","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/transcription-pipeline","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["EditorChunkDocument","MediaStreamRecorder","MicSettings","PipelineStatus","TranscriptModel","Transcription","createTranscriber","renderByline","transcription","useAudioFile","useAudioTrack","useFeedModelAdapter","useIsSpeaking","useRecordingPipeline","useSpeechRecognition","useTranscriber"],"entryPoint":"src/index.ts","inputs":{"src/capture/create-transcriber.ts":{"bytesInOutput":641},"src/capture/media-stream-recorder.ts":{"bytesInOutput":4713},"src/capture/index.ts":{"bytesInOutput":0},"src/index.ts":{"bytesInOutput":0},"src/components/MicSettings/MicSettings.tsx":{"bytesInOutput":3041},"src/components/MicSettings/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0},"src/components/PipelineStatus/PipelineStatus.tsx":{"bytesInOutput":1889},"src/components/PipelineStatus/index.ts":{"bytesInOutput":0},"src/components/Transcription/Transcription.tsx":{"bytesInOutput":1761},"src/components/Transcription/transcription-extension.ts":{"bytesInOutput":4807},"src/model/transcript-model.ts":{"bytesInOutput":5164},"src/model/index.ts":{"bytesInOutput":0},"src/components/Transcription/index.ts":{"bytesInOutput":0},"src/hooks/useAudioFile.ts":{"bytesInOutput":2338},"src/hooks/index.ts":{"bytesInOutput":0},"src/hooks/useAudioTrack.ts":{"bytesInOutput":1006},"src/hooks/useFeedModelAdapter.ts":{"bytesInOutput":598},"src/hooks/useIsSpeaking.ts":{"bytesInOutput":1081},"src/hooks/useRecordingPipeline.ts":{"bytesInOutput":2552},"src/hooks/useSpeechRecognition.ts":{"bytesInOutput":1526},"src/hooks/useTranscriber.ts":{"bytesInOutput":676},"src/util/render-byline.ts":{"bytesInOutput":785},"src/util/index.ts":{"bytesInOutput":0}},"bytes":33671}}}
|