@moldable-ai/ui 0.2.19 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog/catalog-manifest.d.ts +6 -0
- package/dist/catalog/catalog-manifest.d.ts.map +1 -0
- package/dist/catalog/catalog-manifest.js +105 -0
- package/dist/catalog/catalog-types.d.ts +54 -0
- package/dist/catalog/catalog-types.d.ts.map +1 -0
- package/dist/catalog/catalog-types.js +14 -0
- package/dist/catalog/component-catalog.d.ts +14 -0
- package/dist/catalog/component-catalog.d.ts.map +1 -0
- package/dist/catalog/component-catalog.js +39 -0
- package/dist/catalog/core-catalog.d.ts +6 -0
- package/dist/catalog/core-catalog.d.ts.map +1 -0
- package/dist/catalog/core-catalog.js +105 -0
- package/dist/catalog/index.d.ts +5 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/components/app-error-boundary.d.ts +1 -0
- package/dist/components/app-error-boundary.d.ts.map +1 -1
- package/dist/components/app-error-boundary.js +13 -0
- package/dist/components/chat/chat-image-lightbox.d.ts +9 -0
- package/dist/components/chat/chat-image-lightbox.d.ts.map +1 -0
- package/dist/components/chat/chat-image-lightbox.js +9 -0
- package/dist/components/chat/chat-message.d.ts +19 -1
- package/dist/components/chat/chat-message.d.ts.map +1 -1
- package/dist/components/chat/chat-message.js +66 -16
- package/dist/components/chat/chat-messages.d.ts +5 -2
- package/dist/components/chat/chat-messages.d.ts.map +1 -1
- package/dist/components/chat/chat-messages.js +61 -6
- package/dist/components/chat/chat-panel.d.ts +50 -6
- package/dist/components/chat/chat-panel.d.ts.map +1 -1
- package/dist/components/chat/chat-panel.js +200 -163
- package/dist/components/chat/conversation-history.d.ts +39 -5
- package/dist/components/chat/conversation-history.d.ts.map +1 -1
- package/dist/components/chat/conversation-history.js +192 -26
- package/dist/components/chat/index.d.ts +2 -2
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +1 -1
- package/dist/components/chat/tool-handlers.d.ts.map +1 -1
- package/dist/components/chat/tool-handlers.js +40 -2
- package/dist/components/chat/vertical-scroll-fade.d.ts +6 -0
- package/dist/components/chat/vertical-scroll-fade.d.ts.map +1 -0
- package/dist/components/chat/vertical-scroll-fade.js +12 -0
- package/dist/components/native-capabilities/bluetooth-panel-helpers.d.ts +9 -0
- package/dist/components/native-capabilities/bluetooth-panel-helpers.d.ts.map +1 -0
- package/dist/components/native-capabilities/bluetooth-panel-helpers.js +37 -0
- package/dist/components/native-capabilities/bluetooth-panel.d.ts +56 -0
- package/dist/components/native-capabilities/bluetooth-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/bluetooth-panel.js +470 -0
- package/dist/components/native-capabilities/camera-preview.d.ts +39 -0
- package/dist/components/native-capabilities/camera-preview.d.ts.map +1 -0
- package/dist/components/native-capabilities/camera-preview.js +228 -0
- package/dist/components/native-capabilities/capability-badge.d.ts +23 -0
- package/dist/components/native-capabilities/capability-badge.d.ts.map +1 -0
- package/dist/components/native-capabilities/capability-badge.js +39 -0
- package/dist/components/native-capabilities/capability-matrix.d.ts +14 -0
- package/dist/components/native-capabilities/capability-matrix.d.ts.map +1 -0
- package/dist/components/native-capabilities/capability-matrix.js +97 -0
- package/dist/components/native-capabilities/clipboard-button.d.ts +26 -0
- package/dist/components/native-capabilities/clipboard-button.d.ts.map +1 -0
- package/dist/components/native-capabilities/clipboard-button.js +99 -0
- package/dist/components/native-capabilities/device-io-controls.d.ts +4 -0
- package/dist/components/native-capabilities/device-io-controls.d.ts.map +1 -0
- package/dist/components/native-capabilities/device-io-controls.js +28 -0
- package/dist/components/native-capabilities/device-list.d.ts +20 -0
- package/dist/components/native-capabilities/device-list.d.ts.map +1 -0
- package/dist/components/native-capabilities/device-list.js +14 -0
- package/dist/components/native-capabilities/display-map.d.ts +23 -0
- package/dist/components/native-capabilities/display-map.d.ts.map +1 -0
- package/dist/components/native-capabilities/display-map.js +114 -0
- package/dist/components/native-capabilities/haptic-button.d.ts +26 -0
- package/dist/components/native-capabilities/haptic-button.d.ts.map +1 -0
- package/dist/components/native-capabilities/haptic-button.js +94 -0
- package/dist/components/native-capabilities/hid-panel.d.ts +40 -0
- package/dist/components/native-capabilities/hid-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/hid-panel.js +373 -0
- package/dist/components/native-capabilities/index.d.ts +27 -0
- package/dist/components/native-capabilities/index.d.ts.map +1 -0
- package/dist/components/native-capabilities/index.js +26 -0
- package/dist/components/native-capabilities/live-indicator.d.ts +15 -0
- package/dist/components/native-capabilities/live-indicator.d.ts.map +1 -0
- package/dist/components/native-capabilities/live-indicator.js +26 -0
- package/dist/components/native-capabilities/local-auth-button.d.ts +33 -0
- package/dist/components/native-capabilities/local-auth-button.d.ts.map +1 -0
- package/dist/components/native-capabilities/local-auth-button.js +115 -0
- package/dist/components/native-capabilities/location-panel.d.ts +29 -0
- package/dist/components/native-capabilities/location-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/location-panel.js +146 -0
- package/dist/components/native-capabilities/microphone-meter.d.ts +35 -0
- package/dist/components/native-capabilities/microphone-meter.d.ts.map +1 -0
- package/dist/components/native-capabilities/microphone-meter.js +244 -0
- package/dist/components/native-capabilities/midi-monitor.d.ts +54 -0
- package/dist/components/native-capabilities/midi-monitor.d.ts.map +1 -0
- package/dist/components/native-capabilities/midi-monitor.js +534 -0
- package/dist/components/native-capabilities/native-capability-panel.d.ts +11 -0
- package/dist/components/native-capabilities/native-capability-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/native-capability-panel.js +28 -0
- package/dist/components/native-capabilities/notification-panel.d.ts +24 -0
- package/dist/components/native-capabilities/notification-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/notification-panel.js +124 -0
- package/dist/components/native-capabilities/power-blocker-controller.d.ts +19 -0
- package/dist/components/native-capabilities/power-blocker-controller.d.ts.map +1 -0
- package/dist/components/native-capabilities/power-blocker-controller.js +83 -0
- package/dist/components/native-capabilities/power-panel.d.ts +67 -0
- package/dist/components/native-capabilities/power-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/power-panel.js +309 -0
- package/dist/components/native-capabilities/readout.d.ts +10 -0
- package/dist/components/native-capabilities/readout.d.ts.map +1 -0
- package/dist/components/native-capabilities/readout.js +11 -0
- package/dist/components/native-capabilities/screen-share-preview.d.ts +36 -0
- package/dist/components/native-capabilities/screen-share-preview.d.ts.map +1 -0
- package/dist/components/native-capabilities/screen-share-preview.js +191 -0
- package/dist/components/native-capabilities/secure-storage-panel.d.ts +36 -0
- package/dist/components/native-capabilities/secure-storage-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/secure-storage-panel.js +193 -0
- package/dist/components/native-capabilities/serial-console.d.ts +64 -0
- package/dist/components/native-capabilities/serial-console.d.ts.map +1 -0
- package/dist/components/native-capabilities/serial-console.js +399 -0
- package/dist/components/native-capabilities/shortcut-recorder.d.ts +35 -0
- package/dist/components/native-capabilities/shortcut-recorder.d.ts.map +1 -0
- package/dist/components/native-capabilities/shortcut-recorder.js +217 -0
- package/dist/components/native-capabilities/stream-log.d.ts +35 -0
- package/dist/components/native-capabilities/stream-log.d.ts.map +1 -0
- package/dist/components/native-capabilities/stream-log.js +65 -0
- package/dist/components/native-capabilities/system-audio-monitor.d.ts +34 -0
- package/dist/components/native-capabilities/system-audio-monitor.d.ts.map +1 -0
- package/dist/components/native-capabilities/system-audio-monitor.js +275 -0
- package/dist/components/native-capabilities/usb-panel.d.ts +54 -0
- package/dist/components/native-capabilities/usb-panel.d.ts.map +1 -0
- package/dist/components/native-capabilities/usb-panel.js +363 -0
- package/dist/components/native-capabilities/use-capability.d.ts +20 -0
- package/dist/components/native-capabilities/use-capability.d.ts.map +1 -0
- package/dist/components/native-capabilities/use-capability.js +61 -0
- package/dist/components/ui/app-frame.d.ts +22 -0
- package/dist/components/ui/app-frame.d.ts.map +1 -0
- package/dist/components/ui/app-frame.js +56 -0
- package/dist/components/ui/button-group.d.ts +1 -1
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/color-well.d.ts +13 -0
- package/dist/components/ui/color-well.d.ts.map +1 -0
- package/dist/components/ui/color-well.js +30 -0
- package/dist/components/ui/date-field.d.ts +19 -0
- package/dist/components/ui/date-field.d.ts.map +1 -0
- package/dist/components/ui/date-field.js +54 -0
- package/dist/components/ui/edge-fade.d.ts +11 -0
- package/dist/components/ui/edge-fade.d.ts.map +1 -0
- package/dist/components/ui/edge-fade.js +41 -0
- package/dist/components/ui/empty.js +1 -1
- package/dist/components/ui/field.d.ts +1 -1
- package/dist/components/ui/grid.d.ts +24 -0
- package/dist/components/ui/grid.d.ts.map +1 -0
- package/dist/components/ui/grid.js +234 -0
- package/dist/components/ui/icon-button.d.ts +15 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +15 -0
- package/dist/components/ui/index.d.ts +19 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +19 -0
- package/dist/components/ui/input-group.d.ts +1 -1
- package/dist/components/ui/inspector.d.ts +15 -0
- package/dist/components/ui/inspector.d.ts.map +1 -0
- package/dist/components/ui/inspector.js +26 -0
- package/dist/components/ui/kbd.d.ts +1 -1
- package/dist/components/ui/list.d.ts +24 -0
- package/dist/components/ui/list.d.ts.map +1 -0
- package/dist/components/ui/list.js +224 -0
- package/dist/components/ui/message-scroller-layout-stability.d.ts +33 -0
- package/dist/components/ui/message-scroller-layout-stability.d.ts.map +1 -0
- package/dist/components/ui/message-scroller-layout-stability.js +153 -0
- package/dist/components/ui/message-scroller.d.ts +11 -0
- package/dist/components/ui/message-scroller.d.ts.map +1 -0
- package/dist/components/ui/message-scroller.js +37 -0
- package/dist/components/ui/notification-dot.d.ts +4 -0
- package/dist/components/ui/notification-dot.d.ts.map +1 -0
- package/dist/components/ui/notification-dot.js +7 -0
- package/dist/components/ui/number-input.d.ts +16 -0
- package/dist/components/ui/number-input.d.ts.map +1 -0
- package/dist/components/ui/number-input.js +56 -0
- package/dist/components/ui/panel.d.ts +18 -0
- package/dist/components/ui/panel.d.ts.map +1 -0
- package/dist/components/ui/panel.js +40 -0
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/search-field.d.ts +19 -0
- package/dist/components/ui/search-field.d.ts.map +1 -0
- package/dist/components/ui/search-field.js +64 -0
- package/dist/components/ui/segmented-control.d.ts +21 -0
- package/dist/components/ui/segmented-control.d.ts.map +1 -0
- package/dist/components/ui/segmented-control.js +61 -0
- package/dist/components/ui/sidebar.js +1 -1
- package/dist/components/ui/sonner.d.ts +4 -3
- package/dist/components/ui/sonner.d.ts.map +1 -1
- package/dist/components/ui/sonner.js +7 -6
- package/dist/components/ui/split-view.d.ts +11 -0
- package/dist/components/ui/split-view.d.ts.map +1 -0
- package/dist/components/ui/split-view.js +13 -0
- package/dist/components/ui/status.d.ts +13 -0
- package/dist/components/ui/status.d.ts.map +1 -0
- package/dist/components/ui/status.js +36 -0
- package/dist/components/ui/table.d.ts +11 -2
- package/dist/components/ui/table.d.ts.map +1 -1
- package/dist/components/ui/table.js +28 -6
- package/dist/components/ui/text.d.ts +17 -0
- package/dist/components/ui/text.d.ts.map +1 -0
- package/dist/components/ui/text.js +55 -0
- package/dist/components/ui/toggle.js +1 -1
- package/dist/components/ui/toolbar.d.ts +20 -0
- package/dist/components/ui/toolbar.d.ts.map +1 -0
- package/dist/components/ui/toolbar.js +52 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/lib/frame-lifecycle.d.ts +28 -0
- package/dist/lib/frame-lifecycle.d.ts.map +1 -1
- package/dist/lib/frame-lifecycle.js +84 -0
- package/dist/lib/native-capabilities/access.d.ts +13 -0
- package/dist/lib/native-capabilities/access.d.ts.map +1 -0
- package/dist/lib/native-capabilities/access.js +53 -0
- package/dist/lib/native-capabilities/bluetooth-access.d.ts +14 -0
- package/dist/lib/native-capabilities/bluetooth-access.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-access.js +43 -0
- package/dist/lib/native-capabilities/bluetooth-connection.d.ts +19 -0
- package/dist/lib/native-capabilities/bluetooth-connection.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-connection.js +88 -0
- package/dist/lib/native-capabilities/bluetooth-gatt.d.ts +7 -0
- package/dist/lib/native-capabilities/bluetooth-gatt.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-gatt.js +77 -0
- package/dist/lib/native-capabilities/bluetooth-internal.d.ts +10 -0
- package/dist/lib/native-capabilities/bluetooth-internal.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-internal.js +105 -0
- package/dist/lib/native-capabilities/bluetooth-native-fallback.d.ts +33 -0
- package/dist/lib/native-capabilities/bluetooth-native-fallback.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-native-fallback.js +214 -0
- package/dist/lib/native-capabilities/bluetooth-types.d.ts +85 -0
- package/dist/lib/native-capabilities/bluetooth-types.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth-types.js +2 -0
- package/dist/lib/native-capabilities/bluetooth.d.ts +7 -0
- package/dist/lib/native-capabilities/bluetooth.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bluetooth.js +4 -0
- package/dist/lib/native-capabilities/bridge.d.ts +23 -0
- package/dist/lib/native-capabilities/bridge.d.ts.map +1 -0
- package/dist/lib/native-capabilities/bridge.js +266 -0
- package/dist/lib/native-capabilities/capabilities.d.ts +7 -0
- package/dist/lib/native-capabilities/capabilities.d.ts.map +1 -0
- package/dist/lib/native-capabilities/capabilities.js +95 -0
- package/dist/lib/native-capabilities/clipboard.d.ts +11 -0
- package/dist/lib/native-capabilities/clipboard.d.ts.map +1 -0
- package/dist/lib/native-capabilities/clipboard.js +58 -0
- package/dist/lib/native-capabilities/device-io-errors.d.ts +11 -0
- package/dist/lib/native-capabilities/device-io-errors.d.ts.map +1 -0
- package/dist/lib/native-capabilities/device-io-errors.js +82 -0
- package/dist/lib/native-capabilities/displays.d.ts +38 -0
- package/dist/lib/native-capabilities/displays.d.ts.map +1 -0
- package/dist/lib/native-capabilities/displays.js +12 -0
- package/dist/lib/native-capabilities/global-shortcuts.d.ts +86 -0
- package/dist/lib/native-capabilities/global-shortcuts.d.ts.map +1 -0
- package/dist/lib/native-capabilities/global-shortcuts.js +351 -0
- package/dist/lib/native-capabilities/haptics.d.ts +25 -0
- package/dist/lib/native-capabilities/haptics.d.ts.map +1 -0
- package/dist/lib/native-capabilities/haptics.js +18 -0
- package/dist/lib/native-capabilities/hid-native.d.ts +26 -0
- package/dist/lib/native-capabilities/hid-native.d.ts.map +1 -0
- package/dist/lib/native-capabilities/hid-native.js +229 -0
- package/dist/lib/native-capabilities/hid.d.ts +52 -0
- package/dist/lib/native-capabilities/hid.d.ts.map +1 -0
- package/dist/lib/native-capabilities/hid.js +163 -0
- package/dist/lib/native-capabilities/index.d.ts +40 -0
- package/dist/lib/native-capabilities/index.d.ts.map +1 -0
- package/dist/lib/native-capabilities/index.js +21 -0
- package/dist/lib/native-capabilities/local-authentication.d.ts +32 -0
- package/dist/lib/native-capabilities/local-authentication.d.ts.map +1 -0
- package/dist/lib/native-capabilities/local-authentication.js +46 -0
- package/dist/lib/native-capabilities/location.d.ts +49 -0
- package/dist/lib/native-capabilities/location.d.ts.map +1 -0
- package/dist/lib/native-capabilities/location.js +114 -0
- package/dist/lib/native-capabilities/media-permissions.d.ts +28 -0
- package/dist/lib/native-capabilities/media-permissions.d.ts.map +1 -0
- package/dist/lib/native-capabilities/media-permissions.js +37 -0
- package/dist/lib/native-capabilities/media.d.ts +17 -0
- package/dist/lib/native-capabilities/media.d.ts.map +1 -0
- package/dist/lib/native-capabilities/media.js +104 -0
- package/dist/lib/native-capabilities/midi-access.d.ts +13 -0
- package/dist/lib/native-capabilities/midi-access.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi-access.js +68 -0
- package/dist/lib/native-capabilities/midi-internal.d.ts +12 -0
- package/dist/lib/native-capabilities/midi-internal.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi-internal.js +88 -0
- package/dist/lib/native-capabilities/midi-native-fallback.d.ts +27 -0
- package/dist/lib/native-capabilities/midi-native-fallback.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi-native-fallback.js +127 -0
- package/dist/lib/native-capabilities/midi-ports.d.ts +6 -0
- package/dist/lib/native-capabilities/midi-ports.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi-ports.js +115 -0
- package/dist/lib/native-capabilities/midi-types.d.ts +25 -0
- package/dist/lib/native-capabilities/midi-types.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi-types.js +1 -0
- package/dist/lib/native-capabilities/midi.d.ts +6 -0
- package/dist/lib/native-capabilities/midi.d.ts.map +1 -0
- package/dist/lib/native-capabilities/midi.js +3 -0
- package/dist/lib/native-capabilities/native-device-io.d.ts +28 -0
- package/dist/lib/native-capabilities/native-device-io.d.ts.map +1 -0
- package/dist/lib/native-capabilities/native-device-io.js +91 -0
- package/dist/lib/native-capabilities/native-device-lifecycle.d.ts +13 -0
- package/dist/lib/native-capabilities/native-device-lifecycle.d.ts.map +1 -0
- package/dist/lib/native-capabilities/native-device-lifecycle.js +40 -0
- package/dist/lib/native-capabilities/notifications.d.ts +38 -0
- package/dist/lib/native-capabilities/notifications.d.ts.map +1 -0
- package/dist/lib/native-capabilities/notifications.js +50 -0
- package/dist/lib/native-capabilities/power-session.d.ts +113 -0
- package/dist/lib/native-capabilities/power-session.d.ts.map +1 -0
- package/dist/lib/native-capabilities/power-session.js +264 -0
- package/dist/lib/native-capabilities/secure-storage.d.ts +36 -0
- package/dist/lib/native-capabilities/secure-storage.d.ts.map +1 -0
- package/dist/lib/native-capabilities/secure-storage.js +64 -0
- package/dist/lib/native-capabilities/serial-native.d.ts +23 -0
- package/dist/lib/native-capabilities/serial-native.d.ts.map +1 -0
- package/dist/lib/native-capabilities/serial-native.js +181 -0
- package/dist/lib/native-capabilities/serial.d.ts +76 -0
- package/dist/lib/native-capabilities/serial.d.ts.map +1 -0
- package/dist/lib/native-capabilities/serial.js +215 -0
- package/dist/lib/native-capabilities/system-audio.d.ts +127 -0
- package/dist/lib/native-capabilities/system-audio.d.ts.map +1 -0
- package/dist/lib/native-capabilities/system-audio.js +330 -0
- package/dist/lib/native-capabilities/types.d.ts +62 -0
- package/dist/lib/native-capabilities/types.d.ts.map +1 -0
- package/dist/lib/native-capabilities/types.js +27 -0
- package/dist/lib/native-capabilities/usb-native.d.ts +39 -0
- package/dist/lib/native-capabilities/usb-native.d.ts.map +1 -0
- package/dist/lib/native-capabilities/usb-native.js +217 -0
- package/dist/lib/native-capabilities/usb.d.ts +85 -0
- package/dist/lib/native-capabilities/usb.d.ts.map +1 -0
- package/dist/lib/native-capabilities/usb.js +225 -0
- package/docs/README.md +37 -0
- package/docs/accessibility.md +32 -0
- package/docs/app-anatomy.md +72 -0
- package/docs/component-catalog.md +59 -0
- package/docs/component-guide-template.md +37 -0
- package/docs/design-tokens.md +172 -0
- package/docs/foundations.md +56 -0
- package/docs/native-integration.md +33 -0
- package/docs/standalone-app-windows.md +128 -0
- package/package.json +9 -3
- package/src/components/ui/alert.md +55 -0
- package/src/components/ui/app-frame.md +33 -0
- package/src/components/ui/badge.md +57 -0
- package/src/components/ui/button.md +76 -0
- package/src/components/ui/color-well.md +11 -0
- package/src/components/ui/combobox.md +43 -0
- package/src/components/ui/date-field.md +32 -0
- package/src/components/ui/edge-fade.md +7 -0
- package/src/components/ui/empty.md +82 -0
- package/src/components/ui/field.md +77 -0
- package/src/components/ui/grid.md +105 -0
- package/src/components/ui/icon-button.md +36 -0
- package/src/components/ui/inspector.md +11 -0
- package/src/components/ui/item.md +87 -0
- package/src/components/ui/list.md +107 -0
- package/src/components/ui/notification-dot.md +7 -0
- package/src/components/ui/number-input.md +19 -0
- package/src/components/ui/panel.md +11 -0
- package/src/components/ui/resizable.md +66 -0
- package/src/components/ui/scroll-area.md +68 -0
- package/src/components/ui/search-field.md +33 -0
- package/src/components/ui/segmented-control.md +39 -0
- package/src/components/ui/sidebar.md +113 -0
- package/src/components/ui/sonner.md +37 -0
- package/src/components/ui/split-view.md +15 -0
- package/src/components/ui/status.md +12 -0
- package/src/components/ui/table.md +35 -0
- package/src/components/ui/tabs.md +66 -0
- package/src/components/ui/text.md +17 -0
- package/src/components/ui/toggle-group.md +80 -0
- package/src/components/ui/toggle.md +73 -0
- package/src/components/ui/toolbar.md +21 -0
- package/src/styles/index.css +491 -3
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { NativeCapabilityBridgeError } from './bridge';
|
|
2
|
+
import { bytesFromNativeDeviceResult, bytesWrittenFromNativeDeviceResult, closeMoldableNativeDevice, executeMoldableNativeDeviceOperation, openMoldableNativeDevice, } from './native-device-io';
|
|
3
|
+
import { NativeDeviceLifecycle, isNativeDeviceDisconnect, } from './native-device-lifecycle';
|
|
4
|
+
export class NativeMoldableSerialPort extends EventTarget {
|
|
5
|
+
descriptor;
|
|
6
|
+
readable = null;
|
|
7
|
+
writable = null;
|
|
8
|
+
handle;
|
|
9
|
+
closing;
|
|
10
|
+
lifecycle = new NativeDeviceLifecycle();
|
|
11
|
+
constructor(descriptor) {
|
|
12
|
+
super();
|
|
13
|
+
this.descriptor = descriptor;
|
|
14
|
+
}
|
|
15
|
+
get connected() {
|
|
16
|
+
return this.lifecycle.connected;
|
|
17
|
+
}
|
|
18
|
+
getInfo() {
|
|
19
|
+
return {
|
|
20
|
+
usbVendorId: this.descriptor.vendorId,
|
|
21
|
+
usbProductId: this.descriptor.productId,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async open(options) {
|
|
25
|
+
if (this.closing)
|
|
26
|
+
await this.closing;
|
|
27
|
+
if (this.handle && this.lifecycle.disconnected)
|
|
28
|
+
await this.close();
|
|
29
|
+
if (this.handle) {
|
|
30
|
+
throw new DOMException('Serial port is already open.', 'InvalidStateError');
|
|
31
|
+
}
|
|
32
|
+
if (options.bufferSize !== undefined) {
|
|
33
|
+
throw new NativeCapabilityBridgeError({
|
|
34
|
+
code: 'unsupported',
|
|
35
|
+
message: 'The native serial fallback does not support bufferSize.',
|
|
36
|
+
retryable: false,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const opened = await openMoldableNativeDevice('serial', this.descriptor.selector, {
|
|
40
|
+
baudRate: options.baudRate,
|
|
41
|
+
dataBits: options.dataBits,
|
|
42
|
+
stopBits: options.stopBits,
|
|
43
|
+
parity: options.parity,
|
|
44
|
+
flowControl: options.flowControl,
|
|
45
|
+
});
|
|
46
|
+
if (opened.kind !== 'serial')
|
|
47
|
+
throw new Error('Native device kind mismatch.');
|
|
48
|
+
this.handle = opened.handle;
|
|
49
|
+
this.lifecycle.didOpen();
|
|
50
|
+
this.readable = this.createReadable();
|
|
51
|
+
this.writable = this.createWritable();
|
|
52
|
+
}
|
|
53
|
+
async close() {
|
|
54
|
+
if (this.closing)
|
|
55
|
+
return this.closing;
|
|
56
|
+
if (!this.handle)
|
|
57
|
+
return;
|
|
58
|
+
const handle = this.handle;
|
|
59
|
+
const closing = closeMoldableNativeDevice('serial', handle)
|
|
60
|
+
.then(() => {
|
|
61
|
+
if (this.handle === handle) {
|
|
62
|
+
this.handle = undefined;
|
|
63
|
+
this.readable = null;
|
|
64
|
+
this.writable = null;
|
|
65
|
+
this.lifecycle.didClose();
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
.finally(() => {
|
|
69
|
+
if (this.closing === closing)
|
|
70
|
+
this.closing = undefined;
|
|
71
|
+
});
|
|
72
|
+
this.closing = closing;
|
|
73
|
+
return closing;
|
|
74
|
+
}
|
|
75
|
+
async forget() {
|
|
76
|
+
await this.close();
|
|
77
|
+
}
|
|
78
|
+
async getSignals() {
|
|
79
|
+
const result = await this.execute({ action: 'serialGetSignals' });
|
|
80
|
+
if (result.kind !== 'signals' ||
|
|
81
|
+
typeof result.dataCarrierDetect !== 'boolean' ||
|
|
82
|
+
typeof result.clearToSend !== 'boolean' ||
|
|
83
|
+
typeof result.ringIndicator !== 'boolean' ||
|
|
84
|
+
typeof result.dataSetReady !== 'boolean') {
|
|
85
|
+
throw new NativeCapabilityBridgeError({
|
|
86
|
+
code: 'invalid_response',
|
|
87
|
+
message: 'Moldable returned invalid serial signals.',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
dataCarrierDetect: result.dataCarrierDetect,
|
|
92
|
+
clearToSend: result.clearToSend,
|
|
93
|
+
ringIndicator: result.ringIndicator,
|
|
94
|
+
dataSetReady: result.dataSetReady,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async setSignals(signals) {
|
|
98
|
+
await this.execute({
|
|
99
|
+
action: 'serialSetSignals',
|
|
100
|
+
dataTerminalReady: signals.dataTerminalReady,
|
|
101
|
+
requestToSend: signals.requestToSend,
|
|
102
|
+
sendBreak: signals.break,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
createReadable() {
|
|
106
|
+
return new ReadableStream({
|
|
107
|
+
pull: async (controller) => {
|
|
108
|
+
if (!this.handle) {
|
|
109
|
+
controller.close();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const result = await this.execute({
|
|
114
|
+
action: 'read',
|
|
115
|
+
endpoint: null,
|
|
116
|
+
length: 65_536,
|
|
117
|
+
timeoutMs: 1_000,
|
|
118
|
+
bulk: false,
|
|
119
|
+
});
|
|
120
|
+
const bytes = bytesFromNativeDeviceResult(result);
|
|
121
|
+
if (bytes.length > 0)
|
|
122
|
+
controller.enqueue(bytes);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof NativeCapabilityBridgeError &&
|
|
126
|
+
error.code === 'timeout') {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
controller.error(error);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
createWritable() {
|
|
135
|
+
return new WritableStream({
|
|
136
|
+
write: async (data) => {
|
|
137
|
+
const result = await this.execute({
|
|
138
|
+
action: 'write',
|
|
139
|
+
endpoint: null,
|
|
140
|
+
data: [...data],
|
|
141
|
+
timeoutMs: 10_000,
|
|
142
|
+
bulk: false,
|
|
143
|
+
});
|
|
144
|
+
if (bytesWrittenFromNativeDeviceResult(result) !== data.byteLength) {
|
|
145
|
+
throw new NativeCapabilityBridgeError({
|
|
146
|
+
code: 'host_error',
|
|
147
|
+
message: 'The serial device accepted only part of the write.',
|
|
148
|
+
retryable: true,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async execute(operation) {
|
|
155
|
+
if (!this.handle) {
|
|
156
|
+
throw new NativeCapabilityBridgeError({
|
|
157
|
+
code: 'invalid_request',
|
|
158
|
+
message: 'Serial port is not open.',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (this.lifecycle.disconnected) {
|
|
162
|
+
throw new NativeCapabilityBridgeError({
|
|
163
|
+
code: 'unavailable',
|
|
164
|
+
message: 'Serial device is disconnected.',
|
|
165
|
+
retryable: true,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
return await executeMoldableNativeDeviceOperation('serial', this.handle, operation);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (isNativeDeviceDisconnect(error)) {
|
|
173
|
+
this.lifecycle.didDisconnect(this, error);
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export function isNativeMoldableSerialPort(port) {
|
|
180
|
+
return port instanceof NativeMoldableSerialPort;
|
|
181
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export interface MoldableSerialOperationOptions {
|
|
2
|
+
signal?: AbortSignal;
|
|
3
|
+
}
|
|
4
|
+
export type MoldableBluetoothServiceUuid = number | string;
|
|
5
|
+
export interface MoldableSerialPortFilter {
|
|
6
|
+
usbVendorId?: number;
|
|
7
|
+
usbProductId?: number;
|
|
8
|
+
bluetoothServiceClassId?: MoldableBluetoothServiceUuid;
|
|
9
|
+
}
|
|
10
|
+
export interface MoldableSerialOpenOptions {
|
|
11
|
+
baudRate: number;
|
|
12
|
+
dataBits?: 7 | 8;
|
|
13
|
+
stopBits?: 1 | 2;
|
|
14
|
+
parity?: 'none' | 'even' | 'odd';
|
|
15
|
+
bufferSize?: number;
|
|
16
|
+
flowControl?: 'none' | 'hardware';
|
|
17
|
+
}
|
|
18
|
+
export interface MoldableSerialPortInfo {
|
|
19
|
+
usbVendorId?: number;
|
|
20
|
+
usbProductId?: number;
|
|
21
|
+
bluetoothServiceClassId?: MoldableBluetoothServiceUuid;
|
|
22
|
+
}
|
|
23
|
+
export interface MoldableSerialInputSignals {
|
|
24
|
+
dataCarrierDetect: boolean;
|
|
25
|
+
clearToSend: boolean;
|
|
26
|
+
ringIndicator: boolean;
|
|
27
|
+
dataSetReady: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface MoldableSerialOutputSignals {
|
|
30
|
+
dataTerminalReady?: boolean;
|
|
31
|
+
requestToSend?: boolean;
|
|
32
|
+
break?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Structural subset of the standard SerialPort interface used by the helpers. */
|
|
35
|
+
export interface MoldableSerialPort extends EventTarget {
|
|
36
|
+
readonly readable: ReadableStream<Uint8Array> | null;
|
|
37
|
+
readonly writable: WritableStream<Uint8Array> | null;
|
|
38
|
+
readonly connected?: boolean;
|
|
39
|
+
getInfo(): MoldableSerialPortInfo;
|
|
40
|
+
open(options: MoldableSerialOpenOptions): Promise<void>;
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
forget?(): Promise<void>;
|
|
43
|
+
getSignals(): Promise<MoldableSerialInputSignals>;
|
|
44
|
+
setSignals(signals: MoldableSerialOutputSignals): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export interface MoldableSerialRequestOptions extends MoldableSerialOperationOptions {
|
|
47
|
+
filters?: readonly MoldableSerialPortFilter[];
|
|
48
|
+
allowedBluetoothServiceClassIds?: readonly MoldableBluetoothServiceUuid[];
|
|
49
|
+
/** Required when multiple native fallback ports match. Render a user choice. */
|
|
50
|
+
selectNativePort?: (ports: readonly MoldableSerialPort[]) => MoldableSerialPort | Promise<MoldableSerialPort>;
|
|
51
|
+
}
|
|
52
|
+
/** Returns true only when this WebView exposes the Web Serial entry point. */
|
|
53
|
+
export declare function isMoldableSerialSupported(): boolean;
|
|
54
|
+
/** Lists ports previously authorized through Web Serial. */
|
|
55
|
+
export declare function getMoldableSerialPorts(): Promise<MoldableSerialPort[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Shows the browser's serial-port chooser. Call this directly from a user
|
|
58
|
+
* gesture. Aborting stops awaiting the result but may not dismiss the chooser.
|
|
59
|
+
*/
|
|
60
|
+
export declare function requestMoldableSerialPort(options?: MoldableSerialRequestOptions): Promise<MoldableSerialPort>;
|
|
61
|
+
export declare function openMoldableSerialPort(port: MoldableSerialPort, options: MoldableSerialOpenOptions): Promise<void>;
|
|
62
|
+
/** Closes a port after callers have released all stream readers and writers. */
|
|
63
|
+
export declare function closeMoldableSerialPort(port: MoldableSerialPort): Promise<void>;
|
|
64
|
+
/** Revokes the saved permission when the runtime supports SerialPort.forget(). */
|
|
65
|
+
export declare function forgetMoldableSerialPort(port: MoldableSerialPort): Promise<void>;
|
|
66
|
+
export declare function getMoldableSerialSignals(port: MoldableSerialPort): Promise<MoldableSerialInputSignals>;
|
|
67
|
+
export declare function setMoldableSerialSignals(port: MoldableSerialPort, signals: MoldableSerialOutputSignals): Promise<void>;
|
|
68
|
+
/** Reads one available serial chunk and always releases the stream reader. */
|
|
69
|
+
export declare function readMoldableSerialPort(port: MoldableSerialPort, options?: MoldableSerialOperationOptions): Promise<ReadableStreamReadResult<Uint8Array>>;
|
|
70
|
+
/**
|
|
71
|
+
* Writes one serial chunk and releases the stream writer. Aborting rejects the
|
|
72
|
+
* helper promptly and asks the stream to abort; the browser may finish an
|
|
73
|
+
* already-started hardware write before releasing the lock.
|
|
74
|
+
*/
|
|
75
|
+
export declare function writeMoldableSerialPort(port: MoldableSerialPort, data: Uint8Array, options?: MoldableSerialOperationOptions): Promise<void>;
|
|
76
|
+
//# sourceMappingURL=serial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial.d.ts","sourceRoot":"","sources":["../../../src/lib/native-capabilities/serial.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { assertMoldableNativeCapabilityAccess, requireMoldableNativeCapabilityAccess, } from './access';
|
|
2
|
+
import { NativeCapabilityBridgeError } from './bridge';
|
|
3
|
+
import { abortedDeviceIoError, awaitDeviceIoWithAbort, deviceIoError, unsupportedDeviceIoError, } from './device-io-errors';
|
|
4
|
+
import { listMoldableNativeDevices } from './native-device-io';
|
|
5
|
+
import { NativeMoldableSerialPort } from './serial-native';
|
|
6
|
+
function assertNativeSerialFiltersSupported(options) {
|
|
7
|
+
if (options.allowedBluetoothServiceClassIds?.length ||
|
|
8
|
+
options.filters?.some((filter) => filter.bluetoothServiceClassId !== undefined)) {
|
|
9
|
+
throw new NativeCapabilityBridgeError({
|
|
10
|
+
code: 'unsupported',
|
|
11
|
+
message: 'The native serial fallback cannot match Bluetooth service identifiers on this platform.',
|
|
12
|
+
retryable: false,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function serialApi() {
|
|
17
|
+
const api = typeof navigator === 'undefined'
|
|
18
|
+
? undefined
|
|
19
|
+
: navigator.serial;
|
|
20
|
+
if (!api)
|
|
21
|
+
throw unsupportedDeviceIoError('serial');
|
|
22
|
+
return api;
|
|
23
|
+
}
|
|
24
|
+
/** Returns true only when this WebView exposes the Web Serial entry point. */
|
|
25
|
+
export function isMoldableSerialSupported() {
|
|
26
|
+
return (typeof navigator !== 'undefined' &&
|
|
27
|
+
!!navigator.serial);
|
|
28
|
+
}
|
|
29
|
+
/** Lists ports previously authorized through Web Serial. */
|
|
30
|
+
export async function getMoldableSerialPorts() {
|
|
31
|
+
await assertMoldableNativeCapabilityAccess('serial');
|
|
32
|
+
if (!isMoldableSerialSupported()) {
|
|
33
|
+
throw unsupportedDeviceIoError('serial');
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return await serialApi().getPorts();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw deviceIoError('serial', 'enumerate', error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Shows the browser's serial-port chooser. Call this directly from a user
|
|
44
|
+
* gesture. Aborting stops awaiting the result but may not dismiss the chooser.
|
|
45
|
+
*/
|
|
46
|
+
export async function requestMoldableSerialPort(options = {}) {
|
|
47
|
+
await requireMoldableNativeCapabilityAccess('serial', options);
|
|
48
|
+
if (!isMoldableSerialSupported()) {
|
|
49
|
+
assertNativeSerialFiltersSupported(options);
|
|
50
|
+
const descriptors = await listMoldableNativeDevices('serial', {
|
|
51
|
+
signal: options.signal,
|
|
52
|
+
...(options.filters
|
|
53
|
+
? {
|
|
54
|
+
filters: options.filters.map(({ usbVendorId, usbProductId }) => ({
|
|
55
|
+
vendorId: usbVendorId,
|
|
56
|
+
productId: usbProductId,
|
|
57
|
+
})),
|
|
58
|
+
}
|
|
59
|
+
: {}),
|
|
60
|
+
});
|
|
61
|
+
const ports = descriptors
|
|
62
|
+
.filter((descriptor) => !options.filters || options.filters.length === 0
|
|
63
|
+
? true
|
|
64
|
+
: options.filters.some((filter) => (filter.usbVendorId === undefined ||
|
|
65
|
+
filter.usbVendorId === descriptor.vendorId) &&
|
|
66
|
+
(filter.usbProductId === undefined ||
|
|
67
|
+
filter.usbProductId === descriptor.productId)))
|
|
68
|
+
.map((descriptor) => new NativeMoldableSerialPort(descriptor));
|
|
69
|
+
if (ports.length === 0) {
|
|
70
|
+
throw deviceIoError('serial', 'request', new DOMException('No matching serial port is available.', 'NotFoundError'));
|
|
71
|
+
}
|
|
72
|
+
if (ports.length === 1)
|
|
73
|
+
return ports[0];
|
|
74
|
+
if (!options.selectNativePort) {
|
|
75
|
+
throw deviceIoError('serial', 'request', new TypeError('A native port selector is required when multiple serial ports match.'));
|
|
76
|
+
}
|
|
77
|
+
const selected = await options.selectNativePort(ports);
|
|
78
|
+
if (!ports.includes(selected)) {
|
|
79
|
+
throw deviceIoError('serial', 'request', new TypeError('Invalid native serial selection.'));
|
|
80
|
+
}
|
|
81
|
+
return selected;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
return await awaitDeviceIoWithAbort(serialApi().requestPort({
|
|
85
|
+
...(options.filters ? { filters: [...options.filters] } : {}),
|
|
86
|
+
...(options.allowedBluetoothServiceClassIds
|
|
87
|
+
? {
|
|
88
|
+
allowedBluetoothServiceClassIds: [
|
|
89
|
+
...options.allowedBluetoothServiceClassIds,
|
|
90
|
+
],
|
|
91
|
+
}
|
|
92
|
+
: {}),
|
|
93
|
+
}), 'serial', 'request', options.signal);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw deviceIoError('serial', 'request', error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function openMoldableSerialPort(port, options) {
|
|
100
|
+
try {
|
|
101
|
+
await port.open(options);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw deviceIoError('serial', 'open', error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Closes a port after callers have released all stream readers and writers. */
|
|
108
|
+
export async function closeMoldableSerialPort(port) {
|
|
109
|
+
if (port.readable?.locked || port.writable?.locked) {
|
|
110
|
+
throw deviceIoError('serial', 'close', new DOMException('Release active serial stream readers and writers before closing.', 'InvalidStateError'));
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await port.close();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw deviceIoError('serial', 'close', error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Revokes the saved permission when the runtime supports SerialPort.forget(). */
|
|
120
|
+
export async function forgetMoldableSerialPort(port) {
|
|
121
|
+
if (typeof port.forget !== 'function') {
|
|
122
|
+
throw unsupportedDeviceIoError('serial');
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
await port.forget();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw deviceIoError('serial', 'close', error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export async function getMoldableSerialSignals(port) {
|
|
132
|
+
try {
|
|
133
|
+
return await port.getSignals();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
throw deviceIoError('serial', 'read', error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export async function setMoldableSerialSignals(port, signals) {
|
|
140
|
+
try {
|
|
141
|
+
await port.setSignals(signals);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw deviceIoError('serial', 'write', error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Reads one available serial chunk and always releases the stream reader. */
|
|
148
|
+
export async function readMoldableSerialPort(port, options = {}) {
|
|
149
|
+
if (options.signal?.aborted) {
|
|
150
|
+
throw abortedDeviceIoError('serial', 'read');
|
|
151
|
+
}
|
|
152
|
+
if (!port.readable) {
|
|
153
|
+
throw deviceIoError('serial', 'read', new DOMException('Serial port is not readable.', 'InvalidStateError'));
|
|
154
|
+
}
|
|
155
|
+
const reader = port.readable.getReader();
|
|
156
|
+
let aborted = false;
|
|
157
|
+
const handleAbort = () => {
|
|
158
|
+
aborted = true;
|
|
159
|
+
void reader.cancel().catch(() => undefined);
|
|
160
|
+
};
|
|
161
|
+
options.signal?.addEventListener('abort', handleAbort, { once: true });
|
|
162
|
+
try {
|
|
163
|
+
const result = await reader.read();
|
|
164
|
+
if (aborted)
|
|
165
|
+
throw abortedDeviceIoError('serial', 'read');
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
throw deviceIoError('serial', 'read', error);
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
options.signal?.removeEventListener('abort', handleAbort);
|
|
173
|
+
reader.releaseLock();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Writes one serial chunk and releases the stream writer. Aborting rejects the
|
|
178
|
+
* helper promptly and asks the stream to abort; the browser may finish an
|
|
179
|
+
* already-started hardware write before releasing the lock.
|
|
180
|
+
*/
|
|
181
|
+
export async function writeMoldableSerialPort(port, data, options = {}) {
|
|
182
|
+
if (options.signal?.aborted) {
|
|
183
|
+
throw abortedDeviceIoError('serial', 'write');
|
|
184
|
+
}
|
|
185
|
+
if (!port.writable) {
|
|
186
|
+
throw deviceIoError('serial', 'write', new DOMException('Serial port is not writable.', 'InvalidStateError'));
|
|
187
|
+
}
|
|
188
|
+
const writer = port.writable.getWriter();
|
|
189
|
+
let settled = false;
|
|
190
|
+
let abortPromise;
|
|
191
|
+
const writePromise = writer.write(data).finally(() => {
|
|
192
|
+
settled = true;
|
|
193
|
+
});
|
|
194
|
+
const handleAbort = () => {
|
|
195
|
+
abortPromise = writer.abort(new DOMException('Serial write aborted.', 'AbortError'));
|
|
196
|
+
};
|
|
197
|
+
options.signal?.addEventListener('abort', handleAbort, { once: true });
|
|
198
|
+
try {
|
|
199
|
+
await awaitDeviceIoWithAbort(writePromise, 'serial', 'write', options.signal);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
throw deviceIoError('serial', 'write', error);
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
options.signal?.removeEventListener('abort', handleAbort);
|
|
206
|
+
if (settled) {
|
|
207
|
+
writer.releaseLock();
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
void Promise.allSettled([writePromise, abortPromise]).then(() => {
|
|
211
|
+
writer.releaseLock();
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { type NativeCapabilityBridgeOptions } from './bridge';
|
|
2
|
+
export declare const NATIVE_SYSTEM_AUDIO_MAX_REPLAY_FRAMES = 500;
|
|
3
|
+
export declare const NATIVE_SYSTEM_AUDIO_PERMISSION_REQUEST_TIMEOUT_MS = 125000;
|
|
4
|
+
export type MoldableSystemAudioCaptureMode = 'systemAudio' | 'systemMicrophone';
|
|
5
|
+
export type MoldableSystemAudioSource = 'microphone' | 'system';
|
|
6
|
+
export interface MoldableSystemAudioCapabilities {
|
|
7
|
+
osVersion: string;
|
|
8
|
+
osSupported: boolean;
|
|
9
|
+
microphonePermission: string;
|
|
10
|
+
canCaptureMicrophone: boolean;
|
|
11
|
+
screenCapturePermission: string;
|
|
12
|
+
systemAudioPermission: string;
|
|
13
|
+
systemAudioPermissionPreflight: string;
|
|
14
|
+
systemAudioPermissionRequest: string;
|
|
15
|
+
systemAudioPermissionGuidance: string;
|
|
16
|
+
screenCaptureKitAvailable: boolean;
|
|
17
|
+
coreAudioProcessTapAvailable: boolean;
|
|
18
|
+
defaultInputDeviceAvailable: boolean;
|
|
19
|
+
defaultInputDevice?: string | null;
|
|
20
|
+
defaultOutputDeviceAvailable: boolean;
|
|
21
|
+
defaultOutputDevice?: string | null;
|
|
22
|
+
canRequestSystemAudioPermission: boolean;
|
|
23
|
+
systemAudioPermissionRequired: boolean;
|
|
24
|
+
canCaptureSystemAudio: boolean;
|
|
25
|
+
architecture: Record<string, unknown>;
|
|
26
|
+
degradedReason?: string | null;
|
|
27
|
+
}
|
|
28
|
+
export interface MoldableSystemAudioCapabilityResult {
|
|
29
|
+
available: boolean;
|
|
30
|
+
capabilities: MoldableSystemAudioCapabilities;
|
|
31
|
+
requested?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface MoldableSystemAudioSourceState {
|
|
34
|
+
active: boolean;
|
|
35
|
+
lastAudioAtMs?: number | null;
|
|
36
|
+
frameCount: number;
|
|
37
|
+
peak?: number | null;
|
|
38
|
+
rms?: number | null;
|
|
39
|
+
}
|
|
40
|
+
export interface MoldableSystemAudioStatus {
|
|
41
|
+
active: boolean;
|
|
42
|
+
sessionId?: string | null;
|
|
43
|
+
mode?: string | null;
|
|
44
|
+
desiredState?: string | null;
|
|
45
|
+
actualState?: string | null;
|
|
46
|
+
startedAtMs?: number | null;
|
|
47
|
+
lastHeartbeatAtMs?: number | null;
|
|
48
|
+
restartCount: number;
|
|
49
|
+
restartLimit: number;
|
|
50
|
+
restartWindowStartedAtMs?: number | null;
|
|
51
|
+
lastCrashReason?: string | null;
|
|
52
|
+
degradedReason?: string | null;
|
|
53
|
+
sidecarPid?: number | null;
|
|
54
|
+
sidecarMemoryBytes?: number | null;
|
|
55
|
+
memoryLimitBytes: number;
|
|
56
|
+
stopRequestedAtMs?: number | null;
|
|
57
|
+
stopReason?: string | null;
|
|
58
|
+
sources?: {
|
|
59
|
+
microphone: MoldableSystemAudioSourceState;
|
|
60
|
+
system: MoldableSystemAudioSourceState;
|
|
61
|
+
} | null;
|
|
62
|
+
aec?: Record<string, unknown> | null;
|
|
63
|
+
}
|
|
64
|
+
export interface MoldableSystemAudioStartResult {
|
|
65
|
+
started: true;
|
|
66
|
+
sessionId: string;
|
|
67
|
+
}
|
|
68
|
+
export type MoldableSystemAudioEvent = {
|
|
69
|
+
kind: 'started';
|
|
70
|
+
sessionId?: string;
|
|
71
|
+
} | {
|
|
72
|
+
kind: 'stopped';
|
|
73
|
+
sessionId?: string;
|
|
74
|
+
reason?: string;
|
|
75
|
+
} | {
|
|
76
|
+
kind: 'error';
|
|
77
|
+
sessionId?: string;
|
|
78
|
+
message?: string;
|
|
79
|
+
recoverable: boolean;
|
|
80
|
+
} | {
|
|
81
|
+
kind: 'data';
|
|
82
|
+
sessionId: string;
|
|
83
|
+
sequence: number;
|
|
84
|
+
source: MoldableSystemAudioSource;
|
|
85
|
+
/** Interleaved signed 16-bit little-endian PCM. */
|
|
86
|
+
data: ArrayBuffer;
|
|
87
|
+
sampleRate?: number;
|
|
88
|
+
channels?: number;
|
|
89
|
+
frameCount?: number;
|
|
90
|
+
peak?: number;
|
|
91
|
+
rms?: number;
|
|
92
|
+
};
|
|
93
|
+
export type MoldableSystemAudioEventListener = (event: MoldableSystemAudioEvent) => void;
|
|
94
|
+
export type UnsubscribeMoldableSystemAudioEvents = () => void;
|
|
95
|
+
export interface MoldableSystemAudioStartOptions extends NativeCapabilityBridgeOptions {
|
|
96
|
+
captureMode?: MoldableSystemAudioCaptureMode;
|
|
97
|
+
sampleRate?: number;
|
|
98
|
+
channels?: number;
|
|
99
|
+
}
|
|
100
|
+
export interface MoldableSystemAudioStopOptions extends NativeCapabilityBridgeOptions {
|
|
101
|
+
reason?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface MoldableSystemAudioReplayOptions extends NativeCapabilityBridgeOptions {
|
|
104
|
+
afterSequence?: number;
|
|
105
|
+
limit?: number;
|
|
106
|
+
}
|
|
107
|
+
export interface SubscribeMoldableSystemAudioEventsOptions {
|
|
108
|
+
signal?: AbortSignal;
|
|
109
|
+
}
|
|
110
|
+
/** Reads capture support and permission diagnostics without opening audio input. */
|
|
111
|
+
export declare function getMoldableSystemAudioCapabilities(options?: NativeCapabilityBridgeOptions): Promise<MoldableSystemAudioCapabilityResult>;
|
|
112
|
+
/** Requests system-audio permission. Call this only from a direct user action. */
|
|
113
|
+
export declare function requestMoldableSystemAudioPermission(options?: NativeCapabilityBridgeOptions): Promise<MoldableSystemAudioCapabilityResult>;
|
|
114
|
+
/** Starts an owner-scoped capture session from a direct user action. */
|
|
115
|
+
export declare function startMoldableSystemAudioCapture(options?: MoldableSystemAudioStartOptions): Promise<MoldableSystemAudioStartResult>;
|
|
116
|
+
/** Reads the status of the capture session owned by this app view. */
|
|
117
|
+
export declare function getMoldableSystemAudioStatus(options?: NativeCapabilityBridgeOptions): Promise<MoldableSystemAudioStatus>;
|
|
118
|
+
/** Stops only the capture session owned by this app view. */
|
|
119
|
+
export declare function stopMoldableSystemAudioCapture(options?: MoldableSystemAudioStopOptions): Promise<boolean>;
|
|
120
|
+
/** Replays recent frames through active event subscriptions after a sequence gap. */
|
|
121
|
+
export declare function replayMoldableSystemAudioFrames(options?: MoldableSystemAudioReplayOptions): Promise<number>;
|
|
122
|
+
/**
|
|
123
|
+
* Subscribes to lifecycle and source-separated PCM frames for this app view.
|
|
124
|
+
* Subscribe before starting capture so the first lifecycle event is observable.
|
|
125
|
+
*/
|
|
126
|
+
export declare function subscribeMoldableSystemAudioEvents(listener: MoldableSystemAudioEventListener, options?: SubscribeMoldableSystemAudioEventsOptions): UnsubscribeMoldableSystemAudioEvents;
|
|
127
|
+
//# sourceMappingURL=system-audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-audio.d.ts","sourceRoot":"","sources":["../../../src/lib/native-capabilities/system-audio.ts"],"names":[],"mappings":"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"}
|