@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.
Files changed (126) hide show
  1. package/dist/lib/browser/{TranscriptContainer-3LU3XBEB.mjs → TranscriptContainer-2VFHUHLE.mjs} +2 -2
  2. package/dist/lib/browser/{app-graph-builder-YXELPN6F.mjs → app-graph-builder-TDP6PYV6.mjs} +20 -19
  3. package/dist/lib/browser/app-graph-builder-TDP6PYV6.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-GWY2Q2NE.mjs → chunk-KSUYWWIU.mjs} +6 -6
  5. package/dist/lib/browser/chunk-KSUYWWIU.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-HNIKXVCG.mjs → chunk-NFVDICSJ.mjs} +7 -8
  7. package/dist/lib/browser/chunk-NFVDICSJ.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-HRDAILQX.mjs → chunk-O6RY7FNK.mjs} +2 -2
  9. package/dist/lib/browser/{chunk-TGOKX32G.mjs → chunk-YRWBY6UK.mjs} +15 -17
  10. package/dist/lib/browser/chunk-YRWBY6UK.mjs.map +7 -0
  11. package/dist/lib/browser/index.mjs +6 -6
  12. package/dist/lib/browser/index.mjs.map +3 -3
  13. package/dist/lib/browser/{intent-resolver-BBB3DWV4.mjs → intent-resolver-ZWKYRFE7.mjs} +2 -2
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/{react-surface-R277DACJ.mjs → react-surface-F32UNCKZ.mjs} +4 -4
  16. package/dist/lib/browser/{settings-I226DZ27.mjs → settings-6YAHKVKX.mjs} +2 -2
  17. package/dist/lib/browser/{transcriber-QRSS6X6S.mjs → transcriber-MSBS4VBI.mjs} +3 -3
  18. package/dist/lib/browser/types/index.mjs +1 -1
  19. package/dist/lib/node/{TranscriptContainer-DICOMZLM.cjs → TranscriptContainer-E2D7PKO3.cjs} +7 -7
  20. package/dist/lib/node/{TranscriptContainer-DICOMZLM.cjs.map → TranscriptContainer-E2D7PKO3.cjs.map} +2 -2
  21. package/dist/lib/node/{app-graph-builder-I6LYVIYY.cjs → app-graph-builder-W4VDMVGV.cjs} +29 -28
  22. package/dist/lib/node/app-graph-builder-W4VDMVGV.cjs.map +7 -0
  23. package/dist/lib/node/{chunk-RK4BEN5E.cjs → chunk-7XIIUVN3.cjs} +9 -9
  24. package/dist/lib/node/chunk-7XIIUVN3.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-34WFY7M7.cjs → chunk-IXU57SCA.cjs} +16 -18
  26. package/dist/lib/node/chunk-IXU57SCA.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-4JOJCZPJ.cjs → chunk-NBC6V3M2.cjs} +10 -11
  28. package/dist/lib/node/chunk-NBC6V3M2.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-K553L7CZ.cjs → chunk-TJMZ26GS.cjs} +5 -5
  30. package/dist/lib/node/index.cjs +27 -27
  31. package/dist/lib/node/index.cjs.map +3 -3
  32. package/dist/lib/node/{intent-resolver-7XY3WITN.cjs → intent-resolver-RM4JOCDV.cjs} +7 -7
  33. package/dist/lib/node/meta.json +1 -1
  34. package/dist/lib/node/{react-surface-HUSWAORU.cjs → react-surface-YQHBGPOC.cjs} +10 -10
  35. package/dist/lib/node/{settings-NDMU3EWQ.cjs → settings-ZMB4XRWS.cjs} +7 -7
  36. package/dist/lib/node/{transcriber-UZJMG44C.cjs → transcriber-55OE4X6I.cjs} +8 -8
  37. package/dist/lib/node/types/index.cjs +7 -7
  38. package/dist/lib/node/types/index.cjs.map +1 -1
  39. package/dist/lib/node-esm/{TranscriptContainer-K4E4P5T6.mjs → TranscriptContainer-5N3BSK2S.mjs} +2 -2
  40. package/dist/lib/node-esm/{app-graph-builder-6FY2UQOH.mjs → app-graph-builder-DDDVKUHS.mjs} +20 -19
  41. package/dist/lib/node-esm/app-graph-builder-DDDVKUHS.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-6C34FO4C.mjs → chunk-4RMJO6QQ.mjs} +7 -8
  43. package/dist/lib/node-esm/chunk-4RMJO6QQ.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-3I7AC3D3.mjs → chunk-HZBSWUJH.mjs} +2 -2
  45. package/dist/lib/node-esm/{chunk-KUQ3ZTRX.mjs → chunk-OS2ITZUL.mjs} +15 -17
  46. package/dist/lib/node-esm/chunk-OS2ITZUL.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-CKANLRS4.mjs → chunk-UWF6LM27.mjs} +6 -6
  48. package/dist/lib/node-esm/chunk-UWF6LM27.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +6 -6
  50. package/dist/lib/node-esm/index.mjs.map +3 -3
  51. package/dist/lib/node-esm/{intent-resolver-ACGAPLDZ.mjs → intent-resolver-HDRFXMKP.mjs} +2 -2
  52. package/dist/lib/node-esm/meta.json +1 -1
  53. package/dist/lib/node-esm/{react-surface-G2OY4MWL.mjs → react-surface-DRDNXTFZ.mjs} +4 -4
  54. package/dist/lib/node-esm/{settings-O7X2UQQG.mjs → settings-I35TVDUG.mjs} +2 -2
  55. package/dist/lib/node-esm/{transcriber-NVVFH7IF.mjs → transcriber-HH7EMCGH.mjs} +3 -3
  56. package/dist/lib/node-esm/types/index.mjs +1 -1
  57. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  58. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  59. package/dist/types/src/components/Transcript/Transcript.d.ts +3 -3
  60. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  61. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +2 -2
  62. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +10 -10
  64. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -1
  65. package/dist/types/src/components/Transcript/transcript-extension.d.ts +2 -2
  66. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
  67. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  68. package/dist/types/src/entity-extraction/entity-extraction.d.ts +3 -3
  69. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -1
  70. package/dist/types/src/testing/testing.d.ts +10 -11
  71. package/dist/types/src/testing/testing.d.ts.map +1 -1
  72. package/dist/types/src/transcriber/transcriber.d.ts +2 -2
  73. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  74. package/dist/types/src/transcriber/transcription-manager.d.ts +2 -2
  75. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  76. package/dist/types/src/types/schema.d.ts +19 -26
  77. package/dist/types/src/types/schema.d.ts.map +1 -1
  78. package/dist/types/src/types/types.d.ts +10 -10
  79. package/dist/types/src/types/types.d.ts.map +1 -1
  80. package/package.json +49 -51
  81. package/src/TranscriptionPlugin.tsx +2 -2
  82. package/src/capabilities/app-graph-builder.ts +10 -10
  83. package/src/components/Transcript/Transcript.stories.tsx +5 -5
  84. package/src/components/Transcript/Transcript.tsx +4 -10
  85. package/src/components/Transcript/deprecated/OldTranscript.tsx +13 -19
  86. package/src/components/Transcript/transcript-extension.ts +3 -3
  87. package/src/components/TranscriptContainer.tsx +2 -2
  88. package/src/components/transcription.stories.tsx +8 -14
  89. package/src/entity-extraction/entity-extraction.test.ts +4 -23
  90. package/src/entity-extraction/entity-extraction.ts +6 -11
  91. package/src/model/model.test.ts +10 -14
  92. package/src/testing/testing.ts +21 -34
  93. package/src/transcriber/transcriber.browser.test.ts +3 -3
  94. package/src/transcriber/transcriber.ts +3 -6
  95. package/src/transcriber/transcription-manager.ts +8 -8
  96. package/src/types/schema.ts +8 -10
  97. package/src/types/types.ts +10 -12
  98. package/dist/lib/browser/app-graph-builder-YXELPN6F.mjs.map +0 -7
  99. package/dist/lib/browser/chunk-GWY2Q2NE.mjs.map +0 -7
  100. package/dist/lib/browser/chunk-HNIKXVCG.mjs.map +0 -7
  101. package/dist/lib/browser/chunk-TGOKX32G.mjs.map +0 -7
  102. package/dist/lib/node/app-graph-builder-I6LYVIYY.cjs.map +0 -7
  103. package/dist/lib/node/chunk-34WFY7M7.cjs.map +0 -7
  104. package/dist/lib/node/chunk-4JOJCZPJ.cjs.map +0 -7
  105. package/dist/lib/node/chunk-RK4BEN5E.cjs.map +0 -7
  106. package/dist/lib/node-esm/app-graph-builder-6FY2UQOH.mjs.map +0 -7
  107. package/dist/lib/node-esm/chunk-6C34FO4C.mjs.map +0 -7
  108. package/dist/lib/node-esm/chunk-CKANLRS4.mjs.map +0 -7
  109. package/dist/lib/node-esm/chunk-KUQ3ZTRX.mjs.map +0 -7
  110. /package/dist/lib/browser/{TranscriptContainer-3LU3XBEB.mjs.map → TranscriptContainer-2VFHUHLE.mjs.map} +0 -0
  111. /package/dist/lib/browser/{chunk-HRDAILQX.mjs.map → chunk-O6RY7FNK.mjs.map} +0 -0
  112. /package/dist/lib/browser/{intent-resolver-BBB3DWV4.mjs.map → intent-resolver-ZWKYRFE7.mjs.map} +0 -0
  113. /package/dist/lib/browser/{react-surface-R277DACJ.mjs.map → react-surface-F32UNCKZ.mjs.map} +0 -0
  114. /package/dist/lib/browser/{settings-I226DZ27.mjs.map → settings-6YAHKVKX.mjs.map} +0 -0
  115. /package/dist/lib/browser/{transcriber-QRSS6X6S.mjs.map → transcriber-MSBS4VBI.mjs.map} +0 -0
  116. /package/dist/lib/node/{chunk-K553L7CZ.cjs.map → chunk-TJMZ26GS.cjs.map} +0 -0
  117. /package/dist/lib/node/{intent-resolver-7XY3WITN.cjs.map → intent-resolver-RM4JOCDV.cjs.map} +0 -0
  118. /package/dist/lib/node/{react-surface-HUSWAORU.cjs.map → react-surface-YQHBGPOC.cjs.map} +0 -0
  119. /package/dist/lib/node/{settings-NDMU3EWQ.cjs.map → settings-ZMB4XRWS.cjs.map} +0 -0
  120. /package/dist/lib/node/{transcriber-UZJMG44C.cjs.map → transcriber-55OE4X6I.cjs.map} +0 -0
  121. /package/dist/lib/node-esm/{TranscriptContainer-K4E4P5T6.mjs.map → TranscriptContainer-5N3BSK2S.mjs.map} +0 -0
  122. /package/dist/lib/node-esm/{chunk-3I7AC3D3.mjs.map → chunk-HZBSWUJH.mjs.map} +0 -0
  123. /package/dist/lib/node-esm/{intent-resolver-ACGAPLDZ.mjs.map → intent-resolver-HDRFXMKP.mjs.map} +0 -0
  124. /package/dist/lib/node-esm/{react-surface-G2OY4MWL.mjs.map → react-surface-DRDNXTFZ.mjs.map} +0 -0
  125. /package/dist/lib/node-esm/{settings-O7X2UQQG.mjs.map → settings-I35TVDUG.mjs.map} +0 -0
  126. /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 app_graph_builder_I6LYVIYY_exports = {};
