@dxos/plugin-transcription 0.8.2-main.2f9c567 → 0.8.2-main.36232bc
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-3LU3XBEB.mjs → TranscriptContainer-2VFHUHLE.mjs} +2 -2
- package/dist/lib/browser/{app-graph-builder-YXELPN6F.mjs → app-graph-builder-TDP6PYV6.mjs} +20 -19
- package/dist/lib/browser/app-graph-builder-TDP6PYV6.mjs.map +7 -0
- package/dist/lib/browser/{chunk-GWY2Q2NE.mjs → chunk-KSUYWWIU.mjs} +6 -6
- package/dist/lib/browser/chunk-KSUYWWIU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-HNIKXVCG.mjs → chunk-NFVDICSJ.mjs} +7 -8
- package/dist/lib/browser/chunk-NFVDICSJ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-HRDAILQX.mjs → chunk-O6RY7FNK.mjs} +2 -2
- package/dist/lib/browser/{chunk-TGOKX32G.mjs → chunk-YRWBY6UK.mjs} +15 -17
- package/dist/lib/browser/chunk-YRWBY6UK.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +6 -6
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-BBB3DWV4.mjs → intent-resolver-ZWKYRFE7.mjs} +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-R277DACJ.mjs → react-surface-F32UNCKZ.mjs} +4 -4
- package/dist/lib/browser/{settings-I226DZ27.mjs → settings-6YAHKVKX.mjs} +2 -2
- package/dist/lib/browser/{transcriber-QRSS6X6S.mjs → transcriber-MSBS4VBI.mjs} +3 -3
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node/{TranscriptContainer-DICOMZLM.cjs → TranscriptContainer-E2D7PKO3.cjs} +7 -7
- package/dist/lib/node/{TranscriptContainer-DICOMZLM.cjs.map → TranscriptContainer-E2D7PKO3.cjs.map} +2 -2
- package/dist/lib/node/{app-graph-builder-I6LYVIYY.cjs → app-graph-builder-W4VDMVGV.cjs} +29 -28
- package/dist/lib/node/app-graph-builder-W4VDMVGV.cjs.map +7 -0
- package/dist/lib/node/{chunk-RK4BEN5E.cjs → chunk-7XIIUVN3.cjs} +9 -9
- package/dist/lib/node/chunk-7XIIUVN3.cjs.map +7 -0
- package/dist/lib/node/{chunk-34WFY7M7.cjs → chunk-IXU57SCA.cjs} +16 -18
- package/dist/lib/node/chunk-IXU57SCA.cjs.map +7 -0
- package/dist/lib/node/{chunk-4JOJCZPJ.cjs → chunk-NBC6V3M2.cjs} +10 -11
- package/dist/lib/node/chunk-NBC6V3M2.cjs.map +7 -0
- package/dist/lib/node/{chunk-K553L7CZ.cjs → chunk-TJMZ26GS.cjs} +5 -5
- package/dist/lib/node/index.cjs +27 -27
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-7XY3WITN.cjs → intent-resolver-RM4JOCDV.cjs} +7 -7
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-HUSWAORU.cjs → react-surface-YQHBGPOC.cjs} +10 -10
- package/dist/lib/node/{settings-NDMU3EWQ.cjs → settings-ZMB4XRWS.cjs} +7 -7
- package/dist/lib/node/{transcriber-UZJMG44C.cjs → transcriber-55OE4X6I.cjs} +8 -8
- package/dist/lib/node/types/index.cjs +7 -7
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{TranscriptContainer-K4E4P5T6.mjs → TranscriptContainer-5N3BSK2S.mjs} +2 -2
- package/dist/lib/node-esm/{app-graph-builder-6FY2UQOH.mjs → app-graph-builder-DDDVKUHS.mjs} +20 -19
- package/dist/lib/node-esm/app-graph-builder-DDDVKUHS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-6C34FO4C.mjs → chunk-4RMJO6QQ.mjs} +7 -8
- package/dist/lib/node-esm/chunk-4RMJO6QQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-3I7AC3D3.mjs → chunk-HZBSWUJH.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-KUQ3ZTRX.mjs → chunk-OS2ITZUL.mjs} +15 -17
- package/dist/lib/node-esm/chunk-OS2ITZUL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-CKANLRS4.mjs → chunk-UWF6LM27.mjs} +6 -6
- package/dist/lib/node-esm/chunk-UWF6LM27.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +6 -6
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-ACGAPLDZ.mjs → intent-resolver-HDRFXMKP.mjs} +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-G2OY4MWL.mjs → react-surface-DRDNXTFZ.mjs} +4 -4
- package/dist/lib/node-esm/{settings-O7X2UQQG.mjs → settings-I35TVDUG.mjs} +2 -2
- package/dist/lib/node-esm/{transcriber-NVVFH7IF.mjs → transcriber-HH7EMCGH.mjs} +3 -3
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.d.ts +3 -3
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts +2 -2
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +10 -10
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/transcript-extension.d.ts +2 -2
- package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/entity-extraction/entity-extraction.d.ts +3 -3
- package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -1
- package/dist/types/src/testing/testing.d.ts +10 -11
- package/dist/types/src/testing/testing.d.ts.map +1 -1
- 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 +2 -2
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +19 -26
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +10 -10
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +49 -51
- package/src/TranscriptionPlugin.tsx +2 -2
- package/src/capabilities/app-graph-builder.ts +10 -10
- package/src/components/Transcript/Transcript.stories.tsx +5 -5
- package/src/components/Transcript/Transcript.tsx +4 -10
- package/src/components/Transcript/deprecated/OldTranscript.tsx +13 -19
- package/src/components/Transcript/transcript-extension.ts +3 -3
- package/src/components/TranscriptContainer.tsx +2 -2
- package/src/components/transcription.stories.tsx +8 -14
- package/src/entity-extraction/entity-extraction.test.ts +4 -23
- package/src/entity-extraction/entity-extraction.ts +6 -11
- package/src/model/model.test.ts +10 -14
- package/src/testing/testing.ts +21 -34
- package/src/transcriber/transcriber.browser.test.ts +3 -3
- package/src/transcriber/transcriber.ts +3 -6
- package/src/transcriber/transcription-manager.ts +8 -8
- package/src/types/schema.ts +8 -10
- package/src/types/types.ts +10 -12
- package/dist/lib/browser/app-graph-builder-YXELPN6F.mjs.map +0 -7
- package/dist/lib/browser/chunk-GWY2Q2NE.mjs.map +0 -7
- package/dist/lib/browser/chunk-HNIKXVCG.mjs.map +0 -7
- package/dist/lib/browser/chunk-TGOKX32G.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-I6LYVIYY.cjs.map +0 -7
- package/dist/lib/node/chunk-34WFY7M7.cjs.map +0 -7
- package/dist/lib/node/chunk-4JOJCZPJ.cjs.map +0 -7
- package/dist/lib/node/chunk-RK4BEN5E.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-6FY2UQOH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6C34FO4C.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CKANLRS4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KUQ3ZTRX.mjs.map +0 -7
- /package/dist/lib/browser/{TranscriptContainer-3LU3XBEB.mjs.map → TranscriptContainer-2VFHUHLE.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-HRDAILQX.mjs.map → chunk-O6RY7FNK.mjs.map} +0 -0
- /package/dist/lib/browser/{intent-resolver-BBB3DWV4.mjs.map → intent-resolver-ZWKYRFE7.mjs.map} +0 -0
- /package/dist/lib/browser/{react-surface-R277DACJ.mjs.map → react-surface-F32UNCKZ.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-I226DZ27.mjs.map → settings-6YAHKVKX.mjs.map} +0 -0
- /package/dist/lib/browser/{transcriber-QRSS6X6S.mjs.map → transcriber-MSBS4VBI.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-K553L7CZ.cjs.map → chunk-TJMZ26GS.cjs.map} +0 -0
- /package/dist/lib/node/{intent-resolver-7XY3WITN.cjs.map → intent-resolver-RM4JOCDV.cjs.map} +0 -0
- /package/dist/lib/node/{react-surface-HUSWAORU.cjs.map → react-surface-YQHBGPOC.cjs.map} +0 -0
- /package/dist/lib/node/{settings-NDMU3EWQ.cjs.map → settings-ZMB4XRWS.cjs.map} +0 -0
- /package/dist/lib/node/{transcriber-UZJMG44C.cjs.map → transcriber-55OE4X6I.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-K4E4P5T6.mjs.map → TranscriptContainer-5N3BSK2S.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-3I7AC3D3.mjs.map → chunk-HZBSWUJH.mjs.map} +0 -0
- /package/dist/lib/node-esm/{intent-resolver-ACGAPLDZ.mjs.map → intent-resolver-HDRFXMKP.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-surface-G2OY4MWL.mjs.map → react-surface-DRDNXTFZ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-O7X2UQQG.mjs.map → settings-I35TVDUG.mjs.map} +0 -0
- /package/dist/lib/node-esm/{transcriber-NVVFH7IF.mjs.map → transcriber-HH7EMCGH.mjs.map} +0 -0
|
@@ -16,14 +16,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var app_graph_builder_W4VDMVGV_exports = {};
|
|
20
|
+
__export(app_graph_builder_W4VDMVGV_exports, {
|
|
21
21
|
default: () => app_graph_builder_default
|
|
22
22
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
24
|
-
var
|
|
23
|
+
module.exports = __toCommonJS(app_graph_builder_W4VDMVGV_exports);
|
|
24
|
+
var import_chunk_7XIIUVN3 = require("./chunk-7XIIUVN3.cjs");
|
|
25
25
|
var import_chunk_J72PUQ3C = require("./chunk-J72PUQ3C.cjs");
|
|
26
|
-
var
|
|
26
|
+
var import_chunk_IXU57SCA = require("./chunk-IXU57SCA.cjs");
|
|
27
27
|
var import_chunk_JUGOXWES = require("./chunk-JUGOXWES.cjs");
|
|
28
28
|
var import_chunk_NVZWGFJL = require("./chunk-NVZWGFJL.cjs");
|
|
29
29
|
var import_app_framework = require("@dxos/app-framework");
|
|
@@ -40,15 +40,13 @@ var import_plugin_graph = require("@dxos/plugin-graph");
|
|
|
40
40
|
var import_types2 = require("@dxos/plugin-markdown/types");
|
|
41
41
|
var import_plugin_meeting = require("@dxos/plugin-meeting");
|
|
42
42
|
var import_types3 = require("@dxos/plugin-meeting/types");
|
|
43
|
-
var import_schema = require("@dxos/schema");
|
|
44
43
|
var import_effect = require("effect");
|
|
45
44
|
var import_artifact = require("@dxos/artifact");
|
|
46
45
|
var import_assistant2 = require("@dxos/assistant");
|
|
47
46
|
var import_async = require("@dxos/async");
|
|
48
47
|
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
49
|
-
var import_keys2 = require("@dxos/keys");
|
|
50
48
|
var import_log2 = require("@dxos/log");
|
|
51
|
-
var
|
|
49
|
+
var import_schema = require("@dxos/schema");
|
|
52
50
|
var system_prompt_default = 'You are an AI assistant specialized in processing and enhancing transcripts with contextual information.\nYour task is to analyze a given transcript and extract references to the context objects.\n\nThe context and transcript are provided in the user message in `context` and `transcript` XML tags.\n\nHere are your instructions:\n\n1. Read the transcript and context information provided above.\n\n2. Process each segment of the transcript separately.\n\n3. For each segment:\n a. Analyze the content and identify relevant information from the context.\n b. Extract a number of references to the context objects that are mentioned in the segment.\n c. Output the references in the format `{ "quote": "earnings report", "id": "01JT0JP9AX0XKGZX4MV4B69VT6" }`.\n d. If there are no references, just output an empty array.\n\n4. Maintain the exact order and structure of the original transcript segments.\n\nOutput Format:\nThe final output should be a JSON array of references.\n\nExample output structure:\n```json\n{\n "references": [\n { "quote": "earnings report", "id": "01JT0JP9AX0XKGZX4MV4B69VT6" },\n { "quote": "John", "id": "01JT0VM0VN3ZKN7GDBM8CV9BA7" }\n ]\n}\n```\n\nRemember:\n- Only quote the text that is in the transcript.\n- Analyze each segment carefully before processing it.\n- Only reference objects that appear in the context and exactly by their id, If the object is not in the context, do not insert a reference. \n\nNow, process the transcript and context provided below according to these instructions.';
|
|
53
51
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/entity-extraction/entity-extraction.ts";
|
|
54
52
|
var createSystemPrompt = () => {
|
|
@@ -94,12 +92,12 @@ var processTranscriptMessage = async (params) => {
|
|
|
94
92
|
refs: result.references
|
|
95
93
|
}, {
|
|
96
94
|
F: __dxlog_file,
|
|
97
|
-
L:
|
|
95
|
+
L: 97,
|
|
98
96
|
S: void 0,
|
|
99
97
|
C: (f, a) => f(...a)
|
|
100
98
|
});
|
|
101
99
|
return {
|
|
102
|
-
message: (0, import_echo_schema2.create)(
|
|
100
|
+
message: (0, import_echo_schema2.create)(import_schema.MessageType, {
|
|
103
101
|
...params.message,
|
|
104
102
|
blocks: params.message.blocks.map((block, i) => block.type !== "transcription" ? block : {
|
|
105
103
|
...block,
|
|
@@ -120,7 +118,7 @@ var processTranscriptMessage = async (params) => {
|
|
|
120
118
|
error
|
|
121
119
|
}, {
|
|
122
120
|
F: __dxlog_file,
|
|
123
|
-
L:
|
|
121
|
+
L: 122,
|
|
124
122
|
S: void 0,
|
|
125
123
|
C: (f, a) => f(...a)
|
|
126
124
|
});
|
|
@@ -135,20 +133,17 @@ var processTranscriptMessage = async (params) => {
|
|
|
135
133
|
};
|
|
136
134
|
var postprocessText = (text, quotes) => {
|
|
137
135
|
for (const quote of quotes.references) {
|
|
138
|
-
if (!import_echo_schema2.ObjectId.isValid(quote.id)) {
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
136
|
const regex = new RegExp(quote.quote.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi");
|
|
142
|
-
text = text.replace(regex, `[${quote.quote}][
|
|
137
|
+
text = text.replace(regex, `[${quote.quote}][dxn:echo:@:${quote.id}]`);
|
|
143
138
|
}
|
|
144
139
|
return text;
|
|
145
140
|
};
|
|
146
141
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/capabilities/app-graph-builder.ts";
|
|
147
142
|
var getMeetingTranscript = async (context, meeting) => {
|
|
148
143
|
const { dispatchPromise: dispatch } = context.requestCapability(import_app_framework.Capabilities.IntentDispatcher);
|
|
149
|
-
const typename = (0, import_echo_schema.getSchemaTypename)(
|
|
144
|
+
const typename = (0, import_echo_schema.getSchemaTypename)(import_chunk_IXU57SCA.TranscriptType);
|
|
150
145
|
const existing = await meeting.artifacts[typename]?.load();
|
|
151
|
-
if (existing instanceof
|
|
146
|
+
if (existing instanceof import_chunk_IXU57SCA.TranscriptType) {
|
|
152
147
|
return existing;
|
|
153
148
|
}
|
|
154
149
|
const space = (0, import_echo.getSpace)(meeting);
|
|
@@ -161,7 +156,7 @@ var getMeetingTranscript = async (context, meeting) => {
|
|
|
161
156
|
""
|
|
162
157
|
]
|
|
163
158
|
});
|
|
164
|
-
const { data } = await dispatch((0, import_app_framework.createIntent)(
|
|
159
|
+
const { data } = await dispatch((0, import_app_framework.createIntent)(import_chunk_IXU57SCA.TranscriptionAction.Create, {
|
|
165
160
|
spaceId: space.id
|
|
166
161
|
}));
|
|
167
162
|
meeting.artifacts[typename] = (0, import_echo.makeRef)(data.object);
|
|
@@ -189,7 +184,7 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
|
|
|
189
184
|
]
|
|
190
185
|
});
|
|
191
186
|
const callManager = context.requestCapability(import_plugin_meeting.MeetingCapabilities.CallManager);
|
|
192
|
-
callManager.setActivity((0, import_echo_schema.getSchemaTypename)(
|
|
187
|
+
callManager.setActivity((0, import_echo_schema.getSchemaTypename)(import_chunk_IXU57SCA.TranscriptType), {
|
|
193
188
|
queueDxn: transcript.queue.dxn.toString(),
|
|
194
189
|
enabled: !state.enabled
|
|
195
190
|
});
|
|
@@ -223,9 +218,9 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
|
|
|
223
218
|
});
|
|
224
219
|
return [
|
|
225
220
|
{
|
|
226
|
-
id: `${(0, import_echo.fullyQualifiedId)(meeting)}${import_types.ATTENDABLE_PATH_SEPARATOR}${(0, import_echo_schema.getSchemaTypename)(
|
|
221
|
+
id: `${(0, import_echo.fullyQualifiedId)(meeting)}${import_types.ATTENDABLE_PATH_SEPARATOR}${(0, import_echo_schema.getSchemaTypename)(import_chunk_IXU57SCA.TranscriptType)}`,
|
|
227
222
|
type: import_types.PLANK_COMPANION_TYPE,
|
|
228
|
-
data: meeting.artifacts[(0, import_echo_schema.getSchemaTypename)(
|
|
223
|
+
data: meeting.artifacts[(0, import_echo_schema.getSchemaTypename)(import_chunk_IXU57SCA.TranscriptType)]?.target,
|
|
229
224
|
properties: {
|
|
230
225
|
label: [
|
|
231
226
|
"transcript companion label",
|
|
@@ -236,8 +231,8 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
|
|
|
236
231
|
icon: "ph--subtitles--regular",
|
|
237
232
|
position: "hoist",
|
|
238
233
|
disposition: "hidden",
|
|
239
|
-
schema:
|
|
240
|
-
getIntent: ({ space }) => (0, import_app_framework.createIntent)(
|
|
234
|
+
schema: import_chunk_IXU57SCA.TranscriptType,
|
|
235
|
+
getIntent: ({ space }) => (0, import_app_framework.createIntent)(import_chunk_IXU57SCA.TranscriptionAction.Create, {
|
|
241
236
|
spaceId: space.id
|
|
242
237
|
}),
|
|
243
238
|
// TODO(burdon): Is this the right place to inisitalize the state? Change to a capability?
|
|
@@ -271,13 +266,13 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
|
|
|
271
266
|
// This will be replaced with a vector search index anyway, so its not a big deal.
|
|
272
267
|
contextTypes: [
|
|
273
268
|
import_types2.DocumentType,
|
|
274
|
-
|
|
275
|
-
|
|
269
|
+
import_testing.Contact,
|
|
270
|
+
import_testing.Organization
|
|
276
271
|
],
|
|
277
272
|
space
|
|
278
273
|
});
|
|
279
274
|
}
|
|
280
|
-
state.transcriptionManager = await new
|
|
275
|
+
state.transcriptionManager = await new import_chunk_7XIIUVN3.TranscriptionManager({
|
|
281
276
|
edgeClient: client.edge,
|
|
282
277
|
messageEnricher
|
|
283
278
|
}).setIdentityDid(identity.did).open();
|
|
@@ -288,7 +283,7 @@ var app_graph_builder_default = (context) => (0, import_app_framework.contribute
|
|
|
288
283
|
state.enabled = false;
|
|
289
284
|
},
|
|
290
285
|
onCallStateUpdated: async (callState) => {
|
|
291
|
-
const typename = (0, import_echo_schema.getSchemaTypename)(
|
|
286
|
+
const typename = (0, import_echo_schema.getSchemaTypename)(import_chunk_IXU57SCA.TranscriptType);
|
|
292
287
|
const transcription = typename ? callState.activities?.[typename] : void 0;
|
|
293
288
|
if (!transcription?.payload) {
|
|
294
289
|
return;
|
|
@@ -344,7 +339,13 @@ var createEntityExtractionEnricher = ({ aiClient, contextTypes, space }) => {
|
|
|
344
339
|
};
|
|
345
340
|
};
|
|
346
341
|
var processContextObject = async (object) => {
|
|
342
|
+
if ((0, import_echo_schema.isInstanceOf)(import_types2.DocumentType, object)) {
|
|
343
|
+
return {
|
|
344
|
+
...object,
|
|
345
|
+
content: await object.content.load()
|
|
346
|
+
};
|
|
347
|
+
}
|
|
347
348
|
return object;
|
|
348
349
|
};
|
|
349
350
|
var ENTITY_EXTRACTOR_TIMEOUT = 25e3;
|
|
350
|
-
//# sourceMappingURL=app-graph-builder-
|
|
351
|
+
//# sourceMappingURL=app-graph-builder-W4VDMVGV.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/app-graph-builder.ts", "../../../src/entity-extraction/entity-extraction.ts", "raw-loader:./system-prompt.tpl?raw"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport type { Schema } from 'effect';\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { AIServiceEdgeClient, type AIServiceClient } from '@dxos/assistant';\nimport { AI_SERVICE_ENDPOINT, Contact, Organization } from '@dxos/assistant/testing';\nimport { Filter, fullyQualifiedId, getSpace, makeRef, type Space } from '@dxos/client/echo';\nimport { getSchemaTypename, isInstanceOf, type BaseEchoObject } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\nimport { DocumentType } from '@dxos/plugin-markdown/types';\nimport { MeetingCapabilities, type CallState, type MediaState } from '@dxos/plugin-meeting';\nimport { MeetingType, type MeetingCallProperties } from '@dxos/plugin-meeting/types';\nimport { type buf } from '@dxos/protocols/buf';\nimport { type TranscriptionPayloadSchema } from '@dxos/protocols/buf/dxos/edge/calls_pb';\nimport type { MessageType } from '@dxos/schema';\n\nimport { TranscriptionCapabilities } from './capabilities';\nimport { processTranscriptMessage } from '../entity-extraction';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptionManager } from '../transcriber';\nimport { TranscriptionAction, type TranscriptionSettingsProps, TranscriptType } from '../types';\n\n// TODO(wittjosiah): Factor out.\n// TODO(wittjosiah): Can we stop using protobuf for this?\ntype TranscriptionPayload = buf.MessageInitShape<typeof TranscriptionPayloadSchema>;\n\nconst getMeetingTranscript = async (\n context: PluginsContext,\n meeting: MeetingType,\n): Promise<TranscriptType | undefined> => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n\n const typename = getSchemaTypename(TranscriptType)!;\n const existing = await meeting.artifacts[typename]?.load();\n if (existing instanceof TranscriptType) {\n return existing;\n }\n\n const space = getSpace(meeting);\n invariant(space);\n const { data } = await dispatch(createIntent(TranscriptionAction.Create, { spaceId: space.id }));\n meeting.artifacts[typename] = makeRef(data!.object);\n return data?.object;\n};\n\n// TODO(wittjosiah): Introduce a sound that plays when transcription is activated/deactivated.\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,\n filter: (node): node is Node<MeetingType> => isInstanceOf(MeetingType, node.data),\n actions: ({ node }) => {\n const meeting = node.data;\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n return [\n {\n id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,\n data: async () => {\n // NOTE: We are not saving the state of the transcription manager here.\n // We expect the state to be updated through `onCallStateUpdated` once it is propagated through Swarm.\n // This is done to avoid race conditions and to not handle optimistic updates.\n const transcript = await getMeetingTranscript(context, meeting);\n invariant(transcript, 'Failed to create transcript');\n\n const callManager = context.requestCapability(MeetingCapabilities.CallManager);\n callManager.setActivity(getSchemaTypename(TranscriptType)!, {\n queueDxn: transcript.queue.dxn.toString(),\n enabled: !state.enabled,\n });\n },\n properties: {\n label: state.enabled\n ? ['stop transcription label', { ns: TRANSCRIPTION_PLUGIN }]\n : ['start transcription label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n disposition: 'toolbar',\n classNames: state.enabled ? 'bg-callAlert' : '',\n },\n },\n ];\n },\n connector: ({ node }) => {\n const meeting = node.data;\n const client = context.requestCapability(ClientCapabilities.Client);\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n const settings = context\n .requestCapability(Capabilities.SettingsStore)\n .getStore<TranscriptionSettingsProps>(TRANSCRIPTION_PLUGIN)!.value;\n\n // TODO(dmaretskyi): Request via capability.\n const aiClient: AIServiceClient | undefined = new AIServiceEdgeClient({\n endpoint: AI_SERVICE_ENDPOINT.REMOTE,\n });\n\n return [\n {\n id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,\n type: PLANK_COMPANION_TYPE,\n data: meeting.artifacts[getSchemaTypename(TranscriptType)!]?.target,\n properties: {\n label: ['transcript companion label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n position: 'hoist',\n disposition: 'hidden',\n schema: TranscriptType,\n getIntent: ({ space }: { space: Space }) =>\n createIntent(TranscriptionAction.Create, { spaceId: space.id }),\n\n // TODO(burdon): Is this the right place to inisitalize the state? Change to a capability?\n onJoin: async ({ meeting }: { meeting: MeetingType; roomId: string }) => {\n const identity = client.halo.identity.get();\n invariant(identity);\n const space = getSpace(meeting);\n invariant(space);\n\n let messageEnricher;\n if (aiClient && settings.entityExtraction) {\n messageEnricher = createEntityExtractionEnricher({\n aiClient,\n // TODO(dmaretskyi): Have those be discovered from the schema graph or contributed by capabilities?\n // This forced me to add a dependency on markdown plugin.\n // This will be replaced with a vector search index anyway, so its not a big deal.\n contextTypes: [DocumentType, Contact, Organization],\n space,\n });\n }\n\n // TODO(burdon): The TranscriptionManager singleton is part of the state and should just be updated here.\n state.transcriptionManager = await new TranscriptionManager({\n edgeClient: client.edge,\n messageEnricher,\n })\n .setIdentityDid(identity.did)\n .open();\n },\n onLeave: async () => {\n await state.transcriptionManager?.close();\n state.transcriptionManager = undefined;\n state.enabled = false;\n },\n onCallStateUpdated: async (callState: CallState) => {\n const typename = getSchemaTypename(TranscriptType);\n const transcription = typename ? callState.activities?.[typename] : undefined;\n if (!transcription?.payload) {\n return;\n }\n\n const payload: TranscriptionPayload = transcription.payload;\n state.enabled = !!payload.enabled;\n if (payload.queueDxn) {\n // NOTE: Must set queue before enabling transcription.\n state.transcriptionManager?.setQueue(DXN.parse(payload.queueDxn));\n }\n await state.transcriptionManager?.setEnabled(payload.enabled);\n },\n onMediaStateUpdated: async ([mediaState, isSpeaking]: [MediaState, boolean]) => {\n void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);\n void state.transcriptionManager?.setRecording(isSpeaking);\n },\n } satisfies MeetingCallProperties,\n },\n ];\n },\n }),\n ]);\n\ntype EntityExtractionEnricherFactoryOptions = {\n aiClient: AIServiceClient;\n contextTypes: Schema.Schema.AnyNoContext[];\n space: Space;\n};\n\nconst createEntityExtractionEnricher = ({ aiClient, contextTypes, space }: EntityExtractionEnricherFactoryOptions) => {\n return async (message: MessageType) => {\n const { objects } = await space.db.query(Filter.or(...contextTypes.map((s) => Filter.schema(s)))).run();\n log.info('context', { objects });\n\n const { message: enhancedMessage, timeElapsed } = await processTranscriptMessage({\n aiService: aiClient,\n message,\n context: { objects: await Promise.all(objects.map(processContextObject)) },\n options: { timeout: ENTITY_EXTRACTOR_TIMEOUT, fallbackToRaw: true },\n });\n\n log.info('entity extraction time', { timeElapsed });\n return enhancedMessage;\n };\n};\n\nconst processContextObject = async (object: BaseEchoObject): Promise<any> => {\n // TODO(dmaretskyi): Documents need special processing is the content is behind a ref.\n // TODO(dmaretskyi): Think about a way to handle this serialization with a decorator.\n if (isInstanceOf(DocumentType, object)) {\n return {\n ...object,\n content: await object.content.load(),\n };\n }\n\n return object;\n};\n\nconst ENTITY_EXTRACTOR_TIMEOUT = 25_000;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { createTemplate, Message, structuredOutputParser } from '@dxos/artifact';\nimport type { AIServiceClient } from '@dxos/assistant';\nimport { MixedStreamParser } from '@dxos/assistant';\nimport { asyncTimeout } from '@dxos/async';\nimport { type BaseEchoObject, create } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { MessageType } from '@dxos/schema';\n\nimport SYSTEM_PROMPT from './system-prompt.tpl?raw';\n\ntype ProcessTranscriptMessageParams = {\n message: MessageType;\n aiService: AIServiceClient;\n context: {\n objects?: BaseEchoObject[];\n };\n\n options?: {\n /**\n * Timeout for the entity extraction.\n */\n timeout?: number;\n\n /**\n * Fallback to raw text if the entity extraction fails.\n * Otherwise the function will throw an error.\n * @default false\n */\n fallbackToRaw?: boolean;\n };\n};\n\ntype ProcessTranscriptMessageResult = {\n message: MessageType;\n timeElapsed: number;\n};\n\n/**\n * Process Handlebars template.\n */\nconst createSystemPrompt = (): string => {\n const template = createTemplate(SYSTEM_PROMPT);\n return template({});\n};\n\nconst ReferencedQuotes = Schema.Struct({\n references: Schema.Array(\n Schema.Struct({\n quote: Schema.String,\n id: Schema.String,\n }),\n ).annotations({\n description:\n 'The references to the context objects that are mentioned in the transcript. quote should match the original transcript text exactly, while id is the id of the context object.',\n }),\n});\ninterface ReferencedQuotes extends Schema.Schema.Type<typeof ReferencedQuotes> {}\n\n// TODO(dmaretskyi): Move context to a vector search index.\nexport const processTranscriptMessage = async (\n params: ProcessTranscriptMessageParams,\n): Promise<ProcessTranscriptMessageResult> => {\n try {\n const outputParser = structuredOutputParser(ReferencedQuotes);\n const runParser = async (): Promise<ProcessTranscriptMessageResult> => {\n const startTime = performance.now();\n const result = outputParser.getResult(\n await new MixedStreamParser().parse(\n await params.aiService.execStream({\n model: '@anthropic/claude-3-5-haiku-20241022',\n systemPrompt: createSystemPrompt(),\n history: [\n create(Message, {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<context>${JSON.stringify(params.context.objects)}</context>`,\n },\n {\n type: 'text',\n text: `<transcript>${JSON.stringify(params.message.blocks)}</transcript>`,\n },\n ],\n }),\n ],\n tools: [outputParser.tool],\n }),\n ),\n );\n log.info('entity extraction result', { refs: result.references });\n\n return {\n message: create(MessageType, {\n ...params.message,\n blocks: params.message.blocks.map((block, i) =>\n block.type !== 'transcription'\n ? block\n : {\n ...block,\n text: postprocessText(block.text, result),\n },\n ),\n }),\n timeElapsed: performance.now() - startTime,\n };\n };\n\n if (params.options?.timeout && params.options.timeout > 0) {\n return await asyncTimeout(runParser(), params.options.timeout);\n } else {\n return await runParser();\n }\n } catch (error) {\n if (params.options?.fallbackToRaw) {\n log.warn('failed to process transcript message, falling back to raw text', { error });\n return {\n message: params.message,\n timeElapsed: 0,\n };\n } else {\n throw error;\n }\n }\n};\n\n/**\n * Finds and replaces all quotes with DXNs references.\n */\n// TODO(dmaretskyi): Lookup and verifiy ids from provided context.\nexport const postprocessText = (text: string, quotes: ReferencedQuotes) => {\n for (const quote of quotes.references) {\n // Use a case-insensitive regular expression to replace the quote\n const regex = new RegExp(quote.quote.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n text = text.replace(regex, `[${quote.quote}][dxn:echo:@:${quote.id}]`);\n }\n return text;\n};\n", "You are an AI assistant specialized in processing and enhancing transcripts with contextual information.\nYour task is to analyze a given transcript and extract references to the context objects.\n\nThe context and transcript are provided in the user message in `context` and `transcript` XML tags.\n\nHere are your instructions:\n\n1. Read the transcript and context information provided above.\n\n2. Process each segment of the transcript separately.\n\n3. For each segment:\n a. Analyze the content and identify relevant information from the context.\n b. Extract a number of references to the context objects that are mentioned in the segment.\n c. Output the references in the format `{ \"quote\": \"earnings report\", \"id\": \"01JT0JP9AX0XKGZX4MV4B69VT6\" }`.\n d. If there are no references, just output an empty array.\n\n4. Maintain the exact order and structure of the original transcript segments.\n\nOutput Format:\nThe final output should be a JSON array of references.\n\nExample output structure:\n```json\n{\n \"references\": [\n { \"quote\": \"earnings report\", \"id\": \"01JT0JP9AX0XKGZX4MV4B69VT6\" },\n { \"quote\": \"John\", \"id\": \"01JT0VM0VN3ZKN7GDBM8CV9BA7\" }\n ]\n}\n```\n\nRemember:\n- Only quote the text that is in the transcript.\n- Analyze each segment carefully before processing it.\n- Only reference objects that appear in the context and exactly by their id, If the object is not in the context, do not insert a reference. \n\nNow, process the transcript and context provided below according to these instructions."],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_types", "import_assistant", "import_echo_schema", "import_log", "createSystemPrompt", "template", "createTemplate", "SYSTEM_PROMPT", "ReferencedQuotes", "Schema", "Struct", "references", "Array", "quote", "String", "id", "annotations", "description", "processTranscriptMessage", "params", "outputParser", "structuredOutputParser", "runParser", "startTime", "performance", "now", "result", "getResult", "MixedStreamParser", "parse", "aiService", "execStream", "model", "systemPrompt", "history", "create", "Message", "role", "content", "type", "text", "JSON", "stringify", "context", "objects", "message", "blocks", "tools", "tool", "log", "info", "refs", "MessageType", "map", "block", "i", "postprocessText", "timeElapsed", "options", "timeout", "asyncTimeout", "error", "fallbackToRaw", "warn", "quotes", "regex", "RegExp", "replace", "getMeetingTranscript", "meeting", "dispatchPromise", "dispatch", "requestCapability", "Capabilities", "IntentDispatcher", "typename", "getSchemaTypename", "TranscriptType", "existing", "artifacts", "load", "space", "getSpace", "invariant", "data", "createIntent", "TranscriptionAction", "Create", "spaceId", "makeRef", "object", "contributes", "AppGraphBuilder", "createExtension", "TRANSCRIPTION_PLUGIN", "filter", "node", "isInstanceOf", "MeetingType", "actions", "state", "TranscriptionCapabilities", "MeetingTranscriptionState", "fullyQualifiedId", "transcript", "callManager", "MeetingCapabilities", "CallManager", "setActivity", "queueDxn", "queue", "dxn", "toString", "enabled", "properties", "label", "ns", "icon", "disposition", "classNames", "connector", "client", "ClientCapabilities", "Client", "settings", "SettingsStore", "getStore", "value", "aiClient", "AIServiceEdgeClient", "endpoint", "AI_SERVICE_ENDPOINT", "REMOTE", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "target", "position", "schema", "getIntent", "onJoin", "identity", "halo", "get", "messageEnricher", "entityExtraction", "createEntityExtractionEnricher", "contextTypes", "DocumentType", "Contact", "Organization", "transcriptionManager", "TranscriptionManager", "edgeClient", "edge", "setIdentityDid", "did", "open", "onLeave", "close", "undefined", "onCallStateUpdated", "callState", "transcription", "activities", "payload", "setQueue", "DXN", "setEnabled", "onMediaStateUpdated", "mediaState", "isSpeaking", "setAudioTrack", "audioTrack", "setRecording", "db", "query", "Filter", "or", "s", "run", "enhancedMessage", "Promise", "all", "processContextObject", "ENTITY_EXTRACTOR_TIMEOUT"]
|
|
7
|
+
}
|
|
@@ -26,15 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_7XIIUVN3_exports = {};
|
|
30
|
+
__export(chunk_7XIIUVN3_exports, {
|
|
31
31
|
MediaStreamRecorder: () => MediaStreamRecorder,
|
|
32
32
|
Transcriber: () => Transcriber,
|
|
33
33
|
TranscriptionManager: () => TranscriptionManager
|
|
34
34
|
});
|
|
35
|
-
module.exports = __toCommonJS(
|
|
35
|
+
module.exports = __toCommonJS(chunk_7XIIUVN3_exports);
|
|
36
36
|
var import_chunk_J72PUQ3C = require("./chunk-J72PUQ3C.cjs");
|
|
37
|
-
var
|
|
37
|
+
var import_chunk_IXU57SCA = require("./chunk-IXU57SCA.cjs");
|
|
38
38
|
var import_extendable_media_recorder = require("extendable-media-recorder");
|
|
39
39
|
var import_wavefile = require("wavefile");
|
|
40
40
|
var import_async = require("@dxos/async");
|
|
@@ -283,7 +283,7 @@ var Transcriber = class extends import_context.Resource {
|
|
|
283
283
|
this._audioChunks = [];
|
|
284
284
|
throw new Error("No audio to send for transcribing");
|
|
285
285
|
}
|
|
286
|
-
const response = await fetch(`${
|
|
286
|
+
const response = await fetch(`${import_chunk_IXU57SCA.TRANSCRIPTION_URL}/transcribe`, {
|
|
287
287
|
method: "POST",
|
|
288
288
|
body: JSON.stringify({
|
|
289
289
|
audio
|
|
@@ -422,7 +422,7 @@ var TranscriptionManager = class extends import_context2.Resource {
|
|
|
422
422
|
await this._maybeReinitTranscriber();
|
|
423
423
|
if (this._enabled) {
|
|
424
424
|
await this._transcriber?.open();
|
|
425
|
-
const block = (0, import_echo_schema.create)(import_schema.
|
|
425
|
+
const block = (0, import_echo_schema.create)(import_schema.MessageType, {
|
|
426
426
|
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
427
427
|
blocks: [
|
|
428
428
|
{
|
|
@@ -440,7 +440,7 @@ var TranscriptionManager = class extends import_context2.Resource {
|
|
|
440
440
|
]);
|
|
441
441
|
} else {
|
|
442
442
|
await this._transcriber?.close();
|
|
443
|
-
const block = (0, import_echo_schema.create)(import_schema.
|
|
443
|
+
const block = (0, import_echo_schema.create)(import_schema.MessageType, {
|
|
444
444
|
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
445
445
|
blocks: [
|
|
446
446
|
{
|
|
@@ -486,7 +486,7 @@ var TranscriptionManager = class extends import_context2.Resource {
|
|
|
486
486
|
if (!this.isOpen || !this._queue) {
|
|
487
487
|
return;
|
|
488
488
|
}
|
|
489
|
-
let block = (0, import_echo_schema.create)(import_schema.
|
|
489
|
+
let block = (0, import_echo_schema.create)(import_schema.MessageType, {
|
|
490
490
|
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
491
491
|
blocks: segments,
|
|
492
492
|
sender: {
|
|
@@ -513,4 +513,4 @@ _ts_decorate3([
|
|
|
513
513
|
Transcriber,
|
|
514
514
|
TranscriptionManager
|
|
515
515
|
});
|
|
516
|
-
//# sourceMappingURL=chunk-
|
|
516
|
+
//# sourceMappingURL=chunk-7XIIUVN3.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/transcriber/transcription-manager.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder, MediaRecorder, register } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _interval: number;\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._interval = interval;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start() {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._interval);\n }\n\n async stop() {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent) {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { type TranscriptionContentBlock } from '@dxos/schema';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n onSegments: (segments: TranscriptionContentBlock[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context) {\n log.info('opening');\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n log.info('closing');\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n log.info('starting');\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n\n this._recording = false;\n this._transcribeTask?.schedule();\n log.info('stopped');\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe() {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks() {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]) {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string) {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n const { segments } = (await response.json()) as {\n segments: WhisperSegment[];\n };\n\n log.info('transcription response', {\n segments: segments.length,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptionContentBlock[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n type: 'transcription',\n started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),\n text: segment.text.trim(),\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { synchronized } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { QueueImpl, type Queue } from '@dxos/echo-db';\nimport { create } from '@dxos/echo-schema';\nimport { type DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { MessageType, type TranscriptionContentBlock } from '@dxos/schema';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\nimport { Transcriber } from './transcriber';\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type TranscriptMessageEnricher = (message: MessageType) => Promise<MessageType>;\n\nexport type TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n\n /**\n * Enrich the message before it is written to the transcription queue.\n */\n messageEnricher?: TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting.\n */\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptMessageEnricher;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _queue?: Queue<MessageType> = undefined;\n private _enabled = false;\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n }\n\n protected override async _open() {\n await this._toggleTranscriber();\n }\n\n protected override async _close() {\n void this._transcriber?.close();\n }\n\n setQueue(queueDxn: DXN): TranscriptionManager {\n if (this._queue?.dxn.toString() !== queueDxn.toString()) {\n log.info('setQueue', { queueDxn: queueDxn.toString() });\n this._queue = new QueueImpl<MessageType>(this._edgeClient, queueDxn);\n }\n return this;\n }\n\n setIdentityDid(did: string): TranscriptionManager {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): TranscriptionManager {\n if (!this.isOpen || !this._enabled) {\n return this;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n return this;\n }\n\n /**\n * Enable or disable transcription.\n * @param enabled - Whether to enable transcription.\n */\n @synchronized\n async setEnabled(enabled?: boolean) {\n if (this._enabled === enabled) {\n return;\n }\n\n this._enabled = enabled ?? false;\n // TODO(burdon): Why is toggle called here?\n this.isOpen && (await this._toggleTranscriber());\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack) {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n this.isOpen && (await this._toggleTranscriber());\n }\n\n // TODO(burdon): Change this to setEnables (explicit), not toggle.\n private async _toggleTranscriber() {\n await this._maybeReinitTranscriber();\n\n // Open or close transcriber if transcription is enabled or disabled.\n if (this._enabled) {\n await this._transcriber?.open();\n // TODO(burdon): Started and stopped blocks appear twice.\n const block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Started', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n } else {\n await this._transcriber?.close();\n const block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Stopped', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n }\n }\n\n private async _maybeReinitTranscriber() {\n if (!this._audioStreamTrack || !this._enabled) {\n return;\n }\n\n // Reinitialize transcriber if queue or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n interval: RECORD_INTERVAL,\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n }\n }\n\n private async _onSegments(segments: TranscriptionContentBlock[]) {\n if (!this.isOpen || !this._queue) {\n return;\n }\n\n let block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: segments,\n sender: { identityDid: this._identityDid },\n });\n\n if (this._messageEnricher) {\n block = await this._messageEnricher(block);\n }\n\n this._queue.append([block]);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_wavefile", "import_async", "import_log", "import_tracing", "import_context", "initializingPromise", "initializeExtendableMediaRecorder", "connect", "register", "MediaStreamRecorder", "constructor", "mediaStreamTrack", "interval", "_mediaRecorder", "undefined", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "channelCount", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "err", "log", "info", "stream", "MediaStream", "MediaRecorder", "mimeType", "state", "invariant", "ondataavailable", "event", "_ondataavailable", "stop", "blob", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "WaveFile", "slice", "warn", "timestamp", "Date", "now", "getSamples", "synchronized", "trace", "resource", "Transcriber", "Resource", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "_config", "_recorder", "_onSegments", "_open", "ctx", "chunk", "_saveAudioChunk", "DeferredTask", "_transcribe", "wake", "_close", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "length", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "audio", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "file", "fromScratch", "mergeFloat64Arrays", "map", "toBase64", "Error", "response", "fetch", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "statusText", "json", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "filteredSegments", "filter", "segment", "end", "words", "word", "type", "started", "toISOString", "trim", "span", "showInBrowserTimeline", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManager", "options", "_audioStreamTrack", "_identityDid", "_transcriber", "_queue", "_enabled", "_edgeClient", "edgeClient", "_messageEnricher", "messageEnricher", "_toggleTranscriber", "close", "setQueue", "queueDxn", "dxn", "toString", "QueueImpl", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "setEnabled", "enabled", "setAudioTrack", "track", "_maybeReinitTranscriber", "open", "block", "create", "MessageType", "created", "blocks", "sender", "role", "append", "needReinit", "identityDid"]
|
|
7
|
+
}
|
|
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var chunk_IXU57SCA_exports = {};
|
|
20
|
+
__export(chunk_IXU57SCA_exports, {
|
|
21
21
|
TRANSCRIPTION_URL: () => TRANSCRIPTION_URL,
|
|
22
22
|
TranscriptSchema: () => TranscriptSchema,
|
|
23
23
|
TranscriptType: () => TranscriptType,
|
|
@@ -25,18 +25,16 @@ __export(chunk_34WFY7M7_exports, {
|
|
|
25
25
|
TranscriptionSettingsSchema: () => TranscriptionSettingsSchema,
|
|
26
26
|
isTranscript: () => isTranscript
|
|
27
27
|
});
|
|
28
|
-
module.exports = __toCommonJS(
|
|
28
|
+
module.exports = __toCommonJS(chunk_IXU57SCA_exports);
|
|
29
29
|
var import_chunk_NVZWGFJL = require("./chunk-NVZWGFJL.cjs");
|
|
30
|
-
var import_effect = require("effect");
|
|
31
30
|
var import_echo_schema = require("@dxos/echo-schema");
|
|
32
|
-
var import_effect2 = require("effect");
|
|
33
31
|
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
34
32
|
var import_echo = require("@dxos/react-client/echo");
|
|
35
|
-
var TranscriptSchema =
|
|
36
|
-
name:
|
|
33
|
+
var TranscriptSchema = import_echo_schema.S.Struct({
|
|
34
|
+
name: import_echo_schema.S.String,
|
|
37
35
|
// TODO(burdon): Use Date or string?
|
|
38
|
-
started:
|
|
39
|
-
ended:
|
|
36
|
+
started: import_echo_schema.S.optional(import_echo_schema.S.String),
|
|
37
|
+
ended: import_echo_schema.S.optional(import_echo_schema.S.String),
|
|
40
38
|
/**
|
|
41
39
|
* Queue containing TranscriptBlock objects.
|
|
42
40
|
*/
|
|
@@ -48,19 +46,19 @@ var TranscriptType = class extends (0, import_echo_schema.TypedObject)({
|
|
|
48
46
|
version: "0.1.0"
|
|
49
47
|
})(TranscriptSchema.fields) {
|
|
50
48
|
};
|
|
51
|
-
var TranscriptHeader =
|
|
52
|
-
started:
|
|
49
|
+
var TranscriptHeader = import_echo_schema.S.Struct({
|
|
50
|
+
started: import_echo_schema.S.optional(import_echo_schema.S.String)
|
|
53
51
|
});
|
|
54
52
|
var TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
|
|
55
53
|
var TranscriptionAction;
|
|
56
54
|
(function(TranscriptionAction2) {
|
|
57
55
|
const TRANSCRIPTION_ACTION = `${import_chunk_NVZWGFJL.TRANSCRIPTION_PLUGIN}/action`;
|
|
58
|
-
class Create extends
|
|
59
|
-
input:
|
|
60
|
-
name:
|
|
56
|
+
class Create extends import_echo_schema2.S.TaggedClass()(`${TRANSCRIPTION_ACTION}/create`, {
|
|
57
|
+
input: import_echo_schema2.S.Struct({
|
|
58
|
+
name: import_echo_schema2.S.optional(import_echo_schema2.S.String),
|
|
61
59
|
spaceId: import_echo_schema2.SpaceIdSchema
|
|
62
60
|
}),
|
|
63
|
-
output:
|
|
61
|
+
output: import_echo_schema2.S.Struct({
|
|
64
62
|
object: TranscriptType
|
|
65
63
|
})
|
|
66
64
|
}) {
|
|
@@ -70,8 +68,8 @@ var TranscriptionAction;
|
|
|
70
68
|
var isTranscript = (object) => {
|
|
71
69
|
return (0, import_echo.isLiveObject)(object) && (0, import_echo_schema2.isInstanceOf)(TranscriptType, object);
|
|
72
70
|
};
|
|
73
|
-
var TranscriptionSettingsSchema =
|
|
74
|
-
entityExtraction:
|
|
71
|
+
var TranscriptionSettingsSchema = import_echo_schema2.S.mutable(import_echo_schema2.S.Struct({
|
|
72
|
+
entityExtraction: import_echo_schema2.S.optional(import_echo_schema2.S.Boolean).pipe(import_echo_schema2.S.withConstructorDefault(() => true))
|
|
75
73
|
}));
|
|
76
74
|
// Annotate the CommonJS export names for ESM import in node:
|
|
77
75
|
0 && (module.exports = {
|
|
@@ -82,4 +80,4 @@ var TranscriptionSettingsSchema = import_effect2.Schema.mutable(import_effect2.S
|
|
|
82
80
|
TranscriptionSettingsSchema,
|
|
83
81
|
isTranscript
|
|
84
82
|
});
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-IXU57SCA.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Expando, Ref, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Root transcript object created when the user starts a transcription.\n */\nexport const TranscriptSchema = S.Struct({\n name: S.String,\n\n // TODO(burdon): Use Date or string?\n started: S.optional(S.String),\n ended: S.optional(S.String),\n\n /**\n * Queue containing TranscriptBlock objects.\n */\n // TODO(wittjosiah): Should be a ref to a queue.\n queue: Ref(Expando),\n});\n\nexport class TranscriptType extends TypedObject({\n typename: 'dxos.org/type/Transcript',\n version: '0.1.0',\n})(TranscriptSchema.fields) {}\n\n// TODO(burdon): Do these need to be kept in sync with EDGE?\n\n/**\n * First message in queue.\n * Contains metadata for the recording and transcript.\n */\nconst TranscriptHeader = S.Struct({\n started: S.optional(S.String),\n});\n\nexport type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SpaceIdSchema, S, isInstanceOf } from '@dxos/echo-schema';\nimport { isLiveObject } from '@dxos/react-client/echo';\n\nimport { TranscriptType } from './schema';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\n// TODO(burdon): Move to separate proto.\n\n/**\n * Endpoint to the calls service.\n */\n// TODO(burdon): Reconfigure/move.\nexport const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';\n\nexport namespace TranscriptionAction {\n const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;\n\n export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {\n input: S.Struct({\n name: S.optional(S.String),\n spaceId: SpaceIdSchema,\n }),\n output: S.Struct({\n object: TranscriptType,\n }),\n }) {}\n}\n\nexport const isTranscript = (object: unknown): object is typeof TranscriptType => {\n return isLiveObject(object) && isInstanceOf(TranscriptType, object);\n};\n\n// TODO(burdon): Create with decode consistently: S.decodeSync(TranscriptionSettingsSchema)({}))\nexport const TranscriptionSettingsSchema = S.mutable(\n S.Struct({\n entityExtraction: S.optional(S.Boolean).pipe(S.withConstructorDefault(() => true)),\n }),\n);\n\nexport type TranscriptionSettingsProps = S.Schema.Type<typeof TranscriptionSettingsSchema>;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yBAA6C;ACA7C,IAAAA,sBAA+C;AAC/C,kBAA6B;ADItB,IAAMC,mBAAmBC,qBAAEC,OAAO;EACvCC,MAAMF,qBAAEG;;EAGRC,SAASJ,qBAAEK,SAASL,qBAAEG,MAAM;EAC5BG,OAAON,qBAAEK,SAASL,qBAAEG,MAAM;;;;;EAM1BI,WAAOC,wBAAIC,0BAAAA;AACb,CAAA;AAEO,IAAMC,iBAAN,kBAA6BC,gCAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGd,iBAAiBe,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBf,qBAAEC,OAAO;EAChCG,SAASJ,qBAAEK,SAASL,qBAAEG,MAAM;AAC9B,CAAA;ACpBO,IAAMa,oBAAoB;;UAEhBC,sBAAAA;AACf,QAAMC,uBAAuB,GAAGC,0CAAAA;EAEzB,MAAMC,eAAepB,oBAAAA,EAAEqB,YAAW,EAAW,GAAGH,oBAAAA,WAA+B;IACpFI,OAAOtB,oBAAAA,EAAEC,OAAO;MACdC,MAAMF,oBAAAA,EAAEK,SAASL,oBAAAA,EAAEG,MAAM;MACzBoB,SAASC;IACX,CAAA;IACAC,QAAQzB,oBAAAA,EAAEC,OAAO;MACfyB,QAAQhB;IACV,CAAA;EACF,CAAA,EAAA;EAAI;uBARSU,SAAAA;AASf,GAZiBH,wBAAAA,sBAAAA,CAAAA,EAAAA;AAcV,IAAMU,eAAe,CAACD,WAAAA;AAC3B,aAAOE,0BAAaF,MAAAA,SAAWG,kCAAanB,gBAAgBgB,MAAAA;AAC9D;AAGO,IAAMI,8BAA8B9B,oBAAAA,EAAE+B,QAC3C/B,oBAAAA,EAAEC,OAAO;EACP+B,kBAAkBhC,oBAAAA,EAAEK,SAASL,oBAAAA,EAAEiC,OAAO,EAAEC,KAAKlC,oBAAAA,EAAEmC,uBAAuB,MAAM,IAAA,CAAA;AAC9E,CAAA,CAAA;",
|
|
6
|
+
"names": ["import_echo_schema", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "ended", "queue", "Ref", "Expando", "TranscriptType", "TypedObject", "typename", "version", "fields", "TranscriptHeader", "TRANSCRIPTION_URL", "TranscriptionAction", "TRANSCRIPTION_ACTION", "TRANSCRIPTION_PLUGIN", "Create", "TaggedClass", "input", "spaceId", "SpaceIdSchema", "output", "object", "isTranscript", "isLiveObject", "isInstanceOf", "TranscriptionSettingsSchema", "mutable", "entityExtraction", "Boolean", "pipe", "withConstructorDefault"]
|
|
7
|
+
}
|
|
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_NBC6V3M2_exports = {};
|
|
30
|
+
__export(chunk_NBC6V3M2_exports, {
|
|
31
31
|
AppGraphBuilder: () => AppGraphBuilder,
|
|
32
32
|
IntentResolver: () => IntentResolver,
|
|
33
33
|
MeetingTranscriptionState: () => MeetingTranscriptionState,
|
|
@@ -44,7 +44,7 @@ __export(chunk_4JOJCZPJ_exports, {
|
|
|
44
44
|
useTranscriber: () => useTranscriber,
|
|
45
45
|
useVoiceInput: () => useVoiceInput
|
|
46
46
|
});
|
|
47
|
-
module.exports = __toCommonJS(
|
|
47
|
+
module.exports = __toCommonJS(chunk_NBC6V3M2_exports);
|
|
48
48
|
var import_chunk_JUGOXWES = require("./chunk-JUGOXWES.cjs");
|
|
49
49
|
var import_react = __toESM(require("react"));
|
|
50
50
|
var import_echo = require("@dxos/client/echo");
|
|
@@ -479,8 +479,7 @@ var Transcript = ({ classNames, transcript: object, space, model, attendableId,
|
|
|
479
479
|
]);
|
|
480
480
|
return /* @__PURE__ */ import_react2.default.createElement("div", {
|
|
481
481
|
ref: parentRef,
|
|
482
|
-
className: (0, import_react_ui_theme.mx)("flex grow overflow-hidden", import_react_ui_editor.editorWidth, classNames)
|
|
483
|
-
"data-popover-collision-boundary": true
|
|
482
|
+
className: (0, import_react_ui_theme.mx)("flex grow overflow-hidden", import_react_ui_editor.editorWidth, classNames)
|
|
484
483
|
});
|
|
485
484
|
};
|
|
486
485
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
|
|
@@ -610,12 +609,12 @@ var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
|
|
|
610
609
|
]);
|
|
611
610
|
return model;
|
|
612
611
|
};
|
|
613
|
-
var AppGraphBuilder = (0, import_app_framework2.lazy)(() => import("./app-graph-builder-
|
|
614
|
-
var IntentResolver = (0, import_app_framework2.lazy)(() => import("./intent-resolver-
|
|
612
|
+
var AppGraphBuilder = (0, import_app_framework2.lazy)(() => import("./app-graph-builder-W4VDMVGV.cjs"));
|
|
613
|
+
var IntentResolver = (0, import_app_framework2.lazy)(() => import("./intent-resolver-RM4JOCDV.cjs"));
|
|
615
614
|
var MeetingTranscriptionState = (0, import_app_framework2.lazy)(() => import("./meeting-transcription-state-5XLTMWPA.cjs"));
|
|
616
|
-
var ReactSurface = (0, import_app_framework2.lazy)(() => import("./react-surface-
|
|
617
|
-
var Transcriber = (0, import_app_framework2.lazy)(() => import("./transcriber-
|
|
618
|
-
var Settings = (0, import_app_framework2.lazy)(() => import("./settings-
|
|
615
|
+
var ReactSurface = (0, import_app_framework2.lazy)(() => import("./react-surface-YQHBGPOC.cjs"));
|
|
616
|
+
var Transcriber = (0, import_app_framework2.lazy)(() => import("./transcriber-55OE4X6I.cjs"));
|
|
617
|
+
var Settings = (0, import_app_framework2.lazy)(() => import("./settings-ZMB4XRWS.cjs"));
|
|
619
618
|
var useTranscriber = ({ audioStreamTrack, onSegments, config }) => {
|
|
620
619
|
const [getTranscriber] = (0, import_app_framework.useCapabilities)(import_chunk_JUGOXWES.TranscriptionCapabilities.Transcriber);
|
|
621
620
|
const transcriber = (0, import_react6.useMemo)(() => {
|
|
@@ -734,4 +733,4 @@ var TranscriptContainer_default = TranscriptionContainer;
|
|
|
734
733
|
useTranscriber,
|
|
735
734
|
useVoiceInput
|
|
736
735
|
});
|
|
737
|
-
//# sourceMappingURL=chunk-
|
|
736
|
+
//# sourceMappingURL=chunk-NBC6V3M2.cjs.map
|