@dxos/plugin-transcription 0.8.0 → 0.8.1-main.a06ad20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs → TranscriptContainer-N4KQHMY4.mjs} +2 -2
  2. package/dist/lib/browser/{chunk-AS364WZZ.mjs → chunk-BDVUIRBP.mjs} +2 -2
  3. package/dist/lib/browser/chunk-GHTRJTEB.mjs +35 -0
  4. package/dist/lib/browser/chunk-GHTRJTEB.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-R4HHS6FA.mjs → chunk-YX447BJ4.mjs} +16 -16
  6. package/dist/lib/browser/chunk-YX447BJ4.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +180 -72
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/{intent-resolver-EAR2TFK2.mjs → intent-resolver-RW6DEJC2.mjs} +2 -2
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs → react-surface-UPTZBHVB.mjs} +3 -3
  12. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-4BWXOVML.cjs} +7 -7
  13. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-4BWXOVML.cjs.map} +2 -2
  14. package/dist/lib/node/{chunk-YV74Z74I.cjs → chunk-ANSWGFMS.cjs} +18 -18
  15. package/dist/lib/node/chunk-ANSWGFMS.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-JBN3P6ZF.cjs → chunk-HDRXDMK2.cjs} +4 -46
  17. package/dist/lib/node/chunk-HDRXDMK2.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-I35KHI2G.cjs} +5 -5
  19. package/dist/lib/node/index.cjs +182 -74
  20. package/dist/lib/node/index.cjs.map +4 -4
  21. package/dist/lib/node/{intent-resolver-3KJZGGUQ.cjs → intent-resolver-KLBZ25XJ.cjs} +7 -7
  22. package/dist/lib/node/meta.json +1 -1
  23. package/dist/lib/node/{react-surface-AGGGDOUC.cjs → react-surface-NCKXB7EQ.cjs} +7 -7
  24. package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs → TranscriptContainer-6IKRASR6.mjs} +2 -2
  25. package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-2CPKXRN6.mjs} +2 -2
  26. package/dist/lib/node-esm/chunk-LORUIVS4.mjs +37 -0
  27. package/dist/lib/node-esm/chunk-LORUIVS4.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-36EQXBWR.mjs → chunk-ZMK2QLW2.mjs} +16 -16
  29. package/dist/lib/node-esm/chunk-ZMK2QLW2.mjs.map +7 -0
  30. package/dist/lib/node-esm/index.mjs +180 -72
  31. package/dist/lib/node-esm/index.mjs.map +4 -4
  32. package/dist/lib/node-esm/{intent-resolver-UGLYRD4X.mjs → intent-resolver-4FMISUPW.mjs} +2 -2
  33. package/dist/lib/node-esm/meta.json +1 -1
  34. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs → react-surface-2WJQ67LB.mjs} +3 -3
  35. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  36. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  37. package/dist/types/src/components/transcription.stories.d.ts +2 -1
  38. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  39. package/dist/types/src/hooks/index.d.ts +0 -1
  40. package/dist/types/src/hooks/index.d.ts.map +1 -1
  41. package/dist/types/src/index.d.ts +1 -0
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
  44. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  45. package/dist/types/src/transcription-manager.d.ts +36 -0
  46. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  47. package/package.json +37 -37
  48. package/src/components/TranscriptContainer.tsx +11 -15
  49. package/src/hooks/index.ts +0 -1
  50. package/src/index.ts +1 -0
  51. package/src/transcriber/media-stream-recorder.ts +4 -0
  52. package/src/transcription-manager.ts +173 -0
  53. package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
  54. package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
  55. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
  56. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
  57. package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
  58. package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
  59. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
  60. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
  61. package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
  62. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
  63. package/src/hooks/useIsSpeaking.ts +0 -77
  64. /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-N4KQHMY4.mjs.map} +0 -0
  65. /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-BDVUIRBP.mjs.map} +0 -0
  66. /package/dist/lib/browser/{intent-resolver-EAR2TFK2.mjs.map → intent-resolver-RW6DEJC2.mjs.map} +0 -0
  67. /package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-UPTZBHVB.mjs.map} +0 -0
  68. /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-I35KHI2G.cjs.map} +0 -0
  69. /package/dist/lib/node/{intent-resolver-3KJZGGUQ.cjs.map → intent-resolver-KLBZ25XJ.cjs.map} +0 -0
  70. /package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-NCKXB7EQ.cjs.map} +0 -0
  71. /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-6IKRASR6.mjs.map} +0 -0
  72. /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-2CPKXRN6.mjs.map} +0 -0
  73. /package/dist/lib/node-esm/{intent-resolver-UGLYRD4X.mjs.map → intent-resolver-4FMISUPW.mjs.map} +0 -0
  74. /package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-2WJQ67LB.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/capabilities/index.ts", "../../../src/capabilities/capabilities.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useIsSpeaking.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/hooks/useVoiceInput.ts", "../../../src/TranscriptionPlugin.tsx", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\nexport namespace TranscriptionCapabilities {\n // TODO(burdon): Currently this is just a marker; adapt useVoiceInput to use this.\n export const Transcription = defineCapability<null>(`${TRANSCRIPTION_PLUGIN}/capability/transcription`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\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): UseAudioState => {\n const [{ audio, stream, track }, setStream] = useState<UseAudioState>({});\n useEffect(() => {\n const t = setTimeout(async () => {\n const response = await fetch(audioUrl);\n const blob = await response.blob();\n const audio = new Audio();\n audio.src = URL.createObjectURL(blob);\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 () => {\n log.info('starting...');\n resolve();\n },\n { once: true },\n );\n audio.load();\n });\n\n const ctx = new AudioContext();\n\n const destination = ctx.createMediaStreamDestination();\n destination.channelCount = 1;\n\n const source = ctx.createMediaElementSource(audio);\n source.connect(destination);\n\n setStream({\n audio,\n stream: destination.stream,\n track: destination.stream.getAudioTracks()[0],\n });\n });\n\n return () => clearTimeout(t);\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 *\n */\n// TODO(burdon): Reconcile with react-ui-sfx and plugin-calls.\nexport const useAudioTrack = (active?: boolean): MediaStreamTrack | undefined => {\n const [track, setTrack] = useState<MediaStreamTrack>();\n useEffect(() => {\n if (!active) {\n track?.stop();\n setTrack(undefined);\n return;\n }\n\n const initAudio = async () => {\n const audio = new Audio();\n audio.srcObject = await navigator.mediaDevices.getUserMedia({ audio: true });\n const [track] = audio.srcObject.getAudioTracks();\n if (track) {\n setTrack(track);\n }\n };\n\n if (active) {\n void initAudio();\n }\n }, [active]);\n\n return track;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { monitorAudioLevel } from '../util';\n\nexport const useIsSpeaking = (mediaStreamTrack?: MediaStreamTrack) => {\n const [isSpeaking, setIsSpeaking] = useState(false);\n\n // The audio level is monitored very rapidly, and we don't want\n // react involved in tracking the state because it causes way\n // too many re-renders. To work around this, we use the isSpeakingRef\n // to track the state and then sync it using another effect.\n const isSpeakingRef = useRef(isSpeaking);\n\n // this effect syncs the state on a 50ms interval\n useEffect(() => {\n if (!mediaStreamTrack) {\n setIsSpeaking(false);\n return;\n }\n\n isSpeakingRef.current = isSpeaking;\n const interval = window.setInterval(() => {\n // state is already in sync do nothing\n if (isSpeaking === isSpeakingRef.current) {\n return;\n }\n\n // sync state\n setIsSpeaking(isSpeakingRef.current);\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [isSpeaking, isSpeakingRef, mediaStreamTrack]);\n\n useEffect(() => {\n if (!mediaStreamTrack) {\n return;\n }\n\n let timeout = -1;\n const cleanup = monitorAudioLevel({\n mediaStreamTrack,\n onMeasure: (vol) => {\n // Once the user has been determined to be speaking, we want\n // to lower the threshold because speech patterns don't always\n // kick up above 0.05\n const audioLevelAboveThreshold = vol > (isSpeakingRef.current ? 0.02 : 0.05);\n if (audioLevelAboveThreshold) {\n // user is still speaking, clear timeout & reset.\n clearTimeout(timeout);\n timeout = -1;\n // track state.\n isSpeakingRef.current = true;\n } else if (timeout === -1) {\n // user is not speaking and timeout is not set.\n timeout = window.setTimeout(() => {\n isSpeakingRef.current = false;\n // reset timeout\n timeout = -1;\n }, 1_000);\n }\n },\n });\n\n return () => {\n cleanup();\n };\n }, [isSpeaking, mediaStreamTrack]);\n\n return isSpeaking;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { MediaStreamRecorder, Transcriber, type TranscriberParams } from '../transcriber';\n\n// TODO(burdon): Move to config?\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type UseTranscriberProps = {\n audioStreamTrack?: MediaStreamTrack;\n onSegments?: TranscriberParams['onSegments'];\n};\n\n/**\n * Records audio while user is speaking and transcribes it after user is done speaking.\n */\nexport const useTranscriber = ({ audioStreamTrack, onSegments }: UseTranscriberProps) => {\n // Initialize audio transcription.\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!onSegments || !audioStreamTrack) {\n return undefined;\n }\n\n return new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: new MediaStreamRecorder({\n mediaStreamTrack: audioStreamTrack,\n interval: RECORD_INTERVAL,\n }),\n onSegments,\n });\n }, [audioStreamTrack, 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 IBlobEvent, type IMediaRecorder, MediaRecorder, register } 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';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\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 _interval: number;\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._interval = interval;\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 setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start() {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._interval);\n }\n\n async stop() {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent) {\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 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n onSegments: (segments: TranscriptSegment[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context) {\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n this._recording = false;\n this._transcribeTask?.schedule();\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe() {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks() {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]) {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string) {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error('Failed to transcribe');\n }\n\n const {\n segments,\n }: {\n segments: WhisperSegment[];\n } = await response.json();\n\n log.info('transcription response', {\n segments,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n started: new Date(zeroTimestamp + segment.start * 1_000),\n text: segment.text,\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useState, useEffect, useCallback } from 'react';\n\nimport { scheduleMicroTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\n\nimport { useAudioTrack } from './useAudioTrack';\nimport { useTranscriber } from './useTranscriber';\nimport { type TranscriberParams } from '../transcriber';\n\nexport type UseVoiceInputProps = {\n active?: boolean;\n onUpdate: (text: string) => void;\n};\n\n/**\n * Hook for voice input.\n */\nexport const useVoiceInput = ({ active, onUpdate }: UseVoiceInputProps) => {\n const soundStart = useSoundEffect('StartRecording');\n const soundStop = useSoundEffect('StopRecording');\n\n const handleSegments = useCallback<TranscriberParams['onSegments']>(async (segments) => {\n const text = segments.map((str) => str.text.trim().replace(/[^\\w\\s]/g, '')).join(' ');\n onUpdate(text);\n }, []);\n\n // Audio/transcription.\n const [recording, setRecording] = useState(false);\n const track = useAudioTrack(active);\n const transcriber = useTranscriber({\n audioStreamTrack: track,\n onSegments: handleSegments,\n });\n\n // Start/stop transcription.\n useEffect(() => {\n const ctx = new Context();\n scheduleMicroTask(ctx, async () => {\n if (active && transcriber) {\n await transcriber.open();\n log.info('starting...');\n setRecording(true);\n void soundStart.play();\n transcriber.startChunksRecording();\n } else if (!active && transcriber?.isOpen) {\n transcriber?.stopChunksRecording();\n await transcriber?.close();\n log.info('stopped');\n setRecording(false);\n void soundStop.play();\n }\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [active, transcriber]);\n\n return { recording };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, Events, contributes, defineModule, definePlugin } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\n\nimport { AppGraphBuilder, IntentResolver, ReactSurface, TranscriptionCapabilities } from './capabilities';\nimport { meta, TRANSCRIPTION_PLUGIN } from './meta';\nimport translations from './translations';\nimport { TranscriptType } from './types';\n\nexport const TranscriptionPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, translations),\n }),\n defineModule({\n id: `${meta.id}/module/transcription`,\n activatesOn: Events.Startup,\n activate: () => contributes(TranscriptionCapabilities.Transcription, null),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () =>\n contributes(Capabilities.Metadata, {\n id: TranscriptType.typename,\n metadata: {\n placeholder: ['transcript title placeholder', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n },\n }),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => [contributes(ClientCapabilities.Schema, [TranscriptType])],\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { TRANSCRIPTION_PLUGIN } from './meta';\nimport { TranscriptType } from './types';\n\nexport default [\n {\n 'en-US': {\n [TranscriptType.typename]: {\n 'typename label': 'Transcript',\n },\n [TRANSCRIPTION_PLUGIN]: {\n 'plugin name': 'Transcription',\n 'calls label': 'Transcript',\n 'calls panel label': 'Transcription',\n 'create calls label': 'Create transcription',\n 'delete calls label': 'Delete',\n\n 'delete button': 'Delete',\n 'bookmark button': 'Bookmark',\n 'summary button': 'Create summary',\n 'summarizing label': 'Summarizing...',\n },\n },\n },\n];\n"],
