@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/components/Oracle/Oracle.tsx", "../../../../src/components/Transcription/Transcription.tsx", "../../../../src/components/Transcription/transcription-extension.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type PropsWithChildren, createContext, useContext, useMemo } from 'react';\n\nimport '@dxos/react-ui-graph/styles/graph.css';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composableProps, slottable } from '@dxos/react-ui';\nimport { TextBlock } from '@dxos/react-ui-components';\nimport { SVG } from '@dxos/react-ui-graph';\nimport { mx } from '@dxos/ui-theme';\nimport { type SlottableProps } from '@dxos/ui-types';\n\n//\n// Context\n//\n\ntype OracleContextValue = {\n /** Latest utterance / phrase rendered by `Oracle.Text`. */\n text: string;\n /** Per-character reveal delay in ms for the streaming TextBlock. */\n delay: number;\n};\n\nconst OracleContext = createContext<OracleContextValue | null>(null);\n\nconst useOracleContext = (consumer: string): OracleContextValue => {\n const ctx = useContext(OracleContext);\n if (!ctx) {\n throw new Error(`<Oracle.${consumer}> must be rendered inside <Oracle.Root>`);\n }\n return ctx;\n};\n\n//\n// Root (headless — provides context only, renders no DOM)\n//\n\nexport type OracleRootProps = PropsWithChildren<{\n /** Latest utterance / phrase rendered by `Oracle.Text`. */\n text?: string;\n /** Per-character reveal delay in ms for the streaming TextBlock. @default 12 */\n delay?: number;\n}>;\n\n/**\n * Oracle surface root. Headless — provides text/delay context to subcomponents and renders\n * no DOM of its own. Wrap subcomponents in `<Oracle.Content>` for the standard relative\n * stacking layout, or place `<Oracle.Canvas>` / `<Oracle.Text>` inside any positioned\n * container of your choice.\n */\nconst Root = ({ children, text = '', delay = 12 }: OracleRootProps) => {\n const value = useMemo(() => ({ text, delay }), [text, delay]);\n return <OracleContext.Provider value={value}>{children}</OracleContext.Provider>;\n};\n\n//\n// Content\n//\n\nexport type OracleContentProps = SlottableProps;\n\n/**\n * Positioned container that stacks `Oracle.Canvas` (the SVG graph viewport, absolutely\n * positioned to fill) under `Oracle.Text` (the centered overlay). Use this for the standard\n * Oracle layout; skip it if you need custom positioning.\n *\n * Pass `asChild` to merge the positioning + sizing onto a parent slot (e.g. `Panel.Content`).\n */\nconst Content = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : Primitive.div;\n return (\n <Comp {...composableProps(props, { classNames: 'relative dx-expander' })} ref={forwardedRef}>\n {children}\n </Comp>\n );\n});\n\nContent.displayName = 'Oracle.Content';\n\n//\n// Canvas\n//\n\nexport type OracleCanvasProps = ThemedClassName<PropsWithChildren<{}>>;\n\n/**\n * SVG graph viewport. Renders sensible defaults (markers, grid, pan/zoom, empty graph)\n * when no children are supplied; consumers can replace those by passing their own\n * SVG.* children (e.g. a populated `<SVG.Graph model={…} />`).\n */\nconst Canvas = ({ classNames, children }: OracleCanvasProps) => (\n <SVG.Root centered classNames={mx('absolute inset-0', classNames)}>\n {children ?? (\n <>\n <SVG.Markers />\n <SVG.Grid />\n <SVG.Zoom extent={[1 / 4, 4]}>\n <SVG.Graph />\n </SVG.Zoom>\n </>\n )}\n </SVG.Root>\n);\n\n//\n// Text\n//\n\nexport type OracleTextProps = ThemedClassName<{}>;\n\n/**\n * Centered text overlay. Reads `text` and `delay` from `Oracle.Root` context and renders\n * a streaming `TextBlock` floating above the canvas. Pointer-events are disabled so the\n * underlying graph remains interactive.\n */\nconst Text = ({ classNames }: OracleTextProps) => {\n const { text, delay } = useOracleContext('Text');\n return (\n <div className='pointer-events-none absolute inset-0 flex items-center justify-center'>\n <TextBlock\n classNames={mx('max-w-xl px-6 py-4 text-center text-2xl font-medium text-balance text-subdued', classNames)}\n text={text}\n delay={delay}\n />\n </div>\n );\n};\n\n//\n// Namespace\n//\n\nexport const Oracle = {\n Root,\n Content,\n Canvas,\n Text,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\nimport { type Message, type Transcript } from '@dxos/types';\nimport {\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n decorateMarkdown,\n documentSlots,\n preview,\n scroller,\n} from '@dxos/ui-editor';\n\nimport { type SerializationModel } from '../../model';\nimport { transcription } from './transcription-extension';\n\nexport type TranscriptionProps = {\n transcript?: Transcript.Transcript;\n model: SerializationModel<Message.Message>;\n};\n\n// TODO(burdon): Remove forwardedRef/use react-ui-editor.\nexport const Transcription = composable<HTMLDivElement, TranscriptionProps>(\n ({ transcript: object, model, children, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n extensions: [\n createBasicExtensions({ readOnly: true, lineWrapping: true, search: true }),\n createThemeExtensions({ themeMode, slots: documentSlots }),\n createMarkdownExtensions(),\n decorateMarkdown(),\n preview(),\n transcription({ model, started: object?.started ? new Date(object.started) : undefined }),\n scroller(),\n ],\n };\n }, [model, themeMode]);\n\n return (\n <div\n {...composableProps(props, { classNames: 'dx-container' })}\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, GutterMarker, ViewPlugin, type ViewUpdate, gutter } from '@codemirror/view';\nimport { format } from 'date-fns/format';\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\n\nimport { type CleanupFn, addEventListener, combine } from '@dxos/async';\nimport { type Message } from '@dxos/types';\n\nimport { DocumentAdapter, type SerializationModel } from '../../model';\n\n/**\n * Data structure that maps Chunks queue to lines with transcript state.\n */\nexport type TranscriptionOptions = {\n model: SerializationModel<Message.Message>;\n started?: Date;\n};\n\n/**\n * Scrolling transcript with timestamps.\n */\nexport const transcription = ({ model, started }: TranscriptionOptions): Extension => {\n return [\n // Show timestamps in the gutter.\n gutter({\n class: 'cm-timestamp-gutter',\n lineMarkerChange: (update) => update.docChanged || update.viewportChanged,\n markers: (view) => {\n const start = getStartTime(started, model.chunks[0]);\n const builder = new RangeSetBuilder<GutterMarker>();\n for (const { from, to } of view.visibleRanges) {\n let line = view.state.doc.lineAt(from);\n while (line.from <= to) {\n const block = model.getChunkAtLine(line.number)?.blocks[0];\n const timestamp = block?._tag === 'transcript' && block.started;\n if (timestamp) {\n builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));\n }\n\n if (line.to + 1 > view.state.doc.length) {\n break;\n }\n\n line = view.state.doc.lineAt(line.to + 1);\n }\n }\n\n return builder.finish();\n },\n }),\n\n // Listen for model updates.\n ViewPlugin.fromClass(\n class {\n private readonly _controls?: HTMLDivElement;\n private readonly _cleanup: CleanupFn;\n private readonly _adapter: DocumentAdapter;\n private _initialized = false;\n\n constructor(view: EditorView) {\n this._adapter = new DocumentAdapter(view);\n\n const scroller = view.scrollDOM;\n let isAutoScrolling = false;\n let hasScrolled = false;\n\n let timeout: NodeJS.Timeout | undefined;\n const scrollToBottom = (smooth = false) => {\n scroller.style.scrollBehavior = smooth ? 'smooth' : '';\n\n // Temporarily hide scrollbar to prevent flicker.\n scroller.classList.add('cm-hide-scrollbar');\n isAutoScrolling = true;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n this._controls?.classList.add('opacity-0');\n scroller.classList.remove('cm-hide-scrollbar');\n isAutoScrolling = false;\n }, 500);\n\n // Scroll to bottom.\n view.dispatch({\n effects: EditorView.scrollIntoView(view.state.doc.length, { y: 'end' }),\n });\n };\n\n // Event listeners.\n this._cleanup = combine(\n addEventListener(view.scrollDOM, 'scroll', () => {\n if (!isAutoScrolling) {\n hasScrolled = true;\n this._controls?.classList.remove('opacity-0');\n }\n }),\n\n model.update.on(() => {\n // Check if clamped to bottom.\n const autoScroll =\n scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;\n\n // Sync.\n model.sync(this._adapter);\n\n // Scroll.\n if (autoScroll) {\n scrollToBottom(true);\n }\n }),\n );\n }\n\n update(_update: ViewUpdate) {\n // Initial sync.\n if (!this._initialized) {\n this._initialized = true;\n setTimeout(() => {\n model.sync(this._adapter);\n });\n }\n }\n\n destroy() {\n this._controls?.remove();\n this._cleanup();\n }\n },\n ),\n\n EditorView.theme({\n '.cm-gutters': {\n backgroundColor: 'var(--color-base-surface)',\n },\n '.cm-timestamp-gutter': {\n width: '6rem',\n paddingLeft: '0.5rem',\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter > .cm-gutterElement > div': {\n display: 'inline-flex',\n textAlign: 'right',\n padding: '3px',\n },\n }),\n ];\n};\n\n/**\n * Gutter marker that displays a timestamp.\n */\nclass TimestampMarker extends GutterMarker {\n constructor(\n readonly _line: number,\n readonly _timestamp: Date,\n readonly _started?: Date,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._timestamp === other._timestamp;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('div');\n el.className = 'text-sm text-subdued hover:bg-hover-surface cursor-pointer';\n el.textContent = formatTimestamp(this._timestamp, this._started);\n // TODO(burdon): Click to bookmark or copy hyperlink.\n el.onclick = () => {\n const pos = view.state.doc.line(this._line).from;\n view.dispatch({\n effects: EditorView.scrollIntoView(pos, { y: 'start' }),\n });\n };\n\n return el;\n }\n}\n\nconst getStartTime = (started?: Date, message?: Message.Message): Date | undefined => {\n if (started) {\n return started;\n }\n\n if (message?.blocks[0]?._tag === 'transcript' && message.blocks[0].started) {\n return new Date(message.blocks[0].started);\n }\n\n return undefined;\n};\n\nconst formatTimestamp = (timestamp: Date, relative?: Date) => {\n if (relative) {\n const pad = (n = 0) => String(n).padStart(2, '0');\n const { hours, minutes, seconds } = intervalToDuration({ start: relative, end: timestamp });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n } else {\n return format(timestamp, 'HH:mm:ss');\n }\n};\n"],
5
- "mappings": "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",
6
- "names": ["Primitive", "Slot", "React", "createContext", "useContext", "useMemo", "composableProps", "slottable", "TextBlock", "SVG", "mx", "OracleContext", "useOracleContext", "consumer", "ctx", "Error", "Root", "children", "text", "delay", "value", "Provider", "Content", "asChild", "props", "forwardedRef", "Comp", "div", "classNames", "ref", "displayName", "Canvas", "centered", "Markers", "Grid", "Zoom", "extent", "Graph", "Text", "className", "Oracle", "React", "useThemeContext", "composable", "composableProps", "useTextEditor", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "decorateMarkdown", "documentSlots", "preview", "scroller", "RangeSetBuilder", "EditorView", "GutterMarker", "ViewPlugin", "gutter", "format", "intervalToDuration", "addEventListener", "combine", "transcription", "model", "started", "gutter", "class", "lineMarkerChange", "update", "docChanged", "viewportChanged", "markers", "view", "start", "getStartTime", "chunks", "builder", "RangeSetBuilder", "from", "to", "visibleRanges", "line", "state", "doc", "lineAt", "block", "getChunkAtLine", "number", "blocks", "timestamp", "_tag", "add", "TimestampMarker", "Date", "length", "finish", "ViewPlugin", "fromClass", "_controls", "_cleanup", "_adapter", "_initialized", "DocumentAdapter", "scroller", "scrollDOM", "isAutoScrolling", "hasScrolled", "timeout", "scrollToBottom", "smooth", "style", "scrollBehavior", "classList", "clearTimeout", "setTimeout", "remove", "dispatch", "effects", "EditorView", "scrollIntoView", "y", "combine", "addEventListener", "on", "autoScroll", "scrollHeight", "scrollTop", "clientHeight", "sync", "_update", "destroy", "theme", "backgroundColor", "width", "paddingLeft", "paddingRight", "display", "textAlign", "padding", "GutterMarker", "_line", "_timestamp", "_started", "eq", "other", "toDOM", "el", "document", "createElement", "className", "textContent", "formatTimestamp", "onclick", "pos", "message", "undefined", "relative", "pad", "n", "String", "padStart", "hours", "minutes", "seconds", "intervalToDuration", "end", "format", "Transcription", "composable", "transcript", "object", "model", "children", "props", "forwardedRef", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "extensions", "createBasicExtensions", "readOnly", "lineWrapping", "search", "createThemeExtensions", "slots", "documentSlots", "createMarkdownExtensions", "decorateMarkdown", "preview", "transcription", "started", "Date", "undefined", "scroller", "React", "div", "composableProps", "classNames", "data-popover-collision-boundary", "ref"]
3
+ "sources": ["../../../../src/components/Mic/Mic.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAtomCapabilityState } from '@dxos/app-framework/ui';\nimport { MicButton, useTranslation } from '@dxos/react-ui';\nimport { useSoundEffect } from '@dxos/react-ui-audio';\nimport { type AudioInputDevice, MicSettings } from '@dxos/react-ui-transcription';\n\nimport { meta } from '#meta';\nimport { type Settings, TranscriptionCapabilities } from '#types';\n\nexport type MicProps = {\n /** Attendable id of the target editor; keys the recording session. */\n docId: string;\n};\n\n/**\n * Connects the {@link MicButton} and {@link MicSettings} to the recording session and settings\n * capabilities, and enumerates available audio inputs. Mounted from the toolbar's custom action, so\n * capability hooks resolve.\n */\nexport const Mic = ({ docId }: MicProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [session, setSession] = useAtomCapabilityState(TranscriptionCapabilities.RecordingSession);\n const [settings, setSettings] = useAtomCapabilityState(TranscriptionCapabilities.Settings);\n\n const recording = !!session?.recording && session.id === docId;\n\n // Play start/stop cues as this session's recording flag flips (skip the initial mount).\n const soundStart = useSoundEffect('StartRecording');\n const soundStop = useSoundEffect('StopRecording');\n const wasRecording = useRef(recording);\n useEffect(() => {\n if (wasRecording.current === recording) {\n return;\n }\n wasRecording.current = recording;\n void (recording ? soundStart : soundStop).play();\n }, [recording, soundStart, soundStop]);\n\n const recordMode: Settings.RecordMode = settings?.recordMode ?? 'toggle';\n const entityExtraction = settings?.entityExtraction !== false;\n const selectedDeviceId = settings?.audioDeviceId ?? '';\n\n const [devices, setDevices] = useState<AudioInputDevice[]>([]);\n useEffect(() => {\n if (!navigator.mediaDevices?.enumerateDevices) {\n return;\n }\n let cancelled = false;\n const refresh = async () => {\n const all = await navigator.mediaDevices.enumerateDevices();\n if (cancelled) {\n return;\n }\n // Labels are blank until microphone permission is granted; fall back to an ordinal name.\n setDevices(\n all\n .filter((device) => device.kind === 'audioinput' && device.deviceId)\n .map((device, index) => ({\n deviceId: device.deviceId,\n label: device.label || `Microphone ${index + 1}`,\n })),\n );\n };\n void refresh();\n navigator.mediaDevices.addEventListener('devicechange', refresh);\n return () => {\n cancelled = true;\n navigator.mediaDevices.removeEventListener('devicechange', refresh);\n };\n }, []);\n\n const handleToggle = useCallback(() => {\n setSession((current) => (current?.recording && current.id === docId ? null : { id: docId, recording: true }));\n }, [setSession, docId]);\n\n const handlePressStart = useCallback(() => {\n setSession(() => ({ id: docId, recording: true }));\n }, [setSession, docId]);\n\n const handlePressEnd = useCallback(() => {\n // Only stop our own session; a stray release must not clear another editor's recording.\n setSession((current) => (current?.id === docId ? null : current));\n }, [setSession, docId]);\n\n const handleRecordModeChange = useCallback(\n (mode: Settings.RecordMode) => setSettings((current) => ({ ...current, recordMode: mode })),\n [setSettings],\n );\n\n const handleEntityExtractionChange = useCallback(\n (value: boolean) => setSettings((current) => ({ ...current, entityExtraction: value })),\n [setSettings],\n );\n\n const handleSelectDevice = useCallback(\n (deviceId: string) => setSettings((current) => ({ ...current, audioDeviceId: deviceId || undefined })),\n [setSettings],\n );\n\n const recordLabel = recording\n ? t('stop-recording.label')\n : recordMode === 'hold'\n ? t('hold-to-record.label')\n : t('start-recording.label');\n\n return (\n <div className='flex items-center'>\n <MicButton\n iconOnly\n variant='ghost'\n label={recordLabel}\n recording={recording}\n mode={recordMode}\n onToggle={handleToggle}\n onPressStart={handlePressStart}\n onPressEnd={handlePressEnd}\n data-testid='transcription.record'\n />\n <MicSettings\n translationNs={meta.profile.key}\n recordMode={recordMode}\n entityExtraction={entityExtraction}\n devices={devices}\n selectedDeviceId={selectedDeviceId}\n onRecordModeChange={handleRecordModeChange}\n onEntityExtractionChange={handleEntityExtractionChange}\n onSelectDevice={handleSelectDevice}\n />\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useRef", "useState", "useAtomCapabilityState", "MicButton", "useTranslation", "useSoundEffect", "MicSettings", "meta", "TranscriptionCapabilities", "Mic", "docId", "t", "profile", "key", "session", "setSession", "RecordingSession", "settings", "setSettings", "Settings", "recording", "id", "soundStart", "soundStop", "wasRecording", "current", "play", "recordMode", "entityExtraction", "selectedDeviceId", "audioDeviceId", "devices", "setDevices", "navigator", "mediaDevices", "enumerateDevices", "cancelled", "refresh", "all", "filter", "device", "kind", "deviceId", "map", "index", "label", "addEventListener", "removeEventListener", "handleToggle", "handlePressStart", "handlePressEnd", "handleRecordModeChange", "mode", "handleEntityExtractionChange", "value", "handleSelectDevice", "undefined", "recordLabel", "div", "className", "iconOnly", "variant", "onToggle", "onPressStart", "onPressEnd", "data-testid", "translationNs", "onRecordModeChange", "onEntityExtractionChange", "onSelectDevice"]
7
7
  }
