@dxos/plugin-transcription 0.8.2-main.f081794 → 0.8.2-main.f11618f

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 (193) hide show
  1. package/dist/lib/browser/{TranscriptContainer-4D4BHE7G.mjs → TranscriptContainer-D3EH2SLO.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-7HN3M24G.mjs +349 -0
  3. package/dist/lib/browser/app-graph-builder-7HN3M24G.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-RHHJZQPM.mjs → chunk-BSZSM6KA.mjs} +135 -117
  5. package/dist/lib/browser/chunk-BSZSM6KA.mjs.map +7 -0
  6. package/dist/lib/browser/chunk-IWZ7C3OA.mjs +27 -0
  7. package/dist/lib/browser/chunk-IWZ7C3OA.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-DR3NBV6Q.mjs → chunk-KSUYWWIU.mjs} +105 -78
  9. package/dist/lib/browser/chunk-KSUYWWIU.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-5BE6RTNC.mjs → chunk-LTIQFX4W.mjs} +1 -1
  11. package/dist/lib/browser/{chunk-5BE6RTNC.mjs.map → chunk-LTIQFX4W.mjs.map} +1 -1
  12. package/dist/lib/browser/{chunk-5Q3R53U3.mjs → chunk-YRWBY6UK.mjs} +9 -21
  13. package/dist/lib/browser/chunk-YRWBY6UK.mjs.map +7 -0
  14. package/dist/lib/browser/index.mjs +29 -17
  15. package/dist/lib/browser/index.mjs.map +3 -3
  16. package/dist/lib/browser/{intent-resolver-ZQQEH27F.mjs → intent-resolver-ZWKYRFE7.mjs} +4 -4
  17. package/dist/lib/browser/{intent-resolver-ZQQEH27F.mjs.map → intent-resolver-ZWKYRFE7.mjs.map} +2 -2
  18. package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs → meeting-transcription-state-MNA2XROE.mjs} +2 -2
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-HETJ5XY6.mjs → react-surface-F7DBDGHS.mjs} +18 -7
  21. package/dist/lib/browser/react-surface-F7DBDGHS.mjs.map +7 -0
  22. package/dist/lib/browser/settings-6YAHKVKX.mjs +24 -0
  23. package/dist/lib/browser/settings-6YAHKVKX.mjs.map +7 -0
  24. package/dist/lib/browser/{transcriber-SMRLU2KY.mjs → transcriber-MSBS4VBI.mjs} +4 -4
  25. package/dist/lib/browser/types/index.mjs +3 -3
  26. package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs → TranscriptContainer-WCBZMA5K.cjs} +8 -8
  27. package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs.map → TranscriptContainer-WCBZMA5K.cjs.map} +2 -2
  28. package/dist/lib/node/app-graph-builder-BVWYUGUO.cjs +350 -0
  29. package/dist/lib/node/app-graph-builder-BVWYUGUO.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-LA73IHCB.cjs → chunk-7XIIUVN3.cjs} +108 -80
  31. package/dist/lib/node/chunk-7XIIUVN3.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-3QEJ5EBO.cjs → chunk-IXU57SCA.cjs} +10 -22
  33. package/dist/lib/node/chunk-IXU57SCA.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-KO6MKCED.cjs → chunk-JSCC2AQW.cjs} +138 -119
  35. package/dist/lib/node/chunk-JSCC2AQW.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-HYGDHS6X.cjs → chunk-JUGOXWES.cjs} +4 -4
  37. package/dist/lib/node/{chunk-HYGDHS6X.cjs.map → chunk-JUGOXWES.cjs.map} +1 -1
  38. package/dist/lib/node/{chunk-WXG4Z2EZ.cjs → chunk-OCHTKDL7.cjs} +23 -8
  39. package/dist/lib/node/chunk-OCHTKDL7.cjs.map +7 -0
  40. package/dist/lib/node/index.cjs +46 -34
  41. package/dist/lib/node/index.cjs.map +3 -3
  42. package/dist/lib/node/{intent-resolver-VY3XWYAA.cjs → intent-resolver-RM4JOCDV.cjs} +8 -8
  43. package/dist/lib/node/{intent-resolver-VY3XWYAA.cjs.map → intent-resolver-RM4JOCDV.cjs.map} +2 -2
  44. package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs → meeting-transcription-state-5XLTMWPA.cjs} +6 -6
  45. package/dist/lib/node/meta.json +1 -1
  46. package/dist/lib/node/{react-surface-M2JQIIDY.cjs → react-surface-7F37EYZA.cjs} +20 -11
  47. package/dist/lib/node/react-surface-7F37EYZA.cjs.map +7 -0
  48. package/dist/lib/node/settings-ZMB4XRWS.cjs +38 -0
  49. package/dist/lib/node/settings-ZMB4XRWS.cjs.map +7 -0
  50. package/dist/lib/node/{transcriber-E6AAB4SU.cjs → transcriber-55OE4X6I.cjs} +10 -10
  51. package/dist/lib/node/types/index.cjs +8 -8
  52. package/dist/lib/node/types/index.cjs.map +1 -1
  53. package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs → TranscriptContainer-GBPY6KKA.mjs} +3 -3
  54. package/dist/lib/node-esm/app-graph-builder-QK25O5K5.mjs +350 -0
  55. package/dist/lib/node-esm/app-graph-builder-QK25O5K5.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs → chunk-5E2MR5XK.mjs} +1 -1
  57. package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs.map → chunk-5E2MR5XK.mjs.map} +1 -1
  58. package/dist/lib/node-esm/{chunk-SDMGJZLN.mjs → chunk-B2BD7S4X.mjs} +135 -117
  59. package/dist/lib/node-esm/chunk-B2BD7S4X.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-DXJN2JWV.mjs +28 -0
  61. package/dist/lib/node-esm/chunk-DXJN2JWV.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-54HDN33F.mjs → chunk-OS2ITZUL.mjs} +9 -21
  63. package/dist/lib/node-esm/chunk-OS2ITZUL.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-K3R3YK3S.mjs → chunk-UWF6LM27.mjs} +105 -78
  65. package/dist/lib/node-esm/chunk-UWF6LM27.mjs.map +7 -0
  66. package/dist/lib/node-esm/index.mjs +29 -17
  67. package/dist/lib/node-esm/index.mjs.map +3 -3
  68. package/dist/lib/node-esm/{intent-resolver-FCTNJPWY.mjs → intent-resolver-HDRFXMKP.mjs} +4 -4
  69. package/dist/lib/node-esm/{intent-resolver-FCTNJPWY.mjs.map → intent-resolver-HDRFXMKP.mjs.map} +2 -2
  70. package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs → meeting-transcription-state-3WOZ52BQ.mjs} +2 -2
  71. package/dist/lib/node-esm/meta.json +1 -1
  72. package/dist/lib/node-esm/{react-surface-PXFSIM6V.mjs → react-surface-D3L6VBEV.mjs} +18 -7
  73. package/dist/lib/node-esm/react-surface-D3L6VBEV.mjs.map +7 -0
  74. package/dist/lib/node-esm/settings-I35TVDUG.mjs +25 -0
  75. package/dist/lib/node-esm/settings-I35TVDUG.mjs.map +7 -0
  76. package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs → transcriber-HH7EMCGH.mjs} +4 -4
  77. package/dist/lib/node-esm/types/index.mjs +3 -3
  78. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  81. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/index.d.ts +1 -0
  83. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/settings.d.ts +4 -0
  86. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  87. package/dist/types/src/components/Transcript/Transcript.d.ts +6 -4
  88. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  89. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +8 -4
  90. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +27 -0
  92. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -0
  93. package/dist/types/src/components/Transcript/transcript-extension.d.ts +4 -4
  94. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
  95. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +6 -0
  97. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +1 -0
  98. package/dist/types/src/components/TranscriptionSettings/index.d.ts +2 -0
  99. package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +1 -0
  100. package/dist/types/src/components/index.d.ts +1 -0
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/components/transcription.stories.d.ts +6 -3
  103. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  104. package/dist/types/src/entity-extraction/entity-extraction.d.ts +33 -7
  105. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -1
  106. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +2 -2
  107. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
  108. package/dist/types/src/model/model.d.ts +23 -23
  109. package/dist/types/src/model/model.d.ts.map +1 -1
  110. package/dist/types/src/testing/index.d.ts +2 -0
  111. package/dist/types/src/testing/index.d.ts.map +1 -0
  112. package/dist/types/src/testing/testing.d.ts +39 -0
  113. package/dist/types/src/testing/testing.d.ts.map +1 -0
  114. package/dist/types/src/transcriber/transcriber.d.ts +2 -2
  115. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  116. package/dist/types/src/transcriber/transcription-manager.d.ts +17 -15
  117. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  118. package/dist/types/src/translations.d.ts +3 -0
  119. package/dist/types/src/translations.d.ts.map +1 -1
  120. package/dist/types/src/types/schema.d.ts +0 -21
  121. package/dist/types/src/types/schema.d.ts.map +1 -1
  122. package/dist/types/src/types/types.d.ts +5 -1
  123. package/dist/types/src/types/types.d.ts.map +1 -1
  124. package/package.json +48 -45
  125. package/src/TranscriptionPlugin.tsx +29 -12
  126. package/src/capabilities/app-graph-builder.ts +99 -29
  127. package/src/capabilities/capabilities.ts +1 -1
  128. package/src/capabilities/index.ts +1 -0
  129. package/src/capabilities/intent-resolver.ts +2 -2
  130. package/src/capabilities/react-surface.tsx +12 -4
  131. package/src/capabilities/settings.ts +20 -0
  132. package/src/components/Transcript/Transcript.stories.tsx +71 -35
  133. package/src/components/Transcript/Transcript.tsx +37 -30
  134. package/src/components/Transcript/deprecated/{Transcript.tsx → OldTranscript.tsx} +24 -1
  135. package/src/components/Transcript/transcript-extension.ts +20 -17
  136. package/src/components/TranscriptContainer.tsx +6 -4
  137. package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +26 -0
  138. package/src/components/TranscriptionSettings/index.ts +5 -0
  139. package/src/components/index.ts +1 -0
  140. package/src/components/transcription.stories.tsx +77 -29
  141. package/src/entity-extraction/entity-extraction.test.ts +75 -10
  142. package/src/entity-extraction/entity-extraction.ts +110 -55
  143. package/src/entity-extraction/system-prompt.tpl +38 -9
  144. package/src/hooks/useQueueModelAdapter.ts +44 -11
  145. package/src/model/model.test.ts +85 -43
  146. package/src/model/model.ts +59 -59
  147. package/src/testing/index.ts +5 -0
  148. package/src/testing/testing.ts +208 -0
  149. package/src/transcriber/transcriber.browser.test.ts +3 -3
  150. package/src/transcriber/transcriber.ts +16 -10
  151. package/src/transcriber/transcription-manager.ts +66 -57
  152. package/src/translations.ts +2 -0
  153. package/src/types/schema.ts +1 -24
  154. package/src/types/types.ts +11 -3
  155. package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs +0 -168
  156. package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs.map +0 -7
  157. package/dist/lib/browser/chunk-5Q3R53U3.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-DR3NBV6Q.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-GI5LZ4SV.mjs +0 -8
  160. package/dist/lib/browser/chunk-GI5LZ4SV.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-RHHJZQPM.mjs.map +0 -7
  162. package/dist/lib/browser/react-surface-HETJ5XY6.mjs.map +0 -7
  163. package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs +0 -177
  164. package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs.map +0 -7
  165. package/dist/lib/node/chunk-3QEJ5EBO.cjs.map +0 -7
  166. package/dist/lib/node/chunk-KO6MKCED.cjs.map +0 -7
  167. package/dist/lib/node/chunk-LA73IHCB.cjs.map +0 -7
  168. package/dist/lib/node/chunk-WXG4Z2EZ.cjs.map +0 -7
  169. package/dist/lib/node/react-surface-M2JQIIDY.cjs.map +0 -7
  170. package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs +0 -169
  171. package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-54HDN33F.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-K3R3YK3S.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-SDMGJZLN.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-XY22OP6H.mjs +0 -10
  176. package/dist/lib/node-esm/chunk-XY22OP6H.mjs.map +0 -7
  177. package/dist/lib/node-esm/react-surface-PXFSIM6V.mjs.map +0 -7
  178. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts +0 -13
  179. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts.map +0 -1
  180. package/dist/types/src/components/Transcript/testings.d.ts +0 -51
  181. package/dist/types/src/components/Transcript/testings.d.ts.map +0 -1
  182. package/dist/types/src/testing/test-data.d.ts +0 -73
  183. package/dist/types/src/testing/test-data.d.ts.map +0 -1
  184. package/src/components/Transcript/testings.ts +0 -182
  185. package/src/testing/test-data.ts +0 -314
  186. /package/dist/lib/browser/{TranscriptContainer-4D4BHE7G.mjs.map → TranscriptContainer-D3EH2SLO.mjs.map} +0 -0
  187. /package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs.map → meeting-transcription-state-MNA2XROE.mjs.map} +0 -0
  188. /package/dist/lib/browser/{transcriber-SMRLU2KY.mjs.map → transcriber-MSBS4VBI.mjs.map} +0 -0
  189. /package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs.map → meeting-transcription-state-5XLTMWPA.cjs.map} +0 -0
  190. /package/dist/lib/node/{transcriber-E6AAB4SU.cjs.map → transcriber-55OE4X6I.cjs.map} +0 -0
  191. /package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs.map → TranscriptContainer-GBPY6KKA.mjs.map} +0 -0
  192. /package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs.map → meeting-transcription-state-3WOZ52BQ.mjs.map} +0 -0
  193. /package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs.map → transcriber-HH7EMCGH.mjs.map} +0 -0
