@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
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- export * from './TranscriptionSettings';
@@ -1,97 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { describe, test, expect } from 'vitest';
6
-
7
- import { AIServiceEdgeClient } from '@dxos/assistant';
8
- import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
9
- import { log } from '@dxos/log';
10
- import { createTestData } from '@dxos/schema/testing';
11
- import { range } from '@dxos/util';
12
-
13
- import { processTranscriptMessage, postprocessText } from './entity-extraction';
14
-
15
- const aiService = new AIServiceEdgeClient({
16
- endpoint: AI_SERVICE_ENDPOINT.REMOTE,
17
- });
18
-
19
- describe.skip('EntityExtraction', { timeout: 180_000 }, () => {
20
- test.skip('should process a transcript block', async () => {
21
- const { transcriptMessages, documents, contacts } = await createTestData();
22
-
23
- log.info('context', { documents, contacts });
24
-
25
- for (const message of transcriptMessages) {
26
- log.info('input', message);
27
- const { message: enhancedMessage } = await processTranscriptMessage({
28
- message,
29
- aiService,
30
- context: {
31
- objects: [...documents, ...Object.values(contacts)],
32
- },
33
- });
34
- log.info('output', enhancedMessage);
35
- }
36
- });
37
-
38
- test.only('computational irreducibility', async () => {
39
- const { transcriptWoflram, documents, contacts } = await createTestData();
40
-
41
- log.info('context', { documents, contacts });
42
- const message = transcriptWoflram[0];
43
- log.info('input', message);
44
-
45
- await Promise.all(
46
- range(10).map(async () => {
47
- const { message: enhancedMessage, timeElapsed } = await processTranscriptMessage({
48
- message,
49
- aiService,
50
- context: {
51
- objects: [...documents, ...Object.values(contacts)],
52
- },
53
- });
54
- log.info('output', { message: enhancedMessage.blocks[0], timeElapsed });
55
- }),
56
- );
57
- });
58
-
59
- test('org and document linking', async () => {
60
- const { transcriptJosiah, documents, contacts, organizations } = await createTestData();
61
-
62
- log.info('context', { contacts, organizations, documents });
63
-
64
- for (const message of transcriptJosiah) {
65
- log.info('input', message);
66
-
67
- const { message: enhancedMessage } = await processTranscriptMessage({
68
- message,
69
- aiService,
70
- context: {
71
- objects: [...documents, ...Object.values(contacts), ...Object.values(organizations)],
72
- },
73
- });
74
- log.info('output', enhancedMessage);
75
- }
76
- });
77
- });
78
-
79
- describe('postprocessText', () => {
80
- test('should replace quotes with DXN references', () => {
81
- const quotes = {
82
- references: [{ quote: 'computational irreducibility', id: '01JTG9JW11XGWJZ32AW8ET93D1' }],
83
- };
84
-
85
- expect(postprocessText('This is a computational irreducibility test.', quotes)).toBe(
86
- 'This is a [computational irreducibility][dxn:echo:@:01JTG9JW11XGWJZ32AW8ET93D1] test.',
87
- );
88
- expect(
89
- postprocessText(
90
- "And what I'd like to talk today about is Steven Wolfram's concept of a computational irreducibility.",
91
- quotes,
92
- ),
93
- ).toBe(
94
- "And what I'd like to talk today about is Steven Wolfram's concept of a [computational irreducibility][dxn:echo:@:01JTG9JW11XGWJZ32AW8ET93D1].",
95
- );
96
- });
97
- });
@@ -1,149 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Schema } from 'effect';
6
-
7
- import { createTemplate, Message, structuredOutputParser } from '@dxos/artifact';
8
- import type { AIServiceClient } from '@dxos/assistant';
9
- import { MixedStreamParser } from '@dxos/assistant';
10
- import { asyncTimeout } from '@dxos/async';
11
- import { type BaseEchoObject, create, ObjectId } from '@dxos/echo-schema';
12
- import { DXN } from '@dxos/keys';
13
- import { log } from '@dxos/log';
14
- import { DataType } from '@dxos/schema';
15
-
16
- import SYSTEM_PROMPT from './system-prompt.tpl?raw';
17
-
18
- type ProcessTranscriptMessageParams = {
19
- message: DataType.Message;
20
- aiService: AIServiceClient;
21
- context: {
22
- objects?: BaseEchoObject[];
23
- };
24
-
25
- options?: {
26
- /**
27
- * Timeout for the entity extraction.
28
- */
29
- timeout?: number;
30
-
31
- /**
32
- * Fallback to raw text if the entity extraction fails.
33
- * Otherwise the function will throw an error.
34
- * @default false
35
- */
36
- fallbackToRaw?: boolean;
37
- };
38
- };
39
-
40
- type ProcessTranscriptMessageResult = {
41
- message: DataType.Message;
42
- timeElapsed: number;
43
- };
44
-
45
- /**
46
- * Process Handlebars template.
47
- */
48
- const createSystemPrompt = (): string => {
49
- const template = createTemplate(SYSTEM_PROMPT);
50
- return template({});
51
- };
52
-
53
- const ReferencedQuotes = Schema.Struct({
54
- references: Schema.Array(
55
- Schema.Struct({
56
- quote: Schema.String,
57
- id: Schema.String,
58
- }),
59
- ).annotations({
60
- description:
61
- 'The references to the context objects that are mentioned in the transcript. quote should match the original transcript text exactly, while id is the id of the context object.',
62
- }),
63
- });
64
- interface ReferencedQuotes extends Schema.Schema.Type<typeof ReferencedQuotes> {}
65
-
66
- // TODO(dmaretskyi): Move context to a vector search index.
67
- export const processTranscriptMessage = async (
68
- params: ProcessTranscriptMessageParams,
69
- ): Promise<ProcessTranscriptMessageResult> => {
70
- try {
71
- const outputParser = structuredOutputParser(ReferencedQuotes);
72
- const runParser = async (): Promise<ProcessTranscriptMessageResult> => {
73
- const startTime = performance.now();
74
- const result = outputParser.getResult(
75
- await new MixedStreamParser().parse(
76
- await params.aiService.execStream({
77
- model: '@anthropic/claude-3-5-haiku-20241022',
78
- systemPrompt: createSystemPrompt(),
79
- history: [
80
- create(Message, {
81
- role: 'user',
82
- content: [
83
- {
84
- type: 'text',
85
- text: `<context>${JSON.stringify(params.context.objects)}</context>`,
86
- },
87
- {
88
- type: 'text',
89
- text: `<transcript>${JSON.stringify(params.message.blocks)}</transcript>`,
90
- },
91
- ],
92
- }),
93
- ],
94
- tools: [outputParser.tool],
95
- }),
96
- ),
97
- );
98
- log.info('entity extraction result', { refs: result.references });
99
-
100
- return {
101
- message: create(DataType.Message, {
102
- ...params.message,
103
- blocks: params.message.blocks.map((block, i) =>
104
- block.type !== 'transcription'
105
- ? block
106
- : {
107
- ...block,
108
- text: postprocessText(block.text, result),
109
- },
110
- ),
111
- }),
112
- timeElapsed: performance.now() - startTime,
113
- };
114
- };
115
-
116
- if (params.options?.timeout && params.options.timeout > 0) {
117
- return await asyncTimeout(runParser(), params.options.timeout);
118
- } else {
119
- return await runParser();
120
- }
121
- } catch (error) {
122
- if (params.options?.fallbackToRaw) {
123
- log.warn('failed to process transcript message, falling back to raw text', { error });
124
- return {
125
- message: params.message,
126
- timeElapsed: 0,
127
- };
128
- } else {
129
- throw error;
130
- }
131
- }
132
- };
133
-
134
- /**
135
- * Finds and replaces all quotes with DXNs references.
136
- */
137
- // TODO(dmaretskyi): Lookup and verifiy ids from provided context.
138
- export const postprocessText = (text: string, quotes: ReferencedQuotes) => {
139
- for (const quote of quotes.references) {
140
- if (!ObjectId.isValid(quote.id)) {
141
- continue;
142
- }
143
-
144
- // Use a case-insensitive regular expression to replace the quote
145
- const regex = new RegExp(quote.quote.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
146
- text = text.replace(regex, `[${quote.quote}][${DXN.fromLocalObjectId(quote.id).toString()}]`);
147
- }
148
- return text;
149
- };
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- export * from './entity-extraction';
@@ -1,38 +0,0 @@
1
- You are an AI assistant specialized in processing and enhancing transcripts with contextual information.
2
- Your task is to analyze a given transcript and extract references to the context objects.
3
-
4
- The context and transcript are provided in the user message in `context` and `transcript` XML tags.
5
-
6
- Here are your instructions:
7
-
8
- 1. Read the transcript and context information provided above.
9
-
10
- 2. Process each segment of the transcript separately.
11
-
12
- 3. For each segment:
13
- a. Analyze the content and identify relevant information from the context.
14
- b. Extract a number of references to the context objects that are mentioned in the segment.
15
- c. Output the references in the format `{ "quote": "earnings report", "id": "01JT0JP9AX0XKGZX4MV4B69VT6" }`.
16
- d. If there are no references, just output an empty array.
17
-
18
- 4. Maintain the exact order and structure of the original transcript segments.
19
-
20
- Output Format:
21
- The final output should be a JSON array of references.
22
-
23
- Example output structure:
24
- ```json
25
- {
26
- "references": [
27
- { "quote": "earnings report", "id": "01JT0JP9AX0XKGZX4MV4B69VT6" },
28
- { "quote": "John", "id": "01JT0VM0VN3ZKN7GDBM8CV9BA7" }
29
- ]
30
- }
31
- ```
32
-
33
- Remember:
34
- - Only quote the text that is in the transcript.
35
- - Analyze each segment carefully before processing it.
36
- - Only reference objects that appear in the context and exactly by their id, If the object is not in the context, do not insert a reference.
37
-
38
- Now, process the transcript and context provided below according to these instructions.
@@ -1,8 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- declare module '*.tpl?raw' {
6
- const content: string;
7
- export default content;
8
- }
@@ -1,63 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { useMemo, useEffect, useState } from 'react';
6
-
7
- import { type Queue } from '@dxos/react-client/echo';
8
-
9
- import { type Chunk, type ChunkRenderer, SerializationModel } from '../model';
10
-
11
- /**
12
- * Model adapter for a queue.
13
- */
14
- export const useQueueModelAdapter = <T extends Chunk>(
15
- renderer: ChunkRenderer<T>,
16
- queue: Queue<T> | undefined,
17
- initialChunks: T[] = [],
18
- ): SerializationModel<T> => {
19
- const model = useMemo(() => new SerializationModel<T>(renderer, initialChunks), [queue]);
20
- const [loaded, setLoaded] = useState(false);
21
-
22
- // Set initial blocks.
23
- useEffect(() => {
24
- if (!queue) {
25
- return;
26
- }
27
-
28
- const update = () => {
29
- for (const block of queue?.items ?? []) {
30
- model.appendChunk(block);
31
- }
32
-
33
- setLoaded(true);
34
- };
35
-
36
- // TODO(burdon): This is a hack to ensure the queue is loaded.
37
- let i: NodeJS.Timeout | undefined;
38
- if (queue.isLoading) {
39
- i = setInterval(() => {
40
- if (!queue?.isLoading) {
41
- clearInterval(i);
42
- update();
43
- }
44
- }, 1_000);
45
- } else {
46
- update();
47
- }
48
-
49
- return () => clearTimeout(i);
50
- }, [model, queue]);
51
-
52
- // TODO(burdon): Can we listen for queue events?
53
- useEffect(() => {
54
- if (!loaded || !queue || model.chunks.length === queue.items.length) {
55
- return;
56
- }
57
-
58
- const chunk = queue.items[queue.items.length - 1];
59
- model.appendChunk(chunk);
60
- }, [model, loaded, queue?.items.length]);
61
-
62
- return model;
63
- };
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- export * from './model';
@@ -1,169 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { EditorView } from '@codemirror/view';
6
- import { describe, test } from 'vitest';
7
-
8
- import { type DataType } from '@dxos/schema';
9
-
10
- import { SerializationModel, DocumentAdapter, type ChunkRenderer } from './model';
11
-
12
- const blockToMarkdown: ChunkRenderer<DataType.Message> = (
13
- message: DataType.Message,
14
- index: number,
15
- debug = true,
16
- ): string[] => {
17
- return [
18
- `###### ${message.sender.name}`,
19
- ...message.blocks.filter((block) => block.type === 'transcription').map((block) => block.text),
20
- '',
21
- ];
22
- };
23
-
24
- const createDate = () => new Date().toISOString();
25
-
26
- describe('SerializationModel', () => {
27
- test('basic', ({ expect }) => {
28
- const model = new SerializationModel<DataType.Message>(blockToMarkdown);
29
- expect(model.chunks.length).to.eq(0);
30
- expect(model.doc.toString()).to.eq('');
31
-
32
- // Create message.
33
- const message: DataType.Message = {
34
- id: '1',
35
- created: createDate(),
36
- sender: { name: 'Alice' },
37
- blocks: [
38
- {
39
- type: 'transcription',
40
- started: createDate(),
41
- text: 'Hello world!',
42
- },
43
- ],
44
- };
45
- model.appendChunk(message);
46
- {
47
- const text = model.doc.toString();
48
- expect(text).to.eq('###### Alice\nHello world!\n\n');
49
- expect(model.chunks.length).to.eq(1);
50
- }
51
-
52
- // Update message.
53
- message.blocks.push({ type: 'transcription', started: createDate(), text: 'Hello again!' });
54
- model.updateChunk(message);
55
- {
56
- const text = model.doc.toString();
57
- expect(text).to.eq('###### Alice\nHello world!\nHello again!\n\n');
58
- expect(model.chunks.length).to.eq(1);
59
- }
60
- });
61
-
62
- test('sync - append', ({ expect }) => {
63
- const view = new EditorView({ extensions: [], doc: '' });
64
- const model = new SerializationModel<DataType.Message>(blockToMarkdown);
65
- const adapter = new DocumentAdapter(view);
66
- expect(adapter.lineCount()).to.eq(0);
67
- expect(view.state.doc.toString()).to.eq('');
68
-
69
- // Append message.
70
- {
71
- const message: DataType.Message = {
72
- id: '1',
73
- created: createDate(),
74
- sender: { name: 'Alice' },
75
- blocks: [
76
- {
77
- type: 'transcription',
78
- started: createDate(),
79
- text: 'Hello world!',
80
- },
81
- ],
82
- };
83
- model.appendChunk(message);
84
- model.sync(adapter);
85
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello world!\n\n');
86
- }
87
-
88
- // Append message.
89
- {
90
- const message: DataType.Message = {
91
- id: '2',
92
- created: createDate(),
93
- sender: { name: 'Bob' },
94
- blocks: [
95
- {
96
- type: 'transcription',
97
- started: createDate(),
98
- text: 'Hello world!',
99
- },
100
- ],
101
- };
102
- model.appendChunk(message);
103
- model.sync(adapter);
104
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello world!\n\n###### Bob\nHello world!\n\n');
105
- }
106
- });
107
-
108
- test('sync - append, update, delete', ({ expect }) => {
109
- const view = new EditorView({ extensions: [], doc: '' });
110
- const model = new SerializationModel<DataType.Message>(blockToMarkdown);
111
- const adapter = new DocumentAdapter(view);
112
- expect(adapter.lineCount()).to.eq(0);
113
-
114
- // Append message.
115
- {
116
- const message: DataType.Message = {
117
- id: '1',
118
- created: createDate(),
119
- sender: { name: 'Alice' },
120
- blocks: [
121
- {
122
- type: 'transcription',
123
- started: createDate(),
124
- text: 'Hello world!',
125
- },
126
- ],
127
- };
128
- model.appendChunk(message);
129
- model.sync(adapter);
130
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello world!\n\n');
131
-
132
- // Update message (add block).
133
- message.blocks.push({ type: 'transcription', started: createDate(), text: 'Hello again!' });
134
- model.updateChunk(message);
135
- model.sync(adapter);
136
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello world!\nHello again!\n\n');
137
-
138
- // Update message (remove block).
139
- message.blocks.splice(0, 1);
140
- model.updateChunk(message);
141
- model.sync(adapter);
142
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello again!\n\n');
143
-
144
- expect(model.getChunkAtLine(1)).to.eq(message);
145
- }
146
-
147
- // Append message.
148
- {
149
- const message: DataType.Message = {
150
- id: '2',
151
- created: createDate(),
152
- sender: { name: 'Bob' },
153
- blocks: [{ type: 'transcription', started: createDate(), text: 'Hello again!' }],
154
- };
155
- model.appendChunk(message);
156
- model.sync(adapter);
157
- expect(view.state.doc.toString()).to.eq('###### Alice\nHello again!\n\n###### Bob\nHello again!\n\n');
158
-
159
- expect(model.getChunkAtLine(4)).to.eq(message);
160
- }
161
-
162
- // Delete block.
163
- {
164
- model.deleteBlock('1');
165
- model.sync(adapter);
166
- expect(view.state.doc.toString()).to.eq('###### Bob\nHello again!\n\n');
167
- }
168
- });
169
- });