@dxos/plugin-transcription 0.8.1-staging.5be625a → 0.8.1-staging.97aedb1

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 (165) hide show
  1. package/dist/lib/browser/{TranscriptContainer-TJXP6ICP.mjs → TranscriptContainer-JQ3HFHLQ.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +191 -0
  3. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-YEVVZZTC.mjs → chunk-6ZR5MDK3.mjs} +2 -2
  5. package/dist/lib/browser/{chunk-MD4NQO6W.mjs → chunk-G4B6CPC2.mjs} +19 -18
  6. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-GU2BNYKZ.mjs +35 -0
  8. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-K7FOYAXO.mjs +8 -0
  10. package/dist/lib/browser/{chunk-YRW4MNRE.mjs → chunk-OGNXNGJB.mjs} +10 -16
  11. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-N3VKF2J3.mjs → chunk-YCZISX63.mjs} +190 -141
  13. package/dist/lib/browser/chunk-YCZISX63.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-YEPT334A.mjs +16 -0
  15. package/dist/lib/browser/chunk-YEPT334A.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +58 -230
  17. package/dist/lib/browser/index.mjs.map +4 -4
  18. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs +33 -0
  19. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +7 -0
  20. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs +18 -0
  21. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +7 -0
  22. package/dist/lib/browser/meta.json +1 -1
  23. package/dist/lib/browser/{react-surface-OM2EECBI.mjs → react-surface-FQUHU5G7.mjs} +10 -11
  24. package/dist/lib/browser/{react-surface-OM2EECBI.mjs.map → react-surface-FQUHU5G7.mjs.map} +2 -2
  25. package/dist/lib/browser/transcriber-LGMIWDYI.mjs +36 -0
  26. package/dist/lib/browser/transcriber-LGMIWDYI.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +2 -2
  28. package/dist/lib/node/{TranscriptContainer-KNTN76RZ.cjs → TranscriptContainer-QEYTTT2V.cjs} +8 -8
  29. package/dist/lib/node/{TranscriptContainer-KNTN76RZ.cjs.map → TranscriptContainer-QEYTTT2V.cjs.map} +2 -2
  30. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +200 -0
  31. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +7 -0
  32. package/dist/lib/node/chunk-3KHUSQNW.cjs +55 -0
  33. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +7 -0
  34. package/dist/lib/node/chunk-CZMLKKWT.cjs +35 -0
  35. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-EKSRBQX7.cjs → chunk-FCCJALOT.cjs} +189 -138
  37. package/dist/lib/node/chunk-FCCJALOT.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-I6CUIAQH.cjs → chunk-LP4FG423.cjs} +5 -5
  39. package/dist/lib/node/{chunk-LEHTJHKP.cjs → chunk-NVZWGFJL.cjs} +4 -4
  40. package/dist/lib/node/{chunk-ZAE2IOZC.cjs → chunk-P4VVD6ZO.cjs} +11 -17
  41. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +7 -0
  42. package/dist/lib/node/{chunk-T4W4AKGM.cjs → chunk-UOFHT4GZ.cjs} +19 -18
  43. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +7 -0
  44. package/dist/lib/node/index.cjs +63 -235
  45. package/dist/lib/node/index.cjs.map +4 -4
  46. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs +45 -0
  47. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +7 -0
  48. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs +34 -0
  49. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +7 -0
  50. package/dist/lib/node/meta.json +1 -1
  51. package/dist/lib/node/{react-surface-ZENSCF6S.cjs → react-surface-WI2MGWCC.cjs} +12 -13
  52. package/dist/lib/node/{react-surface-ZENSCF6S.cjs.map → react-surface-WI2MGWCC.cjs.map} +2 -2
  53. package/dist/lib/node/transcriber-QG5WPKX4.cjs +49 -0
  54. package/dist/lib/node/transcriber-QG5WPKX4.cjs.map +7 -0
  55. package/dist/lib/node/types/index.cjs +8 -8
  56. package/dist/lib/node/types/index.cjs.map +1 -1
  57. package/dist/lib/node-esm/{TranscriptContainer-MOWZQSEO.mjs → TranscriptContainer-ZXUCOWGY.mjs} +3 -3
  58. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +192 -0
  59. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-4A6BWPRB.mjs → chunk-6X7X2UZF.mjs} +19 -18
  61. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-DLXORY7Y.mjs → chunk-GIO6J6FE.mjs} +10 -16
  63. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-HKATMD34.mjs +37 -0
  65. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-NFPDIQYG.mjs → chunk-J4D2RBBH.mjs} +3 -3
  67. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs +17 -0
  68. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-SB5TLXBU.mjs → chunk-X4DDJIVL.mjs} +2 -2
  70. package/dist/lib/node-esm/{chunk-SWV74BYU.mjs → chunk-YQYBLFNI.mjs} +190 -141
  71. package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +58 -230
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs +34 -0
  75. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +7 -0
  76. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs +19 -0
  77. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-surface-5CBEXLXJ.mjs → react-surface-PCH6NTVB.mjs} +10 -11
  80. package/dist/lib/node-esm/{react-surface-5CBEXLXJ.mjs.map → react-surface-PCH6NTVB.mjs.map} +2 -2
  81. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs +37 -0
  82. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs.map +7 -0
  83. package/dist/lib/node-esm/types/index.mjs +2 -2
  84. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/capabilities.d.ts +16 -1
  87. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/index.d.ts +5 -0
  89. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +6 -0
  92. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/transcriber.d.ts +7 -0
  94. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -0
  95. package/dist/types/src/components/Transcript/Transcript.d.ts +3 -2
  96. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  97. package/dist/types/src/components/TranscriptContainer.d.ts +1 -1
  98. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  99. package/dist/types/src/components/index.d.ts +1 -1
  100. package/dist/types/src/hooks/useTranscriber.d.ts +3 -6
  101. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  102. package/dist/types/src/index.d.ts +1 -2
  103. package/dist/types/src/index.d.ts.map +1 -1
  104. package/dist/types/src/transcriber/index.d.ts +1 -1
  105. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  106. package/dist/types/src/{transcription-manager.d.ts → transcriber/transcription-manager.d.ts} +2 -2
  107. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -0
  108. package/dist/types/src/translations.d.ts +9 -12
  109. package/dist/types/src/translations.d.ts.map +1 -1
  110. package/dist/types/src/types/schema.d.ts +4 -4
  111. package/dist/types/src/types/schema.d.ts.map +1 -1
  112. package/dist/types/src/types/types.d.ts +0 -11
  113. package/dist/types/src/types/types.d.ts.map +1 -1
  114. package/package.json +39 -38
  115. package/src/TranscriptionPlugin.tsx +23 -5
  116. package/src/capabilities/app-graph-builder.ts +135 -13
  117. package/src/capabilities/capabilities.ts +16 -2
  118. package/src/capabilities/index.ts +2 -0
  119. package/src/capabilities/intent-resolver.ts +2 -23
  120. package/src/capabilities/meeting-transcription-state.ts +16 -0
  121. package/src/capabilities/react-surface.tsx +2 -2
  122. package/src/capabilities/transcriber.ts +48 -0
  123. package/src/components/Transcript/Transcript.tsx +10 -10
  124. package/src/components/TranscriptContainer.tsx +6 -13
  125. package/src/hooks/useTranscriber.ts +12 -37
  126. package/src/index.ts +2 -2
  127. package/src/transcriber/index.ts +1 -1
  128. package/src/{transcription-manager.ts → transcriber/transcription-manager.ts} +5 -4
  129. package/src/translations.ts +4 -4
  130. package/src/types/schema.ts +3 -3
  131. package/src/types/types.ts +0 -8
  132. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +0 -39
  133. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +0 -7
  134. package/dist/lib/browser/chunk-3NWYXRZS.mjs +0 -8
  135. package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +0 -7
  138. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +0 -73
  139. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +0 -7
  140. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +0 -52
  141. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +0 -7
  142. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +0 -7
  143. package/dist/lib/node/chunk-T4W4AKGM.cjs.map +0 -7
  144. package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +0 -7
  145. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +0 -84
  146. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +0 -7
  147. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +0 -40
  148. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +0 -7
  150. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +0 -7
  152. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +0 -74
  153. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +0 -7
  154. package/dist/types/src/transcriber/summarize.d.ts +0 -5
  155. package/dist/types/src/transcriber/summarize.d.ts.map +0 -1
  156. package/dist/types/src/transcription-manager.d.ts.map +0 -1
  157. package/src/transcriber/summarize.ts +0 -77
  158. /package/dist/lib/browser/{TranscriptContainer-TJXP6ICP.mjs.map → TranscriptContainer-JQ3HFHLQ.mjs.map} +0 -0
  159. /package/dist/lib/browser/{chunk-YEVVZZTC.mjs.map → chunk-6ZR5MDK3.mjs.map} +0 -0
  160. /package/dist/lib/browser/{chunk-3NWYXRZS.mjs.map → chunk-K7FOYAXO.mjs.map} +0 -0
  161. /package/dist/lib/node/{chunk-I6CUIAQH.cjs.map → chunk-LP4FG423.cjs.map} +0 -0
  162. /package/dist/lib/node/{chunk-LEHTJHKP.cjs.map → chunk-NVZWGFJL.cjs.map} +0 -0
  163. /package/dist/lib/node-esm/{TranscriptContainer-MOWZQSEO.mjs.map → TranscriptContainer-ZXUCOWGY.mjs.map} +0 -0
  164. /package/dist/lib/node-esm/{chunk-NFPDIQYG.mjs.map → chunk-J4D2RBBH.mjs.map} +0 -0
  165. /package/dist/lib/node-esm/{chunk-SB5TLXBU.mjs.map → chunk-X4DDJIVL.mjs.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  TranscriptContainer_default,
3
3
  TranscriptionContainer
4
- } from "./chunk-MD4NQO6W.mjs";
5
- import "./chunk-YEVVZZTC.mjs";
4
+ } from "./chunk-G4B6CPC2.mjs";
5
+ import "./chunk-6ZR5MDK3.mjs";
6
6
  export {
7
7
  TranscriptionContainer,
8
8
  TranscriptContainer_default as default
9
9
  };
