@dxos/plugin-transcription 0.8.0 → 0.8.1-main.013e445
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-SX6PNFEC.mjs → TranscriptContainer-TJXP6ICP.mjs} +3 -3
- package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
- package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
- package/dist/lib/browser/{chunk-AS364WZZ.mjs → chunk-3NWYXRZS.mjs} +2 -2
- package/dist/lib/browser/chunk-MD4NQO6W.mjs +252 -0
- package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +7 -0
- package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
- package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
- package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
- package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
- package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +203 -366
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
- package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs → react-surface-OM2EECBI.mjs} +15 -8
- package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-OM2EECBI.mjs.map} +2 -2
- package/dist/lib/browser/types/index.mjs +2 -1
- package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
- package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-KNTN76RZ.cjs.map} +2 -2
- package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
- package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
- package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
- package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
- package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-I6CUIAQH.cjs} +5 -5
- package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
- package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
- package/dist/lib/node/chunk-T4W4AKGM.cjs +279 -0
- package/dist/lib/node/chunk-T4W4AKGM.cjs.map +7 -0
- package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
- package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
- package/dist/lib/node/index.cjs +220 -378
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
- package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-AGGGDOUC.cjs → react-surface-ZENSCF6S.cjs} +18 -12
- package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-ZENSCF6S.cjs.map} +2 -2
- package/dist/lib/node/types/index.cjs +8 -7
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs → TranscriptContainer-MOWZQSEO.mjs} +3 -3
- package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
- package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4A6BWPRB.mjs +253 -0
- package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
- package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-NFPDIQYG.mjs} +2 -2
- package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
- package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
- package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +203 -366
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
- package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs → react-surface-5CBEXLXJ.mjs} +15 -8
- package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-5CBEXLXJ.mjs.map} +2 -2
- package/dist/lib/node-esm/types/index.mjs +2 -1
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
- 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/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
- package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
- 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 +3 -2
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -9
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/transcriber/index.d.ts +1 -0
- package/dist/types/src/transcriber/index.d.ts.map +1 -1
- package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
- package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
- package/dist/types/src/transcriber/summarize.d.ts +5 -0
- package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
- package/dist/types/src/transcription-manager.d.ts +39 -0
- package/dist/types/src/transcription-manager.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +5 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +9 -15
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +13 -6
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
- package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
- package/package.json +40 -37
- package/src/TranscriptionPlugin.tsx +1 -2
- package/src/capabilities/app-graph-builder.ts +25 -2
- package/src/capabilities/intent-resolver.ts +24 -2
- package/src/capabilities/react-surface.tsx +2 -2
- package/src/components/Transcript/Transcript.stories.tsx +46 -27
- package/src/components/Transcript/Transcript.tsx +205 -49
- package/src/components/TranscriptContainer.tsx +12 -147
- package/src/components/transcription.stories.tsx +11 -13
- package/src/hooks/index.ts +0 -1
- package/src/index.ts +1 -0
- package/src/meta.ts +2 -2
- package/src/transcriber/index.ts +1 -0
- package/src/transcriber/media-stream-recorder.ts +4 -0
- package/src/transcriber/summarize.ts +77 -0
- package/src/transcription-manager.ts +183 -0
- package/src/translations.ts +2 -2
- package/src/types/schema.ts +5 -3
- package/src/types/types.ts +12 -2
- package/src/util/random-queue-dxn.ts +2 -2
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
- package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
- package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
- package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
- package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
- package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
- package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
- package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
- package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
- package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
- package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-36EQXBWR.mjs +0 -242
- package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
- package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
- package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
- package/src/hooks/useIsSpeaking.ts +0 -77
- /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var intent_resolver_3KJZGGUQ_exports = {};
|
|
20
|
-
__export(intent_resolver_3KJZGGUQ_exports, {
|
|
21
|
-
default: () => intent_resolver_default
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(intent_resolver_3KJZGGUQ_exports);
|
|
24
|
-
var import_chunk_JBN3P6ZF = require("./chunk-JBN3P6ZF.cjs");
|
|
25
|
-
var import_chunk_UIHEGU6Q = require("./chunk-UIHEGU6Q.cjs");
|
|
26
|
-
var import_app_framework = require("@dxos/app-framework");
|
|
27
|
-
var import_live_object = require("@dxos/live-object");
|
|
28
|
-
var intent_resolver_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.IntentResolver, [
|
|
29
|
-
(0, import_app_framework.createResolver)({
|
|
30
|
-
intent: import_chunk_UIHEGU6Q.TranscriptionAction.Create,
|
|
31
|
-
resolve: ({ name }) => {
|
|
32
|
-
const transcript = (0, import_live_object.create)(import_chunk_UIHEGU6Q.TranscriptType, {
|
|
33
|
-
queue: (0, import_chunk_JBN3P6ZF.randomQueueDxn)().toString(),
|
|
34
|
-
name: name ?? `Transcript ${(0, import_chunk_JBN3P6ZF.getTimeStr)(Date.now())}`
|
|
35
|
-
});
|
|
36
|
-
return {
|
|
37
|
-
data: {
|
|
38
|
-
object: transcript
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
]);
|
|
44
|
-
//# sourceMappingURL=intent-resolver-3KJZGGUQ.cjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/intent-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { TranscriptionAction, TranscriptType } from '../types';\nimport { getTimeStr, randomQueueDxn } from '../util';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: TranscriptionAction.Create,\n resolve: ({ name }) => {\n const transcript = create(TranscriptType, {\n queue: randomQueueDxn().toString(), // TODO(burdon): Associate with space.\n name: name ?? `Transcript ${getTimeStr(Date.now())}`,\n });\n\n return { data: { object: transcript } };\n },\n }),\n ]);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAA+E;AAC/E,yBAAuB;AAKvB,IAAA,0BAAe,CAACA,gBACdC,kCAAYC,kCAAaC,gBAAgB;MACvCC,qCAAe;IACbC,QAAQC,0CAAoBC;IAC5BC,SAAS,CAAC,EAAEC,KAAI,MAAE;AAChB,YAAMC,iBAAaC,2BAAOC,sCAAgB;QACxCC,WAAOC,sCAAAA,EAAiBC,SAAQ;QAChCN,MAAMA,QAAQ,kBAAcO,kCAAWC,KAAKC,IAAG,CAAA,CAAA;MACjD,CAAA;AAEA,aAAO;QAAEC,MAAM;UAAEC,QAAQV;QAAW;MAAE;IACxC;EACF,CAAA;CACD;",
|
|
6
|
-
"names": ["context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "TranscriptionAction", "Create", "resolve", "name", "transcript", "create", "TranscriptType", "queue", "randomQueueDxn", "toString", "getTimeStr", "Date", "now", "data", "object"]
|
|
7
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts
|
|
4
|
-
import { Capabilities, contributes } from "@dxos/app-framework";
|
|
5
|
-
var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, []);
|
|
6
|
-
export {
|
|
7
|
-
app_graph_builder_default as default
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=app-graph-builder-77GQG6UF.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';\n\nexport default (context: PluginsContext) => contributes(Capabilities.AppGraphBuilder, []);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,cAAcC,mBAAwC;AAE/D,IAAA,4BAAe,CAACC,YAA4BC,YAAYC,aAAaC,iBAAiB,CAAA,CAAE;",
|
|
6
|
-
"names": ["Capabilities", "contributes", "context", "contributes", "Capabilities", "AppGraphBuilder"]
|
|
7
|
-
}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
TRANSCRIPTION_PLUGIN,
|
|
4
|
-
TranscriptBlock
|
|
5
|
-
} from "./chunk-KEG3ME4O.mjs";
|
|
6
|
-
|
|
7
|
-
// packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
|
|
8
|
-
import { pipe } from "effect";
|
|
9
|
-
import React2, { useCallback, useMemo, useState } from "react";
|
|
10
|
-
import { chain, createIntent, LayoutAction, useIntentDispatcher } from "@dxos/app-framework";
|
|
11
|
-
import { Message } from "@dxos/artifact";
|
|
12
|
-
import { AIServiceClientImpl, DEFAULT_LLM_MODEL, MixedStreamParser } from "@dxos/assistant";
|
|
13
|
-
import { create, getSpace, makeRef } from "@dxos/client/echo";
|
|
14
|
-
import { QueueImpl } from "@dxos/echo-db";
|
|
15
|
-
import { createStatic, isInstanceOf } from "@dxos/echo-schema";
|
|
16
|
-
import { invariant } from "@dxos/invariant";
|
|
17
|
-
import { DXN } from "@dxos/keys";
|
|
18
|
-
import { log } from "@dxos/log";
|
|
19
|
-
import { DocumentType } from "@dxos/plugin-markdown/types";
|
|
20
|
-
import { CollectionType, SpaceAction } from "@dxos/plugin-space/types";
|
|
21
|
-
import { useConfig } from "@dxos/react-client";
|
|
22
|
-
import { useEdgeClient, useQueue } from "@dxos/react-edge-client";
|
|
23
|
-
import { IconButton as IconButton2, Toolbar, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
24
|
-
import { ScrollContainer } from "@dxos/react-ui-components";
|
|
25
|
-
import { StackItem } from "@dxos/react-ui-stack";
|
|
26
|
-
import { TextType } from "@dxos/schema";
|
|
27
|
-
|
|
28
|
-
// packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx
|
|
29
|
-
import { formatDistanceToNow } from "date-fns/formatDistanceToNow";
|
|
30
|
-
import React from "react";
|
|
31
|
-
import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
|
|
32
|
-
var Transcript = ({ blocks }) => {
|
|
33
|
-
const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
|
|
34
|
-
const hoverButton = "p-1 min-bs-1 transition-opacity duration-250 opacity-10 group-hover:opacity-100";
|
|
35
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
36
|
-
role: "list",
|
|
37
|
-
className: "flex flex-col grow gap-2 m-1"
|
|
38
|
-
}, blocks?.map((block) => /* @__PURE__ */ React.createElement("div", {
|
|
39
|
-
role: "listitem",
|
|
40
|
-
key: block.id,
|
|
41
|
-
className: "flex flex-col py-1 border border-transparent hover:border-separator rounded"
|
|
42
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
43
|
-
className: "group flex items-center px-2"
|
|
44
|
-
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
45
|
-
icon: "ph--user--regular"
|
|
46
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
|
47
|
-
className: "px-2 text-sm text-subdued"
|
|
48
|
-
}, block.author), /* @__PURE__ */ React.createElement("div", {
|
|
49
|
-
className: "grow"
|
|
50
|
-
}), /* @__PURE__ */ React.createElement(IconButton, {
|
|
51
|
-
disabled: true,
|
|
52
|
-
icon: "ph--x--regular",
|
|
53
|
-
label: t("delete button"),
|
|
54
|
-
iconOnly: true,
|
|
55
|
-
size: 4,
|
|
56
|
-
classNames: hoverButton
|
|
57
|
-
})), block.segments.map((segment, i) => /* @__PURE__ */ React.createElement("div", {
|
|
58
|
-
key: i,
|
|
59
|
-
className: "group flex flex-col"
|
|
60
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
61
|
-
className: "px-2"
|
|
62
|
-
}, segment.text), /* @__PURE__ */ React.createElement("div", {
|
|
63
|
-
className: "flex gap-1 items-center justify-between px-2"
|
|
64
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
65
|
-
className: "grow"
|
|
66
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
|
67
|
-
className: "truncate text-xs text-subdued"
|
|
68
|
-
}, formatDistanceToNow(segment.started, {
|
|
69
|
-
addSuffix: true
|
|
70
|
-
})), /* @__PURE__ */ React.createElement(IconButton, {
|
|
71
|
-
disabled: true,
|
|
72
|
-
icon: "ph--bookmark-simple--regular",
|
|
73
|
-
label: t("bookmark button"),
|
|
74
|
-
iconOnly: true,
|
|
75
|
-
size: 4,
|
|
76
|
-
classNames: hoverButton
|
|
77
|
-
})))))));
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx
|
|
81
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx";
|
|
82
|
-
var TranscriptionContainer = ({ transcript }) => {
|
|
83
|
-
const { t } = useTranslation2(TRANSCRIPTION_PLUGIN);
|
|
84
|
-
const edge = useEdgeClient();
|
|
85
|
-
const aiService = useAiServiceClient();
|
|
86
|
-
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
87
|
-
const queue = useQueue(edge, transcript.queue ? DXN.parse(transcript.queue) : void 0, {
|
|
88
|
-
pollInterval: 1e3
|
|
89
|
-
});
|
|
90
|
-
const [isSummarizing, setIsSummarizing] = useState(false);
|
|
91
|
-
const handleSummarize = useCallback(async () => {
|
|
92
|
-
setIsSummarizing(true);
|
|
93
|
-
try {
|
|
94
|
-
const document = await summarizeTranscript(edge, aiService, transcript);
|
|
95
|
-
const space = getSpace(transcript);
|
|
96
|
-
const target = space?.properties[CollectionType.typename]?.target;
|
|
97
|
-
await dispatch(pipe(createIntent(SpaceAction.AddObject, {
|
|
98
|
-
object: document,
|
|
99
|
-
target
|
|
100
|
-
}), chain(LayoutAction.Open, {
|
|
101
|
-
part: "main"
|
|
102
|
-
})));
|
|
103
|
-
} finally {
|
|
104
|
-
setIsSummarizing(false);
|
|
105
|
-
}
|
|
106
|
-
}, [
|
|
107
|
-
transcript,
|
|
108
|
-
edge
|
|
109
|
-
]);
|
|
110
|
-
return /* @__PURE__ */ React2.createElement(StackItem.Content, {
|
|
111
|
-
toolbar: true
|
|
112
|
-
}, /* @__PURE__ */ React2.createElement(StackItem.Heading, null, /* @__PURE__ */ React2.createElement(Toolbar.Root, {
|
|
113
|
-
classNames: "flex gap-2"
|
|
114
|
-
}, /* @__PURE__ */ React2.createElement(IconButton2, {
|
|
115
|
-
icon: "ph--subtitles--regular",
|
|
116
|
-
iconOnly: true,
|
|
117
|
-
size: 5,
|
|
118
|
-
disabled: isSummarizing,
|
|
119
|
-
onClick: handleSummarize,
|
|
120
|
-
label: t("summary button")
|
|
121
|
-
}), isSummarizing && /* @__PURE__ */ React2.createElement("div", {
|
|
122
|
-
className: "text-sm"
|
|
123
|
-
}, t("summarizing label")))), /* @__PURE__ */ React2.createElement(ScrollContainer, null, /* @__PURE__ */ React2.createElement(Transcript, {
|
|
124
|
-
blocks: queue?.items
|
|
125
|
-
})));
|
|
126
|
-
};
|
|
127
|
-
var TranscriptContainer_default = TranscriptionContainer;
|
|
128
|
-
var summarizeTranscript = async (edgeClient, aiService, transcript) => {
|
|
129
|
-
invariant(transcript.queue, "No queue found for transcript", {
|
|
130
|
-
F: __dxlog_file,
|
|
131
|
-
L: 90,
|
|
132
|
-
S: void 0,
|
|
133
|
-
A: [
|
|
134
|
-
"transcript.queue",
|
|
135
|
-
"'No queue found for transcript'"
|
|
136
|
-
]
|
|
137
|
-
});
|
|
138
|
-
const queue = new QueueImpl(edgeClient, DXN.parse(transcript.queue));
|
|
139
|
-
await queue.refresh();
|
|
140
|
-
const content = queue.items.filter((block) => isInstanceOf(TranscriptBlock, block)).map((block) => `${block.author}: ${block.segments.map((segment) => segment.text).join("\n")}`).join("\n\n");
|
|
141
|
-
const parser = new MixedStreamParser();
|
|
142
|
-
log.info("summarizing transcript", {
|
|
143
|
-
blockCount: queue.items.length
|
|
144
|
-
}, {
|
|
145
|
-
F: __dxlog_file,
|
|
146
|
-
L: 101,
|
|
147
|
-
S: void 0,
|
|
148
|
-
C: (f, a) => f(...a)
|
|
149
|
-
});
|
|
150
|
-
const output = await parser.parse(await aiService.exec({
|
|
151
|
-
model: DEFAULT_LLM_MODEL,
|
|
152
|
-
systemPrompt: SUMMARIZE_PROMPT,
|
|
153
|
-
history: [
|
|
154
|
-
createStatic(Message, {
|
|
155
|
-
role: "user",
|
|
156
|
-
content: [
|
|
157
|
-
{
|
|
158
|
-
type: "text",
|
|
159
|
-
text: content
|
|
160
|
-
}
|
|
161
|
-
]
|
|
162
|
-
})
|
|
163
|
-
]
|
|
164
|
-
}));
|
|
165
|
-
log.info("transcript summary", {
|
|
166
|
-
output
|
|
167
|
-
}, {
|
|
168
|
-
F: __dxlog_file,
|
|
169
|
-
L: 110,
|
|
170
|
-
S: void 0,
|
|
171
|
-
C: (f, a) => f(...a)
|
|
172
|
-
});
|
|
173
|
-
invariant(output[0].content[0].type === "text", "Expected text content", {
|
|
174
|
-
F: __dxlog_file,
|
|
175
|
-
L: 111,
|
|
176
|
-
S: void 0,
|
|
177
|
-
A: [
|
|
178
|
-
"output[0].content[0].type === 'text'",
|
|
179
|
-
"'Expected text content'"
|
|
180
|
-
]
|
|
181
|
-
});
|
|
182
|
-
const summary = output[0].content[0].text;
|
|
183
|
-
const name = `Summary ${(transcript.started ?? /* @__PURE__ */ new Date()).toLocaleString("en-US", {
|
|
184
|
-
year: "numeric",
|
|
185
|
-
month: "long",
|
|
186
|
-
day: "numeric",
|
|
187
|
-
hour: "2-digit",
|
|
188
|
-
minute: "2-digit"
|
|
189
|
-
})}`;
|
|
190
|
-
return create(DocumentType, {
|
|
191
|
-
name,
|
|
192
|
-
content: makeRef(create(TextType, {
|
|
193
|
-
content: summary
|
|
194
|
-
})),
|
|
195
|
-
threads: []
|
|
196
|
-
});
|
|
197
|
-
};
|
|
198
|
-
var SUMMARIZE_PROMPT = `
|
|
199
|
-
# Goal
|
|
200
|
-
Create a markdown summary of the transcript provided.
|
|
201
|
-
|
|
202
|
-
# Formatting
|
|
203
|
-
- Format the summary as a markdown document without extra comments like "Here is the summary of the transcript:".
|
|
204
|
-
- Use markdown formatting for headings and bullet points.
|
|
205
|
-
- Format the summary as a list of key points and takeaways.
|
|
206
|
-
- All names of people should be in bold.
|
|
207
|
-
|
|
208
|
-
# Note Taking
|
|
209
|
-
- Correlate items in the summary with the person of origin to build a coherent narrative.
|
|
210
|
-
- Include short quotes verbatim where appropriate. Especially when concerned with design decisions and problem descriptions.
|
|
211
|
-
|
|
212
|
-
# Tasks
|
|
213
|
-
At the end of the summary include tasks.
|
|
214
|
-
Extract only the tasks that are:
|
|
215
|
-
- Directly actionable
|
|
216
|
-
- Clearly assigned to a person or team (or can easily be inferred)
|
|
217
|
-
- Strongly implied by the conversation and/or user note (no speculative tasks)
|
|
218
|
-
- Specific enough that someone reading them would know exactly what to do next
|
|
219
|
-
|
|
220
|
-
Format all tasks as markdown checkboxes using the syntax:
|
|
221
|
-
- [ ] Task description
|
|
222
|
-
|
|
223
|
-
Additional information can be included (indented).
|
|
224
|
-
|
|
225
|
-
If no actionable tasks are found, omit this tasks section.
|
|
226
|
-
`;
|
|
227
|
-
var useAiServiceClient = () => {
|
|
228
|
-
const config = useConfig();
|
|
229
|
-
const endpoint = config.values.runtime?.services?.ai?.server ?? "http://localhost:8788";
|
|
230
|
-
return useMemo(() => new AIServiceClientImpl({
|
|
231
|
-
endpoint
|
|
232
|
-
}), [
|
|
233
|
-
endpoint
|
|
234
|
-
]);
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
export {
|
|
238
|
-
Transcript,
|
|
239
|
-
TranscriptionContainer,
|
|
240
|
-
TranscriptContainer_default
|
|
241
|
-
};
|
|
242
|
-
//# sourceMappingURL=chunk-36EQXBWR.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/TranscriptContainer.tsx", "../../../src/components/Transcript/Transcript.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { pipe } from 'effect';\nimport React, { useCallback, useMemo, useState, type FC } from 'react';\n\nimport { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { Message } from '@dxos/artifact';\nimport { AIServiceClientImpl, DEFAULT_LLM_MODEL, MixedStreamParser, type AIServiceClient } from '@dxos/assistant';\nimport { create, getSpace, makeRef } from '@dxos/client/echo';\nimport { QueueImpl } from '@dxos/echo-db';\nimport { createStatic, isInstanceOf } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { DocumentType } from '@dxos/plugin-markdown/types';\nimport { CollectionType, SpaceAction } from '@dxos/plugin-space/types';\nimport { useConfig } from '@dxos/react-client';\nimport { useEdgeClient, useQueue, type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { IconButton, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { ScrollContainer } from '@dxos/react-ui-components';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { TextType } from '@dxos/schema';\n\nimport { Transcript } from './Transcript';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptBlock, type TranscriptType } from '../types';\n\nexport const TranscriptionContainer: FC<{ transcript: TranscriptType }> = ({ transcript }) => {\n const { t } = useTranslation(TRANSCRIPTION_PLUGIN);\n const edge = useEdgeClient();\n const aiService = useAiServiceClient();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const queue = useQueue<TranscriptBlock>(edge, transcript.queue ? DXN.parse(transcript.queue) : undefined, {\n pollInterval: 1_000,\n });\n\n // TODO(dmaretskyi): Pending state and errors should be handled by the framework!!!\n const [isSummarizing, setIsSummarizing] = useState(false);\n const handleSummarize = useCallback(async () => {\n setIsSummarizing(true);\n try {\n const document = await summarizeTranscript(edge, aiService, transcript);\n const space = getSpace(transcript);\n const target = space?.properties[CollectionType.typename]?.target;\n await dispatch(\n pipe(\n createIntent(SpaceAction.AddObject, { object: document, target }),\n chain(LayoutAction.Open, { part: 'main' }),\n ),\n );\n } finally {\n setIsSummarizing(false);\n }\n }, [transcript, edge]);\n\n // TODO(dmaretskyi): Move action to menu.\n return (\n <StackItem.Content toolbar={true}>\n <StackItem.Heading>\n <Toolbar.Root classNames='flex gap-2'>\n <IconButton\n icon='ph--subtitles--regular'\n iconOnly\n size={5}\n disabled={isSummarizing}\n onClick={handleSummarize}\n label={t('summary button')}\n />\n {isSummarizing && <div className='text-sm'>{t('summarizing label')}</div>}\n </Toolbar.Root>\n </StackItem.Heading>\n <ScrollContainer>\n <Transcript blocks={queue?.items} />\n </ScrollContainer>\n </StackItem.Content>\n );\n};\n\nexport default TranscriptionContainer;\n\n// TODO(dmaretskyi): Extract to the new file once transcript refactoring has settled.\nconst summarizeTranscript = async (\n edgeClient: EdgeHttpClient,\n aiService: AIServiceClient,\n transcript: TranscriptType,\n) => {\n invariant(transcript.queue, 'No queue found for transcript');\n\n const queue = new QueueImpl(edgeClient, DXN.parse(transcript.queue));\n await queue.refresh();\n const content = queue.items\n .filter((block) => isInstanceOf(TranscriptBlock, block))\n .map((block) => `${block.author}: ${block.segments.map((segment) => segment.text).join('\\n')}`)\n .join('\\n\\n');\n\n const parser = new MixedStreamParser();\n\n log.info('summarizing transcript', { blockCount: queue.items.length });\n const output = await parser.parse(\n await aiService.exec({\n model: DEFAULT_LLM_MODEL,\n systemPrompt: SUMMARIZE_PROMPT,\n history: [createStatic(Message, { role: 'user', content: [{ type: 'text', text: content }] })],\n }),\n );\n\n log.info('transcript summary', { output });\n invariant(output[0].content[0].type === 'text', 'Expected text content');\n const summary = output[0].content[0].text;\n\n // TODO(dmaretskyi): .started is missing.\n const name = `Summary ${(transcript.started ?? new Date()).toLocaleString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}`;\n\n return create(DocumentType, {\n name,\n content: makeRef(create(TextType, { content: summary })),\n threads: [],\n });\n};\n\n// TODO(dmaretskyi): Add example to set consistent structure for the summary.\nconst SUMMARIZE_PROMPT = `\n # Goal\n Create a markdown summary of the transcript provided.\n\n # Formatting\n - Format the summary as a markdown document without extra comments like \"Here is the summary of the transcript:\".\n - Use markdown formatting for headings and bullet points.\n - Format the summary as a list of key points and takeaways.\n - All names of people should be in bold.\n\n # Note Taking\n - Correlate items in the summary with the person of origin to build a coherent narrative.\n - Include short quotes verbatim where appropriate. Especially when concerned with design decisions and problem descriptions.\n\n # Tasks\n At the end of the summary include tasks.\n Extract only the tasks that are:\n - Directly actionable\n - Clearly assigned to a person or team (or can easily be inferred)\n - Strongly implied by the conversation and/or user note (no speculative tasks)\n - Specific enough that someone reading them would know exactly what to do next\n\n Format all tasks as markdown checkboxes using the syntax:\n - [ ] Task description\n\n Additional information can be included (indented).\n\n If no actionable tasks are found, omit this tasks section.\n`;\n\n// TODO(dmaretskyi): Extract?\n// Also this conflicts with plugin automation providing the ai client via a capability. Need to reconcile.\nconst useAiServiceClient = (): AIServiceClient => {\n const config = useConfig();\n const endpoint = config.values.runtime?.services?.ai?.server ?? 'http://localhost:8788'; // TOOD(burdon): Standardize consts.\n return useMemo(() => new AIServiceClientImpl({ endpoint }), [endpoint]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { formatDistanceToNow } from 'date-fns/formatDistanceToNow';\nimport React, { type FC } from 'react';\n\nimport { Icon, IconButton, useTranslation } from '@dxos/react-ui';\n\nimport { TRANSCRIPTION_PLUGIN } from '../../meta';\nimport { type TranscriptBlock } from '../../types';\n\n// TODO(burdon): react-ui-list.\n// TODO(burdon): Actions (e.g., mark, summarize, translate, label, delete).\n\nexport type TranscriptProps = {\n blocks?: TranscriptBlock[];\n};\n\nexport const Transcript: FC<TranscriptProps> = ({ blocks }) => {\n const { t } = useTranslation(TRANSCRIPTION_PLUGIN);\n const hoverButton = 'p-1 min-bs-1 transition-opacity duration-250 opacity-10 group-hover:opacity-100';\n\n return (\n <div role='list' className='flex flex-col grow gap-2 m-1'>\n {blocks?.map((block) => (\n <div\n role='listitem'\n key={block.id}\n className='flex flex-col py-1 border border-transparent hover:border-separator rounded'\n >\n <div className='group flex items-center px-2'>\n <Icon icon='ph--user--regular' />\n <div className='px-2 text-sm text-subdued'>{block.author}</div>\n <div className='grow' />\n <IconButton\n disabled\n icon='ph--x--regular'\n label={t('delete button')}\n iconOnly\n size={4}\n classNames={hoverButton}\n />\n </div>\n\n {block.segments.map((segment, i) => (\n <div key={i} className='group flex flex-col'>\n <div className='px-2'>{segment.text}</div>\n <div className='flex gap-1 items-center justify-between px-2'>\n <div className='grow' />\n <div className='truncate text-xs text-subdued'>\n {formatDistanceToNow(segment.started, { addSuffix: true })}\n </div>\n <IconButton\n disabled\n icon='ph--bookmark-simple--regular'\n label={t('bookmark button')}\n iconOnly\n size={4}\n classNames={hoverButton}\n />\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["pipe", "React", "useCallback", "useMemo", "useState", "chain", "createIntent", "LayoutAction", "useIntentDispatcher", "Message", "AIServiceClientImpl", "DEFAULT_LLM_MODEL", "MixedStreamParser", "create", "getSpace", "makeRef", "QueueImpl", "createStatic", "isInstanceOf", "invariant", "DXN", "log", "DocumentType", "CollectionType", "SpaceAction", "useConfig", "useEdgeClient", "useQueue", "IconButton", "Toolbar", "useTranslation", "ScrollContainer", "StackItem", "TextType", "formatDistanceToNow", "React", "Icon", "IconButton", "useTranslation", "Transcript", "blocks", "t", "useTranslation", "TRANSCRIPTION_PLUGIN", "hoverButton", "div", "role", "className", "map", "block", "key", "id", "Icon", "icon", "author", "IconButton", "disabled", "label", "iconOnly", "size", "classNames", "segments", "segment", "i", "text", "formatDistanceToNow", "started", "addSuffix", "TranscriptionContainer", "transcript", "t", "useTranslation", "TRANSCRIPTION_PLUGIN", "edge", "useEdgeClient", "aiService", "useAiServiceClient", "dispatchPromise", "dispatch", "useIntentDispatcher", "queue", "useQueue", "DXN", "parse", "undefined", "pollInterval", "isSummarizing", "setIsSummarizing", "useState", "handleSummarize", "useCallback", "document", "summarizeTranscript", "space", "getSpace", "target", "properties", "CollectionType", "typename", "pipe", "createIntent", "SpaceAction", "AddObject", "object", "chain", "LayoutAction", "Open", "part", "React", "StackItem", "Content", "toolbar", "Heading", "Toolbar", "Root", "classNames", "IconButton", "icon", "iconOnly", "size", "disabled", "onClick", "label", "div", "className", "ScrollContainer", "Transcript", "blocks", "items", "edgeClient", "invariant", "QueueImpl", "refresh", "content", "filter", "block", "isInstanceOf", "TranscriptBlock", "map", "author", "segments", "segment", "text", "join", "parser", "MixedStreamParser", "log", "info", "blockCount", "length", "output", "exec", "model", "DEFAULT_LLM_MODEL", "systemPrompt", "SUMMARIZE_PROMPT", "history", "createStatic", "Message", "role", "type", "summary", "name", "started", "Date", "toLocaleString", "year", "month", "day", "hour", "minute", "create", "DocumentType", "makeRef", "TextType", "threads", "config", "useConfig", "endpoint", "values", "runtime", "services", "ai", "server", "useMemo", "AIServiceClientImpl"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts", "../../../src/meta.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { EchoObject, ObjectId, 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 string for dates?\n started: S.optional(S.Date),\n ended: S.optional(S.Date),\n\n /**\n * Queue containing TranscriptBlock objects.\n */\n queue: S.optional(S.String),\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.Date),\n});\n\nexport type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;\n\n/**\n * Transcription fragment.\n */\nconst TranscriptSegment = S.Struct({\n // TODO(burdon): TS from service is not Unix TS (x1000).\n started: S.Date,\n text: S.String,\n});\n\nexport type TranscriptSegment = S.Schema.Type<typeof TranscriptSegment>;\n\n/**\n * Transcription block (from single speaker).\n */\nexport const TranscriptBlock = S.Struct({\n id: ObjectId,\n author: S.optional(S.String), // TODO(burdon): DID?\n segments: S.Array(TranscriptSegment),\n}).pipe(EchoObject('dxos.org/type/TranscriptBlock', '0.1.0'));\n\nexport type TranscriptBlock = S.Schema.Type<typeof TranscriptBlock>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { S, isInstanceOf } from '@dxos/echo-schema';\nimport { isReactiveObject } from '@dxos/react-client/echo';\n\nimport { TranscriptSchema, 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 }),\n output: S.Struct({\n object: TranscriptSchema,\n }),\n }) {}\n}\n\nexport const isTranscript = (object: unknown): object is typeof TranscriptType => {\n return isReactiveObject(object) && isInstanceOf(TranscriptType, object);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const TRANSCRIPTION_PLUGIN = 'dxos.org/plugin/transcription';\n\nexport const meta = {\n id: TRANSCRIPTION_PLUGIN,\n name: 'Transcription',\n description: 'Voice transcription.',\n icon: 'ph--microphone--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription',\n tags: ['experimental'],\n screenshots: [],\n} satisfies PluginMeta;\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,YAAYC,UAAUC,GAAGC,mBAAmB;AAK9C,IAAMC,mBAAmBC,EAAEC,OAAO;EACvCC,MAAMF,EAAEG;;EAGRC,SAASJ,EAAEK,SAASL,EAAEM,IAAI;EAC1BC,OAAOP,EAAEK,SAASL,EAAEM,IAAI;;;;EAKxBE,OAAOR,EAAEK,SAASL,EAAEG,MAAM;AAC5B,CAAA;AAEO,IAAMM,iBAAN,cAA6BC,YAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGb,iBAAiBc,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBd,EAAEC,OAAO;EAChCG,SAASJ,EAAEK,SAASL,EAAEM,IAAI;AAC5B,CAAA;AAOA,IAAMS,oBAAoBf,EAAEC,OAAO;;EAEjCG,SAASJ,EAAEM;EACXU,MAAMhB,EAAEG;AACV,CAAA;AAOO,IAAMc,kBAAkBjB,EAAEC,OAAO;EACtCiB,IAAIC;EACJC,QAAQpB,EAAEK,SAASL,EAAEG,MAAM;EAC3BkB,UAAUrB,EAAEsB,MAAMP,iBAAAA;AACpB,CAAA,EAAGQ,KAAKC,WAAW,iCAAiC,OAAA,CAAA;;;ACrDpD,SAASC,KAAAA,IAAGC,oBAAoB;AAChC,SAASC,wBAAwB;;;ACC1B,IAAMC,uBAAuB;AAE7B,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa,CAAA;AACf;;;ADAO,IAAMC,oBAAoB;;UAEhBC,sBAAAA;AACf,QAAMC,uBAAuB,GAAGC,oBAAAA;EAEzB,MAAMC,eAAeC,GAAEC,YAAW,EAAW,GAAGJ,oBAAAA,WAA+B;IACpFK,OAAOF,GAAEG,OAAO;MACdC,MAAMJ,GAAEK,SAASL,GAAEM,MAAM;IAC3B,CAAA;IACAC,QAAQP,GAAEG,OAAO;MACfK,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;uBAPSV,SAAAA;AAQf,GAXiBH,wBAAAA,sBAAAA,CAAAA,EAAAA;AAaV,IAAMc,eAAe,CAACF,WAAAA;AAC3B,SAAOG,iBAAiBH,MAAAA,KAAWI,aAAaC,gBAAgBL,MAAAA;AAClE;",
|
|
6
|
-
"names": ["EchoObject", "ObjectId", "S", "TypedObject", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "Date", "ended", "queue", "TranscriptType", "TypedObject", "typename", "version", "fields", "TranscriptHeader", "TranscriptSegment", "text", "TranscriptBlock", "id", "ObjectId", "author", "segments", "Array", "pipe", "EchoObject", "S", "isInstanceOf", "isReactiveObject", "TRANSCRIPTION_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots", "TRANSCRIPTION_URL", "TranscriptionAction", "TRANSCRIPTION_ACTION", "TRANSCRIPTION_PLUGIN", "Create", "S", "TaggedClass", "input", "Struct", "name", "optional", "String", "output", "object", "TranscriptSchema", "isTranscript", "isReactiveObject", "isInstanceOf", "TranscriptType"]
|
|
7
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts
|
|
4
|
-
var getTimeStr = (timestamp) => new Date(timestamp ?? Date.now()).toLocaleTimeString("en-US", {
|
|
5
|
-
timeZone: "UTC",
|
|
6
|
-
hour12: true,
|
|
7
|
-
hour: "numeric",
|
|
8
|
-
minute: "2-digit",
|
|
9
|
-
second: "2-digit"
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
// packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts
|
|
13
|
-
import { ObjectId } from "@dxos/echo-schema";
|
|
14
|
-
import { DXN, QueueSubspaceTags, SpaceId } from "@dxos/keys";
|
|
15
|
-
var randomQueueDxn = () => new DXN(DXN.kind.QUEUE, [
|
|
16
|
-
QueueSubspaceTags.DATA,
|
|
17
|
-
SpaceId.random(),
|
|
18
|
-
ObjectId.random()
|
|
19
|
-
]);
|
|
20
|
-
|
|
21
|
-
// packages/plugins/experimental/plugin-transcription/src/util/array.ts
|
|
22
|
-
var mergeFloat64Arrays = (arrays) => {
|
|
23
|
-
const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
|
|
24
|
-
let offset = 0;
|
|
25
|
-
for (const array of arrays) {
|
|
26
|
-
newArray.set(array, offset);
|
|
27
|
-
offset += array.length;
|
|
28
|
-
}
|
|
29
|
-
return newArray;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts
|
|
33
|
-
var monitorAudioLevel = ({ mediaStreamTrack, onMeasure, intervalMs = 1e3 / 10 }) => {
|
|
34
|
-
let timeout = -1;
|
|
35
|
-
let interval = -1;
|
|
36
|
-
const audioContext = new AudioContext();
|
|
37
|
-
const stream = new MediaStream();
|
|
38
|
-
stream.addTrack(mediaStreamTrack);
|
|
39
|
-
const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);
|
|
40
|
-
const analyserNode = audioContext.createAnalyser();
|
|
41
|
-
mediaStreamAudioSourceNode.connect(analyserNode);
|
|
42
|
-
analyserNode.fftSize = 32;
|
|
43
|
-
const pcmData = new Float32Array(analyserNode.fftSize);
|
|
44
|
-
let peak = 0;
|
|
45
|
-
interval = window.setInterval(() => {
|
|
46
|
-
onMeasure(peak);
|
|
47
|
-
peak = 0;
|
|
48
|
-
}, intervalMs);
|
|
49
|
-
const tick = () => {
|
|
50
|
-
timeout = window.setTimeout(() => {
|
|
51
|
-
analyserNode.getFloatTimeDomainData(pcmData);
|
|
52
|
-
let sumSquares = 0;
|
|
53
|
-
for (const amplitude of pcmData) {
|
|
54
|
-
sumSquares += amplitude * amplitude;
|
|
55
|
-
}
|
|
56
|
-
const current = Math.sqrt(sumSquares / pcmData.length);
|
|
57
|
-
if (current > peak) {
|
|
58
|
-
peak = current;
|
|
59
|
-
}
|
|
60
|
-
tick();
|
|
61
|
-
}, intervalMs);
|
|
62
|
-
};
|
|
63
|
-
tick();
|
|
64
|
-
return () => {
|
|
65
|
-
mediaStreamAudioSourceNode.disconnect();
|
|
66
|
-
analyserNode.disconnect();
|
|
67
|
-
void audioContext.close();
|
|
68
|
-
clearInterval(interval);
|
|
69
|
-
clearTimeout(timeout);
|
|
70
|
-
stream.removeTrack(mediaStreamTrack);
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
export {
|
|
75
|
-
mergeFloat64Arrays,
|
|
76
|
-
getTimeStr,
|
|
77
|
-
monitorAudioLevel,
|
|
78
|
-
randomQueueDxn
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=chunk-XYU6B73V.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts", "../../../src/util/monitor-audio-level.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = () =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const monitorAudioLevel = ({\n mediaStreamTrack,\n onMeasure,\n intervalMs = 1000 / 10, // 12 fps.\n}: {\n mediaStreamTrack: MediaStreamTrack;\n onMeasure: (value: number) => void;\n intervalMs?: number;\n}) => {\n let timeout = -1;\n let interval = -1;\n const audioContext = new AudioContext();\n const stream = new MediaStream();\n stream.addTrack(mediaStreamTrack);\n const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);\n const analyserNode = audioContext.createAnalyser();\n mediaStreamAudioSourceNode.connect(analyserNode);\n // Since we just need a rough approximation and will be measuring\n // frequently, we want to drop this down from the default of 2048.\n analyserNode.fftSize = 32;\n\n const pcmData = new Float32Array(analyserNode.fftSize);\n let peak = 0;\n\n interval = window.setInterval(() => {\n onMeasure(peak);\n peak = 0;\n }, intervalMs);\n\n const tick = () => {\n timeout = window.setTimeout(() => {\n analyserNode.getFloatTimeDomainData(pcmData);\n let sumSquares = 0.0;\n for (const amplitude of pcmData) {\n sumSquares += amplitude * amplitude;\n }\n const current = Math.sqrt(sumSquares / pcmData.length);\n if (current > peak) {\n peak = current;\n }\n tick();\n }, intervalMs);\n };\n tick();\n\n return () => {\n mediaStreamAudioSourceNode.disconnect();\n analyserNode.disconnect();\n void audioContext.close();\n clearInterval(interval);\n clearTimeout(timeout);\n stream.removeTrack(mediaStreamTrack);\n };\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIO,IAAMA,aAAa,CAACC,cACzB,IAAIC,KAAKD,aAAaC,KAAKC,IAAG,CAAA,EAAIC,mBAAmB,SAAS;EAC5DC,UAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,QAAQ;EACRC,QAAQ;AACV,CAAA;;;ACPF,SAASC,gBAAgB;AACzB,SAASC,KAAKC,mBAAmBC,eAAe;AAEzC,IAAMC,iBAAiB,MAC5B,IAAIC,IAAIA,IAAIC,KAAKC,OAAO;EAACC,kBAAkBC;EAAMC,QAAQC,OAAM;EAAIC,SAASD,OAAM;CAAG;;;ACJhF,IAAME,qBAAqB,CAACC,WAAAA;AACjC,QAAMC,WAAW,IAAIC,aAAaF,OAAOG,OAAO,CAACC,KAAKC,UAAUA,MAAMC,SAASF,KAAK,CAAA,CAAA;AACpF,MAAIG,SAAS;AACb,aAAWF,SAASL,QAAQ;AAC1BC,aAASO,IAAIH,OAAOE,MAAAA;AACpBA,cAAUF,MAAMC;EAClB;AAEA,SAAOL;AACT;;;ACTO,IAAMQ,oBAAoB,CAAC,EAChCC,kBACAC,WACAC,aAAa,MAAO,GAAE,MAKvB;AACC,MAAIC,UAAU;AACd,MAAIC,WAAW;AACf,QAAMC,eAAe,IAAIC,aAAAA;AACzB,QAAMC,SAAS,IAAIC,YAAAA;AACnBD,SAAOE,SAAST,gBAAAA;AAChB,QAAMU,6BAA6BL,aAAaM,wBAAwBJ,MAAAA;AACxE,QAAMK,eAAeP,aAAaQ,eAAc;AAChDH,6BAA2BI,QAAQF,YAAAA;AAGnCA,eAAaG,UAAU;AAEvB,QAAMC,UAAU,IAAIC,aAAaL,aAAaG,OAAO;AACrD,MAAIG,OAAO;AAEXd,aAAWe,OAAOC,YAAY,MAAA;AAC5BnB,cAAUiB,IAAAA;AACVA,WAAO;EACT,GAAGhB,UAAAA;AAEH,QAAMmB,OAAO,MAAA;AACXlB,cAAUgB,OAAOG,WAAW,MAAA;AAC1BV,mBAAaW,uBAAuBP,OAAAA;AACpC,UAAIQ,aAAa;AACjB,iBAAWC,aAAaT,SAAS;AAC/BQ,sBAAcC,YAAYA;MAC5B;AACA,YAAMC,UAAUC,KAAKC,KAAKJ,aAAaR,QAAQa,MAAM;AACrD,UAAIH,UAAUR,MAAM;AAClBA,eAAOQ;MACT;AACAL,WAAAA;IACF,GAAGnB,UAAAA;EACL;AACAmB,OAAAA;AAEA,SAAO,MAAA;AACLX,+BAA2BoB,WAAU;AACrClB,iBAAakB,WAAU;AACvB,SAAKzB,aAAa0B,MAAK;AACvBC,kBAAc5B,QAAAA;AACd6B,iBAAa9B,OAAAA;AACbI,WAAO2B,YAAYlC,gBAAAA;EACrB;AACF;",
|
|
6
|
-
"names": ["getTimeStr", "timestamp", "Date", "now", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "ObjectId", "DXN", "QueueSubspaceTags", "SpaceId", "randomQueueDxn", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set", "monitorAudioLevel", "mediaStreamTrack", "onMeasure", "intervalMs", "timeout", "interval", "audioContext", "AudioContext", "stream", "MediaStream", "addTrack", "mediaStreamAudioSourceNode", "createMediaStreamSource", "analyserNode", "createAnalyser", "connect", "fftSize", "pcmData", "Float32Array", "peak", "window", "setInterval", "tick", "setTimeout", "getFloatTimeDomainData", "sumSquares", "amplitude", "current", "Math", "sqrt", "length", "disconnect", "close", "clearInterval", "clearTimeout", "removeTrack"]
|
|
7
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getTimeStr,
|
|
4
|
-
randomQueueDxn
|
|
5
|
-
} from "./chunk-XYU6B73V.mjs";
|
|
6
|
-
import {
|
|
7
|
-
TranscriptType,
|
|
8
|
-
TranscriptionAction
|
|
9
|
-
} from "./chunk-KEG3ME4O.mjs";
|
|
10
|
-
|
|
11
|
-
// packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts
|
|
12
|
-
import { Capabilities, contributes, createResolver } from "@dxos/app-framework";
|
|
13
|
-
import { create } from "@dxos/live-object";
|
|
14
|
-
var intent_resolver_default = (context) => contributes(Capabilities.IntentResolver, [
|
|
15
|
-
createResolver({
|
|
16
|
-
intent: TranscriptionAction.Create,
|
|
17
|
-
resolve: ({ name }) => {
|
|
18
|
-
const transcript = create(TranscriptType, {
|
|
19
|
-
queue: randomQueueDxn().toString(),
|
|
20
|
-
name: name ?? `Transcript ${getTimeStr(Date.now())}`
|
|
21
|
-
});
|
|
22
|
-
return {
|
|
23
|
-
data: {
|
|
24
|
-
object: transcript
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
]);
|
|
30
|
-
export {
|
|
31
|
-
intent_resolver_default as default
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=intent-resolver-UGLYRD4X.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/intent-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { TranscriptionAction, TranscriptType } from '../types';\nimport { getTimeStr, randomQueueDxn } from '../util';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: TranscriptionAction.Create,\n resolve: ({ name }) => {\n const transcript = create(TranscriptType, {\n queue: randomQueueDxn().toString(), // TODO(burdon): Associate with space.\n name: name ?? `Transcript ${getTimeStr(Date.now())}`,\n });\n\n return { data: { object: transcript } };\n },\n }),\n ]);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;AAIA,SAASA,cAAcC,aAAaC,sBAA2C;AAC/E,SAASC,cAAc;AAKvB,IAAA,0BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;EACvCC,eAAe;IACbC,QAAQC,oBAAoBC;IAC5BC,SAAS,CAAC,EAAEC,KAAI,MAAE;AAChB,YAAMC,aAAaC,OAAOC,gBAAgB;QACxCC,OAAOC,eAAAA,EAAiBC,SAAQ;QAChCN,MAAMA,QAAQ,cAAcO,WAAWC,KAAKC,IAAG,CAAA,CAAA;MACjD,CAAA;AAEA,aAAO;QAAEC,MAAM;UAAEC,QAAQV;QAAW;MAAE;IACxC;EACF,CAAA;CACD;",
|
|
6
|
-
"names": ["Capabilities", "contributes", "createResolver", "create", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "TranscriptionAction", "Create", "resolve", "name", "transcript", "create", "TranscriptType", "queue", "randomQueueDxn", "toString", "getTimeStr", "Date", "now", "data", "object"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useIsSpeaking.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useIsSpeaking.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa,sBAAuB,gBAAgB,YAoEhE,CAAC"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { useEffect, useRef, useState } from 'react';
|
|
6
|
-
|
|
7
|
-
import { monitorAudioLevel } from '../util';
|
|
8
|
-
|
|
9
|
-
export const useIsSpeaking = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
10
|
-
const [isSpeaking, setIsSpeaking] = useState(false);
|
|
11
|
-
|
|
12
|
-
// The audio level is monitored very rapidly, and we don't want
|
|
13
|
-
// react involved in tracking the state because it causes way
|
|
14
|
-
// too many re-renders. To work around this, we use the isSpeakingRef
|
|
15
|
-
// to track the state and then sync it using another effect.
|
|
16
|
-
const isSpeakingRef = useRef(isSpeaking);
|
|
17
|
-
|
|
18
|
-
// this effect syncs the state on a 50ms interval
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
if (!mediaStreamTrack) {
|
|
21
|
-
setIsSpeaking(false);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
isSpeakingRef.current = isSpeaking;
|
|
26
|
-
const interval = window.setInterval(() => {
|
|
27
|
-
// state is already in sync do nothing
|
|
28
|
-
if (isSpeaking === isSpeakingRef.current) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// sync state
|
|
33
|
-
setIsSpeaking(isSpeakingRef.current);
|
|
34
|
-
}, 50);
|
|
35
|
-
|
|
36
|
-
return () => {
|
|
37
|
-
clearInterval(interval);
|
|
38
|
-
};
|
|
39
|
-
}, [isSpeaking, isSpeakingRef, mediaStreamTrack]);
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (!mediaStreamTrack) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let timeout = -1;
|
|
47
|
-
const cleanup = monitorAudioLevel({
|
|
48
|
-
mediaStreamTrack,
|
|
49
|
-
onMeasure: (vol) => {
|
|
50
|
-
// Once the user has been determined to be speaking, we want
|
|
51
|
-
// to lower the threshold because speech patterns don't always
|
|
52
|
-
// kick up above 0.05
|
|
53
|
-
const audioLevelAboveThreshold = vol > (isSpeakingRef.current ? 0.02 : 0.05);
|
|
54
|
-
if (audioLevelAboveThreshold) {
|
|
55
|
-
// user is still speaking, clear timeout & reset.
|
|
56
|
-
clearTimeout(timeout);
|
|
57
|
-
timeout = -1;
|
|
58
|
-
// track state.
|
|
59
|
-
isSpeakingRef.current = true;
|
|
60
|
-
} else if (timeout === -1) {
|
|
61
|
-
// user is not speaking and timeout is not set.
|
|
62
|
-
timeout = window.setTimeout(() => {
|
|
63
|
-
isSpeakingRef.current = false;
|
|
64
|
-
// reset timeout
|
|
65
|
-
timeout = -1;
|
|
66
|
-
}, 1_000);
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
return () => {
|
|
72
|
-
cleanup();
|
|
73
|
-
};
|
|
74
|
-
}, [isSpeaking, mediaStreamTrack]);
|
|
75
|
-
|
|
76
|
-
return isSpeaking;
|
|
77
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|