@@ -1,18 +1,15 @@
1
1
  import {
2
2
  TranscriptionCapabilities
3
- } from "./chunk-5BE6RTNC.mjs";
3
+ } from "./chunk-LTIQFX4W.mjs";
4
4
 
5
5
  // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
6
6
  import React2 from "react";
7
7
  import { fullyQualifiedId, getSpace } from "@dxos/client/echo";
8
- import { useQueue } from "@dxos/react-client/echo";
8
+ import { useMembers, useQueue } from "@dxos/react-client/echo";
9
9
  import { StackItem } from "@dxos/react-ui-stack";
10
10
 
11
11
  // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
12
12
  import React from "react";
13
- import { DXN } from "@dxos/keys";
14
- import { log as log2 } from "@dxos/log";
15
- import { resolveRef, useClient } from "@dxos/react-client";
16
13
  import { IconButton, useThemeContext } from "@dxos/react-ui";
17
14
  import { createBasicExtensions, createMarkdownExtensions, createRenderer, createThemeExtensions, decorateMarkdown, editorWidth, preview, useTextEditor } from "@dxos/react-ui-editor";
18
15
  import { mx } from "@dxos/react-ui-theme";
@@ -67,59 +64,59 @@ var DocumentAdapter = class {
67
64
  });
68
65
  }
69
66
  };