10
- //# sourceMappingURL=TranscriptContainer-TJXP6ICP.mjs.map
10
+ //# sourceMappingURL=TranscriptContainer-JQ3HFHLQ.mjs.map
@@ -0,0 +1,191 @@
1
+ import {
2
+ TranscriptionManager
3
+ } from "./chunk-YCZISX63.mjs";
4
+ import "./chunk-GU2BNYKZ.mjs";
5
+ import {
6
+ TranscriptionCapabilities
7
+ } from "./chunk-YEPT334A.mjs";
8
+ import {
9
+ TranscriptType,
10
+ TranscriptionAction
11
+ } from "./chunk-OGNXNGJB.mjs";
12
+ import {
13
+ TRANSCRIPTION_PLUGIN
14
+ } from "./chunk-6ZR5MDK3.mjs";
15
+
16
+ // packages/plugins/plugin-transcription/src/capabilities/app-graph-builder.ts
17
+ import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
18
+ import { fullyQualifiedId, getSpace, makeRef } from "@dxos/client/echo";
19
+ import { generateName } from "@dxos/display-name";
20
+ import { getSchemaTypename, isInstanceOf } from "@dxos/echo-schema";
21
+ import { invariant } from "@dxos/invariant";
22
+ import { ClientCapabilities } from "@dxos/plugin-client";
23
+ import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from "@dxos/plugin-deck/types";
24
+ import { createExtension } from "@dxos/plugin-graph";
25
+ import { MeetingCapabilities } from "@dxos/plugin-meeting";
26
+ import { MeetingType } from "@dxos/plugin-meeting/types";
27
+ import { buf } from "@dxos/protocols/buf";
28
+ import { TranscriptionPayloadSchema } from "@dxos/protocols/buf/dxos/edge/calls_pb";
29
+ import { keyToFallback } from "@dxos/util";
30
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/capabilities/app-graph-builder.ts";
31
+ var codec = {
32
+ encode: (message) => {
33
+ return buf.toBinary(TranscriptionPayloadSchema, buf.create(TranscriptionPayloadSchema, message));
34
+ },
35
+ decode: (message) => {
36
+ return buf.fromBinary(TranscriptionPayloadSchema, message);
37
+ }
38
+ };
39
+ var getMeetingTranscript = async (context, meeting) => {
40
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
41
+ const typename = getSchemaTypename(TranscriptType);
42
+ const existing = await meeting.artifacts[typename]?.load();
43
+ if (existing instanceof TranscriptType) {
44
+ return existing;
45
+ }
46
+ const space = getSpace(meeting);
47
+ invariant(space, void 0, {
48
+ F: __dxlog_file,
49
+ L: 52,
50
+ S: void 0,
51
+ A: [
52
+ "space",
53
+ ""
54
+ ]
55
+ });
56
+ const { data } = await dispatch(createIntent(TranscriptionAction.Create, {
57
+ spaceId: space.id
58
+ }));
59
+ meeting.artifacts[typename] = makeRef(data.object);
60
+ return data?.object;
61
+ };
62
+ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
63
+ createExtension({
64
+ id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,
65
+ filter: (node) => isInstanceOf(MeetingType, node.data) && node.type !== PLANK_COMPANION_TYPE,
66
+ actions: ({ node }) => {
67
+ const meeting = node.data;
68
+ const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
69
+ return [
70
+ {
71
+ id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,
72
+ data: async () => {
73
+ const call = context.requestCapability(MeetingCapabilities.CallManager);
74
+ invariant(state.transcriptionManager, void 0, {
75
+ F: __dxlog_file,
76
+ L: 73,
77
+ S: void 0,
78
+ A: [
79
+ "state.transcriptionManager",
80
+ ""
81
+ ]
82
+ });
83
+ state.enabled = !state.enabled;
84
+ void state.transcriptionManager.setEnabled(state.enabled);
85
+ const transcript = await getMeetingTranscript(context, meeting);
86
+ invariant(transcript, "Failed to create transcript", {
87
+ F: __dxlog_file,
88
+ L: 77,
89
+ S: void 0,
90
+ A: [
91
+ "transcript",
92
+ "'Failed to create transcript'"
93
+ ]
94
+ });
95
+ call.setActivity(getSchemaTypename(TranscriptType), {
96
+ value: codec.encode({
97
+ enabled: state.enabled,
98
+ queueDxn: transcript.queue.dxn.toString()
99
+ })
100
+ });
101
+ },
102
+ properties: {
103
+ label: state.enabled ? [
104
+ "stop transcription label",
105
+ {
106
+ ns: TRANSCRIPTION_PLUGIN
107
+ }
108
+ ] : [
109
+ "start transcription label",
110
+ {
111
+ ns: TRANSCRIPTION_PLUGIN
112
+ }
113
+ ],
114
+ icon: "ph--record--regular",
115
+ disposition: "toolbar",
116
+ classNames: state.enabled ? "text-activeInCall" : ""
117
+ }
118
+ }
119
+ ];
120
+ },
121
+ connector: ({ node }) => {
122
+ const meeting = node.data;
123
+ const client = context.requestCapability(ClientCapabilities.Client);
124
+ const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
125
+ return [
126
+ {
127
+ id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,
128
+ type: PLANK_COMPANION_TYPE,
129
+ data: meeting.artifacts[getSchemaTypename(TranscriptType)]?.target,
130
+ properties: {
131
+ label: [
132
+ "transcript companion label",
133
+ {
134
+ ns: TRANSCRIPTION_PLUGIN
135
+ }
136
+ ],
137
+ icon: "ph--subtitles--regular",
138
+ disposition: "hidden",
139
+ schema: TranscriptType,
140
+ getIntent: ({ space }) => createIntent(TranscriptionAction.Create, {
141
+ spaceId: space.id
142
+ }),
143
+ onJoin: () => {
144
+ const transcriptionManager = new TranscriptionManager(client.edge);
145
+ const identity = client.halo.identity.get();
146
+ invariant(identity, void 0, {
147
+ F: __dxlog_file,
148
+ L: 116,
149
+ S: void 0,
150
+ A: [
151
+ "identity",
152
+ ""
153
+ ]
154
+ });
155
+ transcriptionManager.setName(identity.profile?.displayName ?? generateName(identity.identityKey.toHex()));
156
+ const fallbackValue = keyToFallback(identity.identityKey);
157
+ const userHue = identity.profile?.data?.hue || fallbackValue.hue;
158
+ transcriptionManager.setHue(userHue);
159
+ void transcriptionManager.open();
160
+ state.transcriptionManager = transcriptionManager;
161
+ },
162
+ onLeave: () => {
163
+ void state.transcriptionManager?.close();
164
+ state.transcriptionManager = void 0;
165
+ state.enabled = false;
166
+ },
167
+ onCallStateUpdated: (callState) => {
168
+ const typename = getSchemaTypename(TranscriptType);
169
+ const transcription = typename ? callState.activities?.[typename] : void 0;
170
+ if (!transcription?.payload?.value) {
171
+ return;
172
+ }
173
+ const payload = codec.decode(transcription.payload.value);
174
+ state.enabled = payload.enabled;
175
+ void state.transcriptionManager?.setEnabled(payload.enabled);
176
+ void state.transcriptionManager?.setQueue(payload.queueDxn);
177
+ },
178
+ onMediaStateUpdated: ([mediaState, isSpeaking]) => {
179
+ void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);
180
+ void state.transcriptionManager?.setRecording(isSpeaking);
181
+ }
182
+ }
183
+ }
184
+ ];
185
+ }
186
+ })
187
+ ]);
188
+ export {
189
+ app_graph_builder_default as default
190
+ };
191
+ //# sourceMappingURL=app-graph-builder-VDQOVX7P.mjs.map
@@ -0,0 +1,7 @@
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": ["Capabilities", "contributes", "createIntent", "fullyQualifiedId", "getSpace", "makeRef", "generateName", "getSchemaTypename", "isInstanceOf", "invariant", "ClientCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "MeetingCapabilities", "MeetingType", "buf", "TranscriptionPayloadSchema", "keyToFallback", "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,4 +1,4 @@
1
- // packages/plugins/experimental/plugin-transcription/src/meta.ts
1
+ // packages/plugins/plugin-transcription/src/meta.ts
2
2
  var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
