@dxos/plugin-transcription 0.8.0 → 0.8.1-main.81238a8

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 (150) hide show
  1. package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs → TranscriptContainer-AVRMYKZ6.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
  3. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
  5. package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-AS364WZZ.mjs → chunk-TULUCFLG.mjs} +2 -2
  7. package/dist/lib/browser/chunk-UHGQC3QN.mjs +248 -0
  8. package/dist/lib/browser/chunk-UHGQC3QN.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
  10. package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
  12. package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +201 -359
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
  16. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs → react-surface-57TWNWTM.mjs} +15 -8
  19. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-57TWNWTM.mjs.map} +2 -2
  20. package/dist/lib/browser/types/index.mjs +2 -1
  21. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-4FSQUMPN.cjs} +8 -8
  22. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-4FSQUMPN.cjs.map} +2 -2
  23. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
  24. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-CNB7GPXB.cjs} +5 -5
  26. package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
  27. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
  28. package/dist/lib/node/chunk-H23VTCTT.cjs +275 -0
  29. package/dist/lib/node/chunk-H23VTCTT.cjs.map +7 -0
  30. package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
  31. package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
  33. package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
  34. package/dist/lib/node/index.cjs +219 -372
  35. package/dist/lib/node/index.cjs.map +4 -4
  36. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
  37. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
  38. package/dist/lib/node/meta.json +1 -1
  39. package/dist/lib/node/{react-surface-AGGGDOUC.cjs → react-surface-ZU56WM4L.cjs} +18 -12
  40. package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-ZU56WM4L.cjs.map} +2 -2
  41. package/dist/lib/node/types/index.cjs +8 -7
  42. package/dist/lib/node/types/index.cjs.map +2 -2
  43. package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs → TranscriptContainer-HHSAIFYL.mjs} +3 -3
  44. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
  45. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-CW7WZFAA.mjs} +2 -2
  47. package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
  48. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-RVYUMVX3.mjs +249 -0
  50. package/dist/lib/node-esm/chunk-RVYUMVX3.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
  52. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
  54. package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +201 -359
  56. package/dist/lib/node-esm/index.mjs.map +4 -4
  57. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
  58. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs → react-surface-BDGK2JO6.mjs} +15 -8
  61. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-BDGK2JO6.mjs.map} +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +2 -1
  63. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
  64. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  67. package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
  68. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  69. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  70. package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
  71. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  72. package/dist/types/src/components/index.d.ts +1 -0
  73. package/dist/types/src/components/index.d.ts.map +1 -1
  74. package/dist/types/src/components/transcription.stories.d.ts +3 -2
  75. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  76. package/dist/types/src/hooks/index.d.ts +0 -1
  77. package/dist/types/src/hooks/index.d.ts.map +1 -1
  78. package/dist/types/src/index.d.ts +1 -0
  79. package/dist/types/src/index.d.ts.map +1 -1
  80. package/dist/types/src/meta.d.ts +2 -9
  81. package/dist/types/src/meta.d.ts.map +1 -1
  82. package/dist/types/src/transcriber/index.d.ts +1 -0
  83. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  84. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
  85. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  86. package/dist/types/src/transcriber/summarize.d.ts +5 -0
  87. package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
  88. package/dist/types/src/transcription-manager.d.ts +39 -0
  89. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  90. package/dist/types/src/translations.d.ts +3 -6
  91. package/dist/types/src/translations.d.ts.map +1 -1
  92. package/dist/types/src/types/schema.d.ts +9 -15
  93. package/dist/types/src/types/schema.d.ts.map +1 -1
  94. package/dist/types/src/types/types.d.ts +13 -6
  95. package/dist/types/src/types/types.d.ts.map +1 -1
  96. package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
  97. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
  98. package/package.json +40 -37
  99. package/src/capabilities/app-graph-builder.ts +25 -2
  100. package/src/capabilities/intent-resolver.ts +24 -2
  101. package/src/capabilities/react-surface.tsx +2 -2
  102. package/src/components/Transcript/Transcript.stories.tsx +46 -27
  103. package/src/components/Transcript/Transcript.tsx +200 -49
  104. package/src/components/TranscriptContainer.tsx +12 -147
  105. package/src/components/transcription.stories.tsx +11 -13
  106. package/src/hooks/index.ts +0 -1
  107. package/src/index.ts +1 -0
  108. package/src/meta.ts +2 -2
  109. package/src/transcriber/index.ts +1 -0
  110. package/src/transcriber/media-stream-recorder.ts +4 -0
  111. package/src/transcriber/summarize.ts +77 -0
  112. package/src/transcription-manager.ts +183 -0
  113. package/src/translations.ts +1 -2
  114. package/src/types/schema.ts +5 -3
  115. package/src/types/types.ts +12 -2
  116. package/src/util/random-queue-dxn.ts +2 -2
  117. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
  118. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
  120. package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
  121. package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
  123. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
  124. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
  125. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
  126. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
  127. package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
  128. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
  129. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
  130. package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
  131. package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
  132. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
  133. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +0 -7
  134. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
  135. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
  136. package/dist/lib/node-esm/chunk-36EQXBWR.mjs +0 -242
  137. package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
  139. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
  140. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
  141. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
  142. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
  143. package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
  144. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
  145. package/src/hooks/useIsSpeaking.ts +0 -77
  146. /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-AVRMYKZ6.mjs.map} +0 -0
  147. /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-TULUCFLG.mjs.map} +0 -0
  148. /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-CNB7GPXB.cjs.map} +0 -0
  149. /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-HHSAIFYL.mjs.map} +0 -0
  150. /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-CW7WZFAA.mjs.map} +0 -0