5
- "mappings": "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",
6
- "names": ["import_app_framework", "import_react", "import_log", "import_wavefile", "import_async", "import_tracing", "import_context", "TranscriptionCapabilities", "Transcription", "defineCapability", "TRANSCRIPTION_PLUGIN", "AppGraphBuilder", "lazy", "IntentResolver", "ReactSurface", "useAudioFile", "audioUrl", "audio", "stream", "track", "setStream", "useState", "useEffect", "t", "setTimeout", "response", "fetch", "blob", "Audio", "src", "URL", "createObjectURL", "Promise", "resolve", "reject", "addEventListener", "err", "log", "error", "once", "info", "load", "ctx", "AudioContext", "destination", "createMediaStreamDestination", "channelCount", "source", "createMediaElementSource", "connect", "getAudioTracks", "clearTimeout", "useAudioTrack", "active", "setTrack", "stop", "undefined", "initAudio", "srcObject", "navigator", "mediaDevices", "getUserMedia", "useIsSpeaking", "mediaStreamTrack", "isSpeaking", "setIsSpeaking", "isSpeakingRef", "useRef", "current", "interval", "window", "setInterval", "clearInterval", "timeout", "cleanup", "monitorAudioLevel", "onMeasure", "vol", "audioLevelAboveThreshold", "initializingPromise", "initializeExtendableMediaRecorder", "register", "MediaStreamRecorder", "constructor", "_mediaRecorder", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "MediaStream", "MediaRecorder", "mimeType", "state", "invariant", "ondataavailable", "event", "_ondataavailable", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "WaveFile", "slice", "warn", "timestamp", "Date", "now", "getSamples", "synchronized", "trace", "resource", "Transcriber", "Resource", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "_config", "_recorder", "_onSegments", "_open", "chunk", "_saveAudioChunk", "DeferredTask", "_transcribe", "wake", "_close", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "length", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "file", "fromScratch", "mergeFloat64Arrays", "map", "toBase64", "Error", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "json", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "filteredSegments", "filter", "segment", "end", "words", "word", "started", "span", "showInBrowserTimeline", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "useTranscriber", "audioStreamTrack", "transcriber", "useMemo", "close", "useVoiceInput", "onUpdate", "soundStart", "useSoundEffect", "soundStop", "handleSegments", "useCallback", "str", "trim", "replace", "recording", "setRecording", "Context", "scheduleMicroTask", "open", "play", "isOpen", "dispose", "TranscriptType", "typename", "TranscriptionPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "SetupTranslations", "activate", "contributes", "Capabilities", "Translations", "translations", "Startup", "SetupMetadata", "Metadata", "metadata", "placeholder", "ns", "icon", "ClientEvents", "SetupSchema", "ClientCapabilities", "Schema", "SetupReactSurface", "SetupIntentResolver", "SetupAppGraph"]
3
+ "sources": ["../../../src/capabilities/index.ts", "../../../src/capabilities/capabilities.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/hooks/useVoiceInput.ts", "../../../src/transcription-manager.ts", "../../../src/TranscriptionPlugin.tsx", "../../../src/translations.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\nexport namespace TranscriptionCapabilities {\n // TODO(burdon): Currently this is just a marker; adapt useVoiceInput to use this.\n export const Transcription = defineCapability<null>(`${TRANSCRIPTION_PLUGIN}/capability/transcription`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\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): UseAudioState => {\n const [{ audio, stream, track }, setStream] = useState<UseAudioState>({});\n useEffect(() => {\n const t = setTimeout(async () => {\n const response = await fetch(audioUrl);\n const blob = await response.blob();\n const audio = new Audio();\n audio.src = URL.createObjectURL(blob);\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 () => {\n log.info('starting...');\n resolve();\n },\n { once: true },\n );\n audio.load();\n });\n\n const ctx = new AudioContext();\n\n const destination = ctx.createMediaStreamDestination();\n destination.channelCount = 1;\n\n const source = ctx.createMediaElementSource(audio);\n source.connect(destination);\n\n setStream({\n audio,\n stream: destination.stream,\n track: destination.stream.getAudioTracks()[0],\n });\n });\n\n return () => clearTimeout(t);\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 *\n */\n// TODO(burdon): Reconcile with react-ui-sfx and plugin-calls.\nexport const useAudioTrack = (active?: boolean): MediaStreamTrack | undefined => {\n const [track, setTrack] = useState<MediaStreamTrack>();\n useEffect(() => {\n if (!active) {\n track?.stop();\n setTrack(undefined);\n return;\n }\n\n const initAudio = async () => {\n const audio = new Audio();\n audio.srcObject = await navigator.mediaDevices.getUserMedia({ audio: true });\n const [track] = audio.srcObject.getAudioTracks();\n if (track) {\n setTrack(track);\n }\n };\n\n if (active) {\n void initAudio();\n }\n }, [active]);\n\n return track;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { MediaStreamRecorder, Transcriber, type TranscriberParams } from '../transcriber';\n\n// TODO(burdon): Move to config?\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type UseTranscriberProps = {\n audioStreamTrack?: MediaStreamTrack;\n onSegments?: TranscriberParams['onSegments'];\n};\n\n/**\n * Records audio while user is speaking and transcribes it after user is done speaking.\n */\nexport const useTranscriber = ({ audioStreamTrack, onSegments }: UseTranscriberProps) => {\n // Initialize audio transcription.\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!onSegments || !audioStreamTrack) {\n return undefined;\n }\n\n return new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: new MediaStreamRecorder({\n mediaStreamTrack: audioStreamTrack,\n interval: RECORD_INTERVAL,\n }),\n onSegments,\n });\n }, [audioStreamTrack, 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 IBlobEvent, type IMediaRecorder, MediaRecorder, register } 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';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\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 _interval: number;\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._interval = interval;\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 async start() {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._interval);\n }\n\n async stop() {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent) {\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 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n onSegments: (segments: TranscriptSegment[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context) {\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n this._recording = false;\n this._transcribeTask?.schedule();\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe() {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks() {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]) {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string) {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error('Failed to transcribe');\n }\n\n const {\n segments,\n }: {\n segments: WhisperSegment[];\n } = await response.json();\n\n log.info('transcription response', {\n segments,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n started: new Date(zeroTimestamp + segment.start * 1_000),\n text: segment.text,\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useState, useEffect, useCallback } from 'react';\n\nimport { scheduleMicroTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\n\nimport { useAudioTrack } from './useAudioTrack';\nimport { useTranscriber } from './useTranscriber';\nimport { type TranscriberParams } from '../transcriber';\n\nexport type UseVoiceInputProps = {\n active?: boolean;\n onUpdate: (text: string) => void;\n};\n\n/**\n * Hook for voice input.\n */\nexport const useVoiceInput = ({ active, onUpdate }: UseVoiceInputProps) => {\n const soundStart = useSoundEffect('StartRecording');\n const soundStop = useSoundEffect('StopRecording');\n\n const handleSegments = useCallback<TranscriberParams['onSegments']>(async (segments) => {\n const text = segments.map((str) => str.text.trim().replace(/[^\\w\\s]/g, '')).join(' ');\n onUpdate(text);\n }, []);\n\n // Audio/transcription.\n const [recording, setRecording] = useState(false);\n const track = useAudioTrack(active);\n const transcriber = useTranscriber({\n audioStreamTrack: track,\n onSegments: handleSegments,\n });\n\n // Start/stop transcription.\n useEffect(() => {\n const ctx = new Context();\n scheduleMicroTask(ctx, async () => {\n if (active && transcriber) {\n await transcriber.open();\n log.info('starting...');\n setRecording(true);\n void soundStart.play();\n transcriber.startChunksRecording();\n } else if (!active && transcriber?.isOpen) {\n transcriber?.stopChunksRecording();\n await transcriber?.close();\n log.info('stopped');\n setRecording(false);\n void soundStop.play();\n }\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [active, transcriber]);\n\n return { recording };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { synchronized } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { QueueImpl, type Queue } from '@dxos/echo-db';\nimport { createStatic } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\n\nimport { MediaStreamRecorder, Transcriber } from './transcriber';\nimport { TranscriptBlock, type TranscriptSegment } from './types';\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\n/**\n * Manages transcription state.\n */\n// TODO(mykola): Reconcile with useTranscriber hook.\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _name?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _enabled = false;\n private _queue?: Queue<TranscriptBlock> = undefined;\n\n constructor(edgeClient: EdgeHttpClient) {\n super();\n this._edgeClient = edgeClient;\n }\n\n protected override async _open() {\n await this._toggleTranscriber();\n }\n\n protected override async _close() {\n void this._transcriber?.close();\n }\n\n @synchronized\n setRecording(recording?: boolean) {\n if (!this.isOpen || !this._enabled) {\n return;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n }\n\n /**\n * Enable or disable transcription.\n * @param enabled - Whether to enable transcription.\n */\n @synchronized\n async setEnabled(enabled?: boolean) {\n if (this._enabled === enabled) {\n return;\n }\n this._enabled = enabled ?? false;\n this.isOpen && (await this._toggleTranscriber());\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack) {\n if (this._audioStreamTrack === track) {\n return;\n }\n this._audioStreamTrack = track;\n this.isOpen && (await this._toggleTranscriber());\n }\n\n /**\n * Set the queue to save the transcription to.\n * @param queue - The queue to save the transcription to or the DXN of the queue.\n */\n @synchronized\n setQueue(queue?: Queue<TranscriptBlock> | string) {\n switch (typeof queue) {\n case 'string':\n if (this._queue?.dxn.toString() === queue) {\n return;\n }\n this._queue = new QueueImpl<TranscriptBlock>(this._edgeClient, DXN.parse(queue));\n break;\n case 'object':\n if (this._queue === queue) {\n return;\n }\n invariant(queue instanceof QueueImpl);\n this._queue = queue;\n break;\n case 'undefined':\n this._queue = undefined;\n break;\n }\n }\n\n @synchronized\n setName(name: string) {\n if (this._name === name) {\n return;\n }\n this._name = name;\n }\n\n private async _toggleTranscriber() {\n await this._maybeReinitTranscriber();\n\n // Open or close transcriber if transcription is enabled or disabled.\n if (this._enabled) {\n await this._transcriber?.open();\n } else {\n await this._transcriber?.close();\n }\n }\n\n private async _maybeReinitTranscriber() {\n if (!this._audioStreamTrack || !this._enabled) {\n return;\n }\n\n // Reinitialize transcriber if queue or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n interval: RECORD_INTERVAL,\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n }\n }\n\n private async _onSegments(segments: TranscriptSegment[]) {\n if (!this.isOpen || !this._queue) {\n return;\n }\n\n const block = createStatic(TranscriptBlock, { author: this._name, segments });\n this._queue.append([block]);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, Events, contributes, defineModule, definePlugin } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\n\nimport { AppGraphBuilder, IntentResolver, ReactSurface, TranscriptionCapabilities } from './capabilities';\nimport { meta, TRANSCRIPTION_PLUGIN } from './meta';\nimport translations from './translations';\nimport { TranscriptType } from './types';\n\nexport const TranscriptionPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, translations),\n }),\n defineModule({\n id: `${meta.id}/module/transcription`,\n activatesOn: Events.Startup,\n activate: () => contributes(TranscriptionCapabilities.Transcription, null),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () =>\n contributes(Capabilities.Metadata, {\n id: TranscriptType.typename,\n metadata: {\n placeholder: ['transcript title placeholder', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n },\n }),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => [contributes(ClientCapabilities.Schema, [TranscriptType])],\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { TRANSCRIPTION_PLUGIN } from './meta';\nimport { TranscriptType } from './types';\n\nexport default [\n {\n 'en-US': {\n [TranscriptType.typename]: {\n 'typename label': 'Transcript',\n },\n [TRANSCRIPTION_PLUGIN]: {\n 'plugin name': 'Transcription',\n 'calls label': 'Transcript',\n 'calls panel label': 'Transcription',\n 'create calls label': 'Create transcription',\n 'delete calls label': 'Delete',\n\n 'delete button': 'Delete',\n 'bookmark button': 'Bookmark',\n 'summary button': 'Create summary',\n 'summarizing label': 'Summarizing...',\n },\n },\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["import_app_framework", "import_react", "import_log", "import_wavefile", "import_async", "import_tracing", "import_context", "import_invariant", "TranscriptionCapabilities", "Transcription", "defineCapability", "TRANSCRIPTION_PLUGIN", "AppGraphBuilder", "lazy", "IntentResolver", "ReactSurface", "useAudioFile", "audioUrl", "audio", "stream", "track", "setStream", "useState", "useEffect", "t", "setTimeout", "response", "fetch", "blob", "Audio", "src", "URL", "createObjectURL", "Promise", "resolve", "reject", "addEventListener", "err", "log", "error", "once", "info", "load", "ctx", "AudioContext", "destination", "createMediaStreamDestination", "channelCount", "source", "createMediaElementSource", "connect", "getAudioTracks", "clearTimeout", "useAudioTrack", "active", "setTrack", "stop", "undefined", "initAudio", "srcObject", "navigator", "mediaDevices", "getUserMedia", "initializingPromise", "initializeExtendableMediaRecorder", "register", "MediaStreamRecorder", "constructor", "mediaStreamTrack", "interval", "_mediaRecorder", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "MediaStream", "MediaRecorder", "mimeType", "state", "invariant", "ondataavailable", "event", "_ondataavailable", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "WaveFile", "slice", "warn", "timestamp", "Date", "now", "getSamples", "synchronized", "trace", "resource", "Transcriber", "Resource", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "_config", "_recorder", "_onSegments", "_open", "chunk", "_saveAudioChunk", "DeferredTask", "_transcribe", "wake", "_close", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "length", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "file", "fromScratch", "mergeFloat64Arrays", "map", "toBase64", "Error", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "json", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "filteredSegments", "filter", "segment", "end", "words", "word", "started", "span", "showInBrowserTimeline", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "useTranscriber", "audioStreamTrack", "transcriber", "useMemo", "close", "useVoiceInput", "onUpdate", "soundStart", "useSoundEffect", "soundStop", "handleSegments", "useCallback", "str", "trim", "replace", "recording", "setRecording", "Context", "scheduleMicroTask", "open", "play", "isOpen", "dispose", "TranscriptionManager", "edgeClient", "_audioStreamTrack", "_name", "_transcriber", "_enabled", "_queue", "_edgeClient", "_toggleTranscriber", "setEnabled", "enabled", "setAudioTrack", "setQueue", "queue", "dxn", "toString", "QueueImpl", "DXN", "parse", "setName", "name", "_maybeReinitTranscriber", "needReinit", "block", "createStatic", "TranscriptBlock", "author", "append", "TranscriptType", "typename", "TranscriptionPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "SetupTranslations", "activate", "contributes", "Capabilities", "Translations", "translations", "Startup", "SetupMetadata", "Metadata", "metadata", "placeholder", "ns", "icon", "ClientEvents", "SetupSchema", "ClientCapabilities", "Schema", "SetupReactSurface", "SetupIntentResolver", "SetupAppGraph"]
7
7
  }