20
- __export(app_graph_builder_I6LYVIYY_exports, {
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(app_graph_builder_I6LYVIYY_exports);
24
- var import_chunk_RK4BEN5E = require("./chunk-RK4BEN5E.cjs");
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 import_chunk_34WFY7M7 = require("./chunk-34WFY7M7.cjs");
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 import_schema2 = require("@dxos/schema");
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: 98,
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)(import_schema2.DataType.Message, {
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: 123,
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}][${import_keys2.DXN.fromLocalObjectId(quote.id).toString()}]`);
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)(import_chunk_34WFY7M7.TranscriptType);
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 import_chunk_34WFY7M7.TranscriptType) {
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)(import_chunk_34WFY7M7.TranscriptionAction.Create, {
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)(import_chunk_34WFY7M7.TranscriptType), {
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)(import_chunk_34WFY7M7.TranscriptType)}`,
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)(import_chunk_34WFY7M7.TranscriptType)]?.target,
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: import_chunk_34WFY7M7.TranscriptType,
240
- getIntent: ({ space }) => (0, import_app_framework.createIntent)(import_chunk_34WFY7M7.TranscriptionAction.Create, {
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
- import_schema.DataType.Person,
275
- import_schema.DataType.Organization
269
+ import_testing.Contact,
270
+ import_testing.Organization
276
271
  ],
277
272
  space
278
273
  });