3
3
  var meta = {
4
4
  id: TRANSCRIPTION_PLUGIN,
@@ -16,4 +16,4 @@ export {
16
16
  TRANSCRIPTION_PLUGIN,
17
17
  meta
18
18
  };
19
- //# sourceMappingURL=chunk-YEVVZZTC.mjs.map
19
+ //# sourceMappingURL=chunk-6ZR5MDK3.mjs.map
@@ -1,15 +1,14 @@
1
1
  import {
2
2
  TRANSCRIPTION_PLUGIN
3
- } from "./chunk-YEVVZZTC.mjs";
3
+ } from "./chunk-6ZR5MDK3.mjs";
4
4
 
5
- // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
6
- import React2, { Fragment } from "react";
5
+ // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
6
+ import React2 from "react";
7
7
  import { fullyQualifiedId } from "@dxos/client/echo";
8
- import { DXN } from "@dxos/keys";
9
8
  import { useQueue } from "@dxos/react-client/echo";
10
9
  import { StackItem } from "@dxos/react-ui-stack";
11
10
 
12
- // packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx
11
+ // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
13
12
  import { intervalToDuration } from "date-fns/intervalToDuration";
14
13
  import { yieldOrContinue } from "main-thread-scheduling";
15
14
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -83,7 +82,7 @@ var measureRows = async (host, blocks, queueMap, signal) => {
83
82
  }