@@ -16,12 +16,12 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var intent_resolver_3KJZGGUQ_exports = {};
20
- __export(intent_resolver_3KJZGGUQ_exports, {
19
+ var intent_resolver_KLBZ25XJ_exports = {};
20
+ __export(intent_resolver_KLBZ25XJ_exports, {
21
21
  default: () => intent_resolver_default
22
22
  });
23
- module.exports = __toCommonJS(intent_resolver_3KJZGGUQ_exports);
24
- var import_chunk_JBN3P6ZF = require("./chunk-JBN3P6ZF.cjs");
23
+ module.exports = __toCommonJS(intent_resolver_KLBZ25XJ_exports);
24
+ var import_chunk_HDRXDMK2 = require("./chunk-HDRXDMK2.cjs");
25
25
  var import_chunk_UIHEGU6Q = require("./chunk-UIHEGU6Q.cjs");
26
26
  var import_app_framework = require("@dxos/app-framework");
27
27
  var import_live_object = require("@dxos/live-object");
@@ -30,8 +30,8 @@ var intent_resolver_default = (context) => (0, import_app_framework.contributes)
30
30
  intent: import_chunk_UIHEGU6Q.TranscriptionAction.Create,
31
31
  resolve: ({ name }) => {
32
32
  const transcript = (0, import_live_object.create)(import_chunk_UIHEGU6Q.TranscriptType, {
33
- queue: (0, import_chunk_JBN3P6ZF.randomQueueDxn)().toString(),
34
- name: name ?? `Transcript ${(0, import_chunk_JBN3P6ZF.getTimeStr)(Date.now())}`
33
+ queue: (0, import_chunk_HDRXDMK2.randomQueueDxn)().toString(),
34
+ name: name ?? `Transcript ${(0, import_chunk_HDRXDMK2.getTimeStr)(Date.now())}`
35
35
  });
36
36
  return {
37
37
  data: {
@@ -41,4 +41,4 @@ var intent_resolver_default = (context) => (0, import_app_framework.contributes)
41
41
  }
42
42
  })
43
43
  ]);