279
274
  }
280
- state.transcriptionManager = await new import_chunk_RK4BEN5E.TranscriptionManager({
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)(import_chunk_34WFY7M7.TranscriptType);
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-I6LYVIYY.cjs.map
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 chunk_RK4BEN5E_exports = {};
30
- __export(chunk_RK4BEN5E_exports, {
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(chunk_RK4BEN5E_exports);
35
+ module.exports = __toCommonJS(chunk_7XIIUVN3_exports);
36
36
  var import_chunk_J72PUQ3C = require("./chunk-J72PUQ3C.cjs");
37
- var import_chunk_34WFY7M7 = require("./chunk-34WFY7M7.cjs");
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(`${import_chunk_34WFY7M7.TRANSCRIPTION_URL}/transcribe`, {
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.DataType.Message, {
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.DataType.Message, {
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.DataType.Message, {
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-RK4BEN5E.cjs.map
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 chunk_34WFY7M7_exports = {};
20
- __export(chunk_34WFY7M7_exports, {
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(chunk_34WFY7M7_exports);
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 = import_effect.Schema.Struct({
36
- name: import_effect.Schema.String,
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: import_effect.Schema.optional(import_effect.Schema.String),
39
- ended: import_effect.Schema.optional(import_effect.Schema.String),
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 = import_effect.Schema.Struct({
52
- started: import_effect.Schema.optional(import_effect.Schema.String)
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 import_effect2.Schema.TaggedClass()(`${TRANSCRIPTION_ACTION}/create`, {
59
- input: import_effect2.Schema.Struct({
60
- name: import_effect2.Schema.optional(import_effect2.Schema.String),
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: import_effect2.Schema.Struct({
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 = import_effect2.Schema.mutable(import_effect2.Schema.Struct({
74
- entityExtraction: import_effect2.Schema.optional(import_effect2.Schema.Boolean).pipe(import_effect2.Schema.withConstructorDefault(() => true))
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-34WFY7M7.cjs.map
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 chunk_4JOJCZPJ_exports = {};
30
- __export(chunk_4JOJCZPJ_exports, {
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(chunk_4JOJCZPJ_exports);
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-I6LYVIYY.cjs"));
614
- var IntentResolver = (0, import_app_framework2.lazy)(() => import("./intent-resolver-7XY3WITN.cjs"));
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-HUSWAORU.cjs"));
617
- var Transcriber = (0, import_app_framework2.lazy)(() => import("./transcriber-UZJMG44C.cjs"));
618
- var Settings = (0, import_app_framework2.lazy)(() => import("./settings-NDMU3EWQ.cjs"));
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-4JOJCZPJ.cjs.map
736
+ //# sourceMappingURL=chunk-NBC6V3M2.cjs.map