@dxos/plugin-transcription 0.8.2-main.f081794 → 0.8.2-main.fbd8ed0
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.
- package/dist/lib/browser/{TranscriptContainer-4D4BHE7G.mjs → TranscriptContainer-CXA4ZBHW.mjs} +3 -3
- package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs +351 -0
- package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-DR3NBV6Q.mjs → chunk-3TKXI6TQ.mjs} +105 -78
- package/dist/lib/browser/chunk-3TKXI6TQ.mjs.map +7 -0
- package/dist/lib/browser/chunk-JHWEZRWC.mjs +63 -0
- package/dist/lib/browser/chunk-JHWEZRWC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-RHHJZQPM.mjs → chunk-K2LS2QOM.mjs} +135 -117
- package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +7 -0
- package/dist/lib/browser/chunk-LCTMCTYY.mjs +27 -0
- package/dist/lib/browser/chunk-LCTMCTYY.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5BE6RTNC.mjs → chunk-LTIQFX4W.mjs} +1 -1
- package/dist/lib/browser/{chunk-5BE6RTNC.mjs.map → chunk-LTIQFX4W.mjs.map} +1 -1
- package/dist/lib/browser/index.mjs +30 -18
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-ZQQEH27F.mjs → intent-resolver-DZ62CJPC.mjs} +4 -4
- package/dist/lib/browser/intent-resolver-DZ62CJPC.mjs.map +7 -0
- package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs → meeting-transcription-state-MNA2XROE.mjs} +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-HETJ5XY6.mjs → react-surface-PUXZNAZL.mjs} +18 -7
- package/dist/lib/browser/react-surface-PUXZNAZL.mjs.map +7 -0
- package/dist/lib/browser/settings-JWDS4J3F.mjs +24 -0
- package/dist/lib/browser/settings-JWDS4J3F.mjs.map +7 -0
- package/dist/lib/browser/{transcriber-SMRLU2KY.mjs → transcriber-YWWIV6KP.mjs} +4 -4
- package/dist/lib/browser/types/index.mjs +3 -3
- package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs → TranscriptContainer-SSJVLRM6.cjs} +8 -8
- package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs.map → TranscriptContainer-SSJVLRM6.cjs.map} +2 -2
- package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs +352 -0
- package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs.map +7 -0
- package/dist/lib/node/{chunk-3QEJ5EBO.cjs → chunk-EJWB53WK.cjs} +22 -32
- package/dist/lib/node/chunk-EJWB53WK.cjs.map +7 -0
- package/dist/lib/node/{chunk-KO6MKCED.cjs → chunk-EVE3H46F.cjs} +138 -119
- package/dist/lib/node/chunk-EVE3H46F.cjs.map +7 -0
- package/dist/lib/node/{chunk-HYGDHS6X.cjs → chunk-JUGOXWES.cjs} +4 -4
- package/dist/lib/node/{chunk-HYGDHS6X.cjs.map → chunk-JUGOXWES.cjs.map} +1 -1
- package/dist/lib/node/{chunk-WXG4Z2EZ.cjs → chunk-L27AK6FQ.cjs} +23 -8
- package/dist/lib/node/chunk-L27AK6FQ.cjs.map +7 -0
- package/dist/lib/node/{chunk-LA73IHCB.cjs → chunk-WKZLGVEJ.cjs} +108 -80
- package/dist/lib/node/chunk-WKZLGVEJ.cjs.map +7 -0
- package/dist/lib/node/index.cjs +47 -35
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-VY3XWYAA.cjs → intent-resolver-TRBKI24D.cjs} +9 -9
- package/dist/lib/node/intent-resolver-TRBKI24D.cjs.map +7 -0
- package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs → meeting-transcription-state-5XLTMWPA.cjs} +6 -6
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-M2JQIIDY.cjs → react-surface-SZAMHCX7.cjs} +20 -11
- package/dist/lib/node/react-surface-SZAMHCX7.cjs.map +7 -0
- package/dist/lib/node/settings-AWWMOSCV.cjs +38 -0
- package/dist/lib/node/settings-AWWMOSCV.cjs.map +7 -0
- package/dist/lib/node/{transcriber-E6AAB4SU.cjs → transcriber-AFUXFHCR.cjs} +10 -10
- package/dist/lib/node/types/index.cjs +8 -8
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs → TranscriptContainer-M53LI2TX.mjs} +3 -3
- package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs +352 -0
- package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SDMGJZLN.mjs → chunk-4KC3E5T4.mjs} +135 -117
- package/dist/lib/node-esm/chunk-4KC3E5T4.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs → chunk-5E2MR5XK.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs.map → chunk-5E2MR5XK.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-MHQP2PAF.mjs +28 -0
- package/dist/lib/node-esm/chunk-MHQP2PAF.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-54HDN33F.mjs → chunk-QYG2FOXA.mjs} +22 -32
- package/dist/lib/node-esm/chunk-QYG2FOXA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-K3R3YK3S.mjs → chunk-V5IWBPYO.mjs} +105 -78
- package/dist/lib/node-esm/chunk-V5IWBPYO.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +30 -18
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-FCTNJPWY.mjs → intent-resolver-HFVAL274.mjs} +4 -4
- package/dist/lib/node-esm/intent-resolver-HFVAL274.mjs.map +7 -0
- package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs → meeting-transcription-state-3WOZ52BQ.mjs} +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-PXFSIM6V.mjs → react-surface-UEJELL7I.mjs} +18 -7
- package/dist/lib/node-esm/react-surface-UEJELL7I.mjs.map +7 -0
- package/dist/lib/node-esm/settings-QFNFGFJ5.mjs +25 -0
- package/dist/lib/node-esm/settings-QFNFGFJ5.mjs.map +7 -0
- package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs → transcriber-7RJEFPDI.mjs} +4 -4
- package/dist/lib/node-esm/types/index.mjs +3 -3
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -179
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +3 -178
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +4 -0
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts +6 -4
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts +8 -4
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +27 -0
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/transcript-extension.d.ts +4 -4
- package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +6 -0
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +1 -0
- package/dist/types/src/components/TranscriptionSettings/index.d.ts +2 -0
- package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/transcription.stories.d.ts +6 -3
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/entity-extraction/entity-extraction.d.ts +33 -7
- package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -1
- package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
- package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts +2 -2
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
- package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
- package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
- package/dist/types/src/model/model.d.ts +23 -23
- package/dist/types/src/model/model.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/testing.d.ts +40 -0
- package/dist/types/src/testing/testing.d.ts.map +1 -0
- package/dist/types/src/transcriber/transcriber.d.ts +2 -2
- package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcription-manager.d.ts +17 -15
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -18
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +26 -40
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +18 -7
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/array.d.ts.map +1 -1
- package/dist/types/src/util/get-time-str.d.ts.map +1 -1
- package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +55 -46
- package/src/TranscriptionPlugin.tsx +30 -13
- package/src/capabilities/app-graph-builder.ts +190 -98
- package/src/capabilities/capabilities.ts +1 -1
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +5 -4
- package/src/capabilities/react-surface.tsx +12 -4
- package/src/capabilities/settings.ts +20 -0
- package/src/components/Transcript/Transcript.stories.tsx +72 -36
- package/src/components/Transcript/Transcript.tsx +37 -30
- package/src/components/Transcript/deprecated/{Transcript.tsx → OldTranscript.tsx} +30 -1
- package/src/components/Transcript/transcript-extension.ts +20 -17
- package/src/components/TranscriptContainer.tsx +6 -4
- package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +26 -0
- package/src/components/TranscriptionSettings/index.ts +5 -0
- package/src/components/index.ts +1 -0
- package/src/components/transcription.stories.tsx +85 -35
- package/src/entity-extraction/entity-extraction.test.ts +75 -10
- package/src/entity-extraction/entity-extraction.ts +110 -55
- package/src/entity-extraction/system-prompt.tpl +38 -9
- package/src/hooks/useQueueModelAdapter.ts +44 -11
- package/src/model/model.test.ts +90 -44
- package/src/model/model.ts +59 -59
- package/src/testing/index.ts +5 -0
- package/src/testing/testing.ts +216 -0
- package/src/transcriber/transcriber.browser.test.ts +3 -3
- package/src/transcriber/transcriber.ts +19 -10
- package/src/transcriber/transcription-manager.ts +66 -57
- package/src/translations.ts +2 -0
- package/src/types/schema.ts +10 -31
- package/src/types/types.ts +18 -8
- package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs +0 -168
- package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs.map +0 -7
- package/dist/lib/browser/chunk-5Q3R53U3.mjs +0 -73
- package/dist/lib/browser/chunk-5Q3R53U3.mjs.map +0 -7
- package/dist/lib/browser/chunk-DR3NBV6Q.mjs.map +0 -7
- package/dist/lib/browser/chunk-GI5LZ4SV.mjs +0 -8
- package/dist/lib/browser/chunk-GI5LZ4SV.mjs.map +0 -7
- package/dist/lib/browser/chunk-RHHJZQPM.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-ZQQEH27F.mjs.map +0 -7
- package/dist/lib/browser/react-surface-HETJ5XY6.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs +0 -177
- package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs.map +0 -7
- package/dist/lib/node/chunk-3QEJ5EBO.cjs.map +0 -7
- package/dist/lib/node/chunk-KO6MKCED.cjs.map +0 -7
- package/dist/lib/node/chunk-LA73IHCB.cjs.map +0 -7
- package/dist/lib/node/chunk-WXG4Z2EZ.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-VY3XWYAA.cjs.map +0 -7
- package/dist/lib/node/react-surface-M2JQIIDY.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs +0 -169
- package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-54HDN33F.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-K3R3YK3S.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SDMGJZLN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XY22OP6H.mjs +0 -10
- package/dist/lib/node-esm/chunk-XY22OP6H.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-FCTNJPWY.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-PXFSIM6V.mjs.map +0 -7
- package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts +0 -13
- package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts.map +0 -1
- package/dist/types/src/components/Transcript/testings.d.ts +0 -51
- package/dist/types/src/components/Transcript/testings.d.ts.map +0 -1
- package/dist/types/src/testing/test-data.d.ts +0 -73
- package/dist/types/src/testing/test-data.d.ts.map +0 -1
- package/src/components/Transcript/testings.ts +0 -182
- package/src/testing/test-data.ts +0 -314
- /package/dist/lib/browser/{TranscriptContainer-4D4BHE7G.mjs.map → TranscriptContainer-CXA4ZBHW.mjs.map} +0 -0
- /package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs.map → meeting-transcription-state-MNA2XROE.mjs.map} +0 -0
- /package/dist/lib/browser/{transcriber-SMRLU2KY.mjs.map → transcriber-YWWIV6KP.mjs.map} +0 -0
- /package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs.map → meeting-transcription-state-5XLTMWPA.cjs.map} +0 -0
- /package/dist/lib/node/{transcriber-E6AAB4SU.cjs.map → transcriber-AFUXFHCR.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs.map → TranscriptContainer-M53LI2TX.mjs.map} +0 -0
- /package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs.map → meeting-transcription-state-3WOZ52BQ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs.map → transcriber-7RJEFPDI.mjs.map} +0 -0
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TranscriptionCapabilities
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LTIQFX4W.mjs";
|
|
4
4
|
|
|
5
5
|
// packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
|
|
6
6
|
import React2 from "react";
|
|
7
7
|
import { fullyQualifiedId, getSpace } from "@dxos/client/echo";
|
|
8
|
-
import { useQueue } from "@dxos/react-client/echo";
|
|
8
|
+
import { useMembers, useQueue } from "@dxos/react-client/echo";
|
|
9
9
|
import { StackItem } from "@dxos/react-ui-stack";
|
|
10
10
|
|
|
11
11
|
// packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
|
|
12
12
|
import React from "react";
|
|
13
|
-
import { DXN } from "@dxos/keys";
|
|
14
|
-
import { log as log2 } from "@dxos/log";
|
|
15
|
-
import { resolveRef, useClient } from "@dxos/react-client";
|
|
16
13
|
import { IconButton, useThemeContext } from "@dxos/react-ui";
|
|
17
14
|
import { createBasicExtensions, createMarkdownExtensions, createRenderer, createThemeExtensions, decorateMarkdown, editorWidth, preview, useTextEditor } from "@dxos/react-ui-editor";
|
|
18
15
|
import { mx } from "@dxos/react-ui-theme";
|
|
@@ -67,59 +64,59 @@ var DocumentAdapter = class {
|
|
|
67
64
|
});
|
|
68
65
|
}
|
|
69
66
|
};
|
|
70
|
-
var
|
|
71
|
-
constructor(_renderer,
|
|
67
|
+
var SerializationModel = class {
|
|
68
|
+
constructor(_renderer, initialChunks = []) {
|
|
72
69
|
this._renderer = _renderer;
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
70
|
+
this._chunks = [];
|
|
71
|
+
this._chunkLineCounts = /* @__PURE__ */ new Map();
|
|
72
|
+
this._lineToChunk = /* @__PURE__ */ new Map();
|
|
76
73
|
this._changes = [];
|
|
77
74
|
this.update = new Event();
|
|
78
|
-
|
|
79
|
-
this.
|
|
75
|
+
initialChunks.forEach((chunk) => {
|
|
76
|
+
this.appendChunk(chunk);
|
|
80
77
|
});
|
|
81
78
|
}
|
|
82
79
|
toJSON() {
|
|
83
80
|
return {
|
|
84
|
-
|
|
81
|
+
chunks: this._chunks.length,
|
|
85
82
|
changes: this._changes.length
|
|
86
83
|
};
|
|
87
84
|
}
|
|
88
85
|
get doc() {
|
|
89
86
|
return Text.of([
|
|
90
|
-
...this.
|
|
87
|
+
...this._chunks.flatMap((chunk, index) => this._renderer(chunk, index)),
|
|
91
88
|
""
|
|
92
89
|
]);
|
|
93
90
|
}
|
|
94
|
-
get
|
|
95
|
-
return this.
|
|
91
|
+
get chunks() {
|
|
92
|
+
return this._chunks;
|
|
96
93
|
}
|
|
97
94
|
/**
|
|
98
95
|
* Get the block ID at the given line number.
|
|
99
96
|
*/
|
|
100
|
-
|
|
101
|
-
return this.
|
|
97
|
+
getChunkAtLine(line) {
|
|
98
|
+
return this._lineToChunk.get(line);
|
|
102
99
|
}
|
|
103
100
|
reset() {
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
106
|
-
this.
|
|
101
|
+
this._chunks.length = 0;
|
|
102
|
+
this._chunkLineCounts.clear();
|
|
103
|
+
this._lineToChunk.clear();
|
|
107
104
|
this.update.emit();
|
|
108
105
|
return this;
|
|
109
106
|
}
|
|
110
|
-
|
|
111
|
-
const index = this.
|
|
112
|
-
this.
|
|
107
|
+
appendChunk(chunk) {
|
|
108
|
+
const index = this._chunks.length;
|
|
109
|
+
this._chunks.push(chunk);
|
|
113
110
|
this._changes.push({
|
|
114
111
|
type: "append",
|
|
115
112
|
index,
|
|
116
|
-
|
|
113
|
+
chunk
|
|
117
114
|
});
|
|
118
115
|
this.update.emit();
|
|
119
116
|
return this;
|
|
120
117
|
}
|
|
121
|
-
|
|
122
|
-
const index = this.
|
|
118
|
+
updateChunk(chunk) {
|
|
119
|
+
const index = this._chunks.findIndex((c) => c.id === chunk.id);
|
|
123
120
|
invariant(index !== -1, void 0, {
|
|
124
121
|
F: __dxlog_file,
|
|
125
122
|
L: 147,
|
|
@@ -129,17 +126,17 @@ var BlockModel = class {
|
|
|
129
126
|
""
|
|
130
127
|
]
|
|
131
128
|
});
|
|
132
|
-
this.
|
|
129
|
+
this._chunks[index] = chunk;
|
|
133
130
|
this._changes.push({
|
|
134
131
|
type: "update",
|
|
135
132
|
index,
|
|
136
|
-
|
|
133
|
+
chunk
|
|
137
134
|
});
|
|
138
135
|
this.update.emit();
|
|
139
136
|
return this;
|
|
140
137
|
}
|
|
141
138
|
deleteBlock(id) {
|
|
142
|
-
const index = this.
|
|
139
|
+
const index = this._chunks.findIndex((c) => c.id === id);
|
|
143
140
|
invariant(index !== -1, void 0, {
|
|
144
141
|
F: __dxlog_file,
|
|
145
142
|
L: 156,
|
|
@@ -149,7 +146,7 @@ var BlockModel = class {
|
|
|
149
146
|
""
|
|
150
147
|
]
|
|
151
148
|
});
|
|
152
|
-
this.
|
|
149
|
+
this._chunks.splice(index, 1);
|
|
153
150
|
this._changes.push({
|
|
154
151
|
type: "delete",
|
|
155
152
|
index,
|
|
@@ -159,7 +156,7 @@ var BlockModel = class {
|
|
|
159
156
|
return this;
|
|
160
157
|
}
|
|
161
158
|
/**
|
|
162
|
-
* Syncs the tracked changes with the
|
|
159
|
+
* Syncs the tracked changes with the ChunkDocument.
|
|
163
160
|
*/
|
|
164
161
|
sync(document2) {
|
|
165
162
|
log("sync", {
|
|
@@ -173,7 +170,7 @@ var BlockModel = class {
|
|
|
173
170
|
for (const change of this._changes) {
|
|
174
171
|
switch (change.type) {
|
|
175
172
|
case "append": {
|
|
176
|
-
const lines = this._renderer(change.
|
|
173
|
+
const lines = this._renderer(change.chunk, change.index);
|
|
177
174
|
const lastLine = document2.lineCount();
|
|
178
175
|
document2.replaceLines(lastLine + 1, 0, lines);
|
|
179
176
|
break;
|
|
@@ -181,36 +178,36 @@ var BlockModel = class {
|
|
|
181
178
|
case "update": {
|
|
182
179
|
let lineStart = 1;
|
|
183
180
|
for (let i = 0; i < change.index; i++) {
|
|
184
|
-
lineStart += this.
|
|
181
|
+
lineStart += this._chunkLineCounts.get(this._chunks[i].id);
|
|
185
182
|
}
|
|
186
|
-
const previousLineCount = this.
|
|
187
|
-
const newLines = this._renderer(change.
|
|
183
|
+
const previousLineCount = this._chunkLineCounts.get(change.chunk.id);
|
|
184
|
+
const newLines = this._renderer(change.chunk, change.index);
|
|
188
185
|
document2.replaceLines(lineStart, previousLineCount, newLines);
|
|
189
186
|
break;
|
|
190
187
|
}
|
|
191
188
|
case "delete": {
|
|
192
189
|
let lineStart = 1;
|
|
193
190
|
for (let i = 0; i < change.index; i++) {
|
|
194
|
-
lineStart += this.
|
|
191
|
+
lineStart += this._chunkLineCounts.get(this._chunks[i].id);
|
|
195
192
|
}
|
|
196
|
-
const previousLineCount = this.
|
|
193
|
+
const previousLineCount = this._chunkLineCounts.get(change.id);
|
|
197
194
|
document2.replaceLines(lineStart, previousLineCount, []);
|
|
198
195
|
break;
|
|
199
196
|
}
|
|
200
197
|
}
|
|
201
198
|
}
|
|
202
|
-
this.
|
|
199
|
+
this._lineToChunk.clear();
|
|
203
200
|
let currentLine = 1;
|
|
204
|
-
for (const
|
|
205
|
-
const lineCount = this._renderer(
|
|
206
|
-
this.
|
|
207
|
-
this.
|
|
201
|
+
for (const [index, chunk] of this._chunks.entries()) {
|
|
202
|
+
const lineCount = this._renderer(chunk, index).length;
|
|
203
|
+
this._chunkLineCounts.set(chunk.id, lineCount);
|
|
204
|
+
this._lineToChunk.set(currentLine, chunk);
|
|
208
205
|
currentLine += lineCount;
|
|
209
206
|
}
|
|
210
|
-
const
|
|
211
|
-
for (const id of this.
|
|
212
|
-
if (!
|
|
213
|
-
this.
|
|
207
|
+
const chunkIds = new Set(this._chunks.map((chunk) => chunk.id));
|
|
208
|
+
for (const id of this._chunkLineCounts.keys()) {
|
|
209
|
+
if (!chunkIds.has(id)) {
|
|
210
|
+
this._chunkLineCounts.delete(id);
|
|
214
211
|
}
|
|
215
212
|
}
|
|
216
213
|
this._changes.length = 0;
|
|
@@ -226,12 +223,13 @@ var transcript = ({ model, started, renderButton }) => {
|
|
|
226
223
|
class: "cm-timestamp-gutter",
|
|
227
224
|
lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
|
|
228
225
|
markers: (view) => {
|
|
229
|
-
const start = getStartTime(started, model.
|
|
226
|
+
const start = getStartTime(started, model.chunks[0]);
|
|
230
227
|
const builder = new RangeSetBuilder();
|
|
231
228
|
for (const { from, to } of view.visibleRanges) {
|
|
232
229
|
let line = view.state.doc.lineAt(from);
|
|
233
230
|
while (line.from <= to) {
|
|
234
|
-
const
|
|
231
|
+
const block = model.getChunkAtLine(line.number)?.blocks[0];
|
|
232
|
+
const timestamp = block?.type === "transcription" && block.started;
|
|
235
233
|
if (timestamp) {
|
|
236
234
|
builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
|
|
237
235
|
}
|
|
@@ -252,11 +250,13 @@ var transcript = ({ model, started, renderButton }) => {
|
|
|
252
250
|
const scroller = view.scrollDOM;
|
|
253
251
|
let isAutoScrolling = false;
|
|
254
252
|
let hasScrolled = false;
|
|
255
|
-
|
|
256
|
-
|
|
253
|
+
let timeout;
|
|
254
|
+
const scrollToBottom = (smooth = false) => {
|
|
255
|
+
scroller.style.scrollBehavior = smooth ? "smooth" : "";
|
|
257
256
|
scroller.classList.add("cm-hide-scrollbar");
|
|
258
257
|
isAutoScrolling = true;
|
|
259
|
-
|
|
258
|
+
clearTimeout(timeout);
|
|
259
|
+
timeout = setTimeout(() => {
|
|
260
260
|
this._controls?.classList.add("opacity-0");
|
|
261
261
|
scroller.classList.remove("cm-hide-scrollbar");
|
|
262
262
|
isAutoScrolling = false;
|
|
@@ -273,7 +273,7 @@ var transcript = ({ model, started, renderButton }) => {
|
|
|
273
273
|
view.dom.appendChild(this._controls);
|
|
274
274
|
renderButton(this._controls, {
|
|
275
275
|
onClick: () => {
|
|
276
|
-
scrollToBottom();
|
|
276
|
+
scrollToBottom(false);
|
|
277
277
|
}
|
|
278
278
|
}, view);
|
|
279
279
|
}
|
|
@@ -286,7 +286,7 @@ var transcript = ({ model, started, renderButton }) => {
|
|
|
286
286
|
const autoScroll = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
|
|
287
287
|
model.sync(this._adapter);
|
|
288
288
|
if (autoScroll) {
|
|
289
|
-
scrollToBottom();
|
|
289
|
+
scrollToBottom(true);
|
|
290
290
|
}
|
|
291
291
|
}));
|
|
292
292
|
}
|
|
@@ -360,39 +360,46 @@ var TimestampMarker = class extends GutterMarker {
|
|
|
360
360
|
return el;
|
|
361
361
|
}
|
|
362
362
|
};
|
|
363
|
-
var getStartTime = (started,
|
|
363
|
+
var getStartTime = (started, message) => {
|
|
364
364
|
if (started) {
|
|
365
365
|
return started;
|
|
366
366
|
}
|
|
367
|
-
if (
|
|
368
|
-
return new Date(
|
|
367
|
+
if (message?.blocks[0]?.type === "transcription" && message.blocks[0].started) {
|
|
368
|
+
return new Date(message.blocks[0].started);
|
|
369
369
|
}
|
|
370
370
|
return void 0;
|
|
371
371
|
};
|
|
372
372
|
var formatTimestamp = (timestamp, relative) => {
|
|
373
|
-
if (
|
|
374
|
-
return format(timestamp, "HH:mm:ss");
|
|
375
|
-
} else {
|
|
373
|
+
if (relative) {
|
|
376
374
|
const pad = (n = 0) => String(n).padStart(2, "0");
|
|
377
375
|
const { hours, minutes, seconds } = intervalToDuration({
|
|
378
376
|
start: relative,
|
|
379
377
|
end: timestamp
|
|
380
378
|
});
|
|
381
379
|
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
|
|
380
|
+
} else {
|
|
381
|
+
return format(timestamp, "HH:mm:ss");
|
|
382
382
|
}
|
|
383
383
|
};
|
|
384
384
|
|
|
385
385
|
// packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
|
|
386
|
-
var
|
|
387
|
-
|
|
386
|
+
var renderMarkdown = (identities) => (message, index, debug = false) => {
|
|
387
|
+
if (message.sender.role === "assistant") {
|
|
388
|
+
return [
|
|
389
|
+
message.blocks.find((block) => block.type === "transcription")?.text ?? "",
|
|
390
|
+
""
|
|
391
|
+
];
|
|
392
|
+
}
|
|
393
|
+
const identity = identities.find((identity2) => identity2.did === message.sender.identityDid);
|
|
394
|
+
const name = identity?.profile?.displayName ?? message.sender.contact?.target?.fullName ?? message.sender.name ?? message.sender.email ?? message.sender.identityDid;
|
|
395
|
+
const blocks = message.blocks.filter((block) => block.type === "transcription");
|
|
388
396
|
return [
|
|
389
|
-
`###### ${
|
|
390
|
-
|
|
397
|
+
`###### ${name}` + (debug ? ` [${index}]:${message.id}` : ""),
|
|
398
|
+
blocks.map((block) => block.text.trim()).join(" "),
|
|
391
399
|
""
|
|
392
400
|
];
|
|
393
401
|
};
|
|
394
402
|
var Transcript = ({ classNames, transcript: object, space, model, attendableId, ignoreAttention }) => {
|
|
395
|
-
const client = useClient();
|
|
396
403
|
const { themeMode } = useThemeContext();
|
|
397
404
|
const { parentRef } = useTextEditor(() => {
|
|
398
405
|
return {
|
|
@@ -408,28 +415,7 @@ var Transcript = ({ classNames, transcript: object, space, model, attendableId,
|
|
|
408
415
|
themeMode
|
|
409
416
|
}),
|
|
410
417
|
decorateMarkdown(),
|
|
411
|
-
space && preview(
|
|
412
|
-
onLookup: async ({ label, ref }) => {
|
|
413
|
-
log2.info("onLookup", {
|
|
414
|
-
label,
|
|
415
|
-
ref
|
|
416
|
-
}, {
|
|
417
|
-
F: __dxlog_file2,
|
|
418
|
-
L: 71,
|
|
419
|
-
S: void 0,
|
|
420
|
-
C: (f, a) => f(...a)
|
|
421
|
-
});
|
|
422
|
-
const dxn = DXN.parse(ref);
|
|
423
|
-
if (!dxn) {
|
|
424
|
-
return null;
|
|
425
|
-
}
|
|
426
|
-
const object2 = await resolveRef(client, dxn, space);
|
|
427
|
-
return {
|
|
428
|
-
label,
|
|
429
|
-
object: object2
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
}),
|
|
418
|
+
space && preview(),
|
|
433
419
|
transcript({
|
|
434
420
|
model,
|
|
435
421
|
started: object?.started ? new Date(object.started) : void 0,
|
|
@@ -448,14 +434,15 @@ var Transcript = ({ classNames, transcript: object, space, model, attendableId,
|
|
|
448
434
|
]);
|
|
449
435
|
return /* @__PURE__ */ React.createElement("div", {
|
|
450
436
|
ref: parentRef,
|
|
451
|
-
className: mx("flex grow overflow-hidden", editorWidth, classNames)
|
|
437
|
+
className: mx("flex grow overflow-hidden", editorWidth, classNames),
|
|
438
|
+
"data-popover-collision-boundary": true
|
|
452
439
|
});
|
|
453
440
|
};
|
|
454
441
|
|
|
455
442
|
// packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts
|
|
456
443
|
import { useEffect, useState } from "react";
|
|
457
|
-
import { log as
|
|
458
|
-
var
|
|
444
|
+
import { log as log2 } from "@dxos/log";
|
|
445
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
|
|
459
446
|
var useAudioFile = (audioUrl) => {
|
|
460
447
|
const [{ audio, stream, track }, setStream] = useState({});
|
|
461
448
|
useEffect(() => {
|
|
@@ -466,10 +453,10 @@ var useAudioFile = (audioUrl) => {
|
|
|
466
453
|
audio2.src = URL.createObjectURL(blob);
|
|
467
454
|
await new Promise((resolve, reject) => {
|
|
468
455
|
audio2.addEventListener("error", (err) => {
|
|
469
|
-
|
|
456
|
+
log2.error("error", {
|
|
470
457
|
err
|
|
471
458
|
}, {
|
|
472
|
-
F:
|
|
459
|
+
F: __dxlog_file2,
|
|
473
460
|
L: 27,
|
|
474
461
|
S: void 0,
|
|
475
462
|
C: (f, a) => f(...a)
|
|
@@ -479,8 +466,8 @@ var useAudioFile = (audioUrl) => {
|
|
|
479
466
|
once: true
|
|
480
467
|
});
|
|
481
468
|
audio2.addEventListener("canplay", () => {
|
|
482
|
-
|
|
483
|
-
F:
|
|
469
|
+
log2.info("starting...", void 0, {
|
|
470
|
+
F: __dxlog_file2,
|
|
484
471
|
L: 35,
|
|
485
472
|
S: void 0,
|
|
486
473
|
C: (f, a) => f(...a)
|
|
@@ -543,19 +530,47 @@ var useAudioTrack = (active) => {
|
|
|
543
530
|
};
|
|
544
531
|
|
|
545
532
|
// packages/plugins/plugin-transcription/src/hooks/useQueueModelAdapter.ts
|
|
546
|
-
import { useMemo, useEffect as useEffect3 } from "react";
|
|
547
|
-
var useQueueModelAdapter = (renderer, queue,
|
|
548
|
-
const model = useMemo(() => new
|
|
533
|
+
import { useMemo, useEffect as useEffect3, useState as useState3 } from "react";
|
|
534
|
+
var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
|
|
535
|
+
const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
|
|
549
536
|
queue
|
|
550
537
|
]);
|
|
538
|
+
const [loaded, setLoaded] = useState3(false);
|
|
551
539
|
useEffect3(() => {
|
|
552
|
-
if (!queue
|
|
540
|
+
if (!queue) {
|
|
553
541
|
return;
|
|
554
542
|
}
|
|
555
|
-
const
|
|
556
|
-
|
|
543
|
+
const update = () => {
|
|
544
|
+
for (const block of queue?.items ?? []) {
|
|
545
|
+
model.appendChunk(block);
|
|
546
|
+
}
|
|
547
|
+
setLoaded(true);
|
|
548
|
+
};
|
|
549
|
+
let i;
|
|
550
|
+
if (queue.isLoading) {
|
|
551
|
+
i = setInterval(() => {
|
|
552
|
+
if (!queue?.isLoading) {
|
|
553
|
+
clearInterval(i);
|
|
554
|
+
update();
|
|
555
|
+
}
|
|
556
|
+
}, 1e3);
|
|
557
|
+
} else {
|
|
558
|
+
update();
|
|
559
|
+
}
|
|
560
|
+
return () => clearTimeout(i);
|
|
561
|
+
}, [
|
|
562
|
+
model,
|
|
563
|
+
queue
|
|
564
|
+
]);
|
|
565
|
+
useEffect3(() => {
|
|
566
|
+
if (!loaded || !queue || model.chunks.length === queue.items.length) {
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
const chunk = queue.items[queue.items.length - 1];
|
|
570
|
+
model.appendChunk(chunk);
|
|
557
571
|
}, [
|
|
558
572
|
model,
|
|
573
|
+
loaded,
|
|
559
574
|
queue?.items.length
|
|
560
575
|
]);
|
|
561
576
|
return model;
|
|
@@ -567,11 +582,12 @@ import { useCapabilities } from "@dxos/app-framework";
|
|
|
567
582
|
|
|
568
583
|
// packages/plugins/plugin-transcription/src/capabilities/index.ts
|
|
569
584
|
import { lazy } from "@dxos/app-framework";
|
|
570
|
-
var AppGraphBuilder = lazy(() => import("./app-graph-builder-
|
|
571
|
-
var IntentResolver = lazy(() => import("./intent-resolver-
|
|
572
|
-
var MeetingTranscriptionState = lazy(() => import("./meeting-transcription-state-
|
|
573
|
-
var ReactSurface = lazy(() => import("./react-surface-
|
|
574
|
-
var Transcriber = lazy(() => import("./transcriber-
|
|
585
|
+
var AppGraphBuilder = lazy(() => import("./app-graph-builder-REQZ5SC5.mjs"));
|
|
586
|
+
var IntentResolver = lazy(() => import("./intent-resolver-DZ62CJPC.mjs"));
|
|
587
|
+
var MeetingTranscriptionState = lazy(() => import("./meeting-transcription-state-MNA2XROE.mjs"));
|
|
588
|
+
var ReactSurface = lazy(() => import("./react-surface-PUXZNAZL.mjs"));
|
|
589
|
+
var Transcriber = lazy(() => import("./transcriber-YWWIV6KP.mjs"));
|
|
590
|
+
var Settings = lazy(() => import("./settings-JWDS4J3F.mjs"));
|
|
575
591
|
|
|
576
592
|
// packages/plugins/plugin-transcription/src/hooks/useTranscriber.ts
|
|
577
593
|
var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
|
|
@@ -602,12 +618,12 @@ var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
|
|
|
602
618
|
};
|
|
603
619
|
|
|
604
620
|
// packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts
|
|
605
|
-
import { useState as
|
|
621
|
+
import { useState as useState4, useEffect as useEffect5, useCallback } from "react";
|
|
606
622
|
import { scheduleMicroTask } from "@dxos/async";
|
|
607
623
|
import { Context } from "@dxos/context";
|
|
608
|
-
import { log as
|
|
624
|
+
import { log as log3 } from "@dxos/log";
|
|
609
625
|
import { useSoundEffect } from "@dxos/react-ui-sfx";
|
|
610
|
-
var
|
|
626
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
|
|
611
627
|
var useVoiceInput = ({ active, onUpdate }) => {
|
|
612
628
|
const soundStart = useSoundEffect("StartRecording");
|
|
613
629
|
const soundStop = useSoundEffect("StopRecording");
|
|
@@ -615,7 +631,7 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
615
631
|
const text = segments.map((str) => str.text.trim().replace(/[^\w\s]/g, "")).join(" ");
|
|
616
632
|
onUpdate(text);
|
|
617
633
|
}, []);
|
|
618
|
-
const [recording, setRecording] =
|
|
634
|
+
const [recording, setRecording] = useState4(false);
|
|
619
635
|
const track = useAudioTrack(active);
|
|
620
636
|
const transcriber = useTranscriber({
|
|
621
637
|
audioStreamTrack: track,
|
|
@@ -623,14 +639,14 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
623
639
|
});
|
|
624
640
|
useEffect5(() => {
|
|
625
641
|
const ctx = new Context(void 0, {
|
|
626
|
-
F:
|
|
642
|
+
F: __dxlog_file3,
|
|
627
643
|
L: 43
|
|
628
644
|
});
|
|
629
645
|
scheduleMicroTask(ctx, async () => {
|
|
630
646
|
if (active && transcriber) {
|
|
631
647
|
await transcriber.open();
|
|
632
|
-
|
|
633
|
-
F:
|
|
648
|
+
log3.info("starting...", void 0, {
|
|
649
|
+
F: __dxlog_file3,
|
|
634
650
|
L: 47,
|
|
635
651
|
S: void 0,
|
|
636
652
|
C: (f, a) => f(...a)
|
|
@@ -641,8 +657,8 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
641
657
|
} else if (!active && transcriber?.isOpen) {
|
|
642
658
|
transcriber?.stopChunksRecording();
|
|
643
659
|
await transcriber?.close();
|
|
644
|
-
|
|
645
|
-
F:
|
|
660
|
+
log3.info("stopped", void 0, {
|
|
661
|
+
F: __dxlog_file3,
|
|
646
662
|
L: 54,
|
|
647
663
|
S: void 0,
|
|
648
664
|
C: (f, a) => f(...a)
|
|
@@ -667,10 +683,11 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
667
683
|
var TranscriptionContainer = ({ role, transcript: transcript2 }) => {
|
|
668
684
|
const attendableId = fullyQualifiedId(transcript2);
|
|
669
685
|
const space = getSpace(transcript2);
|
|
686
|
+
const members = useMembers(space?.key).map((member) => member.identity);
|
|
670
687
|
const queue = useQueue(transcript2.queue.dxn, {
|
|
671
688
|
pollInterval: 1e3
|
|
672
689
|
});
|
|
673
|
-
const model = useQueueModelAdapter(renderMarkdown, queue);
|
|
690
|
+
const model = useQueueModelAdapter(renderMarkdown(members), queue);
|
|
674
691
|
return /* @__PURE__ */ React2.createElement(StackItem.Content, {
|
|
675
692
|
role,
|
|
676
693
|
classNames: "container-max-width pli-2"
|
|
@@ -697,6 +714,7 @@ export {
|
|
|
697
714
|
IntentResolver,
|
|
698
715
|
MeetingTranscriptionState,
|
|
699
716
|
ReactSurface,
|
|
700
|
-
Transcriber
|
|
717
|
+
Transcriber,
|
|
718
|
+
Settings
|
|
701
719
|
};
|
|
702
|
-
//# sourceMappingURL=chunk-
|
|
720
|
+
//# sourceMappingURL=chunk-K2LS2QOM.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/TranscriptContainer.tsx", "../../../src/components/Transcript/Transcript.tsx", "../../../src/components/Transcript/transcript-extension.ts", "../../../src/model/model.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useQueueModelAdapter.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/capabilities/index.ts", "../../../src/hooks/useVoiceInput.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC } from 'react';\n\nimport { fullyQualifiedId, getSpace } from '@dxos/client/echo';\nimport { useMembers, useQueue } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { type DataType } from '@dxos/schema';\n\nimport { Transcript, renderMarkdown } from './Transcript';\nimport { useQueueModelAdapter } from '../hooks';\nimport { type TranscriptType } from '../types';\n\nexport const TranscriptionContainer: FC<{ role: string; transcript: TranscriptType }> = ({ role, transcript }) => {\n const attendableId = fullyQualifiedId(transcript);\n const space = getSpace(transcript);\n const members = useMembers(space?.key).map((member) => member.identity);\n const queue = useQueue<DataType.Message>(transcript.queue.dxn, { pollInterval: 1_000 });\n const model = useQueueModelAdapter(renderMarkdown(members), queue);\n\n return (\n <StackItem.Content role={role} classNames='container-max-width pli-2'>\n <Transcript attendableId={attendableId} space={space} model={model} transcript={transcript} />\n </StackItem.Content>\n );\n};\n\nexport default TranscriptionContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { IconButton, type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport {\n createBasicExtensions,\n createMarkdownExtensions,\n createRenderer,\n createThemeExtensions,\n decorateMarkdown,\n editorWidth,\n preview,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { transcript } from './transcript-extension';\nimport { type SerializationModel } from '../../model';\nimport { type TranscriptType } from '../../types';\n\nexport const renderMarkdown =\n (identities: Identity[]) =>\n (message: DataType.Message, index: number, debug = false): string[] => {\n if (message.sender.role === 'assistant') {\n // Start/stop block.\n return [message.blocks.find((block) => block.type === 'transcription')?.text ?? '', ''];\n }\n\n // TODO(burdon): Use link/reference markup for users (with popover).\n // TODO(burdon): Color and avatar.\n const identity = identities.find((identity) => identity.did === message.sender.identityDid);\n const name =\n identity?.profile?.displayName ??\n message.sender.contact?.target?.fullName ??\n message.sender.name ??\n message.sender.email ??\n message.sender.identityDid;\n const blocks = message.blocks.filter((block) => block.type === 'transcription');\n return [\n `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ''),\n blocks.map((block) => block.text.trim()).join(' '),\n '',\n ];\n };\n\nexport type TranscriptProps = ThemedClassName<{\n transcript?: TranscriptType;\n space?: Space;\n model: SerializationModel<DataType.Message>;\n // TODO(wittjosiah): Move to container.\n attendableId?: string;\n ignoreAttention?: boolean;\n}>;\n\n/**\n * Transcript component implemented using the editor.\n */\nexport const Transcript = ({\n classNames,\n transcript: object,\n space,\n model,\n attendableId,\n ignoreAttention,\n}: TranscriptProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n return {\n extensions: [\n createBasicExtensions({ readOnly: true, lineWrapping: true }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode }),\n decorateMarkdown(),\n space && preview(),\n transcript({\n model,\n started: object?.started ? new Date(object.started) : undefined,\n renderButton: createRenderer(({ onClick }) => (\n <IconButton icon='ph--arrow-line-down--regular' iconOnly label='Scroll to bottom' onClick={onClick} />\n )),\n }),\n ].filter(isNotFalsy),\n };\n }, [space, model]);\n\n return (\n <div\n ref={parentRef}\n className={mx('flex grow overflow-hidden', editorWidth, classNames)}\n data-popover-collision-boundary={true}\n />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, GutterMarker, ViewPlugin, type ViewUpdate, gutter } from '@codemirror/view';\nimport { format } from 'date-fns/format';\nimport { intervalToDuration } from 'date-fns/intervalToDuration';\n\nimport { type CleanupFn, addEventListener, combine } from '@dxos/async';\nimport { type RenderCallback } from '@dxos/react-ui-editor';\nimport { type DataType } from '@dxos/schema';\n\nimport { DocumentAdapter, type SerializationModel } from '../../model';\n\n/**\n * Data structure that maps Chunks queue to lines with transcript state.\n */\nexport type TranscriptOptions = {\n model: SerializationModel<DataType.Message>;\n started?: Date;\n renderButton?: RenderCallback<{ onClick: () => void }>;\n};\n\n/**\n * Scrolling transcript with timestamps.\n */\nexport const transcript = ({ model, started, renderButton }: TranscriptOptions): Extension => {\n return [\n // Show timestamps in the gutter.\n gutter({\n class: 'cm-timestamp-gutter',\n lineMarkerChange: (update) => update.docChanged || update.viewportChanged,\n markers: (view) => {\n const start = getStartTime(started, model.chunks[0]);\n const builder = new RangeSetBuilder<GutterMarker>();\n for (const { from, to } of view.visibleRanges) {\n let line = view.state.doc.lineAt(from);\n while (line.from <= to) {\n const block = model.getChunkAtLine(line.number)?.blocks[0];\n const timestamp = block?.type === 'transcription' && block.started;\n if (timestamp) {\n builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));\n }\n\n if (line.to + 1 > view.state.doc.length) {\n break;\n }\n\n line = view.state.doc.lineAt(line.to + 1);\n }\n }\n\n return builder.finish();\n },\n }),\n\n // Listen for model updates.\n ViewPlugin.fromClass(\n class {\n private readonly _controls?: HTMLDivElement;\n private readonly _cleanup: CleanupFn;\n private readonly _adapter: DocumentAdapter;\n private _initialized = false;\n\n constructor(view: EditorView) {\n this._adapter = new DocumentAdapter(view);\n\n const scroller = view.scrollDOM;\n let isAutoScrolling = false;\n let hasScrolled = false;\n\n let timeout: NodeJS.Timeout | undefined;\n const scrollToBottom = (smooth = false) => {\n scroller.style.scrollBehavior = smooth ? 'smooth' : '';\n\n // Temporarily hide scrollbar to prevent flicker.\n scroller.classList.add('cm-hide-scrollbar');\n isAutoScrolling = true;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n this._controls?.classList.add('opacity-0');\n scroller.classList.remove('cm-hide-scrollbar');\n isAutoScrolling = false;\n }, 500);\n\n // Scroll to bottom.\n view.dispatch({\n effects: EditorView.scrollIntoView(view.state.doc.length, { y: 'end' }),\n });\n };\n\n // Scroll button.\n if (renderButton) {\n this._controls = document.createElement('div');\n this._controls.classList.add('cm-controls', 'transition-opacity', 'duration-300', 'opacity-0');\n view.dom.appendChild(this._controls);\n renderButton(\n this._controls,\n {\n onClick: () => {\n scrollToBottom(false);\n },\n },\n view,\n );\n }\n\n // Event listeners.\n this._cleanup = combine(\n addEventListener(view.scrollDOM, 'scroll', () => {\n if (!isAutoScrolling) {\n hasScrolled = true;\n this._controls?.classList.remove('opacity-0');\n }\n }),\n\n model.update.on(() => {\n // Check if clamped to bottom.\n const autoScroll =\n scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;\n\n // Sync.\n model.sync(this._adapter);\n\n // Scroll.\n if (autoScroll) {\n scrollToBottom(true);\n }\n }),\n );\n }\n\n update(update: ViewUpdate) {\n // Initial sync.\n if (!this._initialized) {\n this._initialized = true;\n setTimeout(() => {\n model.sync(this._adapter);\n });\n }\n }\n\n destroy() {\n this._controls?.remove();\n this._cleanup();\n }\n },\n ),\n\n EditorView.theme({\n '.cm-scroller': {\n overflowY: 'scroll',\n },\n '.cm-hide-scrollbar': {\n scrollbarWidth: 'none',\n '-ms-overflow-style': 'none',\n },\n '.cm-hide-scrollbar::-webkit-scrollbar': {\n display: 'none',\n },\n '.cm-controls': {\n position: 'absolute',\n bottom: '0.5rem',\n right: '0.5rem',\n zIndex: 1000,\n },\n '.cm-line': {\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter': {\n width: '6rem',\n paddingRight: '1rem',\n },\n '.cm-timestamp-gutter > .cm-gutterElement > div': {\n display: 'inline-flex',\n textAlign: 'right',\n padding: '3px',\n },\n }),\n ];\n};\n\n/**\n * Gutter marker that displays a timestamp.\n */\nclass TimestampMarker extends GutterMarker {\n constructor(\n readonly _line: number,\n readonly _timestamp: Date,\n readonly _started?: Date,\n ) {\n super();\n }\n\n override eq(other: this) {\n return other._timestamp === this._timestamp;\n }\n\n override toDOM(view: EditorView) {\n const el = document.createElement('div');\n el.className = 'text-sm text-subdued hover:bg-hoverSurface cursor-pointer';\n el.textContent = formatTimestamp(this._timestamp, this._started);\n // TODO(burdon): Click to bookmark or copy hyperlink.\n el.onclick = () => {\n const pos = view.state.doc.line(this._line).from;\n view.dispatch({\n effects: EditorView.scrollIntoView(pos, { y: 'start' }),\n });\n };\n\n return el;\n }\n}\n\nconst getStartTime = (started?: Date, message?: DataType.Message): Date | undefined => {\n if (started) {\n return started;\n }\n\n if (message?.blocks[0]?.type === 'transcription' && message.blocks[0].started) {\n return new Date(message.blocks[0].started);\n }\n\n return undefined;\n};\n\nconst formatTimestamp = (timestamp: Date, relative?: Date) => {\n if (relative) {\n const pad = (n = 0) => String(n).padStart(2, '0');\n const { hours, minutes, seconds } = intervalToDuration({ start: relative, end: timestamp });\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n } else {\n return format(timestamp, 'HH:mm:ss');\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Text } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nexport type Chunk = { id: string };\n\n/**\n * Covert block to a set of markdown lines.\n */\nexport type ChunkRenderer<T extends Chunk> = (chunk: T, index: number, debug?: boolean) => string[];\n\n/**\n * Abstract representation of the document model.\n */\nexport interface ChunkDocument {\n lineCount(): number;\n replaceLines(from: number, remove: number, insert: string[]): void;\n}\n\n/**\n * Codemirror document adapter.\n */\nexport class DocumentAdapter implements ChunkDocument {\n constructor(private readonly _view: EditorView) {}\n\n /** The document must always have at least one line. */\n lineCount(): number {\n return this._view.state.doc.lines - 1;\n }\n\n replaceLines(from: number, remove: number, insert: string[]): void {\n log('replaceLines', { count: this._view.state.doc.lines, from, remove, insert });\n\n const numLines = this._view.state.doc.lines;\n const posFrom = this._view.state.doc.line(from).from;\n const posTo = remove === 0 ? posFrom : this._view.state.doc.line(Math.min(numLines, from + remove)).from;\n\n // Don't remove the last line.\n let text = insert.join('\\n');\n if (posTo === this._view.state.doc.length) {\n text += '\\n';\n }\n\n this._view.dispatch({\n changes: { from: posFrom, to: posTo, insert: text },\n });\n }\n}\n\ntype ChunkChange<T extends Chunk> =\n | {\n type: 'append';\n index: number;\n chunk: T;\n }\n | {\n type: 'update';\n index: number;\n chunk: T;\n }\n | {\n type: 'delete';\n index: number;\n id: string;\n };\n\n/**\n * Each Chunk can be converted into a set of lines.\n * Chunks can be added, updated or deleted from the Queue.\n * A Document is an immutable projection that represents a flat list of lines corresponding to the Queue.\n *\n * Ideally we would implement a custom virtual Text model for the View, but this currently isn't possible in Codemirror.\n * Instead this model tracks changes and syncs them with the ChunkDocument.\n */\nexport class SerializationModel<T extends Chunk> {\n /** Ordered set of chunks. */\n private readonly _chunks: T[] = [];\n\n /** Map of chunk IDs to their current line counts. */\n private readonly _chunkLineCounts = new Map<string, number>();\n\n /** Map of line numbers to chunk IDs. */\n private readonly _lineToChunk = new Map<number, T>();\n\n /** Track chunk changes since last sync. */\n private readonly _changes: Array<ChunkChange<T>> = [];\n\n /** Emits when the document is updated. */\n public readonly update = new Event<void>();\n\n constructor(\n private readonly _renderer: ChunkRenderer<T>,\n initialChunks: T[] = [],\n ) {\n initialChunks.forEach((chunk) => {\n this.appendChunk(chunk);\n });\n }\n\n toJSON() {\n return {\n chunks: this._chunks.length,\n changes: this._changes.length,\n };\n }\n\n get doc() {\n return Text.of([...this._chunks.flatMap((chunk, index) => this._renderer(chunk, index)), '']);\n }\n\n get chunks() {\n return this._chunks;\n }\n\n /**\n * Get the block ID at the given line number.\n */\n getChunkAtLine(line: number): T | undefined {\n return this._lineToChunk.get(line);\n }\n\n reset(): this {\n this._chunks.length = 0;\n this._chunkLineCounts.clear();\n this._lineToChunk.clear();\n this.update.emit();\n return this;\n }\n\n appendChunk(chunk: T): this {\n const index = this._chunks.length;\n this._chunks.push(chunk);\n this._changes.push({ type: 'append', index, chunk });\n this.update.emit();\n return this;\n }\n\n updateChunk(chunk: T): this {\n const index = this._chunks.findIndex((c) => c.id === chunk.id);\n invariant(index !== -1);\n this._chunks[index] = chunk;\n this._changes.push({ type: 'update', index, chunk });\n this.update.emit();\n return this;\n }\n\n deleteBlock(id: string): this {\n const index = this._chunks.findIndex((c) => c.id === id);\n invariant(index !== -1);\n this._chunks.splice(index, 1);\n this._changes.push({ type: 'delete', index, id });\n this.update.emit();\n return this;\n }\n\n /**\n * Syncs the tracked changes with the ChunkDocument.\n */\n sync(document: ChunkDocument): this {\n log('sync', { changes: this._changes });\n\n // Process each change in order.\n for (const change of this._changes) {\n switch (change.type) {\n case 'append': {\n // For appends, convert block to lines and add at the end.\n const lines = this._renderer(change.chunk, change.index);\n const lastLine = document.lineCount();\n document.replaceLines(lastLine + 1, 0, lines);\n break;\n }\n\n case 'update': {\n // For updates, find the block's line range and replace with new lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.chunk.id)!;\n const newLines = this._renderer(change.chunk, change.index);\n document.replaceLines(lineStart, previousLineCount, newLines);\n break;\n }\n\n case 'delete': {\n // For deletes, find the block's line range and remove those lines.\n let lineStart = 1;\n for (let i = 0; i < change.index; i++) {\n lineStart += this._chunkLineCounts.get(this._chunks[i].id)!;\n }\n const previousLineCount = this._chunkLineCounts.get(change.id)!;\n document.replaceLines(lineStart, previousLineCount, []);\n break;\n }\n }\n }\n\n // Clear the line-to-block mapping.\n this._lineToChunk.clear();\n\n // Update all block line counts and line-to-block mapping after processing changes.\n let currentLine = 1;\n for (const [index, chunk] of this._chunks.entries()) {\n const lineCount = this._renderer(chunk, index).length;\n this._chunkLineCounts.set(chunk.id, lineCount);\n this._lineToChunk.set(currentLine, chunk);\n currentLine += lineCount;\n }\n\n // Clean up deleted blocks.\n const chunkIds = new Set(this._chunks.map((chunk) => chunk.id));\n for (const id of this._chunkLineCounts.keys()) {\n if (!chunkIds.has(id)) {\n this._chunkLineCounts.delete(id);\n }\n }\n\n // Clear changes after sync.\n this._changes.length = 0;\n return this;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { log } from '@dxos/log';\n\nexport type UseAudioState = {\n audio?: HTMLAudioElement;\n stream?: MediaStream;\n track?: MediaStreamTrack;\n};\n\nexport const useAudioFile = (audioUrl: string): UseAudioState => {\n const [{ audio, stream, track }, setStream] = useState<UseAudioState>({});\n useEffect(() => {\n const t = setTimeout(async () => {\n const response = await fetch(audioUrl);\n const blob = await response.blob();\n const audio = new Audio();\n audio.src = URL.createObjectURL(blob);\n await new Promise<void>((resolve, reject) => {\n audio.addEventListener(\n 'error',\n (err) => {\n log.error('error', { err });\n reject(err);\n },\n { once: true },\n );\n audio.addEventListener(\n 'canplay',\n () => {\n log.info('starting...');\n resolve();\n },\n { once: true },\n );\n audio.load();\n });\n\n const ctx = new AudioContext();\n\n const destination = ctx.createMediaStreamDestination();\n destination.channelCount = 1;\n\n const source = ctx.createMediaElementSource(audio);\n source.connect(destination);\n\n setStream({\n audio,\n stream: destination.stream,\n track: destination.stream.getAudioTracks()[0],\n });\n });\n\n return () => clearTimeout(t);\n }, [audioUrl]);\n\n return { audio, stream, track };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\n/**\n *\n */\n// TODO(burdon): Reconcile with react-ui-sfx and plugin-calls.\nexport const useAudioTrack = (active?: boolean): MediaStreamTrack | undefined => {\n const [track, setTrack] = useState<MediaStreamTrack>();\n useEffect(() => {\n if (!active) {\n track?.stop();\n setTrack(undefined);\n return;\n }\n\n const initAudio = async () => {\n const audio = new Audio();\n audio.srcObject = await navigator.mediaDevices.getUserMedia({ audio: true });\n const [track] = audio.srcObject.getAudioTracks();\n if (track) {\n setTrack(track);\n }\n };\n\n if (active) {\n void initAudio();\n }\n }, [active]);\n\n return track;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo, useEffect, useState } from 'react';\n\nimport { type Queue } from '@dxos/react-client/echo';\n\nimport { type Chunk, type ChunkRenderer, SerializationModel } from '../model';\n\n/**\n * Model adapter for a queue.\n */\nexport const useQueueModelAdapter = <T extends Chunk>(\n renderer: ChunkRenderer<T>,\n queue: Queue<T> | undefined,\n initialChunks: T[] = [],\n): SerializationModel<T> => {\n const model = useMemo(() => new SerializationModel<T>(renderer, initialChunks), [queue]);\n const [loaded, setLoaded] = useState(false);\n\n // Set initial blocks.\n useEffect(() => {\n if (!queue) {\n return;\n }\n\n const update = () => {\n for (const block of queue?.items ?? []) {\n model.appendChunk(block);\n }\n\n setLoaded(true);\n };\n\n // TODO(burdon): This is a hack to ensure the queue is loaded.\n let i: NodeJS.Timeout | undefined;\n if (queue.isLoading) {\n i = setInterval(() => {\n if (!queue?.isLoading) {\n clearInterval(i);\n update();\n }\n }, 1_000);\n } else {\n update();\n }\n\n return () => clearTimeout(i);\n }, [model, queue]);\n\n // TODO(burdon): Can we listen for queue events?\n useEffect(() => {\n if (!loaded || !queue || model.chunks.length === queue.items.length) {\n return;\n }\n\n const chunk = queue.items[queue.items.length - 1];\n model.appendChunk(chunk);\n }, [model, loaded, queue?.items.length]);\n\n return model;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework';\n\nimport { TranscriptionCapabilities } from '../capabilities';\nimport { type Transcriber } from '../transcriber';\n\n/**\n * Records audio while user is speaking and transcribes it after user is done speaking.\n */\nexport const useTranscriber = ({\n audioStreamTrack,\n onSegments,\n config,\n}: Partial<TranscriptionCapabilities.GetTranscriberProps>) => {\n const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);\n\n // Initialize audio transcription.\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!onSegments || !audioStreamTrack || !getTranscriber) {\n return undefined;\n }\n\n return getTranscriber({ audioStreamTrack, onSegments, config });\n }, [audioStreamTrack, onSegments, getTranscriber, config]);\n\n useEffect(() => {\n return () => {\n void transcriber?.close();\n };\n }, [transcriber]);\n\n return transcriber;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const MeetingTranscriptionState = lazy(() => import('./meeting-transcription-state'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const Transcriber = lazy(() => import('./transcriber'));\nexport const Settings = lazy(() => import('./settings'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useState, useEffect, useCallback } from 'react';\n\nimport { scheduleMicroTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\n\nimport { useAudioTrack } from './useAudioTrack';\nimport { useTranscriber } from './useTranscriber';\nimport { type TranscriberParams } from '../transcriber';\n\nexport type UseVoiceInputProps = {\n active?: boolean;\n onUpdate: (text: string) => void;\n};\n\n/**\n * Hook for voice input.\n */\nexport const useVoiceInput = ({ active, onUpdate }: UseVoiceInputProps) => {\n const soundStart = useSoundEffect('StartRecording');\n const soundStop = useSoundEffect('StopRecording');\n\n const handleSegments = useCallback<TranscriberParams['onSegments']>(async (segments) => {\n const text = segments.map((str) => str.text.trim().replace(/[^\\w\\s]/g, '')).join(' ');\n onUpdate(text);\n }, []);\n\n // Audio/transcription.\n const [recording, setRecording] = useState(false);\n const track = useAudioTrack(active);\n const transcriber = useTranscriber({\n audioStreamTrack: track,\n onSegments: handleSegments,\n });\n\n // Start/stop transcription.\n useEffect(() => {\n const ctx = new Context();\n scheduleMicroTask(ctx, async () => {\n if (active && transcriber) {\n await transcriber.open();\n log.info('starting...');\n setRecording(true);\n void soundStart.play();\n transcriber.startChunksRecording();\n } else if (!active && transcriber?.isOpen) {\n transcriber?.stopChunksRecording();\n await transcriber?.close();\n log.info('stopped');\n setRecording(false);\n void soundStop.play();\n }\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [active, transcriber]);\n\n return { recording };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "fullyQualifiedId", "getSpace", "useMembers", "useQueue", "StackItem", "React", "IconButton", "useThemeContext", "createBasicExtensions", "createMarkdownExtensions", "createRenderer", "createThemeExtensions", "decorateMarkdown", "editorWidth", "preview", "useTextEditor", "mx", "isNotFalsy", "RangeSetBuilder", "EditorView", "GutterMarker", "ViewPlugin", "gutter", "format", "intervalToDuration", "addEventListener", "combine", "Text", "Event", "invariant", "log", "DocumentAdapter", "constructor", "_view", "lineCount", "state", "doc", "lines", "replaceLines", "from", "remove", "insert", "count", "numLines", "posFrom", "line", "posTo", "Math", "min", "text", "join", "length", "dispatch", "changes", "to", "SerializationModel", "_renderer", "initialChunks", "_chunks", "_chunkLineCounts", "Map", "_lineToChunk", "_changes", "update", "forEach", "chunk", "appendChunk", "toJSON", "chunks", "of", "flatMap", "index", "getChunkAtLine", "get", "reset", "clear", "emit", "push", "type", "updateChunk", "findIndex", "c", "id", "deleteBlock", "splice", "sync", "document", "change", "lastLine", "lineStart", "i", "previousLineCount", "newLines", "currentLine", "entries", "set", "chunkIds", "Set", "map", "keys", "has", "delete", "transcript", "model", "started", "renderButton", "gutter", "class", "lineMarkerChange", "update", "docChanged", "viewportChanged", "markers", "view", "start", "getStartTime", "chunks", "builder", "RangeSetBuilder", "from", "to", "visibleRanges", "line", "state", "doc", "lineAt", "block", "getChunkAtLine", "number", "blocks", "timestamp", "type", "add", "TimestampMarker", "Date", "length", "finish", "ViewPlugin", "fromClass", "constructor", "_initialized", "_adapter", "DocumentAdapter", "scroller", "scrollDOM", "isAutoScrolling", "hasScrolled", "timeout", "scrollToBottom", "smooth", "style", "scrollBehavior", "classList", "clearTimeout", "setTimeout", "_controls", "remove", "dispatch", "effects", "EditorView", "scrollIntoView", "y", "document", "createElement", "dom", "appendChild", "onClick", "_cleanup", "combine", "addEventListener", "on", "autoScroll", "scrollHeight", "scrollTop", "clientHeight", "sync", "destroy", "theme", "overflowY", "scrollbarWidth", "display", "position", "bottom", "right", "zIndex", "paddingRight", "width", "textAlign", "padding", "GutterMarker", "_line", "_timestamp", "_started", "eq", "other", "toDOM", "el", "className", "textContent", "formatTimestamp", "onclick", "pos", "message", "undefined", "relative", "pad", "n", "String", "padStart", "hours", "minutes", "seconds", "intervalToDuration", "end", "format", "renderMarkdown", "identities", "message", "index", "debug", "sender", "role", "blocks", "find", "block", "type", "text", "identity", "did", "identityDid", "name", "profile", "displayName", "contact", "target", "fullName", "email", "filter", "id", "map", "trim", "join", "Transcript", "classNames", "transcript", "object", "space", "model", "attendableId", "ignoreAttention", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "extensions", "createBasicExtensions", "readOnly", "lineWrapping", "createMarkdownExtensions", "createThemeExtensions", "decorateMarkdown", "preview", "started", "Date", "undefined", "renderButton", "createRenderer", "onClick", "IconButton", "icon", "iconOnly", "label", "isNotFalsy", "div", "ref", "className", "mx", "editorWidth", "data-popover-collision-boundary", "useEffect", "useState", "log", "useAudioFile", "audioUrl", "audio", "stream", "track", "setStream", "t", "setTimeout", "response", "fetch", "blob", "Audio", "src", "URL", "createObjectURL", "Promise", "resolve", "reject", "addEventListener", "err", "error", "once", "info", "load", "ctx", "AudioContext", "destination", "createMediaStreamDestination", "channelCount", "source", "createMediaElementSource", "connect", "getAudioTracks", "clearTimeout", "useEffect", "useState", "useAudioTrack", "active", "track", "setTrack", "useState", "useEffect", "stop", "undefined", "initAudio", "audio", "Audio", "srcObject", "navigator", "mediaDevices", "getUserMedia", "getAudioTracks", "useMemo", "useEffect", "useState", "useQueueModelAdapter", "renderer", "queue", "initialChunks", "model", "useMemo", "SerializationModel", "loaded", "setLoaded", "useState", "useEffect", "update", "block", "items", "appendChunk", "i", "isLoading", "setInterval", "clearInterval", "clearTimeout", "chunks", "length", "chunk", "useEffect", "useMemo", "useCapabilities", "lazy", "AppGraphBuilder", "lazy", "IntentResolver", "MeetingTranscriptionState", "ReactSurface", "Transcriber", "Settings", "useTranscriber", "audioStreamTrack", "onSegments", "config", "getTranscriber", "useCapabilities", "TranscriptionCapabilities", "Transcriber", "transcriber", "useMemo", "undefined", "useEffect", "close", "useState", "useEffect", "useCallback", "scheduleMicroTask", "Context", "log", "useSoundEffect", "useVoiceInput", "active", "onUpdate", "soundStart", "useSoundEffect", "soundStop", "handleSegments", "useCallback", "segments", "text", "map", "str", "trim", "replace", "join", "recording", "setRecording", "useState", "track", "useAudioTrack", "transcriber", "useTranscriber", "audioStreamTrack", "onSegments", "useEffect", "ctx", "Context", "scheduleMicroTask", "open", "log", "info", "play", "startChunksRecording", "isOpen", "stopChunksRecording", "close", "dispose", "TranscriptionContainer", "role", "transcript", "attendableId", "fullyQualifiedId", "space", "getSpace", "members", "useMembers", "key", "map", "member", "identity", "queue", "useQueue", "dxn", "pollInterval", "model", "useQueueModelAdapter", "renderMarkdown", "React", "StackItem", "Content", "classNames", "Transcript"]
|
|
7
|
+
}
|