@dxos/plugin-transcription 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc

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 (262) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs +54 -0
  4. package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs.map +7 -0
  5. package/dist/lib/neutral/TranscriptionPlugin.mjs +34 -0
  6. package/dist/lib/neutral/TranscriptionPlugin.mjs.map +7 -0
  7. package/dist/lib/neutral/TranscriptionPlugin.node.mjs +25 -0
  8. package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +7 -0
  9. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs +21 -0
  10. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs.map +7 -0
  11. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs +15 -0
  12. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs.map +7 -0
  13. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  14. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  15. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  16. package/dist/lib/{browser/chunk-NQQK7UZQ.mjs → neutral/chunk-2O3ONPRZ.mjs} +94 -40
  17. package/dist/lib/neutral/chunk-2O3ONPRZ.mjs.map +7 -0
  18. package/dist/lib/{browser/chunk-L4HW35L6.mjs → neutral/chunk-5FXU36PN.mjs} +19 -10
  19. package/dist/lib/neutral/chunk-5FXU36PN.mjs.map +7 -0
  20. package/dist/lib/neutral/chunk-GL4RS533.mjs +22 -0
  21. package/dist/lib/neutral/chunk-GL4RS533.mjs.map +7 -0
  22. package/dist/lib/{browser/index.mjs → neutral/chunk-ILSA3DU7.mjs} +32 -70
  23. package/dist/lib/neutral/chunk-ILSA3DU7.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-Y5EQAFFR.mjs +8 -0
  25. package/dist/lib/neutral/chunk-Y5EQAFFR.mjs.map +7 -0
  26. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-ZR4BH4QQ.mjs} +4 -5
  27. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs.map +7 -0
  28. package/dist/lib/{browser → neutral}/components/index.mjs +83 -18
  29. package/dist/lib/neutral/components/index.mjs.map +7 -0
  30. package/dist/lib/neutral/containers/index.mjs +9 -0
  31. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  32. package/dist/lib/{browser/create-ULR5DPJZ.mjs → neutral/create-RRWRIUSR.mjs} +4 -4
  33. package/dist/lib/neutral/create-RRWRIUSR.mjs.map +7 -0
  34. package/dist/lib/{browser → neutral}/hooks/index.mjs +5 -3
  35. package/dist/lib/neutral/index.mjs +44 -0
  36. package/dist/lib/neutral/meta.json +1 -0
  37. package/dist/lib/neutral/meta.mjs +8 -0
  38. package/dist/lib/{browser/open-SFMPLZVW.mjs → neutral/open-CVMX5KXZ.mjs} +5 -5
  39. package/dist/lib/neutral/open-CVMX5KXZ.mjs.map +7 -0
  40. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs +13 -0
  41. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs.map +7 -0
  42. package/dist/lib/neutral/operations/index.mjs +8 -0
  43. package/dist/lib/neutral/plugin.mjs +16 -0
  44. package/dist/lib/neutral/plugin.mjs.map +7 -0
  45. package/dist/lib/neutral/react-surface-YMZRO242.mjs +26 -0
  46. package/dist/lib/neutral/react-surface-YMZRO242.mjs.map +7 -0
  47. package/dist/lib/{browser/summarize-BDFX4APN.mjs → neutral/summarize-LA7TRW7A.mjs} +5 -5
  48. package/dist/lib/neutral/summarize-LA7TRW7A.mjs.map +7 -0
  49. package/dist/lib/neutral/text-content-F4ASMITB.mjs +30 -0
  50. package/dist/lib/neutral/text-content-F4ASMITB.mjs.map +7 -0
  51. package/dist/lib/neutral/transcriber-ABHATBVH.mjs +59 -0
  52. package/dist/lib/neutral/transcriber-ABHATBVH.mjs.map +7 -0
  53. package/dist/lib/neutral/translations.mjs +24 -0
  54. package/dist/lib/neutral/translations.mjs.map +7 -0
  55. package/dist/lib/neutral/types/index.mjs +10 -0
  56. package/dist/lib/neutral/types/index.mjs.map +7 -0
  57. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  58. package/dist/types/src/TranscriptionPlugin.node.d.ts.map +1 -1
  59. package/dist/types/src/TranscriptionPlugin.workerd.d.ts +4 -0
  60. package/dist/types/src/TranscriptionPlugin.workerd.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/index.d.ts +5 -1
  62. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/text-content.d.ts +8 -0
  64. package/dist/types/src/capabilities/text-content.d.ts.map +1 -0
  65. package/dist/types/src/components/Oracle/Oracle.d.ts +24 -0
  66. package/dist/types/src/components/Oracle/Oracle.d.ts.map +1 -0
  67. package/dist/types/src/components/Oracle/Oracle.stories.d.ts +32 -0
  68. package/dist/types/src/components/Oracle/Oracle.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Oracle/index.d.ts +2 -0
  70. package/dist/types/src/components/Oracle/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Transcription/Transcription.d.ts +0 -5
  72. package/dist/types/src/components/Transcription/Transcription.d.ts.map +1 -1
  73. package/dist/types/src/components/Transcription/Transcription.stories.d.ts +13 -16
  74. package/dist/types/src/components/Transcription/Transcription.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/index.d.ts +1 -0
  76. package/dist/types/src/components/index.d.ts.map +1 -1
  77. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts +6 -0
  78. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts.map +1 -0
  79. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts +28 -0
  80. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts.map +1 -0
  81. package/dist/types/src/containers/TranscriptionArticle/index.d.ts +2 -0
  82. package/dist/types/src/containers/TranscriptionArticle/index.d.ts.map +1 -0
  83. package/dist/types/src/containers/index.d.ts +1 -1
  84. package/dist/types/src/containers/index.d.ts.map +1 -1
  85. package/dist/types/src/enrichment/conversation.test.d.ts +2 -0
  86. package/dist/types/src/enrichment/conversation.test.d.ts.map +1 -0
  87. package/dist/types/src/enrichment/operations.d.ts +200 -0
  88. package/dist/types/src/enrichment/operations.d.ts.map +1 -0
  89. package/dist/types/src/enrichment/parser.d.ts +26 -0
  90. package/dist/types/src/enrichment/parser.d.ts.map +1 -0
  91. package/dist/types/src/enrichment/stream-simulator.d.ts +38 -0
  92. package/dist/types/src/enrichment/stream-simulator.d.ts.map +1 -0
  93. package/dist/types/src/hooks/index.d.ts +2 -1
  94. package/dist/types/src/hooks/index.d.ts.map +1 -1
  95. package/dist/types/src/hooks/useFeedModelAdapter.d.ts +12 -0
  96. package/dist/types/src/hooks/useFeedModelAdapter.d.ts.map +1 -0
  97. package/dist/types/src/hooks/useTranscriptionRecording.d.ts +12 -0
  98. package/dist/types/src/hooks/useTranscriptionRecording.d.ts.map +1 -0
  99. package/dist/types/src/index.d.ts +3 -4
  100. package/dist/types/src/index.d.ts.map +1 -1
  101. package/dist/types/src/normalization/message-normalizer.d.ts +7 -5
  102. package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -1
  103. package/dist/types/src/normalization/normalization.d.ts +180 -1
  104. package/dist/types/src/normalization/normalization.d.ts.map +1 -1
  105. package/dist/types/src/operations/create.d.ts +2 -2
  106. package/dist/types/src/operations/create.d.ts.map +1 -1
  107. package/dist/types/src/operations/index.d.ts +0 -1
  108. package/dist/types/src/operations/index.d.ts.map +1 -1
  109. package/dist/types/src/operations/open.d.ts +2 -2
  110. package/dist/types/src/operations/open.d.ts.map +1 -1
  111. package/dist/types/src/operations/summarize.d.ts +2 -2
  112. package/dist/types/src/operations/summarize.d.ts.map +1 -1
  113. package/dist/types/src/plugin.d.ts +4 -0
  114. package/dist/types/src/plugin.d.ts.map +1 -0
  115. package/dist/types/src/stories/FileTranscription.stories.d.ts +5 -3
  116. package/dist/types/src/stories/FileTranscription.stories.d.ts.map +1 -1
  117. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts.map +1 -1
  118. package/dist/types/src/stories/{MicrophoneTranscription.stories.d.ts → LiveTranscription.stories.d.ts} +4 -4
  119. package/dist/types/src/stories/LiveTranscription.stories.d.ts.map +1 -0
  120. package/dist/types/src/stories/TranscriptionStory.d.ts +11 -13
  121. package/dist/types/src/stories/TranscriptionStory.d.ts.map +1 -1
  122. package/dist/types/src/stories/common.d.ts +46 -0
  123. package/dist/types/src/stories/common.d.ts.map +1 -0
  124. package/dist/types/src/testing/testing.d.ts +5 -6
  125. package/dist/types/src/testing/testing.d.ts.map +1 -1
  126. package/dist/types/src/transcriber/transcriber.d.ts +4 -4
  127. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  128. package/dist/types/src/transcriber/transcription-manager.d.ts +6 -4
  129. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  130. package/dist/types/src/translations.d.ts +2 -0
  131. package/dist/types/src/translations.d.ts.map +1 -1
  132. package/dist/types/src/{operations/definitions.d.ts → types/TranscriptOperation.d.ts} +1 -1
  133. package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -0
  134. package/dist/types/src/types/TranscriptionCapabilities.d.ts +17 -0
  135. package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -0
  136. package/dist/types/src/types/index.d.ts +2 -2
  137. package/dist/types/src/types/index.d.ts.map +1 -1
  138. package/dist/types/tsconfig.tsbuildinfo +1 -1
  139. package/package.json +125 -94
  140. package/src/TranscriptionPlugin.node.ts +3 -31
  141. package/src/TranscriptionPlugin.test.ts +3 -3
  142. package/src/TranscriptionPlugin.tsx +3 -31
  143. package/src/TranscriptionPlugin.workerd.ts +18 -0
  144. package/src/blueprints/transcription-blueprint.ts +1 -1
  145. package/src/capabilities/index.ts +1 -0
  146. package/src/capabilities/react-surface.tsx +2 -2
  147. package/src/capabilities/text-content.ts +33 -0
  148. package/src/capabilities/transcriber.ts +1 -1
  149. package/src/components/Oracle/Oracle.stories.tsx +147 -0
  150. package/src/components/Oracle/Oracle.tsx +141 -0
  151. package/src/components/Oracle/index.ts +5 -0
  152. package/src/components/Transcription/Transcription.stories.tsx +116 -150
  153. package/src/components/Transcription/Transcription.tsx +7 -13
  154. package/src/components/index.ts +1 -0
  155. package/src/containers/TranscriptionArticle/TranscriptionArticle.stories.tsx +61 -0
  156. package/src/containers/TranscriptionArticle/TranscriptionArticle.tsx +62 -0
  157. package/src/containers/TranscriptionArticle/index.ts +5 -0
  158. package/src/containers/index.ts +1 -1
  159. package/src/enrichment/conversation.test.ts +162 -0
  160. package/src/enrichment/conversation.txt +23 -0
  161. package/src/enrichment/operations.ts +268 -0
  162. package/src/enrichment/parser.ts +101 -0
  163. package/src/enrichment/stream-simulator.ts +125 -0
  164. package/src/hooks/index.ts +2 -1
  165. package/src/hooks/useFeedModelAdapter.ts +46 -0
  166. package/src/hooks/useTranscriptionRecording.ts +87 -0
  167. package/src/index.ts +3 -9
  168. package/src/normalization/message-normalizer.ts +25 -13
  169. package/src/normalization/normalization.test.ts +3 -37
  170. package/src/normalization/normalization.ts +6 -7
  171. package/src/operations/create.ts +2 -2
  172. package/src/operations/index.ts +0 -2
  173. package/src/operations/open.ts +2 -2
  174. package/src/operations/summarize.ts +3 -3
  175. package/src/plugin.ts +11 -0
  176. package/src/stories/FileTranscription.stories.tsx +49 -175
  177. package/src/stories/KeyWordRecognition.stories.tsx +7 -9
  178. package/src/stories/LiveTranscription.stories.tsx +153 -0
  179. package/src/stories/TranscriptionStory.tsx +32 -24
  180. package/src/stories/common.ts +233 -0
  181. package/src/testing/testing.ts +20 -27
  182. package/src/transcriber/transcriber.test.ts +9 -9
  183. package/src/transcriber/transcriber.ts +18 -14
  184. package/src/transcriber/transcription-manager.ts +14 -9
  185. package/src/translations.ts +3 -0
  186. package/src/{operations/definitions.ts → types/TranscriptOperation.ts} +2 -0
  187. package/src/types/TranscriptionCapabilities.ts +39 -0
  188. package/src/types/index.ts +2 -2
  189. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-3L623EVL.mjs +0 -17
  191. package/dist/lib/browser/chunk-3L623EVL.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-L4HW35L6.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-NQQK7UZQ.mjs.map +0 -7
  194. package/dist/lib/browser/components/index.mjs.map +0 -7
  195. package/dist/lib/browser/create-ULR5DPJZ.mjs.map +0 -7
  196. package/dist/lib/browser/index.mjs.map +0 -7
  197. package/dist/lib/browser/meta.json +0 -1
  198. package/dist/lib/browser/open-SFMPLZVW.mjs.map +0 -7
  199. package/dist/lib/browser/operations/index.mjs +0 -13
  200. package/dist/lib/browser/operations/index.mjs.map +0 -7
  201. package/dist/lib/browser/summarize-BDFX4APN.mjs.map +0 -7
  202. package/dist/lib/browser/types/index.mjs +0 -10
  203. package/dist/lib/node-esm/blueprints/index.mjs +0 -32
  204. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-7UIZWCD4.mjs +0 -112
  206. package/dist/lib/node-esm/chunk-7UIZWCD4.mjs.map +0 -7
  207. package/dist/lib/node-esm/chunk-C3AE2NYJ.mjs +0 -181
  208. package/dist/lib/node-esm/chunk-C3AE2NYJ.mjs.map +0 -7
  209. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  210. package/dist/lib/node-esm/chunk-KO3IOD2O.mjs +0 -19
  211. package/dist/lib/node-esm/chunk-KO3IOD2O.mjs.map +0 -7
  212. package/dist/lib/node-esm/chunk-MQK4R6GT.mjs +0 -245
  213. package/dist/lib/node-esm/chunk-MQK4R6GT.mjs.map +0 -7
  214. package/dist/lib/node-esm/chunk-O533NBMK.mjs +0 -37
  215. package/dist/lib/node-esm/chunk-O533NBMK.mjs.map +0 -7
  216. package/dist/lib/node-esm/components/index.mjs +0 -208
  217. package/dist/lib/node-esm/components/index.mjs.map +0 -7
  218. package/dist/lib/node-esm/create-A5QHNWRF.mjs +0 -22
  219. package/dist/lib/node-esm/create-A5QHNWRF.mjs.map +0 -7
  220. package/dist/lib/node-esm/hooks/index.mjs +0 -18
  221. package/dist/lib/node-esm/index.mjs +0 -474
  222. package/dist/lib/node-esm/index.mjs.map +0 -7
  223. package/dist/lib/node-esm/meta.json +0 -1
  224. package/dist/lib/node-esm/open-OI24QNTO.mjs +0 -28
  225. package/dist/lib/node-esm/open-OI24QNTO.mjs.map +0 -7
  226. package/dist/lib/node-esm/operations/index.mjs +0 -14
  227. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  228. package/dist/lib/node-esm/summarize-3UNN24I2.mjs +0 -79
  229. package/dist/lib/node-esm/summarize-3UNN24I2.mjs.map +0 -7
  230. package/dist/lib/node-esm/types/index.mjs +0 -11
  231. package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts +0 -6
  232. package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts.map +0 -1
  233. package/dist/types/src/containers/TranscriptionContainer/index.d.ts +0 -2
  234. package/dist/types/src/containers/TranscriptionContainer/index.d.ts.map +0 -1
  235. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -8
  236. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
  237. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  238. package/dist/types/src/stories/MicrophoneTranscription.stories.d.ts.map +0 -1
  239. package/dist/types/src/stories/useIsSpeaking.d.ts +0 -3
  240. package/dist/types/src/stories/useIsSpeaking.d.ts.map +0 -1
  241. package/dist/types/src/types/capabilities.d.ts +0 -19
  242. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  243. package/dist/types/src/types/defs.d.ts +0 -5
  244. package/dist/types/src/types/defs.d.ts.map +0 -1
  245. package/src/containers/TranscriptionContainer/TranscriptionContainer.tsx +0 -35
  246. package/src/containers/TranscriptionContainer/index.ts +0 -5
  247. package/src/hooks/useQueueModelAdapter.ts +0 -66
  248. package/src/stories/MicrophoneTranscription.stories.tsx +0 -264
  249. package/src/stories/useIsSpeaking.tsx +0 -40
  250. package/src/types/capabilities.ts +0 -39
  251. package/src/types/defs.ts +0 -9
  252. /package/dist/lib/{browser/hooks → neutral/blueprints}/index.mjs.map +0 -0
  253. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  254. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
  255. /package/dist/lib/{browser → neutral}/chunk-KAEXRX3Y.mjs +0 -0
  256. /package/dist/lib/{browser → neutral}/chunk-KAEXRX3Y.mjs.map +0 -0
  257. /package/dist/lib/{browser → neutral}/chunk-MLRJWAQH.mjs +0 -0
  258. /package/dist/lib/{browser → neutral}/chunk-MLRJWAQH.mjs.map +0 -0
  259. /package/dist/lib/{browser/types → neutral/hooks}/index.mjs.map +0 -0
  260. /package/dist/lib/{node-esm/hooks → neutral}/index.mjs.map +0 -0
  261. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/meta.mjs.map} +0 -0
  262. /package/dist/lib/{node-esm/types → neutral/operations}/index.mjs.map +0 -0
