@dxos/plugin-transcription 0.10.0 → 0.11.0

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 (200) hide show
  1. package/dist/lib/TranscriptionPlugin.mjs +2 -0
  2. package/dist/lib/TranscriptionPlugin.node.mjs +11 -0
  3. package/dist/lib/TranscriptionPlugin.node.mjs.map +1 -0
  4. package/dist/lib/TranscriptionPlugin.workerd.mjs +11 -0
  5. package/dist/lib/TranscriptionPlugin.workerd.mjs.map +1 -0
  6. package/dist/lib/capabilities/node.mjs +9 -0
  7. package/dist/lib/capabilities/node.mjs.map +1 -0
  8. package/dist/lib/capabilities.mjs +18 -0
  9. package/dist/lib/capabilities.mjs.map +1 -0
  10. package/dist/lib/chunk-TranscriptionArticle.mjs +49 -0
  11. package/dist/lib/chunk-TranscriptionArticle.mjs.map +1 -0
  12. package/dist/lib/chunk-TranscriptionPlugin.mjs +39 -0
  13. package/dist/lib/chunk-TranscriptionPlugin.mjs.map +1 -0
  14. package/dist/lib/chunk-app-graph-builder.mjs +33 -0
  15. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  16. package/dist/lib/chunk-create.mjs +14 -0
  17. package/dist/lib/chunk-create.mjs.map +1 -0
  18. package/dist/lib/chunk-enrich-message.mjs +18 -0
  19. package/dist/lib/chunk-enrich-message.mjs.map +1 -0
  20. package/dist/lib/chunk-entity-lookup.mjs +26 -0
  21. package/dist/lib/chunk-entity-lookup.mjs.map +1 -0
  22. package/dist/lib/{neutral/markdown-extension-CCDXXY7E.mjs → chunk-markdown-extension.mjs} +7 -11
  23. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  24. package/dist/lib/{neutral/chunk-5BVHY75B.mjs → chunk-meta.mjs} +20 -27
  25. package/dist/lib/chunk-meta.mjs.map +1 -0
  26. package/dist/lib/chunk-open.mjs +16 -0
  27. package/dist/lib/chunk-open.mjs.map +1 -0
  28. package/dist/lib/chunk-operation-handler.mjs +11 -0
  29. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  30. package/dist/lib/chunk-pipeline-status.mjs +17 -0
  31. package/dist/lib/chunk-pipeline-status.mjs.map +1 -0
  32. package/dist/lib/chunk-react-surface.mjs +21 -0
  33. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  34. package/dist/lib/chunk-recording-session.mjs +13 -0
  35. package/dist/lib/chunk-recording-session.mjs.map +1 -0
  36. package/dist/lib/chunk-render-byline.mjs +15 -0
  37. package/dist/lib/chunk-render-byline.mjs.map +1 -0
  38. package/dist/lib/chunk-settings.mjs +26 -0
  39. package/dist/lib/chunk-settings.mjs.map +1 -0
  40. package/dist/lib/chunk-skill-definition.mjs +10 -0
  41. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  42. package/dist/lib/chunk-skills.mjs +21 -0
  43. package/dist/lib/chunk-skills.mjs.map +1 -0
  44. package/dist/lib/{neutral/summarize-LBUZTOTH.mjs → chunk-summarize.mjs} +25 -38
  45. package/dist/lib/chunk-summarize.mjs.map +1 -0
  46. package/dist/lib/chunk-text-content.mjs +28 -0
  47. package/dist/lib/chunk-text-content.mjs.map +1 -0
  48. package/dist/lib/chunk-transcriber.mjs +161 -0
  49. package/dist/lib/chunk-transcriber.mjs.map +1 -0
  50. package/dist/lib/chunk-transcription-driver.mjs +165 -0
  51. package/dist/lib/chunk-transcription-driver.mjs.map +1 -0
  52. package/dist/lib/chunk-types.mjs +141 -0
  53. package/dist/lib/chunk-types.mjs.map +1 -0
  54. package/dist/lib/components.mjs +108 -0
  55. package/dist/lib/components.mjs.map +1 -0
  56. package/dist/lib/containers.mjs +7 -0
  57. package/dist/lib/containers.mjs.map +1 -0
  58. package/dist/lib/hooks.mjs +87 -0
  59. package/dist/lib/hooks.mjs.map +1 -0
  60. package/dist/lib/index.mjs +4 -0
  61. package/dist/lib/meta.mjs +2 -0
  62. package/dist/lib/operations.mjs +7 -0
  63. package/dist/lib/operations.mjs.map +1 -0
  64. package/dist/lib/plugin.mjs +9 -0
  65. package/dist/lib/plugin.mjs.map +1 -0
  66. package/dist/lib/skills.mjs +2 -0
  67. package/dist/lib/testing.mjs +118 -0
  68. package/dist/lib/testing.mjs.map +1 -0
  69. package/dist/lib/translations.mjs +23 -0
  70. package/dist/lib/translations.mjs.map +1 -0
  71. package/dist/lib/types.mjs +2 -0
  72. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  73. package/dist/types/src/capabilities/entity-lookup.d.ts +1 -1
  74. package/dist/types/src/capabilities/markdown-extension.d.ts +1 -1
  75. package/dist/types/src/capabilities/node.d.ts +6 -0
  76. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  78. package/dist/types/src/capabilities/pipeline-status.d.ts +1 -1
  79. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/recording-session.d.ts +1 -1
  82. package/dist/types/src/capabilities/settings.d.ts +1 -1
  83. package/dist/types/src/capabilities/text-content.d.ts +1 -1
  84. package/dist/types/src/capabilities/transcriber.d.ts +1 -1
  85. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/transcription-driver.d.ts +1 -1
  87. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts +4 -1
  88. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts.map +1 -1
  89. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts.map +1 -1
  90. package/dist/types/src/hooks/useTranscriptionRecording.d.ts.map +1 -1
  91. package/dist/types/src/normalization/message-normalizer.d.ts +4 -4
  92. package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -1
  93. package/dist/types/src/normalization/normalization.d.ts +97 -87
  94. package/dist/types/src/normalization/normalization.d.ts.map +1 -1
  95. package/dist/types/src/operations/open.d.ts.map +1 -1
  96. package/dist/types/src/stories/Pipeline.stories.d.ts.map +1 -1
  97. package/dist/types/src/stories/Transcription.stories.d.ts.map +1 -1
  98. package/dist/types/src/transcription-manager.d.ts +1 -1
  99. package/dist/types/src/transcription-manager.d.ts.map +1 -1
  100. package/dist/types/src/types/TranscriptOperation.d.ts +97 -87
  101. package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -1
  102. package/dist/types/src/types/TranscriptionCapabilities.d.ts +2 -2
  103. package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -1
  104. package/dist/types/src/util/index.d.ts +1 -0
  105. package/dist/types/src/util/index.d.ts.map +1 -1
  106. package/dist/types/src/util/render-byline.d.ts +11 -0
  107. package/dist/types/src/util/render-byline.d.ts.map +1 -0
  108. package/dist/types/tsconfig.tsbuildinfo +1 -1
  109. package/dx.config.ts +1 -1
  110. package/package.json +78 -70
  111. package/src/capabilities/entity-lookup.ts +1 -1
  112. package/src/capabilities/node.ts +17 -0
  113. package/src/capabilities/pipeline-status.ts +1 -1
  114. package/src/capabilities/{react-surface.tsx → react-surface.ts} +2 -4
  115. package/src/capabilities/recording-session.ts +1 -1
  116. package/src/capabilities/text-content.ts +9 -4
  117. package/src/capabilities/transcriber.ts +3 -1
  118. package/src/capabilities/transcription-driver.tsx +1 -1
  119. package/src/containers/TranscriptionArticle/TranscriptionArticle.stories.tsx +2 -1
  120. package/src/containers/TranscriptionArticle/TranscriptionArticle.tsx +8 -3
  121. package/src/hooks/useTranscriptionRecording.ts +7 -8
  122. package/src/normalization/message-normalizer.ts +10 -7
  123. package/src/normalization/normalization.test.ts +41 -44
  124. package/src/operations/open.ts +1 -1
  125. package/src/stories/Pipeline.stories.tsx +15 -14
  126. package/src/stories/Transcription.stories.tsx +3 -8
  127. package/src/transcription-manager.ts +2 -2
  128. package/src/types/TranscriptionCapabilities.ts +2 -2
  129. package/src/util/index.ts +1 -0
  130. package/src/util/render-byline.ts +40 -0
  131. package/dist/lib/neutral/TranscriptionArticle-FEWCWG4A.mjs +0 -51
  132. package/dist/lib/neutral/TranscriptionArticle-FEWCWG4A.mjs.map +0 -7
  133. package/dist/lib/neutral/TranscriptionPlugin.mjs +0 -69
  134. package/dist/lib/neutral/TranscriptionPlugin.mjs.map +0 -7
  135. package/dist/lib/neutral/TranscriptionPlugin.node.mjs +0 -25
  136. package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +0 -7
  137. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs +0 -21
  138. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs.map +0 -7
  139. package/dist/lib/neutral/app-graph-builder-GQRMI22E.mjs +0 -48
  140. package/dist/lib/neutral/app-graph-builder-GQRMI22E.mjs.map +0 -7
  141. package/dist/lib/neutral/capabilities/index.mjs +0 -31
  142. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  143. package/dist/lib/neutral/chunk-5BVHY75B.mjs.map +0 -7
  144. package/dist/lib/neutral/chunk-HNXSU7HJ.mjs +0 -8
  145. package/dist/lib/neutral/chunk-HNXSU7HJ.mjs.map +0 -7
  146. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  147. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  148. package/dist/lib/neutral/chunk-KOXLGGSL.mjs +0 -30
  149. package/dist/lib/neutral/chunk-KOXLGGSL.mjs.map +0 -7
  150. package/dist/lib/neutral/chunk-MDV7NBFJ.mjs +0 -182
  151. package/dist/lib/neutral/chunk-MDV7NBFJ.mjs.map +0 -7
  152. package/dist/lib/neutral/components/index.mjs +0 -125
  153. package/dist/lib/neutral/components/index.mjs.map +0 -7
  154. package/dist/lib/neutral/containers/index.mjs +0 -9
  155. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  156. package/dist/lib/neutral/create-HNHGCKZ4.mjs +0 -21
  157. package/dist/lib/neutral/create-HNHGCKZ4.mjs.map +0 -7
  158. package/dist/lib/neutral/enrich-message-DSJU4TXC.mjs +0 -24
  159. package/dist/lib/neutral/enrich-message-DSJU4TXC.mjs.map +0 -7
  160. package/dist/lib/neutral/entity-lookup-PCDW7NC4.mjs +0 -25
  161. package/dist/lib/neutral/entity-lookup-PCDW7NC4.mjs.map +0 -7
  162. package/dist/lib/neutral/hooks/index.mjs +0 -97
  163. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  164. package/dist/lib/neutral/index.mjs +0 -20
  165. package/dist/lib/neutral/index.mjs.map +0 -7
  166. package/dist/lib/neutral/markdown-extension-CCDXXY7E.mjs.map +0 -7
  167. package/dist/lib/neutral/meta.json +0 -1
  168. package/dist/lib/neutral/meta.mjs +0 -8
  169. package/dist/lib/neutral/meta.mjs.map +0 -7
  170. package/dist/lib/neutral/open-SNMZXXYO.mjs +0 -25
  171. package/dist/lib/neutral/open-SNMZXXYO.mjs.map +0 -7
  172. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs +0 -13
  173. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs.map +0 -7
  174. package/dist/lib/neutral/operations/index.mjs +0 -8
  175. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  176. package/dist/lib/neutral/pipeline-status-XMWMAUJY.mjs +0 -17
  177. package/dist/lib/neutral/pipeline-status-XMWMAUJY.mjs.map +0 -7
  178. package/dist/lib/neutral/plugin.mjs +0 -16
  179. package/dist/lib/neutral/plugin.mjs.map +0 -7
  180. package/dist/lib/neutral/react-surface-YMZRO242.mjs +0 -26
  181. package/dist/lib/neutral/react-surface-YMZRO242.mjs.map +0 -7
  182. package/dist/lib/neutral/recording-session-IADO7ATU.mjs +0 -15
  183. package/dist/lib/neutral/recording-session-IADO7ATU.mjs.map +0 -7
  184. package/dist/lib/neutral/settings-7KE4MABW.mjs +0 -31
  185. package/dist/lib/neutral/settings-7KE4MABW.mjs.map +0 -7
  186. package/dist/lib/neutral/skill-definition-DXNK324V.mjs +0 -15
  187. package/dist/lib/neutral/skill-definition-DXNK324V.mjs.map +0 -7
  188. package/dist/lib/neutral/skills/index.mjs +0 -8
  189. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  190. package/dist/lib/neutral/summarize-LBUZTOTH.mjs.map +0 -7
  191. package/dist/lib/neutral/text-content-NOWR642C.mjs +0 -30
  192. package/dist/lib/neutral/text-content-NOWR642C.mjs.map +0 -7
  193. package/dist/lib/neutral/transcriber-6XZHUUHK.mjs +0 -174
  194. package/dist/lib/neutral/transcriber-6XZHUUHK.mjs.map +0 -7
  195. package/dist/lib/neutral/transcription-driver-DN6ELQXZ.mjs +0 -207
  196. package/dist/lib/neutral/transcription-driver-DN6ELQXZ.mjs.map +0 -7
  197. package/dist/lib/neutral/translations.mjs +0 -31
  198. package/dist/lib/neutral/translations.mjs.map +0 -7
  199. package/dist/lib/neutral/types/index.mjs +0 -12
  200. package/dist/lib/neutral/types/index.mjs.map +0 -7