84
83
  return result;
85
84
  };
86
- var Transcript = ({ blocks, attendableId, ignoreAttention }) => {
85
+ var Transcript = ({ classNames, blocks, attendableId, ignoreAttention }) => {
87
86
  const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
88
87
  const { hasAttention } = useAttention(attendableId);
89
88
  const [dxGrid, setDxGrid] = useState(null);
@@ -196,7 +195,10 @@ var Transcript = ({ blocks, attendableId, ignoreAttention }) => {
196
195
  dxGrid,
197
196
  autoScroll
198
197
  ]);
199
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid.Root, {
198
+ return /* @__PURE__ */ React.createElement("div", {
199
+ role: "none",
200
+ className: mx("relative min-bs-0", classNames)
201
+ }, /* @__PURE__ */ React.createElement(Grid.Root, {
200
202
  id: `${attendableId}--transcript`
201
203
  }, /* @__PURE__ */ React.createElement(Grid.Content, {
202
204
  limitColumns: 2,
@@ -227,19 +229,18 @@ var Transcript = ({ blocks, attendableId, ignoreAttention }) => {
227
229
  }));
228
230
  };
229
231
 
230
- // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
231
- var TranscriptionContainer = ({ transcript, role }) => {
232
+ // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
233
+ var TranscriptionContainer = ({ role, transcript }) => {
232
234
  const attendableId = fullyQualifiedId(transcript);
233
- const queue = useQueue(transcript.queue ? DXN.parse(transcript.queue) : void 0, {
235
+ const queue = useQueue(transcript.queue.dxn, {
234
236
  pollInterval: 1e3
235
237
  });
236
- const Root = role === "article" ? StackItem.Content : Fragment;
237
- const rootProps = role === "article" ? {
238
- toolbar: false
239
- } : {};
240
- return /* @__PURE__ */ React2.createElement(Root, rootProps, /* @__PURE__ */ React2.createElement(Transcript, {
241
- blocks: queue?.items,
242
- attendableId
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
243
244
  }));
244
245
  };
245
246
  var TranscriptContainer_default = TranscriptionContainer;
@@ -249,4 +250,4 @@ export {
249
250
  TranscriptionContainer,
250
251
  TranscriptContainer_default
251
252
  };
252
- //# sourceMappingURL=chunk-MD4NQO6W.mjs.map
253
+ //# sourceMappingURL=chunk-G4B6CPC2.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 } 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
+ }
@@ -0,0 +1,35 @@
1
+ // packages/plugins/plugin-transcription/src/util/get-time-str.ts
2
+ var getTimeStr = (timestamp) => new Date(timestamp ?? Date.now()).toLocaleTimeString("en-US", {
3
+ timeZone: "UTC",
4
+ hour12: true,
5
+ hour: "numeric",
6
+ minute: "2-digit",
7
+ second: "2-digit"
8
+ });
9
+
10
+ // packages/plugins/plugin-transcription/src/util/random-queue-dxn.ts
11
+ import { ObjectId } from "@dxos/echo-schema";
12
+ import { DXN, QueueSubspaceTags, SpaceId } from "@dxos/keys";
13
+ var randomQueueDxn = (spaceId) => new DXN(DXN.kind.QUEUE, [
14
+ QueueSubspaceTags.DATA,
15
+ spaceId ?? SpaceId.random(),
16
+ ObjectId.random()
17
+ ]);
18
+
19
+ // packages/plugins/plugin-transcription/src/util/array.ts
20
+ var mergeFloat64Arrays = (arrays) => {
21
+ const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
22
+ let offset = 0;
23
+ for (const array of arrays) {
24
+ newArray.set(array, offset);
25
+ offset += array.length;
26
+ }
27
+ return newArray;
28
+ };
29
+
30
+ export {
31
+ mergeFloat64Arrays,
32
+ getTimeStr,
33
+ randomQueueDxn
34
+ };
35
+ //# sourceMappingURL=chunk-GU2BNYKZ.mjs.map
@@ -0,0 +1,7 @@
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
+ }
@@ -0,0 +1,8 @@
1
+ // packages/plugins/plugin-transcription/src/components/index.ts
2
+ import { lazy } from "react";
3
+ var TranscriptContainer = lazy(() => import("./TranscriptContainer-JQ3HFHLQ.mjs"));
4
+
5
+ export {
6
+ TranscriptContainer
7
+ };
8
+ //# sourceMappingURL=chunk-K7FOYAXO.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  TRANSCRIPTION_PLUGIN
3
- } from "./chunk-YEVVZZTC.mjs";
3
+ } from "./chunk-6ZR5MDK3.mjs";
4
4
 
5
- // packages/plugins/experimental/plugin-transcription/src/types/schema.ts
6
- import { EchoObject, S, TypedObject } from "@dxos/echo-schema";
5
+ // packages/plugins/plugin-transcription/src/types/schema.ts
6
+ import { EchoObject, Expando, Ref, S, TypedObject } from "@dxos/echo-schema";
7
7
  var TranscriptSchema = S.Struct({
8
8
  name: S.String,
9
9
  // TODO(burdon): Use string for dates?
@@ -13,7 +13,7 @@ var TranscriptSchema = S.Struct({
13
13
  * Queue containing TranscriptBlock objects.
14
14
  */
15
15
  // TODO(wittjosiah): Should be a ref to a queue.
16
- queue: S.optional(S.String)
16
+ queue: Ref(Expando)
17
17
  });
18
18
  var TranscriptType = class extends TypedObject({
19
19
  typename: "dxos.org/type/Transcript",
@@ -33,9 +33,12 @@ var TranscriptBlock = S.Struct({
33
33
  authorName: S.optional(S.String),
34
34
  authorHue: S.optional(S.String),
35
35
  segments: S.Array(TranscriptSegment)
36
- }).pipe(EchoObject("dxos.org/type/TranscriptBlock", "0.1.0"));
36
+ }).pipe(EchoObject({
37
+ typename: "dxos.org/type/TranscriptBlock",
38
+ version: "0.1.0"
39
+ }));
37
40
 
38
- // packages/plugins/experimental/plugin-transcription/src/types/types.ts
41
+ // packages/plugins/plugin-transcription/src/types/types.ts
39
42
  import { S as S2, isInstanceOf } from "@dxos/echo-schema";
40
43
  import { isReactiveObject } from "@dxos/react-client/echo";
41
44
  var TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
@@ -54,15 +57,6 @@ var TranscriptionAction;
54
57
  }) {
55
58
  }
56
59
  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;
66
60
  })(TranscriptionAction || (TranscriptionAction = {}));
67
61
  var isTranscript = (object) => {
68
62
  return isReactiveObject(object) && isInstanceOf(TranscriptType, object);
@@ -76,4 +70,4 @@ export {
76
70
  TranscriptionAction,
77
71
  isTranscript
78
72
  };
79
- //# sourceMappingURL=chunk-YRW4MNRE.mjs.map
73
+ //# sourceMappingURL=chunk-OGNXNGJB.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, 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
+ }