@dxos/plugin-transcription 0.8.4-main.2e9d522 → 0.8.4-main.406dc2a

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 (170) hide show
  1. package/dist/lib/browser/TranscriptContainer-QN5WUMWJ.mjs +11 -0
  2. package/dist/lib/browser/blueprint-definition-GO6GTEBT.mjs +150 -0
  3. package/dist/lib/browser/blueprint-definition-GO6GTEBT.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-4FJIYH7T.mjs → chunk-77NWYLC6.mjs} +2 -2
  5. package/dist/lib/browser/{chunk-5WH45KBY.mjs → chunk-7LNCQDTT.mjs} +9 -4
  6. package/dist/lib/browser/chunk-7LNCQDTT.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-FFEPEPCU.mjs → chunk-COBQIZ6B.mjs} +85 -94
  8. package/dist/lib/browser/chunk-COBQIZ6B.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-GGHMOEKZ.mjs +63 -0
  10. package/dist/lib/browser/chunk-GGHMOEKZ.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-U6QBOGTN.mjs → chunk-LCK3YRQF.mjs} +5 -5
  12. package/dist/lib/browser/chunk-LCK3YRQF.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-5KPYIC3N.mjs → chunk-ZS2FXKEF.mjs} +410 -418
  14. package/dist/lib/browser/chunk-ZS2FXKEF.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +22 -18
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/intent-resolver-52EPFRMR.mjs +25 -0
  18. package/dist/lib/browser/intent-resolver-52EPFRMR.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-E5D5AE3F.mjs → react-surface-LCP2D2MF.mjs} +10 -10
  21. package/dist/lib/browser/react-surface-LCP2D2MF.mjs.map +7 -0
  22. package/dist/lib/browser/{transcriber-PXT4QBFY.mjs → transcriber-NG5MRCP6.mjs} +7 -7
  23. package/dist/lib/browser/transcriber-NG5MRCP6.mjs.map +7 -0
  24. package/dist/lib/browser/types/index.mjs +6 -8
  25. package/dist/lib/node-esm/{TranscriptContainer-VBAOM5DG.mjs → TranscriptContainer-WCUWVVSD.mjs} +4 -4
  26. package/dist/lib/node-esm/blueprint-definition-6SU7GLBR.mjs +151 -0
  27. package/dist/lib/node-esm/blueprint-definition-6SU7GLBR.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-HT3W7LDP.mjs → chunk-A6SB234F.mjs} +85 -94
  29. package/dist/lib/node-esm/chunk-A6SB234F.mjs.map +7 -0
  30. package/dist/lib/node-esm/chunk-FTTZ4YSX.mjs +64 -0
  31. package/dist/lib/node-esm/chunk-FTTZ4YSX.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-XMUCZBP3.mjs → chunk-KLTPFUKN.mjs} +8 -4
  33. package/dist/lib/node-esm/chunk-KLTPFUKN.mjs.map +7 -0
  34. package/dist/lib/node-esm/{chunk-Y2B4HWSS.mjs → chunk-N5Z4SKPH.mjs} +2 -2
  35. package/dist/lib/node-esm/{chunk-TJKAO7VR.mjs → chunk-PEZRQYKO.mjs} +410 -418
  36. package/dist/lib/node-esm/chunk-PEZRQYKO.mjs.map +7 -0
  37. package/dist/lib/node-esm/{chunk-RHF2ALML.mjs → chunk-RWRG3S2O.mjs} +5 -5
  38. package/dist/lib/node-esm/chunk-RWRG3S2O.mjs.map +7 -0
  39. package/dist/lib/node-esm/index.mjs +22 -18
  40. package/dist/lib/node-esm/index.mjs.map +3 -3
  41. package/dist/lib/node-esm/intent-resolver-DZBQQRHN.mjs +26 -0
  42. package/dist/lib/node-esm/intent-resolver-DZBQQRHN.mjs.map +7 -0
  43. package/dist/lib/node-esm/meta.json +1 -1
  44. package/dist/lib/node-esm/{react-surface-QRDJOHN5.mjs → react-surface-7UC2YXX2.mjs} +10 -10
  45. package/dist/lib/node-esm/react-surface-7UC2YXX2.mjs.map +7 -0
  46. package/dist/lib/node-esm/{transcriber-YUTEVANE.mjs → transcriber-SMU7HD6F.mjs} +7 -7
  47. package/dist/lib/node-esm/transcriber-SMU7HD6F.mjs.map +7 -0
  48. package/dist/lib/node-esm/types/index.mjs +6 -8
  49. package/dist/types/src/TranscriptionPlugin.d.ts +1 -1
  50. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  51. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  52. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  53. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  54. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/index.d.ts +3 -2
  56. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  58. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  59. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  60. package/dist/types/src/capabilities/transcriber.d.ts +1 -1
  61. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  62. package/dist/types/src/components/Transcript/Transcript.d.ts +5 -5
  63. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  64. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +31 -16
  65. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  66. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +3 -3
  67. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -1
  68. package/dist/types/src/components/Transcript/transcript-extension.d.ts +1 -5
  69. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
  70. package/dist/types/src/components/TranscriptContainer.d.ts +2 -2
  71. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  72. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +8 -4
  73. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +13 -6
  75. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +10 -6
  77. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/stories/TranscriptionStory.d.ts +2 -1
  79. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -1
  80. package/dist/types/src/functions/index.d.ts +3 -0
  81. package/dist/types/src/functions/index.d.ts.map +1 -0
  82. package/dist/types/src/functions/open.d.ts +7 -0
  83. package/dist/types/src/functions/open.d.ts.map +1 -0
  84. package/dist/types/src/functions/summarize.d.ts +11 -0
  85. package/dist/types/src/functions/summarize.d.ts.map +1 -0
  86. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  87. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  88. package/dist/types/src/meta.d.ts +0 -1
  89. package/dist/types/src/meta.d.ts.map +1 -1
  90. package/dist/types/src/segments-normalization/normalization.d.ts +376 -325
  91. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -1
  92. package/dist/types/src/testing/testing.d.ts +2 -2
  93. package/dist/types/src/testing/testing.d.ts.map +1 -1
  94. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -1
  95. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  96. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  97. package/dist/types/src/transcriber/transcription-manager.d.ts +3 -7
  98. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  99. package/dist/types/src/types/Transcript.d.ts +30 -0
  100. package/dist/types/src/types/Transcript.d.ts.map +1 -0
  101. package/dist/types/src/types/TranscriptAction.d.ts +23 -0
  102. package/dist/types/src/types/TranscriptAction.d.ts.map +1 -0
  103. package/dist/types/src/types/index.d.ts +2 -1
  104. package/dist/types/src/types/index.d.ts.map +1 -1
  105. package/dist/types/src/types/types.d.ts +0 -26
  106. package/dist/types/src/types/types.d.ts.map +1 -1
  107. package/dist/types/tsconfig.tsbuildinfo +1 -1
  108. package/package.json +63 -62
  109. package/src/TranscriptionPlugin.tsx +57 -53
  110. package/src/capabilities/blueprint-definition.ts +31 -0
  111. package/src/capabilities/capabilities.ts +6 -6
  112. package/src/capabilities/index.ts +1 -0
  113. package/src/capabilities/intent-resolver.ts +5 -11
  114. package/src/capabilities/react-surface.tsx +2 -2
  115. package/src/capabilities/transcriber.ts +3 -2
  116. package/src/components/Transcript/Transcript.stories.tsx +34 -31
  117. package/src/components/Transcript/Transcript.tsx +20 -27
  118. package/src/components/Transcript/deprecated/OldTranscript.tsx +9 -9
  119. package/src/components/Transcript/transcript-extension.ts +2 -39
  120. package/src/components/TranscriptContainer.tsx +7 -6
  121. package/src/components/stories/FileTranscription.stories.tsx +49 -36
  122. package/src/components/stories/KeyWordRecognition.stories.tsx +17 -10
  123. package/src/components/stories/MicrophoneTranscription.stories.tsx +43 -38
  124. package/src/components/stories/TranscriptionStory.tsx +10 -6
  125. package/src/functions/index.ts +6 -0
  126. package/src/functions/open.ts +39 -0
  127. package/src/functions/summarize.ts +103 -0
  128. package/src/hooks/useAudioFile.ts +49 -53
  129. package/src/hooks/useVoiceInput.ts +3 -2
  130. package/src/meta.ts +1 -3
  131. package/src/model/model.test.ts +1 -1
  132. package/src/segments-normalization/message-normalizer.ts +1 -1
  133. package/src/segments-normalization/normalization.test.ts +5 -5
  134. package/src/segments-normalization/normalization.ts +38 -37
  135. package/src/testing/testing.ts +7 -7
  136. package/src/transcriber/media-stream-recorder.ts +1 -1
  137. package/src/transcriber/transcriber.browser.test.ts +2 -1
  138. package/src/transcriber/transcriber.ts +2 -1
  139. package/src/transcriber/transcription-manager.ts +17 -38
  140. package/src/types/{schema.ts → Transcript.ts} +12 -9
  141. package/src/types/TranscriptAction.ts +24 -0
  142. package/src/types/index.ts +2 -1
  143. package/src/types/types.ts +0 -23
  144. package/dist/lib/browser/TranscriptContainer-6WCKCXQ6.mjs +0 -11
  145. package/dist/lib/browser/chunk-5KPYIC3N.mjs.map +0 -7
  146. package/dist/lib/browser/chunk-5WH45KBY.mjs.map +0 -7
  147. package/dist/lib/browser/chunk-FFEPEPCU.mjs.map +0 -7
  148. package/dist/lib/browser/chunk-R7INNNUQ.mjs +0 -55
  149. package/dist/lib/browser/chunk-R7INNNUQ.mjs.map +0 -7
  150. package/dist/lib/browser/chunk-U6QBOGTN.mjs.map +0 -7
  151. package/dist/lib/browser/intent-resolver-3O33MMP5.mjs +0 -30
  152. package/dist/lib/browser/intent-resolver-3O33MMP5.mjs.map +0 -7
  153. package/dist/lib/browser/react-surface-E5D5AE3F.mjs.map +0 -7
  154. package/dist/lib/browser/transcriber-PXT4QBFY.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-HT3W7LDP.mjs.map +0 -7
  156. package/dist/lib/node-esm/chunk-RHF2ALML.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-TJKAO7VR.mjs.map +0 -7
  158. package/dist/lib/node-esm/chunk-U65ZWK3L.mjs +0 -56
  159. package/dist/lib/node-esm/chunk-U65ZWK3L.mjs.map +0 -7
  160. package/dist/lib/node-esm/chunk-XMUCZBP3.mjs.map +0 -7
  161. package/dist/lib/node-esm/intent-resolver-YMN5SXNC.mjs +0 -31
  162. package/dist/lib/node-esm/intent-resolver-YMN5SXNC.mjs.map +0 -7
  163. package/dist/lib/node-esm/react-surface-QRDJOHN5.mjs.map +0 -7
  164. package/dist/lib/node-esm/transcriber-YUTEVANE.mjs.map +0 -7
  165. package/dist/types/src/types/schema.d.ts +0 -41
  166. package/dist/types/src/types/schema.d.ts.map +0 -1
  167. /package/dist/lib/browser/{TranscriptContainer-6WCKCXQ6.mjs.map → TranscriptContainer-QN5WUMWJ.mjs.map} +0 -0
  168. /package/dist/lib/browser/{chunk-4FJIYH7T.mjs.map → chunk-77NWYLC6.mjs.map} +0 -0
  169. /package/dist/lib/node-esm/{TranscriptContainer-VBAOM5DG.mjs.map → TranscriptContainer-WCUWVVSD.mjs.map} +0 -0
  170. /package/dist/lib/node-esm/{chunk-Y2B4HWSS.mjs.map → chunk-N5Z4SKPH.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  TranscriptionCapabilities
4
- } from "./chunk-RHF2ALML.mjs";
4
+ } from "./chunk-RWRG3S2O.mjs";
5
5
 