@@ -2,7 +2,7 @@ import "../chunk-J5LGTIGS.mjs";
2
2
 
3
3
  // src/containers/index.ts
4
4
  import { lazy } from "react";
5
- var TranscriptionArticle = lazy(() => import("../TranscriptionArticle-L6XANBH5.mjs"));
5
+ var TranscriptionArticle = lazy(() => import("../TranscriptionArticle-FEWCWG4A.mjs"));
6
6
  export {
7
7
  TranscriptionArticle
8
8
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TranscriptOperation_exports
3
- } from "./chunk-KMT3BMMQ.mjs";
3
+ } from "./chunk-MDV7NBFJ.mjs";
4
4
  import "./chunk-J5LGTIGS.mjs";
5
5
 
6
6
  // src/operations/create.ts
@@ -18,4 +18,4 @@ var create_default = handler;
18
18
  export {
19
19
  create_default as default
20
20
  };
21
- //# sourceMappingURL=create-RVR7VC33.mjs.map
21
+ //# sourceMappingURL=create-HNHGCKZ4.mjs.map
@@ -0,0 +1,24 @@
1
+ import {
2
+ TranscriptOperation_exports
3
+ } from "./chunk-MDV7NBFJ.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/enrich-message.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { enrichTranscriptMessage } from "@dxos/assistant/extraction";
9
+ import { Operation } from "@dxos/compute";
10
+ import { Database } from "@dxos/echo";
11
+ var handler = TranscriptOperation_exports.EnrichMessage.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ message }) {
12
+ const { db } = yield* Database.Service;
13
+ const enriched = yield* enrichTranscriptMessage(message, {
14
+ db
15
+ });
16
+ return {
17
+ message: enriched
18
+ };
19
+ })));
20
+ var enrich_message_default = handler;
21
+ export {
22
+ enrich_message_default as default
23
+ };
24
+ //# sourceMappingURL=enrich-message-DSJU4TXC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/enrich-message.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { enrichTranscriptMessage } from '@dxos/assistant/extraction';\nimport { Operation } from '@dxos/compute';\nimport { Database } from '@dxos/echo';\n\nimport { TranscriptOperation } from '../types';\n\n/**\n * Extracts proper nouns from a transcript message and links them to objects in the space via\n * full-text search, rewriting the text with reference links.\n */\nconst handler: Operation.WithHandler<typeof TranscriptOperation.EnrichMessage> = TranscriptOperation.EnrichMessage.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ message }) {\n const { db } = yield* Database.Service;\n const enriched = yield* enrichTranscriptMessage(message, { db });\n return { message: enriched };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,+BAA+B;AACxC,SAASC,iBAAiB;AAC1B,SAASC,gBAAgB;AAQzB,IAAMC,UAA2EC,4BAAoBC,cAAcC,KACjHC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,QAAO,GAAE;AACtC,QAAM,EAAEC,GAAE,IAAK,OAAOC,SAASC;AAC/B,QAAMC,WAAW,OAAOC,wBAAwBL,SAAS;IAAEC;EAAG,CAAA;AAC9D,SAAO;IAAED,SAASI;EAAS;AAC7B,CAAA,CAAA,CAAA;AAIJ,IAAA,yBAAeX;",
6
+ "names": ["Effect", "enrichTranscriptMessage", "Operation", "Database", "handler", "TranscriptOperation", "EnrichMessage", "pipe", "Operation", "withHandler", "fnUntraced", "message", "db", "Database", "Service", "enriched", "enrichTranscriptMessage"]
7
+ }
@@ -0,0 +1,25 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/entity-lookup.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { Capability } from "@dxos/app-framework";
6
+ import { AppSpace } from "@dxos/app-toolkit";
7
+ import { ClientCapabilities } from "@dxos/plugin-client";
8
+ import { makeDatabaseLookup } from "@dxos/transcription-pipeline";
9
+ import { TranscriptionCapabilities } from "#types";
10
+ var entity_lookup_default = Capability.makeModule(Effect.fnUntraced(function* () {
11
+ const capabilities = yield* Capability.Service;
12
+ const lookup = async (noun, context) => {
13
+ const client = capabilities.get(ClientCapabilities.Client);
14
+ const space = AppSpace.getPersonalSpace(client);
15
+ if (!space) {
16
+ return [];
17
+ }
18
+ return makeDatabaseLookup(space.db)(noun, context);
19
+ };
20
+ return Capability.contributes(TranscriptionCapabilities.EntityLookup, lookup);
21
+ }));
22
+ export {
23
+ entity_lookup_default as default
24
+ };
25
+ //# sourceMappingURL=entity-lookup-PCDW7NC4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/entity-lookup.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppSpace } from '@dxos/app-toolkit';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { type EntityLookup, makeDatabaseLookup } from '@dxos/transcription-pipeline';\n\nimport { TranscriptionCapabilities } from '#types';\n\n/**\n * Contributes an {@link EntityLookup} backed by the personal space's full-text index. Resolved lazily\n * per call so it reflects the current space. Consumers (e.g. the live-transcription driver) depend on\n * this function rather than the database — swap the backend (vector, space-aware, remote) here.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n const lookup: EntityLookup = async (noun, context) => {\n const client = capabilities.get(ClientCapabilities.Client);\n const space = AppSpace.getPersonalSpace(client);\n if (!space) {\n return [];\n }\n return makeDatabaseLookup(space.db)(noun, context);\n };\n return Capability.contributes(TranscriptionCapabilities.EntityLookup, lookup);\n }),\n);\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,gBAAgB;AACzB,SAASC,0BAA0B;AACnC,SAA4BC,0BAA0B;AAEtD,SAASC,iCAAiC;AAO1C,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,QAAMC,eAAe,OAAOP,WAAWQ;AACvC,QAAMC,SAAuB,OAAOC,MAAMC,YAAAA;AACxC,UAAMC,SAASL,aAAaM,IAAIX,mBAAmBY,MAAM;AACzD,UAAMC,QAAQd,SAASe,iBAAiBJ,MAAAA;AACxC,QAAI,CAACG,OAAO;AACV,aAAO,CAAA;IACT;AACA,WAAOZ,mBAAmBY,MAAME,EAAE,EAAEP,MAAMC,OAAAA;EAC5C;AACA,SAAOX,WAAWkB,YAAYd,0BAA0Be,cAAcV,MAAAA;AACxE,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "AppSpace", "ClientCapabilities", "makeDatabaseLookup", "TranscriptionCapabilities", "makeModule", "fnUntraced", "capabilities", "Service", "lookup", "noun", "context", "client", "get", "Client", "space", "getPersonalSpace", "db", "contributes", "EntityLookup"]
7
+ }
@@ -1,19 +1,97 @@
1
- import {
2
- useAudioFile,
3
- useAudioTrack,
4
- useFeedModelAdapter,
5
- useTranscriber,
6
- useTranscriptionRecording,
7
- useVoiceInput
8
- } from "../chunk-TO77KAQK.mjs";
9
- import "../chunk-MLRJWAQH.mjs";
10
1
  import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/hooks/useTranscriptionRecording.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { useCallback, useEffect, useState } from "react";