@@ -2,9 +2,20 @@ import {
2
2
  __export
3
3
  } from "./chunk-J5LGTIGS.mjs";
4
4
 
5
- // src/operations/definitions.ts
6
- var definitions_exports = {};
7
- __export(definitions_exports, {
5
+ // src/types/TranscriptionCapabilities.ts
6
+ var TranscriptionCapabilities_exports = {};
7
+ __export(TranscriptionCapabilities_exports, {
8
+ Transcriber: () => Transcriber,
9
+ TranscriptionManager: () => TranscriptionManager
10
+ });
11
+ import { Capability } from "@dxos/app-framework";
12
+ import { meta } from "#meta";
13
+ var Transcriber = Capability.make(`${meta.id}.capability.transcriber`);
14
+ var TranscriptionManager = Capability.make(`${meta.id}.capability.transcription-manager`);
15
+
16
+ // src/types/TranscriptOperation.ts
17
+ var TranscriptOperation_exports = {};
18
+ __export(TranscriptOperation_exports, {
8
19
  Create: () => Create,
9
20
  MessageWithRangeId: () => MessageWithRangeId,
10
21
  Open: () => Open,
@@ -19,8 +30,8 @@ import { SpaceSchema } from "@dxos/client/echo";
19
30
  import { Operation } from "@dxos/compute";
20
31
  import { Database, Feed, Ref } from "@dxos/echo";
21
32
  import { Message, Transcript } from "@dxos/types";
22
- import { meta } from "#meta";
23
- var TRANSCRIPT_OPERATION = `${meta.id}.operation`;
33
+ import { meta as meta2 } from "#meta";
34
+ var TRANSCRIPT_OPERATION = `${meta2.id}.operation`;
24
35
  var Create = Operation.make({
25
36
  meta: {
26
37
  key: `${TRANSCRIPT_OPERATION}.create`,
@@ -103,9 +114,7 @@ var SentenceNormalization = Operation.make({
103
114
  });
104
115
 
105
116
  export {
106
- Create,
107
- Open,
108
- Summarize,
109
- definitions_exports
117
+ TranscriptionCapabilities_exports,
118
+ TranscriptOperation_exports
110
119
  };
111
- //# sourceMappingURL=chunk-L4HW35L6.mjs.map
120
+ //# sourceMappingURL=chunk-5FXU36PN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/TranscriptionCapabilities.ts", "../../../src/types/TranscriptOperation.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { Capability } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\nimport {\n type MediaStreamRecorderProps,\n type Transcriber as TranscriberType,\n type TranscriberProps,\n type TranscriptMessageEnricher,\n type TranscriptionManager as TranscriptionManagerType,\n} from '../transcriber';\n\nexport type GetTranscriberProps = {\n audioStreamTrack: MediaStreamTrack;\n recorderConfig?: Partial<MediaStreamRecorderProps['config']>;\n transcriberConfig?: Partial<TranscriberProps['config']>;\n onSegments: TranscriberProps['onSegments'];\n transcribe?: TranscriberProps['transcribe'];\n};\n\nexport type GetTranscriber = (props: GetTranscriberProps) => TranscriberType;\n\nexport type GetTranscriptionManagerProps = {\n messageEnricher?: TranscriptMessageEnricher;\n};\n\nexport type GetTranscriptionManager = (props: GetTranscriptionManagerProps) => TranscriptionManagerType;\n\nexport const Transcriber = Capability.make<GetTranscriber>(`${meta.id}.capability.transcriber`);\n\nexport const TranscriptionManager = Capability.make<GetTranscriptionManager>(\n `${meta.id}.capability.transcription-manager`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { AiService } from '@dxos/ai';\nimport { SpaceSchema } from '@dxos/client/echo';\nimport { Operation } from '@dxos/compute';\nimport { Database, Feed, Ref } from '@dxos/echo';\nimport { Message, Transcript } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nconst TRANSCRIPT_OPERATION = `${meta.id}.operation`;\n\nexport const Create = Operation.make({\n meta: { key: `${TRANSCRIPT_OPERATION}.create`, name: 'Create Transcript' },\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n space: SpaceSchema,\n }),\n output: Schema.Struct({\n object: Transcript.Transcript,\n }),\n});\n\nexport const MessageWithRangeId = Schema.extend(\n Message.Message,\n Schema.Struct({\n rangeId: Schema.optional(Schema.Array(Schema.String)).annotations({\n description: 'The IDs of the messages that contain the sentences.',\n }),\n }),\n);\n\nexport type MessageWithRangeIdType = Schema.Schema.Type<typeof MessageWithRangeId>;\n\nexport const Open = Operation.make({\n meta: {\n key: 'org.dxos.function.transcription.open',\n name: 'Open',\n description: 'Opens and reads the contents of a transcription object.',\n },\n input: Schema.Struct({\n transcript: Ref.Ref(Transcript.Transcript).annotations({\n description: 'The ID of the transcription object.',\n }),\n }),\n output: Schema.Struct({\n content: Schema.String,\n }),\n services: [Database.Service, Feed.FeedService],\n});\n\nexport const Summarize = Operation.make({\n meta: {\n key: 'org.dxos.function.transcription.summarize',\n name: 'Summarize',\n description: 'Summarize a transcript of a meeting.',\n },\n input: Schema.Struct({\n transcript: Schema.String.annotations({\n description: 'The transcript of the meeting.',\n }),\n notes: Schema.optional(Schema.String).annotations({\n description: 'Additional notes from the participants.',\n }),\n }),\n output: Schema.Struct({\n summary: Schema.String.annotations({\n description: 'The summary of the transcript.',\n }),\n }),\n services: [AiService.AiService],\n});\n\nexport const SentenceNormalizationInput = Schema.Struct({\n messages: Schema.Array(MessageWithRangeId).annotations({\n description: 'Messages to normalize into sentences.',\n }),\n});\n\nexport type SentenceNormalizationInputType = Schema.Schema.Type<typeof SentenceNormalizationInput>;\n\nexport const SentenceNormalizationOutput = Schema.Struct({\n sentences: Schema.Array(MessageWithRangeId.pipe(Schema.mutable)).pipe(Schema.mutable).annotations({\n description: 'The sentences of the transcript.',\n }),\n});\n\nexport const SentenceNormalization = Operation.make({\n meta: {\n key: 'org.dxos.function.transcription.sentence-normalization',\n name: 'Sentence Normalization',\n description: 'Post process of transcription for sentence normalization',\n },\n input: SentenceNormalizationInput,\n output: SentenceNormalizationOutput,\n services: [],\n});\n"],
5
+ "mappings": ";;;;;AAAA;;;;;AAMA,SAASA,kBAAkB;AAE3B,SAASC,YAAY;AA0Bd,IAAMC,cAAcF,WAAWG,KAAqB,GAAGF,KAAKG,EAAE,yBAAyB;AAEvF,IAAMC,uBAAuBL,WAAWG,KAC7C,GAAGF,KAAKG,EAAE,mCAAmC;;;ACrC/C;;;;;;;;;;AAMA,YAAYE,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,mBAAmB;AAC5B,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,MAAMC,WAAW;AACpC,SAASC,SAASC,kBAAkB;AAEpC,SAASC,QAAAA,aAAY;AAErB,IAAMC,uBAAuB,GAAGD,MAAKE,EAAE;AAEhC,IAAMC,SAAST,UAAUU,KAAK;EACnCJ,MAAM;IAAEK,KAAK,GAAGJ,oBAAAA;IAA+BK,MAAM;EAAoB;EACzEC,OAAcC,cAAO;IACnBF,MAAaG,gBAAgBC,aAAM;IACnCC,OAAOlB;EACT,CAAA;EACAmB,QAAeJ,cAAO;IACpBK,QAAQd,WAAWA;EACrB,CAAA;AACF,CAAA;AAEO,IAAMe,qBAA4BC,cACvCjB,QAAQA,SACDU,cAAO;EACZQ,SAAgBP,gBAAgBQ,aAAaP,aAAM,CAAA,EAAGQ,YAAY;IAChEC,aAAa;EACf,CAAA;AACF,CAAA,CAAA;AAKK,IAAMC,OAAO1B,UAAUU,KAAK;EACjCJ,MAAM;IACJK,KAAK;IACLC,MAAM;IACNa,aAAa;EACf;EACAZ,OAAcC,cAAO;IACnBa,YAAYxB,IAAIA,IAAIE,WAAWA,UAAU,EAAEmB,YAAY;MACrDC,aAAa;IACf,CAAA;EACF,CAAA;EACAP,QAAeJ,cAAO;IACpBc,SAAgBZ;EAClB,CAAA;EACAa,UAAU;IAAC5B,SAAS6B;IAAS5B,KAAK6B;;AACpC,CAAA;AAEO,IAAMC,YAAYhC,UAAUU,KAAK;EACtCJ,MAAM;IACJK,KAAK;IACLC,MAAM;IACNa,aAAa;EACf;EACAZ,OAAcC,cAAO;IACnBa,YAAmBX,cAAOQ,YAAY;MACpCC,aAAa;IACf,CAAA;IACAQ,OAAclB,gBAAgBC,aAAM,EAAEQ,YAAY;MAChDC,aAAa;IACf,CAAA;EACF,CAAA;EACAP,QAAeJ,cAAO;IACpBoB,SAAgBlB,cAAOQ,YAAY;MACjCC,aAAa;IACf,CAAA;EACF,CAAA;EACAI,UAAU;IAAC/B,UAAUA;;AACvB,CAAA;AAEO,IAAMqC,6BAAoCrB,cAAO;EACtDsB,UAAiBb,aAAMH,kBAAAA,EAAoBI,YAAY;IACrDC,aAAa;EACf,CAAA;AACF,CAAA;AAIO,IAAMY,8BAAqCvB,cAAO;EACvDwB,WAAkBf,aAAMH,mBAAmBmB,KAAYC,cAAO,CAAA,EAAGD,KAAYC,cAAO,EAAEhB,YAAY;IAChGC,aAAa;EACf,CAAA;AACF,CAAA;AAEO,IAAMgB,wBAAwBzC,UAAUU,KAAK;EAClDJ,MAAM;IACJK,KAAK;IACLC,MAAM;IACNa,aAAa;EACf;EACAZ,OAAOsB;EACPjB,QAAQmB;EACRR,UAAU,CAAA;AACZ,CAAA;",
6
+ "names": ["Capability", "meta", "Transcriber", "make", "id", "TranscriptionManager", "Schema", "AiService", "SpaceSchema", "Operation", "Database", "Feed", "Ref", "Message", "Transcript", "meta", "TRANSCRIPT_OPERATION", "id", "Create", "make", "key", "name", "input", "Struct", "optional", "String", "space", "output", "object", "MessageWithRangeId", "extend", "rangeId", "Array", "annotations", "description", "Open", "transcript", "content", "services", "Service", "FeedService", "Summarize", "notes", "summary", "SentenceNormalizationInput", "messages", "SentenceNormalizationOutput", "sentences", "pipe", "mutable", "SentenceNormalization"]
7
+ }
@@ -0,0 +1,22 @@
1
+ // src/meta.ts
2
+ import { trim } from "@dxos/util";
3
+ var meta = {
4
+ id: "org.dxos.plugin.transcription",
5
+ name: "Transcription",
6
+ description: trim`
7
+ Real-time voice-to-text transcription service for capturing spoken content.
8
+ Convert audio input into searchable text that integrates seamlessly with notes and documents.
9
+ `,
10
+ icon: "ph--microphone--regular",
11
+ iconHue: "sky",
12
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-transcription",
13
+ tags: [
14
+ "labs"
15
+ ],
16
+ screenshots: []
17
+ };
18
+
19
+ export {
20
+ meta
21
+ };
22
+ //# sourceMappingURL=chunk-GL4RS533.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 Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'org.dxos.plugin.transcription',\n name: 'Transcription',\n description: trim`\n Real-time voice-to-text transcription service for capturing spoken content.\n Convert audio input into searchable text that integrates seamlessly with notes and documents.\n `,\n icon: 'ph--microphone--regular',\n iconHue: 'sky',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-transcription',\n tags: ['labs'],\n screenshots: [],\n};\n"],
5
+ "mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaJ;;;;EAIbK,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa,CAAA;AACf;",
6
+ "names": ["trim", "meta", "id", "name", "description", "icon", "iconHue", "source", "tags", "screenshots"]
7
+ }
@@ -1,39 +1,6 @@
1
- import {
2
- useAudioFile,
3
- useAudioTrack,
4
- useQueueModelAdapter,
5
- useTranscriber,
6
- useVoiceInput
7
- } from "./chunk-NQQK7UZQ.mjs";
8
- import "./chunk-MLRJWAQH.mjs";
9
- import {
10
- TranscriptionCapabilities
11
- } from "./chunk-3L623EVL.mjs";
12
1
  import {
13
2
  mergeFloat64Arrays
14
3
  } from "./chunk-KAEXRX3Y.mjs";
15
- import "./chunk-J5LGTIGS.mjs";
16
-
17
- // src/index.ts
18
- import { Plugin } from "@dxos/app-framework";
19
-
20
- // src/meta.ts
21
- import { trim } from "@dxos/util";
22
- var meta = {
23
- id: "org.dxos.plugin.transcription",
24
- name: "Transcription",
25
- description: trim`
26
- Real-time voice-to-text transcription service for capturing spoken content.
27
- Convert audio input into searchable text that integrates seamlessly with notes and documents.
28
- `,
29
- icon: "ph--microphone--regular",
30
- iconHue: "sky",
31
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-transcription",
32
- tags: [
33
- "labs"
34
- ],
35
- screenshots: []
36
- };
37
4
 
38
5
  // src/transcriber/media-stream-recorder.ts
39
6
  import { MediaRecorder, register } from "extendable-media-recorder";
@@ -145,7 +112,6 @@ import { DeferredTask, Trigger } from "@dxos/async";
145
112
  import { LifecycleState, Resource } from "@dxos/context";
146
113
  import { log as log2 } from "@dxos/log";
147
114
  import { trace as trace2 } from "@dxos/tracing";
148
- import { TRANSCRIPTION_URL } from "#types";
149
115
  var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/transcriber/transcriber.ts";
150
116
  function _ts_decorate2(decorators, target, key, desc) {
151
117
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -153,9 +119,10 @@ function _ts_decorate2(decorators, target, key, desc) {
153
119
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
154
120
  return c > 3 && r && Object.defineProperty(target, key, r), r;
155
121
  }
122
+ var DEFAULT_TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
156
123
  var Transcriber = class extends Resource {
157
124
  _audioChunks = [];
158
- _lastUsedTimestamp = 0;
125
+ _lastTimestamp = 0;
159
126
  _openTrigger = new Trigger({
160
127
  autoReset: true
161
128
  });
@@ -173,20 +140,20 @@ var Transcriber = class extends Resource {
173
140
  this._transcribeFn = transcribe;
174
141
  }
175
142
  async _open(ctx) {
176
- log2.info("opening", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 41, S: this });
143
+ log2.info("opening", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 43, S: this });
177
144
  this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
178
145
  await this._recorder.start();
179
146
  this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
180
147
  this._openTrigger.wake();
181
148
  }
182
149
  async _close() {
183
- log2.info("closing", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 48, S: this });
150
+ log2.info("closing", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 50, S: this });
184
151
  this._recording = false;
185
152
  this._transcribeTask = void 0;
186
153
  await this._recorder.stop();
187
154
  }
188
155
  startChunksRecording() {
189
- log2.info("starting", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 54, S: this });
156
+ log2.info("starting", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 56, S: this });
190
157
  if (this._lifecycleState !== LifecycleState.OPEN) {
191
158
  return;
192
159
  }
@@ -198,12 +165,12 @@ var Transcriber = class extends Resource {
198
165
  }
199
166
  this._recording = false;
200
167
  this._transcribeTask?.schedule();
201
- log2.info("stopped", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 66, S: this });
168
+ log2.info("stopped", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 68, S: this });
202
169
  }
