@dxos/plugin-transcription 0.9.0 → 0.9.1-staging.ee54ba693a

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 (324) hide show
  1. package/PLUGIN.mdl +25 -5
  2. package/dist/lib/neutral/{TranscriptionArticle-L6XANBH5.mjs → TranscriptionArticle-FEWCWG4A.mjs} +4 -7
  3. package/dist/lib/neutral/TranscriptionArticle-FEWCWG4A.mjs.map +7 -0
  4. package/dist/lib/neutral/TranscriptionPlugin.mjs +29 -6
  5. package/dist/lib/neutral/TranscriptionPlugin.mjs.map +4 -4
  6. package/dist/lib/neutral/TranscriptionPlugin.node.mjs +3 -3
  7. package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +3 -3
  8. package/dist/lib/neutral/app-graph-builder-GQRMI22E.mjs +48 -0
  9. package/dist/lib/neutral/app-graph-builder-GQRMI22E.mjs.map +7 -0
  10. package/dist/lib/neutral/capabilities/index.mjs +19 -5
  11. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  12. package/dist/lib/neutral/chunk-5BVHY75B.mjs +54 -0
  13. package/dist/lib/neutral/chunk-5BVHY75B.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-HNXSU7HJ.mjs +8 -0
  15. package/dist/lib/neutral/{chunk-KXJZEYS7.mjs.map → chunk-HNXSU7HJ.mjs.map} +2 -2
  16. package/dist/lib/neutral/chunk-KOXLGGSL.mjs +30 -0
  17. package/dist/lib/neutral/chunk-KOXLGGSL.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-MDV7NBFJ.mjs +182 -0
  19. package/dist/lib/neutral/chunk-MDV7NBFJ.mjs.map +7 -0
  20. package/dist/lib/neutral/components/index.mjs +114 -258
  21. package/dist/lib/neutral/components/index.mjs.map +4 -4
  22. package/dist/lib/neutral/containers/index.mjs +1 -1
  23. package/dist/lib/neutral/{create-RVR7VC33.mjs → create-HNHGCKZ4.mjs} +2 -2
  24. package/dist/lib/neutral/enrich-message-DSJU4TXC.mjs +24 -0
  25. package/dist/lib/neutral/enrich-message-DSJU4TXC.mjs.map +7 -0
  26. package/dist/lib/neutral/entity-lookup-PCDW7NC4.mjs +25 -0
  27. package/dist/lib/neutral/entity-lookup-PCDW7NC4.mjs.map +7 -0
  28. package/dist/lib/neutral/hooks/index.mjs +93 -15
  29. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  30. package/dist/lib/neutral/index.mjs +8 -32
  31. package/dist/lib/neutral/markdown-extension-CCDXXY7E.mjs +16 -0
  32. package/dist/lib/neutral/markdown-extension-CCDXXY7E.mjs.map +7 -0
  33. package/dist/lib/neutral/meta.json +1 -1
  34. package/dist/lib/neutral/meta.mjs +1 -1
  35. package/dist/lib/neutral/{open-A5KXKRH4.mjs → open-SNMZXXYO.mjs} +4 -6
  36. package/dist/lib/neutral/open-SNMZXXYO.mjs.map +7 -0
  37. package/dist/lib/neutral/operations/index.mjs +1 -1
  38. package/dist/lib/neutral/pipeline-status-XMWMAUJY.mjs +17 -0
  39. package/dist/lib/neutral/pipeline-status-XMWMAUJY.mjs.map +7 -0
  40. package/dist/lib/neutral/plugin.mjs +2 -2
  41. package/dist/lib/neutral/recording-session-IADO7ATU.mjs +15 -0
  42. package/dist/lib/neutral/recording-session-IADO7ATU.mjs.map +7 -0
  43. package/dist/lib/neutral/settings-7KE4MABW.mjs +31 -0
  44. package/dist/lib/neutral/settings-7KE4MABW.mjs.map +7 -0
  45. package/dist/lib/neutral/skill-definition-DXNK324V.mjs +15 -0
  46. package/dist/lib/neutral/skill-definition-DXNK324V.mjs.map +7 -0
  47. package/dist/lib/neutral/skills/index.mjs +8 -0
  48. package/dist/lib/neutral/{summarize-5XPPMVTE.mjs → summarize-LBUZTOTH.mjs} +4 -4
  49. package/dist/lib/neutral/summarize-LBUZTOTH.mjs.map +7 -0
  50. package/dist/lib/neutral/{text-content-KBB37HSM.mjs → text-content-NOWR642C.mjs} +9 -9
  51. package/dist/lib/neutral/text-content-NOWR642C.mjs.map +7 -0
  52. package/dist/lib/neutral/transcriber-6XZHUUHK.mjs +174 -0
  53. package/dist/lib/neutral/transcriber-6XZHUUHK.mjs.map +7 -0
  54. package/dist/lib/neutral/transcription-driver-DN6ELQXZ.mjs +207 -0
  55. package/dist/lib/neutral/transcription-driver-DN6ELQXZ.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +8 -1
  57. package/dist/lib/neutral/translations.mjs.map +3 -3
  58. package/dist/lib/neutral/types/index.mjs +3 -1
  59. package/dist/types/dx.config.d.ts +28 -0
  60. package/dist/types/dx.config.d.ts.map +1 -0
  61. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/app-graph-builder.d.ts +5 -0
  63. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  64. package/dist/types/src/capabilities/entity-lookup.d.ts +10 -0
  65. package/dist/types/src/capabilities/entity-lookup.d.ts.map +1 -0
  66. package/dist/types/src/capabilities/index.d.ts +11 -8
  67. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/markdown-extension.d.ts +5 -0
  69. package/dist/types/src/capabilities/markdown-extension.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/pipeline-status.d.ts +9 -0
  71. package/dist/types/src/capabilities/pipeline-status.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  73. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/recording-session.d.ts +5 -0
  75. package/dist/types/src/capabilities/recording-session.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/settings.d.ts +5 -0
  77. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  79. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/text-content.d.ts +1 -4
  81. package/dist/types/src/capabilities/transcriber.d.ts +4 -3
  82. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/transcription-driver.d.ts +5 -0
  84. package/dist/types/src/capabilities/transcription-driver.d.ts.map +1 -0
  85. package/dist/types/src/components/Mic/Mic.d.ts +12 -0
  86. package/dist/types/src/components/Mic/Mic.d.ts.map +1 -0
  87. package/dist/types/src/components/{Oracle/Oracle.stories.d.ts → Mic/Mic.stories.d.ts} +9 -7
  88. package/dist/types/src/components/Mic/Mic.stories.d.ts.map +1 -0
  89. package/dist/types/src/components/Mic/index.d.ts +2 -0
  90. package/dist/types/src/components/Mic/index.d.ts.map +1 -0
  91. package/dist/types/src/components/index.d.ts +1 -2
  92. package/dist/types/src/components/index.d.ts.map +1 -1
  93. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts.map +1 -1
  94. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts +7 -0
  95. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts.map +1 -1
  96. package/dist/types/src/hooks/index.d.ts +0 -5
  97. package/dist/types/src/hooks/index.d.ts.map +1 -1
  98. package/dist/types/src/hooks/useTranscriptionRecording.d.ts.map +1 -1
  99. package/dist/types/src/index.d.ts +1 -3
  100. package/dist/types/src/index.d.ts.map +1 -1
  101. package/dist/types/src/meta.d.ts +32 -2
  102. package/dist/types/src/meta.d.ts.map +1 -1
  103. package/dist/types/src/normalization/message-normalizer.d.ts +2 -2
  104. package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -1
  105. package/dist/types/src/normalization/normalization.d.ts +98 -733
  106. package/dist/types/src/normalization/normalization.d.ts.map +1 -1
  107. package/dist/types/src/operations/enrich-message.d.ts +9 -0
  108. package/dist/types/src/operations/enrich-message.d.ts.map +1 -0
  109. package/dist/types/src/operations/index.d.ts.map +1 -1
  110. package/dist/types/src/operations/open.d.ts.map +1 -1
  111. package/dist/types/src/operations/summarize.d.ts.map +1 -1
  112. package/dist/types/src/skills/index.d.ts +2 -0
  113. package/dist/types/src/skills/index.d.ts.map +1 -0
  114. package/dist/types/src/skills/transcription-skill.d.ts +4 -0
  115. package/dist/types/src/skills/transcription-skill.d.ts.map +1 -0
  116. package/dist/types/src/stories/Keyword.stories.d.ts +51 -0
  117. package/dist/types/src/stories/Keyword.stories.d.ts.map +1 -0
  118. package/dist/types/src/stories/Pipeline.stories.d.ts +60 -0
  119. package/dist/types/src/stories/Pipeline.stories.d.ts.map +1 -0
  120. package/dist/types/src/stories/Transcription.stories.d.ts +23 -0
  121. package/dist/types/src/stories/Transcription.stories.d.ts.map +1 -0
  122. package/dist/types/src/testing/decorators.d.ts +21 -0
  123. package/dist/types/src/testing/decorators.d.ts.map +1 -0
  124. package/dist/types/src/testing/index.d.ts +1 -0
  125. package/dist/types/src/testing/index.d.ts.map +1 -1
  126. package/dist/types/src/testing/testing.d.ts +3 -13
  127. package/dist/types/src/testing/testing.d.ts.map +1 -1
  128. package/dist/types/src/{transcriber/transcription-manager.d.ts → transcription-manager.d.ts} +6 -5
  129. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  130. package/dist/types/src/translations.d.ts +7 -0
  131. package/dist/types/src/translations.d.ts.map +1 -1
  132. package/dist/types/src/types/Settings.d.ts +13 -0
  133. package/dist/types/src/types/Settings.d.ts.map +1 -0
  134. package/dist/types/src/types/TranscriptOperation.d.ts +114 -1564
  135. package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -1
  136. package/dist/types/src/types/TranscriptionCapabilities.d.ts +52 -11
  137. package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -1
  138. package/dist/types/src/types/index.d.ts +1 -0
  139. package/dist/types/src/types/index.d.ts.map +1 -1
  140. package/dist/types/src/util/index.d.ts +0 -3
  141. package/dist/types/src/util/index.d.ts.map +1 -1
  142. package/dist/types/tsconfig.tsbuildinfo +1 -1
  143. package/dx.config.ts +42 -0
  144. package/package.json +69 -69
  145. package/src/TranscriptionPlugin.node.ts +2 -2
  146. package/src/TranscriptionPlugin.test.ts +2 -2
  147. package/src/TranscriptionPlugin.tsx +40 -3
  148. package/src/capabilities/app-graph-builder.tsx +49 -0
  149. package/src/capabilities/entity-lookup.ts +32 -0
  150. package/src/capabilities/index.ts +8 -7
  151. package/src/capabilities/markdown-extension.ts +17 -0
  152. package/src/capabilities/pipeline-status.ts +23 -0
  153. package/src/capabilities/recording-session.ts +17 -0
  154. package/src/capabilities/settings.ts +34 -0
  155. package/src/capabilities/skill-definition.ts +15 -0
  156. package/src/capabilities/text-content.ts +10 -7
  157. package/src/capabilities/transcriber.ts +5 -48
  158. package/src/capabilities/transcription-driver.tsx +263 -0
  159. package/src/components/Mic/Mic.stories.tsx +66 -0
  160. package/src/components/Mic/Mic.tsx +136 -0
  161. package/src/components/Mic/index.ts +5 -0
  162. package/src/components/index.ts +1 -2
  163. package/src/containers/TranscriptionArticle/TranscriptionArticle.stories.tsx +4 -0
  164. package/src/containers/TranscriptionArticle/TranscriptionArticle.tsx +5 -6
  165. package/src/hooks/index.ts +0 -5
  166. package/src/hooks/useTranscriptionRecording.ts +27 -9
  167. package/src/index.ts +1 -5
  168. package/src/meta.ts +2 -35
  169. package/src/normalization/message-normalizer.ts +3 -3
  170. package/src/normalization/normalization.ts +3 -0
  171. package/src/operations/enrich-message.ts +27 -0
  172. package/src/operations/index.ts +1 -0
  173. package/src/operations/open.ts +2 -2
  174. package/src/operations/summarize.ts +2 -2
  175. package/src/skills/index.ts +5 -0
  176. package/src/skills/transcription-skill.ts +29 -0
  177. package/src/stories/Keyword.stories.tsx +98 -0
  178. package/src/stories/Pipeline.stories.tsx +361 -0
  179. package/src/stories/Transcription.stories.tsx +178 -0
  180. package/src/testing/decorators.ts +78 -0
  181. package/src/testing/index.ts +1 -0
  182. package/src/testing/testing.ts +14 -134
  183. package/src/{transcriber/transcription-manager.ts → transcription-manager.ts} +13 -12
  184. package/src/translations.ts +9 -1
  185. package/src/types/Settings.ts +59 -0
  186. package/src/types/TranscriptOperation.ts +22 -4
  187. package/src/types/TranscriptionCapabilities.ts +61 -20
  188. package/src/types/index.ts +1 -0
  189. package/src/util/index.ts +0 -3
  190. package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs.map +0 -7
  191. package/dist/lib/neutral/blueprint-definition-DA4QFRYJ.mjs +0 -15
  192. package/dist/lib/neutral/blueprint-definition-DA4QFRYJ.mjs.map +0 -7
  193. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  194. package/dist/lib/neutral/chunk-FHNI26QW.mjs +0 -45
  195. package/dist/lib/neutral/chunk-FHNI26QW.mjs.map +0 -7
  196. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs +0 -35
  197. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs.map +0 -7
  198. package/dist/lib/neutral/chunk-KMT3BMMQ.mjs +0 -124
  199. package/dist/lib/neutral/chunk-KMT3BMMQ.mjs.map +0 -7
  200. package/dist/lib/neutral/chunk-KXJZEYS7.mjs +0 -8
  201. package/dist/lib/neutral/chunk-MLRJWAQH.mjs +0 -179
  202. package/dist/lib/neutral/chunk-MLRJWAQH.mjs.map +0 -7
  203. package/dist/lib/neutral/chunk-TO77KAQK.mjs +0 -298
  204. package/dist/lib/neutral/chunk-TO77KAQK.mjs.map +0 -7
  205. package/dist/lib/neutral/chunk-TX3NQISZ.mjs +0 -435
  206. package/dist/lib/neutral/chunk-TX3NQISZ.mjs.map +0 -7
  207. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs +0 -30
  208. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs.map +0 -7
  209. package/dist/lib/neutral/open-A5KXKRH4.mjs.map +0 -7
  210. package/dist/lib/neutral/summarize-5XPPMVTE.mjs.map +0 -7
  211. package/dist/lib/neutral/text-content-KBB37HSM.mjs.map +0 -7
  212. package/dist/lib/neutral/transcriber-OGSF3XO5.mjs +0 -59
  213. package/dist/lib/neutral/transcriber-OGSF3XO5.mjs.map +0 -7
  214. package/dist/types/src/blueprints/index.d.ts +0 -2
  215. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  216. package/dist/types/src/blueprints/transcription-blueprint.d.ts +0 -4
  217. package/dist/types/src/blueprints/transcription-blueprint.d.ts.map +0 -1
  218. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
  219. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  220. package/dist/types/src/components/Oracle/Oracle.d.ts +0 -24
  221. package/dist/types/src/components/Oracle/Oracle.d.ts.map +0 -1
  222. package/dist/types/src/components/Oracle/Oracle.stories.d.ts.map +0 -1
  223. package/dist/types/src/components/Oracle/index.d.ts +0 -2
  224. package/dist/types/src/components/Oracle/index.d.ts.map +0 -1
  225. package/dist/types/src/components/Transcription/Transcription.d.ts +0 -11
  226. package/dist/types/src/components/Transcription/Transcription.d.ts.map +0 -1
  227. package/dist/types/src/components/Transcription/Transcription.stories.d.ts +0 -37
  228. package/dist/types/src/components/Transcription/Transcription.stories.d.ts.map +0 -1
  229. package/dist/types/src/components/Transcription/index.d.ts +0 -2
  230. package/dist/types/src/components/Transcription/index.d.ts.map +0 -1
  231. package/dist/types/src/components/Transcription/transcription-extension.d.ts +0 -15
  232. package/dist/types/src/components/Transcription/transcription-extension.d.ts.map +0 -1
  233. package/dist/types/src/enrichment/conversation.test.d.ts +0 -2
  234. package/dist/types/src/enrichment/conversation.test.d.ts.map +0 -1
  235. package/dist/types/src/enrichment/operations.d.ts +0 -200
  236. package/dist/types/src/enrichment/operations.d.ts.map +0 -1
  237. package/dist/types/src/enrichment/parser.d.ts +0 -26
  238. package/dist/types/src/enrichment/parser.d.ts.map +0 -1
  239. package/dist/types/src/enrichment/stream-simulator.d.ts +0 -38
  240. package/dist/types/src/enrichment/stream-simulator.d.ts.map +0 -1
  241. package/dist/types/src/hooks/useAudioFile.d.ts +0 -7
  242. package/dist/types/src/hooks/useAudioFile.d.ts.map +0 -1
  243. package/dist/types/src/hooks/useAudioTrack.d.ts +0 -5
  244. package/dist/types/src/hooks/useAudioTrack.d.ts.map +0 -1
  245. package/dist/types/src/hooks/useFeedModelAdapter.d.ts +0 -12
  246. package/dist/types/src/hooks/useFeedModelAdapter.d.ts.map +0 -1
  247. package/dist/types/src/hooks/useTranscriber.d.ts +0 -7
  248. package/dist/types/src/hooks/useTranscriber.d.ts.map +0 -1
  249. package/dist/types/src/hooks/useVoiceInput.d.ts +0 -11
  250. package/dist/types/src/hooks/useVoiceInput.d.ts.map +0 -1
  251. package/dist/types/src/model/index.d.ts +0 -2
  252. package/dist/types/src/model/index.d.ts.map +0 -1
  253. package/dist/types/src/model/model.d.ts +0 -68
  254. package/dist/types/src/model/model.d.ts.map +0 -1
  255. package/dist/types/src/model/model.test.d.ts +0 -2
  256. package/dist/types/src/model/model.test.d.ts.map +0 -1
  257. package/dist/types/src/stories/FileTranscription.stories.d.ts +0 -20
  258. package/dist/types/src/stories/FileTranscription.stories.d.ts.map +0 -1
  259. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts +0 -14
  260. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts.map +0 -1
  261. package/dist/types/src/stories/LiveTranscription.stories.d.ts +0 -20
  262. package/dist/types/src/stories/LiveTranscription.stories.d.ts.map +0 -1
  263. package/dist/types/src/stories/TranscriptionStory.d.ts +0 -21
  264. package/dist/types/src/stories/TranscriptionStory.d.ts.map +0 -1
  265. package/dist/types/src/stories/common.d.ts +0 -248
  266. package/dist/types/src/stories/common.d.ts.map +0 -1
  267. package/dist/types/src/transcriber/audio-recorder.d.ts +0 -47
  268. package/dist/types/src/transcriber/audio-recorder.d.ts.map +0 -1
  269. package/dist/types/src/transcriber/index.d.ts +0 -5
  270. package/dist/types/src/transcriber/index.d.ts.map +0 -1
  271. package/dist/types/src/transcriber/media-stream-recorder.d.ts +0 -30
  272. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +0 -1
  273. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +0 -2
  274. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +0 -1
  275. package/dist/types/src/transcriber/transcriber.d.ts +0 -105
  276. package/dist/types/src/transcriber/transcriber.d.ts.map +0 -1
  277. package/dist/types/src/transcriber/transcriber.test.d.ts +0 -2
  278. package/dist/types/src/transcriber/transcriber.test.d.ts.map +0 -1
  279. package/dist/types/src/transcriber/transcription-manager.d.ts.map +0 -1
  280. package/dist/types/src/util/array.d.ts +0 -2
  281. package/dist/types/src/util/array.d.ts.map +0 -1
  282. package/dist/types/src/util/monitor-audio-level.d.ts +0 -6
  283. package/dist/types/src/util/monitor-audio-level.d.ts.map +0 -1
  284. package/dist/types/src/util/render-byline.d.ts +0 -4
  285. package/dist/types/src/util/render-byline.d.ts.map +0 -1
  286. package/src/blueprints/index.ts +0 -5
  287. package/src/blueprints/transcription-blueprint.ts +0 -29
  288. package/src/capabilities/blueprint-definition.ts +0 -19
  289. package/src/components/Oracle/Oracle.stories.tsx +0 -147
  290. package/src/components/Oracle/Oracle.tsx +0 -142
  291. package/src/components/Oracle/index.ts +0 -5
  292. package/src/components/Transcription/Transcription.stories.tsx +0 -213
  293. package/src/components/Transcription/Transcription.tsx +0 -55
  294. package/src/components/Transcription/index.ts +0 -5
  295. package/src/components/Transcription/transcription-extension.ts +0 -203
  296. package/src/enrichment/conversation.test.ts +0 -162
  297. package/src/enrichment/conversation.txt +0 -23
  298. package/src/enrichment/operations.ts +0 -271
  299. package/src/enrichment/parser.ts +0 -101
  300. package/src/enrichment/stream-simulator.ts +0 -125
  301. package/src/hooks/useAudioFile.ts +0 -88
  302. package/src/hooks/useAudioTrack.ts +0 -35
  303. package/src/hooks/useFeedModelAdapter.ts +0 -46
  304. package/src/hooks/useTranscriber.ts +0 -47
  305. package/src/hooks/useVoiceInput.ts +0 -66
  306. package/src/model/index.ts +0 -5
  307. package/src/model/model.test.ts +0 -175
  308. package/src/model/model.ts +0 -229
  309. package/src/stories/FileTranscription.stories.tsx +0 -143
  310. package/src/stories/KeyWordRecognition.stories.tsx +0 -132
  311. package/src/stories/LiveTranscription.stories.tsx +0 -153
  312. package/src/stories/TranscriptionStory.tsx +0 -101
  313. package/src/stories/common.ts +0 -233
  314. package/src/transcriber/audio-recorder.ts +0 -56
  315. package/src/transcriber/index.ts +0 -8
  316. package/src/transcriber/media-stream-recorder.ts +0 -120
  317. package/src/transcriber/transcriber.browser.test.ts +0 -230
  318. package/src/transcriber/transcriber.test.ts +0 -104
  319. package/src/transcriber/transcriber.ts +0 -303
  320. package/src/util/array.ts +0 -14
  321. package/src/util/monitor-audio-level.ts +0 -58
  322. package/src/util/render-byline.ts +0 -33
  323. /package/dist/lib/neutral/{create-RVR7VC33.mjs.map → create-HNHGCKZ4.mjs.map} +0 -0
  324. /package/dist/lib/neutral/{blueprints → skills}/index.mjs.map +0 -0
