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