@dxos/plugin-transcription 0.8.0 → 0.8.1-main.013e445

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 (152) hide show
  1. package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs → TranscriptContainer-TJXP6ICP.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-AS364WZZ.mjs → chunk-3NWYXRZS.mjs} +2 -2
  5. package/dist/lib/browser/chunk-MD4NQO6W.mjs +252 -0
  6. package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
  8. package/dist/lib/browser/chunk-N3VKF2J3.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 +203 -366
  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-OM2EECBI.mjs} +15 -8
  19. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-OM2EECBI.mjs.map} +2 -2
  20. package/dist/lib/browser/types/index.mjs +2 -1
  21. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
  22. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-KNTN76RZ.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-EKSRBQX7.cjs +437 -0
  26. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-I6CUIAQH.cjs} +5 -5
  28. package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
  29. package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
  30. package/dist/lib/node/chunk-T4W4AKGM.cjs +279 -0
  31. package/dist/lib/node/chunk-T4W4AKGM.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 +220 -378
  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-ZENSCF6S.cjs} +18 -12
  40. package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-ZENSCF6S.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-MOWZQSEO.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-4A6BWPRB.mjs +253 -0
  47. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
  49. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-NFPDIQYG.mjs} +2 -2
  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 +203 -366
  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-5CBEXLXJ.mjs} +15 -8
  61. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-5CBEXLXJ.mjs.map} +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +2 -1
  63. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
  65. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  68. package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
  69. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  70. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
  72. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  73. package/dist/types/src/components/index.d.ts +1 -0
  74. package/dist/types/src/components/index.d.ts.map +1 -1
  75. package/dist/types/src/components/transcription.stories.d.ts +3 -2
  76. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  77. package/dist/types/src/hooks/index.d.ts +0 -1
  78. package/dist/types/src/hooks/index.d.ts.map +1 -1
  79. package/dist/types/src/index.d.ts +1 -0
  80. package/dist/types/src/index.d.ts.map +1 -1
  81. package/dist/types/src/meta.d.ts +2 -9
  82. package/dist/types/src/meta.d.ts.map +1 -1
  83. package/dist/types/src/transcriber/index.d.ts +1 -0
  84. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  85. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
  86. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  87. package/dist/types/src/transcriber/summarize.d.ts +5 -0
  88. package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
  89. package/dist/types/src/transcription-manager.d.ts +39 -0
  90. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  91. package/dist/types/src/translations.d.ts +5 -6
  92. package/dist/types/src/translations.d.ts.map +1 -1
  93. package/dist/types/src/types/schema.d.ts +9 -15
  94. package/dist/types/src/types/schema.d.ts.map +1 -1
  95. package/dist/types/src/types/types.d.ts +13 -6
  96. package/dist/types/src/types/types.d.ts.map +1 -1
  97. package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
  98. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
  99. package/package.json +40 -37
  100. package/src/TranscriptionPlugin.tsx +1 -2
  101. package/src/capabilities/app-graph-builder.ts +25 -2
  102. package/src/capabilities/intent-resolver.ts +24 -2
  103. package/src/capabilities/react-surface.tsx +2 -2
  104. package/src/components/Transcript/Transcript.stories.tsx +46 -27
  105. package/src/components/Transcript/Transcript.tsx +205 -49
  106. package/src/components/TranscriptContainer.tsx +12 -147
  107. package/src/components/transcription.stories.tsx +11 -13
  108. package/src/hooks/index.ts +0 -1
  109. package/src/index.ts +1 -0
  110. package/src/meta.ts +2 -2
  111. package/src/transcriber/index.ts +1 -0
  112. package/src/transcriber/media-stream-recorder.ts +4 -0
  113. package/src/transcriber/summarize.ts +77 -0
  114. package/src/transcription-manager.ts +183 -0
  115. package/src/translations.ts +2 -2
  116. package/src/types/schema.ts +5 -3
  117. package/src/types/types.ts +12 -2
  118. package/src/util/random-queue-dxn.ts +2 -2
  119. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
  120. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
  123. package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
  124. package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
  125. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
  126. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
  127. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
  128. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
  129. package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
  130. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
  131. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
  132. package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
  133. package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
  134. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
  135. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +0 -7
  136. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
  137. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-36EQXBWR.mjs +0 -242
  139. package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
  142. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
  143. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
  144. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
  145. package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
  146. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
  147. package/src/hooks/useIsSpeaking.ts +0 -77
  148. /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
  149. /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
  150. /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
  151. /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
  152. /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