6
6
  // src/components/TranscriptContainer.tsx
7
7
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
@@ -10,43 +10,158 @@ import { fullyQualifiedId, getSpace } from "@dxos/client/echo";
10
10
  import { useMembers, useQueue } from "@dxos/react-client/echo";
11
11
  import { StackItem } from "@dxos/react-ui-stack";
12
12
 
13
- // src/components/Transcript/Transcript.tsx
14
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
15
- import React from "react";
16
- import { IconButton, useThemeContext } from "@dxos/react-ui";
17
- import { createBasicExtensions, createMarkdownExtensions, createRenderer, createThemeExtensions, decorateMarkdown, editorWidth, preview, useTextEditor } from "@dxos/react-ui-editor";
18
- import { mx } from "@dxos/react-ui-theme";
19
- import { isNotFalsy } from "@dxos/util";
13
+ // src/hooks/useAudioFile.ts
14
+ import { useEffect, useState } from "react";
15
+ import { scheduleTask } from "@dxos/async";
16
+ import { Context } from "@dxos/context";
17
+ import { log } from "@dxos/log";
18
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
19
+ var useAudioFile = (audioUrl, constraints) => {
20
+ const [{ audio, stream, track }, setStream] = useState({});
21
+ useEffect(() => {
22
+ const ctx = new Context(void 0, {
23
+ F: __dxlog_file,
24
+ L: 20
25
+ });
26
+ scheduleTask(ctx, async () => {
27
+ try {
28
+ const response = await fetch(audioUrl);
29
+ const blob = await response.blob();
30
+ const objectUrl = URL.createObjectURL(blob);
31
+ ctx.onDispose(() => {
32
+ URL.revokeObjectURL(objectUrl);
33
+ });
34
+ const audio2 = new Audio();
35
+ audio2.src = objectUrl;
36
+ await new Promise((resolve, reject) => {
37
+ audio2.addEventListener("error", (err) => {
38
+ log.error("error", {
39
+ err
40
+ }, {
41
+ F: __dxlog_file,
42
+ L: 39,
43
+ S: void 0,
44
+ C: (f, a) => f(...a)
45
+ });
46
+ reject(err);
47
+ }, {
48
+ once: true
49
+ });
50
+ audio2.addEventListener("canplay", async () => {
51
+ resolve();
52
+ }, {
53
+ once: true
54
+ });
55
+ audio2.load();
56
+ });
57
+ const audioCtx = new AudioContext();
58
+ if (audioCtx.state === "suspended") {
59
+ await audioCtx.resume();
60
+ }
61
+ const destination = audioCtx.createMediaStreamDestination();
62
+ destination.channelCount = 1;
63
+ const source = audioCtx.createMediaElementSource(audio2);
64
+ source.connect(destination);
65
+ const track2 = destination.stream.getAudioTracks()[0];
66
+ if (constraints) {
67
+ await track2.applyConstraints(constraints).catch((err) => log.catch(err, void 0, {
68
+ F: __dxlog_file,
69
+ L: 68,
70
+ S: void 0,
71
+ C: (f, a) => f(...a)
72
+ }));
73
+ }
74
+ setStream({
75
+ audio: audio2,
76
+ stream: destination.stream,
77
+ track: destination.stream.getAudioTracks()[0]
78
+ });
79
+ } catch (err) {
80
+ log.catch(err, void 0, {
81
+ F: __dxlog_file,
82
+ L: 78,
83
+ S: void 0,
84
+ C: (f, a) => f(...a)
85
+ });
86
+ }
87
+ });
88
+ return () => {
89
+ void ctx.dispose();
90
+ };
91
+ }, [
92
+ audioUrl
93
+ ]);
94
+ return {
95
+ audio,
96
+ stream,
97
+ track
98
+ };
99
+ };
20
100
 