203
170
  _saveAudioChunk(chunk) {
204
171
  log2("saving audio chunk", {
205
172
  chunk
206
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 69, S: this });
173
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 71, S: this });
207
174
  this._audioChunks.push(chunk);
208
175
  if (!this._recording && (!this._transcribeTask || !this._transcribeTask.scheduled) && this._audioChunks.length >= this._config.prefixBufferChunksAmount) {
209
176
  this._audioChunks = this._dropOldChunks();
@@ -214,7 +181,7 @@ var Transcriber = class extends Resource {
214
181
  async _transcribe() {
215
182
  log2("transcribing", {
216
183
  chunks: this._audioChunks.length
217
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
184
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 83, S: this });
218
185
  const chunks = this._audioChunks;
219
186
  this._audioChunks = this._dropOldChunks();
220
187
  if (chunks.length === 0) {
@@ -247,7 +214,7 @@ var Transcriber = class extends Resource {
247
214
  if (this._transcribeFn) {
248
215
  segments = await this._transcribeFn(audio);
249
216
  } else {
250
- const endpoint = this._config.endpoint ?? TRANSCRIPTION_URL;
217
+ const endpoint = this._config.endpoint ?? DEFAULT_TRANSCRIPTION_URL;
251
218
  const response = await fetch(`${endpoint}/transcribe`, {
252
219
  method: "POST",
253
220
  body: JSON.stringify({
@@ -267,13 +234,13 @@ var Transcriber = class extends Resource {
267
234
  }
268
235
  log2.info("transcription response", {
269
236
  segments: segments.length
270
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 134, S: this });
237
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 137, S: this });
271
238
  return segments;
272
239
  }
273
240
  _alignSegments(segments, originalChunks) {
274
- const result = alignWhisperSegments(segments, originalChunks, this._lastUsedTimestamp);
275
- if (result.lastUsedTimestamp !== void 0) {
276
- this._lastUsedTimestamp = result.lastUsedTimestamp;
241
+ const result = alignWhisperSegments(segments, originalChunks, this._lastTimestamp);
242
+ if (result.lastTimestamp !== void 0) {
243
+ this._lastTimestamp = result.lastTimestamp;
277
244
  }
278
245
  return result.transcripts;
279
246
  }
@@ -288,15 +255,15 @@ _ts_decorate2([
288
255
  showInBrowserTimeline: true
289
256
  })
290
257
  ], Transcriber.prototype, "_fetchTranscription", null);
291
- var alignWhisperSegments = (segments, originalChunks, lastUsedTimestamp) => {
258
+ var alignWhisperSegments = (segments, originalChunks, lastTimestamp) => {
292
259
  if (originalChunks.length === 0) {
293
260
  return {
294
261
  transcripts: []
295
262
  };
296
263
  }
297
264
  const zeroTimestamp = originalChunks[0].timestamp;
298
- const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= lastUsedTimestamp).map((segment) => {
299
- const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= lastUsedTimestamp);
265
+ const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= lastTimestamp).map((segment) => {
266
+ const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= lastTimestamp);
300
267
  return {
301
268
  ...segment,
302
269
  words,
@@ -310,20 +277,23 @@ var alignWhisperSegments = (segments, originalChunks, lastUsedTimestamp) => {
310
277
  };
311
278
  }
312
279
  return {
280
+ lastTimestamp: zeroTimestamp + filteredSegments.at(-1).end * 1e3,
313
281
  transcripts: filteredSegments.map((segment) => ({
314
282
  _tag: "transcript",
315
283
  started: new Date(zeroTimestamp + segment.start * 1e3).toISOString(),
316
284
  text: segment.text.trim()
317
- })),
318
- lastUsedTimestamp: zeroTimestamp + filteredSegments.at(-1).end * 1e3
285
+ }))
319
286
  };
320
287
  };
321
288
 
322
289
  // src/transcriber/transcription-manager.ts
323
290
  import { Atom } from "@effect-atom/atom-react";
291
+ import * as Effect from "effect/Effect";
324
292
  import { synchronized as synchronized2 } from "@dxos/async";
293
+ import { createFeedServiceLayer } from "@dxos/client/echo";
325
294
  import { Resource as Resource2 } from "@dxos/context";
326
- import { Obj } from "@dxos/echo";
295
+ import { Feed, Obj } from "@dxos/echo";
296
+ import { runAndForwardErrors } from "@dxos/effect";
327
297
  import { Message } from "@dxos/types";
328
298
  function _ts_decorate3(decorators, target, key, desc) {
329
299
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -342,7 +312,8 @@ var TranscriptionManager = class extends Resource2 {
342
312
  _identityDid = void 0;
343
313
  _mediaRecorder = void 0;
344
314
  _transcriber = void 0;
345
- _queue = void 0;
315
+ _feed = void 0;
316
+ _feedServiceLayer = void 0;
346
317
  _enabledAtom = Atom.make(false);
347
318
  constructor(options) {
348
319
  super();
@@ -356,8 +327,9 @@ var TranscriptionManager = class extends Resource2 {
356
327
  getEnabled() {
357
328
  return this._registry.get(this._enabledAtom);
358
329
  }
359
- setQueue(queue) {
360
- this._queue = queue;
330
+ setFeed(space, feed) {
331
+ this._feed = feed;
332
+ this._feedServiceLayer = createFeedServiceLayer(space.queues);
361
333
  return this;
362
334
  }
363
335
  setIdentityDid(did) {
@@ -432,7 +404,7 @@ var TranscriptionManager = class extends Resource2 {
432
404
  await this._transcriber?.close();
433
405
  }
434
406
  async _onSegments(segments) {
435
- if (!this.isOpen || !this._queue) {
407
+ if (!this.isOpen || !this._feed || !this._feedServiceLayer) {
436
408
  return;
437
409
  }
438
410
  let block = Obj.make(Message.Message, {
@@ -445,29 +417,19 @@ var TranscriptionManager = class extends Resource2 {
445
417
  if (this._messageEnricher) {
446
418
  block = await this._messageEnricher(block);
447
419
  }
448
- await this._queue.append([
420
+ await Feed.append(this._feed, [
449
421
  block
450
- ]);
422
+ ]).pipe(Effect.provide(this._feedServiceLayer), runAndForwardErrors);
451
423
  }
452
424
  };
453
425
  _ts_decorate3([
454
426
  synchronized2
455
427
  ], TranscriptionManager.prototype, "setAudioTrack", null);
456
428
 
457
- // src/index.ts
458
- var TranscriptionPlugin = Plugin.lazy(meta, () => import("#plugin"));
459
429
  export {
460
430
  MediaStreamRecorder,
461
431
  Transcriber,
462
- TranscriptionCapabilities,
463
- TranscriptionManager,
464
- TranscriptionPlugin,
465
432
  alignWhisperSegments,
466
- meta,
467
- useAudioFile,
468
- useAudioTrack,
469
- useQueueModelAdapter,
470
- useTranscriber,
471
- useVoiceInput
433
+ TranscriptionManager
472
434
  };
473
- //# sourceMappingURL=index.mjs.map
435
+ //# sourceMappingURL=chunk-ILSA3DU7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/transcriber/transcription-manager.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder, MediaRecorder, register } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioChunk, type AudioRecorder, type WavConfig } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n};\n\nexport type MediaStreamRecorderProps = {\n mediaStreamTrack: MediaStreamTrack;\n config: {\n interval: number;\n };\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _config: MediaStreamRecorderProps['config'];\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, config }: MediaStreamRecorderProps) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._config = config;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start(): Promise<void> {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._config.interval);\n }\n\n async stop(): Promise<void> {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent): Promise<void> {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { mergeFloat64Arrays } from '../util';\nimport { type AudioChunk, type AudioRecorder } from './audio-recorder';\n\n/**\n * Endpoint to the calls service.\n */\nconst DEFAULT_TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';\n\nexport type WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\nexport type WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n\n /**\n * Override the transcription endpoint base URL.\n * Defaults to the DXOS calls service.\n */\n endpoint?: string;\n};\n\n/**\n * Function that converts a base64-encoded WAV payload into Whisper segments.\n * Allows callers to swap in alternative providers or mock the transport.\n */\nexport type TranscribeFn = (audio: string) => Promise<WhisperSegment[]>;\n\nexport type TranscriberProps = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n /**\n * Callback to handle the transcribed segments, after all segment transformers are applied.\n * @param segments - The transcribed segments.\n */\n onSegments: (segments: ContentBlock.Transcript[]) => Promise<void>;\n /**\n * Optional override of the transcription transport. When provided, supersedes `config.endpoint`.\n */\n transcribe?: TranscribeFn;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberProps['onSegments'];\n private readonly _transcribeFn?: TranscribeFn;\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments, transcribe }: TranscriberProps) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n this._transcribeFn = transcribe;\n }\n\n protected override async _open(ctx: Context): Promise<void> {\n log.info('opening');\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close(): Promise<void> {\n log.info('closing');\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording(): void {\n log.info('starting');\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n\n this._recording = true;\n }\n\n stopChunksRecording(): void {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n\n this._recording = false;\n this._transcribeTask?.schedule();\n log.info('stopped');\n }\n\n private _saveAudioChunk(chunk: AudioChunk): void {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe(): Promise<void> {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks(): AudioChunk[] {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]): Promise<string> {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string): Promise<WhisperSegment[]> {\n if (audio.length === 0) {\n throw new Error('No audio to send for transcribing');\n }\n\n let segments: unknown;\n if (this._transcribeFn) {\n segments = await this._transcribeFn(audio);\n } else {\n // TODO(burdon): Create separate endpoint?\n const endpoint = this._config.endpoint ?? DEFAULT_TRANSCRIPTION_URL;\n const response = await fetch(`${endpoint}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n ({ segments } = (await response.json()) as { segments?: unknown });\n }\n\n if (!Array.isArray(segments)) {\n throw new Error('Transcription response payload is invalid');\n }\n\n log.info('transcription response', { segments: segments.length });\n return segments as WhisperSegment[];\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): ContentBlock.Transcript[] {\n const result = alignWhisperSegments(segments, originalChunks, this._lastTimestamp);\n if (result.lastTimestamp !== undefined) {\n this._lastTimestamp = result.lastTimestamp;\n }\n\n return result.transcripts;\n }\n}\n\n/**\n * Pure helper that filters and absolute-timestamps Whisper segments against a chunk timeline.\n * Exported for testing.\n *\n * @param segments - Raw segments returned by the Whisper service for `originalChunks`.\n * @param originalChunks - Chunks fed into the transcription request (used for the zero timestamp).\n * @param lastTimestamp - Most recent absolute timestamp already emitted; segments whose end\n * falls strictly before this point are deduped out, as are individual words whose start does.\n */\nexport const alignWhisperSegments = (\n segments: WhisperSegment[],\n originalChunks: AudioChunk[],\n lastTimestamp: number,\n): { transcripts: ContentBlock.Transcript[]; lastTimestamp?: number } => {\n if (originalChunks.length === 0) {\n return { transcripts: [] };\n }\n\n const zeroTimestamp = originalChunks[0].timestamp;\n\n const filteredSegments = segments\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= lastTimestamp)\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= lastTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return { transcripts: [] };\n }\n\n return {\n lastTimestamp: zeroTimestamp + filteredSegments.at(-1)!.end * 1_000,\n transcripts: filteredSegments.map((segment) => ({\n _tag: 'transcript',\n started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),\n text: segment.text.trim(),\n })),\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { synchronized } from '@dxos/async';\nimport { createFeedServiceLayer, type Space } from '@dxos/client/echo';\nimport { Resource } from '@dxos/context';\nimport { Feed, Obj } from '@dxos/echo';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { type ContentBlock, Message } from '@dxos/types';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\nimport { Transcriber } from './transcriber';\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type TranscriptMessageEnricher = (message: Message.Message) => Promise<Message.Message>;\n\nexport type TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n registry: Registry.Registry;\n\n /**\n * Enrich the message before it is written to the transcription feed.\n */\n messageEnricher?: TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting.\n */\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptMessageEnricher;\n private readonly _registry: Registry.Registry;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _feed?: Feed.Feed = undefined;\n private _feedServiceLayer?: Layer.Layer<Feed.FeedService> = undefined;\n private _enabledAtom = Atom.make(false);\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n this._registry = options.registry;\n }\n\n get enabled(): Atom.Atom<boolean> {\n return this._enabledAtom;\n }\n\n getEnabled(): boolean {\n return this._registry.get(this._enabledAtom);\n }\n\n setFeed(space: Space, feed: Feed.Feed): this {\n this._feed = feed;\n this._feedServiceLayer = createFeedServiceLayer(space.queues);\n return this;\n }\n\n setIdentityDid(did: string): this {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): this {\n if (!this.isOpen || !this.getEnabled()) {\n return this;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n return this;\n }\n\n async setEnabled(enabled: boolean): Promise<void> {\n if (this.getEnabled() === enabled) {\n return;\n }\n\n this._registry.set(this._enabledAtom, enabled ?? false);\n if (enabled) {\n await this._maybeRestartTranscriber();\n } else {\n await this._stopTranscriber();\n }\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack): Promise<void> {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n await this._maybeRestartTranscriber();\n }\n\n protected override async _open(): Promise<void> {\n await this._maybeRestartTranscriber();\n }\n\n protected override async _close(): Promise<void> {\n await this._stopTranscriber();\n }\n\n private async _maybeRestartTranscriber(): Promise<void> {\n if (!this._audioStreamTrack || !this.getEnabled() || !this.isOpen) {\n return;\n }\n\n // Reinitialize transcriber if feed or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n config: { interval: RECORD_INTERVAL },\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n\n await this._transcriber?.open();\n }\n }\n\n private async _stopTranscriber(): Promise<void> {\n await this._transcriber?.close();\n }\n\n private async _onSegments(segments: ContentBlock.Transcript[]): Promise<void> {\n if (!this.isOpen || !this._feed || !this._feedServiceLayer) {\n return;\n }\n\n let block = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n blocks: segments,\n sender: { identityDid: this._identityDid },\n });\n\n if (this._messageEnricher) {\n block = await this._messageEnricher(block);\n }\n\n await Feed.append(this._feed, [block]).pipe(Effect.provide(this._feedServiceLayer), runAndForwardErrors);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["WaveFile", "synchronized", "invariant", "log", "trace", "initializingPromise", "register", "connect", "_mediaStreamTrack", "_mediaRecorder", "_header", "undefined", "_onChunk", "mediaStreamTrack", "_config", "config", "settings", "channels", "sampleRate", "bitDepthCode", "setOnChunk", "onChunk", "err", "stream", "MediaStream", "mimeType", "ondataavailable", "_ondataavailable", "event", "start", "interval", "data", "uint8Array", "wav", "isHeader", "slice", "timestamp", "getSamples", "resource", "DeferredTask", "Trigger", "LifecycleState", "log", "trace", "mergeFloat64Arrays", "_audioChunks", "_lastTimestamp", "_openTrigger", "_config", "_recorder", "_onSegments", "_transcribeFn", "_recording", "_transcribeTask", "config", "log", "setOnChunk", "chunk", "_saveAudioChunk", "DeferredTask", "__dxlog_file", "stop", "startChunksRecording", "_lifecycleState", "LifecycleState", "stopChunksRecording", "info", "_dropOldChunks", "length", "schedule", "chunks", "segments", "_fetchTranscription", "audio", "Array", "isArray", "alignedSegments", "WaveFile", "wavConfig", "file", "fromScratch", "channels", "toBase64", "response", "method", "body", "JSON", "headers", "Error", "_alignSegments", "result", "alignWhisperSegments", "lastTimestamp", "undefined", "span", "showInBrowserTimeline", "originalChunks", "transcripts", "filteredSegments", "filter", "segment", "word", "zeroTimestamp", "start", "words", "text", "map", "_tag", "started", "Atom", "Effect", "synchronized", "createFeedServiceLayer", "Resource", "Feed", "Obj", "runAndForwardErrors", "Message", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManager", "Resource", "_edgeClient", "_messageEnricher", "_registry", "_audioStreamTrack", "undefined", "_identityDid", "_mediaRecorder", "_transcriber", "_feed", "_feedServiceLayer", "_enabledAtom", "Atom", "make", "options", "edgeClient", "messageEnricher", "registry", "enabled", "getEnabled", "get", "setFeed", "space", "feed", "createFeedServiceLayer", "queues", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "startChunksRecording", "stopChunksRecording", "setEnabled", "set", "_maybeRestartTranscriber", "_stopTranscriber", "setAudioTrack", "track", "_open", "_close", "needReinit", "mediaStreamTrack", "MediaStreamRecorder", "config", "interval", "close", "Transcriber", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "onSegments", "segments", "_onSegments", "open", "block", "Obj", "Message", "created", "Date", "toISOString", "blocks", "sender", "identityDid", "Feed", "append", "pipe", "provide", "runAndForwardErrors"]
7
+ }
@@ -0,0 +1,8 @@
1
+ // src/operations/index.ts
2
+ import { OperationHandlerSet } from "@dxos/compute";
3
+ var TranscriptionOperationHandlerSet = OperationHandlerSet.lazy(() => import("./create-RRWRIUSR.mjs"), () => import("./open-CVMX5KXZ.mjs"), () => import("./summarize-LA7TRW7A.mjs"));
4
+
5
+ export {
6
+ TranscriptionOperationHandlerSet
7
+ };
8
+ //# sourceMappingURL=chunk-Y5EQAFFR.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { OperationHandlerSet } from '@dxos/compute';\n\nexport const TranscriptionOperationHandlerSet = OperationHandlerSet.lazy(\n () => import('./create'),\n () => import('./open'),\n () => import('./summarize'),\n);\n"],
5
+ "mappings": ";AAIA,SAASA,2BAA2B;AAE7B,IAAMC,mCAAmCD,oBAAoBE,KAClE,MAAM,OAAO,uBAAA,GACb,MAAM,OAAO,qBAAA,GACb,MAAM,OAAO,0BAAA,CAAA;",
6
+ "names": ["OperationHandlerSet", "TranscriptionOperationHandlerSet", "lazy"]
7
+ }
@@ -1,9 +1,7 @@
1
- import "../chunk-J5LGTIGS.mjs";
2
-
3
1
  // src/blueprints/transcription-blueprint.ts
4
2
  import { Blueprint, Template } from "@dxos/compute";
5
3
  import { trim } from "@dxos/util";
6
- import { TranscriptOperation } from "#operations";
4
+ import { TranscriptOperation } from "#types";
7
5
  var BLUEPRINT_KEY = "org.dxos.blueprint.transcription";
8
6
  var make = () => Blueprint.make({
9
7
  key: BLUEPRINT_KEY,
@@ -25,7 +23,8 @@ var blueprint = {
25
23
  make
26
24
  };
27
25
  var transcription_blueprint_default = blueprint;
26
+
28
27
  export {
29
- transcription_blueprint_default as TranscriptionBlueprint
28
+ transcription_blueprint_default
30
29
  };
31
- //# sourceMappingURL=index.mjs.map
30
+ //# sourceMappingURL=chunk-ZR4BH4QQ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/blueprints/transcription-blueprint.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Blueprint, Template } from '@dxos/compute';\nimport { trim } from '@dxos/util';\n\nimport { TranscriptOperation } from '#types';\n\nconst BLUEPRINT_KEY = 'org.dxos.blueprint.transcription';\n\nconst make = () =>\n Blueprint.make({\n key: BLUEPRINT_KEY,\n name: 'Transcription',\n tools: Blueprint.toolDefinitions({ operations: [TranscriptOperation.Open, TranscriptOperation.Summarize] }),\n instructions: Template.make({\n source: trim`\n You can open and summarize a meeting transcript.\n `,\n }),\n });\n\nconst blueprint: Blueprint.Definition = {\n key: BLUEPRINT_KEY,\n make,\n};\n\nexport default blueprint;\n"],
5
+ "mappings": ";AAIA,SAASA,WAAWC,gBAAgB;AACpC,SAASC,YAAY;AAErB,SAASC,2BAA2B;AAEpC,IAAMC,gBAAgB;AAEtB,IAAMC,OAAO,MACXL,UAAUK,KAAK;EACbC,KAAKF;EACLG,MAAM;EACNC,OAAOR,UAAUS,gBAAgB;IAAEC,YAAY;MAACP,oBAAoBQ;MAAMR,oBAAoBS;;EAAW,CAAA;EACzGC,cAAcZ,SAASI,KAAK;IAC1BS,QAAQZ;;;EAGV,CAAA;AACF,CAAA;AAEF,IAAMa,YAAkC;EACtCT,KAAKF;EACLC;AACF;AAEA,IAAA,kCAAeU;",
6
+ "names": ["Blueprint", "Template", "trim", "TranscriptOperation", "BLUEPRINT_KEY", "make", "key", "name", "tools", "toolDefinitions", "operations", "Open", "Summarize", "instructions", "source", "blueprint"]
7
+ }
@@ -6,13 +6,76 @@ import {
6
6
  } from "../chunk-KAEXRX3Y.mjs";
7
7
  import "../chunk-J5LGTIGS.mjs";
8
8
 
9
+ // src/components/Oracle/Oracle.tsx
10
+ import { Primitive } from "@radix-ui/react-primitive";
11
+ import { Slot } from "@radix-ui/react-slot";
12
+ import React, { createContext, useContext, useMemo } from "react";
13
+ import "@dxos/react-ui-graph/styles/graph.css";
14
+ import { TextBlock } from "@dxos/react-ui-components";
15
+ import { SVG } from "@dxos/react-ui-graph";
16
+ import { composableProps, mx, slottable } from "@dxos/ui-theme";
17
+ var OracleContext = /* @__PURE__ */ createContext(null);
18
+ var useOracleContext = (consumer) => {
19
+ const ctx = useContext(OracleContext);
20
+ if (!ctx) {
21
+ throw new Error(`<Oracle.${consumer}> must be rendered inside <Oracle.Root>`);
22
+ }
23
+ return ctx;
24
+ };
25
+ var Root = ({ children, text = "", delay = 12 }) => {
26
+ const value = useMemo(() => ({
27
+ text,
28
+ delay
29
+ }), [
30
+ text,
31
+ delay
32
+ ]);
33
+ return /* @__PURE__ */ React.createElement(OracleContext.Provider, {
34
+ value
35
+ }, children);
36
+ };
37
+ var Content = slottable(({ children, asChild, ...props }, forwardedRef) => {
38
+ const Comp = asChild ? Slot : Primitive.div;
39
+ return /* @__PURE__ */ React.createElement(Comp, {
40
+ ...composableProps(props, {
41
+ classNames: "relative dx-expander"
42
+ }),
43
+ ref: forwardedRef
44
+ }, children);
45
+ });
46
+ Content.displayName = "Oracle.Content";
47
+ var Canvas = ({ classNames, children }) => /* @__PURE__ */ React.createElement(SVG.Root, {
48
+ centered: true,
49
+ classNames: mx("absolute inset-0", classNames)
50
+ }, children ?? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(SVG.Markers, null), /* @__PURE__ */ React.createElement(SVG.Grid, null), /* @__PURE__ */ React.createElement(SVG.Zoom, {
51
+ extent: [
52
+ 1 / 4,
53
+ 4
54
+ ]
55
+ }, /* @__PURE__ */ React.createElement(SVG.Graph, null))));
56
+ var Text = ({ classNames }) => {
57
+ const { text, delay } = useOracleContext("Text");
58
+ return /* @__PURE__ */ React.createElement("div", {
59
+ className: "pointer-events-none absolute inset-0 flex items-center justify-center"
60
+ }, /* @__PURE__ */ React.createElement(TextBlock, {
61
+ classNames: mx("max-w-xl px-6 py-4 text-center text-2xl font-medium text-balance text-subdued", classNames),
62
+ text,
63
+ delay
64
+ }));
65
+ };
66
+ var Oracle = {
67
+ Root,
68
+ Content,
69
+ Canvas,
70
+ Text
71
+ };
72
+
9
73
  // src/components/Transcription/Transcription.tsx
10
- import React from "react";
74
+ import React2 from "react";
11
75
  import { useThemeContext } from "@dxos/react-ui";
12
76
  import { useTextEditor } from "@dxos/react-ui-editor";
13
- import { autoScroll, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, documentSlots, preview } from "@dxos/ui-editor";
14
- import { composable, composableProps } from "@dxos/ui-theme";
15
- import { isTruthy } from "@dxos/util";
77
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, documentSlots, preview, scroller } from "@dxos/ui-editor";
78
+ import { composable, composableProps as composableProps2 } from "@dxos/ui-theme";
16
79
 
17
80
  // src/components/Transcription/transcription-extension.ts
18
81
  import { RangeSetBuilder } from "@codemirror/state";
@@ -54,18 +117,18 @@ var transcription = ({ model, started }) => {
54
117
  _initialized = false;
55
118
  constructor(view) {
56
119
  this._adapter = new DocumentAdapter(view);
57
- const scroller = view.scrollDOM;
120
+ const scroller2 = view.scrollDOM;
58
121
  let isAutoScrolling = false;
59
122
  let hasScrolled = false;
60
123
  let timeout;
61
124
  const scrollToBottom = (smooth = false) => {
62
- scroller.style.scrollBehavior = smooth ? "smooth" : "";
63
- scroller.classList.add("cm-hide-scrollbar");
125
+ scroller2.style.scrollBehavior = smooth ? "smooth" : "";
126
+ scroller2.classList.add("cm-hide-scrollbar");
64
127
  isAutoScrolling = true;
65
128
  clearTimeout(timeout);
66
129
  timeout = setTimeout(() => {
67
130
  this._controls?.classList.add("opacity-0");
68
- scroller.classList.remove("cm-hide-scrollbar");
131
+ scroller2.classList.remove("cm-hide-scrollbar");
69
132
  isAutoScrolling = false;
70
133
  }, 500);
71
134
  view.dispatch({
@@ -80,9 +143,9 @@ var transcription = ({ model, started }) => {
80
143
  this._controls?.classList.remove("opacity-0");
81
144
  }
82
145
  }), model.update.on(() => {
83
- const autoScroll2 = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
146
+ const autoScroll = scroller2.scrollHeight - scroller2.scrollTop - scroller2.clientHeight === 0 || !hasScrolled;
84
147
  model.sync(this._adapter);
85
- if (autoScroll2) {
148
+ if (autoScroll) {
86
149
  scrollToBottom(true);
87
150
  }
88
151
  }));
@@ -175,32 +238,34 @@ var Transcription = composable(({ transcript: object, model, children, ...props
175
238
  lineWrapping: true,
176
239
  search: true
177
240
  }),
178
- createMarkdownExtensions(),
179
241
  createThemeExtensions({
180
242
  themeMode,
181
243
  slots: documentSlots
182
244
  }),
245
+ createMarkdownExtensions(),
183
246
  decorateMarkdown(),
184
247
  preview(),
185
248
  transcription({
186
249
  model,
187
250
  started: object?.started ? new Date(object.started) : void 0
188
251
  }),
189
- autoScroll()
190
- ].filter(isTruthy)
252
+ scroller()
253
+ ]
191
254
  };
192
255
  }, [
193
- model
256
+ model,
257
+ themeMode
194
258
  ]);
195
- return /* @__PURE__ */ React.createElement("div", {
196
- ...composableProps(props, {
259
+ return /* @__PURE__ */ React2.createElement("div", {
260
+ ...composableProps2(props, {
197
261
  classNames: "dx-container"
198
262
  }),
199
- ref: parentRef,
200
- "data-popover-collision-boundary": true
263
+ "data-popover-collision-boundary": true,
264
+ ref: parentRef
201
265
  });
202
266
  });
203
267
  export {
268
+ Oracle,
204
269
  Transcription,
205
270
  renderByline
206
271
  };