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

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 (191) hide show
  1. package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs → TranscriptContainer-4D4BHE7G.mjs} +3 -2
  2. package/dist/lib/browser/{app-graph-builder-VDQOVX7P.mjs → app-graph-builder-I4SSIQMW.mjs} +18 -41
  3. package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-YEPT334A.mjs → chunk-5BE6RTNC.mjs} +1 -1
  5. package/dist/lib/browser/chunk-5BE6RTNC.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-OGNXNGJB.mjs → chunk-5Q3R53U3.mjs} +8 -8
  7. package/dist/lib/browser/chunk-5Q3R53U3.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-YCZISX63.mjs → chunk-DR3NBV6Q.mjs} +6 -6
  9. package/dist/lib/browser/{chunk-YCZISX63.mjs.map → chunk-DR3NBV6Q.mjs.map} +3 -3
  10. package/dist/lib/browser/{chunk-K7FOYAXO.mjs → chunk-GI5LZ4SV.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-GU2BNYKZ.mjs → chunk-KLD7O5GJ.mjs} +2 -12
  12. package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RHHJZQPM.mjs +702 -0
  14. package/dist/lib/browser/chunk-RHHJZQPM.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +22 -197
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/{intent-resolver-4R66ZCKT.mjs → intent-resolver-ZQQEH27F.mjs} +7 -7
  18. package/dist/lib/browser/intent-resolver-ZQQEH27F.mjs.map +7 -0
  19. package/dist/lib/browser/{meeting-transcription-state-DLFHQK72.mjs → meeting-transcription-state-5D52VTHU.mjs} +4 -4
  20. package/dist/lib/browser/meeting-transcription-state-5D52VTHU.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-FQUHU5G7.mjs → react-surface-HETJ5XY6.mjs} +5 -4
  23. package/dist/lib/browser/{transcriber-LGMIWDYI.mjs → transcriber-SMRLU2KY.mjs} +8 -7
  24. package/dist/lib/browser/{transcriber-LGMIWDYI.mjs.map → transcriber-SMRLU2KY.mjs.map} +3 -3
  25. package/dist/lib/browser/types/index.mjs +1 -1
  26. package/dist/lib/node/{TranscriptContainer-QEYTTT2V.cjs → TranscriptContainer-ZWP6UKY6.cjs} +8 -7
  27. package/dist/lib/node/TranscriptContainer-ZWP6UKY6.cjs.map +7 -0
  28. package/dist/lib/node/{app-graph-builder-IFSIVNUR.cjs → app-graph-builder-WWC4WNTG.cjs} +31 -54
  29. package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-P4VVD6ZO.cjs → chunk-3QEJ5EBO.cjs} +10 -10
  31. package/dist/lib/node/chunk-3QEJ5EBO.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-CZMLKKWT.cjs → chunk-HYGDHS6X.cjs} +4 -4
  33. package/dist/lib/node/chunk-HYGDHS6X.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-3KHUSQNW.cjs → chunk-J72PUQ3C.cjs} +6 -15
  35. package/dist/lib/node/chunk-J72PUQ3C.cjs.map +7 -0
  36. package/dist/lib/node/chunk-KO6MKCED.cjs +718 -0
  37. package/dist/lib/node/chunk-KO6MKCED.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-FCCJALOT.cjs → chunk-LA73IHCB.cjs} +10 -10
  39. package/dist/lib/node/{chunk-FCCJALOT.cjs.map → chunk-LA73IHCB.cjs.map} +3 -3
  40. package/dist/lib/node/{chunk-LP4FG423.cjs → chunk-WXG4Z2EZ.cjs} +5 -5
  41. package/dist/lib/node/index.cjs +49 -233
  42. package/dist/lib/node/index.cjs.map +4 -4
  43. package/dist/lib/node/{intent-resolver-WMMCOUEH.cjs → intent-resolver-VY3XWYAA.cjs} +11 -10
  44. package/dist/lib/node/intent-resolver-VY3XWYAA.cjs.map +7 -0
  45. package/dist/lib/node/{meeting-transcription-state-URIYILEQ.cjs → meeting-transcription-state-OYWCY5XE.cjs} +7 -7
  46. package/dist/lib/node/meeting-transcription-state-OYWCY5XE.cjs.map +7 -0
  47. package/dist/lib/node/meta.json +1 -1
  48. package/dist/lib/node/{react-surface-WI2MGWCC.cjs → react-surface-M2JQIIDY.cjs} +10 -9
  49. package/dist/lib/node/{react-surface-WI2MGWCC.cjs.map → react-surface-M2JQIIDY.cjs.map} +1 -1
  50. package/dist/lib/node/{transcriber-QG5WPKX4.cjs → transcriber-E6AAB4SU.cjs} +14 -13
  51. package/dist/lib/node/{transcriber-QG5WPKX4.cjs.map → transcriber-E6AAB4SU.cjs.map} +3 -3
  52. package/dist/lib/node/types/index.cjs +7 -7
  53. package/dist/lib/node/types/index.cjs.map +1 -1
  54. package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs → TranscriptContainer-3HJ752CP.mjs} +3 -2
  55. package/dist/lib/node-esm/{app-graph-builder-UL6XLIZY.mjs → app-graph-builder-PPJQAFSI.mjs} +18 -41
  56. package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-GIO6J6FE.mjs → chunk-54HDN33F.mjs} +8 -8
  58. package/dist/lib/node-esm/chunk-54HDN33F.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs → chunk-K3R3YK3S.mjs} +6 -6
  60. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs.map → chunk-K3R3YK3S.mjs.map} +3 -3
  61. package/dist/lib/node-esm/{chunk-HKATMD34.mjs → chunk-QMHMEKB3.mjs} +2 -12
  62. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-SDMGJZLN.mjs +703 -0
  64. package/dist/lib/node-esm/chunk-SDMGJZLN.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs → chunk-XY22OP6H.mjs} +2 -2
  66. package/dist/lib/node-esm/{chunk-PTZHDZ36.mjs → chunk-YXZOLOFT.mjs} +1 -1
  67. package/dist/lib/node-esm/chunk-YXZOLOFT.mjs.map +7 -0
  68. package/dist/lib/node-esm/index.mjs +22 -197
  69. package/dist/lib/node-esm/index.mjs.map +4 -4
  70. package/dist/lib/node-esm/{intent-resolver-QN2LO5TX.mjs → intent-resolver-FCTNJPWY.mjs} +7 -7
  71. package/dist/lib/node-esm/intent-resolver-FCTNJPWY.mjs.map +7 -0
  72. package/dist/lib/node-esm/{meeting-transcription-state-ZYVRAW6Y.mjs → meeting-transcription-state-XMZJ45P4.mjs} +4 -4
  73. package/dist/lib/node-esm/meeting-transcription-state-XMZJ45P4.mjs.map +7 -0
  74. package/dist/lib/node-esm/meta.json +1 -1
  75. package/dist/lib/node-esm/{react-surface-PCH6NTVB.mjs → react-surface-PXFSIM6V.mjs} +5 -4
  76. package/dist/lib/{browser/react-surface-FQUHU5G7.mjs.map → node-esm/react-surface-PXFSIM6V.mjs.map} +1 -1
  77. package/dist/lib/node-esm/{transcriber-TMPYZ5L4.mjs → transcriber-REAGRCPY.mjs} +8 -7
  78. package/dist/lib/node-esm/{transcriber-TMPYZ5L4.mjs.map → transcriber-REAGRCPY.mjs.map} +3 -3
  79. package/dist/lib/node-esm/types/index.mjs +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/capabilities.d.ts +4 -6
  82. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/index.d.ts +1 -4
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +2 -4
  86. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  88. package/dist/types/src/components/Transcript/Transcript.d.ts +12 -4
  89. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  90. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +15 -4
  91. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts +13 -0
  93. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts.map +1 -0
  94. package/dist/types/src/components/Transcript/testings.d.ts +51 -0
  95. package/dist/types/src/components/Transcript/testings.d.ts.map +1 -0
  96. package/dist/types/src/components/Transcript/transcript-extension.d.ts +19 -0
  97. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -0
  98. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  99. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  100. package/dist/types/src/entity-extraction/entity-extraction.d.ts +16 -0
  101. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -0
  102. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +2 -0
  103. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +1 -0
  104. package/dist/types/src/entity-extraction/index.d.ts +2 -0
  105. package/dist/types/src/entity-extraction/index.d.ts.map +1 -0
  106. package/dist/types/src/hooks/index.d.ts +1 -0
  107. package/dist/types/src/hooks/index.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +7 -0
  109. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -0
  110. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  111. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  112. package/dist/types/src/model/index.d.ts +2 -0
  113. package/dist/types/src/model/index.d.ts.map +1 -0
  114. package/dist/types/src/model/model.d.ts +68 -0
  115. package/dist/types/src/model/model.d.ts.map +1 -0
  116. package/dist/types/src/model/model.test.d.ts +2 -0
  117. package/dist/types/src/model/model.test.d.ts.map +1 -0
  118. package/dist/types/src/testing/test-data.d.ts +73 -0
  119. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  120. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +2 -0
  121. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +1 -0
  122. package/dist/types/src/types/schema.d.ts +9 -9
  123. package/dist/types/src/util/index.d.ts +0 -1
  124. package/dist/types/src/util/index.d.ts.map +1 -1
  125. package/package.json +47 -39
  126. package/src/capabilities/app-graph-builder.ts +15 -26
  127. package/src/capabilities/capabilities.ts +3 -2
  128. package/src/capabilities/intent-resolver.ts +4 -4
  129. package/src/capabilities/meeting-transcription-state.ts +2 -2
  130. package/src/capabilities/transcriber.ts +2 -1
  131. package/src/components/Transcript/Transcript.stories.tsx +165 -43
  132. package/src/components/Transcript/Transcript.tsx +78 -210
  133. package/src/components/Transcript/deprecated/Transcript.tsx +231 -0
  134. package/src/components/Transcript/testings.ts +182 -0
  135. package/src/components/Transcript/transcript-extension.ts +233 -0
  136. package/src/components/TranscriptContainer.tsx +6 -3
  137. package/src/components/transcription.stories.tsx +97 -48
  138. package/src/entity-extraction/entity-extraction.test.ts +32 -0
  139. package/src/entity-extraction/entity-extraction.ts +94 -0
  140. package/src/entity-extraction/index.ts +5 -0
  141. package/src/entity-extraction/system-prompt.tpl +9 -0
  142. package/src/entity-extraction/types.d.ts +8 -0
  143. package/src/hooks/index.ts +1 -0
  144. package/src/hooks/useQueueModelAdapter.ts +30 -0
  145. package/src/hooks/useTranscriber.ts +3 -2
  146. package/src/model/index.ts +5 -0
  147. package/src/model/model.test.ts +123 -0
  148. package/src/model/model.ts +229 -0
  149. package/src/testing/test-data.ts +314 -0
  150. package/src/transcriber/transcriber.ts +1 -1
  151. package/src/transcriber/transcription-manager.ts +2 -2
  152. package/src/types/schema.ts +7 -7
  153. package/src/types/types.ts +2 -2
  154. package/src/util/index.ts +0 -1
  155. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-G4B6CPC2.mjs +0 -253
  157. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-YEPT334A.mjs.map +0 -7
  161. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +0 -7
  162. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +0 -7
  163. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +0 -7
  164. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +0 -7
  165. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +0 -7
  166. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +0 -7
  167. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +0 -7
  168. package/dist/lib/node/chunk-UOFHT4GZ.cjs +0 -280
  169. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +0 -7
  170. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +0 -7
  171. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +0 -7
  172. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +0 -254
  174. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +0 -7
  176. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +0 -7
  178. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +0 -7
  179. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +0 -7
  180. package/dist/types/src/transcriber/transcriber.test.d.ts +0 -2
  181. package/dist/types/src/transcriber/transcriber.test.d.ts.map +0 -1
  182. package/dist/types/src/util/random-queue-dxn.d.ts +0 -3
  183. package/dist/types/src/util/random-queue-dxn.d.ts.map +0 -1
  184. package/src/util/random-queue-dxn.ts +0 -9
  185. /package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs.map → TranscriptContainer-4D4BHE7G.mjs.map} +0 -0
  186. /package/dist/lib/browser/{chunk-K7FOYAXO.mjs.map → chunk-GI5LZ4SV.mjs.map} +0 -0
  187. /package/dist/lib/{node-esm/react-surface-PCH6NTVB.mjs.map → browser/react-surface-HETJ5XY6.mjs.map} +0 -0
  188. /package/dist/lib/node/{chunk-LP4FG423.cjs.map → chunk-WXG4Z2EZ.cjs.map} +0 -0
  189. /package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs.map → TranscriptContainer-3HJ752CP.mjs.map} +0 -0
  190. /package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs.map → chunk-XY22OP6H.mjs.map} +0 -0
  191. /package/src/transcriber/{transcriber.test.ts → transcriber.browser.test.ts} +0 -0