21
- // src/components/Transcript/transcript-extension.ts
22
- import { RangeSetBuilder } from "@codemirror/state";
23
- import { EditorView, GutterMarker, ViewPlugin, gutter } from "@codemirror/view";
24
- import { format } from "date-fns/format";
25
- import { intervalToDuration } from "date-fns/intervalToDuration";
26
- import { addEventListener, combine } from "@dxos/async";
101
+ // src/hooks/useAudioTrack.ts
102
+ import { useEffect as useEffect2, useState as useState2 } from "react";
103
+ var useAudioTrack = (active, constraints) => {
104
+ const [track, setTrack] = useState2();
105
+ useEffect2(() => {
106
+ if (!active) {
107
+ track?.stop();
108
+ setTrack(void 0);
109
+ return;
110
+ }
111
+ const initAudio = async () => {
112
+ const audio = new Audio();
113
+ audio.srcObject = await navigator.mediaDevices.getUserMedia({
114
+ audio: constraints ?? true
115
+ });
116
+ const [track2] = audio.srcObject.getAudioTracks();
117
+ if (track2) {
118
+ setTrack(track2);
119
+ }
120
+ };
121
+ if (active) {
122
+ void initAudio();
123
+ }
124
+ }, [
125
+ active
126
+ ]);
127
+ return track;
128
+ };
129
+
130
+ // src/hooks/useQueueModelAdapter.ts
131
+ import { useEffect as useEffect3, useMemo, useState as useState3 } from "react";
27
132
 
28
133
  // src/model/model.ts
29
134
  import { Text } from "@codemirror/state";
30
135
  import { Event } from "@dxos/async";
31
136
  import { invariant } from "@dxos/invariant";
