@dxos/plugin-transcription 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (251) hide show
  1. package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs → TranscriptContainer-JQ3HFHLQ.mjs} +2 -3
  2. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +191 -0
  3. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-G4B6CPC2.mjs +253 -0
  5. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-KLD7O5GJ.mjs → chunk-GU2BNYKZ.mjs} +12 -2
  7. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-K7FOYAXO.mjs +8 -0
  9. package/dist/lib/browser/chunk-K7FOYAXO.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-OGNXNGJB.mjs +73 -0
  11. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-3TKXI6TQ.mjs → chunk-YCZISX63.mjs} +81 -108
  13. package/dist/lib/browser/chunk-YCZISX63.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-LTIQFX4W.mjs → chunk-YEPT334A.mjs} +1 -1
  15. package/dist/lib/browser/chunk-YEPT334A.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +210 -47
  17. package/dist/lib/browser/index.mjs.map +4 -4
  18. package/dist/lib/browser/{intent-resolver-DZ62CJPC.mjs → intent-resolver-4R66ZCKT.mjs} +8 -8
  19. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +7 -0
  20. package/dist/lib/browser/{meeting-transcription-state-MNA2XROE.mjs → meeting-transcription-state-DLFHQK72.mjs} +4 -4
  21. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +7 -0
  22. package/dist/lib/browser/meta.json +1 -1
  23. package/dist/lib/browser/{react-surface-PUXZNAZL.mjs → react-surface-FQUHU5G7.mjs} +6 -18
  24. package/dist/lib/browser/react-surface-FQUHU5G7.mjs.map +7 -0
  25. package/dist/lib/browser/{transcriber-YWWIV6KP.mjs → transcriber-LGMIWDYI.mjs} +7 -8
  26. package/dist/lib/browser/{transcriber-YWWIV6KP.mjs.map → transcriber-LGMIWDYI.mjs.map} +3 -3
  27. package/dist/lib/browser/types/index.mjs +3 -3
  28. package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs → TranscriptContainer-QEYTTT2V.cjs} +7 -8
  29. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +7 -0
  30. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +200 -0
  31. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-J72PUQ3C.cjs → chunk-3KHUSQNW.cjs} +15 -6
  33. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-JUGOXWES.cjs → chunk-CZMLKKWT.cjs} +4 -4
  35. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-WKZLGVEJ.cjs → chunk-FCCJALOT.cjs} +83 -111
  37. package/dist/lib/node/chunk-FCCJALOT.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-L27AK6FQ.cjs → chunk-LP4FG423.cjs} +8 -23
  39. package/dist/lib/node/chunk-LP4FG423.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-EJWB53WK.cjs → chunk-P4VVD6ZO.cjs} +34 -24
  41. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +7 -0
  42. package/dist/lib/node/chunk-UOFHT4GZ.cjs +280 -0
  43. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +7 -0
  44. package/dist/lib/node/index.cjs +238 -66
  45. package/dist/lib/node/index.cjs.map +4 -4
  46. package/dist/lib/node/{intent-resolver-TRBKI24D.cjs → intent-resolver-WMMCOUEH.cjs} +10 -11
  47. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +7 -0
  48. package/dist/lib/node/{meeting-transcription-state-5XLTMWPA.cjs → meeting-transcription-state-URIYILEQ.cjs} +7 -7
  49. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +7 -0
  50. package/dist/lib/node/meta.json +1 -1
  51. package/dist/lib/node/{react-surface-SZAMHCX7.cjs → react-surface-WI2MGWCC.cjs} +10 -20
  52. package/dist/lib/node/react-surface-WI2MGWCC.cjs.map +7 -0
  53. package/dist/lib/node/{transcriber-AFUXFHCR.cjs → transcriber-QG5WPKX4.cjs} +13 -14
  54. package/dist/lib/node/{transcriber-AFUXFHCR.cjs.map → transcriber-QG5WPKX4.cjs.map} +3 -3
  55. package/dist/lib/node/types/index.cjs +8 -8
  56. package/dist/lib/node/types/index.cjs.map +1 -1
  57. package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs → TranscriptContainer-ZXUCOWGY.mjs} +2 -3
  58. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +192 -0
  59. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +254 -0
  61. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs +74 -0
  63. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-QMHMEKB3.mjs → chunk-HKATMD34.mjs} +12 -2
  65. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-J4D2RBBH.mjs +10 -0
  67. package/dist/lib/node-esm/chunk-J4D2RBBH.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-5E2MR5XK.mjs → chunk-PTZHDZ36.mjs} +1 -1
  69. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-V5IWBPYO.mjs → chunk-YQYBLFNI.mjs} +81 -108
  71. package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +210 -47
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/{intent-resolver-HFVAL274.mjs → intent-resolver-QN2LO5TX.mjs} +8 -8
  75. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +7 -0
  76. package/dist/lib/node-esm/{meeting-transcription-state-3WOZ52BQ.mjs → meeting-transcription-state-ZYVRAW6Y.mjs} +4 -4
  77. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-surface-UEJELL7I.mjs → react-surface-PCH6NTVB.mjs} +6 -18
  80. package/dist/lib/node-esm/react-surface-PCH6NTVB.mjs.map +7 -0
  81. package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs → transcriber-TMPYZ5L4.mjs} +7 -8
  82. package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs.map → transcriber-TMPYZ5L4.mjs.map} +3 -3
  83. package/dist/lib/node-esm/types/index.mjs +3 -3
  84. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/app-graph-builder.d.ts +179 -2
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/capabilities.d.ts +7 -5
  88. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/index.d.ts +182 -4
  90. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  92. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +4 -2
  94. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  97. package/dist/types/src/components/Transcript/Transcript.d.ts +4 -14
  98. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  99. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +4 -19
  100. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  102. package/dist/types/src/components/index.d.ts +0 -1
  103. package/dist/types/src/components/index.d.ts.map +1 -1
  104. package/dist/types/src/components/transcription.stories.d.ts +3 -6
  105. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  106. package/dist/types/src/hooks/index.d.ts +0 -1
  107. package/dist/types/src/hooks/index.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  110. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  111. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  112. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  113. package/dist/types/src/transcriber/transcriber.d.ts +2 -2
  114. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  115. package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
  116. package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
  117. package/dist/types/src/transcriber/transcription-manager.d.ts +15 -17
  118. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  119. package/dist/types/src/translations.d.ts +18 -3
  120. package/dist/types/src/translations.d.ts.map +1 -1
  121. package/dist/types/src/types/schema.d.ts +40 -26
  122. package/dist/types/src/types/schema.d.ts.map +1 -1
  123. package/dist/types/src/types/types.d.ts +7 -18
  124. package/dist/types/src/types/types.d.ts.map +1 -1
  125. package/dist/types/src/util/array.d.ts.map +1 -1
  126. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  127. package/dist/types/src/util/index.d.ts +1 -0
  128. package/dist/types/src/util/index.d.ts.map +1 -1
  129. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  130. package/dist/types/src/util/random-queue-dxn.d.ts +3 -0
  131. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -0
  132. package/dist/types/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +40 -57
  134. package/src/TranscriptionPlugin.tsx +13 -30
  135. package/src/capabilities/app-graph-builder.ts +111 -192
  136. package/src/capabilities/capabilities.ts +3 -4
  137. package/src/capabilities/index.ts +0 -1
  138. package/src/capabilities/intent-resolver.ts +7 -8
  139. package/src/capabilities/meeting-transcription-state.ts +2 -2
  140. package/src/capabilities/react-surface.tsx +4 -12
  141. package/src/capabilities/transcriber.ts +1 -2
  142. package/src/components/Transcript/Transcript.stories.tsx +43 -201
  143. package/src/components/Transcript/Transcript.tsx +208 -83
  144. package/src/components/TranscriptContainer.tsx +6 -11
  145. package/src/components/index.ts +0 -1
  146. package/src/components/transcription.stories.tsx +65 -164
  147. package/src/hooks/index.ts +0 -1
  148. package/src/hooks/useTranscriber.ts +2 -3
  149. package/src/transcriber/{transcriber.browser.test.ts → transcriber.test.ts} +3 -3
  150. package/src/transcriber/transcriber.ts +11 -20
  151. package/src/transcriber/transcription-manager.ts +58 -67
  152. package/src/translations.ts +0 -2
  153. package/src/types/schema.ts +32 -11
  154. package/src/types/types.ts +9 -19
  155. package/src/util/index.ts +1 -0
  156. package/src/util/random-queue-dxn.ts +9 -0
  157. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs +0 -351
  158. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-3TKXI6TQ.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-JHWEZRWC.mjs +0 -63
  161. package/dist/lib/browser/chunk-JHWEZRWC.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-K2LS2QOM.mjs +0 -720
  163. package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-LCTMCTYY.mjs +0 -27
  166. package/dist/lib/browser/chunk-LCTMCTYY.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-LTIQFX4W.mjs.map +0 -7
  168. package/dist/lib/browser/intent-resolver-DZ62CJPC.mjs.map +0 -7
  169. package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs.map +0 -7
  170. package/dist/lib/browser/react-surface-PUXZNAZL.mjs.map +0 -7
  171. package/dist/lib/browser/settings-JWDS4J3F.mjs +0 -24
  172. package/dist/lib/browser/settings-JWDS4J3F.mjs.map +0 -7
  173. package/dist/lib/node/TranscriptContainer-SSJVLRM6.cjs.map +0 -7
  174. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs +0 -352
  175. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs.map +0 -7
  176. package/dist/lib/node/chunk-EJWB53WK.cjs.map +0 -7
  177. package/dist/lib/node/chunk-EVE3H46F.cjs +0 -737
  178. package/dist/lib/node/chunk-EVE3H46F.cjs.map +0 -7
  179. package/dist/lib/node/chunk-J72PUQ3C.cjs.map +0 -7
  180. package/dist/lib/node/chunk-JUGOXWES.cjs.map +0 -7
  181. package/dist/lib/node/chunk-L27AK6FQ.cjs.map +0 -7
  182. package/dist/lib/node/chunk-WKZLGVEJ.cjs.map +0 -7
  183. package/dist/lib/node/intent-resolver-TRBKI24D.cjs.map +0 -7
  184. package/dist/lib/node/meeting-transcription-state-5XLTMWPA.cjs.map +0 -7
  185. package/dist/lib/node/react-surface-SZAMHCX7.cjs.map +0 -7
  186. package/dist/lib/node/settings-AWWMOSCV.cjs +0 -38
  187. package/dist/lib/node/settings-AWWMOSCV.cjs.map +0 -7
  188. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs +0 -352
  189. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-4KC3E5T4.mjs +0 -721
  191. package/dist/lib/node-esm/chunk-4KC3E5T4.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-5E2MR5XK.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs +0 -28
  194. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs.map +0 -7
  195. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +0 -7
  196. package/dist/lib/node-esm/chunk-QYG2FOXA.mjs +0 -64
  197. package/dist/lib/node-esm/chunk-QYG2FOXA.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-V5IWBPYO.mjs.map +0 -7
  199. package/dist/lib/node-esm/intent-resolver-HFVAL274.mjs.map +0 -7
  200. package/dist/lib/node-esm/meeting-transcription-state-3WOZ52BQ.mjs.map +0 -7
  201. package/dist/lib/node-esm/react-surface-UEJELL7I.mjs.map +0 -7
  202. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs +0 -25
  203. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs.map +0 -7
  204. package/dist/types/src/capabilities/settings.d.ts +0 -4
  205. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  206. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +0 -27
  207. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +0 -1
  208. package/dist/types/src/components/Transcript/transcript-extension.d.ts +0 -19
  209. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +0 -1
  210. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +0 -6
  211. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +0 -1
  212. package/dist/types/src/components/TranscriptionSettings/index.d.ts +0 -2
  213. package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +0 -1
  214. package/dist/types/src/entity-extraction/entity-extraction.d.ts +0 -42
  215. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +0 -1
  216. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +0 -2
  217. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  218. package/dist/types/src/entity-extraction/index.d.ts +0 -2
  219. package/dist/types/src/entity-extraction/index.d.ts.map +0 -1
  220. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -7
  221. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
  222. package/dist/types/src/model/index.d.ts +0 -2
  223. package/dist/types/src/model/index.d.ts.map +0 -1
  224. package/dist/types/src/model/model.d.ts +0 -68
  225. package/dist/types/src/model/model.d.ts.map +0 -1
  226. package/dist/types/src/model/model.test.d.ts +0 -2
  227. package/dist/types/src/model/model.test.d.ts.map +0 -1
  228. package/dist/types/src/testing/index.d.ts +0 -2
  229. package/dist/types/src/testing/index.d.ts.map +0 -1
  230. package/dist/types/src/testing/testing.d.ts +0 -40
  231. package/dist/types/src/testing/testing.d.ts.map +0 -1
  232. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +0 -2
  233. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +0 -1
  234. package/src/capabilities/settings.ts +0 -20
  235. package/src/components/Transcript/deprecated/OldTranscript.tsx +0 -260
  236. package/src/components/Transcript/transcript-extension.ts +0 -236
  237. package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +0 -26
  238. package/src/components/TranscriptionSettings/index.ts +0 -5
  239. package/src/entity-extraction/entity-extraction.test.ts +0 -97
  240. package/src/entity-extraction/entity-extraction.ts +0 -149
  241. package/src/entity-extraction/index.ts +0 -5
  242. package/src/entity-extraction/system-prompt.tpl +0 -38
  243. package/src/entity-extraction/types.d.ts +0 -8
  244. package/src/hooks/useQueueModelAdapter.ts +0 -63
  245. package/src/model/index.ts +0 -5
  246. package/src/model/model.test.ts +0 -169
  247. package/src/model/model.ts +0 -229
  248. package/src/testing/index.ts +0 -5
  249. package/src/testing/testing.ts +0 -216
  250. /package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs.map → TranscriptContainer-JQ3HFHLQ.mjs.map} +0 -0
  251. /package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs.map → TranscriptContainer-ZXUCOWGY.mjs.map} +0 -0