@@ -0,0 +1,30 @@
1
+ // src/skills/transcription-skill.ts
2
+ import { Skill, Template } from "@dxos/compute";
3
+ import { trim } from "@dxos/util";
4
+ import { TranscriptOperation } from "#types";
5
+ var SKILL_KEY = "org.dxos.skill.transcription";
6
+ var make = () => Skill.make({
7
+ key: SKILL_KEY,
8
+ name: "Transcription",
9
+ tools: Skill.toolDefinitions({
10
+ operations: [
11
+ TranscriptOperation.Open,
12
+ TranscriptOperation.Summarize
13
+ ]
14
+ }),
15
+ instructions: Template.make({
16
+ source: trim`
17
+ You can open and summarize a meeting transcript.
18
+ `
19
+ })
20
+ });
21
+ var skill = {
22
+ key: SKILL_KEY,
23
+ make
24
+ };
25
+ var transcription_skill_default = skill;
26
+
27
+ export {
28
+ transcription_skill_default
29
+ };
30
+ //# sourceMappingURL=chunk-KOXLGGSL.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/skills/transcription-skill.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Skill, Template } from '@dxos/compute';\nimport { trim } from '@dxos/util';\n\nimport { TranscriptOperation } from '#types';\n\nconst SKILL_KEY = 'org.dxos.skill.transcription';\n\nconst make = () =>\n Skill.make({\n key: SKILL_KEY,\n name: 'Transcription',\n tools: Skill.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 skill: Skill.Definition = {\n key: SKILL_KEY,\n make,\n};\n\nexport default skill;\n"],
5
+ "mappings": ";AAIA,SAASA,OAAOC,gBAAgB;AAChC,SAASC,YAAY;AAErB,SAASC,2BAA2B;AAEpC,IAAMC,YAAY;AAElB,IAAMC,OAAO,MACXL,MAAMK,KAAK;EACTC,KAAKF;EACLG,MAAM;EACNC,OAAOR,MAAMS,gBAAgB;IAAEC,YAAY;MAACP,oBAAoBQ;MAAMR,oBAAoBS;;EAAW,CAAA;EACrGC,cAAcZ,SAASI,KAAK;IAC1BS,QAAQZ;;;EAGV,CAAA;AACF,CAAA;AAEF,IAAMa,QAA0B;EAC9BT,KAAKF;EACLC;AACF;AAEA,IAAA,8BAAeU;",
6
+ "names": ["Skill", "Template", "trim", "TranscriptOperation", "SKILL_KEY", "make", "key", "name", "tools", "toolDefinitions", "operations", "Open", "Summarize", "instructions", "source", "skill"]
7
+ }
@@ -0,0 +1,182 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-J5LGTIGS.mjs";
4
+
5
+ // src/types/Settings.ts
6
+ var Settings_exports = {};
7
+ __export(Settings_exports, {
8
+ Settings: () => Settings
9
+ });
10
+ import * as Schema from "effect/Schema";
11
+ var Settings = Schema.mutable(Schema.Struct({
12
+ entityExtraction: Schema.optional(Schema.Boolean.annotations({
13
+ title: "Entity extraction",
14
+ description: "While transcribing, use the Assistant to detect and annotate mentions of known objects such as people or organizations."
15
+ })).pipe(Schema.withConstructorDefault(() => true)),
16
+ recordMode: Schema.optional(Schema.Literal("toggle", "hold").annotations({
17
+ title: "Record mode",
18
+ description: "Whether the mic toggles recording on each click, or records only while the control is held (push-to-talk)."
19
+ })).pipe(Schema.withConstructorDefault(() => "toggle")),
20
+ audioDeviceId: Schema.optional(Schema.String.annotations({
21
+ title: "Audio input device",
22
+ description: "Identifier of the microphone to capture from; empty uses the system default."
23
+ })),
24
+ transcribeAfterMs: Schema.optional(Schema.Number.annotations({
25
+ title: "Initial buffering (ms)",
26
+ description: "How long to accumulate audio before producing the first transcription."
27
+ })).pipe(Schema.withConstructorDefault(() => 4e3)),
28
+ streamMode: Schema.optional(Schema.Literal("batch", "word").annotations({
29
+ title: "Reveal mode",
30
+ description: "Whether transcribed text appears in batches or streams word-by-word."
31
+ })).pipe(Schema.withConstructorDefault(() => "word")),
32
+ wordIntervalMs: Schema.optional(Schema.Number.annotations({
33
+ title: "Word interval (ms)",
34
+ description: "Pacing between words when streaming word-by-word."
35
+ })).pipe(Schema.withConstructorDefault(() => 80))
36
+ }));
37
+
38
+ // src/types/TranscriptionCapabilities.ts
39
+ var TranscriptionCapabilities_exports = {};
40
+ __export(TranscriptionCapabilities_exports, {
41
+ EntityLookup: () => EntityLookup,
42
+ PipelineStatus: () => PipelineStatus,
43
+ RecordingSession: () => RecordingSession,
44
+ Settings: () => Settings2,
45
+ TranscriptionManagerProvider: () => TranscriptionManagerProvider
46
+ });
47
+ import { Capability } from "@dxos/app-framework";
48
+ import { meta } from "#meta";
49
+ var TranscriptionManagerProvider = Capability.make(`${meta.profile.key}.capability.transcription-manager`);
50
+ var Settings2 = Capability.make(`${meta.profile.key}.capability.settings`);
51
+ var RecordingSession = Capability.make(`${meta.profile.key}.capability.recording-session`);
52
+ var EntityLookup = Capability.make(`${meta.profile.key}.capability.entity-lookup`);
53
+ var PipelineStatus = Capability.make(`${meta.profile.key}.capability.pipeline-status`);
54
+
55
+ // src/types/TranscriptOperation.ts
56
+ var TranscriptOperation_exports = {};
57
+ __export(TranscriptOperation_exports, {
58
+ Create: () => Create,
59
+ EnrichMessage: () => EnrichMessage,
60
+ MessageWithRangeId: () => MessageWithRangeId,
61
+ Open: () => Open,
62
+ SentenceNormalization: () => SentenceNormalization,
63
+ SentenceNormalizationInput: () => SentenceNormalizationInput,
64
+ SentenceNormalizationOutput: () => SentenceNormalizationOutput,
65
+ Summarize: () => Summarize
66
+ });
67
+ import * as Schema2 from "effect/Schema";
68
+ import { AiService } from "@dxos/ai";
69
+ import { SpaceSchema } from "@dxos/client/echo";
70
+ import { Operation } from "@dxos/compute";
71
+ import { Database, DXN, Ref, Type } from "@dxos/echo";
72
+ import { Message, Transcript } from "@dxos/types";
73
+ import { meta as meta2 } from "#meta";
74
+ var makeKey = (name) => DXN.make(`${meta2.profile.key}.operation.${name}`);
75
+ var Create = Operation.make({
76
+ meta: {
77
+ key: makeKey("create"),
78
+ name: "Create Transcript",
79
+ icon: "ph--microphone--regular"
80
+ },
81
+ input: Schema2.Struct({
82
+ name: Schema2.optional(Schema2.String),
83
+ space: SpaceSchema
84
+ }),
85
+ output: Schema2.Struct({
86
+ object: Type.getSchema(Transcript.Transcript)
87
+ })
88
+ });
89
+ var MessageWithRangeId = Schema2.extend(Type.getSchema(Message.Message), Schema2.Struct({
90
+ rangeId: Schema2.optional(Schema2.Array(Schema2.String)).annotations({
91
+ description: "The IDs of the messages that contain the sentences."
92
+ })
93
+ }));
94
+ var Open = Operation.make({
95
+ meta: {
96
+ key: DXN.make("org.dxos.function.transcription.open"),
97
+ name: "Open",
98
+ description: "Opens and reads the contents of a transcription object.",
99
+ icon: "ph--folder-open--regular"
100
+ },
101
+ input: Schema2.Struct({
102
+ transcript: Ref.Ref(Transcript.Transcript).annotations({
103
+ description: "The ID of the transcription object."
104
+ })
105
+ }),
106
+ output: Schema2.Struct({
107
+ content: Schema2.String
108
+ }),
109
+ services: [
110
+ Database.Service
111
+ ]
112
+ });
113
+ var Summarize = Operation.make({
114
+ meta: {
115
+ key: DXN.make("org.dxos.function.transcription.summarize"),
116
+ name: "Summarize",
117
+ description: "Summarize a transcript of a meeting.",
118
+ icon: "ph--text-align-left--regular"
119
+ },
120
+ input: Schema2.Struct({
121
+ transcript: Schema2.String.annotations({
122
+ description: "The transcript of the meeting."
123
+ }),
124
+ notes: Schema2.optional(Schema2.String).annotations({
125
+ description: "Additional notes from the participants."
126
+ })
127
+ }),
128
+ output: Schema2.Struct({
129
+ summary: Schema2.String.annotations({
130
+ description: "The summary of the transcript."
131
+ })
132
+ }),
133
+ services: [
134
+ AiService.AiService
135
+ ]
136
+ }).pipe(Operation.visible);
137
+ var EnrichMessage = Operation.make({
138
+ meta: {
139
+ key: DXN.make("org.dxos.function.transcription.enrichMessage"),
140
+ name: "Enrich Transcript Message",
141
+ description: "Extract proper nouns from a transcript message and link them to objects in the space.",
142
+ icon: "ph--text-t--regular"
143
+ },
144
+ input: Schema2.Struct({
145
+ message: Type.getSchema(Message.Message)
146
+ }),
147
+ output: Schema2.Struct({
148
+ message: Type.getSchema(Message.Message)
149
+ }),
150
+ services: [
151
+ AiService.AiService,
152
+ Database.Service
153
+ ]
154
+ });
155
+ var SentenceNormalizationInput = Schema2.Struct({
156
+ messages: Schema2.Array(MessageWithRangeId).annotations({
157
+ description: "Messages to normalize into sentences."
158
+ })
159
+ });
160
+ var SentenceNormalizationOutput = Schema2.Struct({
161
+ sentences: Schema2.Array(MessageWithRangeId.pipe(Schema2.mutable)).pipe(Schema2.mutable).annotations({
162
+ description: "The sentences of the transcript."
163
+ })
164
+ });
165
+ var SentenceNormalization = Operation.make({
166
+ meta: {
167
+ key: DXN.make("org.dxos.function.transcription.sentenceNormalization"),
168
+ name: "Sentence Normalization",
169
+ description: "Post process of transcription for sentence normalization",
170
+ icon: "ph--text-t--regular"
171
+ },
172
+ input: SentenceNormalizationInput,
173
+ output: SentenceNormalizationOutput,
174
+ services: []
175
+ });
176
+
177
+ export {
178
+ Settings_exports,
179
+ TranscriptionCapabilities_exports,
180
+ TranscriptOperation_exports
181
+ };
182
+ //# sourceMappingURL=chunk-MDV7NBFJ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/Settings.ts", "../../../src/types/TranscriptionCapabilities.ts", "../../../src/types/TranscriptOperation.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nexport type RecordMode = 'toggle' | 'hold';\n\nexport const Settings = Schema.mutable(\n Schema.Struct({\n entityExtraction: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Entity extraction',\n description:\n 'While transcribing, use the Assistant to detect and annotate mentions of known objects such as people or organizations.',\n }),\n ).pipe(Schema.withConstructorDefault(() => true)),\n\n recordMode: Schema.optional(\n Schema.Literal('toggle', 'hold').annotations({\n title: 'Record mode',\n description:\n 'Whether the mic toggles recording on each click, or records only while the control is held (push-to-talk).',\n }),\n ).pipe(Schema.withConstructorDefault(() => 'toggle' as const)),\n\n audioDeviceId: Schema.optional(\n Schema.String.annotations({\n title: 'Audio input device',\n description: 'Identifier of the microphone to capture from; empty uses the system default.',\n }),\n ),\n\n transcribeAfterMs: Schema.optional(\n Schema.Number.annotations({\n title: 'Initial buffering (ms)',\n description: 'How long to accumulate audio before producing the first transcription.',\n }),\n ).pipe(Schema.withConstructorDefault(() => 4000)),\n\n streamMode: Schema.optional(\n Schema.Literal('batch', 'word').annotations({\n title: 'Reveal mode',\n description: 'Whether transcribed text appears in batches or streams word-by-word.',\n }),\n ).pipe(Schema.withConstructorDefault(() => 'word' as const)),\n\n wordIntervalMs: Schema.optional(\n Schema.Number.annotations({\n title: 'Word interval (ms)',\n description: 'Pacing between words when streaming word-by-word.',\n }),\n ).pipe(Schema.withConstructorDefault(() => 80)),\n }),\n);\n\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Space } from '@dxos/client/echo';\nimport { type Feed } from '@dxos/echo';\nimport { type EntityLookup as EntityLookupFn } from '@dxos/transcription-pipeline';\nimport { type Message } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport * as SettingsModule from './Settings';\n\n/**\n * Enriches a transcript message before it is written to the feed (e.g. entity linking).\n */\nexport type TranscriptMessageEnricher = (message: Message.Message) => Promise<Message.Message>;\n\n/**\n * Service contract for the meeting transcription manager. Consumers (e.g. plugin-meeting) depend on\n * this interface via the {@link TranscriptionManagerProvider} capability, not on the concrete\n * implementation, keeping the manager's browser/SDK dependencies out of consumer packages.\n */\nexport interface TranscriptionManager {\n readonly enabled: Atom.Atom<boolean>;\n setFeed(space: Space, feed: Feed.Feed): void;\n setAudioTrack(track?: MediaStreamTrack): Promise<void>;\n setRecording(recording?: boolean): void;\n setEnabled(enabled: boolean): Promise<void>;\n open(): Promise<this>;\n close(): Promise<this>;\n}\n\nexport type TranscriptionManagerProviderProps = {\n messageEnricher?: TranscriptMessageEnricher;\n};\n\nexport type TranscriptionManagerProvider = (props: TranscriptionManagerProviderProps) => TranscriptionManager;\n\nexport const TranscriptionManagerProvider = Capability.make<TranscriptionManagerProvider>(\n `${meta.profile.key}.capability.transcription-manager`,\n);\n\nexport const Settings = Capability.make<Atom.Writable<SettingsModule.Settings>>(\n `${meta.profile.key}.capability.settings`,\n);\n\n/**\n * The single active editor transcription session. `id` is the editor's attendable id (the key it\n * registered under in `MarkdownCapabilities.EditorViews`); `recording` gates audio capture. `null`\n * when no session is active.\n */\nexport type RecordingSession = { id: string; recording: boolean };\n\nexport const RecordingSession = Capability.make<Atom.Writable<RecordingSession | null>>(\n `${meta.profile.key}.capability.recording-session`,\n);\n\n/**\n * Resolves entity references for live-transcription enrichment. Backend-agnostic (full-text, vector,\n * a remote service, …) so the headless driver depends on the function, not the database.\n */\nexport type EntityLookup = EntityLookupFn;\n\nexport const EntityLookup = Capability.make<EntityLookupFn>(`${meta.profile.key}.capability.entity-lookup`);\n\n/**\n * Live transcription lifecycle, published by the driver for observers (toolbar spinner, testbench):\n * `recording` (mic capturing) → `draining` (mic off, finishing the pipeline) → `idle`.\n */\nexport type PipelinePhase = 'idle' | 'recording' | 'draining';\n\nexport const PipelineStatus = Capability.make<Atom.Writable<{ phase: PipelinePhase }>>(\n `${meta.profile.key}.capability.pipeline-status`,\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, DXN, Ref, Type } from '@dxos/echo';\n// Message and Person are used via Type.getSchema(Message.Message); they also appear in emitted .d.ts.\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { Message, type Person, Transcript } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport const Create = Operation.make({\n meta: { key: makeKey('create'), name: 'Create Transcript', icon: 'ph--microphone--regular' },\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n space: SpaceSchema,\n }),\n output: Schema.Struct({\n object: Type.getSchema(Transcript.Transcript),\n }),\n});\n\nexport const MessageWithRangeId = Schema.extend(\n Type.getSchema(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: DXN.make('org.dxos.function.transcription.open'),\n name: 'Open',\n description: 'Opens and reads the contents of a transcription object.',\n icon: 'ph--folder-open--regular',\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],\n});\n\nexport const Summarize = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.transcription.summarize'),\n name: 'Summarize',\n description: 'Summarize a transcript of a meeting.',\n icon: 'ph--text-align-left--regular',\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}).pipe(Operation.visible);\n\nexport const EnrichMessage = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.transcription.enrichMessage'),\n name: 'Enrich Transcript Message',\n description: 'Extract proper nouns from a transcript message and link them to objects in the space.',\n icon: 'ph--text-t--regular',\n },\n input: Schema.Struct({\n message: Type.getSchema(Message.Message),\n }),\n output: Schema.Struct({\n message: Type.getSchema(Message.Message),\n }),\n services: [AiService.AiService, Database.Service],\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: DXN.make('org.dxos.function.transcription.sentenceNormalization'),\n name: 'Sentence Normalization',\n description: 'Post process of transcription for sentence normalization',\n icon: 'ph--text-t--regular',\n },\n input: SentenceNormalizationInput,\n output: SentenceNormalizationOutput,\n services: [],\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "Settings", "mutable", "Struct", "entityExtraction", "optional", "Boolean", "annotations", "title", "description", "pipe", "withConstructorDefault", "recordMode", "Literal", "audioDeviceId", "String", "transcribeAfterMs", "Number", "streamMode", "wordIntervalMs", "Settings", "Capability", "meta", "TranscriptionManagerProvider", "make", "profile", "key", "RecordingSession", "EntityLookup", "PipelineStatus", "Schema", "AiService", "SpaceSchema", "Operation", "Database", "DXN", "Ref", "Type", "Message", "Transcript", "meta", "makeKey", "name", "make", "profile", "key", "Create", "icon", "input", "Struct", "optional", "String", "space", "output", "object", "getSchema", "MessageWithRangeId", "extend", "rangeId", "Array", "annotations", "description", "Open", "transcript", "content", "services", "Service", "Summarize", "notes", "summary", "pipe", "visible", "EnrichMessage", "message", "SentenceNormalizationInput", "messages", "SentenceNormalizationOutput", "sentences", "mutable", "SentenceNormalization"]
7
+ }
@@ -1,269 +1,125 @@
1
- import {
2
- DocumentAdapter
3
- } from "../chunk-MLRJWAQH.mjs";
4
1
  import "../chunk-J5LGTIGS.mjs";