32
- import { log } from "@dxos/log";
33
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/model/model.ts";
34
- var DocumentAdapter = class {
35
- constructor(_view) {
36
- this._view = _view;
137
+ import { log as log2 } from "@dxos/log";
138
+ function _define_property(obj, key, value) {
139
+ if (key in obj) {
140
+ Object.defineProperty(obj, key, {
141
+ value,
142
+ enumerable: true,
143
+ configurable: true,
144
+ writable: true
145
+ });
146
+ } else {
147
+ obj[key] = value;
37
148
  }
149
+ return obj;
150
+ }
151
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/model/model.ts";
152
+ var DocumentAdapter = class {
38
153
  /** The document must always have at least one line. */
39
154
  lineCount() {
40
155
  return this._view.state.doc.lines - 1;
41
156
  }
42
157
  replaceLines(from, remove, insert) {
43
- log("replaceLines", {
158
+ log2("replaceLines", {
44
159
  count: this._view.state.doc.lines,
45
160
  from,
46
161
  remove,
47
162
  insert
48
163
  }, {
49
- F: __dxlog_file,
164
+ F: __dxlog_file2,
50
165
  L: 39,
51
166
  S: this,
52
167
  C: (f, a) => f(...a)
@@ -66,19 +181,12 @@ var DocumentAdapter = class {
66
181
  }
67
182
  });
68
183
  }
184
+ constructor(_view) {
185
+ _define_property(this, "_view", void 0);
186
+ this._view = _view;
187
+ }
69
188
  };
70
189
  var SerializationModel = class {
71
- constructor(_renderer, initialChunks = []) {
72
- this._renderer = _renderer;
73
- this._chunks = [];
74
- this._chunkLineCounts = /* @__PURE__ */ new Map();
75
- this._lineToChunk = /* @__PURE__ */ new Map();
76
- this._changes = [];
77
- this.update = new Event();
78
- initialChunks.forEach((chunk) => {
79
- this.appendChunk(chunk);
80
- });
81
- }
82
190
  toJSON() {
83
191
  return {
84
192
  chunks: this._chunks.length,
@@ -121,7 +229,7 @@ var SerializationModel = class {
121
229
  updateChunk(chunk) {
122
230
  const index = this._chunks.findIndex((c) => c.id === chunk.id);
123
231
  invariant(index !== -1, void 0, {
124
- F: __dxlog_file,
232
+ F: __dxlog_file2,
125
233
  L: 147,
126
234
  S: this,
127
235
  A: [
@@ -141,7 +249,7 @@ var SerializationModel = class {
141
249
  deleteBlock(id) {
142
250
  const index = this._chunks.findIndex((c) => c.id === id);
143
251
  invariant(index !== -1, void 0, {
144
- F: __dxlog_file,
252
+ F: __dxlog_file2,
145
253
  L: 156,
146
254
  S: this,
147
255
  A: [
@@ -162,10 +270,10 @@ var SerializationModel = class {
162
270
  * Syncs the tracked changes with the ChunkDocument.
163
271
  */
164
272
  sync(document2) {
165
- log("sync", {
273
+ log2("sync", {
166
274
  changes: this._changes
167
275
  }, {
168
- F: __dxlog_file,
276
+ F: __dxlog_file2,
169
277
  L: 167,
170
278
  S: this,
171
279
  C: (f, a) => f(...a)
@@ -216,377 +324,40 @@ var SerializationModel = class {
216
324
  this._changes.length = 0;
217
325
  return this;
218
326
  }
327
+ constructor(_renderer, initialChunks = []) {
328
+ _define_property(this, "_renderer", void 0);
329
+ _define_property(this, "_chunks", void 0);
330
+ _define_property(this, "_chunkLineCounts", void 0);
331
+ _define_property(this, "_lineToChunk", void 0);
332
+ _define_property(this, "_changes", void 0);
333
+ _define_property(this, "update", void 0);
334
+ this._renderer = _renderer;
335
+ this._chunks = [];
336
+ this._chunkLineCounts = /* @__PURE__ */ new Map();
337
+ this._lineToChunk = /* @__PURE__ */ new Map();
338
+ this._changes = [];
339
+ this.update = new Event();
340
+ initialChunks.forEach((chunk) => {
341
+ this.appendChunk(chunk);
342
+ });
343
+ }
219
344
  };
220
345
 
221
- // src/components/Transcript/transcript-extension.ts
222
- var transcript = ({ model, started, renderButton }) => {
223
- return [
224
- // Show timestamps in the gutter.
225
- gutter({
226
- class: "cm-timestamp-gutter",
227
- lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
228
- markers: (view) => {
229
- const start = getStartTime(started, model.chunks[0]);
230
- const builder = new RangeSetBuilder();
231
- for (const { from, to } of view.visibleRanges) {
232
- let line = view.state.doc.lineAt(from);
233
- while (line.from <= to) {
234
- const block = model.getChunkAtLine(line.number)?.blocks[0];
235
- const timestamp = block?._tag === "transcript" && block.started;
236
- if (timestamp) {
237
- builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
238
- }
239
- if (line.to + 1 > view.state.doc.length) {
240
- break;
241
- }
242
- line = view.state.doc.lineAt(line.to + 1);
243
- }
244
- }
245
- return builder.finish();
246
- }
247
- }),
248
- // Listen for model updates.
249
- ViewPlugin.fromClass(class {
250
- constructor(view) {
251
- this._initialized = false;
252
- this._adapter = new DocumentAdapter(view);
253
- const scroller = view.scrollDOM;
254
- let isAutoScrolling = false;
255
- let hasScrolled = false;
256
- let timeout;
257
- const scrollToBottom = (smooth = false) => {
258
- scroller.style.scrollBehavior = smooth ? "smooth" : "";
259
- scroller.classList.add("cm-hide-scrollbar");
260
- isAutoScrolling = true;
261
- clearTimeout(timeout);
262
- timeout = setTimeout(() => {
263
- this._controls?.classList.add("opacity-0");
264
- scroller.classList.remove("cm-hide-scrollbar");
265
- isAutoScrolling = false;
266
- }, 500);
267
- view.dispatch({
268
- effects: EditorView.scrollIntoView(view.state.doc.length, {
269
- y: "end"
270
- })
271
- });
272
- };
273
- if (renderButton) {
274
- this._controls = document.createElement("div");
275
- this._controls.classList.add("cm-controls", "transition-opacity", "duration-300", "opacity-0");
276
- view.dom.appendChild(this._controls);
277
- renderButton(this._controls, {
278
- onClick: () => {
279
- scrollToBottom(false);
280
- }
281
- }, view);
282
- }
283
- this._cleanup = combine(addEventListener(view.scrollDOM, "scroll", () => {
284
- if (!isAutoScrolling) {
285
- hasScrolled = true;
286
- this._controls?.classList.remove("opacity-0");
287
- }
288
- }), model.update.on(() => {
289
- const autoScroll = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
290
- model.sync(this._adapter);
291
- if (autoScroll) {
292
- scrollToBottom(true);
293
- }
294
- }));
295
- }
296
- update(update) {
297
- if (!this._initialized) {
298
- this._initialized = true;
299
- setTimeout(() => {
300
- model.sync(this._adapter);
301
- });
302
- }
303
- }
304
- destroy() {
305
- this._controls?.remove();
306
- this._cleanup();
307
- }
308
- }),
309
- EditorView.theme({
310
- ".cm-scroller": {
311
- overflowY: "scroll"
312
- },
313
- ".cm-hide-scrollbar": {
314
- scrollbarWidth: "none",
315
- "-ms-overflow-style": "none"
316
- },
317
- ".cm-hide-scrollbar::-webkit-scrollbar": {
318
- display: "none"
319
- },
320
- ".cm-controls": {
321
- position: "absolute",
322
- bottom: "0.5rem",
323
- right: "0.5rem",
324
- zIndex: 1e3
325
- },
326
- ".cm-line": {
327
- paddingRight: "1rem"
328
- },
329
- ".cm-timestamp-gutter": {
330
- width: "6rem",
331
- paddingRight: "1rem"
332
- },
333
- ".cm-timestamp-gutter > .cm-gutterElement > div": {
334
- display: "inline-flex",
335
- textAlign: "right",
336
- padding: "3px"
346
+ // src/hooks/useQueueModelAdapter.ts
347
+ var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
348
+ const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
349
+ queue
350
+ ]);
351
+ const [loaded, setLoaded] = useState3(false);
352
+ useEffect3(() => {
353
+ if (!queue) {
354
+ return;
355
+ }
356
+ const update = () => {
357
+ for (const block of queue?.objects ?? []) {
358
+ model.appendChunk(block);
337
359
  }
338
- })
339
- ];
340
- };
341
- var TimestampMarker = class extends GutterMarker {
342
- constructor(_line, _timestamp, _started) {
343
- super(), this._line = _line, this._timestamp = _timestamp, this._started = _started;
344
- }
345
- eq(other) {
346
- return other._timestamp === this._timestamp;
347
- }
348
- toDOM(view) {
349
- const el = document.createElement("div");
350
- el.className = "text-sm text-subdued hover:bg-hoverSurface cursor-pointer";
351
- el.textContent = formatTimestamp(this._timestamp, this._started);
352
- el.onclick = () => {
353
- const pos = view.state.doc.line(this._line).from;
354
- view.dispatch({
355
- effects: EditorView.scrollIntoView(pos, {
356
- y: "start"
357
- })
358
- });
359
- };
360
- return el;
361
- }
362
- };
363
- var getStartTime = (started, message) => {
364
- if (started) {
365
- return started;
366
- }
367
- if (message?.blocks[0]?._tag === "transcript" && message.blocks[0].started) {
368
- return new Date(message.blocks[0].started);
369
- }
370
- return void 0;
371
- };
372
- var formatTimestamp = (timestamp, relative) => {
373
- if (relative) {
374
- const pad = (n = 0) => String(n).padStart(2, "0");
375
- const { hours, minutes, seconds } = intervalToDuration({
376
- start: relative,
377
- end: timestamp
378
- });
379
- return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
380
- } else {
381
- return format(timestamp, "HH:mm:ss");
382
- }
383
- };
384
-
385
- // src/components/Transcript/Transcript.tsx
386
- var renderMarkdown = (identities) => (message, index, debug = false) => {
387
- if (message.sender.role === "assistant") {
388
- return [
389
- message.blocks.find((block) => block._tag === "transcript")?.text ?? "",
390
- ""
391
- ];
392
- }
393
- const identity = identities.find((identity2) => identity2.did === message.sender.identityDid);
394
- const name = identity?.profile?.displayName ?? message.sender.contact?.target?.fullName ?? message.sender.name ?? message.sender.email ?? message.sender.identityDid;
395
- const blocks = message.blocks.filter((block) => block._tag === "transcript");
396
- return [
397
- `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ""),
398
- blocks.map((block) => block.text.trim()).join(" "),
399
- ""
400
- ];
401
- };
402
- var Transcript = ({ classNames, transcript: object, space, model, attendableId, ignoreAttention }) => {
403
- var _effect = _useSignals();
404
- try {
405
- const { themeMode } = useThemeContext();
406
- const { parentRef } = useTextEditor(() => {
407
- return {
408
- extensions: [
409
- createBasicExtensions({
410
- readOnly: true,
411
- lineWrapping: true
412
- }),
413
- createMarkdownExtensions({
414
- themeMode
415
- }),
416
- createThemeExtensions({
417
- themeMode
418
- }),
419
- decorateMarkdown(),
420
- space && preview(),
421
- transcript({
422
- model,
423
- started: object?.started ? new Date(object.started) : void 0,
424
- renderButton: createRenderer(({ onClick }) => /* @__PURE__ */ React.createElement(IconButton, {
425
- icon: "ph--arrow-line-down--regular",
426
- iconOnly: true,
427
- label: "Scroll to bottom",
428
- onClick
429
- }))
430
- })
431
- ].filter(isNotFalsy)
432
- };
433
- }, [
434
- space,
435
- model
436
- ]);
437
- return /* @__PURE__ */ React.createElement("div", {
438
- ref: parentRef,
439
- className: mx("flex grow overflow-hidden", editorWidth, classNames),
440
- "data-popover-collision-boundary": true
441
- });
442
- } finally {
443
- _effect.f();
444
- }
445
- };
446
-
447
- // src/hooks/useAudioFile.ts
448
- import { useEffect, useState } from "react";
449
- import { scheduleTask } from "@dxos/async";
450
- import { Context } from "@dxos/context";
451
- import { log as log2 } from "@dxos/log";
452
- var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
453
- var useAudioFile = (audioUrl, constraints) => {
454
- const [{ audio, stream, track }, setStream] = useState({});
455
- useEffect(() => {
456
- const ctx = new Context(void 0, {
457
- F: __dxlog_file2,
458
- L: 20
459
- });
460
- scheduleTask(ctx, async () => {
461
- const response = await fetch(audioUrl);
462
- const blob = await response.blob();
463
- const objectUrl = URL.createObjectURL(blob);
464
- ctx.onDispose(() => {
465
- URL.revokeObjectURL(objectUrl);
466
- });
467
- const audio2 = new Audio();
468
- audio2.src = objectUrl;
469
- await new Promise((resolve, reject) => {
470
- audio2.addEventListener("error", (err) => {
471
- log2.error("error", {
472
- err
473
- }, {
474
- F: __dxlog_file2,
475
- L: 37,
476
- S: void 0,
477
- C: (f, a) => f(...a)
478
- });
479
- reject(err);
480
- }, {
481
- once: true
482
- });
483
- audio2.addEventListener("canplay", async () => {
484
- log2.info("starting...", void 0, {
485
- F: __dxlog_file2,
486
- L: 45,
487
- S: void 0,
488
- C: (f, a) => f(...a)
489
- });
490
- try {
491
- await audio2.play();
492
- resolve();
493
- } catch (playError) {
494
- log2.error("Play failed", {
495
- playError
496
- }, {
497
- F: __dxlog_file2,
498
- L: 51,
499
- S: void 0,
500
- C: (f, a) => f(...a)
501
- });
502
- resolve();
503
- }
504
- }, {
505
- once: true
506
- });
507
- audio2.load();
508
- });
509
- const audioCtx = new AudioContext();
510
- if (audioCtx.state === "suspended") {
511
- await audioCtx.resume();
512
- }
513
- const destination = audioCtx.createMediaStreamDestination();
514
- destination.channelCount = 1;
515
- const source = audioCtx.createMediaElementSource(audio2);
516
- source.connect(destination);
517
- const track2 = destination.stream.getAudioTracks()[0];
518
- if (constraints) {
519
- await track2.applyConstraints(constraints).catch((err) => log2.catch(err, void 0, {
520
- F: __dxlog_file2,
521
- L: 75,
522
- S: void 0,
523
- C: (f, a) => f(...a)
524
- }));
525
- }
526
- setStream({
527
- audio: audio2,
528
- stream: destination.stream,
529
- track: destination.stream.getAudioTracks()[0]
530
- });
531
- });
532
- return () => {
533
- void ctx.dispose();
534
- };
535
- }, [
536
- audioUrl
537
- ]);
538
- return {
539
- audio,
540
- stream,
541
- track
542
- };
543
- };
544
-
545
- // src/hooks/useAudioTrack.ts
546
- import { useEffect as useEffect2, useState as useState2 } from "react";
547
- var useAudioTrack = (active, constraints) => {
548
- const [track, setTrack] = useState2();
549
- useEffect2(() => {
550
- if (!active) {
551
- track?.stop();
552
- setTrack(void 0);
553
- return;
554
- }
555
- const initAudio = async () => {
556
- const audio = new Audio();
557
- audio.srcObject = await navigator.mediaDevices.getUserMedia({
558
- audio: constraints ?? true
559
- });
560
- const [track2] = audio.srcObject.getAudioTracks();
561
- if (track2) {
562
- setTrack(track2);
563
- }
564
- };
565
- if (active) {
566
- void initAudio();
567
- }
568
- }, [
569
- active
570
- ]);
571
- return track;
572
- };
573
-
574
- // src/hooks/useQueueModelAdapter.ts
575
- import { useEffect as useEffect3, useMemo, useState as useState3 } from "react";
576
- var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
577
- const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
578
- queue
579
- ]);
580
- const [loaded, setLoaded] = useState3(false);
581
- useEffect3(() => {
582
- if (!queue) {
583
- return;
584
- }
585
- const update = () => {
586
- for (const block of queue?.objects ?? []) {
587
- model.appendChunk(block);
588
- }
589
- setLoaded(true);
360
+ setLoaded(true);
590
361
  };
591
362
  let i;
592
363
  if (queue.isLoading) {
@@ -626,9 +397,10 @@ import { useCapabilities } from "@dxos/app-framework";
626
397
 
627
398
  // src/capabilities/index.ts
628
399
  import { lazy } from "@dxos/app-framework";
629
- var IntentResolver = lazy(() => import("./intent-resolver-YMN5SXNC.mjs"));
630
- var ReactSurface = lazy(() => import("./react-surface-QRDJOHN5.mjs"));
631
- var Transcriber = lazy(() => import("./transcriber-YUTEVANE.mjs"));
400
+ var BlueprintDefinition = lazy(() => import("./blueprint-definition-6SU7GLBR.mjs"));
401
+ var IntentResolver = lazy(() => import("./intent-resolver-DZBQQRHN.mjs"));
402
+ var ReactSurface = lazy(() => import("./react-surface-7UC2YXX2.mjs"));
403
+ var Transcriber = lazy(() => import("./transcriber-SMU7HD6F.mjs"));
632
404
 
633
405
  // src/hooks/useTranscriber.ts
634
406
  var useTranscriber = ({ audioStreamTrack, recorderConfig, transcriberConfig, onSegments }) => {
@@ -661,7 +433,7 @@ var useTranscriber = ({ audioStreamTrack, recorderConfig, transcriberConfig, onS
661
433
  };
662
434
 
663
435
  // src/hooks/useVoiceInput.ts
664
- import { useState as useState4, useEffect as useEffect5, useCallback } from "react";
436
+ import { useCallback, useEffect as useEffect5, useState as useState4 } from "react";
665
437
  import { scheduleMicroTask } from "@dxos/async";
666
438
  import { Context as Context2 } from "@dxos/context";
667
439
  import { log as log3 } from "@dxos/log";
@@ -683,14 +455,14 @@ var useVoiceInput = ({ active, onUpdate }) => {
683
455
  useEffect5(() => {
684
456
  const ctx = new Context2(void 0, {
685
457
  F: __dxlog_file3,
686
- L: 43
458
+ L: 44
687
459
  });
688
460
  scheduleMicroTask(ctx, async () => {
689
461
  if (active && transcriber) {
690
462
  await transcriber.open();
691
463
  log3.info("starting...", void 0, {
692
464
  F: __dxlog_file3,
693
- L: 47,
465
+ L: 48,
694
466
  S: void 0,
695
467
  C: (f, a) => f(...a)
696
468
  });
@@ -702,7 +474,7 @@ var useVoiceInput = ({ active, onUpdate }) => {
702
474
  await transcriber?.close();
703
475
  log3.info("stopped", void 0, {
704
476
  F: __dxlog_file3,
705
- L: 54,
477
+ L: 55,
706
478
  S: void 0,
707
479
  C: (f, a) => f(...a)
708
480
  });
@@ -722,6 +494,227 @@ var useVoiceInput = ({ active, onUpdate }) => {
722
494
  };
723
495
  };
724
496
 
497
+ // src/components/Transcript/Transcript.tsx
498
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
499
+ import React from "react";
500
+ import { useThemeContext } from "@dxos/react-ui";
501
+ import { autoScroll, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, preview, useTextEditor } from "@dxos/react-ui-editor";
502
+ import { mx } from "@dxos/react-ui-theme";
503
+ import { isTruthy } from "@dxos/util";
504
+
505
+ // src/components/Transcript/transcript-extension.ts
506
+ import { RangeSetBuilder } from "@codemirror/state";
507
+ import { EditorView, GutterMarker, ViewPlugin, gutter } from "@codemirror/view";
508
+ import { format } from "date-fns/format";
509
+ import { intervalToDuration } from "date-fns/intervalToDuration";
510
+ import { addEventListener, combine } from "@dxos/async";
511
+ function _define_property2(obj, key, value) {
512
+ if (key in obj) {
513
+ Object.defineProperty(obj, key, {
514
+ value,
515
+ enumerable: true,
516
+ configurable: true,
517
+ writable: true
518
+ });
519
+ } else {
520
+ obj[key] = value;
521
+ }
522
+ return obj;
523
+ }
524
+ var transcript = ({ model, started }) => {
525
+ return [
526
+ // Show timestamps in the gutter.
527
+ gutter({
528
+ class: "cm-timestamp-gutter",
529
+ lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
530
+ markers: (view) => {
531
+ const start = getStartTime(started, model.chunks[0]);
532
+ const builder = new RangeSetBuilder();
533
+ for (const { from, to } of view.visibleRanges) {
534
+ let line = view.state.doc.lineAt(from);
535
+ while (line.from <= to) {
536
+ const block = model.getChunkAtLine(line.number)?.blocks[0];
537
+ const timestamp = block?._tag === "transcript" && block.started;
538
+ if (timestamp) {
539
+ builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
540
+ }
541
+ if (line.to + 1 > view.state.doc.length) {
542
+ break;
543
+ }
544
+ line = view.state.doc.lineAt(line.to + 1);
545
+ }
546
+ }
547
+ return builder.finish();
548
+ }
549
+ }),
550
+ // Listen for model updates.
551
+ ViewPlugin.fromClass(class {
552
+ update(_update) {
553
+ if (!this._initialized) {
554
+ this._initialized = true;
555
+ setTimeout(() => {
556
+ model.sync(this._adapter);
557
+ });
558
+ }
559
+ }
560
+ destroy() {
561
+ this._controls?.remove();
562
+ this._cleanup();
563
+ }
564
+ constructor(view) {
565
+ _define_property2(this, "_controls", void 0);
566
+ _define_property2(this, "_cleanup", void 0);
567
+ _define_property2(this, "_adapter", void 0);
568
+ _define_property2(this, "_initialized", false);
569
+ this._adapter = new DocumentAdapter(view);
570
+ const scroller = view.scrollDOM;
571
+ let isAutoScrolling = false;
572
+ let hasScrolled = false;
573
+ let timeout;
574
+ const scrollToBottom = (smooth = false) => {
575
+ scroller.style.scrollBehavior = smooth ? "smooth" : "";
576
+ scroller.classList.add("cm-hide-scrollbar");
577
+ isAutoScrolling = true;
578
+ clearTimeout(timeout);
579
+ timeout = setTimeout(() => {
580
+ this._controls?.classList.add("opacity-0");
581
+ scroller.classList.remove("cm-hide-scrollbar");
582
+ isAutoScrolling = false;
583
+ }, 500);
584
+ view.dispatch({
585
+ effects: EditorView.scrollIntoView(view.state.doc.length, {
586
+ y: "end"
587
+ })
588
+ });
589
+ };
590
+ this._cleanup = combine(addEventListener(view.scrollDOM, "scroll", () => {
591
+ if (!isAutoScrolling) {
592
+ hasScrolled = true;
593
+ this._controls?.classList.remove("opacity-0");
594
+ }
595
+ }), model.update.on(() => {
596
+ const autoScroll2 = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
597
+ model.sync(this._adapter);
598
+ if (autoScroll2) {
599
+ scrollToBottom(true);
600
+ }
601
+ }));
602
+ }
603
+ }),
604
+ EditorView.theme({
605
+ ".cm-timestamp-gutter": {
606
+ width: "6rem",
607
+ paddingRight: "1rem"
608
+ },
609
+ ".cm-timestamp-gutter > .cm-gutterElement > div": {
610
+ display: "inline-flex",
611
+ textAlign: "right",
612
+ padding: "3px"
613
+ }
614
+ })
615
+ ];
616
+ };
617
+ var TimestampMarker = class extends GutterMarker {
618
+ eq(other) {
619
+ return other._timestamp === this._timestamp;
620
+ }
621
+ toDOM(view) {
622
+ const el = document.createElement("div");
623
+ el.className = "text-sm text-subdued hover:bg-hoverSurface cursor-pointer";
624
+ el.textContent = formatTimestamp(this._timestamp, this._started);
625
+ el.onclick = () => {
626
+ const pos = view.state.doc.line(this._line).from;
627
+ view.dispatch({
628
+ effects: EditorView.scrollIntoView(pos, {
629
+ y: "start"
630
+ })
631
+ });
632
+ };
633
+ return el;
634
+ }
635
+ constructor(_line, _timestamp, _started) {
636
+ super(), _define_property2(this, "_line", void 0), _define_property2(this, "_timestamp", void 0), _define_property2(this, "_started", void 0), this._line = _line, this._timestamp = _timestamp, this._started = _started;
637
+ }
638
+ };
639
+ var getStartTime = (started, message) => {
640
+ if (started) {
641
+ return started;
642
+ }
643
+ if (message?.blocks[0]?._tag === "transcript" && message.blocks[0].started) {
644
+ return new Date(message.blocks[0].started);
645
+ }
646
+ return void 0;
647
+ };
648
+ var formatTimestamp = (timestamp, relative) => {
649
+ if (relative) {
650
+ const pad = (n = 0) => String(n).padStart(2, "0");
651
+ const { hours, minutes, seconds } = intervalToDuration({
652
+ start: relative,
653
+ end: timestamp
654
+ });
655
+ return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
656
+ } else {
657
+ return format(timestamp, "HH:mm:ss");
658
+ }
659
+ };
660
+
661
+ // src/components/Transcript/Transcript.tsx
662
+ var renderByline = (identities) => (message, index, debug = false) => {
663
+ if (message.sender.role === "assistant") {
664
+ return [
665
+ message.blocks.find((block) => block._tag === "transcript")?.text ?? "",
666
+ ""
667
+ ];
668
+ }
669
+ const identity = identities.find((identity2) => identity2.did === message.sender.identityDid);
670
+ const name = identity?.profile?.displayName ?? message.sender.contact?.target?.fullName ?? message.sender.name ?? message.sender.email ?? message.sender.identityDid;
671
+ const blocks = message.blocks.filter((block) => block._tag === "transcript");
672
+ return [
673
+ // TODO(thure): Use an XML tag with the bits needed here.
674
+ `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ""),
675
+ blocks.map((block) => block.text.trim()).join(" "),
676
+ ""
677
+ ];
678
+ };
679
+ var TranscriptView = ({ classNames, space, transcript: object, model }) => {
680
+ var _effect = _useSignals();
681
+ try {
682
+ const { themeMode } = useThemeContext();
683
+ const { parentRef } = useTextEditor(() => {
684
+ return {
685
+ extensions: [
686
+ createBasicExtensions({
687
+ readOnly: true,
688
+ lineWrapping: true,
689
+ search: true
690
+ }),
691
+ createMarkdownExtensions(),
692
+ createThemeExtensions({
693
+ themeMode
694
+ }),
695
+ decorateMarkdown(),
696
+ preview(),
697
+ transcript({
698
+ model,
699
+ started: object?.started ? new Date(object.started) : void 0
700
+ }),
701
+ autoScroll()
702
+ ].filter(isTruthy)
703
+ };
704
+ }, [
705
+ space,
706
+ model
707
+ ]);
708
+ return /* @__PURE__ */ React.createElement("div", {
709
+ ref: parentRef,
710
+ className: mx("flex grow overflow-hidden container-max-width", classNames),
711
+ "data-popover-collision-boundary": true
712
+ });
713
+ } finally {
714
+ _effect.f();
715
+ }
716
+ };
717
+
725
718
  // src/components/TranscriptContainer.tsx
726
719
  var TranscriptionContainer = ({ transcript: transcript2 }) => {
727
720
  var _effect = _useSignals2();
@@ -732,10 +725,8 @@ var TranscriptionContainer = ({ transcript: transcript2 }) => {
732
725
  const queue = useQueue(transcript2.queue.dxn, {
733
726
  pollInterval: 1e3
734
727
  });
735
- const model = useQueueModelAdapter(renderMarkdown(members), queue);
736
- return /* @__PURE__ */ React2.createElement(StackItem.Content, {
737
- classNames: "container-max-width pli-2"
738
- }, /* @__PURE__ */ React2.createElement(Transcript, {
728
+ const model = useQueueModelAdapter(renderByline(members), queue);
729
+ return /* @__PURE__ */ React2.createElement(StackItem.Content, null, /* @__PURE__ */ React2.createElement(TranscriptView, {
739
730
  attendableId,
740
731
  space,
741
732
  model,
@@ -748,8 +739,8 @@ var TranscriptionContainer = ({ transcript: transcript2 }) => {
748
739
  var TranscriptContainer_default = TranscriptionContainer;
749
740
 
750
741
  export {
751
- renderMarkdown,
752
- Transcript,
742
+ renderByline,
743
+ TranscriptView,
753
744
  useAudioFile,
754
745
  useAudioTrack,
755
746
  useQueueModelAdapter,
@@ -757,8 +748,9 @@ export {
757
748
  useVoiceInput,
758
749
  TranscriptionContainer,
759
750
  TranscriptContainer_default,
751
+ BlueprintDefinition,
760
752
  IntentResolver,
761
753
  ReactSurface,
762
754
  Transcriber
763
755
  };
764
- //# sourceMappingURL=chunk-TJKAO7VR.mjs.map
756
+ //# sourceMappingURL=chunk-PEZRQYKO.mjs.map