@@ -2,42 +2,45 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe, type Schema } from 'effect';
7
-
8
- import { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';
9
- import { AIServiceEdgeClient, type AIServiceClient } from '@dxos/assistant';
10
- import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
11
- import { Filter, fullyQualifiedId, getSpace, makeRef, Query, type Space } from '@dxos/client/echo';
12
- import { getSchemaTypename, isInstanceOf, type BaseEchoObject } from '@dxos/echo-schema';
5
+ import { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';
6
+ import { fullyQualifiedId, getSpace, makeRef, type Space } from '@dxos/client/echo';
7
+ import { generateName } from '@dxos/display-name';
8
+ import { getSchemaTypename, isInstanceOf } from '@dxos/echo-schema';
13
9
  import { invariant } from '@dxos/invariant';
14
- import { DXN } from '@dxos/keys';
15
- import { log } from '@dxos/log';
16
10
  import { ClientCapabilities } from '@dxos/plugin-client';
17
11
  import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';
18
- import { createExtension, rxFromSignal } from '@dxos/plugin-graph';
19
- import { DocumentType } from '@dxos/plugin-markdown/types';
12
+ import { createExtension, type Node } from '@dxos/plugin-graph';
20
13
  import { MeetingCapabilities, type CallState, type MediaState } from '@dxos/plugin-meeting';
21
- import { MeetingType, type MeetingCallProperties } from '@dxos/plugin-meeting/types';
22
- import { type buf } from '@dxos/protocols/buf';
23
- import { type TranscriptionPayloadSchema } from '@dxos/protocols/buf/dxos/edge/calls_pb';
24
- import { DataType } from '@dxos/schema';
14
+ import { MeetingType } from '@dxos/plugin-meeting/types';
15
+ import { buf } from '@dxos/protocols/buf';
16
+ import {
17
+ TranscriptionPayloadSchema,
18
+ type TranscriptionPayload as TranscriptionPayloadProto,
19
+ } from '@dxos/protocols/buf/dxos/edge/calls_pb';
20
+ import { keyToFallback } from '@dxos/util';
25
21
 
26
22
  import { TranscriptionCapabilities } from './capabilities';
27
- import { processTranscriptMessage } from '../entity-extraction';
28
23
  import { TRANSCRIPTION_PLUGIN } from '../meta';
29
24
  import { TranscriptionManager } from '../transcriber';
30
- import { TranscriptionAction, type TranscriptionSettingsProps, TranscriptType } from '../types';
25
+ import { TranscriptionAction, TranscriptType } from '../types';
31
26
 
32
27
  // TODO(wittjosiah): Factor out.
33
28
  // TODO(wittjosiah): Can we stop using protobuf for this?
34
29
  type TranscriptionPayload = buf.MessageInitShape<typeof TranscriptionPayloadSchema>;
30
+ const codec = {
31
+ encode: (message: TranscriptionPayload): Uint8Array => {
32
+ return buf.toBinary(TranscriptionPayloadSchema, buf.create(TranscriptionPayloadSchema, message));
33
+ },
34
+ decode: (message: Uint8Array): TranscriptionPayloadProto => {
35
+ return buf.fromBinary(TranscriptionPayloadSchema, message);
36
+ },
37
+ };
35
38
 
36
39
  const getMeetingTranscript = async (
37
- context: PluginContext,
40
+ context: PluginsContext,
38
41
  meeting: MeetingType,
39
42
  ): Promise<TranscriptType | undefined> => {
40
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
43
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
41
44
 
42
45
  const typename = getSchemaTypename(TranscriptType)!;
43
46
  const existing = await meeting.artifacts[typename]?.load();
@@ -53,181 +56,97 @@ const getMeetingTranscript = async (
53
56
  };
54
57
 
55
58
  // TODO(wittjosiah): Introduce a sound that plays when transcription is activated/deactivated.
56
- export default (context: PluginContext) =>
59
+ export default (context: PluginsContext) =>
57
60
  contributes(Capabilities.AppGraphBuilder, [
58
61
  createExtension({
59
62
  id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,
60
- actions: (node) =>
61
- Rx.make((get) =>
62
- pipe(
63
- get(node),
64
- Option.flatMap((node) => (isInstanceOf(MeetingType, node.data) ? Option.some(node.data) : Option.none())),
65
- Option.map((meeting) => {
66
- const state = context.getCapability(TranscriptionCapabilities.MeetingTranscriptionState);
67
- const enabled = get(rxFromSignal(() => state.enabled));
68
- return [
69
- {
70
- id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,
71
- data: async () => {
72
- // NOTE: We are not saving the state of the transcription manager here.
73
- // We expect the state to be updated through `onCallStateUpdated` once it is propagated through Swarm.
74
- // This is done to avoid race conditions and to not handle optimistic updates.
75
- const transcript = await getMeetingTranscript(context, meeting);
76
- invariant(transcript, 'Failed to create transcript');
77
-
78
- const callManager = context.getCapability(MeetingCapabilities.CallManager);
79
- callManager.setActivity(getSchemaTypename(TranscriptType)!, {
80
- queueDxn: transcript.queue.dxn.toString(),
81
- enabled: !enabled,
82
- });
83
- },
84
- properties: {
85
- label: enabled
86
- ? ['stop transcription label', { ns: TRANSCRIPTION_PLUGIN }]
87
- : ['start transcription label', { ns: TRANSCRIPTION_PLUGIN }],
88
- icon: 'ph--subtitles--regular',
89
- disposition: 'toolbar',
90
- classNames: enabled ? 'bg-callAlert' : '',
91
- },
92
- },
93
- ];
94
- }),
95
- Option.getOrElse(() => []),
96
- ),
97
- ),
98
- connector: (node) =>
99
- Rx.make((get) =>
100
- pipe(
101
- get(node),
102
- Option.flatMap((node) => (isInstanceOf(MeetingType, node.data) ? Option.some(node.data) : Option.none())),
103
- Option.map((meeting) => {
104
- const client = context.getCapability(ClientCapabilities.Client);
105
- const state = context.getCapability(TranscriptionCapabilities.MeetingTranscriptionState);
106
- const settingsStore = get(context.capabilities(Capabilities.SettingsStore))[0];
107
- const settings = get(
108
- rxFromSignal(() => settingsStore?.getStore<TranscriptionSettingsProps>(TRANSCRIPTION_PLUGIN)!.value),
109
- );
110
-
111
- // TODO(dmaretskyi): Request via capability.
112
- const aiClient: AIServiceClient | undefined = new AIServiceEdgeClient({
113
- // TODO(burdon): Get from config.
114
- endpoint: AI_SERVICE_ENDPOINT.REMOTE,
63
+ filter: (node): node is Node<MeetingType> =>
64
+ isInstanceOf(MeetingType, node.data) && node.type !== PLANK_COMPANION_TYPE,
65
+ actions: ({ node }) => {
66
+ const meeting = node.data;
67
+ const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
68
+ return [
69
+ {
70
+ id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,
71
+ data: async () => {
72
+ const call = context.requestCapability(MeetingCapabilities.CallManager);
73
+ invariant(state.transcriptionManager);
74
+ state.enabled = !state.enabled;
75
+ void state.transcriptionManager.setEnabled(state.enabled);
76
+ const transcript = await getMeetingTranscript(context, meeting);
77
+ invariant(transcript, 'Failed to create transcript');
78
+ call.setActivity(getSchemaTypename(TranscriptType)!, {
79
+ value: codec.encode({
80
+ enabled: state.enabled,
81
+ queueDxn: transcript.queue.dxn.toString(),
82
+ }),
115
83
  });
116
-
117
- return [
118
- {
119
- id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,
120
- type: PLANK_COMPANION_TYPE,
121
- data: get(rxFromSignal(() => meeting.artifacts[getSchemaTypename(TranscriptType)!]?.target)),
122
- properties: {
123
- label: ['transcript companion label', { ns: TRANSCRIPTION_PLUGIN }],
124
- icon: 'ph--subtitles--regular',
125
- position: 'hoist',
126
- disposition: 'hidden',
127
- schema: TranscriptType,
128
- getIntent: ({ space }: { space: Space }) =>
129
- createIntent(TranscriptionAction.Create, { spaceId: space.id }),
130
-
131
- // TODO(burdon): Is this the right place to inisitalize the state? Change to a capability?
132
- onJoin: async ({ meeting }: { meeting?: MeetingType }) => {
133
- const identity = client.halo.identity.get();
134
- invariant(identity);
135
- const space = getSpace(meeting);
136
- invariant(space);
137
-
138
- let messageEnricher;
139
- if (aiClient && settings.entityExtraction) {
140
- messageEnricher = createEntityExtractionEnricher({
141
- aiClient,
142
- // TODO(dmaretskyi): Have those be discovered from the schema graph or contributed by capabilities?
143
- // This forced me to add a dependency on markdown plugin.
144
- // This will be replaced with a vector search index anyway, so its not a big deal.
145
- contextTypes: [DocumentType, DataType.Person, DataType.Organization],
146
- space,
147
- });
148
- }
149
-
150
- // TODO(burdon): The TranscriptionManager singleton is part of the state and should just be updated here.
151
- state.transcriptionManager = await new TranscriptionManager({
152
- edgeClient: client.edge,
153
- messageEnricher,
154
- })
155
- .setIdentityDid(identity.did)
156
- .open();
157
- },
158
- onLeave: async () => {
159
- await state.transcriptionManager?.close();
160
- state.transcriptionManager = undefined;
161
- state.enabled = false;
162
- },
163
- onCallStateUpdated: async (callState: CallState) => {
164
- const typename = getSchemaTypename(TranscriptType);
165
- const transcription = typename ? callState.activities?.[typename] : undefined;
166
- if (!transcription?.payload) {
167
- return;
168
- }
169
-
170
- const payload: TranscriptionPayload = transcription.payload;
171
- state.enabled = !!payload.enabled;
172
- if (payload.queueDxn) {
173
- // NOTE: Must set queue before enabling transcription.
174
- state.transcriptionManager?.setQueue(DXN.parse(payload.queueDxn));
175
- }
176
- await state.transcriptionManager?.setEnabled(payload.enabled);
177
- },
178
- onMediaStateUpdated: async ([mediaState, isSpeaking]: [MediaState, boolean]) => {
179
- void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);
180
- void state.transcriptionManager?.setRecording(isSpeaking);
181
- },
182
- } satisfies MeetingCallProperties,
183
- },
184
- ];
185
- }),
186
- Option.getOrElse(() => []),
187
- ),
188
- ),
84
+ },
85
+ properties: {
86
+ label: state.enabled
87
+ ? ['stop transcription label', { ns: TRANSCRIPTION_PLUGIN }]
88
+ : ['start transcription label', { ns: TRANSCRIPTION_PLUGIN }],
89
+ icon: 'ph--record--regular',
90
+ disposition: 'toolbar',
91
+ classNames: state.enabled ? 'text-activeInCall' : '',
92
+ },
93
+ },
94
+ ];
95
+ },
96
+ connector: ({ node }) => {
97
+ const meeting = node.data;
98
+ const client = context.requestCapability(ClientCapabilities.Client);
99
+ const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
100
+
101
+ return [
102
+ {
103
+ id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,
104
+ type: PLANK_COMPANION_TYPE,
105
+ data: meeting.artifacts[getSchemaTypename(TranscriptType)!]?.target,
106
+ properties: {
107
+ label: ['transcript companion label', { ns: TRANSCRIPTION_PLUGIN }],
108
+ icon: 'ph--subtitles--regular',
109
+ disposition: 'hidden',
110
+ schema: TranscriptType,
111
+ getIntent: ({ space }: { space: Space }) =>
112
+ createIntent(TranscriptionAction.Create, { spaceId: space.id }),
113
+ onJoin: () => {
114
+ const transcriptionManager = new TranscriptionManager(client.edge);
115
+ const identity = client.halo.identity.get();
116
+ invariant(identity);
117
+ transcriptionManager.setName(
118
+ identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
119
+ );
120
+ const fallbackValue = keyToFallback(identity!.identityKey);
121
+ const userHue = identity!.profile?.data?.hue || fallbackValue.hue;
122
+ transcriptionManager.setHue(userHue);
123
+ void transcriptionManager.open();
124
+ state.transcriptionManager = transcriptionManager;
125
+ },
126
+ onLeave: () => {
127
+ void state.transcriptionManager?.close();
128
+ state.transcriptionManager = undefined;
129
+ state.enabled = false;
130
+ },
131
+ onCallStateUpdated: (callState: CallState) => {
132
+ const typename = getSchemaTypename(TranscriptType);
133
+ const transcription = typename ? callState.activities?.[typename] : undefined;
134
+ if (!transcription?.payload?.value) {
135
+ return;
136
+ }
137
+
138
+ const payload = codec.decode(transcription.payload.value);
139
+ state.enabled = payload.enabled;
140
+ void state.transcriptionManager?.setEnabled(payload.enabled);
141
+ void state.transcriptionManager?.setQueue(payload.queueDxn);
142
+ },
143
+ onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => {
144
+ void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);
145
+ void state.transcriptionManager?.setRecording(isSpeaking);
146
+ },
147
+ },
148
+ },
149
+ ];
150
+ },
189
151
  }),
190
152
  ]);
191
-
192
- type EntityExtractionEnricherFactoryOptions = {
193
- aiClient: AIServiceClient;
194
- contextTypes: Schema.Schema.AnyNoContext[];
195
- space: Space;
196
- };
197
-
198
- const createEntityExtractionEnricher = ({ aiClient, contextTypes, space }: EntityExtractionEnricherFactoryOptions) => {
199
- return async (message: DataType.Message) => {
200
- const { objects } = await space.db
201
- .query(Query.select(Filter.or(...contextTypes.map((s) => Filter.type(s as Schema.Schema<BaseEchoObject>)))))
202
- .run();
203
- log.info('context', { objects });
204
-
205
- const { message: enhancedMessage, timeElapsed } = await processTranscriptMessage({
206
- aiService: aiClient,
207
- message,
208
- context: {
209
- objects: await Promise.all(objects.map((o) => processContextObject(o))),
210
- },
211
- options: { timeout: ENTITY_EXTRACTOR_TIMEOUT, fallbackToRaw: true },
212
- });
213
-
214
- log.info('entity extraction time', { timeElapsed });
215
- return enhancedMessage;
216
- };
217
- };
218
-
219
- // TODO(dmaretskyi): Use Type.Any
220
- const processContextObject = async (object: BaseEchoObject): Promise<any> => {
221
- // TODO(dmaretskyi): Documents need special processing is the content is behind a ref.
222
- // TODO(dmaretskyi): Think about a way to handle this serialization with a decorator.
223
- // if (isInstanceOf(DocumentType, object)) {
224
- // return {
225
- // ...object,
226
- // content: await object.content.load(),
227
- // };
228
- // }
229
-
230
- return object;
231
- };
232
-
233
- const ENTITY_EXTRACTOR_TIMEOUT = 25_000;
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { defineCapability } from '@dxos/app-framework';
6
- import { type Live } from '@dxos/live-object';
6
+ import { type ReactiveObject } from '@dxos/live-object';
7
7
 
8
8
  import { TRANSCRIPTION_PLUGIN } from '../meta';
9
9
  import { type TranscriberParams, type Transcriber, type TranscriptionManager } from '../transcriber';
@@ -12,14 +12,13 @@ export namespace TranscriptionCapabilities {
12
12
  export type GetTranscriberProps = {
13
13
  audioStreamTrack: MediaStreamTrack;
14
14
  onSegments: TranscriberParams['onSegments'];
15
- config?: TranscriberParams['config'];
16
15
  };
17
16
  export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;
18
17
  export const Transcriber = defineCapability<GetTranscriber>(`${TRANSCRIPTION_PLUGIN}/capability/transcriber`);
19
18
 
20
- export type MeetingTranscriptionState = Live<{
19
+ export type MeetingTranscriptionState = ReactiveObject<{
20
+ enabled: boolean;
21
21
  transcriptionManager?: TranscriptionManager;
22
- enabled: boolean; // TODO(burdon): Move state into TranscriptionManager.
23
22
  }>;
24
23
  export const MeetingTranscriptionState = defineCapability<MeetingTranscriptionState>(
25
24
  `${TRANSCRIPTION_PLUGIN}/capability/meeting-transcription-state`,
@@ -9,6 +9,5 @@ export const IntentResolver = lazy(() => import('./intent-resolver'));
9
9
  export const MeetingTranscriptionState = lazy(() => import('./meeting-transcription-state'));
10
10
  export const ReactSurface = lazy(() => import('./react-surface'));
11
11
  export const Transcriber = lazy(() => import('./transcriber'));
12
- export const Settings = lazy(() => import('./settings'));
13
12
 
14
13
  export * from './capabilities';
@@ -2,21 +2,20 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, createResolver, type PluginContext } from '@dxos/app-framework';
6
- import { createQueueDxn } from '@dxos/echo-schema';
7
- import { type SpaceId } from '@dxos/keys';
8
- import { live, refFromDXN } from '@dxos/live-object';
5
+ import { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';
6
+ import { create, refFromDXN } from '@dxos/live-object';
7
+ import { type SpaceId } from '@dxos/react-client/echo';
9
8
 
10
9
  import { TranscriptionAction, TranscriptType } from '../types';
11
- import { getTimeStr } from '../util';
10
+ import { getTimeStr, randomQueueDxn } from '../util';
12
11
 
13
- export default (context: PluginContext) =>
12
+ export default (context: PluginsContext) =>
14
13
  contributes(Capabilities.IntentResolver, [
15
14
  createResolver({
16
15
  intent: TranscriptionAction.Create,
17
16
  resolve: ({ name, spaceId }) => {
18
- const transcript = live(TranscriptType, {
19
- queue: refFromDXN(createQueueDxn(spaceId as SpaceId)),
17
+ const transcript = create(TranscriptType, {
18
+ queue: refFromDXN(randomQueueDxn(spaceId as SpaceId)),
20
19
  name: name ?? `Transcript ${getTimeStr(Date.now())}`,
21
20
  });
22
21
 
@@ -3,12 +3,12 @@
3
3
  //
4
4
 
5
5
  import { contributes } from '@dxos/app-framework';
6
- import { live } from '@dxos/live-object';
6
+ import { create } from '@dxos/live-object';
7
7
 
8
8
  import { TranscriptionCapabilities } from './capabilities';
9
9
 
10
10
  export default () => {
11
- const state = live<TranscriptionCapabilities.MeetingTranscriptionState>({
11
+ const state = create<TranscriptionCapabilities.MeetingTranscriptionState>({
12
12
  enabled: false,
13
13
  });
14
14
 
@@ -5,23 +5,15 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
- import { SettingsStore } from '@dxos/local-storage';
9
8
 
10
- import { TranscriptionContainer, TranscriptionSettings } from '../components';
11
- import { meta } from '../meta';
12
- import { isTranscript, type TranscriptionSettingsProps, type TranscriptType } from '../types';
9
+ import { TranscriptionContainer } from '../components';
10
+ import { TRANSCRIPTION_PLUGIN } from '../meta';
11
+ import { isTranscript, type TranscriptType } from '../types';
13
12
 
14
13
  export default () =>
15
14
  contributes(Capabilities.ReactSurface, [
16
15
  createSurface({
17
- id: `${meta.id}/plugin-settings`,
18
- role: 'article',
19
- filter: (data): data is { subject: SettingsStore<TranscriptionSettingsProps> } =>
20
- data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
21
- component: ({ data: { subject } }) => <TranscriptionSettings settings={subject.value} />,
22
- }),
23
- createSurface({
24
- id: `${meta.id}/article/transcript`,
16
+ id: `${TRANSCRIPTION_PLUGIN}/article/transcript`,
25
17
  role: ['article', 'section'],
26
18
  filter: (data): data is { subject: TranscriptType } => isTranscript(data.subject),
27
19
  component: ({ data, role }) => <TranscriptionContainer transcript={data.subject} role={role} />,
@@ -29,13 +29,12 @@ const TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
29
29
  * Records audio while user is speaking and transcribes it after user is done speaking.
30
30
  */
31
31
  export default () => {
32
- const getTranscriber: TranscriptionCapabilities.GetTranscriber = ({ audioStreamTrack, onSegments, config }) => {
32
+ const getTranscriber: TranscriptionCapabilities.GetTranscriber = ({ audioStreamTrack, onSegments }) => {
33
33
  // Initialize audio transcription.
34
34
  return new Transcriber({
35
35
  config: {
36
36
  transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,
37
37
  prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,
38
- ...config,
39
38
  },
40
39
  recorder: new MediaStreamRecorder({
41
40
  mediaStreamTrack: audioStreamTrack,