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