44
- //# sourceMappingURL=intent-resolver-3KJZGGUQ.cjs.map
44
+ //# sourceMappingURL=intent-resolver-KLBZ25XJ.cjs.map
@@ -1 +1 @@
1
- {"inputs":{"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytes":1793,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytes":1709,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytes":1075,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytes":5111,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytes":3851,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytes":607,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytes":1600,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytes":1354,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts":{"bytes":5995,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytes":1462,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytes":851,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/util/array.ts","kind":"import-statement","original":"./array"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts","kind":"import-statement","original":"./get-time-str"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts","kind":"import-statement","original":"./monitor-audio-level"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts","kind":"import-statement","original":"./random-queue-dxn"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytes":3274,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytes":7670,"imports":[{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytes":550,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx","kind":"import-statement","original":"./Transcript"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytes":22687,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytes":1062,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"import-statement","original":"./TranscriptContainer"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"dynamic-import","original":"./TranscriptContainer"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytes":2737,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"../components"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytes":1473,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","kind":"dynamic-import","original":"./app-graph-builder"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","kind":"dynamic-import","original":"./intent-resolver"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","kind":"dynamic-import","original":"./react-surface"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytes":6346,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytes":3162,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts":{"bytes":7780,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts":{"bytes":3252,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytes":13121,"imports":[{"path":"extendable-media-recorder","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-wav-encoder","kind":"dynamic-import","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytes":24141,"imports":[{"path":"wavefile","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":"@dxos/tracing","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytes":772,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts","kind":"import-statement","original":"./audio-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts","kind":"import-statement","original":"./transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytes":5265,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"../transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytes":7280,"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},{"path":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytes":957,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts","kind":"import-statement","original":"./useAudioFile"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts","kind":"import-statement","original":"./useIsSpeaking"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts","kind":"import-statement","original":"./useVoiceInput"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytes":2603,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytes":7960,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytes":1011,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"./transcriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx","kind":"import-statement","original":"./TranscriptionPlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-transcription/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":38189},"packages/plugins/experimental/plugin-transcription/dist/lib/node/index.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-JBN3P6ZF.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-QWXLQPP5.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-YV74Z74I.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-3KJZGGUQ.cjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-AGGGDOUC.cjs","kind":"dynamic-import"},{"path":"react","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":"extendable-media-recorder","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-wav-encoder","kind":"dynamic-import","external":true},{"path":"wavefile","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":"@dxos/tracing","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":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true}],"exports":["AppGraphBuilder","IntentResolver","MediaStreamRecorder","ReactSurface","TRANSCRIPTION_PLUGIN","Transcriber","Transcript","TranscriptContainer","TranscriptionCapabilities","TranscriptionContainer","TranscriptionPlugin","meta","useAudioFile","useAudioTrack","useIsSpeaking","useTranscriber","useVoiceInput"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/index.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytesInOutput":268},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytesInOutput":309},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytesInOutput":1681},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytesInOutput":628},"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts":{"bytesInOutput":1387},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytesInOutput":848},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytesInOutput":3707},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytesInOutput":5593},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytesInOutput":1882},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytesInOutput":1623},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytesInOutput":565}},"bytes":20359},"packages/plugins/experimental/plugin-transcription/dist/lib/node/types/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/node/types/index.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"}],"exports":["TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","inputs":{},"bytes":320},"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":536},"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytesInOutput":157}},"bytes":356},"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1617},"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-3KJZGGUQ.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-JBN3P6ZF.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytesInOutput":558}},"bytes":903},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-JBN3P6ZF.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5084},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-JBN3P6ZF.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"exports":["getTimeStr","mergeFloat64Arrays","monitorAudioLevel","randomQueueDxn"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytesInOutput":195},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytesInOutput":231},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytesInOutput":267},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts":{"bytesInOutput":1264}},"bytes":2411},"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-HU763SN3.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-HU763SN3.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-YV74Z74I.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"}],"exports":["TranscriptionContainer","default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","inputs":{},"bytes":264},"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-AGGGDOUC.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1326},"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-AGGGDOUC.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-QWXLQPP5.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-YV74Z74I.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytesInOutput":445}},"bytes":809},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-QWXLQPP5.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":453},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-QWXLQPP5.cjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-HU763SN3.cjs","kind":"dynamic-import"}],"exports":["TranscriptContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytesInOutput":114}},"bytes":271},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-YV74Z74I.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15264},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-YV74Z74I.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["Transcript","TranscriptContainer_default","TranscriptionContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytesInOutput":6259},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytesInOutput":2030},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytesInOutput":0}},"bytes":8782},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5170},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true}],"exports":["TRANSCRIPTION_PLUGIN","TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript","meta"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytesInOutput":844},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytesInOutput":730},"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytesInOutput":358}},"bytes":2426}}}
1
+ {"inputs":{"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytes":1793,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytes":1709,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytes":1075,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytes":5111,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytes":3851,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytes":607,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytes":1600,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytes":1354,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts":{"bytes":5995,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytes":1462,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytes":851,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/util/array.ts","kind":"import-statement","original":"./array"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts","kind":"import-statement","original":"./get-time-str"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts","kind":"import-statement","original":"./monitor-audio-level"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts","kind":"import-statement","original":"./random-queue-dxn"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytes":3274,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytes":7670,"imports":[{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytes":550,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx","kind":"import-statement","original":"./Transcript"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytes":22550,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytes":1062,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"import-statement","original":"./TranscriptContainer"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"dynamic-import","original":"./TranscriptContainer"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytes":2737,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"../components"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytes":1473,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","kind":"dynamic-import","original":"./app-graph-builder"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","kind":"dynamic-import","original":"./intent-resolver"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","kind":"dynamic-import","original":"./react-surface"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytes":6346,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytes":3162,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts":{"bytes":3252,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytes":13363,"imports":[{"path":"extendable-media-recorder","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-wav-encoder","kind":"dynamic-import","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytes":24141,"imports":[{"path":"wavefile","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":"@dxos/tracing","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytes":772,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts","kind":"import-statement","original":"./audio-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts","kind":"import-statement","original":"./transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytes":5265,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"../transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytes":7280,"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},{"path":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytes":852,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts","kind":"import-statement","original":"./useAudioFile"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts","kind":"import-statement","original":"./useVoiceInput"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts":{"bytes":17578,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"./transcriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytes":2603,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytes":7960,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytes":1132,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"./transcriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts","kind":"import-statement","original":"./transcription-manager"},{"path":"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx","kind":"import-statement","original":"./TranscriptionPlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-transcription/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":42874},"packages/plugins/experimental/plugin-transcription/dist/lib/node/index.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-HDRXDMK2.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-I35KHI2G.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-ANSWGFMS.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-KLBZ25XJ.cjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-NCKXB7EQ.cjs","kind":"dynamic-import"},{"path":"react","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":"extendable-media-recorder","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-wav-encoder","kind":"dynamic-import","external":true},{"path":"wavefile","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":"@dxos/tracing","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":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true}],"exports":["AppGraphBuilder","IntentResolver","MediaStreamRecorder","ReactSurface","TRANSCRIPTION_PLUGIN","Transcriber","Transcript","TranscriptContainer","TranscriptionCapabilities","TranscriptionContainer","TranscriptionManager","TranscriptionPlugin","meta","useAudioFile","useAudioTrack","useTranscriber","useVoiceInput"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/index.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytesInOutput":268},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytesInOutput":309},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytesInOutput":1681},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytesInOutput":628},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytesInOutput":848},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytesInOutput":3773},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytesInOutput":5593},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytesInOutput":1882},"packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts":{"bytesInOutput":4767},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytesInOutput":1623},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytesInOutput":565}},"bytes":23812},"packages/plugins/experimental/plugin-transcription/dist/lib/node/types/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/node/types/index.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"}],"exports":["TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","inputs":{},"bytes":320},"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":536},"packages/plugins/experimental/plugin-transcription/dist/lib/node/app-graph-builder-YFBX3OTP.cjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytesInOutput":157}},"bytes":356},"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-KLBZ25XJ.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1617},"packages/plugins/experimental/plugin-transcription/dist/lib/node/intent-resolver-KLBZ25XJ.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-HDRXDMK2.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytesInOutput":558}},"bytes":903},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-HDRXDMK2.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":2016},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-HDRXDMK2.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"exports":["getTimeStr","mergeFloat64Arrays","randomQueueDxn"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytesInOutput":195},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytesInOutput":231},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytesInOutput":267},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytesInOutput":0}},"bytes":1039},"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-4BWXOVML.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-4BWXOVML.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-ANSWGFMS.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"}],"exports":["TranscriptionContainer","default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","inputs":{},"bytes":264},"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-NCKXB7EQ.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1326},"packages/plugins/experimental/plugin-transcription/dist/lib/node/react-surface-NCKXB7EQ.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-I35KHI2G.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-ANSWGFMS.cjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytesInOutput":445}},"bytes":809},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-I35KHI2G.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":453},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-I35KHI2G.cjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/TranscriptContainer-4BWXOVML.cjs","kind":"dynamic-import"}],"exports":["TranscriptContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytesInOutput":114}},"bytes":271},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-ANSWGFMS.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15189},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-ANSWGFMS.cjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["Transcript","TranscriptContainer_default","TranscriptionContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytesInOutput":6222},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytesInOutput":2030},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytesInOutput":0}},"bytes":8745},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5170},"packages/plugins/experimental/plugin-transcription/dist/lib/node/chunk-UIHEGU6Q.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true}],"exports":["TRANSCRIPTION_PLUGIN","TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript","meta"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytesInOutput":844},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytesInOutput":730},"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytesInOutput":358}},"bytes":2426}}}
@@ -26,13 +26,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var react_surface_AGGGDOUC_exports = {};
30
- __export(react_surface_AGGGDOUC_exports, {
29
+ var react_surface_NCKXB7EQ_exports = {};
30
+ __export(react_surface_NCKXB7EQ_exports, {
31
31
  default: () => react_surface_default
32
32
  });
33
- module.exports = __toCommonJS(react_surface_AGGGDOUC_exports);
34
- var import_chunk_QWXLQPP5 = require("./chunk-QWXLQPP5.cjs");
35
- var import_chunk_YV74Z74I = require("./chunk-YV74Z74I.cjs");
33
+ module.exports = __toCommonJS(react_surface_NCKXB7EQ_exports);
34
+ var import_chunk_I35KHI2G = require("./chunk-I35KHI2G.cjs");
35
+ var import_chunk_ANSWGFMS = require("./chunk-ANSWGFMS.cjs");
36
36
  var import_chunk_UIHEGU6Q = require("./chunk-UIHEGU6Q.cjs");
37
37
  var import_react = __toESM(require("react"));
38
38
  var import_app_framework = require("@dxos/app-framework");
@@ -41,9 +41,9 @@ var react_surface_default = () => (0, import_app_framework.contributes)(import_a
41
41
  id: import_chunk_UIHEGU6Q.TRANSCRIPTION_PLUGIN,
42
42
  role: "article",
43
43
  filter: (data) => (0, import_chunk_UIHEGU6Q.isTranscript)(data.subject),
44
- component: ({ data, role }) => /* @__PURE__ */ import_react.default.createElement(import_chunk_YV74Z74I.TranscriptionContainer, {
44
+ component: ({ data, role }) => /* @__PURE__ */ import_react.default.createElement(import_chunk_ANSWGFMS.TranscriptionContainer, {
45
45
  transcript: data.subject
46
46
  })
47
47
  })
48
48
  ]);
49
- //# sourceMappingURL=react-surface-AGGGDOUC.cjs.map
49
+ //# sourceMappingURL=react-surface-NCKXB7EQ.cjs.map
@@ -2,10 +2,10 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  TranscriptContainer_default,
4
4
  TranscriptionContainer
5
- } from "./chunk-36EQXBWR.mjs";
5
+ } from "./chunk-ZMK2QLW2.mjs";
6
6
  import "./chunk-KEG3ME4O.mjs";
