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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs → TranscriptContainer-AVRMYKZ6.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
  3. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
  5. package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-AS364WZZ.mjs → chunk-TULUCFLG.mjs} +2 -2
  7. package/dist/lib/browser/chunk-UHGQC3QN.mjs +248 -0
  8. package/dist/lib/browser/chunk-UHGQC3QN.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
  10. package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
  12. package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +201 -359
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
  16. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs → react-surface-57TWNWTM.mjs} +15 -8
  19. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-57TWNWTM.mjs.map} +2 -2
  20. package/dist/lib/browser/types/index.mjs +2 -1
  21. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-4FSQUMPN.cjs} +8 -8
  22. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-4FSQUMPN.cjs.map} +2 -2
  23. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
  24. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-CNB7GPXB.cjs} +5 -5
  26. package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
  27. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
  28. package/dist/lib/node/chunk-H23VTCTT.cjs +275 -0
  29. package/dist/lib/node/chunk-H23VTCTT.cjs.map +7 -0
  30. package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
  31. package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
  33. package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
  34. package/dist/lib/node/index.cjs +219 -372
  35. package/dist/lib/node/index.cjs.map +4 -4
  36. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
  37. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
  38. package/dist/lib/node/meta.json +1 -1
  39. package/dist/lib/node/{react-surface-AGGGDOUC.cjs → react-surface-ZU56WM4L.cjs} +18 -12
  40. package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-ZU56WM4L.cjs.map} +2 -2
  41. package/dist/lib/node/types/index.cjs +8 -7
  42. package/dist/lib/node/types/index.cjs.map +2 -2
  43. package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs → TranscriptContainer-HHSAIFYL.mjs} +3 -3
  44. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
  45. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
  46. package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-CW7WZFAA.mjs} +2 -2
  47. package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
  48. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-RVYUMVX3.mjs +249 -0
  50. package/dist/lib/node-esm/chunk-RVYUMVX3.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
  52. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
  54. package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +201 -359
  56. package/dist/lib/node-esm/index.mjs.map +4 -4
  57. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
  58. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs → react-surface-BDGK2JO6.mjs} +15 -8
  61. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-BDGK2JO6.mjs.map} +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +2 -1
  63. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
  64. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  67. package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
  68. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  69. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  70. package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
  71. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  72. package/dist/types/src/components/index.d.ts +1 -0
  73. package/dist/types/src/components/index.d.ts.map +1 -1
  74. package/dist/types/src/components/transcription.stories.d.ts +3 -2
  75. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  76. package/dist/types/src/hooks/index.d.ts +0 -1
  77. package/dist/types/src/hooks/index.d.ts.map +1 -1
  78. package/dist/types/src/index.d.ts +1 -0
  79. package/dist/types/src/index.d.ts.map +1 -1
  80. package/dist/types/src/meta.d.ts +2 -9
  81. package/dist/types/src/meta.d.ts.map +1 -1
  82. package/dist/types/src/transcriber/index.d.ts +1 -0
  83. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  84. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
  85. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  86. package/dist/types/src/transcriber/summarize.d.ts +5 -0
  87. package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
  88. package/dist/types/src/transcription-manager.d.ts +39 -0
  89. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  90. package/dist/types/src/translations.d.ts +3 -6
  91. package/dist/types/src/translations.d.ts.map +1 -1
  92. package/dist/types/src/types/schema.d.ts +9 -15
  93. package/dist/types/src/types/schema.d.ts.map +1 -1
  94. package/dist/types/src/types/types.d.ts +13 -6
  95. package/dist/types/src/types/types.d.ts.map +1 -1
  96. package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
  97. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
  98. package/package.json +40 -37
  99. package/src/capabilities/app-graph-builder.ts +25 -2
  100. package/src/capabilities/intent-resolver.ts +24 -2
  101. package/src/capabilities/react-surface.tsx +2 -2
  102. package/src/components/Transcript/Transcript.stories.tsx +46 -27
  103. package/src/components/Transcript/Transcript.tsx +200 -49
  104. package/src/components/TranscriptContainer.tsx +12 -147
  105. package/src/components/transcription.stories.tsx +11 -13
  106. package/src/hooks/index.ts +0 -1
  107. package/src/index.ts +1 -0
  108. package/src/meta.ts +2 -2
  109. package/src/transcriber/index.ts +1 -0
  110. package/src/transcriber/media-stream-recorder.ts +4 -0
  111. package/src/transcriber/summarize.ts +77 -0
  112. package/src/transcription-manager.ts +183 -0
  113. package/src/translations.ts +1 -2
  114. package/src/types/schema.ts +5 -3
  115. package/src/types/types.ts +12 -2
  116. package/src/util/random-queue-dxn.ts +2 -2
  117. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
  118. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
  119. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
  120. package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
  121. package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
  123. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
  124. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
  125. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
  126. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
  127. package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
  128. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
  129. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
  130. package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
  131. package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
  132. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
  133. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +0 -7
  134. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
  135. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
  136. package/dist/lib/node-esm/chunk-36EQXBWR.mjs +0 -242
  137. package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
  139. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
  140. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
  141. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
  142. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
  143. package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
  144. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
  145. package/src/hooks/useIsSpeaking.ts +0 -77
  146. /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-AVRMYKZ6.mjs.map} +0 -0
  147. /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-TULUCFLG.mjs.map} +0 -0
  148. /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-CNB7GPXB.cjs.map} +0 -0
  149. /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-HHSAIFYL.mjs.map} +0 -0
  150. /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-CW7WZFAA.mjs.map} +0 -0
@@ -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-RVYUMVX3.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-HHSAIFYL.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
+ }
@@ -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-HHSAIFYL.mjs"));
6
6
 
7
7
  export {
8
8
  TranscriptContainer
9
9
  };
10
- //# sourceMappingURL=chunk-WEZGRUG6.mjs.map
10
+ //# sourceMappingURL=chunk-CW7WZFAA.mjs.map
@@ -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
+ }
@@ -0,0 +1,249 @@
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 pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]",
31
+ segmentTextClasses
32
+ );
33
+ var rowDefault = {
34
+ grid: {
35
+ size: lineHeight + cellSpacing
36
+ }
37
+ };
38
+ var mapTranscriptQueue = (blocks) => {
39
+ if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {
40
+ return [];
41
+ } else {
42
+ return blocks.flatMap((block, blockIndex) => {
43
+ return [
44
+ [
45
+ blockIndex,
46
+ -1
47
+ ],
48
+ ...block.segments.map((segment, segmentIndex) => {
49
+ return [
50
+ blockIndex,
51
+ segmentIndex
52
+ ];
53
+ })
54
+ ];
55
+ });
56
+ }
57
+ };
58
+ var pad = (n = 0) => String(n).padStart(2, "0");
59
+ var formatTimestamp = (start, end) => {
60
+ const { hours, minutes, seconds } = intervalToDuration({
61
+ start,
62
+ end
63
+ });
64
+ return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
65
+ };
66
+ var measureRows = async (host, blocks, queueMap, signal) => {
67
+ const result = {
68
+ grid: {}
69
+ };
70
+ for (let row = 0; row < queueMap.length; row++) {
71
+ await yieldOrContinue("smooth", signal);
72
+ const [blockIndex, segmentIndex] = queueMap[row];
73
+ if (segmentIndex < 0) {
74
+ result.grid[row] = {
75
+ size: lineHeight + cellSpacing
76
+ };
77
+ } else {
78
+ host.textContent = blocks[blockIndex].segments[segmentIndex].text;
79
+ result.grid[row] = {
80
+ size: host.offsetHeight
81
+ };
82
+ }
83
+ }
84
+ return result;
85
+ };
86
+ var Transcript = ({ blocks, attendableId, ignoreAttention }) => {
87
+ const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
88
+ const { hasAttention } = useAttention(attendableId);
89
+ const [dxGrid, setDxGrid] = useState(null);
90
+ const [rows, setRows] = useState(void 0);
91
+ const [columns, setColumns] = useState(void 0);
92
+ const [autoScroll, setAutoScroll] = useState(true);
93
+ const handleWheel = useCallback((event) => {
94
+ setAutoScroll(false);
95
+ if (!ignoreAttention && !hasAttention) {
96
+ event.stopPropagation();
97
+ }
98
+ }, [
99
+ hasAttention,
100
+ ignoreAttention
101
+ ]);
102
+ const queueMap = useMemo(() => mapTranscriptQueue(blocks), [
103
+ blocks
104
+ ]);
105
+ const abortControllerRef = useRef();
106
+ const handleResize = useCallback(async ({ entry }) => {
107
+ if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {
108
+ abortControllerRef.current?.abort();
109
+ abortControllerRef.current = new AbortController();
110
+ setColumns({
111
+ grid: {
112
+ 0: {
113
+ size: timestampColumnWidth
114
+ },
115
+ 1: {
116
+ size: entry.target.offsetWidth
117
+ }
118
+ }
119
+ });
120
+ return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal).then(setRows).catch(() => {
121
+ });
122
+ }
123
+ }, [
124
+ blocks,
125
+ queueMap
126
+ ]);
127
+ const { width, ref: measureRef } = useResizeDetector({
128
+ onResize: handleResize,
129
+ refreshOptions: {
130
+ leading: true
131
+ }
132
+ });
133
+ useEffect(() => {
134
+ if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {
135
+ void handleResize({
136
+ entry: {
137
+ target: measureRef.current
138
+ }
139
+ }).then(() => {
140
+ if (autoScroll) {
141
+ setTimeout(() => dxGrid?.scrollToEndRow(), 50);
142
+ }
143
+ });
144
+ }
145
+ }, [
146
+ blocks,
147
+ queueMap,
148
+ width,
149
+ autoScroll
150
+ ]);
151
+ useEffect(() => {
152
+ if (dxGrid && Array.isArray(blocks) && blocks[0]) {
153
+ const transcriptStart = blocks[0].segments[0].started;
154
+ dxGrid.getCells = (range, plane) => {
155
+ switch (plane) {
156
+ case "grid": {
157
+ const cells = {};
158
+ for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {
159
+ const [blockIndex, segmentIndex] = queueMap[row];
160
+ cells[toPlaneCellIndex({
161
+ col: 0,
162
+ row
163
+ })] = {
164
+ readonly: true,
165
+ value: segmentIndex < 0 ? formatTimestamp(transcriptStart, blocks[blockIndex].segments[Math.max(0, segmentIndex)].started) : "",
166
+ className: timestampClasses
167
+ };
168
+ cells[toPlaneCellIndex({
169
+ col: 1,
170
+ row
171
+ })] = segmentIndex < 0 ? {
172
+ readonly: true,
173
+ accessoryHtml: `<span data-hue="${blocks[blockIndex].authorHue}" class="dx-text-hue">${blocks[blockIndex].authorName}</span>`,
174
+ className: authorClasses
175
+ } : {
176
+ readonly: true,
177
+ value: blocks[blockIndex].segments[segmentIndex].text,
178
+ className: segmentTextClasses
179
+ };
180
+ }
181
+ return cells;
182
+ }
183
+ default:
184
+ return {};
185
+ }
186
+ };
187
+ }
188
+ }, [
189
+ dxGrid,
190
+ blocks
191
+ ]);
192
+ const handleScrollToEnd = useCallback(() => {
193
+ setAutoScroll(true);
194
+ dxGrid?.scrollToEndRow();
195
+ }, [
196
+ dxGrid,
197
+ autoScroll
198
+ ]);
199
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid.Root, {
200
+ id: `${attendableId}--transcript`
201
+ }, /* @__PURE__ */ React.createElement(Grid.Content, {
202
+ limitColumns: 2,
203
+ columns,
204
+ limitRows: queueMap.length,
205
+ rowDefault,
206
+ rows,
207
+ onWheel: handleWheel,
208
+ 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",
209
+ ref: setDxGrid
210
+ })), /* @__PURE__ */ React.createElement("div", {
211
+ role: "none",
212
+ inert: "",
213
+ "aria-hidden": true,
214
+ className: measureClasses,
215
+ ref: measureRef
216
+ }), /* @__PURE__ */ React.createElement(IconButton, {
217
+ icon: "ph--arrow-line-down--regular",
218
+ iconOnly: true,
219
+ label: t("scroll to end label"),
220
+ tooltipSide: "left",
221
+ "data-state": autoScroll ? "invisible" : "visible",
222
+ classNames: 'absolute inline-end-2 block-end-2 opacity-0 pointer-events-none data-[state="visible"]:pointer-events-auto data-[state="visible"]:opacity-100 transition-opacity',
223
+ onClick: handleScrollToEnd
224
+ }));
225
+ };
226
+
227
+ // packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
228
+ var TranscriptionContainer = ({ transcript, role }) => {
229
+ const attendableId = fullyQualifiedId(transcript);
230
+ const queue = useQueue(transcript.queue ? DXN.parse(transcript.queue) : void 0, {
231
+ pollInterval: 1e3
232
+ });
233
+ const Root = role === "article" ? StackItem.Content : Fragment;
234
+ const rootProps = role === "article" ? {
235
+ toolbar: false
236
+ } : {};
237
+ return /* @__PURE__ */ React2.createElement(Root, rootProps, /* @__PURE__ */ React2.createElement(Transcript, {
238
+ blocks: queue?.items,
239
+ attendableId
240
+ }));
241
+ };
242
+ var TranscriptContainer_default = TranscriptionContainer;
243
+
244
+ export {
245
+ Transcript,
246
+ TranscriptionContainer,
247
+ TranscriptContainer_default
248
+ };
249
+ //# sourceMappingURL=chunk-RVYUMVX3.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TranscriptContainer.tsx", "../../../src/components/Transcript/Transcript.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, Fragment } from 'react';\n\nimport { fullyQualifiedId } from '@dxos/client/echo';\nimport { DXN } from '@dxos/keys';\nimport { useQueue } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { Transcript } from './Transcript';\nimport { type TranscriptBlock, type TranscriptType } from '../types';\n\nexport const TranscriptionContainer: FC<{ transcript: TranscriptType; role: string }> = ({ transcript, role }) => {\n const attendableId = fullyQualifiedId(transcript);\n\n const queue = useQueue<TranscriptBlock>(transcript.queue ? DXN.parse(transcript.queue) : undefined, {\n pollInterval: 1_000,\n });\n\n const Root = role === 'article' ? StackItem.Content : Fragment;\n const rootProps = role === 'article' ? { toolbar: false } : {};\n\n return (\n <Root {...(rootProps as any)}>\n <Transcript blocks={queue?.items} attendableId={attendableId} />\n </Root>\n );\n};\n\nexport default TranscriptionContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\nimport { yieldOrContinue } from 'main-thread-scheduling';\nimport React, { type FC, useCallback, useEffect, useMemo, useRef, useState, type WheelEvent } from 'react';\nimport { type OnResizeCallback, useResizeDetector } from 'react-resize-detector';\n\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type DxGridCellValue,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlaneCells,\n Grid,\n toPlaneCellIndex,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { TRANSCRIPTION_PLUGIN } from '../../meta';\nimport { type TranscriptBlock } from '../../types';\n\n// TODO(burdon): Actions (e.g., mark, summarize, translate, label, delete).\n\nconst lineHeight = 20;\nconst cellSpacing = 8 + 2;\nconst timestampColumnWidth = 68;\n\nconst authorClasses = 'font-medium text-base leading-[20px]';\nconst timestampClasses = 'text-xs leading-[20px] text-description pie-0 tabular-nums';\nconst segmentTextClasses = 'text-sm whitespace-normal hyphens-auto';\nconst measureClasses = mx(\n // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)\n 'absolute inline-start-[69px] inline-end-0 invisible z-[-1] border pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]',\n segmentTextClasses,\n);\n\nexport type TranscriptProps = {\n blocks?: TranscriptBlock[];\n attendableId?: string;\n ignoreAttention?: boolean;\n};\n\nconst rowDefault = {\n grid: { size: lineHeight + cellSpacing },\n};\n\ntype QueueRows = [number, number][];\n\nconst mapTranscriptQueue = (blocks?: TranscriptBlock[]): QueueRows => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {\n return [];\n } else {\n return blocks.flatMap((block, blockIndex) => {\n return [\n [blockIndex, -1],\n ...block.segments.map((segment, segmentIndex) => {\n return [blockIndex, segmentIndex] as [number, number];\n }),\n ];\n });\n }\n};\n\nconst pad = (n = 0) => String(n).padStart(2, '0');\n\nconst formatTimestamp = (start: Date, end: Date) => {\n const { hours, minutes, seconds } = intervalToDuration({ start, end });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n};\n\nconst measureRows = async (\n host: HTMLDivElement,\n blocks: TranscriptBlock[],\n queueMap: QueueRows,\n signal: AbortSignal,\n) => {\n const result: DxGridAxisMeta = { grid: {} };\n for (let row = 0; row < queueMap.length; row++) {\n await yieldOrContinue('smooth', signal);\n const [blockIndex, segmentIndex] = queueMap[row];\n if (segmentIndex < 0) {\n result.grid[row] = { size: lineHeight + cellSpacing };\n } else {\n host.textContent = blocks[blockIndex]!.segments[segmentIndex]!.text;\n result.grid[row] = { size: host.offsetHeight };\n }\n }\n return result;\n};\n\nexport const Transcript: FC<TranscriptProps> = ({ blocks, attendableId, ignoreAttention }) => {\n const { t } = useTranslation(TRANSCRIPTION_PLUGIN);\n const { hasAttention } = useAttention(attendableId);\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [rows, setRows] = useState<DxGridAxisMeta | undefined>(undefined);\n const [columns, setColumns] = useState<DxGridAxisMeta | undefined>(undefined);\n const [autoScroll, setAutoScroll] = useState(true);\n\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n setAutoScroll(false);\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const queueMap = useMemo(() => mapTranscriptQueue(blocks), [blocks]);\n\n const abortControllerRef = useRef<AbortController>();\n\n const handleResize = useCallback(\n async ({ entry }: { entry: { target: HTMLDivElement } | null }) => {\n if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {\n abortControllerRef.current?.abort();\n abortControllerRef.current = new AbortController();\n setColumns({ grid: { 0: { size: timestampColumnWidth }, 1: { size: entry.target.offsetWidth } } });\n return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal)\n .then(setRows)\n .catch(() => {\n /* Aborted mid-measurement by new size. */\n });\n }\n },\n [blocks, queueMap],\n );\n\n const { width, ref: measureRef } = useResizeDetector({\n onResize: handleResize as OnResizeCallback,\n refreshOptions: { leading: true },\n });\n\n useEffect(() => {\n if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {\n void handleResize({ entry: { target: measureRef.current } }).then(() => {\n if (autoScroll) {\n // TODO(thure): Implement a deterministic way to do this when `rows` has fully settled and grid has a\n // new `maxPosBlock`.\n setTimeout(() => dxGrid?.scrollToEndRow(), 50);\n }\n });\n }\n }, [blocks, queueMap, width, autoScroll]);\n\n useEffect(() => {\n if (dxGrid && Array.isArray(blocks) && blocks[0]) {\n const transcriptStart = blocks[0]!.segments[0]!.started;\n dxGrid.getCells = (range, plane) => {\n switch (plane) {\n case 'grid': {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {\n const [blockIndex, segmentIndex] = queueMap[row];\n cells[toPlaneCellIndex({ col: 0, row })] = {\n readonly: true,\n value:\n segmentIndex < 0\n ? formatTimestamp(transcriptStart, blocks[blockIndex]!.segments[Math.max(0, segmentIndex)]!.started)\n : '',\n className: timestampClasses,\n } satisfies DxGridCellValue;\n cells[toPlaneCellIndex({ col: 1, row })] = (\n segmentIndex < 0\n ? {\n readonly: true,\n accessoryHtml: `<span data-hue=\"${blocks[blockIndex]!.authorHue}\" class=\"dx-text-hue\">${blocks[blockIndex]!.authorName}</span>`,\n className: authorClasses,\n }\n : {\n readonly: true,\n value: blocks[blockIndex]!.segments[segmentIndex]!.text,\n className: segmentTextClasses,\n }\n ) satisfies DxGridCellValue;\n }\n return cells;\n }\n default:\n return {};\n }\n };\n }\n }, [dxGrid, blocks]);\n\n const handleScrollToEnd = useCallback(() => {\n setAutoScroll(true);\n dxGrid?.scrollToEndRow();\n }, [dxGrid, autoScroll]);\n\n return (\n <>\n <Grid.Root id={`${attendableId}--transcript`}>\n <Grid.Content\n limitColumns={2}\n columns={columns}\n limitRows={queueMap.length}\n rowDefault={rowDefault}\n rows={rows}\n onWheel={handleWheel}\n className='[--dx-grid-base:var(--dx-baseSurface)] [--dx-grid-lines:var(--dx-baseSurface)] [&_.dx-grid]:min-bs-0 [&_.dx-grid]:min-is-0 [&_.dx-grid]:select-auto'\n ref={setDxGrid}\n />\n </Grid.Root>\n <div role='none' {...{ inert: '' }} aria-hidden className={measureClasses} ref={measureRef} />\n <IconButton\n icon='ph--arrow-line-down--regular'\n iconOnly\n label={t('scroll to end label')}\n tooltipSide='left'\n data-state={autoScroll ? 'invisible' : 'visible'}\n classNames='absolute inline-end-2 block-end-2 opacity-0 pointer-events-none data-[state=\"visible\"]:pointer-events-auto data-[state=\"visible\"]:opacity-100 transition-opacity'\n onClick={handleScrollToEnd}\n />\n </>\n );\n};\n"],
5
+ "mappings": "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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", "handleWheel", "useCallback", "event", "stopPropagation", "useMemo", "abortControllerRef", "useRef", "handleResize", "entry", "target", "current", "abort", "AbortController", "offsetWidth", "then", "catch", "width", "ref", "measureRef", "useResizeDetector", "onResize", "refreshOptions", "leading", "useEffect", "Object", "keys", "setTimeout", "scrollToEndRow", "transcriptStart", "started", "getCells", "range", "plane", "cells", "toPlaneCellIndex", "col", "readonly", "value", "Math", "max", "className", "accessoryHtml", "authorHue", "authorName", "handleScrollToEnd", "Grid", "Root", "id", "Content", "limitColumns", "limitRows", "onWheel", "div", "role", "inert", "aria-hidden", "IconButton", "icon", "iconOnly", "label", "tooltipSide", "data-state", "classNames", "onClick", "TranscriptionContainer", "transcript", "role", "attendableId", "fullyQualifiedId", "queue", "useQueue", "DXN", "parse", "undefined", "pollInterval", "Root", "StackItem", "Content", "Fragment", "rootProps", "toolbar", "React", "Transcript", "blocks", "items"]
7
+ }
@@ -0,0 +1,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
+ }