70
- var BlockModel = class {
71
- constructor(_renderer, initialBlocks = []) {
67
+ var SerializationModel = class {
68
+ constructor(_renderer, initialChunks = []) {
72
69
  this._renderer = _renderer;
73
- this._blocks = [];
74
- this._blockLineCounts = /* @__PURE__ */ new Map();
75
- this._lineToBlock = /* @__PURE__ */ new Map();
70
+ this._chunks = [];
71
+ this._chunkLineCounts = /* @__PURE__ */ new Map();
72
+ this._lineToChunk = /* @__PURE__ */ new Map();
76
73
  this._changes = [];
77
74
  this.update = new Event();
78
- initialBlocks.forEach((block) => {
79
- this.appendBlock(block);
75
+ initialChunks.forEach((chunk) => {
76
+ this.appendChunk(chunk);
80
77
  });
81
78
  }
82
79
  toJSON() {
83
80
  return {
84
- blocks: this._blocks.length,
81
+ chunks: this._chunks.length,
85
82
  changes: this._changes.length
86
83
  };
87
84
  }
88
85
  get doc() {
89
86
  return Text.of([
90
- ...this._blocks.flatMap((block) => this._renderer(block)),
87
+ ...this._chunks.flatMap((chunk, index) => this._renderer(chunk, index)),
91
88
  ""
92
89
  ]);
93
90
  }
94
- get blocks() {
95
- return this._blocks;
91
+ get chunks() {
92
+ return this._chunks;
96
93
  }
97
94
  /**
98
95
  * Get the block ID at the given line number.
99
96
  */
100
- getBlockAtLine(line) {
101
- return this._lineToBlock.get(line);
97
+ getChunkAtLine(line) {
98
+ return this._lineToChunk.get(line);
102
99
  }
103
100
  reset() {
104
- this._blocks.length = 0;
105
- this._blockLineCounts.clear();
106
- this._lineToBlock.clear();
101
+ this._chunks.length = 0;
102
+ this._chunkLineCounts.clear();
103
+ this._lineToChunk.clear();
107
104
  this.update.emit();
108
105
  return this;
109
106
  }
110
- appendBlock(block) {
111
- const index = this._blocks.length;
112
- this._blocks.push(block);
107
+ appendChunk(chunk) {
108
+ const index = this._chunks.length;
109
+ this._chunks.push(chunk);
113
110
  this._changes.push({
114
111
  type: "append",
115
112
  index,
116
- block
113
+ chunk
117
114
  });
118
115
  this.update.emit();
119
116
  return this;
120
117
  }
121
- updateBlock(block) {
122
- const index = this._blocks.findIndex((b) => b.id === block.id);
118
+ updateChunk(chunk) {
119
+ const index = this._chunks.findIndex((c) => c.id === chunk.id);
123
120
  invariant(index !== -1, void 0, {
124
121
  F: __dxlog_file,
125
122
  L: 147,
@@ -129,17 +126,17 @@ var BlockModel = class {
129
126
  ""
130
127
  ]
131
128
  });
132
- this._blocks[index] = block;
129
+ this._chunks[index] = chunk;
133
130
  this._changes.push({
134
131
  type: "update",
135
132
  index,
136
- block
133
+ chunk
137
134
  });
138
135
  this.update.emit();
139
136
  return this;
140
137
  }
141
138
  deleteBlock(id) {
142
- const index = this._blocks.findIndex((b) => b.id === id);
139
+ const index = this._chunks.findIndex((c) => c.id === id);
143
140
  invariant(index !== -1, void 0, {
144
141
  F: __dxlog_file,
145
142
  L: 156,
@@ -149,7 +146,7 @@ var BlockModel = class {
149
146
  ""
150
147
  ]
151
148
  });
152
- this._blocks.splice(index, 1);
149
+ this._chunks.splice(index, 1);
153
150
  this._changes.push({
154
151
  type: "delete",
155
152
  index,
@@ -159,7 +156,7 @@ var BlockModel = class {
159
156
  return this;
160
157
  }
161
158
  /**
162
- * Syncs the tracked changes with the BlockDocument.
159
+ * Syncs the tracked changes with the ChunkDocument.
163
160
  */
164
161
  sync(document2) {
165
162
  log("sync", {
@@ -173,7 +170,7 @@ var BlockModel = class {
173
170
  for (const change of this._changes) {
174
171
  switch (change.type) {
175
172
  case "append": {
176
- const lines = this._renderer(change.block);
173
+ const lines = this._renderer(change.chunk, change.index);
177
174
  const lastLine = document2.lineCount();
178
175
  document2.replaceLines(lastLine + 1, 0, lines);
179
176
  break;
@@ -181,36 +178,36 @@ var BlockModel = class {
181
178
  case "update": {
182
179
  let lineStart = 1;
183
180
  for (let i = 0; i < change.index; i++) {
184
- lineStart += this._blockLineCounts.get(this._blocks[i].id);
181
+ lineStart += this._chunkLineCounts.get(this._chunks[i].id);
185
182
  }
186
- const previousLineCount = this._blockLineCounts.get(change.block.id);
187
- const newLines = this._renderer(change.block);
183
+ const previousLineCount = this._chunkLineCounts.get(change.chunk.id);
184
+ const newLines = this._renderer(change.chunk, change.index);
188
185
  document2.replaceLines(lineStart, previousLineCount, newLines);
189
186
  break;
190
187
  }
191
188
  case "delete": {
192
189
  let lineStart = 1;
193
190
  for (let i = 0; i < change.index; i++) {
194
- lineStart += this._blockLineCounts.get(this._blocks[i].id);
191
+ lineStart += this._chunkLineCounts.get(this._chunks[i].id);
195
192
  }
196
- const previousLineCount = this._blockLineCounts.get(change.id);
193
+ const previousLineCount = this._chunkLineCounts.get(change.id);
197
194
  document2.replaceLines(lineStart, previousLineCount, []);
198
195
  break;
199
196
  }
200
197
  }
201
198
  }
202
- this._lineToBlock.clear();
199
+ this._lineToChunk.clear();
203
200
  let currentLine = 1;
204
- for (const block of this._blocks) {
205
- const lineCount = this._renderer(block).length;
206
- this._blockLineCounts.set(block.id, lineCount);
207
- this._lineToBlock.set(currentLine, block);
201
+ for (const [index, chunk] of this._chunks.entries()) {
202
+ const lineCount = this._renderer(chunk, index).length;
203
+ this._chunkLineCounts.set(chunk.id, lineCount);
204
+ this._lineToChunk.set(currentLine, chunk);
208
205
  currentLine += lineCount;
209
206
  }
210
- const blockIds = new Set(this._blocks.map((block) => block.id));
211
- for (const id of this._blockLineCounts.keys()) {
212
- if (!blockIds.has(id)) {
213
- this._blockLineCounts.delete(id);
207
+ const chunkIds = new Set(this._chunks.map((chunk) => chunk.id));
208
+ for (const id of this._chunkLineCounts.keys()) {
209
+ if (!chunkIds.has(id)) {
210
+ this._chunkLineCounts.delete(id);
214
211
  }
215
212
  }
216
213
  this._changes.length = 0;
@@ -226,12 +223,13 @@ var transcript = ({ model, started, renderButton }) => {
226
223
  class: "cm-timestamp-gutter",
227
224
  lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
228
225
  markers: (view) => {
229
- const start = getStartTime(started, model.blocks[0]);
226
+ const start = getStartTime(started, model.chunks[0]);
230
227
  const builder = new RangeSetBuilder();
231
228
  for (const { from, to } of view.visibleRanges) {
232
229
  let line = view.state.doc.lineAt(from);
233
230
  while (line.from <= to) {
234
- const timestamp = model.getBlockAtLine(line.number)?.segments[0]?.started;
231
+ const block = model.getChunkAtLine(line.number)?.blocks[0];
232
+ const timestamp = block?.type === "transcription" && block.started;
235
233
  if (timestamp) {
236
234
  builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
237
235
  }
@@ -252,11 +250,13 @@ var transcript = ({ model, started, renderButton }) => {
252
250
  const scroller = view.scrollDOM;
253
251
  let isAutoScrolling = false;
254
252
  let hasScrolled = false;
255
- const scrollToBottom = () => {
256
- scroller.style.scrollBehavior = "smooth";
253
+ let timeout;
254
+ const scrollToBottom = (smooth = false) => {
255
+ scroller.style.scrollBehavior = smooth ? "smooth" : "";
257
256
  scroller.classList.add("cm-hide-scrollbar");
258
257
  isAutoScrolling = true;
259
- setTimeout(() => {
258
+ clearTimeout(timeout);
259
+ timeout = setTimeout(() => {
260
260
  this._controls?.classList.add("opacity-0");
261
261
  scroller.classList.remove("cm-hide-scrollbar");
262
262
  isAutoScrolling = false;
@@ -273,7 +273,7 @@ var transcript = ({ model, started, renderButton }) => {
273
273
  view.dom.appendChild(this._controls);
274
274
  renderButton(this._controls, {
275
275
  onClick: () => {
276
- scrollToBottom();
276
+ scrollToBottom(false);
277
277
  }
278
278
  }, view);
279
279
  }
@@ -286,7 +286,7 @@ var transcript = ({ model, started, renderButton }) => {
286
286
  const autoScroll = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
287
287
  model.sync(this._adapter);
288
288
  if (autoScroll) {
289
- scrollToBottom();
289
+ scrollToBottom(true);
290
290
  }
291
291
  }));
292
292
  }
@@ -360,39 +360,46 @@ var TimestampMarker = class extends GutterMarker {
360
360
  return el;
361
361
  }
362
362
  };
363
- var getStartTime = (started, block) => {
363
+ var getStartTime = (started, message) => {
364
364
  if (started) {
365
365
  return started;
366
366
  }
367
- if (block?.segments[0]?.started) {
368
- return new Date(block.segments[0].started);
367
+ if (message?.blocks[0]?.type === "transcription" && message.blocks[0].started) {
368
+ return new Date(message.blocks[0].started);
369
369
  }
370
370
  return void 0;
371
371
  };
372
372
  var formatTimestamp = (timestamp, relative) => {
373
- if (!relative) {
374
- return format(timestamp, "HH:mm:ss");
375
- } else {
373
+ if (relative) {
376
374
  const pad = (n = 0) => String(n).padStart(2, "0");
377
375
  const { hours, minutes, seconds } = intervalToDuration({
378
376
  start: relative,
379
377
  end: timestamp
380
378
  });
381
379
  return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
380
+ } else {
381
+ return format(timestamp, "HH:mm:ss");
382
382
  }
383
383
  };
384
384
 
385
385
  // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
386
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx";
387
- var renderMarkdown = (block, debug = false) => {
386
+ var renderMarkdown = (identities) => (message, index, debug = false) => {
387
+ if (message.sender.role === "assistant") {
388
+ return [
389
+ message.blocks.find((block) => block.type === "transcription")?.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.type === "transcription");
388
396
  return [
389
- `###### ${block.authorName}` + (debug ? ` (${block.id})` : ""),
390
- block.segments.map((segment) => segment.text.trim()).join(" "),
397
+ `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ""),
398
+ blocks.map((block) => block.text.trim()).join(" "),
391
399
  ""
392
400
  ];
393
401
  };
394
402
  var Transcript = ({ classNames, transcript: object, space, model, attendableId, ignoreAttention }) => {
395
- const client = useClient();
396
403
  const { themeMode } = useThemeContext();
397
404
  const { parentRef } = useTextEditor(() => {
398
405
  return {
@@ -408,28 +415,7 @@ var Transcript = ({ classNames, transcript: object, space, model, attendableId,
408
415
  themeMode
409
416
  }),
410
417
  decorateMarkdown(),
411
- space && preview({
412
- onLookup: async ({ label, ref }) => {
413
- log2.info("onLookup", {
414
- label,
415
- ref
416
- }, {
417
- F: __dxlog_file2,
418
- L: 71,
419
- S: void 0,
420
- C: (f, a) => f(...a)
421
- });
422
- const dxn = DXN.parse(ref);
423
- if (!dxn) {
424
- return null;
425
- }
426
- const object2 = await resolveRef(client, dxn, space);
427
- return {
428
- label,
429
- object: object2
430
- };
431
- }
432
- }),
418
+ space && preview(),
433
419
  transcript({
434
420
  model,
435
421
  started: object?.started ? new Date(object.started) : void 0,
@@ -448,14 +434,15 @@ var Transcript = ({ classNames, transcript: object, space, model, attendableId,
448
434
  ]);
449
435
  return /* @__PURE__ */ React.createElement("div", {
450
436
  ref: parentRef,
451
- className: mx("flex grow overflow-hidden", editorWidth, classNames)
437
+ className: mx("flex grow overflow-hidden", editorWidth, classNames),
438
+ "data-popover-collision-boundary": true
452
439
  });
453
440
  };
454
441
 
455
442
  // packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts
456
443
  import { useEffect, useState } from "react";
457
- import { log as log3 } from "@dxos/log";
458
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
444
+ import { log as log2 } from "@dxos/log";
445
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
459
446
  var useAudioFile = (audioUrl) => {
460
447
  const [{ audio, stream, track }, setStream] = useState({});
461
448
  useEffect(() => {
@@ -466,10 +453,10 @@ var useAudioFile = (audioUrl) => {
466
453
  audio2.src = URL.createObjectURL(blob);
467
454
  await new Promise((resolve, reject) => {
468
455
  audio2.addEventListener("error", (err) => {
469
- log3.error("error", {
456
+ log2.error("error", {
470
457
  err
471
458
  }, {
472
- F: __dxlog_file3,
459
+ F: __dxlog_file2,
473
460
  L: 27,
474
461
  S: void 0,
475
462
  C: (f, a) => f(...a)
@@ -479,8 +466,8 @@ var useAudioFile = (audioUrl) => {
479
466
  once: true
480
467
  });
481
468
  audio2.addEventListener("canplay", () => {
482
- log3.info("starting...", void 0, {
483
- F: __dxlog_file3,
469
+ log2.info("starting...", void 0, {
470
+ F: __dxlog_file2,
484
471
  L: 35,
485
472
  S: void 0,
486
473
  C: (f, a) => f(...a)
@@ -543,19 +530,47 @@ var useAudioTrack = (active) => {
543
530
  };
544
531
 
545
532
  // packages/plugins/plugin-transcription/src/hooks/useQueueModelAdapter.ts
546
- import { useMemo, useEffect as useEffect3 } from "react";
547
- var useQueueModelAdapter = (renderer, queue, initialBlocks = []) => {
548
- const model = useMemo(() => new BlockModel(renderer, initialBlocks), [
533
+ import { useMemo, useEffect as useEffect3, useState as useState3 } from "react";
534
+ var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
535
+ const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
549
536
  queue
550
537
  ]);
538
+ const [loaded, setLoaded] = useState3(false);
551
539
  useEffect3(() => {
552
- if (!queue?.items.length) {
540
+ if (!queue) {
553
541
  return;
554
542
  }
555
- const block = queue.items[queue.items.length - 1];
556
- model.appendBlock(block);
543
+ const update = () => {
544
+ for (const block of queue?.items ?? []) {
545
+ model.appendChunk(block);
546
+ }
547
+ setLoaded(true);
548
+ };
549
+ let i;
550
+ if (queue.isLoading) {
551
+ i = setInterval(() => {
552
+ if (!queue?.isLoading) {
553
+ clearInterval(i);
554
+ update();
555
+ }
556
+ }, 1e3);
557
+ } else {
558
+ update();
559
+ }
560
+ return () => clearTimeout(i);
561
+ }, [
562
+ model,
563
+ queue
564
+ ]);
565
+ useEffect3(() => {
566
+ if (!loaded || !queue || model.chunks.length === queue.items.length) {
567
+ return;
568
+ }
569
+ const chunk = queue.items[queue.items.length - 1];
570
+ model.appendChunk(chunk);
557
571
  }, [
558
572
  model,
573
+ loaded,
559
574
  queue?.items.length
560
575
  ]);
561
576
  return model;
@@ -567,11 +582,12 @@ import { useCapabilities } from "@dxos/app-framework";
567
582
 
568
583
  // packages/plugins/plugin-transcription/src/capabilities/index.ts
569
584
  import { lazy } from "@dxos/app-framework";
570
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-I4SSIQMW.mjs"));
571
- var IntentResolver = lazy(() => import("./intent-resolver-ZQQEH27F.mjs"));
572
- var MeetingTranscriptionState = lazy(() => import("./meeting-transcription-state-5D52VTHU.mjs"));
573
- var ReactSurface = lazy(() => import("./react-surface-HETJ5XY6.mjs"));
574
- var Transcriber = lazy(() => import("./transcriber-SMRLU2KY.mjs"));
585
+ var AppGraphBuilder = lazy(() => import("./app-graph-builder-7HN3M24G.mjs"));
586
+ var IntentResolver = lazy(() => import("./intent-resolver-ZWKYRFE7.mjs"));
587
+ var MeetingTranscriptionState = lazy(() => import("./meeting-transcription-state-MNA2XROE.mjs"));
588
+ var ReactSurface = lazy(() => import("./react-surface-F7DBDGHS.mjs"));
589
+ var Transcriber = lazy(() => import("./transcriber-MSBS4VBI.mjs"));
590
+ var Settings = lazy(() => import("./settings-6YAHKVKX.mjs"));
575
591
 
576
592
  // packages/plugins/plugin-transcription/src/hooks/useTranscriber.ts
577
593
  var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
@@ -602,12 +618,12 @@ var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
602
618
  };
603
619
 
604
620
  // packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts
605
- import { useState as useState3, useEffect as useEffect5, useCallback } from "react";
621
+ import { useState as useState4, useEffect as useEffect5, useCallback } from "react";
606
622
  import { scheduleMicroTask } from "@dxos/async";
607
623
  import { Context } from "@dxos/context";
608
- import { log as log4 } from "@dxos/log";
624
+ import { log as log3 } from "@dxos/log";
609
625
  import { useSoundEffect } from "@dxos/react-ui-sfx";
610
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
626
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
611
627
  var useVoiceInput = ({ active, onUpdate }) => {
612
628
  const soundStart = useSoundEffect("StartRecording");
613
629
  const soundStop = useSoundEffect("StopRecording");
@@ -615,7 +631,7 @@ var useVoiceInput = ({ active, onUpdate }) => {
615
631
  const text = segments.map((str) => str.text.trim().replace(/[^\w\s]/g, "")).join(" ");
616
632
  onUpdate(text);
617
633
  }, []);
618
- const [recording, setRecording] = useState3(false);
634
+ const [recording, setRecording] = useState4(false);
619
635
  const track = useAudioTrack(active);
620
636
  const transcriber = useTranscriber({
621
637
  audioStreamTrack: track,
@@ -623,14 +639,14 @@ var useVoiceInput = ({ active, onUpdate }) => {
623
639
  });
624
640
  useEffect5(() => {
625
641
  const ctx = new Context(void 0, {
626
- F: __dxlog_file4,
642
+ F: __dxlog_file3,
627
643
  L: 43
628
644
  });
629
645
  scheduleMicroTask(ctx, async () => {
630
646
  if (active && transcriber) {
631
647
  await transcriber.open();
632
- log4.info("starting...", void 0, {
633
- F: __dxlog_file4,
648
+ log3.info("starting...", void 0, {
649
+ F: __dxlog_file3,
634
650
  L: 47,
635
651
  S: void 0,
636
652
  C: (f, a) => f(...a)
@@ -641,8 +657,8 @@ var useVoiceInput = ({ active, onUpdate }) => {
641
657
  } else if (!active && transcriber?.isOpen) {
642
658
  transcriber?.stopChunksRecording();
643
659
  await transcriber?.close();
644
- log4.info("stopped", void 0, {
645
- F: __dxlog_file4,
660
+ log3.info("stopped", void 0, {
661
+ F: __dxlog_file3,
646
662
  L: 54,
647
663
  S: void 0,
648
664
  C: (f, a) => f(...a)
@@ -667,10 +683,11 @@ var useVoiceInput = ({ active, onUpdate }) => {
667
683
  var TranscriptionContainer = ({ role, transcript: transcript2 }) => {
668
684
  const attendableId = fullyQualifiedId(transcript2);
669
685
  const space = getSpace(transcript2);
686
+ const members = useMembers(space?.key).map((member) => member.identity);
670
687
  const queue = useQueue(transcript2.queue.dxn, {
671
688
  pollInterval: 1e3
672
689
  });
673
- const model = useQueueModelAdapter(renderMarkdown, queue);
690
+ const model = useQueueModelAdapter(renderMarkdown(members), queue);
674
691
  return /* @__PURE__ */ React2.createElement(StackItem.Content, {
675
692
  role,
676
693
  classNames: "container-max-width pli-2"
@@ -697,6 +714,7 @@ export {
697
714
  IntentResolver,
698
715
  MeetingTranscriptionState,
699
716
  ReactSurface,
700
- Transcriber
717
+ Transcriber,
718
+ Settings
701
719
  };
702
- //# sourceMappingURL=chunk-RHHJZQPM.mjs.map
720
+ //# sourceMappingURL=chunk-BSZSM6KA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TranscriptContainer.tsx", "../../../src/components/Transcript/Transcript.tsx", "../../../src/components/Transcript/transcript-extension.ts", "../../../src/model/model.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useQueueModelAdapter.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/capabilities/index.ts", "../../../src/hooks/useVoiceInput.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { fullyQualifiedId, getSpace } from '@dxos/client/echo';\nimport { useMembers, useQueue } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { type MessageType } from '@dxos/schema';\n\nimport { Transcript, renderMarkdown } from './Transcript';\nimport { useQueueModelAdapter } from '../hooks';\nimport { type TranscriptType } from '../types';\n\nexport const TranscriptionContainer: FC<{ role: string; transcript: TranscriptType }> = ({ role, transcript }) => {\n const attendableId = fullyQualifiedId(transcript);\n const space = getSpace(transcript);\n const members = useMembers(space?.key).map((member) => member.identity);\n const queue = useQueue<MessageType>(transcript.queue.dxn, { pollInterval: 1_000 });\n const model = useQueueModelAdapter(renderMarkdown(members), queue);\n\n return (\n <StackItem.Content role={role} classNames='container-max-width pli-2'>\n <Transcript attendableId={attendableId} space={space} model={model} transcript={transcript} />\n </StackItem.Content>\n );\n};\n\nexport default TranscriptionContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { IconButton, type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport {\n createBasicExtensions,\n createMarkdownExtensions,\n createRenderer,\n createThemeExtensions,\n decorateMarkdown,\n editorWidth,\n preview,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type MessageType } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { transcript } from './transcript-extension';\nimport { type SerializationModel } from '../../model';\nimport { type TranscriptType } from '../../types';\n\nexport const renderMarkdown =\n (identities: Identity[]) =>\n (message: MessageType, index: number, debug = false): string[] => {\n if (message.sender.role === 'assistant') {\n // Start/stop block.\n return [message.blocks.find((block) => block.type === 'transcription')?.text ?? '', ''];\n }\n\n // TODO(burdon): Use link/reference markup for users (with popover).\n // TODO(burdon): Color and avatar.\n const identity = identities.find((identity) => identity.did === message.sender.identityDid);\n const name =\n identity?.profile?.displayName ??\n message.sender.contact?.target?.fullName ??\n message.sender.name ??\n message.sender.email ??\n message.sender.identityDid;\n const blocks = message.blocks.filter((block) => block.type === 'transcription');\n return [\n `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ''),\n blocks.map((block) => block.text.trim()).join(' '),\n '',\n ];\n };\n\nexport type TranscriptProps = ThemedClassName<{\n transcript?: TranscriptType;\n space?: Space;\n model: SerializationModel<MessageType>;\n // TODO(wittjosiah): Move to container.\n attendableId?: string;\n ignoreAttention?: boolean;\n}>;\n\n/**\n * Transcript component implemented using the editor.\n */\nexport const Transcript = ({\n classNames,\n transcript: object,\n space,\n model,\n attendableId,\n ignoreAttention,\n}: TranscriptProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n extensions: [\n createBasicExtensions({ readOnly: true, lineWrapping: true }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode }),\n decorateMarkdown(),\n space && preview(),\n transcript({\n model,\n started: object?.started ? new Date(object.started) : undefined,\n renderButton: createRenderer(({ onClick }) => (\n <IconButton icon='ph--arrow-line-down--regular' iconOnly label='Scroll to bottom' onClick={onClick} />\n )),\n }),\n ].filter(isNotFalsy),\n };\n }, [space, model]);\n\n return (\n <div\n ref={parentRef}\n className={mx('flex grow overflow-hidden', editorWidth, classNames)}\n data-popover-collision-boundary={true}\n />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, GutterMarker, ViewPlugin, type ViewUpdate, gutter } from '@codemirror/view';\nimport { format } from 'date-fns/format';\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\n\nimport { type CleanupFn, addEventListener, combine } from '@dxos/async';\nimport { type RenderCallback } from '@dxos/react-ui-editor';\nimport { type MessageType } from '@dxos/schema';\n\nimport { DocumentAdapter, type SerializationModel } from '../../model';\n\n/**\n * Data structure that maps Chunks queue to lines with transcript state.\n */\nexport type TranscriptOptions = {\n model: SerializationModel<MessageType>;\n started?: Date;\n renderButton?: RenderCallback<{ onClick: () => void }>;\n};\n\n/**\n * Scrolling transcript with timestamps.\n */\nexport const transcript = ({ model, started, renderButton }: TranscriptOptions): Extension => {\n return [\n // Show timestamps in the gutter.\n gutter({\n class: 'cm-timestamp-gutter',\n lineMarkerChange: (update) => update.docChanged || update.viewportChanged,\n markers: (view) => {\n const start = getStartTime(started, model.chunks[0]);\n const builder = new RangeSetBuilder<GutterMarker>();\n for (const { from, to } of view.visibleRanges) {\n let line = view.state.doc.lineAt(from);\n while (line.from <= to) {\n const block = model.getChunkAtLine(line.number)?.blocks[0];\n const timestamp = block?.type === 'transcription' && block.started;\n if (timestamp) {\n builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));\n }\n\n if (line.to + 1 > view.state.doc.length) {\n break;\n }\n\n line = view.state.doc.lineAt(line.to + 1);\n }\n }\n\n return builder.finish();\n },\n }),\n\n // Listen for model updates.\n ViewPlugin.fromClass(\n class {\n private readonly _controls?: HTMLDivElement;\n private readonly _cleanup: CleanupFn;\n private readonly _adapter: DocumentAdapter;\n private _initialized = false;\n\n constructor(view: EditorView) {\n this._adapter = new DocumentAdapter(view);\n\n const scroller = view.scrollDOM;\n let isAutoScrolling = false;\n let hasScrolled = false;\n\n let timeout: NodeJS.Timeout | undefined;\n const scrollToBottom = (smooth = false) => {\n scroller.style.scrollBehavior = smooth ? 'smooth' : '';\n\n // Temporarily hide scrollbar to prevent flicker.\n scroller.classList.add('cm-hide-scrollbar');\n isAutoScrolling = true;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n this._controls?.classList.add('opacity-0');\n scroller.classList.remove('cm-hide-scrollbar');\n isAutoScrolling = false;\n }, 500);\n\n // Scroll to bottom.\n view.dispatch({\n effects: EditorView.scrollIntoView(view.state.doc.length, { y: 'end' }),\n });\n };\n\n // Scroll button.\n if (renderButton) {\n this._controls = document.createElement('div');\n this._controls.classList.add('cm-controls', 'transition-opacity', 'duration-300', 'opacity-0');\n view.dom.appendChild(this._controls);\n renderButton(\n this._controls,\n {\n onClick: () => {\n scrollToBottom(false);\n },\n },\n view,\n );\n }\n\n // Event listeners.\n this._cleanup = combine(\n addEventListener(view.scrollDOM, 'scroll', () => {\n if (!isAutoScrolling) {\n hasScrolled = true;\n this._controls?.classList.remove('opacity-0');\n }\n }),\n\n model.update.on(() => {\n // Check if clamped to bottom.\n const autoScroll =\n scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;\n\n // Sync.\n model.sync(this._adapter);\n\n // Scroll.\n if (autoScroll) {\n scrollToBottom(true);\n }\n }),\n );\n }\n\n update(update: ViewUpdate) {\n // Initial sync.\n if (!this._initialized) {\n this._initialized = true;\n setTimeout(() => {\n model.sync(this._adapter);\n });\n }\n }\n\n destroy() {\n this._controls?.remove();\n this._cleanup();\n }\n },\n ),\n\n EditorView.theme({\n '.cm-scroller': {\n overflowY: 'scroll',\n },\n '.cm-hide-scrollbar': {\n scrollbarWidth: 'none',\n '-ms-overflow-style': 'none',\n },\n '.cm-hide-scrollbar::-webkit-scrollbar': {\n display: 'none',\n },\n '.cm-controls': {\n position: 'absolute',\n bottom: '0.5rem',\n right: '0.5rem',\n zIndex: 1000,\n },\n '.cm-line': {\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter': {\n width: '6rem',\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter > .cm-gutterElement > div': {\n display: 'inline-flex',\n textAlign: 'right',\n padding: '3px',\n },\n }),\n ];\n};\n\n/**\n * Gutter marker that displays a timestamp.\n */\nclass TimestampMarker extends GutterMarker {\n constructor(\n readonly _line: number,\n readonly _timestamp: Date,\n readonly _started?: Date,\n ) {\n super();\n }\n\n override eq(other: this) {\n return other._timestamp === this._timestamp;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('div');\n el.className = 'text-sm text-subdued hover:bg-hoverSurface cursor-pointer';\n el.textContent = formatTimestamp(this._timestamp, this._started);\n // TODO(burdon): Click to bookmark or copy hyperlink.\n el.onclick = () => {\n const pos = view.state.doc.line(this._line).from;\n view.dispatch({\n effects: EditorView.scrollIntoView(pos, { y: 'start' }),\n });\n };\n\n return el;\n }\n}\n\nconst getStartTime = (started?: Date, message?: MessageType): Date | undefined => {\n if (started) {\n return started;\n }\n\n if (message?.blocks[0]?.type === 'transcription' && message.blocks[0].started) {\n return new Date(message.blocks[0].started);\n }\n\n return undefined;\n};\n\nconst formatTimestamp = (timestamp: Date, relative?: Date) => {\n if (relative) {\n const pad = (n = 0) => String(n).padStart(2, '0');\n const { hours, minutes, seconds } = intervalToDuration({ start: relative, end: timestamp });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n } else {\n return format(timestamp, 'HH:mm:ss');\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Text } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nexport type Chunk = { id: string };\n\n/**\n * Covert block to a set of markdown lines.\n */\nexport type ChunkRenderer<T extends Chunk> = (chunk: T, index: number, debug?: boolean) => string[];\n\n/**\n * Abstract representation of the document model.\n */\nexport interface ChunkDocument {\n lineCount(): number;\n replaceLines(from: number, remove: number, insert: string[]): void;\n}\n\n/**\n * Codemirror document adapter.\n */\nexport class DocumentAdapter implements ChunkDocument {\n constructor(private readonly _view: EditorView) {}\n\n /** The document must always have at least one line. */\n lineCount(): number {\n return this._view.state.doc.lines - 1;\n }\n\n replaceLines(from: number, remove: number, insert: string[]): void {\n log('replaceLines', { count: this._view.state.doc.lines, from, remove, insert });\n\n const numLines = this._view.state.doc.lines;\n const posFrom = this._view.state.doc.line(from).from;\n const posTo = remove === 0 ? posFrom : this._view.state.doc.line(Math.min(numLines, from + remove)).from;\n\n // Don't remove the last line.\n let text = insert.join('\\n');\n if (posTo === this._view.state.doc.length) {\n text += '\\n';\n }\n\n this._view.dispatch({\n changes: { from: posFrom, to: posTo, insert: text },\n });\n }\n}\n\ntype ChunkChange<T extends Chunk> =\n | {\n type: 'append';\n index: number;\n chunk: T;\n }\n | {\n type: 'update';\n index: number;\n chunk: T;\n }\n | {\n type: 'delete';\n index: number;\n id: string;\n };\n\n/**\n * Each Chunk can be converted into a set of lines.\n * Chunks can be added, updated or deleted from the Queue.\n * A Document is an immutable projection that represents a flat list of lines corresponding to the Queue.\n *\n * Ideally we would implement a custom virtual Text model for the View, but this currently isn't possible in Codemirror.\n * Instead this model tracks changes and syncs them with the ChunkDocument.\n */\nexport class SerializationModel<T extends Chunk> {\n /** Ordered set of chunks. */\n private readonly _chunks: T[] = [];\n\n /** Map of chunk IDs to their current line counts. */\n private readonly _chunkLineCounts = new Map<string, number>();\n\n /** Map of line numbers to chunk IDs. */\n private readonly _lineToChunk = new Map<number, T>();\n\n /** Track chunk changes since last sync. */\n private readonly _changes: Array<ChunkChange<T>> = [];\n\n /** Emits when the document is updated. */\n public readonly update = new Event<void>();\n\n constructor(\n private readonly _renderer: ChunkRenderer<T>,\n initialChunks: T[] = [],\n ) {\n initialChunks.forEach((chunk) => {\n this.appendChunk(chunk);\n });\n }\n\n toJSON() {\n return {\n chunks: this._chunks.length,\n changes: this._changes.length,\n };\n }\n\n get doc() {\n return Text.of([...this._chunks.flatMap((chunk, index) => this._renderer(chunk, index)), '']);\n }\n\n get chunks() {\n return this._chunks;\n }\n\n /**\n * Get the block ID at the given line number.\n */\n getChunkAtLine(line: number): T | undefined {\n return this._lineToChunk.get(line);\n }\n\n reset(): this {\n this._chunks.length = 0;\n this._chunkLineCounts.clear();\n this._lineToChunk.clear();\n this.update.emit();\n return this;\n }\n\n appendChunk(chunk: T): this {\n const index = this._chunks.length;\n this._chunks.push(chunk);\n this._changes.push({ type: 'append', index, chunk });\n this.update.emit();\n return this;\n }\n\n updateChunk(chunk: T): this {\n const index = this._chunks.findIndex((c) => c.id === chunk.id);\n invariant(index !== -1);\n this._chunks[index] = chunk;\n this._changes.push({ type: 'update', index, chunk });\n this.update.emit();\n return this;\n }\n\n deleteBlock(id: string): this {\n const index = this._chunks.findIndex((c) => c.id === id);\n invariant(index !== -1);\n this._chunks.splice(index, 1);\n this._changes.push({ type: 'delete', index, id });\n this.update.emit();\n return this;\n }\n\n /**\n * Syncs the tracked changes with the ChunkDocument.\n */\n sync(document: ChunkDocument): this {\n log('sync', { changes: this._changes });\n\n // Process each change in order.\n for (const change of this._changes) {\n switch (change.type) {\n case 'append': {\n // For appends, convert block to lines and add at the end.\n const lines = this._renderer(change.chunk, change.index);\n const lastLine = document.lineCount();\n document.replaceLines(lastLine + 1, 0, lines);\n break;\n }\n\n case 'update': {\n // For updates, find the block's line range and replace with new lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.chunk.id)!;\n const newLines = this._renderer(change.chunk, change.index);\n document.replaceLines(lineStart, previousLineCount, newLines);\n break;\n }\n\n case 'delete': {\n // For deletes, find the block's line range and remove those lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.id)!;\n document.replaceLines(lineStart, previousLineCount, []);\n break;\n }\n }\n }\n\n // Clear the line-to-block mapping.\n this._lineToChunk.clear();\n\n // Update all block line counts and line-to-block mapping after processing changes.\n let currentLine = 1;\n for (const [index, chunk] of this._chunks.entries()) {\n const lineCount = this._renderer(chunk, index).length;\n this._chunkLineCounts.set(chunk.id, lineCount);\n this._lineToChunk.set(currentLine, chunk);\n currentLine += lineCount;\n }\n\n // Clean up deleted blocks.\n const chunkIds = new Set(this._chunks.map((chunk) => chunk.id));\n for (const id of this._chunkLineCounts.keys()) {\n if (!chunkIds.has(id)) {\n this._chunkLineCounts.delete(id);\n }\n }\n\n // Clear changes after sync.\n this._changes.length = 0;\n return this;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { 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 { useMemo, useEffect, useState } from 'react';\n\nimport { type Queue } from '@dxos/react-client/echo';\n\nimport { type Chunk, type ChunkRenderer, SerializationModel } from '../model';\n\n/**\n * Model adapter for a queue.\n */\nexport const useQueueModelAdapter = <T extends Chunk>(\n renderer: ChunkRenderer<T>,\n queue: Queue<T> | undefined,\n initialChunks: T[] = [],\n): SerializationModel<T> => {\n const model = useMemo(() => new SerializationModel<T>(renderer, initialChunks), [queue]);\n const [loaded, setLoaded] = useState(false);\n\n // Set initial blocks.\n useEffect(() => {\n if (!queue) {\n return;\n }\n\n const update = () => {\n for (const block of queue?.items ?? []) {\n model.appendChunk(block);\n }\n\n setLoaded(true);\n };\n\n // TODO(burdon): This is a hack to ensure the queue is loaded.\n let i: NodeJS.Timeout | undefined;\n if (queue.isLoading) {\n i = setInterval(() => {\n if (!queue?.isLoading) {\n clearInterval(i);\n update();\n }\n }, 1_000);\n } else {\n update();\n }\n\n return () => clearTimeout(i);\n }, [model, queue]);\n\n // TODO(burdon): Can we listen for queue events?\n useEffect(() => {\n if (!loaded || !queue || model.chunks.length === queue.items.length) {\n return;\n }\n\n const chunk = queue.items[queue.items.length - 1];\n model.appendChunk(chunk);\n }, [model, loaded, queue?.items.length]);\n\n return model;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework';\n\nimport { TranscriptionCapabilities } from '../capabilities';\nimport { type Transcriber } from '../transcriber';\n\n/**\n * Records audio while user is speaking and transcribes it after user is done speaking.\n */\nexport const useTranscriber = ({\n audioStreamTrack,\n onSegments,\n config,\n}: Partial<TranscriptionCapabilities.GetTranscriberProps>) => {\n const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);\n\n // Initialize audio transcription.\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!onSegments || !audioStreamTrack || !getTranscriber) {\n return undefined;\n }\n\n return getTranscriber({ audioStreamTrack, onSegments, config });\n }, [audioStreamTrack, onSegments, getTranscriber, config]);\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 { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const MeetingTranscriptionState = lazy(() => import('./meeting-transcription-state'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const Transcriber = lazy(() => import('./transcriber'));\nexport const Settings = lazy(() => import('./settings'));\n\nexport * from './capabilities';\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"],
5
+ "mappings": "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",
6
+ "names": ["React", "fullyQualifiedId", "getSpace", "useMembers", "useQueue", "StackItem", "React", "IconButton", "useThemeContext", "createBasicExtensions", "createMarkdownExtensions", "createRenderer", "createThemeExtensions", "decorateMarkdown", "editorWidth", "preview", "useTextEditor", "mx", "isNotFalsy", "RangeSetBuilder", "EditorView", "GutterMarker", "ViewPlugin", "gutter", "format", "intervalToDuration", "addEventListener", "combine", "Text", "Event", "invariant", "log", "DocumentAdapter", "constructor", "_view", "lineCount", "state", "doc", "lines", "replaceLines", "from", "remove", "insert", "count", "numLines", "posFrom", "line", "posTo", "Math", "min", "text", "join", "length", "dispatch", "changes", "to", "SerializationModel", "_renderer", "initialChunks", "_chunks", "_chunkLineCounts", "Map", "_lineToChunk", "_changes", "update", "forEach", "chunk", "appendChunk", "toJSON", "chunks", "of", "flatMap", "index", "getChunkAtLine", "get", "reset", "clear", "emit", "push", "type", "updateChunk", "findIndex", "c", "id", "deleteBlock", "splice", "sync", "document", "change", "lastLine", "lineStart", "i", "previousLineCount", "newLines", "currentLine", "entries", "set", "chunkIds", "Set", "map", "keys", "has", "delete", "transcript", "model", "started", "renderButton", "gutter", "class", "lineMarkerChange", "update", "docChanged", "viewportChanged", "markers", "view", "start", "getStartTime", "chunks", "builder", "RangeSetBuilder", "from", "to", "visibleRanges", "line", "state", "doc", "lineAt", "block", "getChunkAtLine", "number", "blocks", "timestamp", "type", "add", "TimestampMarker", "Date", "length", "finish", "ViewPlugin", "fromClass", "constructor", "_initialized", "_adapter", "DocumentAdapter", "scroller", "scrollDOM", "isAutoScrolling", "hasScrolled", "timeout", "scrollToBottom", "smooth", "style", "scrollBehavior", "classList", "clearTimeout", "setTimeout", "_controls", "remove", "dispatch", "effects", "EditorView", "scrollIntoView", "y", "document", "createElement", "dom", "appendChild", "onClick", "_cleanup", "combine", "addEventListener", "on", "autoScroll", "scrollHeight", "scrollTop", "clientHeight", "sync", "destroy", "theme", "overflowY", "scrollbarWidth", "display", "position", "bottom", "right", "zIndex", "paddingRight", "width", "textAlign", "padding", "GutterMarker", "_line", "_timestamp", "_started", "eq", "other", "toDOM", "el", "className", "textContent", "formatTimestamp", "onclick", "pos", "message", "undefined", "relative", "pad", "n", "String", "padStart", "hours", "minutes", "seconds", "intervalToDuration", "end", "format", "renderMarkdown", "identities", "message", "index", "debug", "sender", "role", "blocks", "find", "block", "type", "text", "identity", "did", "identityDid", "name", "profile", "displayName", "contact", "target", "fullName", "email", "filter", "id", "map", "trim", "join", "Transcript", "classNames", "transcript", "object", "space", "model", "attendableId", "ignoreAttention", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "extensions", "createBasicExtensions", "readOnly", "lineWrapping", "createMarkdownExtensions", "createThemeExtensions", "decorateMarkdown", "preview", "started", "Date", "undefined", "renderButton", "createRenderer", "onClick", "IconButton", "icon", "iconOnly", "label", "isNotFalsy", "div", "ref", "className", "mx", "editorWidth", "data-popover-collision-boundary", "useEffect", "useState", "log", "useAudioFile", "audioUrl", "audio", "stream", "track", "setStream", "t", "setTimeout", "response", "fetch", "blob", "Audio", "src", "URL", "createObjectURL", "Promise", "resolve", "reject", "addEventListener", "err", "error", "once", "info", "load", "ctx", "AudioContext", "destination", "createMediaStreamDestination", "channelCount", "source", "createMediaElementSource", "connect", "getAudioTracks", "clearTimeout", "useEffect", "useState", "useAudioTrack", "active", "track", "setTrack", "useState", "useEffect", "stop", "undefined", "initAudio", "audio", "Audio", "srcObject", "navigator", "mediaDevices", "getUserMedia", "getAudioTracks", "useMemo", "useEffect", "useState", "useQueueModelAdapter", "renderer", "queue", "initialChunks", "model", "useMemo", "SerializationModel", "loaded", "setLoaded", "useState", "useEffect", "update", "block", "items", "appendChunk", "i", "isLoading", "setInterval", "clearInterval", "clearTimeout", "chunks", "length", "chunk", "useEffect", "useMemo", "useCapabilities", "lazy", "AppGraphBuilder", "lazy", "IntentResolver", "MeetingTranscriptionState", "ReactSurface", "Transcriber", "Settings", "useTranscriber", "audioStreamTrack", "onSegments", "config", "getTranscriber", "useCapabilities", "TranscriptionCapabilities", "Transcriber", "transcriber", "useMemo", "undefined", "useEffect", "close", "useState", "useEffect", "useCallback", "scheduleMicroTask", "Context", "log", "useSoundEffect", "useVoiceInput", "active", "onUpdate", "soundStart", "useSoundEffect", "soundStop", "handleSegments", "useCallback", "segments", "text", "map", "str", "trim", "replace", "join", "recording", "setRecording", "useState", "track", "useAudioTrack", "transcriber", "useTranscriber", "audioStreamTrack", "onSegments", "useEffect", "ctx", "Context", "scheduleMicroTask", "open", "log", "info", "play", "startChunksRecording", "isOpen", "stopChunksRecording", "close", "dispose", "TranscriptionContainer", "role", "transcript", "attendableId", "fullyQualifiedId", "space", "getSpace", "members", "useMembers", "key", "map", "member", "identity", "queue", "useQueue", "dxn", "pollInterval", "model", "useQueueModelAdapter", "renderMarkdown", "React", "StackItem", "Content", "classNames", "Transcript"]
7
+ }