6
+ import { useAtomCapability, useOperationInvoker } from "@dxos/app-framework/ui";
7
+ import { Database, Feed, Obj } from "@dxos/echo";
8
+ import { EffectEx } from "@dxos/effect";
9
+ import { log } from "@dxos/log";
10
+ import { getSpace } from "@dxos/react-client/echo";
11
+ import { useIdentity } from "@dxos/react-client/halo";
12
+ import { useAudioTrack, useTranscriber } from "@dxos/react-ui-transcription";
13
+ import { Message } from "@dxos/types";
14
+ import { TranscriptionCapabilities, TranscriptOperation } from "#types";
15
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useTranscriptionRecording.ts";
16
+ var useTranscriptionRecording = (transcript) => {
17
+ const space = getSpace(transcript);
18
+ const identity = useIdentity();
19
+ const feed = transcript.feed.target;
20
+ const [recording, setRecording] = useState(false);
21
+ const track = useAudioTrack(recording);
22
+ const { invokePromise } = useOperationInvoker();
23
+ const settings = useAtomCapability(TranscriptionCapabilities.Settings);
24
+ const handleSegments = useCallback(async (blocks) => {
25
+ if (!space || !feed || blocks.length === 0) {
26
+ return;
27
+ }
28
+ const sender = identity ? {
29
+ identityDid: identity.did,
30
+ name: identity.profile?.displayName
31
+ } : {};
32
+ let message = Obj.make(Message.Message, {
33
+ sender,
34
+ created: (/* @__PURE__ */ new Date()).toISOString(),
35
+ blocks
36
+ });
37
+ if (settings?.entityExtraction ?? true) {
38
+ const { data, error } = await invokePromise(TranscriptOperation.EnrichMessage, {
39
+ message
40
+ }, {
41
+ spaceId: space.id
42
+ });
43
+ if (error) {
44
+ log.warn("entity extraction failed; using raw transcript", {
45
+ error
46
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 51, S: void 0 });
47
+ } else if (data?.message) {
48
+ message = data.message;
49
+ }
50
+ }
51
+ await Feed.append(feed, [
52
+ message
53
+ ]).pipe(Effect.provide(Database.layer(space.db)), EffectEx.runAndForwardErrors);
54
+ }, [
55
+ space,
56
+ feed,
57
+ identity,
58
+ invokePromise,
59
+ settings
60
+ ]);
61
+ const transcriber = useTranscriber({
62
+ audioStreamTrack: track,
63
+ onSegments: handleSegments
64
+ });
65
+ useEffect(() => {
66
+ if (!transcriber) {
67
+ return;
68
+ }
69
+ let cancelled = false;
70
+ void transcriber.open().then(() => {
71
+ if (!cancelled && recording) {
72
+ transcriber.startChunksRecording();
73
+ }
74
+ }, (err) => {
75
+ if (!cancelled) {
76
+ log.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 87, S: void 0 });
77
+ setRecording(false);
78
+ }
79
+ });
80
+ return () => {
81
+ cancelled = true;
82
+ transcriber.stopChunksRecording();
83
+ };
84
+ }, [
85
+ transcriber,
86
+ recording
87
+ ]);
88
+ const toggleRecording = useCallback(() => setRecording((value) => !value), []);
89
+ return {
90
+ recording,
91
+ toggleRecording
92
+ };
93
+ };
11
94
  export {
12
- useAudioFile,
13
- useAudioTrack,
14
- useFeedModelAdapter,
15
- useTranscriber,
16
- useTranscriptionRecording,
17
- useVoiceInput
95
+ useTranscriptionRecording
18
96
  };
