@dxos/plugin-transcription 0.8.1 → 0.8.2-main.f081794

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 (191) hide show
  1. package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs → TranscriptContainer-4D4BHE7G.mjs} +3 -2
  2. package/dist/lib/browser/{app-graph-builder-VDQOVX7P.mjs → app-graph-builder-I4SSIQMW.mjs} +18 -41
  3. package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-YEPT334A.mjs → chunk-5BE6RTNC.mjs} +1 -1
  5. package/dist/lib/browser/chunk-5BE6RTNC.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-OGNXNGJB.mjs → chunk-5Q3R53U3.mjs} +8 -8
  7. package/dist/lib/browser/chunk-5Q3R53U3.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-YCZISX63.mjs → chunk-DR3NBV6Q.mjs} +6 -6
  9. package/dist/lib/browser/{chunk-YCZISX63.mjs.map → chunk-DR3NBV6Q.mjs.map} +3 -3
  10. package/dist/lib/browser/{chunk-K7FOYAXO.mjs → chunk-GI5LZ4SV.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-GU2BNYKZ.mjs → chunk-KLD7O5GJ.mjs} +2 -12
  12. package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RHHJZQPM.mjs +702 -0
  14. package/dist/lib/browser/chunk-RHHJZQPM.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +22 -197
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/{intent-resolver-4R66ZCKT.mjs → intent-resolver-ZQQEH27F.mjs} +7 -7
  18. package/dist/lib/browser/intent-resolver-ZQQEH27F.mjs.map +7 -0
  19. package/dist/lib/browser/{meeting-transcription-state-DLFHQK72.mjs → meeting-transcription-state-5D52VTHU.mjs} +4 -4
  20. package/dist/lib/browser/meeting-transcription-state-5D52VTHU.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-FQUHU5G7.mjs → react-surface-HETJ5XY6.mjs} +5 -4
  23. package/dist/lib/browser/{transcriber-LGMIWDYI.mjs → transcriber-SMRLU2KY.mjs} +8 -7
  24. package/dist/lib/browser/{transcriber-LGMIWDYI.mjs.map → transcriber-SMRLU2KY.mjs.map} +3 -3
  25. package/dist/lib/browser/types/index.mjs +1 -1
  26. package/dist/lib/node/{TranscriptContainer-QEYTTT2V.cjs → TranscriptContainer-ZWP6UKY6.cjs} +8 -7
  27. package/dist/lib/node/TranscriptContainer-ZWP6UKY6.cjs.map +7 -0
  28. package/dist/lib/node/{app-graph-builder-IFSIVNUR.cjs → app-graph-builder-WWC4WNTG.cjs} +31 -54
  29. package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-P4VVD6ZO.cjs → chunk-3QEJ5EBO.cjs} +10 -10
  31. package/dist/lib/node/chunk-3QEJ5EBO.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-CZMLKKWT.cjs → chunk-HYGDHS6X.cjs} +4 -4
  33. package/dist/lib/node/chunk-HYGDHS6X.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-3KHUSQNW.cjs → chunk-J72PUQ3C.cjs} +6 -15
  35. package/dist/lib/node/chunk-J72PUQ3C.cjs.map +7 -0
  36. package/dist/lib/node/chunk-KO6MKCED.cjs +718 -0
  37. package/dist/lib/node/chunk-KO6MKCED.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-FCCJALOT.cjs → chunk-LA73IHCB.cjs} +10 -10
  39. package/dist/lib/node/{chunk-FCCJALOT.cjs.map → chunk-LA73IHCB.cjs.map} +3 -3
  40. package/dist/lib/node/{chunk-LP4FG423.cjs → chunk-WXG4Z2EZ.cjs} +5 -5
  41. package/dist/lib/node/index.cjs +49 -233
  42. package/dist/lib/node/index.cjs.map +4 -4
  43. package/dist/lib/node/{intent-resolver-WMMCOUEH.cjs → intent-resolver-VY3XWYAA.cjs} +11 -10
  44. package/dist/lib/node/intent-resolver-VY3XWYAA.cjs.map +7 -0
  45. package/dist/lib/node/{meeting-transcription-state-URIYILEQ.cjs → meeting-transcription-state-OYWCY5XE.cjs} +7 -7
  46. package/dist/lib/node/meeting-transcription-state-OYWCY5XE.cjs.map +7 -0
  47. package/dist/lib/node/meta.json +1 -1
  48. package/dist/lib/node/{react-surface-WI2MGWCC.cjs → react-surface-M2JQIIDY.cjs} +10 -9
  49. package/dist/lib/node/{react-surface-WI2MGWCC.cjs.map → react-surface-M2JQIIDY.cjs.map} +1 -1
  50. package/dist/lib/node/{transcriber-QG5WPKX4.cjs → transcriber-E6AAB4SU.cjs} +14 -13
  51. package/dist/lib/node/{transcriber-QG5WPKX4.cjs.map → transcriber-E6AAB4SU.cjs.map} +3 -3
  52. package/dist/lib/node/types/index.cjs +7 -7
  53. package/dist/lib/node/types/index.cjs.map +1 -1
  54. package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs → TranscriptContainer-3HJ752CP.mjs} +3 -2
  55. package/dist/lib/node-esm/{app-graph-builder-UL6XLIZY.mjs → app-graph-builder-PPJQAFSI.mjs} +18 -41
  56. package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-GIO6J6FE.mjs → chunk-54HDN33F.mjs} +8 -8
  58. package/dist/lib/node-esm/chunk-54HDN33F.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs → chunk-K3R3YK3S.mjs} +6 -6
  60. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs.map → chunk-K3R3YK3S.mjs.map} +3 -3
  61. package/dist/lib/node-esm/{chunk-HKATMD34.mjs → chunk-QMHMEKB3.mjs} +2 -12
  62. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-SDMGJZLN.mjs +703 -0
  64. package/dist/lib/node-esm/chunk-SDMGJZLN.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs → chunk-XY22OP6H.mjs} +2 -2
  66. package/dist/lib/node-esm/{chunk-PTZHDZ36.mjs → chunk-YXZOLOFT.mjs} +1 -1
  67. package/dist/lib/node-esm/chunk-YXZOLOFT.mjs.map +7 -0
  68. package/dist/lib/node-esm/index.mjs +22 -197
  69. package/dist/lib/node-esm/index.mjs.map +4 -4
  70. package/dist/lib/node-esm/{intent-resolver-QN2LO5TX.mjs → intent-resolver-FCTNJPWY.mjs} +7 -7
  71. package/dist/lib/node-esm/intent-resolver-FCTNJPWY.mjs.map +7 -0
  72. package/dist/lib/node-esm/{meeting-transcription-state-ZYVRAW6Y.mjs → meeting-transcription-state-XMZJ45P4.mjs} +4 -4
  73. package/dist/lib/node-esm/meeting-transcription-state-XMZJ45P4.mjs.map +7 -0
  74. package/dist/lib/node-esm/meta.json +1 -1
  75. package/dist/lib/node-esm/{react-surface-PCH6NTVB.mjs → react-surface-PXFSIM6V.mjs} +5 -4
  76. package/dist/lib/{browser/react-surface-FQUHU5G7.mjs.map → node-esm/react-surface-PXFSIM6V.mjs.map} +1 -1
  77. package/dist/lib/node-esm/{transcriber-TMPYZ5L4.mjs → transcriber-REAGRCPY.mjs} +8 -7
  78. package/dist/lib/node-esm/{transcriber-TMPYZ5L4.mjs.map → transcriber-REAGRCPY.mjs.map} +3 -3
  79. package/dist/lib/node-esm/types/index.mjs +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/capabilities.d.ts +4 -6
  82. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/index.d.ts +1 -4
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +2 -4
  86. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  88. package/dist/types/src/components/Transcript/Transcript.d.ts +12 -4
  89. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  90. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +15 -4
  91. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts +13 -0
  93. package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts.map +1 -0
  94. package/dist/types/src/components/Transcript/testings.d.ts +51 -0
  95. package/dist/types/src/components/Transcript/testings.d.ts.map +1 -0
  96. package/dist/types/src/components/Transcript/transcript-extension.d.ts +19 -0
  97. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -0
  98. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  99. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  100. package/dist/types/src/entity-extraction/entity-extraction.d.ts +16 -0
  101. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -0
  102. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +2 -0
  103. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +1 -0
  104. package/dist/types/src/entity-extraction/index.d.ts +2 -0
  105. package/dist/types/src/entity-extraction/index.d.ts.map +1 -0
  106. package/dist/types/src/hooks/index.d.ts +1 -0
  107. package/dist/types/src/hooks/index.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +7 -0
  109. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -0
  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/model/index.d.ts +2 -0
  113. package/dist/types/src/model/index.d.ts.map +1 -0
  114. package/dist/types/src/model/model.d.ts +68 -0
  115. package/dist/types/src/model/model.d.ts.map +1 -0
  116. package/dist/types/src/model/model.test.d.ts +2 -0
  117. package/dist/types/src/model/model.test.d.ts.map +1 -0
  118. package/dist/types/src/testing/test-data.d.ts +73 -0
  119. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  120. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +2 -0
  121. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +1 -0
  122. package/dist/types/src/types/schema.d.ts +9 -9
  123. package/dist/types/src/util/index.d.ts +0 -1
  124. package/dist/types/src/util/index.d.ts.map +1 -1
  125. package/package.json +47 -39
  126. package/src/capabilities/app-graph-builder.ts +15 -26
  127. package/src/capabilities/capabilities.ts +3 -2
  128. package/src/capabilities/intent-resolver.ts +4 -4
  129. package/src/capabilities/meeting-transcription-state.ts +2 -2
  130. package/src/capabilities/transcriber.ts +2 -1
  131. package/src/components/Transcript/Transcript.stories.tsx +165 -43
  132. package/src/components/Transcript/Transcript.tsx +78 -210
  133. package/src/components/Transcript/deprecated/Transcript.tsx +231 -0
  134. package/src/components/Transcript/testings.ts +182 -0
  135. package/src/components/Transcript/transcript-extension.ts +233 -0
  136. package/src/components/TranscriptContainer.tsx +6 -3
  137. package/src/components/transcription.stories.tsx +97 -48
  138. package/src/entity-extraction/entity-extraction.test.ts +32 -0
  139. package/src/entity-extraction/entity-extraction.ts +94 -0
  140. package/src/entity-extraction/index.ts +5 -0
  141. package/src/entity-extraction/system-prompt.tpl +9 -0
  142. package/src/entity-extraction/types.d.ts +8 -0
  143. package/src/hooks/index.ts +1 -0
  144. package/src/hooks/useQueueModelAdapter.ts +30 -0
  145. package/src/hooks/useTranscriber.ts +3 -2
  146. package/src/model/index.ts +5 -0
  147. package/src/model/model.test.ts +123 -0
  148. package/src/model/model.ts +229 -0
  149. package/src/testing/test-data.ts +314 -0
  150. package/src/transcriber/transcriber.ts +1 -1
  151. package/src/transcriber/transcription-manager.ts +2 -2
  152. package/src/types/schema.ts +7 -7
  153. package/src/types/types.ts +2 -2
  154. package/src/util/index.ts +0 -1
  155. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-G4B6CPC2.mjs +0 -253
  157. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-YEPT334A.mjs.map +0 -7
  161. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +0 -7
  162. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +0 -7
  163. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +0 -7
  164. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +0 -7
  165. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +0 -7
  166. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +0 -7
  167. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +0 -7
  168. package/dist/lib/node/chunk-UOFHT4GZ.cjs +0 -280
  169. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +0 -7
  170. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +0 -7
  171. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +0 -7
  172. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +0 -254
  174. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +0 -7
  176. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +0 -7
  178. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +0 -7
  179. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +0 -7
  180. package/dist/types/src/transcriber/transcriber.test.d.ts +0 -2
  181. package/dist/types/src/transcriber/transcriber.test.d.ts.map +0 -1
  182. package/dist/types/src/util/random-queue-dxn.d.ts +0 -3
  183. package/dist/types/src/util/random-queue-dxn.d.ts.map +0 -1
  184. package/src/util/random-queue-dxn.ts +0 -9
  185. /package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs.map → TranscriptContainer-4D4BHE7G.mjs.map} +0 -0
  186. /package/dist/lib/browser/{chunk-K7FOYAXO.mjs.map → chunk-GI5LZ4SV.mjs.map} +0 -0
  187. /package/dist/lib/{node-esm/react-surface-PCH6NTVB.mjs.map → browser/react-surface-HETJ5XY6.mjs.map} +0 -0
  188. /package/dist/lib/node/{chunk-LP4FG423.cjs.map → chunk-WXG4Z2EZ.cjs.map} +0 -0
  189. /package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs.map → TranscriptContainer-3HJ752CP.mjs.map} +0 -0
  190. /package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs.map → chunk-XY22OP6H.mjs.map} +0 -0
  191. /package/src/transcriber/{transcriber.test.ts → transcriber.browser.test.ts} +0 -0
