@signalwire/web-components 4.0.0-beta.11 → 4.0.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -55
- package/dist/_virtual/_commonjsHelpers.js +9 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/prism-python.js +28 -0
- package/dist/_virtual/prism-python.js.map +1 -0
- package/dist/_virtual/prism-python2.js +5 -0
- package/dist/_virtual/prism-python2.js.map +1 -0
- package/dist/_virtual/prism-typescript.js +28 -0
- package/dist/_virtual/prism-typescript.js.map +1 -0
- package/dist/_virtual/prism-typescript2.js +5 -0
- package/dist/_virtual/prism-typescript2.js.map +1 -0
- package/dist/_virtual/prism.js +28 -0
- package/dist/_virtual/prism.js.map +1 -0
- package/dist/_virtual/prism2.js +5 -0
- package/dist/_virtual/prism2.js.map +1 -0
- package/dist/assets/sw_background.webp.js +5 -0
- package/dist/assets/sw_background.webp.js.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts +67 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js +359 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.js +137 -0
- package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.js +177 -0
- package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
- package/dist/components/UI/icons/backspace.svg.js +10 -0
- package/dist/components/UI/icons/backspace.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-off.svg.js +8 -0
- package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-on.svg.js +8 -0
- package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
- package/dist/components/UI/icons/check-circle.svg.js +6 -0
- package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/chevron-up.svg.js +8 -0
- package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
- package/dist/components/UI/icons/close.svg.js +6 -0
- package/dist/components/UI/icons/close.svg.js.map +1 -0
- package/dist/components/UI/icons/copy.svg.js +6 -0
- package/dist/components/UI/icons/copy.svg.js.map +1 -0
- package/dist/components/UI/icons/download.svg.js +6 -0
- package/dist/components/UI/icons/download.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
- package/dist/components/UI/icons/hand-raise.svg.js +6 -0
- package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
- package/dist/components/UI/icons/icons.d.ts +31 -0
- package/dist/components/UI/icons/icons.d.ts.map +1 -0
- package/dist/components/UI/icons/icons.js +60 -0
- package/dist/components/UI/icons/icons.js.map +1 -0
- package/dist/components/UI/icons/index.d.ts +4 -0
- package/dist/components/UI/icons/index.d.ts.map +1 -0
- package/dist/components/UI/icons/info-circle.svg.js +6 -0
- package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-off.svg.js +8 -0
- package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-on.svg.js +8 -0
- package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
- package/dist/components/UI/icons/person.svg.js +8 -0
- package/dist/components/UI/icons/person.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-call.svg.js +8 -0
- package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-end.svg.js +8 -0
- package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
- package/dist/components/UI/icons/room.svg.js +8 -0
- package/dist/components/UI/icons/room.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
- package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share.svg.js +9 -0
- package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
- package/dist/components/UI/icons/sendIcon.svg.js +9 -0
- package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
- package/dist/components/UI/icons/settings.svg.js +8 -0
- package/dist/components/UI/icons/settings.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-off.svg.js +8 -0
- package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-on.svg.js +8 -0
- package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
- package/dist/components/UI/icons/spinner.svg.js +9 -0
- package/dist/components/UI/icons/spinner.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-logo.svg.js +11 -0
- package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.js +47 -0
- package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
- package/dist/components/UI/icons/transcript.svg.js +10 -0
- package/dist/components/UI/icons/transcript.svg.js.map +1 -0
- package/dist/components/UI/index.d.ts +18 -0
- package/dist/components/UI/index.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.js +106 -0
- package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.js +150 -0
- package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
- package/dist/components/UI/sw-ui-alert.d.ts +37 -0
- package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-alert.js +126 -0
- package/dist/components/UI/sw-ui-alert.js.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.js +341 -0
- package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
- package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +39 -7
- package/dist/components/sw-audio-level.d.ts.map +1 -0
- package/dist/components/sw-audio-level.js +252 -0
- package/dist/components/sw-audio-level.js.map +1 -0
- package/dist/components/sw-call-controls.d.ts +58 -0
- package/dist/components/sw-call-controls.d.ts.map +1 -0
- package/dist/components/sw-call-controls.js +186 -0
- package/dist/components/sw-call-controls.js.map +1 -0
- package/dist/components/sw-call-dialpad.d.ts +52 -0
- package/dist/components/sw-call-dialpad.d.ts.map +1 -0
- package/dist/components/sw-call-dialpad.js +70 -0
- package/dist/components/sw-call-dialpad.js.map +1 -0
- package/dist/components/sw-call-media.d.ts +68 -0
- package/dist/components/sw-call-media.d.ts.map +1 -0
- package/dist/components/sw-call-media.js +220 -0
- package/dist/components/sw-call-media.js.map +1 -0
- package/dist/components/sw-call-provider.d.ts +41 -0
- package/dist/components/sw-call-provider.d.ts.map +1 -0
- package/dist/components/sw-call-provider.js +37 -0
- package/dist/components/sw-call-provider.js.map +1 -0
- package/dist/components/sw-call-status.d.ts +50 -0
- package/dist/components/sw-call-status.d.ts.map +1 -0
- package/dist/components/sw-call-status.js +203 -0
- package/dist/components/sw-call-status.js.map +1 -0
- package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
- package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
- package/dist/components/sw-call-widget/client-factory.js +25 -0
- package/dist/components/sw-call-widget/client-factory.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.js +250 -0
- package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
- package/dist/components/sw-click-to-call.d.ts +39 -0
- package/dist/components/sw-click-to-call.d.ts.map +1 -0
- package/dist/components/sw-click-to-call.js +87 -0
- package/dist/components/sw-click-to-call.js.map +1 -0
- package/dist/components/sw-device-selector/index.d.ts +2 -0
- package/dist/components/sw-device-selector/index.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.js +277 -0
- package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
- package/dist/components/{directory.d.ts → sw-directory.d.ts} +13 -21
- package/dist/components/sw-directory.d.ts.map +1 -0
- package/dist/components/sw-directory.js +434 -0
- package/dist/components/sw-directory.js.map +1 -0
- package/dist/components/sw-local-camera.d.ts +53 -0
- package/dist/components/sw-local-camera.d.ts.map +1 -0
- package/dist/components/sw-local-camera.js +147 -0
- package/dist/components/sw-local-camera.js.map +1 -0
- package/dist/components/sw-participant-controls.d.ts +58 -0
- package/dist/components/sw-participant-controls.d.ts.map +1 -0
- package/dist/components/sw-participant-controls.js +305 -0
- package/dist/components/sw-participant-controls.js.map +1 -0
- package/dist/components/sw-participants.d.ts +55 -0
- package/dist/components/sw-participants.d.ts.map +1 -0
- package/dist/components/sw-participants.js +319 -0
- package/dist/components/sw-participants.js.map +1 -0
- package/dist/components/sw-self-media.d.ts +46 -0
- package/dist/components/sw-self-media.d.ts.map +1 -0
- package/dist/components/sw-self-media.js +106 -0
- package/dist/components/sw-self-media.js.map +1 -0
- package/dist/context/CallStateContextController.d.ts +31 -0
- package/dist/context/CallStateContextController.d.ts.map +1 -0
- package/dist/context/CallStateContextController.js +125 -0
- package/dist/context/CallStateContextController.js.map +1 -0
- package/dist/context/DevicesContextController.d.ts +38 -0
- package/dist/context/DevicesContextController.d.ts.map +1 -0
- package/dist/context/DevicesContextController.js +124 -0
- package/dist/context/DevicesContextController.js.map +1 -0
- package/dist/context/TranscriptController.d.ts +32 -0
- package/dist/context/TranscriptController.d.ts.map +1 -0
- package/dist/context/TranscriptController.js +113 -0
- package/dist/context/TranscriptController.js.map +1 -0
- package/dist/context/UserEventController.d.ts +26 -0
- package/dist/context/UserEventController.d.ts.map +1 -0
- package/dist/context/UserEventController.js +55 -0
- package/dist/context/UserEventController.js.map +1 -0
- package/dist/context/call-state-context.d.ts +75 -0
- package/dist/context/call-state-context.d.ts.map +1 -0
- package/dist/context/call-state-context.js +39 -0
- package/dist/context/call-state-context.js.map +1 -0
- package/dist/context/chat-state.d.ts +41 -0
- package/dist/context/chat-state.d.ts.map +1 -0
- package/dist/context/chat-state.js +61 -0
- package/dist/context/chat-state.js.map +1 -0
- package/dist/context/devices-context.d.ts +28 -0
- package/dist/context/devices-context.d.ts.map +1 -0
- package/dist/context/devices-context.js +6 -0
- package/dist/context/devices-context.js.map +1 -0
- package/dist/context/index.d.ts +9 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/transcript-context.d.ts +9 -0
- package/dist/context/transcript-context.d.ts.map +1 -0
- package/dist/context/transcript-context.js +6 -0
- package/dist/context/transcript-context.js.map +1 -0
- package/dist/context/types.d.ts +9 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/embed/signalwire-web-components-embed.iife.js +3225 -0
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs +3225 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
- package/dist/embed.d.ts +20 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/index.d.ts +18 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +83 -34
- package/dist/index.js.map +1 -1
- package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
- package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
- package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
- package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-css.js +56 -0
- package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-json.js +26 -0
- package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-python.js +69 -0
- package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
- package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
- package/dist/node_modules/prismjs/prism.js +1165 -0
- package/dist/node_modules/prismjs/prism.js.map +1 -0
- package/dist/react.d.ts +55 -26
- package/dist/theme.css +451 -0
- package/dist/theme.css.js +5 -0
- package/dist/theme.css.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/prism.d.ts +4 -0
- package/dist/utils/prism.d.ts.map +1 -0
- package/dist/utils/prism.js +34 -0
- package/dist/utils/prism.js.map +1 -0
- package/dist/utils/theme-loader.d.ts +11 -0
- package/dist/utils/theme-loader.d.ts.map +1 -0
- package/dist/utils/theme-loader.js +17 -0
- package/dist/utils/theme-loader.js.map +1 -0
- package/dist/utils/transcriptToMarkdown.d.ts +14 -0
- package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
- package/dist/utils/transcriptToMarkdown.js +59 -0
- package/dist/utils/transcriptToMarkdown.js.map +1 -0
- package/dist/utils/use-google-font.d.ts +18 -0
- package/dist/utils/use-google-font.d.ts.map +1 -0
- package/dist/utils/use-google-font.js +12 -0
- package/dist/utils/use-google-font.js.map +1 -0
- package/dist/utils/user-variables.d.ts +20 -0
- package/dist/utils/user-variables.d.ts.map +1 -0
- package/dist/utils/user-variables.js +37 -0
- package/dist/utils/user-variables.js.map +1 -0
- package/package.json +104 -41
- package/dist/components/audio-level.d.ts.map +0 -1
- package/dist/components/audio-level.js +0 -203
- package/dist/components/audio-level.js.map +0 -1
- package/dist/components/call-controls.d.ts +0 -183
- package/dist/components/call-controls.d.ts.map +0 -1
- package/dist/components/call-controls.js +0 -606
- package/dist/components/call-controls.js.map +0 -1
- package/dist/components/call-media.d.ts +0 -118
- package/dist/components/call-media.d.ts.map +0 -1
- package/dist/components/call-media.js +0 -219
- package/dist/components/call-media.js.map +0 -1
- package/dist/components/call-status.d.ts +0 -83
- package/dist/components/call-status.d.ts.map +0 -1
- package/dist/components/call-status.js +0 -255
- package/dist/components/call-status.js.map +0 -1
- package/dist/components/click-to-call.d.ts +0 -151
- package/dist/components/click-to-call.d.ts.map +0 -1
- package/dist/components/click-to-call.js +0 -428
- package/dist/components/click-to-call.js.map +0 -1
- package/dist/components/device-selector.d.ts +0 -238
- package/dist/components/device-selector.d.ts.map +0 -1
- package/dist/components/device-selector.js +0 -685
- package/dist/components/device-selector.js.map +0 -1
- package/dist/components/dialpad.d.ts +0 -74
- package/dist/components/dialpad.d.ts.map +0 -1
- package/dist/components/dialpad.js +0 -372
- package/dist/components/dialpad.js.map +0 -1
- package/dist/components/directory.d.ts.map +0 -1
- package/dist/components/directory.js +0 -503
- package/dist/components/directory.js.map +0 -1
- package/dist/components/example-button.d.ts +0 -21
- package/dist/components/example-button.d.ts.map +0 -1
- package/dist/components/example-button.js +0 -74
- package/dist/components/example-button.js.map +0 -1
- package/dist/components/participant-controls.d.ts +0 -123
- package/dist/components/participant-controls.d.ts.map +0 -1
- package/dist/components/participant-controls.js +0 -468
- package/dist/components/participant-controls.js.map +0 -1
- package/dist/components/participants.d.ts +0 -120
- package/dist/components/participants.d.ts.map +0 -1
- package/dist/components/participants.js +0 -394
- package/dist/components/participants.js.map +0 -1
- package/dist/components/self-media.d.ts +0 -78
- package/dist/components/self-media.d.ts.map +0 -1
- package/dist/components/self-media.js +0 -129
- package/dist/components/self-media.js.map +0 -1
- package/dist/context/call-context.d.ts +0 -13
- package/dist/context/call-context.d.ts.map +0 -1
- package/dist/context/call-context.js +0 -6
- package/dist/context/call-context.js.map +0 -1
- package/dist/types/index.js +0 -12
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Observable } from 'rxjs';
|
|
2
|
+
import type { ReactiveControllerHost } from 'lit';
|
|
3
|
+
import type { Call, LayoutLayer } from '../types/index.js';
|
|
4
|
+
import type { CallStatus, CallParticipant, CallSelfParticipant, CallAddress, MediaDirections, VideoPosition } from '@signalwire/js';
|
|
5
|
+
export interface CallState {
|
|
6
|
+
id: string;
|
|
7
|
+
direction: 'inbound' | 'outbound';
|
|
8
|
+
to: string | undefined;
|
|
9
|
+
status: CallStatus;
|
|
10
|
+
recording: boolean;
|
|
11
|
+
streaming: boolean;
|
|
12
|
+
locked: boolean;
|
|
13
|
+
raiseHandPriority: boolean;
|
|
14
|
+
meta: Record<string, unknown>;
|
|
15
|
+
participants: CallParticipant[];
|
|
16
|
+
/** The local/self participant. Null until the call is joined. */
|
|
17
|
+
self: CallSelfParticipant | null;
|
|
18
|
+
remoteStream: MediaStream | null;
|
|
19
|
+
localStream: MediaStream | null;
|
|
20
|
+
mediaDirections: MediaDirections;
|
|
21
|
+
layout: string | undefined;
|
|
22
|
+
layouts: string[];
|
|
23
|
+
layoutLayers: LayoutLayer[];
|
|
24
|
+
address: CallAddress | undefined;
|
|
25
|
+
capabilities: string[];
|
|
26
|
+
hangup: () => Promise<void>;
|
|
27
|
+
toggleLock: () => Promise<void>;
|
|
28
|
+
toggleHold: () => Promise<void>;
|
|
29
|
+
setLayout: (layout: string, positions?: Record<string, VideoPosition>) => Promise<void>;
|
|
30
|
+
startRecording: () => Promise<void>;
|
|
31
|
+
startStreaming: () => Promise<void>;
|
|
32
|
+
sendDigits: (digits: string) => Promise<void>;
|
|
33
|
+
answer: () => void;
|
|
34
|
+
reject: () => void;
|
|
35
|
+
}
|
|
36
|
+
export declare const callStateContext: {
|
|
37
|
+
__context__: CallState;
|
|
38
|
+
};
|
|
39
|
+
export interface IncomingCallInfo {
|
|
40
|
+
call: Call;
|
|
41
|
+
callerName: string | undefined;
|
|
42
|
+
callerNumber: string | undefined;
|
|
43
|
+
}
|
|
44
|
+
type IncomingCallCallback = (info: IncomingCallInfo) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Listens to an incoming-calls observable and fires a callback for each
|
|
47
|
+
* new inbound call. Deduplicates by call ID so a call is never announced
|
|
48
|
+
* twice.
|
|
49
|
+
*
|
|
50
|
+
* Usage in a provider component:
|
|
51
|
+
*
|
|
52
|
+
* private _incoming = new IncomingCallController(this);
|
|
53
|
+
*
|
|
54
|
+
* // Set the handler:
|
|
55
|
+
* this._incoming.onIncomingCall = (info) => { ... };
|
|
56
|
+
*
|
|
57
|
+
* // Start listening (pass the observable from client.session):
|
|
58
|
+
* this._incoming.connect(client.session.incomingCalls$);
|
|
59
|
+
*
|
|
60
|
+
* // Stop listening:
|
|
61
|
+
* this._incoming.disconnect();
|
|
62
|
+
*/
|
|
63
|
+
export declare class IncomingCallController {
|
|
64
|
+
private _subscription;
|
|
65
|
+
private _seenCallIds;
|
|
66
|
+
private _callback;
|
|
67
|
+
constructor(host: ReactiveControllerHost & EventTarget);
|
|
68
|
+
hostConnected(): void;
|
|
69
|
+
hostDisconnected(): void;
|
|
70
|
+
set onIncomingCall(cb: IncomingCallCallback);
|
|
71
|
+
connect(incomingCalls$: Observable<Call[]>): void;
|
|
72
|
+
disconnect(): void;
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=call-state-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-state-context.d.ts","sourceRoot":"","sources":["../../src/context/call-state-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,aAAa,EACd,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,SAAS;IAExB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAGvB,MAAM,EAAE,UAAU,CAAC;IAGnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG9B,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,iEAAiE;IACjE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAGjC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,eAAe,CAAC;IAGjC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,WAAW,EAAE,CAAC;IAG5B,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB;;CAA4C,CAAC;AAI1E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAID,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAE7D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAqC;gBAE1C,IAAI,EAAE,sBAAsB,GAAG,WAAW;IAQtD,aAAa;IACb,gBAAgB;IAIhB,IAAI,cAAc,CAAC,EAAE,EAAE,oBAAoB,EAE1C;IAED,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAiBjD,UAAU,IAAI,IAAI;CAKnB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createContext as c } from "@lit/context";
|
|
2
|
+
const o = c("sw-call-state");
|
|
3
|
+
class a {
|
|
4
|
+
constructor(s) {
|
|
5
|
+
this._subscription = null, this._seenCallIds = /* @__PURE__ */ new Set(), this._callback = null, s.addController(this);
|
|
6
|
+
}
|
|
7
|
+
// Intentionally not a stateful ReactiveController. We only register with
|
|
8
|
+
// `host.addController(this)` so `hostDisconnected()` can clean up the
|
|
9
|
+
// RxJS subscription on removal — there's no provider, no host requestUpdate(),
|
|
10
|
+
// and `hostConnected()` is a deliberate no-op.
|
|
11
|
+
hostConnected() {
|
|
12
|
+
}
|
|
13
|
+
hostDisconnected() {
|
|
14
|
+
this.disconnect();
|
|
15
|
+
}
|
|
16
|
+
set onIncomingCall(s) {
|
|
17
|
+
this._callback = s;
|
|
18
|
+
}
|
|
19
|
+
connect(s) {
|
|
20
|
+
this.disconnect(), this._subscription = s.subscribe((n) => {
|
|
21
|
+
var l;
|
|
22
|
+
for (const t of n)
|
|
23
|
+
this._seenCallIds.has(t.id) || (this._seenCallIds.add(t.id), (l = this._callback) == null || l.call(this, {
|
|
24
|
+
call: t,
|
|
25
|
+
callerName: t.fromName,
|
|
26
|
+
callerNumber: t.from
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
disconnect() {
|
|
31
|
+
var s;
|
|
32
|
+
(s = this._subscription) == null || s.unsubscribe(), this._subscription = null, this._seenCallIds.clear();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
a as IncomingCallController,
|
|
37
|
+
o as callStateContext
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=call-state-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-state-context.js","sources":["../../src/context/call-state-context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\nimport type { Observable, Subscription } from 'rxjs';\nimport type { ReactiveControllerHost } from 'lit';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport type {\n CallStatus,\n CallParticipant,\n CallSelfParticipant,\n CallAddress,\n MediaDirections,\n VideoPosition,\n} from '@signalwire/js';\n\n// ── Context value shape ───────────────────────────────────────────────────────\n\nexport interface CallState {\n // ── Identity (static, set once on connect) ──────────────────────────────\n id: string;\n direction: 'inbound' | 'outbound';\n to: string | undefined;\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n status: CallStatus;\n\n // ── Room state ───────────────────────────────────────────────────────────\n recording: boolean;\n streaming: boolean;\n locked: boolean;\n raiseHandPriority: boolean;\n meta: Record<string, unknown>;\n\n // ── Participants ─────────────────────────────────────────────────────────\n participants: CallParticipant[];\n /** The local/self participant. Null until the call is joined. */\n self: CallSelfParticipant | null;\n\n // ── Media streams ────────────────────────────────────────────────────────\n remoteStream: MediaStream | null;\n localStream: MediaStream | null;\n mediaDirections: MediaDirections;\n\n // ── Layout ───────────────────────────────────────────────────────────────\n layout: string | undefined;\n layouts: string[];\n layoutLayers: LayoutLayer[];\n\n // ── Address / capabilities ───────────────────────────────────────────────\n address: CallAddress | undefined;\n capabilities: string[];\n\n // ── Actions ──────────────────────────────────────────────────────────────\n hangup: () => Promise<void>;\n toggleLock: () => Promise<void>;\n toggleHold: () => Promise<void>;\n setLayout: (layout: string, positions?: Record<string, VideoPosition>) => Promise<void>;\n startRecording: () => Promise<void>;\n startStreaming: () => Promise<void>;\n sendDigits: (digits: string) => Promise<void>;\n answer: () => void;\n reject: () => void;\n}\n\nexport const callStateContext = createContext<CallState>('sw-call-state');\n\n// ── Incoming call info ───────────────────────────────────────────────────────\n\nexport interface IncomingCallInfo {\n call: Call;\n callerName: string | undefined;\n callerNumber: string | undefined;\n}\n\n// ── Incoming call controller ─────────────────────────────────────────────────\n\ntype IncomingCallCallback = (info: IncomingCallInfo) => void;\n\n/**\n * Listens to an incoming-calls observable and fires a callback for each\n * new inbound call. Deduplicates by call ID so a call is never announced\n * twice.\n *\n * Usage in a provider component:\n *\n * private _incoming = new IncomingCallController(this);\n *\n * // Set the handler:\n * this._incoming.onIncomingCall = (info) => { ... };\n *\n * // Start listening (pass the observable from client.session):\n * this._incoming.connect(client.session.incomingCalls$);\n *\n * // Stop listening:\n * this._incoming.disconnect();\n */\nexport class IncomingCallController {\n private _subscription: Subscription | null = null;\n private _seenCallIds = new Set<string>();\n private _callback: IncomingCallCallback | null = null;\n\n constructor(host: ReactiveControllerHost & EventTarget) {\n host.addController(this);\n }\n\n // Intentionally not a stateful ReactiveController. We only register with\n // `host.addController(this)` so `hostDisconnected()` can clean up the\n // RxJS subscription on removal — there's no provider, no host requestUpdate(),\n // and `hostConnected()` is a deliberate no-op.\n hostConnected() {}\n hostDisconnected() {\n this.disconnect();\n }\n\n set onIncomingCall(cb: IncomingCallCallback) {\n this._callback = cb;\n }\n\n connect(incomingCalls$: Observable<Call[]>): void {\n this.disconnect();\n\n this._subscription = incomingCalls$.subscribe((calls) => {\n for (const call of calls) {\n if (this._seenCallIds.has(call.id)) continue;\n this._seenCallIds.add(call.id);\n\n this._callback?.({\n call,\n callerName: call.fromName,\n callerNumber: call.from,\n });\n }\n });\n }\n\n disconnect(): void {\n this._subscription?.unsubscribe();\n this._subscription = null;\n this._seenCallIds.clear();\n }\n}\n"],"names":["callStateContext","createContext","IncomingCallController","host","cb","incomingCalls$","calls","call","_a"],"mappings":";AA8DO,MAAMA,IAAmBC,EAAyB,eAAe;AAgCjE,MAAMC,EAAuB;AAAA,EAKlC,YAAYC,GAA4C;AAJxD,SAAQ,gBAAqC,MAC7C,KAAQ,mCAAmB,IAAA,GAC3B,KAAQ,YAAyC,MAG/CA,EAAK,cAAc,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB;AAAA,EAAC;AAAA,EACjB,mBAAmB;AACjB,SAAK,WAAA;AAAA,EACP;AAAA,EAEA,IAAI,eAAeC,GAA0B;AAC3C,SAAK,YAAYA;AAAA,EACnB;AAAA,EAEA,QAAQC,GAA0C;AAChD,SAAK,WAAA,GAEL,KAAK,gBAAgBA,EAAe,UAAU,CAACC,MAAU;;AACvD,iBAAWC,KAAQD;AACjB,QAAI,KAAK,aAAa,IAAIC,EAAK,EAAE,MACjC,KAAK,aAAa,IAAIA,EAAK,EAAE,IAE7BC,IAAA,KAAK,cAAL,QAAAA,EAAA,WAAiB;AAAA,UACf,MAAAD;AAAA,UACA,YAAYA,EAAK;AAAA,UACjB,cAAcA,EAAK;AAAA,QAAA;AAAA,IAGzB,CAAC;AAAA,EACH;AAAA,EAEA,aAAmB;;AACjB,KAAAC,IAAA,KAAK,kBAAL,QAAAA,EAAoB,eACpB,KAAK,gBAAgB,MACrB,KAAK,aAAa,MAAA;AAAA,EACpB;AACF;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatState — AI transcript FSM.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates signaling events into a renderable chat history. The key
|
|
5
|
+
* property is that an AI partial and a user partial can coexist (e.g. when
|
|
6
|
+
* the user barges mid-response), and both are rendered — ordered by which
|
|
7
|
+
* party spoke most recently.
|
|
8
|
+
*
|
|
9
|
+
* Event semantics:
|
|
10
|
+
* - `ai.response_utterance` → AI chunk; buffer into `_aiPartial`.
|
|
11
|
+
* - `ai.completion` → AI finished. Promote partial to complete.
|
|
12
|
+
* If `barged`, `lastSpoken` flips to user.
|
|
13
|
+
* - `ai.partial_result` → User partial; replace `_userPartial`.
|
|
14
|
+
* - `ai.speech_detect` → User finished. Promote partial (or insert
|
|
15
|
+
* directly) with the server's final text.
|
|
16
|
+
*/
|
|
17
|
+
export type Speaker = 'ai' | 'user';
|
|
18
|
+
export type EntryState = 'partial' | 'complete';
|
|
19
|
+
export interface ChatEntry {
|
|
20
|
+
speaker: Speaker;
|
|
21
|
+
text: string;
|
|
22
|
+
state: EntryState;
|
|
23
|
+
}
|
|
24
|
+
export declare class ChatState {
|
|
25
|
+
private _entries;
|
|
26
|
+
private _aiPartial;
|
|
27
|
+
private _userPartial;
|
|
28
|
+
private _lastSpoken;
|
|
29
|
+
/** Invoked after any state change. Overridable by consumers. */
|
|
30
|
+
onUpdate: () => void;
|
|
31
|
+
/** Completed entries plus any live partials, in render order. */
|
|
32
|
+
getHistory(): ChatEntry[];
|
|
33
|
+
get hasAny(): boolean;
|
|
34
|
+
get lastSpoken(): Speaker | null;
|
|
35
|
+
reset(): void;
|
|
36
|
+
onUserPartial(text: string): void;
|
|
37
|
+
onUserComplete(text: string): void;
|
|
38
|
+
onAiChunk(text: string): void;
|
|
39
|
+
onAiComplete(text: string, barged: boolean): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=chat-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-state.d.ts","sourceRoot":"","sources":["../../src/context/chat-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AACpC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,WAAW,CAAwB;IAE3C,gEAAgE;IACzD,QAAQ,EAAE,MAAM,IAAI,CAAY;IAEvC,iEAAiE;IAC1D,UAAU,IAAI,SAAS,EAAE;IAgBhC,IAAW,MAAM,IAAI,OAAO,CAM3B;IAED,IAAW,UAAU,IAAI,OAAO,GAAG,IAAI,CAEtC;IAEM,KAAK,IAAI,IAAI;IAQb,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc7B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;CAiBzD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
class e {
|
|
2
|
+
constructor() {
|
|
3
|
+
this._entries = [], this._aiPartial = null, this._userPartial = null, this._lastSpoken = null, this.onUpdate = () => {
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
/** Completed entries plus any live partials, in render order. */
|
|
7
|
+
getHistory() {
|
|
8
|
+
const t = [...this._entries];
|
|
9
|
+
return this._aiPartial && this._userPartial ? this._lastSpoken === "user" ? t.push(this._aiPartial, this._userPartial) : t.push(this._userPartial, this._aiPartial) : this._aiPartial ? t.push(this._aiPartial) : this._userPartial && t.push(this._userPartial), t;
|
|
10
|
+
}
|
|
11
|
+
get hasAny() {
|
|
12
|
+
return this._entries.length > 0 || this._aiPartial !== null || this._userPartial !== null;
|
|
13
|
+
}
|
|
14
|
+
get lastSpoken() {
|
|
15
|
+
return this._lastSpoken;
|
|
16
|
+
}
|
|
17
|
+
reset() {
|
|
18
|
+
this._entries = [], this._aiPartial = null, this._userPartial = null, this._lastSpoken = null, this.onUpdate();
|
|
19
|
+
}
|
|
20
|
+
onUserPartial(t) {
|
|
21
|
+
t && (this._userPartial = { speaker: "user", text: t, state: "partial" }, this._lastSpoken = "user", this.onUpdate());
|
|
22
|
+
}
|
|
23
|
+
onUserComplete(t) {
|
|
24
|
+
if (!t) {
|
|
25
|
+
this._userPartial = null, this.onUpdate();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this._entries = [
|
|
29
|
+
...this._entries,
|
|
30
|
+
{ speaker: "user", text: t, state: "complete" }
|
|
31
|
+
], this._userPartial = null, this._lastSpoken = "user", this.onUpdate();
|
|
32
|
+
}
|
|
33
|
+
onAiChunk(t) {
|
|
34
|
+
if (t) {
|
|
35
|
+
if (!this._aiPartial)
|
|
36
|
+
this._aiPartial = { speaker: "ai", text: t, state: "partial" };
|
|
37
|
+
else {
|
|
38
|
+
const i = `${this._aiPartial.text} ${t}`.replace(/\s+/g, " ").trim();
|
|
39
|
+
this._aiPartial = { ...this._aiPartial, text: i };
|
|
40
|
+
}
|
|
41
|
+
this._lastSpoken = "ai", this.onUpdate();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
onAiComplete(t, i) {
|
|
45
|
+
if (this._aiPartial) {
|
|
46
|
+
const s = t.length > 0 ? t : this._aiPartial.text;
|
|
47
|
+
this._entries = [
|
|
48
|
+
...this._entries,
|
|
49
|
+
{ speaker: "ai", text: s, state: "complete" }
|
|
50
|
+
], this._aiPartial = null;
|
|
51
|
+
} else t.length > 0 && (this._entries = [
|
|
52
|
+
...this._entries,
|
|
53
|
+
{ speaker: "ai", text: t, state: "complete" }
|
|
54
|
+
]);
|
|
55
|
+
this._lastSpoken = i ? "user" : "ai", this.onUpdate();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
e as ChatState
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=chat-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-state.js","sources":["../../src/context/chat-state.ts"],"sourcesContent":["/**\n * ChatState — AI transcript FSM.\n *\n * Accumulates signaling events into a renderable chat history. The key\n * property is that an AI partial and a user partial can coexist (e.g. when\n * the user barges mid-response), and both are rendered — ordered by which\n * party spoke most recently.\n *\n * Event semantics:\n * - `ai.response_utterance` → AI chunk; buffer into `_aiPartial`.\n * - `ai.completion` → AI finished. Promote partial to complete.\n * If `barged`, `lastSpoken` flips to user.\n * - `ai.partial_result` → User partial; replace `_userPartial`.\n * - `ai.speech_detect` → User finished. Promote partial (or insert\n * directly) with the server's final text.\n */\nexport type Speaker = 'ai' | 'user';\nexport type EntryState = 'partial' | 'complete';\n\nexport interface ChatEntry {\n speaker: Speaker;\n text: string;\n state: EntryState;\n}\n\nexport class ChatState {\n private _entries: ChatEntry[] = [];\n private _aiPartial: ChatEntry | null = null;\n private _userPartial: ChatEntry | null = null;\n private _lastSpoken: Speaker | null = null;\n\n /** Invoked after any state change. Overridable by consumers. */\n public onUpdate: () => void = () => {};\n\n /** Completed entries plus any live partials, in render order. */\n public getHistory(): ChatEntry[] {\n const out = [...this._entries];\n if (this._aiPartial && this._userPartial) {\n if (this._lastSpoken === 'user') {\n out.push(this._aiPartial, this._userPartial);\n } else {\n out.push(this._userPartial, this._aiPartial);\n }\n } else if (this._aiPartial) {\n out.push(this._aiPartial);\n } else if (this._userPartial) {\n out.push(this._userPartial);\n }\n return out;\n }\n\n public get hasAny(): boolean {\n return (\n this._entries.length > 0 ||\n this._aiPartial !== null ||\n this._userPartial !== null\n );\n }\n\n public get lastSpoken(): Speaker | null {\n return this._lastSpoken;\n }\n\n public reset(): void {\n this._entries = [];\n this._aiPartial = null;\n this._userPartial = null;\n this._lastSpoken = null;\n this.onUpdate();\n }\n\n public onUserPartial(text: string): void {\n if (!text) return;\n this._userPartial = { speaker: 'user', text, state: 'partial' };\n this._lastSpoken = 'user';\n this.onUpdate();\n }\n\n public onUserComplete(text: string): void {\n if (!text) {\n // No final text — drop any lingering partial silently.\n this._userPartial = null;\n this.onUpdate();\n return;\n }\n this._entries = [\n ...this._entries,\n { speaker: 'user', text, state: 'complete' },\n ];\n this._userPartial = null;\n this._lastSpoken = 'user';\n this.onUpdate();\n }\n\n public onAiChunk(text: string): void {\n if (!text) return;\n if (!this._aiPartial) {\n this._aiPartial = { speaker: 'ai', text, state: 'partial' };\n } else {\n const merged = `${this._aiPartial.text} ${text}`\n .replace(/\\s+/g, ' ')\n .trim();\n this._aiPartial = { ...this._aiPartial, text: merged };\n }\n this._lastSpoken = 'ai';\n this.onUpdate();\n }\n\n public onAiComplete(text: string, barged: boolean): void {\n if (this._aiPartial) {\n const finalText = text.length > 0 ? text : this._aiPartial.text;\n this._entries = [\n ...this._entries,\n { speaker: 'ai', text: finalText, state: 'complete' },\n ];\n this._aiPartial = null;\n } else if (text.length > 0) {\n this._entries = [\n ...this._entries,\n { speaker: 'ai', text, state: 'complete' },\n ];\n }\n this._lastSpoken = barged ? 'user' : 'ai';\n this.onUpdate();\n }\n}\n"],"names":["ChatState","out","text","merged","barged","finalText"],"mappings":"AAyBO,MAAMA,EAAU;AAAA,EAAhB,cAAA;AACL,SAAQ,WAAwB,CAAA,GAChC,KAAQ,aAA+B,MACvC,KAAQ,eAAiC,MACzC,KAAQ,cAA8B,MAGtC,KAAO,WAAuB,MAAM;AAAA,IAAC;AAAA,EAAA;AAAA;AAAA,EAG9B,aAA0B;AAC/B,UAAMC,IAAM,CAAC,GAAG,KAAK,QAAQ;AAC7B,WAAI,KAAK,cAAc,KAAK,eACtB,KAAK,gBAAgB,SACvBA,EAAI,KAAK,KAAK,YAAY,KAAK,YAAY,IAE3CA,EAAI,KAAK,KAAK,cAAc,KAAK,UAAU,IAEpC,KAAK,aACdA,EAAI,KAAK,KAAK,UAAU,IACf,KAAK,gBACdA,EAAI,KAAK,KAAK,YAAY,GAErBA;AAAA,EACT;AAAA,EAEA,IAAW,SAAkB;AAC3B,WACE,KAAK,SAAS,SAAS,KACvB,KAAK,eAAe,QACpB,KAAK,iBAAiB;AAAA,EAE1B;AAAA,EAEA,IAAW,aAA6B;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,QAAc;AACnB,SAAK,WAAW,CAAA,GAChB,KAAK,aAAa,MAClB,KAAK,eAAe,MACpB,KAAK,cAAc,MACnB,KAAK,SAAA;AAAA,EACP;AAAA,EAEO,cAAcC,GAAoB;AACvC,IAAKA,MACL,KAAK,eAAe,EAAE,SAAS,QAAQ,MAAAA,GAAM,OAAO,UAAA,GACpD,KAAK,cAAc,QACnB,KAAK,SAAA;AAAA,EACP;AAAA,EAEO,eAAeA,GAAoB;AACxC,QAAI,CAACA,GAAM;AAET,WAAK,eAAe,MACpB,KAAK,SAAA;AACL;AAAA,IACF;AACA,SAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,EAAE,SAAS,QAAQ,MAAAA,GAAM,OAAO,WAAA;AAAA,IAAW,GAE7C,KAAK,eAAe,MACpB,KAAK,cAAc,QACnB,KAAK,SAAA;AAAA,EACP;AAAA,EAEO,UAAUA,GAAoB;AACnC,QAAKA,GACL;AAAA,UAAI,CAAC,KAAK;AACR,aAAK,aAAa,EAAE,SAAS,MAAM,MAAAA,GAAM,OAAO,UAAA;AAAA,WAC3C;AACL,cAAMC,IAAS,GAAG,KAAK,WAAW,IAAI,IAAID,CAAI,GAC3C,QAAQ,QAAQ,GAAG,EACnB,KAAA;AACH,aAAK,aAAa,EAAE,GAAG,KAAK,YAAY,MAAMC,EAAA;AAAA,MAChD;AACA,WAAK,cAAc,MACnB,KAAK,SAAA;AAAA;AAAA,EACP;AAAA,EAEO,aAAaD,GAAcE,GAAuB;AACvD,QAAI,KAAK,YAAY;AACnB,YAAMC,IAAYH,EAAK,SAAS,IAAIA,IAAO,KAAK,WAAW;AAC3D,WAAK,WAAW;AAAA,QACd,GAAG,KAAK;AAAA,QACR,EAAE,SAAS,MAAM,MAAMG,GAAW,OAAO,WAAA;AAAA,MAAW,GAEtD,KAAK,aAAa;AAAA,IACpB,MAAA,CAAWH,EAAK,SAAS,MACvB,KAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,EAAE,SAAS,MAAM,MAAAA,GAAM,OAAO,WAAA;AAAA,IAAW;AAG7C,SAAK,cAAcE,IAAS,SAAS,MACrC,KAAK,SAAA;AAAA,EACP;AACF;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface DevicesState {
|
|
2
|
+
audioInputDevices: MediaDeviceInfo[];
|
|
3
|
+
audioOutputDevices: MediaDeviceInfo[];
|
|
4
|
+
videoInputDevices: MediaDeviceInfo[];
|
|
5
|
+
selectedAudioInput: MediaDeviceInfo | null;
|
|
6
|
+
selectedAudioOutput: MediaDeviceInfo | null;
|
|
7
|
+
selectedVideoInput: MediaDeviceInfo | null;
|
|
8
|
+
audioMuted: boolean;
|
|
9
|
+
videoMuted: boolean;
|
|
10
|
+
/** deaf = can't hear = "speaker muted" from the server's perspective */
|
|
11
|
+
speakerMuted: boolean;
|
|
12
|
+
selectAudioInput: (device: MediaDeviceInfo | null) => void;
|
|
13
|
+
selectAudioOutput: (device: MediaDeviceInfo | null) => void;
|
|
14
|
+
selectVideoInput: (device: MediaDeviceInfo | null) => void;
|
|
15
|
+
toggleAudioMute: () => Promise<void>;
|
|
16
|
+
toggleVideoMute: () => Promise<void>;
|
|
17
|
+
toggleSpeakerMute: () => Promise<void>;
|
|
18
|
+
echoCancellation: boolean;
|
|
19
|
+
autoGain: boolean;
|
|
20
|
+
noiseSuppression: boolean;
|
|
21
|
+
toggleEchoCancellation: () => Promise<void>;
|
|
22
|
+
toggleAutoGain: () => Promise<void>;
|
|
23
|
+
toggleNoiseSuppression: () => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare const devicesContext: {
|
|
26
|
+
__context__: DevicesState;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=devices-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices-context.d.ts","sourceRoot":"","sources":["../../src/context/devices-context.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAE3B,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,iBAAiB,EAAE,eAAe,EAAE,CAAC;IAGrC,kBAAkB,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,mBAAmB,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,kBAAkB,EAAE,eAAe,GAAG,IAAI,CAAC;IAI3C,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAC;IAGtB,gBAAgB,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,gBAAgB,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAG3D,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAG1B,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,eAAO,MAAM,cAAc;;CAA4C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices-context.js","sources":["../../src/context/devices-context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\n// ── Context value shape ───────────────────────────────────────────────────────\n\nexport interface DevicesState {\n // ── Device lists ────────────────────────────────────────────────────────\n audioInputDevices: MediaDeviceInfo[];\n audioOutputDevices: MediaDeviceInfo[];\n videoInputDevices: MediaDeviceInfo[];\n\n // ── Selected devices ────────────────────────────────────────────────────\n selectedAudioInput: MediaDeviceInfo | null;\n selectedAudioOutput: MediaDeviceInfo | null;\n selectedVideoInput: MediaDeviceInfo | null;\n\n // ── Mute state (source of truth: server via call.self$) ─────────────────\n // These reflect what the server says — admin mute will flip these too.\n audioMuted: boolean;\n videoMuted: boolean;\n /** deaf = can't hear = \"speaker muted\" from the server's perspective */\n speakerMuted: boolean;\n\n // ── Device actions ───────────────────────────────────────────────────────\n selectAudioInput: (device: MediaDeviceInfo | null) => void;\n selectAudioOutput: (device: MediaDeviceInfo | null) => void;\n selectVideoInput: (device: MediaDeviceInfo | null) => void;\n\n // ── Mute actions (call through to self participant) ──────────────────────\n toggleAudioMute: () => Promise<void>;\n toggleVideoMute: () => Promise<void>;\n toggleSpeakerMute: () => Promise<void>;\n\n // ── Audio processing state (source of truth: server via call.self$) ────\n echoCancellation: boolean;\n autoGain: boolean;\n noiseSuppression: boolean;\n\n // ── Audio processing actions ───────────────────────────────────────────\n toggleEchoCancellation: () => Promise<void>;\n toggleAutoGain: () => Promise<void>;\n toggleNoiseSuppression: () => Promise<void>;\n}\n\nexport const devicesContext = createContext<DevicesState>('sw-devices');\n"],"names":["devicesContext","createContext"],"mappings":";AA2CO,MAAMA,IAAiBC,EAA4B,YAAY;"}
|
package/dist/context/index.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
export * from './call-context.js';
|
|
1
|
+
export * from './call-state-context.js';
|
|
2
|
+
export * from './devices-context.js';
|
|
3
|
+
export * from './transcript-context.js';
|
|
4
|
+
export { CallStateContextController } from './CallStateContextController.js';
|
|
5
|
+
export { DevicesContextController } from './DevicesContextController.js';
|
|
6
|
+
export { TranscriptController } from './TranscriptController.js';
|
|
7
|
+
export { UserEventController } from './UserEventController.js';
|
|
8
|
+
export * from './chat-state.js';
|
|
9
|
+
export * from './types.js';
|
|
2
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AAGxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,cAAc,iBAAiB,CAAC;AAGhC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TranscriptEntry } from '../components/UI/sw-ui-transcript-view.js';
|
|
2
|
+
export type { TranscriptEntry };
|
|
3
|
+
export interface TranscriptState {
|
|
4
|
+
entries: TranscriptEntry[];
|
|
5
|
+
}
|
|
6
|
+
export declare const transcriptContext: {
|
|
7
|
+
__context__: TranscriptState;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=transcript-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-context.d.ts","sourceRoot":"","sources":["../../src/context/transcript-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAEjF,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,iBAAiB;;CAA+C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-context.js","sources":["../../src/context/transcript-context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\nimport type { TranscriptEntry } from '../components/UI/sw-ui-transcript-view.js';\n\nexport type { TranscriptEntry };\n\nexport interface TranscriptState {\n entries: TranscriptEntry[];\n}\n\nexport const transcriptContext = createContext<TranscriptState>('transcript');\n"],"names":["transcriptContext","createContext"],"mappings":";AASO,MAAMA,IAAoBC,EAA+B,YAAY;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactiveControllerHost } from 'lit';
|
|
2
|
+
/**
|
|
3
|
+
* Host type accepted by `@lit/context`'s `ContextProvider`. The library types
|
|
4
|
+
* its host as `Partial<ReactiveControllerHost> & HTMLElement`, so any
|
|
5
|
+
* controller that wraps a `ContextProvider` should require the same to avoid
|
|
6
|
+
* `as any` casts at the call site.
|
|
7
|
+
*/
|
|
8
|
+
export type ContextHost = ReactiveControllerHost & HTMLElement;
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,sBAAsB,GAAG,WAAW,CAAC"}
|