19
97
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
3
+ "sources": ["../../../../src/hooks/useTranscriptionRecording.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAtomCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Database, Feed, Obj } from '@dxos/echo';\nimport { EffectEx } from '@dxos/effect';\nimport { log } from '@dxos/log';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useAudioTrack, useTranscriber } from '@dxos/react-ui-transcription';\nimport { Message, type Transcript } from '@dxos/types';\n\nimport { TranscriptionCapabilities, TranscriptOperation } from '#types';\n\nexport type TranscriptionRecording = {\n recording: boolean;\n toggleRecording: () => void;\n};\n\n/**\n * Drives the recording lifecycle for a transcript: opens an audio track, feeds it through the\n * transcriber, and appends transcribed message batches to the transcript's feed. Returns the\n * recording flag and a toggle callback for the caller to wire to UI.\n */\nexport const useTranscriptionRecording = (transcript: Transcript.Transcript): TranscriptionRecording => {\n const space = getSpace(transcript);\n const identity = useIdentity();\n const feed = transcript.feed.target;\n\n const [recording, setRecording] = useState(false);\n const track = useAudioTrack(recording);\n const { invokePromise } = useOperationInvoker();\n const settings = useAtomCapability(TranscriptionCapabilities.Settings);\n\n // Append a transcribed message batch to the transcript's feed, enriching it first (when entity\n // extraction is enabled) with references to known entities mentioned in the transcript.\n const handleSegments = useCallback(\n async (blocks: Message.Message['blocks']) => {\n if (!space || !feed || blocks.length === 0) {\n return;\n }\n const sender = identity ? { identityDid: identity.did, name: identity.profile?.displayName } : {};\n let message = Obj.make(Message.Message, {\n sender,\n created: new Date().toISOString(),\n blocks,\n });\n\n // `spaceId` provides the space context required by the process-affinity AiService/Database.\n // Fall back to the raw message if extraction fails (e.g. AI service unavailable).\n if (settings?.entityExtraction ?? true) {\n const { data, error } = await invokePromise(\n TranscriptOperation.EnrichMessage,\n { message },\n { spaceId: space.id },\n );\n if (error) {\n log.warn('entity extraction failed; using raw transcript', { error });\n } else if (data?.message) {\n message = data.message;\n }\n }\n\n await Feed.append(feed, [message]).pipe(Effect.provide(Database.layer(space.db)), EffectEx.runAndForwardErrors);\n },\n [space, feed, identity, invokePromise, settings],\n );\n\n // Drive the transcriber lifecycle off the recording flag + audio track.\n const transcriber = useTranscriber({ audioStreamTrack: track, onSegments: handleSegments });\n useEffect(() => {\n if (!transcriber) {\n return;\n }\n let cancelled = false;\n // If `open()` rejects (e.g. mic permission denied, device init failure) we must\n // clear `recording` — otherwise the toolbar button reports \"stop\" forever while\n // nothing is actually being captured.\n void transcriber.open().then(\n () => {\n if (!cancelled && recording) {\n transcriber.startChunksRecording();\n }\n },\n (err) => {\n if (!cancelled) {\n log.catch(err);\n setRecording(false);\n }\n },\n );\n return () => {\n cancelled = true;\n transcriber.stopChunksRecording();\n };\n }, [transcriber, recording]);\n\n const toggleRecording = useCallback(() => setRecording((value) => !value), []);\n\n return { recording, toggleRecording };\n};\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AACxB,SAASC,aAAaC,WAAWC,gBAAgB;AAEjD,SAASC,mBAAmBC,2BAA2B;AACvD,SAASC,UAAUC,MAAMC,WAAW;AACpC,SAASC,gBAAgB;AACzB,SAASC,WAAW;AACpB,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,eAAeC,sBAAsB;AAC9C,SAASC,eAAgC;AAEzC,SAASC,2BAA2BC,2BAA2B;AAO/D,IAAA,eAAA;AAOQC,IAAAA,4BAAWN,CAAAA,eAAAA;AACjB,QAAMO,QAAOC,SAAAA,UAAgBC;AAE7B,QAAM,WAACC,YAAWC;AAClB,QAAMC,OAAAA,WAAQX,KAAcS;AAC5B,QAAM,CAAA,WAAEG,YAAkBpB,IAAAA,SAAAA,KAAAA;AAC1B,QAAMqB,QAAAA,cAAWtB,SAAkBY;AAEnC,QAAA,EAAA,cAAA,IAAA,oBAAA;AACA,QAAA,WAAA,kBAAA,0BAAA,QAAA;yBAIM,YAAA,OAAA,WAAA;AACF,QAAA,CAAA,SAAA,CAAA,QAAA,OAAA,WAAA,GAAA;AACA;;UAAuDW,SAAMT,WAAgB;MAAkB,aAAC,SAAA;MAC5FU,MAAAA,SAAcC,SAAKd;QACrBe,CAAAA;QACAC,UAAS,IAAIC,KAAAA,QAAOC,SAAW;MAC/BC;MACF,UAAA,oBAAA,KAAA,GAAA,YAAA;MAEA;IACA,CAAA;kBAIMN,oBAAAA,MAAAA;AAAQ,YACV,EAAA,MAAA,MAAA,IAAA,MAAA,cAAA,oBAAA,eAAA;QAAEO;MAAkB,GAAA;QAElBC,SAAO,MAAA;;iBACoDA;AAAM,YAAA,KAAA,kDAAA;UAC9D;QACLR,GAAAA,EAAAA,YAAUS,YAAY,GAAA,cAAA,GAAA,IAAA,GAAA,OAAA,CAAA;MACxB,WAAA,MAAA,SAAA;AACF,kBAAA,KAAA;MAEA;;UAAmCC,KAAKtC,OAAOuC,MAAQjC;MAEzD;IAACkC,CAAAA,EAAAA,KAAAA,eAAAA,SAAAA,MAAAA,MAAAA,EAAAA,CAAAA,GAAAA,SAAAA,mBAAAA;;IAAatB;IAAUO;IAAeC;IAAS;IAGlD;EACA,CAAA;QAA8De,cAAYC,eAAAA;IAAe,kBAAA;IACzFxC,YAAU;;YAEN,MAAA;AACF,QAAA,CAAA,aAAA;AACIyC;IACJ;AACA,QAAA,YAAA;qBAKMC,KAAYC,EAAAA,KAAAA,MAAAA;AACd,UAAA,CAAA,aAAA,WAAA;AAEDC,oBAAAA,qBAAAA;MACC;gBACEpC;UACAa,CAAAA,WAAAA;AACF,YAAA,MAAA,KAAA,QAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,OAAA,CAAA;AACF,qBAAA,KAAA;MAEF;;WAEEqB,MAAAA;AACF,kBAAA;AACC,kBAAA,oBAAA;IAACA;;IAAuB;IAE3B;EAEA,CAAA;QAAStB,kBAAAA,YAAAA,MAAAA,aAAAA,CAAAA,UAAAA,CAAAA,KAAAA,GAAAA,CAAAA,CAAAA;SAAWyB;IAAgB;IACpC;;;",
6
+ "names": ["Effect", "useCallback", "useEffect", "useState", "useAtomCapability", "useOperationInvoker", "Database", "Feed", "Obj", "EffectEx", "log", "getSpace", "useIdentity", "useAudioTrack", "useTranscriber", "Message", "TranscriptionCapabilities", "TranscriptOperation", "identity", "feed", "transcript", "target", "recording", "setRecording", "track", "invokePromise", "settings", "name", "message", "make", "sender", "created", "Date", "toISOString", "blocks", "spaceId", "error", "data", "pipe", "provide", "space", "onSegments", "handleSegments", "cancelled", "transcriber", "startChunksRecording", "err", "toggleRecording"]
7
7
  }