@@ -0,0 +1,248 @@
1
+ import {
2
+ TRANSCRIPTION_PLUGIN
3
+ } from "./chunk-YEVVZZTC.mjs";
4
+
5
+ // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
6
+ import React2, { Fragment } from "react";
7
+ import { fullyQualifiedId } from "@dxos/client/echo";
8
+ import { DXN } from "@dxos/keys";
9
+ import { useQueue } from "@dxos/react-client/echo";
10
+ import { StackItem } from "@dxos/react-ui-stack";
11
+
12
+ // packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx
13
+ import { intervalToDuration } from "date-fns/intervalToDuration";
14
+ import { yieldOrContinue } from "main-thread-scheduling";
15
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
16
+ import { useResizeDetector } from "react-resize-detector";
17
+ import { IconButton, useTranslation } from "@dxos/react-ui";
18
+ import { useAttention } from "@dxos/react-ui-attention";
19
+ import { Grid, toPlaneCellIndex } from "@dxos/react-ui-grid";
20
+ import { mx } from "@dxos/react-ui-theme";
21
+ var lineHeight = 20;
22
+ var cellSpacing = 8 + 2;
23
+ var timestampColumnWidth = 68;
24
+ var authorClasses = "font-medium text-base leading-[20px]";
25
+ var timestampClasses = "text-xs leading-[20px] text-description pie-0 tabular-nums";
26
+ var segmentTextClasses = "text-sm whitespace-normal hyphens-auto";
27
+ var measureClasses = mx(
28
+ // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)
29
+ "absolute inline-start-[69px] inline-end-0 invisible z-[-1] border 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 = ({ 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 handleWheel = useCallback((event) => {
93
+ setAutoScroll(false);
94
+ if (!ignoreAttention && !hasAttention) {
95
+ event.stopPropagation();
96
+ }
97
+ }, [
98
+ hasAttention,
99
+ ignoreAttention
100
+ ]);
101
+ const queueMap = useMemo(() => mapTranscriptQueue(blocks), [
102
+ blocks
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(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid.Root, {
199
+ id: `${attendableId}--transcript`
200
+ }, /* @__PURE__ */ React.createElement(Grid.Content, {
201
+ limitColumns: 2,
202
+ columns,
203
+ limitRows: queueMap.length,
204
+ rowDefault,
205
+ rows,
206
+ onWheel: handleWheel,
207
+ 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",
208
+ ref: setDxGrid
209
+ })), /* @__PURE__ */ React.createElement("div", {
210
+ role: "none",
211
+ inert: "",
212
+ "aria-hidden": true,
213
+ className: measureClasses,
214
+ ref: measureRef
215
+ }), /* @__PURE__ */ React.createElement(IconButton, {
216
+ icon: "ph--arrow-line-down--regular",
217
+ iconOnly: true,
218
+ label: t("scroll to end label"),
219
+ tooltipSide: "left",
220
+ "data-state": autoScroll ? "invisible" : "visible",
221
+ classNames: 'absolute inline-end-2 block-end-2 opacity-0 pointer-events-none data-[state="visible"]:pointer-events-auto data-[state="visible"]:opacity-100 transition-opacity',
222
+ onClick: handleScrollToEnd
223
+ }));
224
+ };
225
+
226
+ // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
227
+ var TranscriptionContainer = ({ transcript, role }) => {
228
+ const attendableId = fullyQualifiedId(transcript);
229
+ const queue = useQueue(transcript.queue ? DXN.parse(transcript.queue) : void 0, {
230
+ pollInterval: 1e3
231
+ });
232
+ const Root = role === "article" ? StackItem.Content : Fragment;
233
+ const rootProps = role === "article" ? {
234
+ toolbar: false
235
+ } : {};
236
+ return /* @__PURE__ */ React2.createElement(Root, rootProps, /* @__PURE__ */ React2.createElement(Transcript, {
237
+ blocks: queue?.items,
238
+ attendableId
239
+ }));
240
+ };
241
+ var TranscriptContainer_default = TranscriptionContainer;
242
+
243
+ export {
244
+ Transcript,
245
+ TranscriptionContainer,
246
+ TranscriptContainer_default
247
+ };
248
+ //# sourceMappingURL=chunk-UHGQC3QN.mjs.map
@@ -0,0 +1,7 @@
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, Fragment } from 'react';\n\nimport { fullyQualifiedId } from '@dxos/client/echo';\nimport { DXN } from '@dxos/keys';\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<{ transcript: TranscriptType; role: string }> = ({ transcript, role }) => {\n const attendableId = fullyQualifiedId(transcript);\n\n const queue = useQueue<TranscriptBlock>(transcript.queue ? DXN.parse(transcript.queue) : undefined, {\n pollInterval: 1_000,\n });\n\n const Root = role === 'article' ? StackItem.Content : Fragment;\n const rootProps = role === 'article' ? { toolbar: false } : {};\n\n return (\n <Root {...(rootProps as any)}>\n <Transcript blocks={queue?.items} attendableId={attendableId} />\n </Root>\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, 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 pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]',\n segmentTextClasses,\n);\n\nexport type TranscriptProps = {\n blocks?: TranscriptBlock[];\n attendableId?: string;\n ignoreAttention?: boolean;\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 const Transcript: FC<TranscriptProps> = ({ 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 handleWheel = useCallback(\n (event: WheelEvent) => {\n setAutoScroll(false);\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const queueMap = useMemo(() => mapTranscriptQueue(blocks), [blocks]);\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\n // 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 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 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 <>\n <Grid.Root id={`${attendableId}--transcript`}>\n <Grid.Content\n limitColumns={2}\n columns={columns}\n limitRows={queueMap.length}\n rowDefault={rowDefault}\n rows={rows}\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='absolute inline-end-2 block-end-2 opacity-0 pointer-events-none data-[state=\"visible\"]:pointer-events-auto data-[state=\"visible\"]:opacity-100 transition-opacity'\n onClick={handleScrollToEnd}\n />\n </>\n );\n};\n"],
5
+ "mappings": ";;;;;AAIA,OAAOA,UAAkBC,gBAAgB;AAEzC,SAASC,wBAAwB;AACjC,SAASC,WAAW;AACpB,SAASC,gBAAgB;AACzB,SAASC,iBAAiB;;;ACL1B,SAASC,0BAA0B;AACnC,SAASC,uBAAuB;AAChC,OAAOC,SAAkBC,aAAaC,WAAWC,SAASC,QAAQC,gBAAiC;AACnG,SAAgCC,yBAAyB;AAEzD,SAASC,YAAYC,sBAAsB;AAC3C,SAASC,oBAAoB;AAC7B,SAKEC,MACAC,wBACK;AACP,SAASC,UAAU;AAOnB,IAAMC,aAAa;AACnB,IAAMC,cAAc,IAAI;AACxB,IAAMC,uBAAuB;AAE7B,IAAMC,gBAAgB;AACtB,IAAMC,mBAAmB;AACzB,IAAMC,qBAAqB;AAC3B,IAAMC,iBAAiBC;;EAErB;EACAF;AAAAA;AASF,IAAMG,aAAa;EACjBC,MAAM;IAAEC,MAAMV,aAAaC;EAAY;AACzC;AAIA,IAAMU,qBAAqB,CAACC,WAAAA;AAC1B,MAAI,CAACA,UAAU,CAACC,MAAMC,QAAQF,MAAAA,KAAWA,OAAOG,WAAW,GAAG;AAC5D,WAAO,CAAA;EACT,OAAO;AACL,WAAOH,OAAOI,QAAQ,CAACC,OAAOC,eAAAA;AAC5B,aAAO;QACL;UAACA;UAAY;;WACVD,MAAME,SAASC,IAAI,CAACC,SAASC,iBAAAA;AAC9B,iBAAO;YAACJ;YAAYI;;QACtB,CAAA;;IAEJ,CAAA;EACF;AACF;AAEA,IAAMC,MAAM,CAACC,IAAI,MAAMC,OAAOD,CAAAA,EAAGE,SAAS,GAAG,GAAA;AAE7C,IAAMC,kBAAkB,CAACC,OAAaC,QAAAA;AACpC,QAAM,EAAEC,OAAOC,SAASC,QAAO,IAAKC,mBAAmB;IAAEL;IAAOC;EAAI,CAAA;AACpE,SAAO,GAAGN,IAAIO,KAAAA,CAAAA,IAAUP,IAAIQ,OAAAA,CAAAA,IAAYR,IAAIS,OAAAA,CAAAA;AAC9C;AAEA,IAAME,cAAc,OAClBC,MACAvB,QACAwB,UACAC,WAAAA;AAEA,QAAMC,SAAyB;IAAE7B,MAAM,CAAC;EAAE;AAC1C,WAAS8B,MAAM,GAAGA,MAAMH,SAASrB,QAAQwB,OAAO;AAC9C,UAAMC,gBAAgB,UAAUH,MAAAA;AAChC,UAAM,CAACnB,YAAYI,YAAAA,IAAgBc,SAASG,GAAAA;AAC5C,QAAIjB,eAAe,GAAG;AACpBgB,aAAO7B,KAAK8B,GAAAA,IAAO;QAAE7B,MAAMV,aAAaC;MAAY;IACtD,OAAO;AACLkC,WAAKM,cAAc7B,OAAOM,UAAAA,EAAaC,SAASG,YAAAA,EAAeoB;AAC/DJ,aAAO7B,KAAK8B,GAAAA,IAAO;QAAE7B,MAAMyB,KAAKQ;MAAa;IAC/C;EACF;AACA,SAAOL;AACT;AAEO,IAAMM,aAAkC,CAAC,EAAEhC,QAAQiC,cAAcC,gBAAe,MAAE;AACvF,QAAM,EAAEC,EAAC,IAAKC,eAAeC,oBAAAA;AAC7B,QAAM,EAAEC,aAAY,IAAKC,aAAaN,YAAAA;AACtC,QAAM,CAACO,QAAQC,SAAAA,IAAaC,SAA+B,IAAA;AAC3D,QAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAqCG,MAAAA;AAC7D,QAAM,CAACC,SAASC,UAAAA,IAAcL,SAAqCG,MAAAA;AACnE,QAAM,CAACG,YAAYC,aAAAA,IAAiBP,SAAS,IAAA;AAE7C,QAAMQ,cAAcC,YAClB,CAACC,UAAAA;AACCH,kBAAc,KAAA;AACd,QAAI,CAACf,mBAAmB,CAACI,cAAc;AACrCc,YAAMC,gBAAe;IACvB;EACF,GACA;IAACf;IAAcJ;GAAgB;AAGjC,QAAMV,WAAW8B,QAAQ,MAAMvD,mBAAmBC,MAAAA,GAAS;IAACA;GAAO;AAEnE,QAAMuD,qBAAqBC,OAAAA;AAE3B,QAAMC,eAAeN,YACnB,OAAO,EAAEO,MAAK,MAAgD;AAC5D,QAAIA,OAAOC,UAAU1D,MAAMC,QAAQF,MAAAA,KAAWA,OAAO,CAAA,KAAMwB,UAAU;AACnE+B,yBAAmBK,SAASC,MAAAA;AAC5BN,yBAAmBK,UAAU,IAAIE,gBAAAA;AACjCf,iBAAW;QAAElD,MAAM;UAAE,GAAG;YAAEC,MAAMR;UAAqB;UAAG,GAAG;YAAEQ,MAAM4D,MAAMC,OAAOI;UAAY;QAAE;MAAE,CAAA;AAChG,aAAOzC,YAAYoC,MAAMC,QAAQ3D,QAAQwB,UAAU+B,mBAAmBK,QAAQnC,MAAM,EACjFuC,KAAKpB,OAAAA,EACLqB,MAAM,MAAA;MAEP,CAAA;IACJ;EACF,GACA;IAACjE;IAAQwB;GAAS;AAGpB,QAAM,EAAE0C,OAAOC,KAAKC,WAAU,IAAKC,kBAAkB;IACnDC,UAAUb;IACVc,gBAAgB;MAAEC,SAAS;IAAK;EAClC,CAAA;AAEAC,YAAU,MAAA;AACR,QAAIjD,SAASrB,WAAWuE,OAAOC,KAAKhC,MAAM9C,QAAQ,CAAC,CAAA,EAAGM,QAAQ;AAC5D,WAAKsD,aAAa;QAAEC,OAAO;UAAEC,QAAQS,WAAWR;QAAQ;MAAE,CAAA,EAAGI,KAAK,MAAA;AAChE,YAAIhB,YAAY;AAGd4B,qBAAW,MAAMpC,QAAQqC,eAAAA,GAAkB,EAAA;QAC7C;MACF,CAAA;IACF;EACF,GAAG;IAAC7E;IAAQwB;IAAU0C;IAAOlB;GAAW;AAExCyB,YAAU,MAAA;AACR,QAAIjC,UAAUvC,MAAMC,QAAQF,MAAAA,KAAWA,OAAO,CAAA,GAAI;AAChD,YAAM8E,kBAAkB9E,OAAO,CAAA,EAAIO,SAAS,CAAA,EAAIwE;AAChDvC,aAAOwC,WAAW,CAACC,OAAOC,UAAAA;AACxB,gBAAQA,OAAAA;UACN,KAAK,QAAQ;AACX,kBAAMC,QAA0B,CAAC;AACjC,qBAASxD,MAAMsD,MAAMjE,MAAMW,KAAKA,OAAOsD,MAAMhE,IAAIU,OAAOA,MAAMH,SAASrB,QAAQwB,OAAO;AACpF,oBAAM,CAACrB,YAAYI,YAAAA,IAAgBc,SAASG,GAAAA;AAC5CwD,oBAAMC,iBAAiB;gBAAEC,KAAK;gBAAG1D;cAAI,CAAA,CAAA,IAAM;gBACzC2D,UAAU;gBACVC,OACE7E,eAAe,IACXK,gBAAgB+D,iBAAiB9E,OAAOM,UAAAA,EAAaC,SAASiF,KAAKC,IAAI,GAAG/E,YAAAA,CAAAA,EAAgBqE,OAAO,IACjG;gBACNW,WAAWlG;cACb;AACA2F,oBAAMC,iBAAiB;gBAAEC,KAAK;gBAAG1D;cAAI,CAAA,CAAA,IACnCjB,eAAe,IACX;gBACE4E,UAAU;gBACVK,eAAe,mBAAmB3F,OAAOM,UAAAA,EAAasF,SAAS,yBAAyB5F,OAAOM,UAAAA,EAAauF,UAAU;gBACtHH,WAAWnG;cACb,IACA;gBACE+F,UAAU;gBACVC,OAAOvF,OAAOM,UAAAA,EAAaC,SAASG,YAAAA,EAAeoB;gBACnD4D,WAAWjG;cACb;YAER;AACA,mBAAO0F;UACT;UACA;AACE,mBAAO,CAAC;QACZ;MACF;IACF;EACF,GAAG;IAAC3C;IAAQxC;GAAO;AAEnB,QAAM8F,oBAAoB3C,YAAY,MAAA;AACpCF,kBAAc,IAAA;AACdT,YAAQqC,eAAAA;EACV,GAAG;IAACrC;IAAQQ;GAAW;AAEvB,SACE,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAAC+C,KAAKC,MAAI;IAACC,IAAI,GAAGhE,YAAAA;KAChB,sBAAA,cAAC8D,KAAKG,SAAO;IACXC,cAAc;IACdrD;IACAsD,WAAW5E,SAASrB;IACpBP;IACA+C;IACA0D,SAASnD;IACTwC,WAAU;IACVvB,KAAK1B;OAGT,sBAAA,cAAC6D,OAAAA;IAAIC,MAAK;IAAaC,OAAO;IAAMC,eAAAA;IAAYf,WAAWhG;IAAgByE,KAAKC;MAChF,sBAAA,cAACsC,YAAAA;IACCC,MAAK;IACLC,UAAAA;IACAC,OAAO1E,EAAE,qBAAA;IACT2E,aAAY;IACZC,cAAY/D,aAAa,cAAc;IACvCgE,YAAW;IACXC,SAASnB;;AAIjB;;;AD7MO,IAAMoB,yBAA2E,CAAC,EAAEC,YAAYC,KAAI,MAAE;AAC3G,QAAMC,eAAeC,iBAAiBH,UAAAA;AAEtC,QAAMI,QAAQC,SAA0BL,WAAWI,QAAQE,IAAIC,MAAMP,WAAWI,KAAK,IAAII,QAAW;IAClGC,cAAc;EAChB,CAAA;AAEA,QAAMC,OAAOT,SAAS,YAAYU,UAAUC,UAAUC;AACtD,QAAMC,YAAYb,SAAS,YAAY;IAAEc,SAAS;EAAM,IAAI,CAAC;AAE7D,SACE,gBAAAC,OAAA,cAACN,MAAUI,WACT,gBAAAE,OAAA,cAACC,YAAAA;IAAWC,QAAQd,OAAOe;IAAOjB;;AAGxC;AAEA,IAAA,8BAAeH;",
6
+ "names": ["React", "Fragment", "fullyQualifiedId", "DXN", "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", "attendableId", "ignoreAttention", "t", "useTranslation", "TRANSCRIPTION_PLUGIN", "hasAttention", "useAttention", "dxGrid", "setDxGrid", "useState", "rows", "setRows", "undefined", "columns", "setColumns", "autoScroll", "setAutoScroll", "handleWheel", "useCallback", "event", "stopPropagation", "useMemo", "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", "Grid", "Root", "id", "Content", "limitColumns", "limitRows", "onWheel", "div", "role", "inert", "aria-hidden", "IconButton", "icon", "iconOnly", "label", "tooltipSide", "data-state", "classNames", "onClick", "TranscriptionContainer", "transcript", "role", "attendableId", "fullyQualifiedId", "queue", "useQueue", "DXN", "parse", "undefined", "pollInterval", "Root", "StackItem", "Content", "Fragment", "rootProps", "toolbar", "React", "Transcript", "blocks", "items"]
7
+ }
@@ -0,0 +1,19 @@
1
+ // packages/plugins/experimental/plugin-transcription/src/meta.ts
2
+ var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
3
+ var meta = {
4
+ id: TRANSCRIPTION_PLUGIN,
5
+ name: "Transcription",
6
+ description: "Voice transcription.",
7
+ icon: "ph--microphone--regular",
8
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription",
9
+ tags: [
10
+ "experimental"
11
+ ],
12
+ screenshots: []
13
+ };
14
+
15
+ export {
16
+ TRANSCRIPTION_PLUGIN,
17
+ meta
18
+ };
19
+ //# sourceMappingURL=chunk-YEVVZZTC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const TRANSCRIPTION_PLUGIN = 'dxos.org/plugin/transcription';\n\nexport const meta: PluginMeta = {\n id: TRANSCRIPTION_PLUGIN,\n name: 'Transcription',\n description: 'Voice transcription.',\n icon: 'ph--microphone--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription',\n tags: ['experimental'],\n screenshots: [],\n};\n"],
5
+ "mappings": ";AAMO,IAAMA,uBAAuB;AAE7B,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa,CAAA;AACf;",
6
+ "names": ["TRANSCRIPTION_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
7
+ }
@@ -1,5 +1,9 @@
1
+ import {
2
+ TRANSCRIPTION_PLUGIN
3
+ } from "./chunk-YEVVZZTC.mjs";
4
+
1
5
  // packages/plugins/experimental/plugin-transcription/src/types/schema.ts