@@ -1,253 +0,0 @@
1
- import {
2
- TRANSCRIPTION_PLUGIN
3
- } from "./chunk-6ZR5MDK3.mjs";
4
-
5
- // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
6
- import React2 from "react";
7
- import { fullyQualifiedId } from "@dxos/client/echo";
8
- import { useQueue } from "@dxos/react-client/echo";
9
- import { StackItem } from "@dxos/react-ui-stack";
10
-
11
- // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
12
- import { intervalToDuration } from "date-fns/intervalToDuration";
13
- import { yieldOrContinue } from "main-thread-scheduling";
14
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
- import { useResizeDetector } from "react-resize-detector";
16
- import { IconButton, useTranslation } from "@dxos/react-ui";
17
- import { useAttention } from "@dxos/react-ui-attention";
18
- import { Grid, toPlaneCellIndex } from "@dxos/react-ui-grid";
19
- import { mx } from "@dxos/react-ui-theme";
20
- var lineHeight = 20;
21
- var cellSpacing = 8 + 2;
22
- var timestampColumnWidth = 68;
23
- var authorClasses = "font-medium text-base leading-[20px]";
24
- var timestampClasses = "text-xs leading-[20px] text-description pie-0 tabular-nums";
25
- var segmentTextClasses = "text-sm whitespace-normal hyphens-auto";
26
- var measureClasses = mx(
27
- // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)
28
- "absolute inline-start-[69px] inline-end-0 invisible z-[-1] border",
29
- "pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]",
30
- segmentTextClasses
31
- );
32
- var rowDefault = {
33
- grid: {
34
- size: lineHeight + cellSpacing
35
- }
36
- };
37
- var mapTranscriptQueue = (blocks) => {
38
- if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {
39
- return [];
40
- } else {
41
- return blocks.flatMap((block, blockIndex) => {
42
- return [
43
- [
44
- blockIndex,
45
- -1
46
- ],
47
- ...block.segments.map((segment, segmentIndex) => {
48
- return [
49
- blockIndex,
50
- segmentIndex
51
- ];
52
- })
53
- ];
54
- });
55
- }
56
- };
57
- var pad = (n = 0) => String(n).padStart(2, "0");
58
- var formatTimestamp = (start, end) => {
59
- const { hours, minutes, seconds } = intervalToDuration({
60
- start,
61
- end
62
- });
63
- return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
64
- };
65
- var measureRows = async (host, blocks, queueMap, signal) => {
66
- const result = {
67
- grid: {}
68
- };
69
- for (let row = 0; row < queueMap.length; row++) {
70
- await yieldOrContinue("smooth", signal);
71
- const [blockIndex, segmentIndex] = queueMap[row];
72
- if (segmentIndex < 0) {
73
- result.grid[row] = {
74
- size: lineHeight + cellSpacing
75
- };
76
- } else {
77
- host.textContent = blocks[blockIndex].segments[segmentIndex].text;
78
- result.grid[row] = {
79
- size: host.offsetHeight
80
- };
81
- }
82
- }
83
- return result;
84
- };
85
- var Transcript = ({ classNames, blocks, attendableId, ignoreAttention }) => {
86
- const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
87
- const { hasAttention } = useAttention(attendableId);
88
- const [dxGrid, setDxGrid] = useState(null);
89
- const [rows, setRows] = useState(void 0);
90
- const [columns, setColumns] = useState(void 0);
91
- const [autoScroll, setAutoScroll] = useState(true);
92
- const queueMap = useMemo(() => mapTranscriptQueue(blocks), [
93
- blocks
94
- ]);
95
- const handleWheel = useCallback((event) => {
96
- setAutoScroll(false);
97
- if (!ignoreAttention && !hasAttention) {
98
- event.stopPropagation();
99
- }
100
- }, [
101
- hasAttention,
102
- ignoreAttention
103
- ]);
104
- const abortControllerRef = useRef();
105
- const handleResize = useCallback(async ({ entry }) => {
106
- if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {
107
- abortControllerRef.current?.abort();
108
- abortControllerRef.current = new AbortController();
109
- setColumns({
110
- grid: {
111
- 0: {
112
- size: timestampColumnWidth
113
- },
114
- 1: {
115
- size: entry.target.offsetWidth
116
- }
117
- }
118
- });
119
- return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal).then(setRows).catch(() => {
120
- });
121
- }
122
- }, [
123
- blocks,
124
- queueMap
125
- ]);
126
- const { width, ref: measureRef } = useResizeDetector({
127
- onResize: handleResize,
128
- refreshOptions: {
129
- leading: true
130
- }
131
- });
132
- useEffect(() => {
133
- if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {
134
- void handleResize({
135
- entry: {
136
- target: measureRef.current
137
- }
138
- }).then(() => {
139
- if (autoScroll) {
140
- setTimeout(() => dxGrid?.scrollToEndRow(), 50);
141
- }
142
- });
143
- }
144
- }, [
145
- blocks,
146
- queueMap,
147
- width,
148
- autoScroll
149
- ]);
150
- useEffect(() => {
151
- if (dxGrid && Array.isArray(blocks) && blocks[0]) {
152
- const transcriptStart = blocks[0].segments[0].started;
153
- dxGrid.getCells = (range, plane) => {
154
- switch (plane) {
155
- case "grid": {
156
- const cells = {};
157
- for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {
158
- const [blockIndex, segmentIndex] = queueMap[row];
159
- cells[toPlaneCellIndex({
160
- col: 0,
161
- row
162
- })] = {
163
- readonly: true,
164
- value: segmentIndex < 0 ? formatTimestamp(transcriptStart, blocks[blockIndex].segments[Math.max(0, segmentIndex)].started) : "",
165
- className: timestampClasses
166
- };
167
- cells[toPlaneCellIndex({
168
- col: 1,
169
- row
170
- })] = segmentIndex < 0 ? {
171
- readonly: true,
172
- accessoryHtml: `<span data-hue="${blocks[blockIndex].authorHue}" class="dx-text-hue">${blocks[blockIndex].authorName}</span>`,
173
- className: authorClasses
174
- } : {
175
- readonly: true,
176
- value: blocks[blockIndex].segments[segmentIndex].text,
177
- className: segmentTextClasses
178
- };
179
- }
180
- return cells;
181
- }
182
- default:
183
- return {};
184
- }
185
- };
186
- }
187
- }, [
188
- dxGrid,
189
- blocks
190
- ]);
191
- const handleScrollToEnd = useCallback(() => {
192
- setAutoScroll(true);
193
- dxGrid?.scrollToEndRow();
194
- }, [
195
- dxGrid,
196
- autoScroll
197
- ]);
198
- return /* @__PURE__ */ React.createElement("div", {
199
- role: "none",
200
- className: mx("relative min-bs-0", classNames)
201
- }, /* @__PURE__ */ React.createElement(Grid.Root, {
202
- id: `${attendableId}--transcript`
203
- }, /* @__PURE__ */ React.createElement(Grid.Content, {
204
- limitColumns: 2,
205
- limitRows: queueMap.length,
206
- columns,
207
- rows,
208
- rowDefault,
209
- onWheel: handleWheel,
210
- className: "[--dx-grid-base:var(--dx-baseSurface)] [--dx-grid-lines:var(--dx-baseSurface)] [&_.dx-grid]:min-bs-0 [&_.dx-grid]:min-is-0 [&_.dx-grid]:select-auto",
211
- ref: setDxGrid
212
- })), /* @__PURE__ */ React.createElement("div", {
213
- role: "none",
214
- inert: "",
215
- "aria-hidden": true,
216
- className: measureClasses,
217
- ref: measureRef
218
- }), /* @__PURE__ */ React.createElement(IconButton, {
219
- icon: "ph--arrow-line-down--regular",
220
- iconOnly: true,
221
- label: t("scroll to end label"),
222
- tooltipSide: "left",
223
- "data-state": autoScroll ? "invisible" : "visible",
224
- classNames: [
225
- "absolute inline-end-2 block-end-2 opacity-0 pointer-events-none",
226
- 'data-[state="visible"]:pointer-events-auto data-[state="visible"]:opacity-100 transition-opacity'
227
- ],
228
- onClick: handleScrollToEnd
229
- }));
230
- };
231
-
232
- // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
233
- var TranscriptionContainer = ({ role, transcript }) => {
234
- const attendableId = fullyQualifiedId(transcript);
235
- const queue = useQueue(transcript.queue.dxn, {
236
- pollInterval: 1e3
237
- });
238
- return /* @__PURE__ */ React2.createElement(StackItem.Content, {
239
- role,
240
- classNames: "container-max-width pli-2"
241
- }, /* @__PURE__ */ React2.createElement(Transcript, {
242
- attendableId,
243
- blocks: queue?.items
244
- }));
245
- };
246
- var TranscriptContainer_default = TranscriptionContainer;
247
-
248
- export {
249
- Transcript,
250
- TranscriptionContainer,
251
- TranscriptContainer_default
252
- };
253
- //# sourceMappingURL=chunk-G4B6CPC2.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/TranscriptContainer.tsx", "../../../src/components/Transcript/Transcript.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { fullyQualifiedId } from '@dxos/client/echo';\nimport { useQueue } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { Transcript } from './Transcript';\nimport { type TranscriptBlock, type TranscriptType } from '../types';\n\nexport const TranscriptionContainer: FC<{ role: string; transcript: TranscriptType }> = ({ role, transcript }) => {\n const attendableId = fullyQualifiedId(transcript);\n const queue = useQueue<TranscriptBlock>(transcript.queue.dxn, { pollInterval: 1_000 });\n\n return (\n <StackItem.Content role={role} classNames='container-max-width pli-2'>\n <Transcript attendableId={attendableId} blocks={queue?.items} />\n </StackItem.Content>\n );\n};\n\nexport default TranscriptionContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\nimport { yieldOrContinue } from 'main-thread-scheduling';\nimport React, { type FC, useCallback, useEffect, useMemo, useRef, useState, type WheelEvent } from 'react';\nimport { type OnResizeCallback, useResizeDetector } from 'react-resize-detector';\n\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type DxGridCellValue,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlaneCells,\n Grid,\n toPlaneCellIndex,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { TRANSCRIPTION_PLUGIN } from '../../meta';\nimport { type TranscriptBlock } from '../../types';\n\n// TODO(burdon): Actions (e.g., mark, summarize, translate, label, delete).\n\nconst lineHeight = 20;\nconst cellSpacing = 8 + 2;\nconst timestampColumnWidth = 68;\n\nconst authorClasses = 'font-medium text-base leading-[20px]';\nconst timestampClasses = 'text-xs leading-[20px] text-description pie-0 tabular-nums';\nconst segmentTextClasses = 'text-sm whitespace-normal hyphens-auto';\nconst measureClasses = mx(\n // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)\n 'absolute inline-start-[69px] inline-end-0 invisible z-[-1] border',\n 'pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]',\n segmentTextClasses,\n);\n\nconst rowDefault = {\n grid: { size: lineHeight + cellSpacing },\n};\n\ntype QueueRows = [number, number][];\n\nconst mapTranscriptQueue = (blocks?: TranscriptBlock[]): QueueRows => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {\n return [];\n } else {\n return blocks.flatMap((block, blockIndex) => {\n return [\n [blockIndex, -1],\n ...block.segments.map((segment, segmentIndex) => {\n return [blockIndex, segmentIndex] as [number, number];\n }),\n ];\n });\n }\n};\n\nconst pad = (n = 0) => String(n).padStart(2, '0');\n\nconst formatTimestamp = (start: Date, end: Date) => {\n const { hours, minutes, seconds } = intervalToDuration({ start, end });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n};\n\nconst measureRows = async (\n host: HTMLDivElement,\n blocks: TranscriptBlock[],\n queueMap: QueueRows,\n signal: AbortSignal,\n) => {\n const result: DxGridAxisMeta = { grid: {} };\n for (let row = 0; row < queueMap.length; row++) {\n await yieldOrContinue('smooth', signal);\n const [blockIndex, segmentIndex] = queueMap[row];\n if (segmentIndex < 0) {\n result.grid[row] = { size: lineHeight + cellSpacing };\n } else {\n host.textContent = blocks[blockIndex]!.segments[segmentIndex]!.text;\n result.grid[row] = { size: host.offsetHeight };\n }\n }\n return result;\n};\n\nexport type TranscriptProps = ThemedClassName<{\n blocks?: TranscriptBlock[];\n attendableId?: string;\n ignoreAttention?: boolean;\n}>;\n\nexport const Transcript: FC<TranscriptProps> = ({ classNames, blocks, attendableId, ignoreAttention }) => {\n const { t } = useTranslation(TRANSCRIPTION_PLUGIN);\n const { hasAttention } = useAttention(attendableId);\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [rows, setRows] = useState<DxGridAxisMeta | undefined>(undefined);\n const [columns, setColumns] = useState<DxGridAxisMeta | undefined>(undefined);\n const [autoScroll, setAutoScroll] = useState(true);\n\n const queueMap = useMemo(() => mapTranscriptQueue(blocks), [blocks]);\n\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n setAutoScroll(false);\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const abortControllerRef = useRef<AbortController>();\n\n const handleResize = useCallback(\n async ({ entry }: { entry: { target: HTMLDivElement } | null }) => {\n if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n setColumns({ grid: { 0: { size: timestampColumnWidth }, 1: { size: entry.target.offsetWidth } } });\n return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal)\n .then(setRows)\n .catch(() => {\n // Aborted mid-measurement by new size.\n });\n }\n },\n [blocks, queueMap],\n );\n\n const { width, ref: measureRef } = useResizeDetector({\n onResize: handleResize as OnResizeCallback,\n refreshOptions: { leading: true },\n });\n\n useEffect(() => {\n if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {\n void handleResize({ entry: { target: measureRef.current } }).then(() => {\n if (autoScroll) {\n // TODO(thure): Implement a deterministic way to do this when `rows` has fully settled and grid has a new `maxPosBlock`.\n setTimeout(() => dxGrid?.scrollToEndRow(), 50);\n }\n });\n }\n }, [blocks, queueMap, width, autoScroll]);\n\n useEffect(() => {\n if (dxGrid && Array.isArray(blocks) && blocks[0]) {\n const transcriptStart = blocks[0]!.segments[0]!.started;\n dxGrid.getCells = (range, plane) => {\n switch (plane) {\n case 'grid': {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {\n const [blockIndex, segmentIndex] = queueMap[row];\n\n cells[toPlaneCellIndex({ col: 0, row })] = {\n readonly: true,\n value:\n segmentIndex < 0\n ? formatTimestamp(transcriptStart, blocks[blockIndex]!.segments[Math.max(0, segmentIndex)]!.started)\n : '',\n className: timestampClasses,\n } satisfies DxGridCellValue;\n\n cells[toPlaneCellIndex({ col: 1, row })] = (\n segmentIndex < 0\n ? {\n readonly: true,\n accessoryHtml: `<span data-hue=\"${blocks[blockIndex]!.authorHue}\" class=\"dx-text-hue\">${blocks[blockIndex]!.authorName}</span>`,\n className: authorClasses,\n }\n : {\n readonly: true,\n value: blocks[blockIndex]!.segments[segmentIndex]!.text,\n className: segmentTextClasses,\n }\n ) satisfies DxGridCellValue;\n }\n return cells;\n }\n default:\n return {};\n }\n };\n }\n }, [dxGrid, blocks]);\n\n const handleScrollToEnd = useCallback(() => {\n setAutoScroll(true);\n dxGrid?.scrollToEndRow();\n }, [dxGrid, autoScroll]);\n\n return (\n <div role='none' className={mx('relative min-bs-0', classNames)}>\n <Grid.Root id={`${attendableId}--transcript`}>\n <Grid.Content\n limitColumns={2}\n limitRows={queueMap.length}\n columns={columns}\n rows={rows}\n rowDefault={rowDefault}\n onWheel={handleWheel}\n className='[--dx-grid-base:var(--dx-baseSurface)] [--dx-grid-lines:var(--dx-baseSurface)] [&_.dx-grid]:min-bs-0 [&_.dx-grid]:min-is-0 [&_.dx-grid]:select-auto'\n ref={setDxGrid}\n />\n </Grid.Root>\n <div role='none' {...{ inert: '' }} aria-hidden className={measureClasses} ref={measureRef} />\n <IconButton\n icon='ph--arrow-line-down--regular'\n iconOnly\n label={t('scroll to end label')}\n tooltipSide='left'\n data-state={autoScroll ? 'invisible' : 'visible'}\n classNames={[\n 'absolute inline-end-2 block-end-2 opacity-0 pointer-events-none',\n 'data-[state=\"visible\"]:pointer-events-auto data-[state=\"visible\"]:opacity-100 transition-opacity',\n ]}\n onClick={handleScrollToEnd}\n />\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "fullyQualifiedId", "useQueue", "StackItem", "intervalToDuration", "yieldOrContinue", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "useResizeDetector", "IconButton", "useTranslation", "useAttention", "Grid", "toPlaneCellIndex", "mx", "lineHeight", "cellSpacing", "timestampColumnWidth", "authorClasses", "timestampClasses", "segmentTextClasses", "measureClasses", "mx", "rowDefault", "grid", "size", "mapTranscriptQueue", "blocks", "Array", "isArray", "length", "flatMap", "block", "blockIndex", "segments", "map", "segment", "segmentIndex", "pad", "n", "String", "padStart", "formatTimestamp", "start", "end", "hours", "minutes", "seconds", "intervalToDuration", "measureRows", "host", "queueMap", "signal", "result", "row", "yieldOrContinue", "textContent", "text", "offsetHeight", "Transcript", "classNames", "attendableId", "ignoreAttention", "t", "useTranslation", "TRANSCRIPTION_PLUGIN", "hasAttention", "useAttention", "dxGrid", "setDxGrid", "useState", "rows", "setRows", "undefined", "columns", "setColumns", "autoScroll", "setAutoScroll", "useMemo", "handleWheel", "useCallback", "event", "stopPropagation", "abortControllerRef", "useRef", "handleResize", "entry", "target", "current", "abort", "AbortController", "offsetWidth", "then", "catch", "width", "ref", "measureRef", "useResizeDetector", "onResize", "refreshOptions", "leading", "useEffect", "Object", "keys", "setTimeout", "scrollToEndRow", "transcriptStart", "started", "getCells", "range", "plane", "cells", "toPlaneCellIndex", "col", "readonly", "value", "Math", "max", "className", "accessoryHtml", "authorHue", "authorName", "handleScrollToEnd", "div", "role", "Grid", "Root", "id", "Content", "limitColumns", "limitRows", "onWheel", "inert", "aria-hidden", "IconButton", "icon", "iconOnly", "label", "tooltipSide", "data-state", "onClick", "TranscriptionContainer", "role", "transcript", "attendableId", "fullyQualifiedId", "queue", "useQueue", "dxn", "pollInterval", "React", "StackItem", "Content", "classNames", "Transcript", "blocks", "items"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = (spaceId?: SpaceId) =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId ?? SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n"],
5
- "mappings": ";AAIO,IAAMA,aAAa,CAACC,cACzB,IAAIC,KAAKD,aAAaC,KAAKC,IAAG,CAAA,EAAIC,mBAAmB,SAAS;EAC5DC,UAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,QAAQ;EACRC,QAAQ;AACV,CAAA;;;ACPF,SAASC,gBAAgB;AACzB,SAASC,KAAKC,mBAAmBC,eAAe;AAEzC,IAAMC,iBAAiB,CAACC,YAC7B,IAAIC,IAAIA,IAAIC,KAAKC,OAAO;EAACC,kBAAkBC;EAAML,WAAWM,QAAQC,OAAM;EAAIC,SAASD,OAAM;CAAG;;;ACJ3F,IAAME,qBAAqB,CAACC,WAAAA;AACjC,QAAMC,WAAW,IAAIC,aAAaF,OAAOG,OAAO,CAACC,KAAKC,UAAUA,MAAMC,SAASF,KAAK,CAAA,CAAA;AACpF,MAAIG,SAAS;AACb,aAAWF,SAASL,QAAQ;AAC1BC,aAASO,IAAIH,OAAOE,MAAAA;AACpBA,cAAUF,MAAMC;EAClB;AAEA,SAAOL;AACT;",
6
- "names": ["getTimeStr", "timestamp", "Date", "now", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "ObjectId", "DXN", "QueueSubspaceTags", "SpaceId", "randomQueueDxn", "spaceId", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { EchoObject, Expando, Ref, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Root transcript object created when the user starts a transcription.\n */\nexport const TranscriptSchema = S.Struct({\n name: S.String,\n\n // TODO(burdon): Use string for dates?\n started: S.optional(S.Date),\n ended: S.optional(S.Date),\n\n /**\n * Queue containing TranscriptBlock objects.\n */\n // TODO(wittjosiah): Should be a ref to a queue.\n queue: Ref(Expando),\n});\n\nexport class TranscriptType extends TypedObject({\n typename: 'dxos.org/type/Transcript',\n version: '0.1.0',\n})(TranscriptSchema.fields) {}\n\n// TODO(burdon): Do these need to be kept in sync with EDGE?\n\n/**\n * First message in queue.\n * Contains metadata for the recording and transcript.\n */\nconst TranscriptHeader = S.Struct({\n started: S.optional(S.Date),\n});\n\nexport type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;\n\n/**\n * Transcription fragment.\n */\nconst TranscriptSegment = S.Struct({\n // TODO(burdon): TS from service is not Unix TS (x1000).\n started: S.Date,\n text: S.String,\n});\n\nexport type TranscriptSegment = S.Schema.Type<typeof TranscriptSegment>;\n\n/**\n * Transcription block (from single speaker).\n */\nexport const TranscriptBlock = S.Struct({\n id: S.String,\n authorName: S.optional(S.String), // TODO(burdon): IdentityDid.\n authorHue: S.optional(S.String),\n segments: S.Array(TranscriptSegment),\n}).pipe(EchoObject({ typename: 'dxos.org/type/TranscriptBlock', version: '0.1.0' }));\n\nexport type TranscriptBlock = S.Schema.Type<typeof TranscriptBlock>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { S, isInstanceOf } from '@dxos/echo-schema';\nimport { isReactiveObject } from '@dxos/react-client/echo';\n\nimport { TranscriptType } from './schema';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\n// TODO(burdon): Move to separate proto.\n\n/**\n * Endpoint to the calls service.\n */\n// TODO(burdon): Reconfigure/move.\nexport const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';\n\nexport namespace TranscriptionAction {\n const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;\n\n export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {\n input: S.Struct({\n name: S.optional(S.String),\n // TODO(wittjosiah): SpaceId.\n spaceId: S.String,\n }),\n output: S.Struct({\n object: TranscriptType,\n }),\n }) {}\n}\n\nexport const isTranscript = (object: unknown): object is typeof TranscriptType => {\n return isReactiveObject(object) && isInstanceOf(TranscriptType, object);\n};\n"],
5
- "mappings": ";;;;;AAIA,SAASA,YAAYC,SAASC,KAAKC,GAAGC,mBAAmB;AAKlD,IAAMC,mBAAmBC,EAAEC,OAAO;EACvCC,MAAMF,EAAEG;;EAGRC,SAASJ,EAAEK,SAASL,EAAEM,IAAI;EAC1BC,OAAOP,EAAEK,SAASL,EAAEM,IAAI;;;;;EAMxBE,OAAOC,IAAIC,OAAAA;AACb,CAAA;AAEO,IAAMC,iBAAN,cAA6BC,YAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGf,iBAAiBgB,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBhB,EAAEC,OAAO;EAChCG,SAASJ,EAAEK,SAASL,EAAEM,IAAI;AAC5B,CAAA;AAOA,IAAMW,oBAAoBjB,EAAEC,OAAO;;EAEjCG,SAASJ,EAAEM;EACXY,MAAMlB,EAAEG;AACV,CAAA;AAOO,IAAMgB,kBAAkBnB,EAAEC,OAAO;EACtCmB,IAAIpB,EAAEG;EACNkB,YAAYrB,EAAEK,SAASL,EAAEG,MAAM;EAC/BmB,WAAWtB,EAAEK,SAASL,EAAEG,MAAM;EAC9BoB,UAAUvB,EAAEwB,MAAMP,iBAAAA;AACpB,CAAA,EAAGQ,KAAKC,WAAW;EAAEb,UAAU;EAAiCC,SAAS;AAAQ,CAAA,CAAA;;;ACvDjF,SAASa,KAAAA,IAAGC,oBAAoB;AAChC,SAASC,wBAAwB;AAW1B,IAAMC,oBAAoB;;UAEhBC,sBAAAA;AACf,QAAMC,uBAAuB,GAAGC,oBAAAA;EAEzB,MAAMC,eAAeC,GAAEC,YAAW,EAAW,GAAGJ,oBAAAA,WAA+B;IACpFK,OAAOF,GAAEG,OAAO;MACdC,MAAMJ,GAAEK,SAASL,GAAEM,MAAM;;MAEzBC,SAASP,GAAEM;IACb,CAAA;IACAE,QAAQR,GAAEG,OAAO;MACfM,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;uBATSX,SAAAA;AAUf,GAbiBH,wBAAAA,sBAAAA,CAAAA,EAAAA;AAeV,IAAMe,eAAe,CAACF,WAAAA;AAC3B,SAAOG,iBAAiBH,MAAAA,KAAWI,aAAaH,gBAAgBD,MAAAA;AAClE;",
6
- "names": ["EchoObject", "Expando", "Ref", "S", "TypedObject", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "Date", "ended", "queue", "Ref", "Expando", "TranscriptType", "TypedObject", "typename", "version", "fields", "TranscriptHeader", "TranscriptSegment", "text", "TranscriptBlock", "id", "authorName", "authorHue", "segments", "Array", "pipe", "EchoObject", "S", "isInstanceOf", "isReactiveObject", "TRANSCRIPTION_URL", "TranscriptionAction", "TRANSCRIPTION_ACTION", "TRANSCRIPTION_PLUGIN", "Create", "S", "TaggedClass", "input", "Struct", "name", "optional", "String", "spaceId", "output", "object", "TranscriptType", "isTranscript", "isReactiveObject", "isInstanceOf"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/capabilities.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/live-object';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { type TranscriberParams, type Transcriber, type TranscriptionManager } from '../transcriber';\n\nexport namespace TranscriptionCapabilities {\n export type GetTranscriberProps = {\n audioStreamTrack: MediaStreamTrack;\n onSegments: TranscriberParams['onSegments'];\n };\n export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;\n export const Transcriber = defineCapability<GetTranscriber>(`${TRANSCRIPTION_PLUGIN}/capability/transcriber`);\n\n export type MeetingTranscriptionState = ReactiveObject<{\n enabled: boolean;\n transcriptionManager?: TranscriptionManager;\n }>;\n export const MeetingTranscriptionState = defineCapability<MeetingTranscriptionState>(\n `${TRANSCRIPTION_PLUGIN}/capability/meeting-transcription-state`,\n );\n}\n"],
5
- "mappings": ";;;;;AAIA,SAASA,wBAAwB;;UAMhBC,4BAAAA;6BAMFC,cAAcC,iBAAiC,GAAGC,oBAAAA,yBAA6C;6BAM/FC,4BAA4BF,iBACvC,GAAGC,oBAAAA,yCAA6D;AAEpE,GAfiBH,8BAAAA,4BAAAA,CAAAA,EAAAA;",
6
- "names": ["defineCapability", "TranscriptionCapabilities", "Transcriber", "defineCapability", "TRANSCRIPTION_PLUGIN", "MeetingTranscriptionState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';\nimport { create, refFromDXN } from '@dxos/live-object';\nimport { type SpaceId } from '@dxos/react-client/echo';\n\nimport { TranscriptionAction, TranscriptType } from '../types';\nimport { getTimeStr, randomQueueDxn } from '../util';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: TranscriptionAction.Create,\n resolve: ({ name, spaceId }) => {\n const transcript = create(TranscriptType, {\n queue: refFromDXN(randomQueueDxn(spaceId as SpaceId)),\n name: name ?? `Transcript ${getTimeStr(Date.now())}`,\n });\n\n return { data: { object: transcript } };\n },\n }),\n ]);\n"],
5
- "mappings": ";;;;;;;;;;;AAIA,SAASA,cAAcC,aAAaC,sBAA2C;AAC/E,SAASC,QAAQC,kBAAkB;AAMnC,IAAA,0BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;EACvCC,eAAe;IACbC,QAAQC,oBAAoBC;IAC5BC,SAAS,CAAC,EAAEC,MAAMC,QAAO,MAAE;AACzB,YAAMC,aAAaC,OAAOC,gBAAgB;QACxCC,OAAOC,WAAWC,eAAeN,OAAAA,CAAAA;QACjCD,MAAMA,QAAQ,cAAcQ,WAAWC,KAAKC,IAAG,CAAA,CAAA;MACjD,CAAA;AAEA,aAAO;QAAEC,MAAM;UAAEC,QAAQV;QAAW;MAAE;IACxC;EACF,CAAA;CACD;",
6
- "names": ["Capabilities", "contributes", "createResolver", "create", "refFromDXN", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "TranscriptionAction", "Create", "resolve", "name", "spaceId", "transcript", "create", "TranscriptType", "queue", "refFromDXN", "randomQueueDxn", "getTimeStr", "Date", "now", "data", "object"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/meeting-transcription-state.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { TranscriptionCapabilities } from './capabilities';\n\nexport default () => {\n const state = create<TranscriptionCapabilities.MeetingTranscriptionState>({\n enabled: false,\n });\n\n return contributes(TranscriptionCapabilities.MeetingTranscriptionState, state);\n};\n"],
5
- "mappings": ";;;;;;AAIA,SAASA,mBAAmB;AAC5B,SAASC,cAAc;AAIvB,IAAA,sCAAe,MAAA;AACb,QAAMC,QAAQC,OAA4D;IACxEC,SAAS;EACX,CAAA;AAEA,SAAOC,YAAYC,0BAA0BC,2BAA2BL,KAAAA;AAC1E;",
6
- "names": ["contributes", "create", "state", "create", "enabled", "contributes", "TranscriptionCapabilities", "MeetingTranscriptionState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["TranscriptContainer-QEYTTT2V.cjs"],
4
- "sourcesContent": ["import {\n TranscriptContainer_default,\n TranscriptionContainer\n} from \"./chunk-UOFHT4GZ.cjs\";\nimport \"./chunk-NVZWGFJL.cjs\";\nexport {\n TranscriptionContainer,\n TranscriptContainer_default as default\n};\n//# sourceMappingURL=TranscriptContainer-QEYTTT2V.cjs.map\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAGO;AACP,4BAAO;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { fullyQualifiedId, getSpace, makeRef, type Space } from '@dxos/client/echo';\nimport { generateName } from '@dxos/display-name';\nimport { getSchemaTypename, isInstanceOf } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\nimport { MeetingCapabilities, type CallState, type MediaState } from '@dxos/plugin-meeting';\nimport { MeetingType } from '@dxos/plugin-meeting/types';\nimport { buf } from '@dxos/protocols/buf';\nimport {\n TranscriptionPayloadSchema,\n type TranscriptionPayload as TranscriptionPayloadProto,\n} from '@dxos/protocols/buf/dxos/edge/calls_pb';\nimport { keyToFallback } from '@dxos/util';\n\nimport { TranscriptionCapabilities } from './capabilities';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptionManager } from '../transcriber';\nimport { TranscriptionAction, TranscriptType } from '../types';\n\n// TODO(wittjosiah): Factor out.\n// TODO(wittjosiah): Can we stop using protobuf for this?\ntype TranscriptionPayload = buf.MessageInitShape<typeof TranscriptionPayloadSchema>;\nconst codec = {\n encode: (message: TranscriptionPayload): Uint8Array => {\n return buf.toBinary(TranscriptionPayloadSchema, buf.create(TranscriptionPayloadSchema, message));\n },\n decode: (message: Uint8Array): TranscriptionPayloadProto => {\n return buf.fromBinary(TranscriptionPayloadSchema, message);\n },\n};\n\nconst getMeetingTranscript = async (\n context: PluginsContext,\n meeting: MeetingType,\n): Promise<TranscriptType | undefined> => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n\n const typename = getSchemaTypename(TranscriptType)!;\n const existing = await meeting.artifacts[typename]?.load();\n if (existing instanceof TranscriptType) {\n return existing;\n }\n\n const space = getSpace(meeting);\n invariant(space);\n const { data } = await dispatch(createIntent(TranscriptionAction.Create, { spaceId: space.id }));\n meeting.artifacts[typename] = makeRef(data!.object);\n return data?.object;\n};\n\n// TODO(wittjosiah): Introduce a sound that plays when transcription is activated/deactivated.\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,\n filter: (node): node is Node<MeetingType> =>\n isInstanceOf(MeetingType, node.data) && node.type !== PLANK_COMPANION_TYPE,\n actions: ({ node }) => {\n const meeting = node.data;\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n return [\n {\n id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,\n data: async () => {\n const call = context.requestCapability(MeetingCapabilities.CallManager);\n invariant(state.transcriptionManager);\n state.enabled = !state.enabled;\n void state.transcriptionManager.setEnabled(state.enabled);\n const transcript = await getMeetingTranscript(context, meeting);\n invariant(transcript, 'Failed to create transcript');\n call.setActivity(getSchemaTypename(TranscriptType)!, {\n value: codec.encode({\n enabled: state.enabled,\n queueDxn: transcript.queue.dxn.toString(),\n }),\n });\n },\n properties: {\n label: state.enabled\n ? ['stop transcription label', { ns: TRANSCRIPTION_PLUGIN }]\n : ['start transcription label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--record--regular',\n disposition: 'toolbar',\n classNames: state.enabled ? 'text-activeInCall' : '',\n },\n },\n ];\n },\n connector: ({ node }) => {\n const meeting = node.data;\n const client = context.requestCapability(ClientCapabilities.Client);\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n\n return [\n {\n id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,\n type: PLANK_COMPANION_TYPE,\n data: meeting.artifacts[getSchemaTypename(TranscriptType)!]?.target,\n properties: {\n label: ['transcript companion label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n disposition: 'hidden',\n schema: TranscriptType,\n getIntent: ({ space }: { space: Space }) =>\n createIntent(TranscriptionAction.Create, { spaceId: space.id }),\n onJoin: () => {\n const transcriptionManager = new TranscriptionManager(client.edge);\n const identity = client.halo.identity.get();\n invariant(identity);\n transcriptionManager.setName(\n identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),\n );\n const fallbackValue = keyToFallback(identity!.identityKey);\n const userHue = identity!.profile?.data?.hue || fallbackValue.hue;\n transcriptionManager.setHue(userHue);\n void transcriptionManager.open();\n state.transcriptionManager = transcriptionManager;\n },\n onLeave: () => {\n void state.transcriptionManager?.close();\n state.transcriptionManager = undefined;\n state.enabled = false;\n },\n onCallStateUpdated: (callState: CallState) => {\n const typename = getSchemaTypename(TranscriptType);\n const transcription = typename ? callState.activities?.[typename] : undefined;\n if (!transcription?.payload?.value) {\n return;\n }\n\n const payload = codec.decode(transcription.payload.value);\n state.enabled = payload.enabled;\n void state.transcriptionManager?.setEnabled(payload.enabled);\n void state.transcriptionManager?.setQueue(payload.queueDxn);\n },\n onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => {\n void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);\n void state.transcriptionManager?.setRecording(isSpeaking);\n },\n },\n },\n ];\n },\n }),\n ]);\n"],
5
- "mappings": "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",
6
- "names": ["import_types", "codec", "encode", "message", "buf", "toBinary", "TranscriptionPayloadSchema", "create", "decode", "fromBinary", "getMeetingTranscript", "context", "meeting", "dispatchPromise", "dispatch", "requestCapability", "Capabilities", "IntentDispatcher", "typename", "getSchemaTypename", "TranscriptType", "existing", "artifacts", "load", "space", "getSpace", "invariant", "data", "createIntent", "TranscriptionAction", "Create", "spaceId", "id", "makeRef", "object", "contributes", "AppGraphBuilder", "createExtension", "TRANSCRIPTION_PLUGIN", "filter", "node", "isInstanceOf", "MeetingType", "type", "PLANK_COMPANION_TYPE", "actions", "state", "TranscriptionCapabilities", "MeetingTranscriptionState", "fullyQualifiedId", "call", "MeetingCapabilities", "CallManager", "transcriptionManager", "enabled", "setEnabled", "transcript", "setActivity", "value", "queueDxn", "queue", "dxn", "toString", "properties", "label", "ns", "icon", "disposition", "classNames", "connector", "client", "ClientCapabilities", "Client", "ATTENDABLE_PATH_SEPARATOR", "target", "schema", "getIntent", "onJoin", "TranscriptionManager", "edge", "identity", "halo", "get", "setName", "profile", "displayName", "generateName", "identityKey", "toHex", "fallbackValue", "keyToFallback", "userHue", "hue", "setHue", "open", "onLeave", "close", "undefined", "onCallStateUpdated", "callState", "transcription", "activities", "payload", "setQueue", "onMediaStateUpdated", "mediaState", "isSpeaking", "setAudioTrack", "audioTrack", "setRecording"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = (spaceId?: SpaceId) =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId ?? SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;ACIA,yBAAyB;AACzB,kBAAgD;ADDzC,IAAMA,aAAa,CAACC,cACzB,IAAIC,KAAKD,aAAaC,KAAKC,IAAG,CAAA,EAAIC,mBAAmB,SAAS;EAC5DC,UAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,QAAQ;EACRC,QAAQ;AACV,CAAA;ACJK,IAAMC,iBAAiB,CAACC,YAC7B,IAAIC,gBAAIA,gBAAIC,KAAKC,OAAO;EAACC,8BAAkBC;EAAML,WAAWM,oBAAQC,OAAM;EAAIC,4BAASD,OAAM;CAAG;ACJ3F,IAAME,qBAAqB,CAACC,WAAAA;AACjC,QAAMC,WAAW,IAAIC,aAAaF,OAAOG,OAAO,CAACC,KAAKC,UAAUA,MAAMC,SAASF,KAAK,CAAA,CAAA;AACpF,MAAIG,SAAS;AACb,aAAWF,SAASL,QAAQ;AAC1BC,aAASO,IAAIH,OAAOE,MAAAA;AACpBA,cAAUF,MAAMC;EAClB;AAEA,SAAOL;AACT;",
6
- "names": ["getTimeStr", "timestamp", "Date", "now", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "randomQueueDxn", "spaceId", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/capabilities.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type ReactiveObject } from '@dxos/live-object';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { type TranscriberParams, type Transcriber, type TranscriptionManager } from '../transcriber';\n\nexport namespace TranscriptionCapabilities {\n export type GetTranscriberProps = {\n audioStreamTrack: MediaStreamTrack;\n onSegments: TranscriberParams['onSegments'];\n };\n export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;\n export const Transcriber = defineCapability<GetTranscriber>(`${TRANSCRIPTION_PLUGIN}/capability/transcriber`);\n\n export type MeetingTranscriptionState = ReactiveObject<{\n enabled: boolean;\n transcriptionManager?: TranscriptionManager;\n }>;\n export const MeetingTranscriptionState = defineCapability<MeetingTranscriptionState>(\n `${TRANSCRIPTION_PLUGIN}/capability/meeting-transcription-state`,\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAAiC;;UAMhBA,4BAAAA;6BAMFC,kBAAcC,uCAAiC,GAAGC,0CAAAA,yBAA6C;6BAM/FC,gCAA4BF,uCACvC,GAAGC,0CAAAA,yCAA6D;AAEpE,GAfiBH,8BAAAA,4BAAAA,CAAAA,EAAAA;",
6
- "names": ["TranscriptionCapabilities", "Transcriber", "defineCapability", "TRANSCRIPTION_PLUGIN", "MeetingTranscriptionState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { EchoObject, Expando, Ref, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Root transcript object created when the user starts a transcription.\n */\nexport const TranscriptSchema = S.Struct({\n name: S.String,\n\n // TODO(burdon): Use string for dates?\n started: S.optional(S.Date),\n ended: S.optional(S.Date),\n\n /**\n * Queue containing TranscriptBlock objects.\n */\n // TODO(wittjosiah): Should be a ref to a queue.\n queue: Ref(Expando),\n});\n\nexport class TranscriptType extends TypedObject({\n typename: 'dxos.org/type/Transcript',\n version: '0.1.0',\n})(TranscriptSchema.fields) {}\n\n// TODO(burdon): Do these need to be kept in sync with EDGE?\n\n/**\n * First message in queue.\n * Contains metadata for the recording and transcript.\n */\nconst TranscriptHeader = S.Struct({\n started: S.optional(S.Date),\n});\n\nexport type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;\n\n/**\n * Transcription fragment.\n */\nconst TranscriptSegment = S.Struct({\n // TODO(burdon): TS from service is not Unix TS (x1000).\n started: S.Date,\n text: S.String,\n});\n\nexport type TranscriptSegment = S.Schema.Type<typeof TranscriptSegment>;\n\n/**\n * Transcription block (from single speaker).\n */\nexport const TranscriptBlock = S.Struct({\n id: S.String,\n authorName: S.optional(S.String), // TODO(burdon): IdentityDid.\n authorHue: S.optional(S.String),\n segments: S.Array(TranscriptSegment),\n}).pipe(EchoObject({ typename: 'dxos.org/type/TranscriptBlock', version: '0.1.0' }));\n\nexport type TranscriptBlock = S.Schema.Type<typeof TranscriptBlock>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { S, isInstanceOf } from '@dxos/echo-schema';\nimport { isReactiveObject } from '@dxos/react-client/echo';\n\nimport { TranscriptType } from './schema';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\n// TODO(burdon): Move to separate proto.\n\n/**\n * Endpoint to the calls service.\n */\n// TODO(burdon): Reconfigure/move.\nexport const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';\n\nexport namespace TranscriptionAction {\n const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;\n\n export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {\n input: S.Struct({\n name: S.optional(S.String),\n // TODO(wittjosiah): SpaceId.\n spaceId: S.String,\n }),\n output: S.Struct({\n object: TranscriptType,\n }),\n }) {}\n}\n\nexport const isTranscript = (object: unknown): object is typeof TranscriptType => {\n return isReactiveObject(object) && isInstanceOf(TranscriptType, object);\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yBAAyD;ACAzD,IAAAA,sBAAgC;AAChC,kBAAiC;ADI1B,IAAMC,mBAAmBC,qBAAEC,OAAO;EACvCC,MAAMF,qBAAEG;;EAGRC,SAASJ,qBAAEK,SAASL,qBAAEM,IAAI;EAC1BC,OAAOP,qBAAEK,SAASL,qBAAEM,IAAI;;;;;EAMxBE,WAAOC,wBAAIC,0BAAAA;AACb,CAAA;AAEO,IAAMC,iBAAN,kBAA6BC,gCAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGf,iBAAiBgB,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBhB,qBAAEC,OAAO;EAChCG,SAASJ,qBAAEK,SAASL,qBAAEM,IAAI;AAC5B,CAAA;AAOA,IAAMW,oBAAoBjB,qBAAEC,OAAO;;EAEjCG,SAASJ,qBAAEM;EACXY,MAAMlB,qBAAEG;AACV,CAAA;AAOO,IAAMgB,kBAAkBnB,qBAAEC,OAAO;EACtCmB,IAAIpB,qBAAEG;EACNkB,YAAYrB,qBAAEK,SAASL,qBAAEG,MAAM;EAC/BmB,WAAWtB,qBAAEK,SAASL,qBAAEG,MAAM;EAC9BoB,UAAUvB,qBAAEwB,MAAMP,iBAAAA;AACpB,CAAA,EAAGQ,SAAKC,+BAAW;EAAEb,UAAU;EAAiCC,SAAS;AAAQ,CAAA,CAAA;AC3C1E,IAAMa,oBAAoB;;UAEhBC,sBAAAA;AACf,QAAMC,uBAAuB,GAAGC,0CAAAA;EAEzB,MAAMC,eAAe/B,oBAAAA,EAAEgC,YAAW,EAAW,GAAGH,oBAAAA,WAA+B;IACpFI,OAAOjC,oBAAAA,EAAEC,OAAO;MACdC,MAAMF,oBAAAA,EAAEK,SAASL,oBAAAA,EAAEG,MAAM;;MAEzB+B,SAASlC,oBAAAA,EAAEG;IACb,CAAA;IACAgC,QAAQnC,oBAAAA,EAAEC,OAAO;MACfmC,QAAQzB;IACV,CAAA;EACF,CAAA,EAAA;EAAI;uBATSoB,SAAAA;AAUf,GAbiBH,wBAAAA,sBAAAA,CAAAA,EAAAA;AAeV,IAAMS,eAAe,CAACD,WAAAA;AAC3B,aAAOE,8BAAiBF,MAAAA,SAAWG,kCAAa5B,gBAAgByB,MAAAA;AAClE;",
6
- "names": ["import_echo_schema", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "Date", "ended", "queue", "Ref", "Expando", "TranscriptType", "TypedObject", "typename", "version", "fields", "TranscriptHeader", "TranscriptSegment", "text", "TranscriptBlock", "id", "authorName", "authorHue", "segments", "Array", "pipe", "EchoObject", "TRANSCRIPTION_URL", "TranscriptionAction", "TRANSCRIPTION_ACTION", "TRANSCRIPTION_PLUGIN", "Create", "TaggedClass", "input", "spaceId", "output", "object", "isTranscript", "isReactiveObject", "isInstanceOf"]
7
- }