@@ -1,44 +1,20 @@
1
- import {
2
- MediaStreamRecorder,
3
- Transcriber,
4
- TranscriptionManager,
5
- alignWhisperSegments
6
- } from "./chunk-TX3NQISZ.mjs";
7
- import {
8
- useAudioFile,
9
- useAudioTrack,
10
- useFeedModelAdapter,
11
- useTranscriber,
12
- useTranscriptionRecording,
13
- useVoiceInput
14
- } from "./chunk-TO77KAQK.mjs";
15
1
  import {
16
2
  meta
17
- } from "./chunk-FHNI26QW.mjs";
3
+ } from "./chunk-5BVHY75B.mjs";
18
4
  import {
5
+ Settings_exports,
19
6
  TranscriptOperation_exports,
20
7
  TranscriptionCapabilities_exports
21
- } from "./chunk-KMT3BMMQ.mjs";
22
- import "./chunk-KAEXRX3Y.mjs";
8
+ } from "./chunk-MDV7NBFJ.mjs";
23
9
  import {
24
- transcription_blueprint_default
25
- } from "./chunk-ZR4BH4QQ.mjs";
26
- import "./chunk-MLRJWAQH.mjs";
10
+ transcription_skill_default
11
+ } from "./chunk-KOXLGGSL.mjs";
27
12
  import "./chunk-J5LGTIGS.mjs";