7
7
  export {
8
8
  TranscriptionContainer,
9
9
  TranscriptContainer_default as default
10
10
  };
11
- //# sourceMappingURL=TranscriptContainer-DVBXQIQ4.mjs.map
11
+ //# sourceMappingURL=TranscriptContainer-6IKRASR6.mjs.map
@@ -2,9 +2,9 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
 
3
3
  // packages/plugins/experimental/plugin-transcription/src/components/index.ts
4
4
  import { lazy } from "react";
5
- var TranscriptContainer = lazy(() => import("./TranscriptContainer-DVBXQIQ4.mjs"));
5
+ var TranscriptContainer = lazy(() => import("./TranscriptContainer-6IKRASR6.mjs"));
6
6
 
7
7
  export {
8
8
  TranscriptContainer
9
9
  };
10
- //# sourceMappingURL=chunk-WEZGRUG6.mjs.map
10
+ //# sourceMappingURL=chunk-2CPKXRN6.mjs.map
@@ -0,0 +1,37 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts
4
+ var getTimeStr = (timestamp) => new Date(timestamp ?? Date.now()).toLocaleTimeString("en-US", {
5
+ timeZone: "UTC",
6
+ hour12: true,
7
+ hour: "numeric",
8
+ minute: "2-digit",
9
+ second: "2-digit"
10
+ });
11
+
12
+ // packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts
13
+ import { ObjectId } from "@dxos/echo-schema";
14
+ import { DXN, QueueSubspaceTags, SpaceId } from "@dxos/keys";
15
+ var randomQueueDxn = () => new DXN(DXN.kind.QUEUE, [
16
+ QueueSubspaceTags.DATA,
17
+ SpaceId.random(),
18
+ ObjectId.random()
19
+ ]);
20
+
21
+ // packages/plugins/experimental/plugin-transcription/src/util/array.ts
22
+ var mergeFloat64Arrays = (arrays) => {
23
+ const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
24
+ let offset = 0;
25
+ for (const array of arrays) {
26
+ newArray.set(array, offset);
27
+ offset += array.length;
28
+ }
29
+ return newArray;
30
+ };
31
+
32
+ export {
33
+ mergeFloat64Arrays,
34
+ getTimeStr,
35
+ randomQueueDxn
36
+ };
37
+ //# sourceMappingURL=chunk-LORUIVS4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = () =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n"],
5
+ "mappings": ";;;AAIO,IAAMA,aAAa,CAACC,cACzB,IAAIC,KAAKD,aAAaC,KAAKC,IAAG,CAAA,EAAIC,mBAAmB,SAAS;EAC5DC,UAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,QAAQ;EACRC,QAAQ;AACV,CAAA;;;ACPF,SAASC,gBAAgB;AACzB,SAASC,KAAKC,mBAAmBC,eAAe;AAEzC,IAAMC,iBAAiB,MAC5B,IAAIC,IAAIA,IAAIC,KAAKC,OAAO;EAACC,kBAAkBC;EAAMC,QAAQC,OAAM;EAAIC,SAASD,OAAM;CAAG;;;ACJhF,IAAME,qBAAqB,CAACC,WAAAA;AACjC,QAAMC,WAAW,IAAIC,aAAaF,OAAOG,OAAO,CAACC,KAAKC,UAAUA,MAAMC,SAASF,KAAK,CAAA,CAAA;AACpF,MAAIG,SAAS;AACb,aAAWF,SAASL,QAAQ;AAC1BC,aAASO,IAAIH,OAAOE,MAAAA;AACpBA,cAAUF,MAAMC;EAClB;AAEA,SAAOL;AACT;",
6
+ "names": ["getTimeStr", "timestamp", "Date", "now", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "ObjectId", "DXN", "QueueSubspaceTags", "SpaceId", "randomQueueDxn", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set"]
7
+ }