@@ -0,0 +1,718 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var chunk_KO6MKCED_exports = {};
30
+ __export(chunk_KO6MKCED_exports, {
31
+ AppGraphBuilder: () => AppGraphBuilder,
32
+ IntentResolver: () => IntentResolver,
33
+ MeetingTranscriptionState: () => MeetingTranscriptionState,
34
+ ReactSurface: () => ReactSurface,
35
+ Transcriber: () => Transcriber,
36
+ Transcript: () => Transcript,
37
+ TranscriptContainer_default: () => TranscriptContainer_default,
38
+ TranscriptionContainer: () => TranscriptionContainer,
39
+ renderMarkdown: () => renderMarkdown,
40
+ useAudioFile: () => useAudioFile,
41
+ useAudioTrack: () => useAudioTrack,
42
+ useQueueModelAdapter: () => useQueueModelAdapter,
43
+ useTranscriber: () => useTranscriber,
44
+ useVoiceInput: () => useVoiceInput
45
+ });
46
+ module.exports = __toCommonJS(chunk_KO6MKCED_exports);
47
+ var import_chunk_HYGDHS6X = require("./chunk-HYGDHS6X.cjs");
48
+ var import_react = __toESM(require("react"));
49
+ var import_echo = require("@dxos/client/echo");
50
+ var import_echo2 = require("@dxos/react-client/echo");
51
+ var import_react_ui_stack = require("@dxos/react-ui-stack");
52
+ var import_react2 = __toESM(require("react"));
53
+ var import_keys = require("@dxos/keys");
54
+ var import_log = require("@dxos/log");
55
+ var import_react_client = require("@dxos/react-client");
56
+ var import_react_ui = require("@dxos/react-ui");
57
+ var import_react_ui_editor = require("@dxos/react-ui-editor");
58
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
59
+ var import_util = require("@dxos/util");
60
+ var import_state = require("@codemirror/state");
61
+ var import_view = require("@codemirror/view");
62
+ var import_format = require("date-fns/format");
63
+ var import_intervalToDuration = require("date-fns/intervalToDuration");
64
+ var import_async = require("@dxos/async");
65
+ var import_state2 = require("@codemirror/state");
66
+ var import_async2 = require("@dxos/async");
67
+ var import_invariant = require("@dxos/invariant");
68
+ var import_log2 = require("@dxos/log");
69
+ var import_react3 = require("react");
70
+ var import_log3 = require("@dxos/log");
71
+ var import_react4 = require("react");
72
+ var import_react5 = require("react");
73
+ var import_react6 = require("react");
74
+ var import_app_framework = require("@dxos/app-framework");
75
+ var import_app_framework2 = require("@dxos/app-framework");
76
+ var import_react7 = require("react");
77
+ var import_async3 = require("@dxos/async");
78
+ var import_context = require("@dxos/context");
79
+ var import_log4 = require("@dxos/log");
80
+ var import_react_ui_sfx = require("@dxos/react-ui-sfx");
81
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/model/model.ts";
82
+ var DocumentAdapter = class {
83
+ constructor(_view) {
84
+ this._view = _view;
85
+ }
86
+ /** The document must always have at least one line. */
87
+ lineCount() {
88
+ return this._view.state.doc.lines - 1;
89
+ }
90
+ replaceLines(from, remove, insert) {
91
+ (0, import_log2.log)("replaceLines", {
92
+ count: this._view.state.doc.lines,
93
+ from,
94
+ remove,
95
+ insert
96
+ }, {
97
+ F: __dxlog_file,
98
+ L: 39,
99
+ S: this,
100
+ C: (f, a) => f(...a)
101
+ });
102
+ const numLines = this._view.state.doc.lines;
103
+ const posFrom = this._view.state.doc.line(from).from;
104
+ const posTo = remove === 0 ? posFrom : this._view.state.doc.line(Math.min(numLines, from + remove)).from;
105
+ let text = insert.join("\n");
106
+ if (posTo === this._view.state.doc.length) {
107
+ text += "\n";
108
+ }
109
+ this._view.dispatch({
110
+ changes: {
111
+ from: posFrom,
112
+ to: posTo,
113
+ insert: text
114
+ }
115
+ });
116
+ }
117
+ };
118
+ var BlockModel = class {
119
+ constructor(_renderer, initialBlocks = []) {
120
+ this._renderer = _renderer;
121
+ this._blocks = [];
122
+ this._blockLineCounts = /* @__PURE__ */ new Map();
123
+ this._lineToBlock = /* @__PURE__ */ new Map();
124
+ this._changes = [];
125
+ this.update = new import_async2.Event();
126
+ initialBlocks.forEach((block) => {
127
+ this.appendBlock(block);
128
+ });
129
+ }
130
+ toJSON() {
131
+ return {
132
+ blocks: this._blocks.length,
133
+ changes: this._changes.length
134
+ };
135
+ }
136
+ get doc() {
137
+ return import_state2.Text.of([
138
+ ...this._blocks.flatMap((block) => this._renderer(block)),
139
+ ""
140
+ ]);
141
+ }
142
+ get blocks() {
143
+ return this._blocks;
144
+ }
145
+ /**
146
+ * Get the block ID at the given line number.
147
+ */
148
+ getBlockAtLine(line) {
149
+ return this._lineToBlock.get(line);
150
+ }
151
+ reset() {
152
+ this._blocks.length = 0;
153
+ this._blockLineCounts.clear();
154
+ this._lineToBlock.clear();
155
+ this.update.emit();
156
+ return this;
157
+ }
158
+ appendBlock(block) {
159
+ const index = this._blocks.length;
160
+ this._blocks.push(block);
161
+ this._changes.push({
162
+ type: "append",
163
+ index,
164
+ block
165
+ });
166
+ this.update.emit();
167
+ return this;
168
+ }
169
+ updateBlock(block) {
170
+ const index = this._blocks.findIndex((b) => b.id === block.id);
171
+ (0, import_invariant.invariant)(index !== -1, void 0, {
172
+ F: __dxlog_file,
173
+ L: 147,
174
+ S: this,
175
+ A: [
176
+ "index !== -1",
177
+ ""
178
+ ]
179
+ });
180
+ this._blocks[index] = block;
181
+ this._changes.push({
182
+ type: "update",
183
+ index,
184
+ block
185
+ });
186
+ this.update.emit();
187
+ return this;
188
+ }
189
+ deleteBlock(id) {
190
+ const index = this._blocks.findIndex((b) => b.id === id);
191
+ (0, import_invariant.invariant)(index !== -1, void 0, {
192
+ F: __dxlog_file,
193
+ L: 156,
194
+ S: this,
195
+ A: [
196
+ "index !== -1",
197
+ ""
198
+ ]
199
+ });
200
+ this._blocks.splice(index, 1);
201
+ this._changes.push({
202
+ type: "delete",
203
+ index,
204
+ id
205
+ });
206
+ this.update.emit();
207
+ return this;
208
+ }
209
+ /**
210
+ * Syncs the tracked changes with the BlockDocument.
211
+ */
212
+ sync(document2) {
213
+ (0, import_log2.log)("sync", {
214
+ changes: this._changes
215
+ }, {
216
+ F: __dxlog_file,
217
+ L: 167,
218
+ S: this,
219
+ C: (f, a) => f(...a)
220
+ });
221
+ for (const change of this._changes) {
222
+ switch (change.type) {
223
+ case "append": {
224
+ const lines = this._renderer(change.block);
225
+ const lastLine = document2.lineCount();
226
+ document2.replaceLines(lastLine + 1, 0, lines);
227
+ break;
228
+ }
229
+ case "update": {
230
+ let lineStart = 1;
231
+ for (let i = 0; i < change.index; i++) {
232
+ lineStart += this._blockLineCounts.get(this._blocks[i].id);
233
+ }
234
+ const previousLineCount = this._blockLineCounts.get(change.block.id);
235
+ const newLines = this._renderer(change.block);
236
+ document2.replaceLines(lineStart, previousLineCount, newLines);
237
+ break;
238
+ }
239
+ case "delete": {
240
+ let lineStart = 1;
241
+ for (let i = 0; i < change.index; i++) {
242
+ lineStart += this._blockLineCounts.get(this._blocks[i].id);
243
+ }
244
+ const previousLineCount = this._blockLineCounts.get(change.id);
245
+ document2.replaceLines(lineStart, previousLineCount, []);
246
+ break;
247
+ }
248
+ }
249
+ }
250
+ this._lineToBlock.clear();
251
+ let currentLine = 1;
252
+ for (const block of this._blocks) {
253
+ const lineCount = this._renderer(block).length;
254
+ this._blockLineCounts.set(block.id, lineCount);
255
+ this._lineToBlock.set(currentLine, block);
256
+ currentLine += lineCount;
257
+ }
258
+ const blockIds = new Set(this._blocks.map((block) => block.id));
259
+ for (const id of this._blockLineCounts.keys()) {
260
+ if (!blockIds.has(id)) {
261
+ this._blockLineCounts.delete(id);
262
+ }
263
+ }
264
+ this._changes.length = 0;
265
+ return this;
266
+ }
267
+ };
268
+ var transcript = ({ model, started, renderButton }) => {
269
+ return [
270
+ // Show timestamps in the gutter.
271
+ (0, import_view.gutter)({
272
+ class: "cm-timestamp-gutter",
273
+ lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
274
+ markers: (view) => {
275
+ const start = getStartTime(started, model.blocks[0]);
276
+ const builder = new import_state.RangeSetBuilder();
277
+ for (const { from, to } of view.visibleRanges) {
278
+ let line = view.state.doc.lineAt(from);
279
+ while (line.from <= to) {
280
+ const timestamp = model.getBlockAtLine(line.number)?.segments[0]?.started;
281
+ if (timestamp) {
282
+ builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
283
+ }
284
+ if (line.to + 1 > view.state.doc.length) {
285
+ break;
286
+ }
287
+ line = view.state.doc.lineAt(line.to + 1);
288
+ }
289
+ }
290
+ return builder.finish();
291
+ }
292
+ }),
293
+ // Listen for model updates.
294
+ import_view.ViewPlugin.fromClass(class {
295
+ constructor(view) {
296
+ this._initialized = false;
297
+ this._adapter = new DocumentAdapter(view);
298
+ const scroller = view.scrollDOM;
299
+ let isAutoScrolling = false;
300
+ let hasScrolled = false;
301
+ const scrollToBottom = () => {
302
+ scroller.style.scrollBehavior = "smooth";
303
+ scroller.classList.add("cm-hide-scrollbar");
304
+ isAutoScrolling = true;
305
+ setTimeout(() => {
306
+ this._controls?.classList.add("opacity-0");
307
+ scroller.classList.remove("cm-hide-scrollbar");
308
+ isAutoScrolling = false;
309
+ }, 500);
310
+ view.dispatch({
311
+ effects: import_view.EditorView.scrollIntoView(view.state.doc.length, {
312
+ y: "end"
313
+ })
314
+ });
315
+ };
316
+ if (renderButton) {
317
+ this._controls = document.createElement("div");
318
+ this._controls.classList.add("cm-controls", "transition-opacity", "duration-300", "opacity-0");
319
+ view.dom.appendChild(this._controls);
320
+ renderButton(this._controls, {
321
+ onClick: () => {
322
+ scrollToBottom();
323
+ }
324
+ }, view);
325
+ }
326
+ this._cleanup = (0, import_async.combine)((0, import_async.addEventListener)(view.scrollDOM, "scroll", () => {
327
+ if (!isAutoScrolling) {
328
+ hasScrolled = true;
329
+ this._controls?.classList.remove("opacity-0");
330
+ }
331
+ }), model.update.on(() => {
332
+ const autoScroll = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
333
+ model.sync(this._adapter);
334
+ if (autoScroll) {
335
+ scrollToBottom();
336
+ }
337
+ }));
338
+ }
339
+ update(update) {
340
+ if (!this._initialized) {
341
+ this._initialized = true;
342
+ setTimeout(() => {
343
+ model.sync(this._adapter);
344
+ });
345
+ }
346
+ }
347
+ destroy() {
348
+ this._controls?.remove();
349
+ this._cleanup();
350
+ }
351
+ }),
352
+ import_view.EditorView.theme({
353
+ ".cm-scroller": {
354
+ overflowY: "scroll"
355
+ },
356
+ ".cm-hide-scrollbar": {
357
+ scrollbarWidth: "none",
358
+ "-ms-overflow-style": "none"
359
+ },
360
+ ".cm-hide-scrollbar::-webkit-scrollbar": {
361
+ display: "none"
362
+ },
363
+ ".cm-controls": {
364
+ position: "absolute",
365
+ bottom: "0.5rem",
366
+ right: "0.5rem",
367
+ zIndex: 1e3
368
+ },
369
+ ".cm-line": {
370
+ paddingRight: "1rem"
371
+ },
372
+ ".cm-timestamp-gutter": {
373
+ width: "6rem",
374
+ paddingRight: "1rem"
375
+ },
376
+ ".cm-timestamp-gutter > .cm-gutterElement > div": {
377
+ display: "inline-flex",
378
+ textAlign: "right",
379
+ padding: "3px"
380
+ }
381
+ })
382
+ ];
383
+ };
384
+ var TimestampMarker = class extends import_view.GutterMarker {
385
+ constructor(_line, _timestamp, _started) {
386
+ super();
387
+ this._line = _line;
388
+ this._timestamp = _timestamp;
389
+ this._started = _started;
390
+ }
391
+ eq(other) {
392
+ return other._timestamp === this._timestamp;
393
+ }
394
+ toDOM(view) {
395
+ const el = document.createElement("div");
396
+ el.className = "text-sm text-subdued hover:bg-hoverSurface cursor-pointer";
397
+ el.textContent = formatTimestamp(this._timestamp, this._started);
398
+ el.onclick = () => {
399
+ const pos = view.state.doc.line(this._line).from;
400
+ view.dispatch({
401
+ effects: import_view.EditorView.scrollIntoView(pos, {
402
+ y: "start"
403
+ })
404
+ });
405
+ };
406
+ return el;
407
+ }
408
+ };
409
+ var getStartTime = (started, block) => {
410
+ if (started) {
411
+ return started;
412
+ }
413
+ if (block?.segments[0]?.started) {
414
+ return new Date(block.segments[0].started);
415
+ }
416
+ return void 0;
417
+ };
418
+ var formatTimestamp = (timestamp, relative) => {
419
+ if (!relative) {
420
+ return (0, import_format.format)(timestamp, "HH:mm:ss");
421
+ } else {
422
+ const pad = (n = 0) => String(n).padStart(2, "0");
423
+ const { hours, minutes, seconds } = (0, import_intervalToDuration.intervalToDuration)({
424
+ start: relative,
425
+ end: timestamp
426
+ });
427
+ return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
428
+ }
429
+ };
430
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx";
431
+ var renderMarkdown = (block, debug = false) => {
432
+ return [
433
+ `###### ${block.authorName}` + (debug ? ` (${block.id})` : ""),
434
+ block.segments.map((segment) => segment.text.trim()).join(" "),
435
+ ""
436
+ ];
437
+ };
438
+ var Transcript = ({ classNames, transcript: object, space, model, attendableId, ignoreAttention }) => {
439
+ const client = (0, import_react_client.useClient)();
440
+ const { themeMode } = (0, import_react_ui.useThemeContext)();
441
+ const { parentRef } = (0, import_react_ui_editor.useTextEditor)(() => {
442
+ return {
443
+ extensions: [
444
+ (0, import_react_ui_editor.createBasicExtensions)({
445
+ readOnly: true,
446
+ lineWrapping: true
447
+ }),
448
+ (0, import_react_ui_editor.createMarkdownExtensions)({
449
+ themeMode
450
+ }),
451
+ (0, import_react_ui_editor.createThemeExtensions)({
452
+ themeMode
453
+ }),
454
+ (0, import_react_ui_editor.decorateMarkdown)(),
455
+ space && (0, import_react_ui_editor.preview)({
456
+ onLookup: async ({ label, ref }) => {
457
+ import_log.log.info("onLookup", {
458
+ label,
459
+ ref
460
+ }, {
461
+ F: __dxlog_file2,
462
+ L: 71,
463
+ S: void 0,
464
+ C: (f, a) => f(...a)
465
+ });
466
+ const dxn = import_keys.DXN.parse(ref);
467
+ if (!dxn) {
468
+ return null;
469
+ }
470
+ const object2 = await (0, import_react_client.resolveRef)(client, dxn, space);
471
+ return {
472
+ label,
473
+ object: object2
474
+ };
475
+ }
476
+ }),
477
+ transcript({
478
+ model,
479
+ started: object?.started ? new Date(object.started) : void 0,
480
+ renderButton: (0, import_react_ui_editor.createRenderer)(({ onClick }) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui.IconButton, {
481
+ icon: "ph--arrow-line-down--regular",
482
+ iconOnly: true,
483
+ label: "Scroll to bottom",
484
+ onClick
485
+ }))
486
+ })
487
+ ].filter(import_util.isNotFalsy)
488
+ };
489
+ }, [
490
+ space,
491
+ model
492
+ ]);
493
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
494
+ ref: parentRef,
495
+ className: (0, import_react_ui_theme.mx)("flex grow overflow-hidden", import_react_ui_editor.editorWidth, classNames)
496
+ });
497
+ };
498
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
499
+ var useAudioFile = (audioUrl) => {
500
+ const [{ audio, stream, track }, setStream] = (0, import_react3.useState)({});
501
+ (0, import_react3.useEffect)(() => {
502
+ const t = setTimeout(async () => {
503
+ const response = await fetch(audioUrl);
504
+ const blob = await response.blob();
505
+ const audio2 = new Audio();
506
+ audio2.src = URL.createObjectURL(blob);
507
+ await new Promise((resolve, reject) => {
508
+ audio2.addEventListener("error", (err) => {
509
+ import_log3.log.error("error", {
510
+ err
511
+ }, {
512
+ F: __dxlog_file3,
513
+ L: 27,
514
+ S: void 0,
515
+ C: (f, a) => f(...a)
516
+ });
517
+ reject(err);
518
+ }, {
519
+ once: true
520
+ });
521
+ audio2.addEventListener("canplay", () => {
522
+ import_log3.log.info("starting...", void 0, {
523
+ F: __dxlog_file3,
524
+ L: 35,
525
+ S: void 0,
526
+ C: (f, a) => f(...a)
527
+ });
528
+ resolve();
529
+ }, {
530
+ once: true
531
+ });
532
+ audio2.load();
533
+ });
534
+ const ctx = new AudioContext();
535
+ const destination = ctx.createMediaStreamDestination();
536
+ destination.channelCount = 1;
537
+ const source = ctx.createMediaElementSource(audio2);
538
+ source.connect(destination);
539
+ setStream({
540
+ audio: audio2,
541
+ stream: destination.stream,
542
+ track: destination.stream.getAudioTracks()[0]
543
+ });
544
+ });
545
+ return () => clearTimeout(t);
546
+ }, [
547
+ audioUrl
548
+ ]);
549
+ return {
550
+ audio,
551
+ stream,
552
+ track
553
+ };
554
+ };
555
+ var useAudioTrack = (active) => {
556
+ const [track, setTrack] = (0, import_react4.useState)();
557
+ (0, import_react4.useEffect)(() => {
558
+ if (!active) {
559
+ track?.stop();
560
+ setTrack(void 0);
561
+ return;
562
+ }
563
+ const initAudio = async () => {
564
+ const audio = new Audio();
565
+ audio.srcObject = await navigator.mediaDevices.getUserMedia({
566
+ audio: true
567
+ });
568
+ const [track2] = audio.srcObject.getAudioTracks();
569
+ if (track2) {
570
+ setTrack(track2);
571
+ }
572
+ };
573
+ if (active) {
574
+ void initAudio();
575
+ }
576
+ }, [
577
+ active
578
+ ]);
579
+ return track;
580
+ };
581
+ var useQueueModelAdapter = (renderer, queue, initialBlocks = []) => {
582
+ const model = (0, import_react5.useMemo)(() => new BlockModel(renderer, initialBlocks), [
583
+ queue
584
+ ]);
585
+ (0, import_react5.useEffect)(() => {
586
+ if (!queue?.items.length) {
587
+ return;
588
+ }
589
+ const block = queue.items[queue.items.length - 1];
590
+ model.appendBlock(block);
591
+ }, [
592
+ model,
593
+ queue?.items.length
594
+ ]);
595
+ return model;
596
+ };
597
+ var AppGraphBuilder = (0, import_app_framework2.lazy)(() => import("./app-graph-builder-WWC4WNTG.cjs"));
598
+ var IntentResolver = (0, import_app_framework2.lazy)(() => import("./intent-resolver-VY3XWYAA.cjs"));
599
+ var MeetingTranscriptionState = (0, import_app_framework2.lazy)(() => import("./meeting-transcription-state-OYWCY5XE.cjs"));
600
+ var ReactSurface = (0, import_app_framework2.lazy)(() => import("./react-surface-M2JQIIDY.cjs"));
601
+ var Transcriber = (0, import_app_framework2.lazy)(() => import("./transcriber-E6AAB4SU.cjs"));
602
+ var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
603
+ const [getTranscriber] = (0, import_app_framework.useCapabilities)(import_chunk_HYGDHS6X.TranscriptionCapabilities.Transcriber);
604
+ const transcriber = (0, import_react6.useMemo)(() => {
605
+ if (!onSegments || !audioStreamTrack || !getTranscriber) {
606
+ return void 0;
607
+ }
608
+ return getTranscriber({
609
+ audioStreamTrack,
610
+ onSegments,
611
+ config
612
+ });
613
+ }, [
614
+ audioStreamTrack,
615
+ onSegments,
616
+ getTranscriber,
617
+ config
618
+ ]);
619
+ (0, import_react6.useEffect)(() => {
620
+ return () => {
621
+ void transcriber?.close();
622
+ };
623
+ }, [
624
+ transcriber
625
+ ]);
626
+ return transcriber;
627
+ };
628
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
629
+ var useVoiceInput = ({ active, onUpdate }) => {
630
+ const soundStart = (0, import_react_ui_sfx.useSoundEffect)("StartRecording");
631
+ const soundStop = (0, import_react_ui_sfx.useSoundEffect)("StopRecording");
632
+ const handleSegments = (0, import_react7.useCallback)(async (segments) => {
633
+ const text = segments.map((str) => str.text.trim().replace(/[^\w\s]/g, "")).join(" ");
634
+ onUpdate(text);
635
+ }, []);
636
+ const [recording, setRecording] = (0, import_react7.useState)(false);
637
+ const track = useAudioTrack(active);
638
+ const transcriber = useTranscriber({
639
+ audioStreamTrack: track,
640
+ onSegments: handleSegments
641
+ });
642
+ (0, import_react7.useEffect)(() => {
643
+ const ctx = new import_context.Context(void 0, {
644
+ F: __dxlog_file4,
645
+ L: 43
646
+ });
647
+ (0, import_async3.scheduleMicroTask)(ctx, async () => {
648
+ if (active && transcriber) {
649
+ await transcriber.open();
650
+ import_log4.log.info("starting...", void 0, {
651
+ F: __dxlog_file4,
652
+ L: 47,
653
+ S: void 0,
654
+ C: (f, a) => f(...a)
655
+ });
656
+ setRecording(true);
657
+ void soundStart.play();
658
+ transcriber.startChunksRecording();
659
+ } else if (!active && transcriber?.isOpen) {
660
+ transcriber?.stopChunksRecording();
661
+ await transcriber?.close();
662
+ import_log4.log.info("stopped", void 0, {
663
+ F: __dxlog_file4,
664
+ L: 54,
665
+ S: void 0,
666
+ C: (f, a) => f(...a)
667
+ });
668
+ setRecording(false);
669
+ void soundStop.play();
670
+ }
671
+ });
672
+ return () => {
673
+ void ctx.dispose();
674
+ };
675
+ }, [
676
+ active,
677
+ transcriber
678
+ ]);
679
+ return {
680
+ recording
681
+ };
682
+ };
683
+ var TranscriptionContainer = ({ role, transcript: transcript2 }) => {
684
+ const attendableId = (0, import_echo.fullyQualifiedId)(transcript2);
685
+ const space = (0, import_echo.getSpace)(transcript2);
686
+ const queue = (0, import_echo2.useQueue)(transcript2.queue.dxn, {
687
+ pollInterval: 1e3
688
+ });
689
+ const model = useQueueModelAdapter(renderMarkdown, queue);
690
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui_stack.StackItem.Content, {
691
+ role,
692
+ classNames: "container-max-width pli-2"
693
+ }, /* @__PURE__ */ import_react.default.createElement(Transcript, {
694
+ attendableId,
695
+ space,
696
+ model,
697
+ transcript: transcript2
698
+ }));
699
+ };
700
+ var TranscriptContainer_default = TranscriptionContainer;
701
+ // Annotate the CommonJS export names for ESM import in node:
702
+ 0 && (module.exports = {
703
+ AppGraphBuilder,
704
+ IntentResolver,
705
+ MeetingTranscriptionState,
706
+ ReactSurface,
707
+ Transcriber,
708
+ Transcript,
709
+ TranscriptContainer_default,
710
+ TranscriptionContainer,
711
+ renderMarkdown,
712
+ useAudioFile,
713
+ useAudioTrack,
714
+ useQueueModelAdapter,
715
+ useTranscriber,
716
+ useVoiceInput
717
+ });
718
+ //# sourceMappingURL=chunk-KO6MKCED.cjs.map