2
- import { EchoObject, ObjectId, S, TypedObject } from "@dxos/echo-schema";
6
+ import { EchoObject, S, TypedObject } from "@dxos/echo-schema";
3
7
  var TranscriptSchema = S.Struct({
4
8
  name: S.String,
5
9
  // TODO(burdon): Use string for dates?
@@ -8,6 +12,7 @@ var TranscriptSchema = S.Struct({
8
12
  /**
9
13
  * Queue containing TranscriptBlock objects.
10
14
  */
15
+ // TODO(wittjosiah): Should be a ref to a queue.
11
16
  queue: S.optional(S.String)
12
17
  });
13
18
  var TranscriptType = class extends TypedObject({
@@ -24,52 +29,46 @@ var TranscriptSegment = S.Struct({
24
29
  text: S.String
25
30
  });
26
31
  var TranscriptBlock = S.Struct({
27
- id: ObjectId,
28
- author: S.optional(S.String),
32
+ id: S.String,
33
+ authorName: S.optional(S.String),
34
+ authorHue: S.optional(S.String),
29
35
  segments: S.Array(TranscriptSegment)
30
36
  }).pipe(EchoObject("dxos.org/type/TranscriptBlock", "0.1.0"));
31
37
 
32
38
  // packages/plugins/experimental/plugin-transcription/src/types/types.ts
33
39
  import { S as S2, isInstanceOf } from "@dxos/echo-schema";
34
40
  import { isReactiveObject } from "@dxos/react-client/echo";
35
-
36
- // packages/plugins/experimental/plugin-transcription/src/meta.ts
37
- var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
38
- var meta = {
39
- id: TRANSCRIPTION_PLUGIN,
40
- name: "Transcription",
41
- description: "Voice transcription.",
42
- icon: "ph--microphone--regular",
43
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription",
44
- tags: [
45
- "experimental"
46
- ],
47
- screenshots: []
48
- };
49
-
50
- // packages/plugins/experimental/plugin-transcription/src/types/types.ts
51
41
  var TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
52
42
  var TranscriptionAction;
53
43
  (function(TranscriptionAction2) {
54
44
  const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;
55
45
  class Create extends S2.TaggedClass()(`${TRANSCRIPTION_ACTION}/create`, {
56
46
  input: S2.Struct({
57
- name: S2.optional(S2.String)
47
+ name: S2.optional(S2.String),
48
+ // TODO(wittjosiah): SpaceId.
49
+ spaceId: S2.String
58
50
  }),
59
51
  output: S2.Struct({
60
- object: TranscriptSchema
52
+ object: TranscriptType
61
53
  })
62
54
  }) {
63
55
  }
64
56
  TranscriptionAction2.Create = Create;
57
+ class Summarize extends S2.TaggedClass()(`${TRANSCRIPTION_ACTION}/summarize`, {
58
+ input: S2.Struct({
59
+ transcript: TranscriptType,
60
+ context: S2.optional(S2.String)
61
+ }),
62
+ output: S2.String
63
+ }) {
64
+ }
65
+ TranscriptionAction2.Summarize = Summarize;
65
66
  })(TranscriptionAction || (TranscriptionAction = {}));
66
67
  var isTranscript = (object) => {
67
68
  return isReactiveObject(object) && isInstanceOf(TranscriptType, object);
68
69
  };
69
70
 
70
71
  export {
71
- TRANSCRIPTION_PLUGIN,
72
- meta,
73
72
  TranscriptSchema,
74
73
  TranscriptType,
75
74
  TranscriptBlock,
@@ -77,4 +76,4 @@ export {
77
76
  TranscriptionAction,
78
77
  isTranscript
79
78
  };
80
- //# sourceMappingURL=chunk-QIHUPVQD.mjs.map
79
+ //# sourceMappingURL=chunk-YRW4MNRE.mjs.map
@@ -0,0 +1,7 @@
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, 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: S.optional(S.String),\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('dxos.org/type/TranscriptBlock', '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 export class Summarize extends S.TaggedClass<Summarize>()(`${TRANSCRIPTION_ACTION}/summarize`, {\n input: S.Struct({\n transcript: TranscriptType,\n context: S.optional(S.String),\n }),\n output: S.String,\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,GAAGC,mBAAmB;AAKpC,IAAMC,mBAAmBC,EAAEC,OAAO;EACvCC,MAAMF,EAAEG;;EAGRC,SAASJ,EAAEK,SAASL,EAAEM,IAAI;EAC1BC,OAAOP,EAAEK,SAASL,EAAEM,IAAI;;;;;EAMxBE,OAAOR,EAAEK,SAASL,EAAEG,MAAM;AAC5B,CAAA;AAEO,IAAMM,iBAAN,cAA6BC,YAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGb,iBAAiBc,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBd,EAAEC,OAAO;EAChCG,SAASJ,EAAEK,SAASL,EAAEM,IAAI;AAC5B,CAAA;AAOA,IAAMS,oBAAoBf,EAAEC,OAAO;;EAEjCG,SAASJ,EAAEM;EACXU,MAAMhB,EAAEG;AACV,CAAA;AAOO,IAAMc,kBAAkBjB,EAAEC,OAAO;EACtCiB,IAAIlB,EAAEG;EACNgB,YAAYnB,EAAEK,SAASL,EAAEG,MAAM;EAC/BiB,WAAWpB,EAAEK,SAASL,EAAEG,MAAM;EAC9BkB,UAAUrB,EAAEsB,MAAMP,iBAAAA;AACpB,CAAA,EAAGQ,KAAKC,WAAW,iCAAiC,OAAA,CAAA;;;ACvDpD,SAASC,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;EAWN,MAAMY,kBAAkBX,GAAEC,YAAW,EAAc,GAAGJ,oBAAAA,cAAkC;IAC7FK,OAAOF,GAAEG,OAAO;MACdS,YAAYF;MACZG,SAASb,GAAEK,SAASL,GAAEM,MAAM;IAC9B,CAAA;IACAE,QAAQR,GAAEM;EACZ,CAAA,EAAA;EAAI;uBANSK,YAAAA;AAOf,GArBiBf,wBAAAA,sBAAAA,CAAAA,EAAAA;AAuBV,IAAMkB,eAAe,CAACL,WAAAA;AAC3B,SAAOM,iBAAiBN,MAAAA,KAAWO,aAAaN,gBAAgBD,MAAAA;AAClE;",
6
+ "names": ["EchoObject", "S", "TypedObject", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "Date", "ended", "queue", "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", "Summarize", "transcript", "context", "isTranscript", "isReactiveObject", "isInstanceOf"]
7
+ }