28
13
  export {
29
- MediaStreamRecorder,
30
- Transcriber,
14
+ Settings_exports as Settings,
31
15
  TranscriptOperation_exports as TranscriptOperation,
32
- transcription_blueprint_default as TranscriptionBlueprint,
33
16
  TranscriptionCapabilities_exports as TranscriptionCapabilities,
34
- TranscriptionManager,
35
- alignWhisperSegments,
36
- meta,
37
- useAudioFile,
38
- useAudioTrack,
39
- useFeedModelAdapter,
40
- useTranscriber,
41
- useTranscriptionRecording,
42
- useVoiceInput
17
+ transcription_skill_default as TranscriptionSkill,
18
+ meta
43
19
  };
44
20
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,16 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/markdown-extension.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { Capability } from "@dxos/app-framework";
6
+ import { MarkdownCapabilities } from "@dxos/plugin-markdown/types";
7
+ import { pendingText } from "@dxos/ui-editor";
8
+ var markdown_extension_default = Capability.makeModule(Effect.fnUntraced(function* () {
9
+ return Capability.contributes(MarkdownCapabilities.ExtensionProvider, [
10
+ () => pendingText()
11
+ ]);
12
+ }));
13
+ export {
14
+ markdown_extension_default as default
15
+ };
16
+ //# sourceMappingURL=markdown-extension-CCDXXY7E.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/markdown-extension.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown/types';\nimport { pendingText } from '@dxos/ui-editor';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n // Every Markdown editor receives the pending-text extension so the transcription driver can\n // inject live text into it (the driver resolves the editor via `MarkdownCapabilities.EditorViews`).\n return Capability.contributes(MarkdownCapabilities.ExtensionProvider, [() => pendingText()]);\n }),\n);\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,4BAA4B;AACrC,SAASC,mBAAmB;AAE5B,IAAA,6BAAeF,WAAWG,WACjBC,kBAAW,aAAA;AAGhB,SAAOJ,WAAWK,YAAYJ,qBAAqBK,mBAAmB;IAAC,MAAMJ,YAAAA;GAAc;AAC7F,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "MarkdownCapabilities", "pendingText", "makeModule", "fnUntraced", "contributes", "ExtensionProvider"]
7
+ }