@@ -2,10 +2,10 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  TranscriptContainer_default,
4
4
  TranscriptionContainer
5
- } from "./chunk-36EQXBWR.mjs";
6
- import "./chunk-KEG3ME4O.mjs";
5
+ } from "./chunk-4A6BWPRB.mjs";
6
+ import "./chunk-SB5TLXBU.mjs";
7
7
  export {
8
8
  TranscriptionContainer,
9
9
  TranscriptContainer_default as default
10
10
  };
11
- //# sourceMappingURL=TranscriptContainer-DVBXQIQ4.mjs.map
11
+ //# sourceMappingURL=TranscriptContainer-MOWZQSEO.mjs.map
@@ -0,0 +1,40 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ TranscriptType,
4
+ TranscriptionAction
5
+ } from "./chunk-DLXORY7Y.mjs";
6
+ import {
7
+ TRANSCRIPTION_PLUGIN
8
+ } from "./chunk-SB5TLXBU.mjs";
9
+
10
+ // packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts
11
+ import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
12
+ import { createExtension } from "@dxos/plugin-graph";
13
+ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
14
+ createExtension({
15
+ id: `${TRANSCRIPTION_PLUGIN}/transcription`,
16
+ filter: (node) => node.data instanceof TranscriptType,
17
+ actions: () => [
18
+ {
19
+ id: `${TRANSCRIPTION_PLUGIN}/transcription`,
20
+ data: async () => {
21
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
22
+ await dispatch(createIntent(TranscriptionAction.Summarize));
23
+ },
24
+ properties: {
25
+ label: [
26
+ "summarize label",
27
+ {
28
+ ns: TRANSCRIPTION_PLUGIN
29
+ }
30
+ ],
31
+ icon: "ph--book-open-text--regular"
32
+ }
33
+ }
34
+ ]
35
+ })
36
+ ]);
37
+ export {
38
+ app_graph_builder_default as default
39
+ };
40
+ //# sourceMappingURL=app-graph-builder-ARTLU4U5.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 { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptionAction, TranscriptType } from '../types';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${TRANSCRIPTION_PLUGIN}/transcription`,\n filter: (node): node is Node<TranscriptType> => node.data instanceof TranscriptType,\n actions: () => [\n {\n id: `${TRANSCRIPTION_PLUGIN}/transcription`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(TranscriptionAction.Summarize));\n },\n properties: {\n label: ['summarize label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--book-open-text--regular',\n },\n },\n ],\n }),\n ]);\n"],
5
+ "mappings": ";;;;;;;;;;AAIA,SAASA,cAAcC,aAAaC,oBAAyC;AAC7E,SAASC,uBAAkC;AAK3C,IAAA,4BAAe,CAACC,YACdC,YAAYC,aAAaC,iBAAiB;EACxCC,gBAAgB;IACdC,IAAI,GAAGC,oBAAAA;IACPC,QAAQ,CAACC,SAAuCA,KAAKC,gBAAgBC;IACrEC,SAAS,MAAM;MACb;QACEN,IAAI,GAAGC,oBAAAA;QACPG,MAAM,YAAA;AACJ,gBAAM,EAAEG,iBAAiBC,SAAQ,IAAKb,QAAQc,kBAAkBZ,aAAaa,gBAAgB;AAC7F,gBAAMF,SAASG,aAAaC,oBAAoBC,SAAS,CAAA;QAC3D;QACAC,YAAY;UACVC,OAAO;YAAC;YAAmB;cAAEC,IAAIf;YAAqB;;UACtDgB,MAAM;QACR;MACF;;EAEJ,CAAA;CACD;",
6
+ "names": ["Capabilities", "contributes", "createIntent", "createExtension", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "TRANSCRIPTION_PLUGIN", "filter", "node", "data", "TranscriptType", "actions", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "createIntent", "TranscriptionAction", "Summarize", "properties", "label", "ns", "icon"]
7
+ }
@@ -0,0 +1,253 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ TRANSCRIPTION_PLUGIN
4
+ } from "./chunk-SB5TLXBU.mjs";
5
+
6
+ // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
7
+ import React2, { Fragment } from "react";
8
+ import { fullyQualifiedId } from "@dxos/client/echo";
9
+ import { DXN } from "@dxos/keys";
10
+ import { useQueue } from "@dxos/react-client/echo";
11
+ import { StackItem } from "@dxos/react-ui-stack";
12
+
13
+ // packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx
14
+ import { intervalToDuration } from "date-fns/intervalToDuration";
15
+ import { yieldOrContinue } from "main-thread-scheduling";
16
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
+ import { useResizeDetector } from "react-resize-detector";
18
+ import { IconButton, useTranslation } from "@dxos/react-ui";
19
+ import { useAttention } from "@dxos/react-ui-attention";
20
+ import { Grid, toPlaneCellIndex } from "@dxos/react-ui-grid";
21
+ import { mx } from "@dxos/react-ui-theme";
22
+ var lineHeight = 20;
23
+ var cellSpacing = 8 + 2;
24
+ var timestampColumnWidth = 68;
25
+ var authorClasses = "font-medium text-base leading-[20px]";
26
+ var timestampClasses = "text-xs leading-[20px] text-description pie-0 tabular-nums";
27
+ var segmentTextClasses = "text-sm whitespace-normal hyphens-auto";
28
+ var measureClasses = mx(
29
+ // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)
30
+ "absolute inline-start-[69px] inline-end-0 invisible z-[-1] border",
31
+ "pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]",
32
+ segmentTextClasses
33
+ );
34
+ var rowDefault = {
35
+ grid: {
36
+ size: lineHeight + cellSpacing
37
+ }
38
+ };
39
+ var mapTranscriptQueue = (blocks) => {
40
+ if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {
41
+ return [];
42
+ } else {
43
+ return blocks.flatMap((block, blockIndex) => {
44
+ return [
45
+ [
46
+ blockIndex,
47
+ -1
48
+ ],
49
+ ...block.segments.map((segment, segmentIndex) => {
50
+ return [
51
+ blockIndex,
52
+ segmentIndex
53
+ ];
54
+ })
55
+ ];
56
+ });
57
+ }
58
+ };
59
+ var pad = (n = 0) => String(n).padStart(2, "0");
60
+ var formatTimestamp = (start, end) => {
61
+ const { hours, minutes, seconds } = intervalToDuration({
62
+ start,
63
+ end
64
+ });
65
+ return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
66
+ };
67
+ var measureRows = async (host, blocks, queueMap, signal) => {
68
+ const result = {
69
+ grid: {}
70
+ };
71
+ for (let row = 0; row < queueMap.length; row++) {
72
+ await yieldOrContinue("smooth", signal);
73
+ const [blockIndex, segmentIndex] = queueMap[row];
74
+ if (segmentIndex < 0) {
75
+ result.grid[row] = {
76
+ size: lineHeight + cellSpacing
77
+ };
78
+ } else {
79
+ host.textContent = blocks[blockIndex].segments[segmentIndex].text;
80
+ result.grid[row] = {
81
+ size: host.offsetHeight
82
+ };
83
+ }
84
+ }
85
+ return result;
86
+ };
87
+ var Transcript = ({ blocks, attendableId, ignoreAttention }) => {
88
+ const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
89
+ const { hasAttention } = useAttention(attendableId);
90
+ const [dxGrid, setDxGrid] = useState(null);
91
+ const [rows, setRows] = useState(void 0);
92
+ const [columns, setColumns] = useState(void 0);
93
+ const [autoScroll, setAutoScroll] = useState(true);
94
+ const queueMap = useMemo(() => mapTranscriptQueue(blocks), [
95
+ blocks
96
+ ]);
97
+ const handleWheel = useCallback((event) => {
98
+ setAutoScroll(false);
99
+ if (!ignoreAttention && !hasAttention) {
100
+ event.stopPropagation();
101
+ }
102
+ }, [
103
+ hasAttention,
104
+ ignoreAttention
105
+ ]);
106
+ const abortControllerRef = useRef();
107
+ const handleResize = useCallback(async ({ entry }) => {
108
+ if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {
109
+ abortControllerRef.current?.abort();
110
+ abortControllerRef.current = new AbortController();
111
+ setColumns({
112
+ grid: {
113
+ 0: {
114
+ size: timestampColumnWidth
115
+ },
116
+ 1: {
117
+ size: entry.target.offsetWidth
118
+ }
119
+ }
120
+ });
121
+ return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal).then(setRows).catch(() => {
122
+ });
123
+ }
124
+ }, [
125
+ blocks,
126
+ queueMap
127
+ ]);
128
+ const { width, ref: measureRef } = useResizeDetector({
129
+ onResize: handleResize,
130
+ refreshOptions: {
131
+ leading: true
132
+ }
133
+ });
134
+ useEffect(() => {
135
+ if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {
136
+ void handleResize({
137
+ entry: {
138
+ target: measureRef.current
139
+ }
140
+ }).then(() => {
141
+ if (autoScroll) {
142
+ setTimeout(() => dxGrid?.scrollToEndRow(), 50);
143
+ }
144
+ });
145
+ }
146
+ }, [
147
+ blocks,
148
+ queueMap,
149
+ width,
150
+ autoScroll
151
+ ]);
152
+ useEffect(() => {
153
+ if (dxGrid && Array.isArray(blocks) && blocks[0]) {
154
+ const transcriptStart = blocks[0].segments[0].started;
155
+ dxGrid.getCells = (range, plane) => {
156
+ switch (plane) {
157
+ case "grid": {
158
+ const cells = {};
159
+ for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {
160
+ const [blockIndex, segmentIndex] = queueMap[row];
161
+ cells[toPlaneCellIndex({
162
+ col: 0,
163
+ row
164
+ })] = {
165
+ readonly: true,
166
+ value: segmentIndex < 0 ? formatTimestamp(transcriptStart, blocks[blockIndex].segments[Math.max(0, segmentIndex)].started) : "",
167
+ className: timestampClasses
168
+ };
169
+ cells[toPlaneCellIndex({
170
+ col: 1,
171
+ row
172
+ })] = segmentIndex < 0 ? {
173
+ readonly: true,
174
+ accessoryHtml: `<span data-hue="${blocks[blockIndex].authorHue}" class="dx-text-hue">${blocks[blockIndex].authorName}</span>`,
175
+ className: authorClasses
176
+ } : {
177
+ readonly: true,
178
+ value: blocks[blockIndex].segments[segmentIndex].text,
179
+ className: segmentTextClasses
180
+ };
181
+ }
182
+ return cells;
183
+ }
184
+ default:
185
+ return {};
186
+ }
187
+ };
188
+ }
189
+ }, [
190
+ dxGrid,
191
+ blocks
192
+ ]);
193
+ const handleScrollToEnd = useCallback(() => {
194
+ setAutoScroll(true);
195
+ dxGrid?.scrollToEndRow();
196
+ }, [
197
+ dxGrid,
198
+ autoScroll
199
+ ]);
200
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid.Root, {
201
+ id: `${attendableId}--transcript`
202
+ }, /* @__PURE__ */ React.createElement(Grid.Content, {
203
+ limitColumns: 2,
204
+ limitRows: queueMap.length,
205
+ columns,
206
+ rows,
207
+ rowDefault,
208
+ onWheel: handleWheel,
209
+ 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",
210
+ ref: setDxGrid
211
+ })), /* @__PURE__ */ React.createElement("div", {
212
+ role: "none",
213
+ inert: "",
214
+ "aria-hidden": true,
215
+ className: measureClasses,
216
+ ref: measureRef
217
+ }), /* @__PURE__ */ React.createElement(IconButton, {
218
+ icon: "ph--arrow-line-down--regular",
219
+ iconOnly: true,
220
+ label: t("scroll to end label"),
221
+ tooltipSide: "left",
222
+ "data-state": autoScroll ? "invisible" : "visible",
223
+ classNames: [
224
+ "absolute inline-end-2 block-end-2 opacity-0 pointer-events-none",
225
+ 'data-[state="visible"]:pointer-events-auto data-[state="visible"]:opacity-100 transition-opacity'
226
+ ],
227
+ onClick: handleScrollToEnd
228
+ }));
229
+ };
230
+
231
+ // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
232
+ var TranscriptionContainer = ({ transcript, role }) => {
233
+ const attendableId = fullyQualifiedId(transcript);
234
+ const queue = useQueue(transcript.queue ? DXN.parse(transcript.queue) : void 0, {
235
+ pollInterval: 1e3
236
+ });
237
+ const Root = role === "article" ? StackItem.Content : Fragment;
238
+ const rootProps = role === "article" ? {
239
+ toolbar: false
240
+ } : {};
241
+ return /* @__PURE__ */ React2.createElement(Root, rootProps, /* @__PURE__ */ React2.createElement(Transcript, {
242
+ blocks: queue?.items,
243
+ attendableId
244
+ }));
245
+ };
246
+ var TranscriptContainer_default = TranscriptionContainer;
247
+
248
+ export {
249
+ Transcript,
250
+ TranscriptionContainer,
251
+ TranscriptContainer_default
252
+ };
253
+ //# sourceMappingURL=chunk-4A6BWPRB.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',\n '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 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 <>\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 </>\n );\n};\n"],
5
+ "mappings": "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",
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", "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", "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
+ }
@@ -1,7 +1,10 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ TRANSCRIPTION_PLUGIN
4
+ } from "./chunk-SB5TLXBU.mjs";
2
5
 