@@ -1,15 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/skill-definition.ts
4
- import * as Effect from "effect/Effect";
5
- import { Capability } from "@dxos/app-framework";
6
- import { AppCapabilities } from "@dxos/app-toolkit";
7
- import { TranscriptionSkill } from "#skills";
8
- var skillDefinition = () => Effect.succeed([
9
- Capability.contributes(AppCapabilities.SkillDefinition, TranscriptionSkill)
10
- ]);
11
- var skill_definition_default = skillDefinition;
12
- export {
13
- skill_definition_default as default
14
- };
15
- //# sourceMappingURL=skill-definition-DXNK324V.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/skill-definition.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n\nimport { TranscriptionSkill } from '#skills';\n\nconst skillDefinition = () =>\n Effect.succeed([Capability.contributes(AppCapabilities.SkillDefinition, TranscriptionSkill)]);\n\nexport default skillDefinition;\n"],
5
- "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAEhC,SAASC,0BAA0B;AAEnC,IAAMC,kBAAkB,MACfC,eAAQ;EAACJ,WAAWK,YAAYJ,gBAAgBK,iBAAiBJ,kBAAAA;CAAoB;AAE9F,IAAA,2BAAeC;",
6
- "names": ["Effect", "Capability", "AppCapabilities", "TranscriptionSkill", "skillDefinition", "succeed", "contributes", "SkillDefinition"]
7
- }
@@ -1,8 +0,0 @@
1
- import {
2
- transcription_skill_default
3
- } from "../chunk-KOXLGGSL.mjs";
4
- import "../chunk-J5LGTIGS.mjs";
5
- export {
6
- transcription_skill_default as TranscriptionSkill
7
- };
8
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/operations/summarize.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { AiService, ConsolePrinter, ToolExecutionService, ToolResolverService } from '@dxos/ai';\nimport { AiRequest, GenerationObserver } from '@dxos/assistant';\nimport { Operation, Trace } from '@dxos/compute';\nimport { Database } from '@dxos/echo';\nimport { registryLayerNoop } from '@dxos/echo/testing';\nimport { trim } from '@dxos/util';\n\nimport { TranscriptOperation } from '../types';\n\n/**\n * Summarize a transcript of a meeting.\n */\nconst handler: Operation.WithHandler<typeof TranscriptOperation.Summarize> = TranscriptOperation.Summarize.pipe(\n Operation.withHandler(\n Effect.fnUntraced(\n function* ({ transcript, notes }) {\n const result = yield* new AiRequest.Request({\n observer: GenerationObserver.fromPrinter(new ConsolePrinter({ tag: 'summarize' })),\n }).run({\n prompt: `Transcript: ${transcript}\\n\\nNotes: ${notes}`,\n history: [],\n system: systemPrompt,\n });\n\n const summary = Function.pipe(\n result,\n Array.findLast((msg) => msg.sender.role === 'assistant' && msg.blocks.some((block) => block._tag === 'text')),\n Option.flatMap((msg) =>\n Function.pipe(\n msg.blocks,\n Array.findLast((block) => block._tag === 'text'),\n Option.map((block) => block.text),\n ),\n ),\n Option.getOrThrowWith(() => new Error('No summary found')),\n );\n\n return { summary };\n },\n Effect.provide(\n Layer.mergeAll(\n AiService.model('com.anthropic.model.claude-sonnet-4-6.default'),\n ToolResolverService.layerEmpty,\n ToolExecutionService.layerEmpty,\n Trace.writerLayerNoop,\n Database.notAvailable,\n Layer.succeed(Operation.Service, {\n invoke: () => Effect.die('Not available.'),\n schedule: () => Effect.die('Not available.'),\n invokePromise: async () => ({ error: new Error('Not available.') }),\n } as any),\n registryLayerNoop,\n ),\n ),\n ),\n ),\n);\n\nexport default handler;\n\nconst systemPrompt = trim`\n You are a helpful assistant that summarizes transcripts of meetings.\n\n # Goal\n Create a markdown summary of the meeting transcript with text notes provided.\n Notes are very important so make sure to include them in the summary if they contain meaningful information.\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"],
5
- "mappings": ";;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,cAAc;AAC1B,YAAYC,WAAW;AACvB,YAAYC,YAAY;AAExB,SAASC,WAAWC,gBAAgBC,sBAAsBC,2BAA2B;AACrF,SAASC,WAAWC,0BAA0B;AAC9C,SAASC,WAAWC,aAAa;AACjC,SAASC,gBAAgB;AACzB,SAASC,yBAAyB;AAClC,SAASC,YAAY;AAOrB,IAAMC,UAAuEC,4BAAoBC,UAAUC,KACzGC,UAAUC,YACDC,kBACL,WAAW,EAAEC,YAAYC,MAAK,GAAE;AAC9B,QAAMC,SAAS,OAAO,IAAIC,UAAUC,QAAQ;IAC1CC,UAAUC,mBAAmBC,YAAY,IAAIC,eAAe;MAAEC,KAAK;IAAY,CAAA,CAAA;EACjF,CAAA,EAAGC,IAAI;IACLC,QAAQ,eAAeX,UAAAA;;SAAwBC,KAAAA;IAC/CW,SAAS,CAAA;IACTC,QAAQC;EACV,CAAA;AAEA,QAAMC,UAAmBnB,cACvBM,QACMc,eAAS,CAACC,QAAQA,IAAIC,OAAOC,SAAS,eAAeF,IAAIG,OAAOC,KAAK,CAACC,UAAUA,MAAMC,SAAS,MAAA,CAAA,GAC9FC,eAAQ,CAACP,QACLrB,cACPqB,IAAIG,QACEJ,eAAS,CAACM,UAAUA,MAAMC,SAAS,MAAA,GAClCE,WAAI,CAACH,UAAUA,MAAMI,IAAI,CAAA,CAAA,GAG7BC,sBAAe,MAAM,IAAIC,MAAM,kBAAA,CAAA,CAAA;AAGxC,SAAO;IAAEb;EAAQ;AACnB,GACOc,eACCC,eACJC,UAAUC,MAAM,+CAAA,GAChBC,oBAAoBC,YACpBC,qBAAqBD,YACrBE,MAAMC,iBACNC,SAASC,cACHC,cAAQ3C,UAAU4C,SAAS;EAC/BC,QAAQ,MAAaC,WAAI,gBAAA;EACzBC,UAAU,MAAaD,WAAI,gBAAA;EAC3BE,eAAe,aAAa;IAAEC,OAAO,IAAIlB,MAAM,gBAAA;EAAkB;AACnE,CAAA,GACAmB,iBAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAOV,IAAA,oBAAetD;AAEf,IAAMqB,eAAekC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
6
- "names": ["Array", "Effect", "Function", "Layer", "Option", "AiService", "ConsolePrinter", "ToolExecutionService", "ToolResolverService", "AiRequest", "GenerationObserver", "Operation", "Trace", "Database", "registryLayerNoop", "trim", "handler", "TranscriptOperation", "Summarize", "pipe", "Operation", "withHandler", "fnUntraced", "transcript", "notes", "result", "AiRequest", "Request", "observer", "GenerationObserver", "fromPrinter", "ConsolePrinter", "tag", "run", "prompt", "history", "system", "systemPrompt", "summary", "findLast", "msg", "sender", "role", "blocks", "some", "block", "_tag", "flatMap", "map", "text", "getOrThrowWith", "Error", "provide", "mergeAll", "AiService", "model", "ToolResolverService", "layerEmpty", "ToolExecutionService", "Trace", "writerLayerNoop", "Database", "notAvailable", "succeed", "Service", "invoke", "die", "schedule", "invokePromise", "error", "registryLayerNoop", "trim"]
7
- }
@@ -1,30 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/text-content.ts
4
- import * as Effect from "effect/Effect";
5
- import { Capability } from "@dxos/app-framework";
6
- import { AppCapabilities } from "@dxos/app-toolkit";
7
- import { Feed, Filter, Obj, Query, Scope, Type } from "@dxos/echo";
8
- import { getSpace } from "@dxos/react-client/echo";
9
- import { renderByline } from "@dxos/react-ui-transcription";
10
- import { Message, Transcript } from "@dxos/types";
11
- var text_content_default = Capability.makeModule(Effect.fnUntraced(function* () {
12
- return Capability.contributes(AppCapabilities.TextContent, {
13
- id: Type.getTypename(Transcript.Transcript),
14
- getTextContent: async (transcript) => {
15
- const space = getSpace(transcript);
16
- const members = space?.members.get().map((member) => member.identity) ?? [];
17
- const feed = await transcript.feed.load();
18
- const feedDXN = feed ? Feed.getQueueUri(feed) : void 0;
19
- if (!space || !feedDXN) {
20
- return void 0;
21
- }
22
- const messages = await space.db.query(Query.select(Filter.type(Message.Message)).from(Scope.feed(feedDXN))).run();
23
- return messages.filter((message) => Obj.instanceOf(Message.Message, message)).flatMap((message, index) => renderByline(members)(message, index)).join("\n\n");
24
- }
25
- });
26
- }));
27
- export {
28
- text_content_default as default
29
- };
30
- //# sourceMappingURL=text-content-NOWR642C.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/text-content.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Feed, Filter, Obj, Query, Scope, Type } from '@dxos/echo';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { renderByline } from '@dxos/react-ui-transcription';\nimport { Message, Transcript } from '@dxos/types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(AppCapabilities.TextContent, {\n id: Type.getTypename(Transcript.Transcript),\n getTextContent: async (transcript: Transcript.Transcript) => {\n const space = getSpace(transcript);\n const members = space?.members.get().map((member) => member.identity) ?? [];\n const feed = await transcript.feed.load();\n const feedDXN = feed ? Feed.getQueueUri(feed) : undefined;\n if (!space || !feedDXN) {\n return undefined;\n }\n const messages = await space.db\n .query(Query.select(Filter.type(Message.Message)).from(Scope.feed(feedDXN)))\n .run();\n return messages\n .filter((message) => Obj.instanceOf(Message.Message, message))\n .flatMap((message, index) => renderByline(members)(message, index))\n .join('\\n\\n');\n },\n });\n }),\n);\n"],
5
- "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,MAAMC,QAAQC,KAAKC,OAAOC,OAAOC,YAAY;AACtD,SAASC,gBAAgB;AACzB,SAASC,oBAAoB;AAC7B,SAASC,SAASC,kBAAkB;AAEpC,IAAA,uBAAeX,WAAWY,WACjBC,kBAAW,aAAA;AAChB,SAAOb,WAAWc,YAAYb,gBAAgBc,aAAa;IACzDC,IAAIT,KAAKU,YAAYN,WAAWA,UAAU;IAC1CO,gBAAgB,OAAOC,eAAAA;AACrB,YAAMC,QAAQZ,SAASW,UAAAA;AACvB,YAAME,UAAUD,OAAOC,QAAQC,IAAAA,EAAMC,IAAI,CAACC,WAAWA,OAAOC,QAAQ,KAAK,CAAA;AACzE,YAAMC,OAAO,MAAMP,WAAWO,KAAKC,KAAI;AACvC,YAAMC,UAAUF,OAAOxB,KAAK2B,YAAYH,IAAAA,IAAQI;AAChD,UAAI,CAACV,SAAS,CAACQ,SAAS;AACtB,eAAOE;MACT;AACA,YAAMC,WAAW,MAAMX,MAAMY,GAC1BC,MAAM5B,MAAM6B,OAAO/B,OAAOgC,KAAKzB,QAAQA,OAAO,CAAA,EAAG0B,KAAK9B,MAAMoB,KAAKE,OAAAA,CAAAA,CAAAA,EACjES,IAAG;AACN,aAAON,SACJO,OAAO,CAACC,YAAYnC,IAAIoC,WAAW9B,QAAQA,SAAS6B,OAAAA,CAAAA,EACpDE,QAAQ,CAACF,SAASG,UAAUjC,aAAaY,OAAAA,EAASkB,SAASG,KAAAA,CAAAA,EAC3DC,KAAK,MAAA;IACV;EACF,CAAA;AACF,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "AppCapabilities", "Feed", "Filter", "Obj", "Query", "Scope", "Type", "getSpace", "renderByline", "Message", "Transcript", "makeModule", "fnUntraced", "contributes", "TextContent", "id", "getTypename", "getTextContent", "transcript", "space", "members", "get", "map", "member", "identity", "feed", "load", "feedDXN", "getQueueUri", "undefined", "messages", "db", "query", "select", "type", "from", "run", "filter", "message", "instanceOf", "flatMap", "index", "join"]
7
- }
@@ -1,174 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/transcriber.ts
4
- import * as Effect2 from "effect/Effect";
5
- import { Capabilities, Capability } from "@dxos/app-framework";
6
- import { ClientCapabilities } from "@dxos/plugin-client";
7
- import { TranscriptionCapabilities } from "#types";
8
-
9
- // src/transcription-manager.ts
10
- import { Atom } from "@effect-atom/atom-react";
11
- import * as Effect from "effect/Effect";
12
- import { synchronized } from "@dxos/async";
13
- import { Resource } from "@dxos/context";
14
- import { Database, Feed, Obj } from "@dxos/echo";
15
- import { EffectEx } from "@dxos/effect";
16
- import { MediaStreamRecorder } from "@dxos/react-ui-transcription";
17
- import { Transcriber } from "@dxos/transcription-pipeline";
18
- import { Message } from "@dxos/types";
19
- function _ts_decorate(decorators, target, key, desc) {
20
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
21
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
22
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
23
- return c > 3 && r && Object.defineProperty(target, key, r), r;
24
- }
25
- var RECORD_INTERVAL = 200;
26
- var PREFIXED_CHUNKS_AMOUNT = 10;
27
- var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
28
- var TranscriptionManagerImpl = class extends Resource {
29
- _edgeClient;
30
- _messageEnricher;
31
- _registry;
32
- _audioStreamTrack = void 0;
33
- _identityDid = void 0;
34
- _mediaRecorder = void 0;
35
- _transcriber = void 0;
36
- _feed = void 0;
37
- _feedServiceLayer = void 0;
38
- _enabledAtom = Atom.make(false);
39
- constructor(options) {
40
- super();
41
- this._edgeClient = options.edgeClient;
42
- this._messageEnricher = options.messageEnricher;
43
- this._registry = options.registry;
44
- }
45
- get enabled() {
46
- return this._enabledAtom;
47
- }
48
- getEnabled() {
49
- return this._registry.get(this._enabledAtom);
50
- }
51
- setFeed(space, feed) {
52
- this._feed = feed;
53
- this._feedServiceLayer = Database.layer(space.db);
54
- return this;
55
- }
56
- setIdentityDid(did) {
57
- if (this._identityDid !== did) {
58
- this._identityDid = did;
59
- }
60
- return this;
61
- }
62
- setRecording(recording) {
63
- if (!this.isOpen || !this.getEnabled()) {
64
- return this;
65
- }
66
- if (recording) {
67
- this._transcriber?.startChunksRecording();
68
- } else {
69
- this._transcriber?.stopChunksRecording();
70
- }
71
- return this;
72
- }
73
- async setEnabled(enabled) {
74
- if (this.getEnabled() === enabled) {
75
- return;
76
- }
77
- this._registry.set(this._enabledAtom, enabled ?? false);
78
- if (enabled) {
79
- await this._maybeRestartTranscriber();
80
- } else {
81
- await this._stopTranscriber();
82
- }
83
- }
84
- async setAudioTrack(track) {
85
- if (this._audioStreamTrack === track) {
86
- return;
87
- }
88
- this._audioStreamTrack = track;
89
- await this._maybeRestartTranscriber();
90
- }
91
- async _open() {
92
- await this._maybeRestartTranscriber();
93
- }
94
- async _close() {
95
- await this._stopTranscriber();
96
- }
97
- async _maybeRestartTranscriber() {
98
- if (!this._audioStreamTrack || !this.getEnabled() || !this.isOpen) {
99
- return;
100
- }
101
- let needReinit = false;
102
- if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {
103
- this._mediaRecorder = new MediaStreamRecorder({
104
- mediaStreamTrack: this._audioStreamTrack,
105
- config: {
106
- interval: RECORD_INTERVAL
107
- }
108
- });
109
- needReinit = true;
110
- }
111
- if (needReinit) {
112
- await this._transcriber?.close();
113
- this._transcriber = new Transcriber({
114
- config: {
115
- transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,
116
- prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT
117
- },
118
- recorder: this._mediaRecorder,
119
- onSegments: (segments) => this._onSegments(segments)
120
- });
121
- await this._transcriber?.open();
122
- }
123
- }
124
- async _stopTranscriber() {
125
- await this._transcriber?.close();
126
- }
127
- async _onSegments(segments) {
128
- if (!this.isOpen || !this._feed || !this._feedServiceLayer) {
129
- return;
130
- }
131
- let block = Obj.make(Message.Message, {
132
- created: (/* @__PURE__ */ new Date()).toISOString(),
133
- blocks: segments,
134
- sender: {
135
- identityDid: this._identityDid
136
- }
137
- });
138
- if (this._messageEnricher) {
139
- block = await this._messageEnricher(block);
140
- }
141
- await Feed.append(this._feed, [
142
- block
143
- ]).pipe(Effect.provide(this._feedServiceLayer), EffectEx.runAndForwardErrors);
144
- }
145
- };
146
- _ts_decorate([
147
- synchronized
148
- ], TranscriptionManagerImpl.prototype, "setAudioTrack", null);
149
-
150
- // src/capabilities/transcriber.ts
151
- var transcriber_default = Capability.makeModule(Effect2.fnUntraced(function* () {
152
- const capabilities = yield* Capability.Service;
153
- const registry = yield* Capability.get(Capabilities.AtomRegistry);
154
- const transcriptionManagerProvider = ({ messageEnricher }) => {
155
- const client = capabilities.get(ClientCapabilities.Client);
156
- const transcriptionManager = new TranscriptionManagerImpl({
157
- edgeClient: client.edge.http,
158
- messageEnricher,
159
- registry
160
- });
161
- const identity = client.halo.identity.get();
162
- if (identity) {
163
- transcriptionManager.setIdentityDid(identity.did);
164
- }
165
- return transcriptionManager;
166
- };
167
- return [
168
- Capability.contributes(TranscriptionCapabilities.TranscriptionManagerProvider, transcriptionManagerProvider)
169
- ];
170
- }));
171
- export {
172
- transcriber_default as default
173
- };
174
- //# sourceMappingURL=transcriber-6XZHUUHK.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/transcriber.ts", "../../../src/transcription-manager.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { TranscriptionCapabilities } from '#types';\n\nimport { TranscriptionManagerImpl } from '../transcription-manager';\n\n/**\n * Provides the higher-level transcription manager to the app-framework so other plugins can obtain it\n * via DI. The low-level construction lives in `@dxos/react-ui-transcription`; this module is the\n * provision seam.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n // Get context for lazy capability access in callbacks.\n const capabilities = yield* Capability.Service;\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n\n const transcriptionManagerProvider: TranscriptionCapabilities.TranscriptionManagerProvider = ({\n messageEnricher,\n }) => {\n const client = capabilities.get(ClientCapabilities.Client);\n const transcriptionManager = new TranscriptionManagerImpl({\n edgeClient: client.edge.http,\n messageEnricher,\n registry,\n });\n\n const identity = client.halo.identity.get();\n if (identity) {\n transcriptionManager.setIdentityDid(identity.did);\n }\n\n return transcriptionManager;\n };\n\n return [\n Capability.contributes(TranscriptionCapabilities.TranscriptionManagerProvider, transcriptionManagerProvider),\n ];\n }),\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { synchronized } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { Resource } from '@dxos/context';\nimport { Database, Feed, Obj } from '@dxos/echo';\nimport { EffectEx } from '@dxos/effect';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { MediaStreamRecorder } from '@dxos/react-ui-transcription';\nimport { Transcriber } from '@dxos/transcription-pipeline';\nimport { type ContentBlock, Message } from '@dxos/types';\n\nimport { type TranscriptionCapabilities } from '#types';\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 TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n registry: Registry.Registry;\n\n /**\n * Enrich the message before it is written to the transcription feed.\n */\n messageEnricher?: TranscriptionCapabilities.TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting. Concrete implementation of the\n * {@link TranscriptionCapabilities.TranscriptionManager} service contract; consumers depend on the\n * interface (via the `TranscriptionManagerProvider` capability), not this class.\n */\nexport class TranscriptionManagerImpl extends Resource implements TranscriptionCapabilities.TranscriptionManager {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptionCapabilities.TranscriptMessageEnricher;\n private readonly _registry: Registry.Registry;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _feed?: Feed.Feed = undefined;\n private _feedServiceLayer?: Layer.Layer<Database.Service> = undefined;\n private _enabledAtom = Atom.make(false);\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n this._registry = options.registry;\n }\n\n get enabled(): Atom.Atom<boolean> {\n return this._enabledAtom;\n }\n\n getEnabled(): boolean {\n return this._registry.get(this._enabledAtom);\n }\n\n setFeed(space: Space, feed: Feed.Feed): this {\n this._feed = feed;\n this._feedServiceLayer = Database.layer(space.db);\n return this;\n }\n\n setIdentityDid(did: string): this {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): this {\n if (!this.isOpen || !this.getEnabled()) {\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 async setEnabled(enabled: boolean): Promise<void> {\n if (this.getEnabled() === enabled) {\n return;\n }\n\n this._registry.set(this._enabledAtom, enabled ?? false);\n if (enabled) {\n await this._maybeRestartTranscriber();\n } else {\n await this._stopTranscriber();\n }\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack): Promise<void> {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n await this._maybeRestartTranscriber();\n }\n\n protected override async _open(): Promise<void> {\n await this._maybeRestartTranscriber();\n }\n\n protected override async _close(): Promise<void> {\n await this._stopTranscriber();\n }\n\n private async _maybeRestartTranscriber(): Promise<void> {\n if (!this._audioStreamTrack || !this.getEnabled() || !this.isOpen) {\n return;\n }\n\n // Reinitialize transcriber if feed 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 config: { 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 await this._transcriber?.open();\n }\n }\n\n private async _stopTranscriber(): Promise<void> {\n await this._transcriber?.close();\n }\n\n private async _onSegments(segments: ContentBlock.Transcript[]): Promise<void> {\n if (!this.isOpen || !this._feed || !this._feedServiceLayer) {\n return;\n }\n\n let block = Obj.make(Message.Message, {\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 await Feed.append(this._feed, [block]).pipe(Effect.provide(this._feedServiceLayer), EffectEx.runAndForwardErrors);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "Capabilities", "Capability", "ClientCapabilities", "TranscriptionCapabilities", "Atom", "Effect", "synchronized", "Resource", "Database", "Feed", "Obj", "EffectEx", "MediaStreamRecorder", "Transcriber", "Message", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManagerImpl", "_edgeClient", "_messageEnricher", "_registry", "_audioStreamTrack", "undefined", "_identityDid", "_mediaRecorder", "_transcriber", "_feed", "_feedServiceLayer", "_enabledAtom", "make", "options", "edgeClient", "messageEnricher", "registry", "enabled", "getEnabled", "get", "setFeed", "space", "feed", "layer", "db", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "startChunksRecording", "stopChunksRecording", "setEnabled", "set", "_maybeRestartTranscriber", "_stopTranscriber", "setAudioTrack", "track", "_open", "_close", "needReinit", "mediaStreamTrack", "config", "interval", "close", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "onSegments", "segments", "_onSegments", "open", "block", "created", "Date", "toISOString", "blocks", "sender", "identityDid", "append", "pipe", "provide", "runAndForwardErrors", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "registry", "get", "Capabilities", "AtomRegistry", "transcriptionManagerProvider", "messageEnricher", "client", "ClientCapabilities", "Client", "transcriptionManager", "TranscriptionManagerImpl", "edgeClient", "edge", "http", "identity", "halo", "setIdentityDid", "did", "contributes", "TranscriptionCapabilities", "TranscriptionManagerProvider"]
7
- }
@@ -1,207 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/capabilities/transcription-driver.tsx
4
- import * as Effect from "effect/Effect";
5
- import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from "react";
6
- import { Capabilities, Capability } from "@dxos/app-framework";
7
- import { useAtomCapability, useAtomCapabilityState, useCapabilities } from "@dxos/app-framework/ui";
8
- import { log } from "@dxos/log";
9
- import { MarkdownCapabilities } from "@dxos/plugin-markdown/types";
10
- import { useAudioTrack, useTranscriber } from "@dxos/react-ui-transcription";
11
- import { linkEntities } from "@dxos/transcription-pipeline";
12
- import { PendingTextStreamer, cancelPendingText, editorPendingTextSink, pendingTextState } from "@dxos/ui-editor";
13
- import { meta } from "#meta";
14
- import { TranscriptionCapabilities } from "#types";
15
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/capabilities/transcription-driver.tsx";
16
- var RECORDER_INTERVAL_MS = 200;
17
- var TranscriptionDriver = () => {
18
- const [session, setSession] = useAtomCapabilityState(TranscriptionCapabilities.RecordingSession);
19
- const [editorViews] = useCapabilities(MarkdownCapabilities.EditorViews);
20
- const [lookup] = useCapabilities(TranscriptionCapabilities.EntityLookup);
21
- const settings = useAtomCapability(TranscriptionCapabilities.Settings);
22
- const [, setStatus] = useAtomCapabilityState(TranscriptionCapabilities.PipelineStatus);
23
- const recording = session?.recording ?? false;
24
- const liveSessionId = session?.id;
25
- const hasEditorForSession = !!(liveSessionId && editorViews?.get(liveSessionId));
26
- const [phase, setPhase] = useState("idle");
27
- const active = phase !== "idle";
28
- const [sessionId, setSessionId] = useState();
29
- useEffect(() => {
30
- if (recording && liveSessionId && hasEditorForSession) {
31
- setSessionId(liveSessionId);
32
- }
33
- }, [
34
- recording,
35
- liveSessionId,
36
- hasEditorForSession
37
- ]);
38
- useEffect(() => {
39
- setPhase((current) => recording && hasEditorForSession ? "recording" : current === "recording" ? "draining" : current);
40
- }, [
41
- recording,
42
- hasEditorForSession
43
- ]);
44
- useEffect(() => {
45
- if (phase === "idle") {
46
- setSessionId(void 0);
47
- }
48
- }, [
49
- phase
50
- ]);
51
- useEffect(() => {
52
- setStatus(() => ({
53
- phase
54
- }));
55
- }, [
56
- phase,
57
- setStatus
58
- ]);
59
- const audioConstraints = useMemo(() => settings?.audioDeviceId ? {
60
- deviceId: {
61
- ideal: settings.audioDeviceId
62
- }
63
- } : void 0, [
64
- settings?.audioDeviceId
65
- ]);
66
- const track = useAudioTrack(active, audioConstraints);
67
- const sessionIdRef = useRef(sessionId);
68
- sessionIdRef.current = sessionId;
69
- const editorViewsRef = useRef(editorViews);
70
- editorViewsRef.current = editorViews;
71
- const isCancelled = useCallback(() => {
72
- const id = sessionIdRef.current;
73
- const view = id ? editorViewsRef.current?.get(id)?.view : void 0;
74
- return view ? view.state.field(pendingTextState, false) == null : false;
75
- }, []);
76
- const streamerRef = useRef(null);
77
- useEffect(() => {
78
- if (!active || !editorViews || !sessionId) {
79
- return;
80
- }
81
- const entry = editorViews.get(sessionId);
82
- if (!entry) {
83
- return;
84
- }
85
- const entityExtraction = settings?.entityExtraction !== false;
86
- const streamer = new PendingTextStreamer(editorPendingTextSink(entry.view), {
87
- mode: settings?.streamMode ?? "word",
88
- wordIntervalMs: settings?.wordIntervalMs ?? 80,
89
- postProcess: entityExtraction && lookup ? (text) => linkEntities(text, lookup) : void 0
90
- });
91
- streamer.start({
92
- anchor: entry.view.state.selection.main.head,
93
- placeholder: "Recording\u2026"
94
- });
95
- streamerRef.current = streamer;
96
- return () => {
97
- streamer.dispose();
98
- streamerRef.current = null;
99
- const current = editorViews.get(sessionId);
100
- const pending = current?.view.state.field(pendingTextState, false);
101
- if (current && pending && pending.final.length === 0) {
102
- current.view.dispatch({
103
- effects: cancelPendingText.of()
104
- });
105
- }
106
- };
107
- }, [
108
- active,
109
- sessionId,
110
- editorViews,
111
- lookup,
112
- settings?.streamMode,
113
- settings?.wordIntervalMs,
114
- settings?.entityExtraction
115
- ]);
116
- const handleSegments = useCallback(async (segments) => {
117
- const text = segments.map((segment) => segment.text).join(" ").trim();
118
- if (text.length > 0 && !isCancelled()) {
119
- streamerRef.current?.push(text);
120
- }
121
- }, [
122
- isCancelled
123
- ]);
124
- const transcriberConfig = useMemo(() => ({
125
- transcribeAfterChunksAmount: Math.max(1, Math.round((settings?.transcribeAfterMs ?? 4e3) / RECORDER_INTERVAL_MS))
126
- }), [
127
- settings?.transcribeAfterMs
128
- ]);
129
- const recorderConfig = useMemo(() => ({
130
- interval: RECORDER_INTERVAL_MS
131
- }), []);
132
- const transcriber = useTranscriber({
133
- audioStreamTrack: track,
134
- onSegments: handleSegments,
135
- transcriberConfig,
136
- recorderConfig
137
- });
138
- const transcriberRef = useRef(transcriber);
139
- transcriberRef.current = transcriber;
140
- useEffect(() => {
141
- if (!transcriber) {
142
- return;
143
- }
144
- let cancelled = false;
145
- void transcriber.open().then(() => {
146
- if (!cancelled && phase === "recording") {
147
- transcriber.startChunksRecording();
148
- }
149
- }, (err) => {
150
- if (!cancelled) {
151
- log.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 187, S: void 0 });
152
- setSession(() => null);
153
- }
154
- });
155
- return () => {
156
- cancelled = true;
157
- };
158
- }, [
159
- transcriber,
160
- phase,
161
- setSession
162
- ]);
163
- useEffect(() => {
164
- if (phase !== "draining") {
165
- return;
166
- }
167
- let cancelled = false;
168
- const abortTimer = setInterval(() => {
169
- if (isCancelled()) {
170
- transcriberRef.current?.abort();
171
- }
172
- }, 150);
173
- void (async () => {
174
- try {
175
- await transcriberRef.current?.flush();
176
- if (!isCancelled()) {
177
- await streamerRef.current?.flush();
178
- }
179
- } catch (err) {
180
- log.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 221, S: void 0 });
181
- } finally {
182
- clearInterval(abortTimer);
183
- if (!cancelled) {
184
- setPhase((current) => current === "draining" ? "idle" : current);
185
- }
186
- }
187
- })();
188
- return () => {
189
- cancelled = true;
190
- clearInterval(abortTimer);
191
- };
192
- }, [
193
- phase,
194
- isCancelled
195
- ]);
196
- return null;
197
- };
198
- var transcription_driver_default = Capability.makeModule(Effect.fnUntraced(function* () {
199
- return Capability.contributes(Capabilities.ReactContext, {
200
- id: meta.profile.key,
201
- context: ({ children }) => /* @__PURE__ */ React.createElement(Fragment, null, children, /* @__PURE__ */ React.createElement(TranscriptionDriver, null))
202
- });
203
- }));
204
- export {
205
- transcription_driver_default as default
206
- };
207
- //# sourceMappingURL=transcription-driver-DN6ELQXZ.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/transcription-driver.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { useAtomCapability, useAtomCapabilityState, useCapabilities } from '@dxos/app-framework/ui';\nimport { log } from '@dxos/log';\nimport { MarkdownCapabilities } from '@dxos/plugin-markdown/types';\nimport { useAudioTrack, useTranscriber } from '@dxos/react-ui-transcription';\nimport { linkEntities } from '@dxos/transcription-pipeline';\nimport { type ContentBlock } from '@dxos/types';\nimport { PendingTextStreamer, cancelPendingText, editorPendingTextSink, pendingTextState } from '@dxos/ui-editor';\n\nimport { meta } from '#meta';\nimport { TranscriptionCapabilities } from '#types';\n\n// Recorder chunk interval; the transcriber's chunk threshold is derived from the buffering setting.\nconst RECORDER_INTERVAL_MS = 200;\n\n/**\n * Headless controller driving live transcription into a Markdown editor. Reads the active recording\n * session, captures audio while recording, and dispatches the transcribed text into the target\n * editor as pending-text effects. The user confirms or discards the pending text via the editor's\n * inline affordances. Mounted once, app-wide, via `Capabilities.ReactContext`.\n */\nconst TranscriptionDriver = () => {\n const [session, setSession] = useAtomCapabilityState(TranscriptionCapabilities.RecordingSession);\n // `useCapabilities` (not `useCapability`) so the driver does not throw when plugin-markdown is absent.\n const [editorViews] = useCapabilities(MarkdownCapabilities.EditorViews);\n // Injected entity resolver (full-text/vector/…); the driver stays decoupled from the database.\n const [lookup] = useCapabilities(TranscriptionCapabilities.EntityLookup);\n const settings = useAtomCapability(TranscriptionCapabilities.Settings);\n\n const [, setStatus] = useAtomCapabilityState(TranscriptionCapabilities.PipelineStatus);\n\n const recording = session?.recording ?? false;\n const liveSessionId = session?.id;\n\n // Only this driver's editor-backed sessions are captured here: if no editor view is registered for\n // the session there is nowhere to stream transcription, so the driver stays idle and leaves the\n // mic to whoever owns that session (e.g. a non-editor consumer running its own transcriber).\n const hasEditorForSession = !!(liveSessionId && editorViews?.get(liveSessionId));\n\n // Lifecycle phase. Driven from `recording` via an effect (not derived synchronously) so that when\n // the mic switches off the phase is still 'recording' for that commit — nothing tears down until\n // the drain finishes and sets 'idle'. This lets the final transcription + enrichment complete.\n const [phase, setPhase] = useState<'idle' | 'recording' | 'draining'>('idle');\n const active = phase !== 'idle';\n\n // The toolbar clears the RecordingSession on stop, but the driver must keep targeting the same\n // editor through the drain — capture the session id for the lifetime of the active phase (the\n // editor stays open). Cleared once the phase returns to idle.\n const [sessionId, setSessionId] = useState<string>();\n useEffect(() => {\n if (recording && liveSessionId && hasEditorForSession) {\n setSessionId(liveSessionId);\n }\n }, [recording, liveSessionId, hasEditorForSession]);\n\n useEffect(() => {\n setPhase((current) =>\n recording && hasEditorForSession ? 'recording' : current === 'recording' ? 'draining' : current,\n );\n }, [recording, hasEditorForSession]);\n\n useEffect(() => {\n if (phase === 'idle') {\n setSessionId(undefined);\n }\n }, [phase]);\n\n // Publish the phase so the toolbar / testbench can reflect mic + pipeline state in real time.\n useEffect(() => {\n setStatus(() => ({ phase }));\n }, [phase, setStatus]);\n\n // `ideal` (not `exact`) so an unavailable device falls back to the default rather than failing.\n const audioConstraints = useMemo<MediaTrackConstraints | undefined>(\n () => (settings?.audioDeviceId ? { deviceId: { ideal: settings.audioDeviceId } } : undefined),\n [settings?.audioDeviceId],\n );\n\n // Keep the track (and thus the transcriber) alive across the whole active session — including the\n // drain — so the transcriber can flush its buffered audio before teardown. Released at idle. The\n // mic indicator therefore lingers for the brief drain after stop.\n const track = useAudioTrack(active, audioConstraints);\n\n // Refs so `handleSegments` stays stable (changing it would recreate the transcriber).\n const sessionIdRef = useRef(sessionId);\n sessionIdRef.current = sessionId;\n const editorViewsRef = useRef(editorViews);\n editorViewsRef.current = editorViews;\n\n // The user cancelled (✕) if the pending decoration was cleared mid-session; guards against\n // resurrecting it with late transcription / post-process writes during the drain.\n const isCancelled = useCallback(() => {\n const id = sessionIdRef.current;\n const view = id ? editorViewsRef.current?.get(id)?.view : undefined;\n return view ? view.state.field(pendingTextState, false) == null : false;\n }, []);\n\n // Streams transcribed text into the editor's pending-text block (buffering + word-by-word reveal).\n // Kept alive across the whole session (incl. drain); disposed only when the phase returns to idle.\n const streamerRef = useRef<PendingTextStreamer | null>(null);\n\n useEffect(() => {\n if (!active || !editorViews || !sessionId) {\n return;\n }\n const entry = editorViews.get(sessionId);\n if (!entry) {\n return;\n }\n\n // Clicking the toolbar blurs the editor and hides the caret, so anchor + placeholder give\n // immediate feedback while the first transcription is buffered.\n // When entity extraction is enabled and a lookup is available, rewrite settled text with inline\n // `[noun](echo:/<id>)` links — decorated as dx-anchors by the markdown editor's preview extension.\n const entityExtraction = settings?.entityExtraction !== false;\n const streamer = new PendingTextStreamer(editorPendingTextSink(entry.view), {\n mode: settings?.streamMode ?? 'word',\n wordIntervalMs: settings?.wordIntervalMs ?? 80,\n postProcess: entityExtraction && lookup ? (text) => linkEntities(text, lookup) : undefined,\n });\n streamer.start({ anchor: entry.view.state.selection.main.head, placeholder: 'Recording…' });\n streamerRef.current = streamer;\n\n return () => {\n streamer.dispose();\n streamerRef.current = null;\n // On teardown, drop the placeholder if nothing was transcribed; otherwise leave it for review.\n const current = editorViews.get(sessionId);\n const pending = current?.view.state.field(pendingTextState, false);\n if (current && pending && pending.final.length === 0) {\n current.view.dispatch({ effects: cancelPendingText.of() });\n }\n };\n }, [\n active,\n sessionId,\n editorViews,\n lookup,\n settings?.streamMode,\n settings?.wordIntervalMs,\n settings?.entityExtraction,\n ]);\n\n const handleSegments = useCallback(\n async (segments: ContentBlock.Transcript[]) => {\n const text = segments\n .map((segment) => segment.text)\n .join(' ')\n .trim();\n if (text.length > 0 && !isCancelled()) {\n streamerRef.current?.push(text);\n }\n },\n [isCancelled],\n );\n\n // Derive the transcriber's chunk threshold from the configured initial buffering time.\n const transcriberConfig = useMemo(\n () => ({\n transcribeAfterChunksAmount: Math.max(\n 1,\n Math.round((settings?.transcribeAfterMs ?? 4000) / RECORDER_INTERVAL_MS),\n ),\n }),\n [settings?.transcribeAfterMs],\n );\n\n // Stable identity: a fresh object would change useTranscriber's memo deps every render, recreating\n // (and reopening) the transcriber and discarding its buffered audio.\n const recorderConfig = useMemo(() => ({ interval: RECORDER_INTERVAL_MS }), []);\n const transcriber = useTranscriber({\n audioStreamTrack: track,\n onSegments: handleSegments,\n transcriberConfig,\n recorderConfig,\n });\n const transcriberRef = useRef(transcriber);\n transcriberRef.current = transcriber;\n\n useEffect(() => {\n if (!transcriber) {\n return;\n }\n let cancelled = false;\n // Clear the session if `open()` rejects (e.g. mic permission denied) so the toolbar does not\n // report \"stop\" forever while nothing is captured.\n void transcriber.open().then(\n () => {\n if (!cancelled && phase === 'recording') {\n transcriber.startChunksRecording();\n }\n },\n (err) => {\n if (!cancelled) {\n log.catch(err);\n setSession(() => null);\n }\n },\n );\n return () => {\n cancelled = true;\n };\n }, [transcriber, phase, setSession]);\n\n // Drain on stop: flush buffered audio (final transcription) and the streamer's post-process\n // (entity linking) before tearing down — so the tail of speech and its enrichment are not lost.\n useEffect(() => {\n if (phase !== 'draining') {\n return;\n }\n let cancelled = false;\n // Hard-abort the in-flight transcription request if the user cancels (✕) during the drain.\n const abortTimer = setInterval(() => {\n if (isCancelled()) {\n transcriberRef.current?.abort();\n }\n }, 150);\n void (async () => {\n try {\n // Flush buffered audio (final transcription) then settle the streamer's post-process, unless\n // the user cancelled (✕) — in which case skip the writes so the decoration stays cleared.\n await transcriberRef.current?.flush();\n if (!isCancelled()) {\n await streamerRef.current?.flush();\n }\n } catch (err) {\n log.catch(err);\n } finally {\n clearInterval(abortTimer);\n if (!cancelled) {\n setPhase((current) => (current === 'draining' ? 'idle' : current));\n }\n }\n })();\n return () => {\n cancelled = true;\n clearInterval(abortTimer);\n };\n }, [phase, isCancelled]);\n\n return null;\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(Capabilities.ReactContext, {\n id: meta.profile.key,\n context: ({ children }) => (\n <Fragment>\n {children}\n <TranscriptionDriver />\n </Fragment>\n ),\n });\n }),\n);\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "React", "Fragment", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Capabilities", "Capability", "useAtomCapability", "useAtomCapabilityState", "useCapabilities", "log", "MarkdownCapabilities", "useAudioTrack", "useTranscriber", "linkEntities", "PendingTextStreamer", "cancelPendingText", "editorPendingTextSink", "pendingTextState", "meta", "TranscriptionCapabilities", "editorViews", "lookup", "EntityLookup", "setStatus", "PipelineStatus", "recording", "liveSessionId", "session", "id", "hasEditorForSession", "setSessionId", "phase", "settings", "audioDeviceId", "undefined", "sessionIdRef", "sessionId", "editorViewsRef", "view", "mode", "streamMode", "wordIntervalMs", "postProcess", "entityExtraction", "streamer", "placeholder", "streamerRef", "current", "pending", "length", "effects", "active", "handleSegments", "isCancelled", "push", "text", "transcribeAfterMs", "transcriber", "audioStreamTrack", "onSegments", "transcriberConfig", "recorderConfig", "transcriberRef", "cancelled", "startChunksRecording", "err", "setSession", "abortTimer", "abort", "flush", "clearInterval", "key", "context", "children"]
7
- }
@@ -1,31 +0,0 @@
1
- import "./chunk-J5LGTIGS.mjs";
2
-
3
- // src/translations.ts
4
- import { meta } from "#meta";
5
- var translations = [
6
- {
7
- "en-US": {
8
- [meta.profile.key]: {
9
- "plugin.name": "Transcription",
10
- "transcript-companion.label": "Transcript",
11
- "delete.button": "Delete",
12
- "bookmark.button": "Bookmark",
13
- "scroll-to-end.label": "Scroll to latest",
14
- "start-recording.label": "Start recording",
15
- "stop-recording.label": "Stop recording",
16
- "hold-to-record.label": "Hold to record",
17
- "recording-options.label": "Recording options",
18
- "record-mode.label": "Record mode",
19
- "record-mode.toggle.label": "Toggle",
20
- "record-mode.hold.label": "Hold to record (push to talk)",
21
- "audio-device.label": "Microphone",
22
- "audio-device.default.label": "System default",
23
- "settings.entity-extraction.label": "Entity extraction"
24
- }
25
- }
26
- }
27
- ];
28
- export {
29
- translations
30
- };
31
- //# sourceMappingURL=translations.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.profile.key]: {\n 'plugin.name': 'Transcription',\n 'transcript-companion.label': 'Transcript',\n\n 'delete.button': 'Delete',\n 'bookmark.button': 'Bookmark',\n 'scroll-to-end.label': 'Scroll to latest',\n\n 'start-recording.label': 'Start recording',\n 'stop-recording.label': 'Stop recording',\n 'hold-to-record.label': 'Hold to record',\n\n 'recording-options.label': 'Recording options',\n 'record-mode.label': 'Record mode',\n 'record-mode.toggle.label': 'Toggle',\n 'record-mode.hold.label': 'Hold to record (push to talk)',\n 'audio-device.label': 'Microphone',\n 'audio-device.default.label': 'System default',\n\n 'settings.entity-extraction.label': 'Entity extraction',\n },\n },\n },\n] as const satisfies Resource[];\n"],
5
- "mappings": ";;;AAMA,SAASA,YAAY;AAEd,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACD,KAAKE,QAAQC,GAAG,GAAG;QAClB,eAAe;QACf,8BAA8B;QAE9B,iBAAiB;QACjB,mBAAmB;QACnB,uBAAuB;QAEvB,yBAAyB;QACzB,wBAAwB;QACxB,wBAAwB;QAExB,2BAA2B;QAC3B,qBAAqB;QACrB,4BAA4B;QAC5B,0BAA0B;QAC1B,sBAAsB;QACtB,8BAA8B;QAE9B,oCAAoC;MACtC;IACF;EACF;;",
6
- "names": ["meta", "translations", "profile", "key"]
7
- }
@@ -1,12 +0,0 @@
1
- import {
2
- Settings_exports,
3
- TranscriptOperation_exports,
4
- TranscriptionCapabilities_exports
5
- } from "../chunk-MDV7NBFJ.mjs";
6
- import "../chunk-J5LGTIGS.mjs";
7
- export {
8
- Settings_exports as Settings,
9
- TranscriptOperation_exports as TranscriptOperation,
10
- TranscriptionCapabilities_exports as TranscriptionCapabilities
11
- };
12
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }