@dxos/plugin-transcription 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (232) hide show
  1. package/dist/lib/browser/TranscriptContainer-6EHKWVS4.mjs +12 -0
  2. package/dist/lib/browser/blueprint-definition-FTRNMLJZ.mjs +18 -0
  3. package/dist/lib/browser/blueprint-definition-FTRNMLJZ.mjs.map +7 -0
  4. package/dist/lib/browser/blueprints/index.mjs +9 -0
  5. package/dist/lib/browser/chunk-HOOPZ7EM.mjs +35 -0
  6. package/dist/lib/browser/chunk-HOOPZ7EM.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-7DR6HZEF.mjs → chunk-ICM7JRCO.mjs} +64 -98
  8. package/dist/lib/browser/chunk-ICM7JRCO.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  10. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-Q5OC3WVG.mjs +72 -0
  12. package/dist/lib/browser/chunk-Q5OC3WVG.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-535OJKFO.mjs → chunk-SYGEFDWO.mjs} +2 -2
  14. package/dist/lib/browser/{chunk-WH36ENNE.mjs → chunk-TKFU53OZ.mjs} +19 -25
  15. package/dist/lib/browser/chunk-TKFU53OZ.mjs.map +7 -0
  16. package/dist/lib/browser/{blueprint-definition-UAAJYVLZ.mjs → chunk-ZZF7ICVM.mjs} +31 -31
  17. package/dist/lib/browser/chunk-ZZF7ICVM.mjs.map +7 -0
  18. package/dist/lib/browser/index.mjs +59 -72
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/operation-resolver-ZUWTU7C5.mjs +22 -0
  22. package/dist/lib/browser/operation-resolver-ZUWTU7C5.mjs.map +7 -0
  23. package/dist/lib/browser/react-surface-ZXH5267I.mjs +34 -0
  24. package/dist/lib/browser/react-surface-ZXH5267I.mjs.map +7 -0
  25. package/dist/lib/browser/{transcriber-LWOLYQHC.mjs → transcriber-EZZTUCPE.mjs} +17 -13
  26. package/dist/lib/browser/transcriber-EZZTUCPE.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +7 -5
  28. package/dist/lib/node-esm/{TranscriptContainer-GRLDCESB.mjs → TranscriptContainer-5YT5W73I.mjs} +5 -4
  29. package/dist/lib/node-esm/TranscriptContainer-5YT5W73I.mjs.map +7 -0
  30. package/dist/lib/node-esm/blueprint-definition-IOX35YUX.mjs +19 -0
  31. package/dist/lib/node-esm/blueprint-definition-IOX35YUX.mjs.map +7 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs +10 -0
  33. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  34. package/dist/lib/node-esm/chunk-4BFY6P2D.mjs +73 -0
  35. package/dist/lib/node-esm/chunk-4BFY6P2D.mjs.map +7 -0
  36. package/dist/lib/node-esm/{chunk-K4AZOB5Y.mjs → chunk-BX2AB7S7.mjs} +64 -98
  37. package/dist/lib/node-esm/chunk-BX2AB7S7.mjs.map +7 -0
  38. package/dist/lib/node-esm/{blueprint-definition-Z3LTZ3ID.mjs → chunk-CWP22IHV.mjs} +31 -31
  39. package/dist/lib/node-esm/chunk-CWP22IHV.mjs.map +7 -0
  40. package/dist/lib/node-esm/{chunk-YFN4FJFK.mjs → chunk-EPC27WWV.mjs} +19 -25
  41. package/dist/lib/node-esm/chunk-EPC27WWV.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-Q6WD7L2J.mjs → chunk-GVAVEVZ6.mjs} +2 -2
  43. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  44. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-NVM2QUMX.mjs +37 -0
  46. package/dist/lib/node-esm/chunk-NVM2QUMX.mjs.map +7 -0
  47. package/dist/lib/node-esm/index.mjs +59 -72
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/operation-resolver-Z72B4H2Q.mjs +23 -0
  51. package/dist/lib/node-esm/operation-resolver-Z72B4H2Q.mjs.map +7 -0
  52. package/dist/lib/node-esm/react-surface-6GUBZX2V.mjs +35 -0
  53. package/dist/lib/node-esm/react-surface-6GUBZX2V.mjs.map +7 -0
  54. package/dist/lib/node-esm/{transcriber-UGB7ECX6.mjs → transcriber-RGW3YYT4.mjs} +17 -13
  55. package/dist/lib/node-esm/transcriber-RGW3YYT4.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +7 -5
  57. package/dist/types/src/TranscriptionPlugin.d.ts +2 -1
  58. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  59. package/dist/types/src/blueprints/index.d.ts +2 -0
  60. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  61. package/dist/types/src/blueprints/transcription-blueprint.d.ts +21 -0
  62. package/dist/types/src/blueprints/transcription-blueprint.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  64. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/index.d.ts +4 -5
  68. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/operation-handler/index.d.ts +3 -0
  70. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +5 -0
  72. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  74. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  76. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  78. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  80. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/transcriber/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/transcriber/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/transcriber/transcriber.d.ts +9 -0
  84. package/dist/types/src/capabilities/transcriber/transcriber.d.ts.map +1 -0
  85. package/dist/types/src/components/Transcript/Transcript.d.ts +5 -8
  86. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  87. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +4 -3
  88. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +9 -9
  90. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -1
  91. package/dist/types/src/components/Transcript/transcript-extension.d.ts +2 -2
  92. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
  93. package/dist/types/src/components/TranscriptContainer.d.ts +4 -6
  94. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  95. package/dist/types/src/components/index.d.ts +1 -1
  96. package/dist/types/src/components/index.d.ts.map +1 -1
  97. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +3 -3
  98. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +3 -3
  100. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/stories/TranscriptionStory.d.ts +2 -2
  102. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -1
  103. package/dist/types/src/functions/open.d.ts +1 -1
  104. package/dist/types/src/functions/summarize.d.ts +1 -1
  105. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +1 -1
  106. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
  107. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  108. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  109. package/dist/types/src/index.d.ts +1 -1
  110. package/dist/types/src/index.d.ts.map +1 -1
  111. package/dist/types/src/meta.d.ts +2 -2
  112. package/dist/types/src/meta.d.ts.map +1 -1
  113. package/dist/types/src/segments-normalization/message-normalizer.d.ts +5 -5
  114. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -1
  115. package/dist/types/src/segments-normalization/normalization.d.ts +502 -457
  116. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -1
  117. package/dist/types/src/segments-normalization/utils.d.ts +2 -2
  118. package/dist/types/src/segments-normalization/utils.d.ts.map +1 -1
  119. package/dist/types/src/testing/testing.d.ts +9 -9
  120. package/dist/types/src/testing/testing.d.ts.map +1 -1
  121. package/dist/types/src/transcriber/media-stream-recorder.d.ts +2 -2
  122. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  123. package/dist/types/src/transcriber/transcriber.d.ts +4 -4
  124. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  125. package/dist/types/src/transcriber/transcription-manager.d.ts +9 -6
  126. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  127. package/dist/types/src/types/TranscriptAction.d.ts +22 -20
  128. package/dist/types/src/types/TranscriptAction.d.ts.map +1 -1
  129. package/dist/types/src/types/capabilities.d.ts +18 -0
  130. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  131. package/dist/types/src/types/index.d.ts +2 -1
  132. package/dist/types/src/types/index.d.ts.map +1 -1
  133. package/dist/types/src/util/index.d.ts +1 -0
  134. package/dist/types/src/util/index.d.ts.map +1 -1
  135. package/dist/types/src/util/render-byline.d.ts +4 -0
  136. package/dist/types/src/util/render-byline.d.ts.map +1 -0
  137. package/dist/types/tsconfig.tsbuildinfo +1 -1
  138. package/package.json +83 -69
  139. package/src/TranscriptionPlugin.tsx +34 -58
  140. package/src/blueprints/index.ts +5 -0
  141. package/src/blueprints/transcription-blueprint.ts +25 -0
  142. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  143. package/src/capabilities/blueprint-definition/index.ts +7 -0
  144. package/src/capabilities/index.ts +4 -8
  145. package/src/capabilities/operation-handler/index.ts +7 -0
  146. package/src/capabilities/operation-handler/operation-handler.ts +25 -0
  147. package/src/capabilities/operation-resolver/index.ts +7 -0
  148. package/src/capabilities/operation-resolver/operation-resolver.ts +25 -0
  149. package/src/capabilities/react-surface/index.ts +7 -0
  150. package/src/capabilities/react-surface/react-surface.tsx +27 -0
  151. package/src/capabilities/transcriber/index.ts +7 -0
  152. package/src/capabilities/transcriber/transcriber.ts +85 -0
  153. package/src/components/Transcript/Transcript.stories.tsx +38 -37
  154. package/src/components/Transcript/Transcript.tsx +11 -38
  155. package/src/components/Transcript/deprecated/OldTranscript.tsx +2 -2
  156. package/src/components/Transcript/transcript-extension.ts +10 -6
  157. package/src/components/TranscriptContainer.tsx +15 -17
  158. package/src/components/stories/FileTranscription.stories.tsx +27 -31
  159. package/src/components/stories/KeyWordRecognition.stories.tsx +4 -4
  160. package/src/components/stories/MicrophoneTranscription.stories.tsx +47 -50
  161. package/src/components/stories/TranscriptionStory.tsx +7 -11
  162. package/src/functions/open.ts +6 -6
  163. package/src/hooks/useQueueModelAdapter.ts +1 -1
  164. package/src/hooks/useTranscriber.ts +8 -3
  165. package/src/hooks/useVoiceInput.ts +2 -2
  166. package/src/index.ts +1 -1
  167. package/src/meta.ts +2 -2
  168. package/src/model/model.test.ts +20 -14
  169. package/src/segments-normalization/message-normalizer.ts +18 -13
  170. package/src/segments-normalization/normalization.test.ts +5 -10
  171. package/src/segments-normalization/normalization.ts +6 -6
  172. package/src/segments-normalization/utils.ts +2 -2
  173. package/src/testing/testing.ts +28 -18
  174. package/src/transcriber/media-stream-recorder.ts +3 -3
  175. package/src/transcriber/transcriber.browser.test.ts +4 -4
  176. package/src/transcriber/transcriber.ts +6 -6
  177. package/src/transcriber/transcription-manager.ts +21 -15
  178. package/src/types/TranscriptAction.ts +21 -13
  179. package/src/{capabilities → types}/capabilities.ts +8 -8
  180. package/src/types/index.ts +2 -1
  181. package/src/util/index.ts +1 -0
  182. package/src/util/render-byline.ts +33 -0
  183. package/dist/lib/browser/TranscriptContainer-2GSL2XB5.mjs +0 -11
  184. package/dist/lib/browser/blueprint-definition-UAAJYVLZ.mjs.map +0 -7
  185. package/dist/lib/browser/chunk-3MKZ2MNQ.mjs +0 -16
  186. package/dist/lib/browser/chunk-3MKZ2MNQ.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-7DR6HZEF.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-VBUIO677.mjs +0 -29
  189. package/dist/lib/browser/chunk-VBUIO677.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-W7WKZTM4.mjs +0 -63
  191. package/dist/lib/browser/chunk-W7WKZTM4.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-WH36ENNE.mjs.map +0 -7
  193. package/dist/lib/browser/intent-resolver-ZTKTEAQX.mjs +0 -25
  194. package/dist/lib/browser/intent-resolver-ZTKTEAQX.mjs.map +0 -7
  195. package/dist/lib/browser/react-surface-KA32A72I.mjs +0 -34
  196. package/dist/lib/browser/react-surface-KA32A72I.mjs.map +0 -7
  197. package/dist/lib/browser/transcriber-LWOLYQHC.mjs.map +0 -7
  198. package/dist/lib/node-esm/blueprint-definition-Z3LTZ3ID.mjs.map +0 -7
  199. package/dist/lib/node-esm/chunk-K4AZOB5Y.mjs.map +0 -7
  200. package/dist/lib/node-esm/chunk-OLMSTF3M.mjs +0 -64
  201. package/dist/lib/node-esm/chunk-OLMSTF3M.mjs.map +0 -7
  202. package/dist/lib/node-esm/chunk-SWUVPFKR.mjs +0 -17
  203. package/dist/lib/node-esm/chunk-SWUVPFKR.mjs.map +0 -7
  204. package/dist/lib/node-esm/chunk-YFN4FJFK.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-YVNQN2J6.mjs +0 -30
  206. package/dist/lib/node-esm/chunk-YVNQN2J6.mjs.map +0 -7
  207. package/dist/lib/node-esm/intent-resolver-55WH2GY6.mjs +0 -26
  208. package/dist/lib/node-esm/intent-resolver-55WH2GY6.mjs.map +0 -7
  209. package/dist/lib/node-esm/react-surface-GU7LW2JO.mjs +0 -35
  210. package/dist/lib/node-esm/react-surface-GU7LW2JO.mjs.map +0 -7
  211. package/dist/lib/node-esm/transcriber-UGB7ECX6.mjs.map +0 -7
  212. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
  213. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  214. package/dist/types/src/capabilities/capabilities.d.ts +0 -17
  215. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  216. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  217. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  218. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  219. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  220. package/dist/types/src/capabilities/transcriber.d.ts +0 -8
  221. package/dist/types/src/capabilities/transcriber.d.ts.map +0 -1
  222. package/dist/types/src/types/Transcript.d.ts +0 -30
  223. package/dist/types/src/types/Transcript.d.ts.map +0 -1
  224. package/src/capabilities/blueprint-definition.ts +0 -31
  225. package/src/capabilities/intent-resolver.ts +0 -18
  226. package/src/capabilities/react-surface.tsx +0 -22
  227. package/src/capabilities/transcriber.ts +0 -77
  228. package/src/types/Transcript.ts +0 -44
  229. /package/dist/lib/browser/{TranscriptContainer-2GSL2XB5.mjs.map → TranscriptContainer-6EHKWVS4.mjs.map} +0 -0
  230. /package/dist/lib/{node-esm/TranscriptContainer-GRLDCESB.mjs.map → browser/blueprints/index.mjs.map} +0 -0
  231. /package/dist/lib/browser/{chunk-535OJKFO.mjs.map → chunk-SYGEFDWO.mjs.map} +0 -0
  232. /package/dist/lib/node-esm/{chunk-Q6WD7L2J.mjs.map → chunk-GVAVEVZ6.mjs.map} +0 -0
@@ -3,24 +3,22 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import type * as Types from 'effect/Types';
6
8
  import React, { type FC, useEffect, useMemo, useState } from 'react';
7
9
 
8
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
9
10
  import { withPluginManager } from '@dxos/app-framework/testing';
10
11
  import { Key } from '@dxos/echo';
11
12
  import { ClientPlugin } from '@dxos/plugin-client';
12
13
  import { PreviewPlugin } from '@dxos/plugin-preview';
13
- import { SpacePlugin } from '@dxos/plugin-space';
14
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
15
- import { ThemePlugin } from '@dxos/plugin-theme';
14
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
16
15
  import { faker } from '@dxos/random';
17
16
  import { useMembers, useSpace } from '@dxos/react-client/echo';
18
17
  import { IconButton, Toolbar } from '@dxos/react-ui';
19
18
  import { withTheme } from '@dxos/react-ui/testing';
20
19
  import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
21
- import { defaultTx } from '@dxos/react-ui-theme';
22
- import { DataType } from '@dxos/schema';
23
- import { Testing } from '@dxos/schema/testing';
20
+ import { TestSchema } from '@dxos/schema/testing';
21
+ import { type ContentBlock, type Message, Organization, Person } from '@dxos/types';
24
22
 
25
23
  import { useQueueModelAdapter } from '../../hooks';
26
24
  import { SerializationModel } from '../../model';
@@ -31,8 +29,9 @@ import {
31
29
  useTestTranscriptionQueueWithEntityExtraction,
32
30
  } from '../../testing';
33
31
  import { translations } from '../../translations';
32
+ import { renderByline } from '../../util';
34
33
 
35
- import { TranscriptView, type TranscriptViewProps, renderByline } from './Transcript';
34
+ import { TranscriptView, type TranscriptViewProps } from './Transcript';
36
35
 
37
36
  faker.seed(1);
38
37
 
@@ -45,10 +44,10 @@ const TranscriptContainer: FC<
45
44
  onRunningChange: (running: boolean) => void;
46
45
  onReset?: () => void;
47
46
  }
48
- > = ({ space, model, running, onRunningChange, onReset }) => {
47
+ > = ({ model, running, onRunningChange, onReset }) => {
49
48
  return (
50
49
  <div className='grid grid-rows-[1fr_40px] grow divide-y divide-separator'>
51
- <TranscriptView space={space} model={model} />
50
+ <TranscriptView model={model} />
52
51
  <div className='grid grid-cols-[1fr_16rem] overflow-hidden'>
53
52
  <div className='flex items-center'>
54
53
  <SyntaxHighlighter language='json' className='text-sm'>
@@ -68,7 +67,7 @@ const TranscriptContainer: FC<
68
67
  );
69
68
  };
70
69
 
71
- type StoryProps = { messages?: DataType.Message[] } & Pick<TranscriptViewProps, 'ignoreAttention' | 'attendableId'>;
70
+ type StoryProps = { messages?: Message.Message[] } & Pick<TranscriptViewProps, 'ignoreAttention' | 'attendableId'>;
72
71
 
73
72
  /**
74
73
  * Basic story mutates array of messages.
@@ -77,11 +76,12 @@ const BasicStory = ({ messages: initialMessages = [], ...props }: StoryProps) =>
77
76
  const [reset, setReset] = useState({});
78
77
  const builder = useMemo(() => new MessageBuilder(), []);
79
78
  const model = useMemo(
80
- () => new SerializationModel<DataType.Message>(renderByline([]), initialMessages),
79
+ () => new SerializationModel<Message.Message>(renderByline([]), initialMessages),
81
80
  [initialMessages, reset],
82
81
  );
83
82
  const [running, setRunning] = useState(true);
84
- const [currentMessage, setCurrentMessage] = useState<DataType.Message | null>(null);
83
+ // Use mutable type for local message building (not ECHO-managed).
84
+ const [currentMessage, setCurrentMessage] = useState<Types.Mutable<Message.Message> | null>(null);
85
85
  useEffect(() => {
86
86
  if (!running) {
87
87
  return;
@@ -102,7 +102,7 @@ const BasicStory = ({ messages: initialMessages = [], ...props }: StoryProps) =>
102
102
  return;
103
103
  }
104
104
 
105
- currentMessage.blocks.push(builder.createBlock());
105
+ (currentMessage.blocks as ContentBlock.Any[]).push(builder.createBlock());
106
106
  model.updateChunk(currentMessage);
107
107
  }, 3_000);
108
108
 
@@ -137,19 +137,12 @@ const QueueStory = ({
137
137
  }: StoryProps & { queueId: Key.ObjectId; onReset: () => void }) => {
138
138
  const [running, setRunning] = useState(true);
139
139
  const space = useSpace();
140
- const members = useMembers(space?.key).map((member) => member.identity);
140
+ const members = useMembers(space?.id).map((member) => member.identity);
141
141
  const queue = useTestTranscriptionQueue(space, queueId, running, 2_000);
142
142
  const model = useQueueModelAdapter(renderByline(members), queue, initialMessages);
143
143
 
144
144
  return (
145
- <TranscriptContainer
146
- space={space}
147
- model={model}
148
- running={running}
149
- onRunningChange={setRunning}
150
- onReset={onReset}
151
- {...props}
152
- />
145
+ <TranscriptContainer model={model} running={running} onRunningChange={setRunning} onReset={onReset} {...props} />
153
146
  );
154
147
  };
155
148
 
@@ -161,7 +154,7 @@ const EntityExtractionQueueStory = () => {
161
154
  const queue = useTestTranscriptionQueueWithEntityExtraction(space, undefined, running, 2_000);
162
155
  const model = useQueueModelAdapter(renderByline(members), queue, []);
163
156
 
164
- return <TranscriptContainer space={space} model={model} running={running} onRunningChange={setRunning} />;
157
+ return <TranscriptContainer model={model} running={running} onRunningChange={setRunning} />;
165
158
  };
166
159
 
167
160
  /**
@@ -183,20 +176,17 @@ const meta = {
183
176
  withTheme,
184
177
  withPluginManager({
185
178
  plugins: [
179
+ ...corePlugins(),
180
+ StorybookPlugin({}),
186
181
  ClientPlugin({
187
- types: [TestItem, Testing.DocumentType, DataType.Person, DataType.Organization],
188
- onClientInitialized: async ({ client }) => {
189
- await client.halo.createIdentity();
190
- },
182
+ types: [TestItem, TestSchema.DocumentType, Person.Person, Organization.Organization],
183
+ onClientInitialized: ({ client }) =>
184
+ Effect.gen(function* () {
185
+ yield* Effect.promise(() => client.halo.createIdentity());
186
+ }),
191
187
  }),
192
- SpacePlugin({}),
193
- IntentPlugin(),
194
- SettingsPlugin(),
195
188
 
196
- // UI
197
189
  PreviewPlugin(),
198
- ThemePlugin({ tx: defaultTx }),
199
- StorybookLayoutPlugin({}),
200
190
  ],
201
191
  }),
202
192
  ],
@@ -208,12 +198,23 @@ const meta = {
208
198
 
209
199
  export default meta;
210
200
 
211
- export const Default: StoryObj<typeof BasicStory> = {
212
- render: BasicStory,
201
+ // TODO(wittjosiah): ECHO objects don't work when passed via Storybook args.
202
+ const DefaultStory = (props: StoryProps) => {
203
+ const [messages, setMessages] = useState<Message.Message[]>([]);
204
+ useEffect(() => {
205
+ void Promise.all(Array.from({ length: 10 }, () => MessageBuilder.singleton.createMessage())).then(setMessages);
206
+ }, []);
207
+ if (messages.length === 0) {
208
+ return <div>Loading messages...</div>;
209
+ }
210
+ return <BasicStory {...props} messages={messages} />;
211
+ };
212
+
213
+ export const Default: StoryObj<typeof DefaultStory> = {
214
+ render: DefaultStory,
213
215
  args: {
214
216
  ignoreAttention: true,
215
217
  attendableId: 'story',
216
- messages: await Promise.all(Array.from({ length: 10 }, () => MessageBuilder.singleton.createMessage())),
217
218
  },
218
219
  };
219
220
 
@@ -4,58 +4,31 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { type Space } from '@dxos/react-client/echo';
8
- import { type Identity } from '@dxos/react-client/halo';
9
7
  import { type ThemedClassName, useThemeContext } from '@dxos/react-ui';
8
+ import { useTextEditor } from '@dxos/react-ui-editor';
9
+ import { type Message, type Transcript } from '@dxos/types';
10
10
  import {
11
11
  autoScroll,
12
12
  createBasicExtensions,
13
13
  createMarkdownExtensions,
14
14
  createThemeExtensions,
15
15
  decorateMarkdown,
16
+ editorSlots,
16
17
  preview,
17
- useTextEditor,
18
- } from '@dxos/react-ui-editor';
19
- import { mx } from '@dxos/react-ui-theme';
20
- import { type DataType } from '@dxos/schema';
18
+ } from '@dxos/ui-editor';
19
+ import { mx } from '@dxos/ui-theme';
21
20
  import { isTruthy } from '@dxos/util';
22
21
 
23
22
  import { type SerializationModel } from '../../model';
24
- import { type Transcript } from '../../types';
23
+ import { renderByline } from '../../util';
25
24
 
26
25
  import { transcript } from './transcript-extension';
27
26
 
28
- // TODO(thure): Move this?
29
- export const renderByline =
30
- (identities: Identity[]) =>
31
- (message: DataType.Message, index: number, debug = false): string[] => {
32
- if (message.sender.role === 'assistant') {
33
- // Start/stop block.
34
- return [message.blocks.find((block) => block._tag === 'transcript')?.text ?? '', ''];
35
- }
36
-
37
- // TODO(burdon): Use link/reference markup for users (with popover).
38
- // TODO(burdon): Color and avatar.
39
- const identity = identities.find((identity) => identity.did === message.sender.identityDid);
40
- const name =
41
- identity?.profile?.displayName ??
42
- message.sender.contact?.target?.fullName ??
43
- message.sender.name ??
44
- message.sender.email ??
45
- message.sender.identityDid;
46
- const blocks = message.blocks.filter((block) => block._tag === 'transcript');
47
- return [
48
- // TODO(thure): Use an XML tag with the bits needed here.
49
- `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ''),
50
- blocks.map((block) => block.text.trim()).join(' '),
51
- '',
52
- ];
53
- };
27
+ export { renderByline };
54
28
 
55
29
  export type TranscriptViewProps = ThemedClassName<{
56
- space?: Space;
57
30
  transcript?: Transcript.Transcript;
58
- model: SerializationModel<DataType.Message>;
31
+ model: SerializationModel<Message.Message>;
59
32
  // TODO(burdon): Are these still in use?
60
33
  attendableId?: string;
61
34
  ignoreAttention?: boolean;
@@ -64,14 +37,14 @@ export type TranscriptViewProps = ThemedClassName<{
64
37
  /**
65
38
  * Transcript component implemented using the editor.
66
39
  */
67
- export const TranscriptView = ({ classNames, space, transcript: object, model }: TranscriptViewProps) => {
40
+ export const TranscriptView = ({ classNames, transcript: object, model }: TranscriptViewProps) => {
68
41
  const { themeMode } = useThemeContext();
69
42
  const { parentRef } = useTextEditor(() => {
70
43
  return {
71
44
  extensions: [
72
45
  createBasicExtensions({ readOnly: true, lineWrapping: true, search: true }),
73
46
  createMarkdownExtensions(),
74
- createThemeExtensions({ themeMode }),
47
+ createThemeExtensions({ themeMode, slots: editorSlots }),
75
48
  decorateMarkdown(),
76
49
  preview(),
77
50
  transcript({
@@ -81,7 +54,7 @@ export const TranscriptView = ({ classNames, space, transcript: object, model }:
81
54
  autoScroll(),
82
55
  ].filter(isTruthy),
83
56
  };
84
- }, [space, model]);
57
+ }, [model]);
85
58
 
86
59
  return (
87
60
  <div
@@ -19,7 +19,7 @@ import {
19
19
  Grid,
20
20
  toPlaneCellIndex,
21
21
  } from '@dxos/react-ui-grid';
22
- import { mx } from '@dxos/react-ui-theme';
22
+ import { mx } from '@dxos/ui-theme';
23
23
 
24
24
  import { meta } from '../../../meta';
25
25
 
@@ -43,7 +43,7 @@ const TranscriptBlock = Schema.Struct({
43
43
  authorHue: Schema.optional(Schema.String), // TOOD(burdon): Remove.
44
44
  segments: Schema.Array(TranscriptSegment),
45
45
  }).pipe(
46
- Type.Obj({
46
+ Type.object({
47
47
  typename: 'dxos.org/type/TranscriptBlock',
48
48
  version: '0.1.0',
49
49
  }),
@@ -8,7 +8,7 @@ import { format } from 'date-fns/format';
8
8
  import { intervalToDuration } from 'date-fns/intervalToDuration';
9
9
 
10
10
  import { type CleanupFn, addEventListener, combine } from '@dxos/async';
11
- import { type DataType } from '@dxos/schema';
11
+ import { type Message } from '@dxos/types';
12
12
 
13
13
  import { DocumentAdapter, type SerializationModel } from '../../model';
14
14
 
@@ -16,7 +16,7 @@ import { DocumentAdapter, type SerializationModel } from '../../model';
16
16
  * Data structure that maps Chunks queue to lines with transcript state.
17
17
  */
18
18
  export type TranscriptOptions = {
19
- model: SerializationModel<DataType.Message>;
19
+ model: SerializationModel<Message.Message>;
20
20
  started?: Date;
21
21
  };
22
22
 
@@ -131,8 +131,12 @@ export const transcript = ({ model, started }: TranscriptOptions): Extension =>
131
131
  ),
132
132
 
133
133
  EditorView.theme({
134
+ '.cm-gutters': {
135
+ backgroundColor: 'var(--dx-baseSurface)',
136
+ },
134
137
  '.cm-timestamp-gutter': {
135
138
  width: '6rem',
139
+ paddingLeft: '0.5rem',
136
140
  paddingRight: '1rem',
137
141
  },
138
142
  '.cm-timestamp-gutter > .cm-gutterElement > div': {
@@ -156,11 +160,11 @@ class TimestampMarker extends GutterMarker {
156
160
  super();
157
161
  }
158
162
 
159
- override eq(other: this): boolean {
160
- return other._timestamp === this._timestamp;
163
+ override eq(other: this) {
164
+ return this._timestamp === other._timestamp;
161
165
  }
162
166
 
163
- override toDOM(view: EditorView): HTMLDivElement {
167
+ override toDOM(view: EditorView) {
164
168
  const el = document.createElement('div');
165
169
  el.className = 'text-sm text-subdued hover:bg-hoverSurface cursor-pointer';
166
170
  el.textContent = formatTimestamp(this._timestamp, this._started);
@@ -176,7 +180,7 @@ class TimestampMarker extends GutterMarker {
176
180
  }
177
181
  }
178
182
 
179
- const getStartTime = (started?: Date, message?: DataType.Message): Date | undefined => {
183
+ const getStartTime = (started?: Date, message?: Message.Message): Date | undefined => {
180
184
  if (started) {
181
185
  return started;
182
186
  }
@@ -4,32 +4,30 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { fullyQualifiedId, getSpace } from '@dxos/client/echo';
7
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
8
+ import { Obj } from '@dxos/echo';
8
9
  import { useMembers, useQueue } from '@dxos/react-client/echo';
9
- import { StackItem } from '@dxos/react-ui-stack';
10
- import { type DataType } from '@dxos/schema';
10
+ import { Layout } from '@dxos/react-ui-mosaic';
11
+ import { type Message, type Transcript } from '@dxos/types';
11
12
 
12
13
  import { useQueueModelAdapter } from '../hooks';
13
- import { type Transcript } from '../types';
14
+ import { renderByline } from '../util';
14
15
 
15
- import { TranscriptView, renderByline } from './Transcript';
16
+ import { TranscriptView } from './Transcript';
16
17
 
17
- export type TranscriptionContainerProps = {
18
- role: string;
19
- transcript: Transcript.Transcript;
20
- };
18
+ export type TranscriptionContainerProps = SurfaceComponentProps<Transcript.Transcript>;
21
19
 
22
- export const TranscriptionContainer = ({ transcript }: TranscriptionContainerProps) => {
23
- const attendableId = fullyQualifiedId(transcript);
24
- const space = getSpace(transcript);
25
- const members = useMembers(space?.key).map((member) => member.identity);
26
- const queue = useQueue<DataType.Message>(transcript.queue.dxn, { pollInterval: 1_000 });
20
+ export const TranscriptionContainer = ({ role, subject: transcript }: TranscriptionContainerProps) => {
21
+ const attendableId = Obj.getDXN(transcript).toString();
22
+ const db = Obj.getDatabase(transcript);
23
+ const members = useMembers(db?.spaceId).map((member) => member.identity);
24
+ const queue = useQueue<Message.Message>(transcript.queue.dxn, { pollInterval: 1_000 });
27
25
  const model = useQueueModelAdapter(renderByline(members), queue);
28
26
 
29
27
  return (
30
- <StackItem.Content>
31
- <TranscriptView attendableId={attendableId} space={space} model={model} transcript={transcript} />
32
- </StackItem.Content>
28
+ <Layout.Main role={role}>
29
+ <TranscriptView attendableId={attendableId} model={model} transcript={transcript} />
30
+ </Layout.Main>
33
31
  );
34
32
  };
35
33
 
@@ -3,33 +3,32 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
8
 
8
- import { Events, IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
9
+ import { Common } from '@dxos/app-framework';
9
10
  import { withPluginManager } from '@dxos/app-framework/testing';
10
11
  import { scheduleTask } from '@dxos/async';
11
12
  import { Context } from '@dxos/context';
12
13
  import { Obj } from '@dxos/echo';
13
14
  import { createQueueDXN } from '@dxos/echo/internal';
14
15
  import { MemoryQueue } from '@dxos/echo-db';
15
- import { FunctionExecutor, ServiceContainer } from '@dxos/functions';
16
+ import { FunctionExecutor, ServiceContainer } from '@dxos/functions-runtime';
16
17
  import { log } from '@dxos/log';
17
18
  import { ClientPlugin } from '@dxos/plugin-client';
18
19
  import { PreviewPlugin } from '@dxos/plugin-preview';
19
- import { SpacePlugin } from '@dxos/plugin-space';
20
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
21
- import { ThemePlugin } from '@dxos/plugin-theme';
20
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
22
21
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
23
- import { defaultTx } from '@dxos/react-ui-theme';
24
- import { DataType } from '@dxos/schema';
25
- import { Testing, seedTestData } from '@dxos/schema/testing';
22
+ import { TestSchema } from '@dxos/schema/testing';
23
+ import { type Actor, Message, Organization, Person } from '@dxos/types';
24
+ import { seedTestData } from '@dxos/types/testing';
26
25
 
27
26
  import { useAudioFile, useQueueModelAdapter, useTranscriber } from '../../hooks';
28
27
  import { MessageNormalizer, getActorId } from '../../segments-normalization';
29
28
  import { TestItem } from '../../testing';
30
- import { type MediaStreamRecorderParams, type TranscriberParams } from '../../transcriber';
29
+ import { type MediaStreamRecorderProps, type TranscriberProps } from '../../transcriber';
31
30
  import { TranscriptionPlugin } from '../../TranscriptionPlugin';
32
- import { renderByline } from '../Transcript';
31
+ import { renderByline } from '../../util';
33
32
 
34
33
  import { TranscriptionStory } from './TranscriptionStory';
35
34
  import { useIsSpeaking } from './useIsSpeaking';
@@ -45,12 +44,12 @@ const AudioFile = ({
45
44
  detectSpeaking?: boolean;
46
45
  normalizeSentences?: boolean;
47
46
  audioUrl: string;
48
- transcriberConfig?: TranscriberParams['config'];
49
- recorderConfig?: MediaStreamRecorderParams['config'];
47
+ transcriberConfig?: TranscriberProps['config'];
48
+ recorderConfig?: MediaStreamRecorderProps['config'];
50
49
  audioConstraints?: MediaTrackConstraints;
51
50
  }) => {
52
51
  const [running, setRunning] = useState(false);
53
- const actor: DataType.Actor = useMemo(() => ({ name: 'You' }), []);
52
+ const actor: Actor.Actor = useMemo(() => ({ name: 'You' }), []);
54
53
 
55
54
  // Audio.
56
55
  const { audio, track, stream } = useAudioFile(audioUrl, audioConstraints);
@@ -79,13 +78,13 @@ const AudioFile = ({
79
78
  // Transcriber.
80
79
  // TODO(dmaretskyi): Use space.queues.create() instead.
81
80
  const queueDxn = useMemo(() => createQueueDXN(), []);
82
- const queue = useMemo(() => new MemoryQueue<DataType.Message>(queueDxn), [queueDxn]);
81
+ const queue = useMemo(() => new MemoryQueue<Message.Message>(queueDxn), [queueDxn]);
83
82
 
84
83
  const model = useQueueModelAdapter(renderByline([]), queue);
85
- const handleSegments = useCallback<TranscriberParams['onSegments']>(
84
+ const handleSegments = useCallback<TranscriberProps['onSegments']>(
86
85
  async (blocks) => {
87
86
  void queue?.append([
88
- Obj.make(DataType.Message, {
87
+ Obj.make(Message.Message, {
89
88
  created: new Date().toISOString(),
90
89
  sender: actor,
91
90
  blocks,
@@ -188,29 +187,26 @@ const meta = {
188
187
  title: 'plugins/plugin-transcription/FileTranscription',
189
188
  decorators: [
190
189
  withTheme,
191
- withLayout({ container: 'column' }),
190
+ withLayout({ layout: 'column' }),
192
191
  withPluginManager({
193
192
  plugins: [
193
+ ...corePlugins(),
194
+ StorybookPlugin({}),
194
195
  ClientPlugin({
195
- types: [TestItem, DataType.Person, DataType.Organization, Testing.DocumentType],
196
- onClientInitialized: async ({ client }) => {
197
- await client.halo.createIdentity();
198
- await client.spaces.waitUntilReady();
199
- await client.spaces.default.waitUntilReady();
200
- await seedTestData(client.spaces.default);
201
- },
196
+ types: [TestItem, Person.Person, Organization.Organization, TestSchema.DocumentType],
197
+ onClientInitialized: ({ client }) =>
198
+ Effect.gen(function* () {
199
+ yield* Effect.promise(() => client.halo.createIdentity());
200
+ yield* Effect.promise(() => client.spaces.waitUntilReady());
201
+ yield* Effect.promise(() => client.spaces.default.waitUntilReady());
202
+ yield* Effect.promise(() => seedTestData(client.spaces.default));
203
+ }),
202
204
  }),
203
- SpacePlugin({}),
204
- IntentPlugin(),
205
205
 
206
- // UI
207
- ThemePlugin({ tx: defaultTx }),
208
- SettingsPlugin(),
209
206
  PreviewPlugin(),
210
207
  TranscriptionPlugin(),
211
- StorybookLayoutPlugin({}),
212
208
  ],
213
- fireEvents: [Events.SetupAppGraph],
209
+ fireEvents: [Common.ActivationEvent.SetupAppGraph],
214
210
  }),
215
211
  ],
216
212
  } satisfies Meta;
@@ -8,7 +8,7 @@ import React, { useEffect, useMemo, useState } from 'react';
8
8
  import { log } from '@dxos/log';
9
9
  import { Toolbar } from '@dxos/react-ui';
10
10
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
- import { mx } from '@dxos/react-ui-theme';
11
+ import { mx } from '@dxos/ui-theme';
12
12
 
13
13
  type Word = {
14
14
  text: string;
@@ -86,7 +86,7 @@ const DefaultStory = ({ keywords }: StoryProps) => {
86
86
  }, [running, recognition]);
87
87
 
88
88
  return (
89
- <div className={mx('flex flex-col gap-2 w-[30rem]')}>
89
+ <div className={mx('flex flex-col gap-2 is-[30rem]')}>
90
90
  <Toolbar.Root>
91
91
  <Toolbar.IconButton
92
92
  iconOnly
@@ -101,7 +101,7 @@ const DefaultStory = ({ keywords }: StoryProps) => {
101
101
  <span
102
102
  key={index}
103
103
  className={mx(
104
- 'px-3 py-1 m-2 rounded border',
104
+ 'pli-3 plb-1 m-2 rounded border',
105
105
  word.matched ? 'bg-red-200 text-red-800 border-red-300' : 'bg-gray-200 text-gray-600 border-gray-300',
106
106
  )}
107
107
  >
@@ -118,7 +118,7 @@ const DefaultStory = ({ keywords }: StoryProps) => {
118
118
  const meta = {
119
119
  title: 'plugins/plugin-transcription/KeyWordDetection',
120
120
  render: DefaultStory,
121
- decorators: [withTheme, withLayout({ container: 'column' })],
121
+ decorators: [withTheme, withLayout({ layout: 'column' })],
122
122
  } satisfies Meta<typeof DefaultStory>;
123
123
 
124
124
  export default meta;