5
2
 
6
- // src/components/Oracle/Oracle.tsx
7
- import { Primitive } from "@radix-ui/react-primitive";
8
- import { Slot } from "@radix-ui/react-slot";
9
- import React, { createContext, useContext, useMemo } from "react";
10
- import "@dxos/react-ui-graph/styles/graph.css";
11
- import { composableProps, slottable } from "@dxos/react-ui";
12
- import { TextBlock } from "@dxos/react-ui-components";
13
- import { SVG } from "@dxos/react-ui-graph";
14
- import { mx } from "@dxos/ui-theme";
15
- var OracleContext = /* @__PURE__ */ createContext(null);
16
- var useOracleContext = (consumer) => {
17
- const ctx = useContext(OracleContext);
18
- if (!ctx) {
19
- throw new Error(`<Oracle.${consumer}> must be rendered inside <Oracle.Root>`);
20
- }
21
- return ctx;
22
- };
23
- var Root = ({ children, text = "", delay = 12 }) => {
24
- const value = useMemo(() => ({
25
- text,
26
- delay
27
- }), [
28
- text,
29
- delay
3
+ // src/components/Mic/Mic.tsx
4
+ import React, { useCallback, useEffect, useRef, useState } from "react";
5
+ import { useAtomCapabilityState } from "@dxos/app-framework/ui";
6
+ import { MicButton, useTranslation } from "@dxos/react-ui";
7
+ import { useSoundEffect } from "@dxos/react-ui-audio";
8
+ import { MicSettings } from "@dxos/react-ui-transcription";
9
+ import { meta } from "#meta";
10
+ import { TranscriptionCapabilities } from "#types";
11
+ var Mic = ({ docId }) => {
12
+ const { t } = useTranslation(meta.profile.key);
13
+ const [session, setSession] = useAtomCapabilityState(TranscriptionCapabilities.RecordingSession);
14
+ const [settings, setSettings] = useAtomCapabilityState(TranscriptionCapabilities.Settings);
15
+ const recording = !!session?.recording && session.id === docId;
16
+ const soundStart = useSoundEffect("StartRecording");
17
+ const soundStop = useSoundEffect("StopRecording");
18
+ const wasRecording = useRef(recording);
19
+ useEffect(() => {
20
+ if (wasRecording.current === recording) {
21
+ return;
22
+ }
23
+ wasRecording.current = recording;
24
+ void (recording ? soundStart : soundStop).play();
25
+ }, [
26
+ recording,
27
+ soundStart,
28
+ soundStop
30
29
  ]);
31
- return /* @__PURE__ */ React.createElement(OracleContext.Provider, {
32
- value
33
- }, children);
34
- };
35
- var Content = slottable(({ children, asChild, ...props }, forwardedRef) => {
36
- const Comp = asChild ? Slot : Primitive.div;
37
- return /* @__PURE__ */ React.createElement(Comp, {
38
- ...composableProps(props, {
39
- classNames: "relative dx-expander"
40
- }),
41
- ref: forwardedRef
42
- }, children);
43
- });
44
- Content.displayName = "Oracle.Content";
45
- var Canvas = ({ classNames, children }) => /* @__PURE__ */ React.createElement(SVG.Root, {
46
- centered: true,
47
- classNames: mx("absolute inset-0", classNames)
48
- }, children ?? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(SVG.Markers, null), /* @__PURE__ */ React.createElement(SVG.Grid, null), /* @__PURE__ */ React.createElement(SVG.Zoom, {
49
- extent: [
50
- 1 / 4,
51
- 4
52
- ]
53
- }, /* @__PURE__ */ React.createElement(SVG.Graph, null))));
54
- var Text = ({ classNames }) => {
55
- const { text, delay } = useOracleContext("Text");
56
- return /* @__PURE__ */ React.createElement("div", {
57
- className: "pointer-events-none absolute inset-0 flex items-center justify-center"
58
- }, /* @__PURE__ */ React.createElement(TextBlock, {
59
- classNames: mx("max-w-xl px-6 py-4 text-center text-2xl font-medium text-balance text-subdued", classNames),
60
- text,
61
- delay
62
- }));
63
- };
64
- var Oracle = {
65
- Root,
66
- Content,
67
- Canvas,
68
- Text
69
- };
70
-
71
- // src/components/Transcription/Transcription.tsx
72
- import React2 from "react";
73
- import { useThemeContext } from "@dxos/react-ui";
74
- import { composable, composableProps as composableProps2 } from "@dxos/react-ui";
75
- import { useTextEditor } from "@dxos/react-ui-editor";
76
- import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, documentSlots, preview, scroller } from "@dxos/ui-editor";
77
-
78
- // src/components/Transcription/transcription-extension.ts
79
- import { RangeSetBuilder } from "@codemirror/state";
80
- import { EditorView, GutterMarker, ViewPlugin, gutter } from "@codemirror/view";
81
- import { format } from "date-fns/format";
82
- import { intervalToDuration } from "date-fns/intervalToDuration";
83
- import { addEventListener, combine } from "@dxos/async";
84
- var transcription = ({ model, started }) => {
85
- return [
86
- // Show timestamps in the gutter.
87
- gutter({
88
- class: "cm-timestamp-gutter",
89
- lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
90
- markers: (view) => {
91
- const start = getStartTime(started, model.chunks[0]);
92
- const builder = new RangeSetBuilder();
93
- for (const { from, to } of view.visibleRanges) {
94
- let line = view.state.doc.lineAt(from);
95
- while (line.from <= to) {
96
- const block = model.getChunkAtLine(line.number)?.blocks[0];
97
- const timestamp = block?._tag === "transcript" && block.started;
98
- if (timestamp) {
99
- builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
100
- }
101
- if (line.to + 1 > view.state.doc.length) {
102
- break;
103
- }
104
- line = view.state.doc.lineAt(line.to + 1);
105
- }
106
- }
107
- return builder.finish();
108
- }
109
- }),
110
- // Listen for model updates.
111
- ViewPlugin.fromClass(class {
112
- _controls;
113
- _cleanup;
114
- _adapter;
115
- _initialized = false;
116
- constructor(view) {
117
- this._adapter = new DocumentAdapter(view);
118
- const scroller2 = view.scrollDOM;
119
- let isAutoScrolling = false;
120
- let hasScrolled = false;
121
- let timeout;
122
- const scrollToBottom = (smooth = false) => {
123
- scroller2.style.scrollBehavior = smooth ? "smooth" : "";
124
- scroller2.classList.add("cm-hide-scrollbar");
125
- isAutoScrolling = true;
126
- clearTimeout(timeout);
127
- timeout = setTimeout(() => {
128
- this._controls?.classList.add("opacity-0");
129
- scroller2.classList.remove("cm-hide-scrollbar");
130
- isAutoScrolling = false;
131
- }, 500);
132
- view.dispatch({
133
- effects: EditorView.scrollIntoView(view.state.doc.length, {
134
- y: "end"
135
- })
136
- });
137
- };
138
- this._cleanup = combine(addEventListener(view.scrollDOM, "scroll", () => {
139
- if (!isAutoScrolling) {
140
- hasScrolled = true;
141
- this._controls?.classList.remove("opacity-0");
142
- }
143
- }), model.update.on(() => {
144
- const autoScroll = scroller2.scrollHeight - scroller2.scrollTop - scroller2.clientHeight === 0 || !hasScrolled;
145
- model.sync(this._adapter);
146
- if (autoScroll) {
147
- scrollToBottom(true);
148
- }
149
- }));
150
- }
151
- update(_update) {
152
- if (!this._initialized) {
153
- this._initialized = true;
154
- setTimeout(() => {
155
- model.sync(this._adapter);
156
- });
157
- }
158
- }
159
- destroy() {
160
- this._controls?.remove();
161
- this._cleanup();
30
+ const recordMode = settings?.recordMode ?? "toggle";
31
+ const entityExtraction = settings?.entityExtraction !== false;
32
+ const selectedDeviceId = settings?.audioDeviceId ?? "";
33
+ const [devices, setDevices] = useState([]);
34
+ useEffect(() => {
35
+ if (!navigator.mediaDevices?.enumerateDevices) {
36
+ return;
37
+ }
38
+ let cancelled = false;
39
+ const refresh = async () => {
40
+ const all = await navigator.mediaDevices.enumerateDevices();
41
+ if (cancelled) {
42
+ return;
162
43
  }
163
- }),
164
- EditorView.theme({
165
- ".cm-gutters": {
166
- backgroundColor: "var(--color-base-surface)"
167
- },
168
- ".cm-timestamp-gutter": {
169
- width: "6rem",
170
- paddingLeft: "0.5rem",
171
- paddingRight: "1rem"
172
- },
173
- ".cm-timestamp-gutter > .cm-gutterElement > div": {
174
- display: "inline-flex",
175
- textAlign: "right",
176
- padding: "3px"
177
- }
178
- })
179
- ];
180
- };
181
- var TimestampMarker = class extends GutterMarker {
182
- _line;
183
- _timestamp;
184
- _started;
185
- constructor(_line, _timestamp, _started) {
186
- super(), this._line = _line, this._timestamp = _timestamp, this._started = _started;
187
- }
188
- eq(other) {
189
- return this._timestamp === other._timestamp;
190
- }
191
- toDOM(view) {
192
- const el = document.createElement("div");
193
- el.className = "text-sm text-subdued hover:bg-hover-surface cursor-pointer";
194
- el.textContent = formatTimestamp(this._timestamp, this._started);
195
- el.onclick = () => {
196
- const pos = view.state.doc.line(this._line).from;
197
- view.dispatch({
198
- effects: EditorView.scrollIntoView(pos, {
199
- y: "start"
200
- })
201
- });
44
+ setDevices(all.filter((device) => device.kind === "audioinput" && device.deviceId).map((device, index) => ({
45
+ deviceId: device.deviceId,
46
+ label: device.label || `Microphone ${index + 1}`
47
+ })));
202
48
  };
203
- return el;
204
- }
205
- };
206
- var getStartTime = (started, message) => {
207
- if (started) {
208
- return started;
209
- }
210
- if (message?.blocks[0]?._tag === "transcript" && message.blocks[0].started) {
211
- return new Date(message.blocks[0].started);
212
- }
213
- return void 0;
214
- };
215
- var formatTimestamp = (timestamp, relative) => {
216
- if (relative) {
217
- const pad = (n = 0) => String(n).padStart(2, "0");
218
- const { hours, minutes, seconds } = intervalToDuration({
219
- start: relative,
220
- end: timestamp
221
- });
222
- return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
223
- } else {
224
- return format(timestamp, "HH:mm:ss");
225
- }
226
- };
227
-
228
- // src/components/Transcription/Transcription.tsx
229
- var Transcription = composable(({ transcript: object, model, children, ...props }, forwardedRef) => {
230
- const { themeMode } = useThemeContext();
231
- const { parentRef } = useTextEditor(() => {
232
- return {
233
- extensions: [
234
- createBasicExtensions({
235
- readOnly: true,
236
- lineWrapping: true,
237
- search: true
238
- }),
239
- createThemeExtensions({
240
- themeMode,
241
- slots: documentSlots
242
- }),
243
- createMarkdownExtensions(),
244
- decorateMarkdown(),
245
- preview(),
246
- transcription({
247
- model,
248
- started: object?.started ? new Date(object.started) : void 0
249
- }),
250
- scroller()
251
- ]
49
+ void refresh();
50
+ navigator.mediaDevices.addEventListener("devicechange", refresh);
51
+ return () => {
52
+ cancelled = true;
53
+ navigator.mediaDevices.removeEventListener("devicechange", refresh);
252
54
  };
55
+ }, []);
56
+ const handleToggle = useCallback(() => {
57
+ setSession((current) => current?.recording && current.id === docId ? null : {
58
+ id: docId,
59
+ recording: true
60
+ });
61
+ }, [
62
+ setSession,
63
+ docId
64
+ ]);
65
+ const handlePressStart = useCallback(() => {
66
+ setSession(() => ({
67
+ id: docId,
68
+ recording: true
69
+ }));
253
70
  }, [
254
- model,
255
- themeMode
71
+ setSession,
72
+ docId
256
73
  ]);
257
- return /* @__PURE__ */ React2.createElement("div", {
258
- ...composableProps2(props, {
259
- classNames: "dx-container"
260
- }),
261
- "data-popover-collision-boundary": true,
262
- ref: parentRef
263
- });
264
- });
74
+ const handlePressEnd = useCallback(() => {
75
+ setSession((current) => current?.id === docId ? null : current);
76
+ }, [
77
+ setSession,
78
+ docId
79
+ ]);
80
+ const handleRecordModeChange = useCallback((mode) => setSettings((current) => ({
81
+ ...current,
82
+ recordMode: mode
83
+ })), [
84
+ setSettings
85
+ ]);
86
+ const handleEntityExtractionChange = useCallback((value) => setSettings((current) => ({
87
+ ...current,
88
+ entityExtraction: value
89
+ })), [
90
+ setSettings
91
+ ]);
92
+ const handleSelectDevice = useCallback((deviceId) => setSettings((current) => ({
93
+ ...current,
94
+ audioDeviceId: deviceId || void 0
95
+ })), [
96
+ setSettings
97
+ ]);
98
+ const recordLabel = recording ? t("stop-recording.label") : recordMode === "hold" ? t("hold-to-record.label") : t("start-recording.label");
99
+ return /* @__PURE__ */ React.createElement("div", {
100
+ className: "flex items-center"
101
+ }, /* @__PURE__ */ React.createElement(MicButton, {
102
+ iconOnly: true,
103
+ variant: "ghost",
104
+ label: recordLabel,
105
+ recording,
106
+ mode: recordMode,
107
+ onToggle: handleToggle,
108
+ onPressStart: handlePressStart,
109
+ onPressEnd: handlePressEnd,
110
+ "data-testid": "transcription.record"
111
+ }), /* @__PURE__ */ React.createElement(MicSettings, {
112
+ translationNs: meta.profile.key,
113
+ recordMode,
114
+ entityExtraction,
115
+ devices,
116
+ selectedDeviceId,
117
+ onRecordModeChange: handleRecordModeChange,
118
+ onEntityExtractionChange: handleEntityExtractionChange,
119
+ onSelectDevice: handleSelectDevice
120
+ }));
121
+ };
265
122
  export {
266
- Oracle,
267
- Transcription
123
+ Mic
268
124
  };
269
125
  //# sourceMappingURL=index.mjs.map