3
6
  // packages/plugins/experimental/plugin-transcription/src/types/schema.ts
4
- import { EchoObject, ObjectId, S, TypedObject } from "@dxos/echo-schema";
7
+ import { EchoObject, S, TypedObject } from "@dxos/echo-schema";
5
8
  var TranscriptSchema = S.Struct({
6
9
  name: S.String,
7
10
  // TODO(burdon): Use string for dates?
@@ -10,6 +13,7 @@ var TranscriptSchema = S.Struct({
10
13
  /**
11
14
  * Queue containing TranscriptBlock objects.
12
15
  */
16
+ // TODO(wittjosiah): Should be a ref to a queue.
13
17
  queue: S.optional(S.String)
14
18
  });
15
19
  var TranscriptType = class extends TypedObject({
@@ -26,52 +30,46 @@ var TranscriptSegment = S.Struct({
26
30
  text: S.String
27
31
  });
28
32
  var TranscriptBlock = S.Struct({
29
- id: ObjectId,
30
- author: S.optional(S.String),
33
+ id: S.String,
34
+ authorName: S.optional(S.String),
35
+ authorHue: S.optional(S.String),
31
36
  segments: S.Array(TranscriptSegment)
32
37
  }).pipe(EchoObject("dxos.org/type/TranscriptBlock", "0.1.0"));
33
38
 
34
39
  // packages/plugins/experimental/plugin-transcription/src/types/types.ts
35
40
  import { S as S2, isInstanceOf } from "@dxos/echo-schema";
36
41
  import { isReactiveObject } from "@dxos/react-client/echo";
37
-
38
- // packages/plugins/experimental/plugin-transcription/src/meta.ts
39
- var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
40
- var meta = {
41
- id: TRANSCRIPTION_PLUGIN,
42
- name: "Transcription",
43
- description: "Voice transcription.",
44
- icon: "ph--microphone--regular",
45
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription",
46
- tags: [
47
- "experimental"
48
- ],
49
- screenshots: []
50
- };
51
-
52
- // packages/plugins/experimental/plugin-transcription/src/types/types.ts
53
42
  var TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
54
43
  var TranscriptionAction;
55
44
  (function(TranscriptionAction2) {
56
45
  const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;
57
46
  class Create extends S2.TaggedClass()(`${TRANSCRIPTION_ACTION}/create`, {
58
47
  input: S2.Struct({
59
- name: S2.optional(S2.String)
48
+ name: S2.optional(S2.String),
49
+ // TODO(wittjosiah): SpaceId.
50
+ spaceId: S2.String
60
51
  }),
61
52
  output: S2.Struct({
62
- object: TranscriptSchema
53
+ object: TranscriptType
63
54
  })
64
55
  }) {
65
56
  }
66
57
  TranscriptionAction2.Create = Create;
58
+ class Summarize extends S2.TaggedClass()(`${TRANSCRIPTION_ACTION}/summarize`, {
59
+ input: S2.Struct({
60
+ transcript: TranscriptType,
61
+ context: S2.optional(S2.String)
62
+ }),
63
+ output: S2.String
64
+ }) {
65
+ }
66
+ TranscriptionAction2.Summarize = Summarize;
67
67
  })(TranscriptionAction || (TranscriptionAction = {}));
68
68
  var isTranscript = (object) => {
69
69
  return isReactiveObject(object) && isInstanceOf(TranscriptType, object);
70
70
  };
71
71
 
72
72
  export {
73
- TRANSCRIPTION_PLUGIN,
74
- meta,
75
73
  TranscriptSchema,
76
74
  TranscriptType,
77
75
  TranscriptBlock,
@@ -79,4 +77,4 @@ export {
79
77
  TranscriptionAction,
80
78
  isTranscript
81
79
  };
82
- //# sourceMappingURL=chunk-KEG3ME4O.mjs.map
80
+ //# sourceMappingURL=chunk-DLXORY7Y.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
+ }
@@ -2,9 +2,9 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
 
3
3
  // packages/plugins/experimental/plugin-transcription/src/components/index.ts
4
4
  import { lazy } from "react";
5
- var TranscriptContainer = lazy(() => import("./TranscriptContainer-DVBXQIQ4.mjs"));
5
+ var TranscriptContainer = lazy(() => import("./TranscriptContainer-MOWZQSEO.mjs"));
6
6
 
7
7
  export {
8
8
  TranscriptContainer
9
9
  };
10
- //# sourceMappingURL=chunk-WEZGRUG6.mjs.map
10
+ //# sourceMappingURL=chunk-NFPDIQYG.mjs.map
@@ -0,0 +1,21 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/experimental/plugin-transcription/src/meta.ts
4
+ var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
5
+ var meta = {
6
+ id: TRANSCRIPTION_PLUGIN,
7
+ name: "Transcription",
8
+ description: "Voice transcription.",
9
+ icon: "ph--microphone--regular",
10
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription",
11
+ tags: [
12
+ "experimental"
13
+ ],
14
+ screenshots: []
15
+ };
16
+
17
+ export {
18
+ TRANSCRIPTION_PLUGIN,
19
+ meta
20
+ };
21
+ //# sourceMappingURL=chunk-SB5TLXBU.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
+ }