roomkit-ui 0.3.0__tar.gz
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.
- roomkit_ui-0.3.0/.github/workflows/build.yml +427 -0
- roomkit_ui-0.3.0/.github/workflows/ci.yml +107 -0
- roomkit_ui-0.3.0/.github/workflows/release.yml +102 -0
- roomkit_ui-0.3.0/.gitignore +15 -0
- roomkit_ui-0.3.0/CHANGELOG.md +868 -0
- roomkit_ui-0.3.0/CLAUDE.md +283 -0
- roomkit_ui-0.3.0/CODE_OF_CONDUCT.md +77 -0
- roomkit_ui-0.3.0/CONTRIBUTING.md +45 -0
- roomkit_ui-0.3.0/LICENSE +21 -0
- roomkit_ui-0.3.0/PKG-INFO +115 -0
- roomkit_ui-0.3.0/README.md +406 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/conversation-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/conversation-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/history-compact-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/history-compact-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/history-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/history-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/settings-sidebar-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-history/settings-sidebar-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/app.js +200 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/assets/conversation-sketch.svg +1 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/index.html +72 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-approach.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-390.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-820.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-390.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-820.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-390.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-820.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-390.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-820.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-390.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-820.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/conversation-redesign/styles.css +17 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-home-dark-compact.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-home-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-home-error-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-home-light-compact.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-home-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-live-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/home-redesign/native-live-muted-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-compact-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-compact-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-connecting-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-connecting-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-conversation-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-conversation-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-details-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-details-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-muted-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-muted-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-ready-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/live-redesign/live-ready-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/live-header-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/live-header-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-compact-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-compact-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-search-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/session-details/session-search-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/app.js +427 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/audit.css +65 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/audit.html +79 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/conformity-preview.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/conformity.html +25 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/evidence/current-ai.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/evidence/current-general.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-license-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-license-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-audio-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-audio-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-components-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-components-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-conversation-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-conversation-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-audio-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-audio-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-capture-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-capture-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-delete-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-delete-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-0-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-0-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-1-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-1-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-2-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-2-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-telemetry-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-telemetry-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-cloud-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-cloud-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-local-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-local-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-missing-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-missing-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-model-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-model-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-provider-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-provider-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-links-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-links-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-gradium-advanced-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-gradium-advanced-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-advanced-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-advanced-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-edit-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-edit-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-empty-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-empty-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-marketplace-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-marketplace-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-advanced-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-advanced-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-edit-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-edit-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-empty-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-empty-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-empty-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-empty-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-small-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-small-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-sources-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-sources-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-live-theme-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-live-theme-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-models-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-models-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-edit-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-edit-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-list-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-list-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-pipeline-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-pipeline-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-links-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-links-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-provider-manage-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-provider-manage-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-local-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-local-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-small-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-small-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-icon-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-icon-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-skills-sh-small-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-skills-sh-small-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speaker-enrollment-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speaker-enrollment-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-empty-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-empty-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-enrolled-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-enrolled-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-small-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-small-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-download-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-download-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-ready-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-ready-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-setup-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-setup-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/preview-conversation.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/preview-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/preview-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/preview-mobile.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/preview-pipeline.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/providers-integrations-preview.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/providers-integrations.html +7 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers.png +0 -0
- roomkit_ui-0.3.0/artifacts/settings-redesign/styles.css +346 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-compact-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-compact-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-details-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-details-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-failure-dark.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-failure-light.png +0 -0
- roomkit_ui-0.3.0/artifacts/tool-activity/tools-light.png +0 -0
- roomkit_ui-0.3.0/assets/icon-macos.png +0 -0
- roomkit_ui-0.3.0/assets/icon.icns +0 -0
- roomkit_ui-0.3.0/assets/icon.ico +0 -0
- roomkit_ui-0.3.0/assets/icon.png +0 -0
- roomkit_ui-0.3.0/assets/logo.svg +7 -0
- roomkit_ui-0.3.0/assets/screenshots/README.md +28 -0
- roomkit_ui-0.3.0/assets/screenshots/authentication-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/authentication-light.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/conversation-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/conversation-light.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/history-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/history-light.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/home-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/home-light.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/live-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/live-light.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/settings-dark.png +0 -0
- roomkit_ui-0.3.0/assets/screenshots/settings-light.png +0 -0
- roomkit_ui-0.3.0/docs/architecture.md +311 -0
- roomkit_ui-0.3.0/docs/features.md +635 -0
- roomkit_ui-0.3.0/docs/onboarding.md +135 -0
- roomkit_ui-0.3.0/docs/technical.md +375 -0
- roomkit_ui-0.3.0/entitlements.plist +21 -0
- roomkit_ui-0.3.0/packaging/homebrew/roomkit-ui.rb +46 -0
- roomkit_ui-0.3.0/pyproject.toml +218 -0
- roomkit_ui-0.3.0/scripts/build_app.sh +165 -0
- roomkit_ui-0.3.0/scripts/capture_screenshots.py +190 -0
- roomkit_ui-0.3.0/scripts/generate_icons.py +153 -0
- roomkit_ui-0.3.0/src/roomkit_ui/__init__.py +1 -0
- roomkit_ui-0.3.0/src/roomkit_ui/__main__.py +3 -0
- roomkit_ui-0.3.0/src/roomkit_ui/aec_dump.py +197 -0
- roomkit_ui-0.3.0/src/roomkit_ui/agent_hooks.py +117 -0
- roomkit_ui-0.3.0/src/roomkit_ui/app.py +415 -0
- roomkit_ui-0.3.0/src/roomkit_ui/assets/icon-macos.png +0 -0
- roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.icns +0 -0
- roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.ico +0 -0
- roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.png +0 -0
- roomkit_ui-0.3.0/src/roomkit_ui/assets/logo.svg +7 -0
- roomkit_ui-0.3.0/src/roomkit_ui/audio_tags.py +64 -0
- roomkit_ui-0.3.0/src/roomkit_ui/builtin_tools.py +156 -0
- roomkit_ui-0.3.0/src/roomkit_ui/call_mode.py +217 -0
- roomkit_ui-0.3.0/src/roomkit_ui/camera_capture.py +73 -0
- roomkit_ui-0.3.0/src/roomkit_ui/cleanup.py +281 -0
- roomkit_ui-0.3.0/src/roomkit_ui/cli_exec.py +239 -0
- roomkit_ui-0.3.0/src/roomkit_ui/cli_help.py +239 -0
- roomkit_ui-0.3.0/src/roomkit_ui/cli_tools.py +224 -0
- roomkit_ui-0.3.0/src/roomkit_ui/cli_tools_config.py +86 -0
- roomkit_ui-0.3.0/src/roomkit_ui/component_installer.py +152 -0
- roomkit_ui-0.3.0/src/roomkit_ui/components.py +196 -0
- roomkit_ui-0.3.0/src/roomkit_ui/constants.py +70 -0
- roomkit_ui-0.3.0/src/roomkit_ui/conversation_titles.py +84 -0
- roomkit_ui-0.3.0/src/roomkit_ui/conversations.py +337 -0
- roomkit_ui-0.3.0/src/roomkit_ui/dictation_stream.py +80 -0
- roomkit_ui-0.3.0/src/roomkit_ui/download_flight.py +88 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine.py +950 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_audio.py +492 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_callbacks.py +114 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_realtime.py +526 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_state.py +20 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_text.py +237 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_tools.py +422 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_vc.py +777 -0
- roomkit_ui-0.3.0/src/roomkit_ui/engine_vc_helpers.py +310 -0
- roomkit_ui-0.3.0/src/roomkit_ui/enrollment.py +176 -0
- roomkit_ui-0.3.0/src/roomkit_ui/env_config.py +46 -0
- roomkit_ui-0.3.0/src/roomkit_ui/features.py +323 -0
- roomkit_ui-0.3.0/src/roomkit_ui/gguf_models.py +730 -0
- roomkit_ui-0.3.0/src/roomkit_ui/hooks.py +400 -0
- roomkit_ui-0.3.0/src/roomkit_ui/hotkey.py +445 -0
- roomkit_ui-0.3.0/src/roomkit_ui/icons.py +186 -0
- roomkit_ui-0.3.0/src/roomkit_ui/idle_hangup.py +162 -0
- roomkit_ui-0.3.0/src/roomkit_ui/image_generation.py +537 -0
- roomkit_ui-0.3.0/src/roomkit_ui/image_messages.py +62 -0
- roomkit_ui-0.3.0/src/roomkit_ui/images.py +112 -0
- roomkit_ui-0.3.0/src/roomkit_ui/macos_app.py +135 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_app_bridge.py +260 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_app_state.py +53 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_auth.py +384 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_config.py +135 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_http_auth.py +96 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_manager.py +631 -0
- roomkit_ui-0.3.0/src/roomkit_ui/mcp_skills.py +173 -0
- roomkit_ui-0.3.0/src/roomkit_ui/memory.py +321 -0
- roomkit_ui-0.3.0/src/roomkit_ui/model_catalog.py +417 -0
- roomkit_ui-0.3.0/src/roomkit_ui/model_download.py +430 -0
- roomkit_ui-0.3.0/src/roomkit_ui/model_manager.py +268 -0
- roomkit_ui-0.3.0/src/roomkit_ui/paste.py +273 -0
- roomkit_ui-0.3.0/src/roomkit_ui/paste_windows.py +167 -0
- roomkit_ui-0.3.0/src/roomkit_ui/paths.py +78 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/__init__.py +91 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/anthropic.py +21 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/gemini.py +21 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/llamacpp.py +192 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/local.py +58 -0
- roomkit_ui-0.3.0/src/roomkit_ui/providers/openai.py +21 -0
- roomkit_ui-0.3.0/src/roomkit_ui/realtime_providers.py +458 -0
- roomkit_ui-0.3.0/src/roomkit_ui/secret_store.py +178 -0
- roomkit_ui-0.3.0/src/roomkit_ui/session_models.py +218 -0
- roomkit_ui-0.3.0/src/roomkit_ui/settings.py +469 -0
- roomkit_ui-0.3.0/src/roomkit_ui/settings_secrets.py +456 -0
- roomkit_ui-0.3.0/src/roomkit_ui/skill_approval.py +107 -0
- roomkit_ui-0.3.0/src/roomkit_ui/skill_git.py +136 -0
- roomkit_ui-0.3.0/src/roomkit_ui/skill_manager.py +225 -0
- roomkit_ui-0.3.0/src/roomkit_ui/skill_well_known.py +347 -0
- roomkit_ui-0.3.0/src/roomkit_ui/skills_sh_client.py +154 -0
- roomkit_ui-0.3.0/src/roomkit_ui/sounds.py +101 -0
- roomkit_ui-0.3.0/src/roomkit_ui/speaker_manager.py +100 -0
- roomkit_ui-0.3.0/src/roomkit_ui/speaker_naming.py +274 -0
- roomkit_ui-0.3.0/src/roomkit_ui/speaker_roster.py +188 -0
- roomkit_ui-0.3.0/src/roomkit_ui/stt_engine.py +519 -0
- roomkit_ui-0.3.0/src/roomkit_ui/stt_sessions.py +384 -0
- roomkit_ui-0.3.0/src/roomkit_ui/text_chat.py +75 -0
- roomkit_ui-0.3.0/src/roomkit_ui/theme.py +349 -0
- roomkit_ui-0.3.0/src/roomkit_ui/theme_live.py +71 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tool_events.py +20 -0
- roomkit_ui-0.3.0/src/roomkit_ui/toolset.py +209 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tray.py +168 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/__init__.py +55 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/_util.py +12 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/azure.py +35 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/elevenlabs.py +40 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/gemini.py +31 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/gradium.py +52 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/neutts.py +25 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/piper.py +22 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/pocket.py +95 -0
- roomkit_ui-0.3.0/src/roomkit_ui/tts/qwen3.py +25 -0
- roomkit_ui-0.3.0/src/roomkit_ui/url_policy.py +221 -0
- roomkit_ui-0.3.0/src/roomkit_ui/vc_agent.py +381 -0
- roomkit_ui-0.3.0/src/roomkit_ui/vc_stt.py +275 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/__init__.py +31 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/capture.py +312 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/controller.py +268 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/detector.py +120 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/dtw.py +55 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/encoder_download.py +55 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/enroller.py +263 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/features.py +145 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/fingerprint.py +195 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/jobs.py +95 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/listener.py +138 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/page_sensitivity.py +34 -0
- roomkit_ui-0.3.0/src/roomkit_ui/wakeword/resample.py +88 -0
- roomkit_ui-0.3.0/src/roomkit_ui/watchdog.py +194 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/__init__.py +0 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/buttons.py +28 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/camera_dialog.py +232 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/camera_process.py +165 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/chat_bubble.py +482 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/chat_view.py +552 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/composer_dictation.py +94 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_composer.py +551 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_drawer.py +300 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_history.py +359 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_home.py +176 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/dictation_log.py +78 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/hotkey_button.py +347 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/image_attachments.py +271 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/install_offer.py +124 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/main_window.py +652 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_server.py +91 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_web.py +128 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_widget.py +341 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_wrapper.py +80 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/menus.py +79 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/message_input.py +77 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/navigation_brand.py +24 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_drawer.py +357 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_info.py +76 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_loading.py +78 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/__init__.py +5 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/about_page.py +95 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/appearance.py +95 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/attitudes_page.py +218 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_capture_page.py +143 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_page.py +40 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_processing.py +338 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/catalog_controls.py +153 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/choice_cards.py +116 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/cli_tools_page.py +323 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/components_page.py +260 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/controls.py +247 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/conversation_page.py +133 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/diagnostics_page.py +57 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/dictation_page.py +192 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/feature_hints.py +89 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/general_page.py +125 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/images_setup.py +153 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/integration_controls.py +281 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/integrations_page.py +59 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/library_page.py +38 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/llm_fields.py +601 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/llm_library_page.py +526 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/mcp_page.py +657 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_combos.py +49 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_jobs.py +97 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_library.py +161 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/models_page.py +149 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/models_widgets.py +92 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/navigation.py +61 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/page_registry.py +548 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/panel.py +345 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/pipeline_summary.py +36 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/privacy_page.py +149 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/providers_page.py +281 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_catalogs.py +199 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_gemini_live.py +116 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_gpt_live.py +111 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_section.py +641 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/recordings_page.py +409 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/search.py +113 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/__init__.py +3 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/marketplace.py +209 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/my_skills.py +155 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/page.py +483 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/widgets.py +99 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_dialogs.py +200 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_muse.py +55 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_page.py +367 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/style.py +327 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/telemetry_page.py +107 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/text_chat_setup.py +52 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/tool_search_section.py +96 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_agent_fields.py +210 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_azure_fields.py +67 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_cloud_fields.py +331 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_google_fields.py +106 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_local_fields.py +226 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_meta_fields.py +32 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/voice_setup.py +330 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/wakeword_page.py +252 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/skill_approval_dialog.py +40 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/sliding_panel.py +146 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/tool_activity.py +290 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/voice_name_dialog.py +28 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/vu_meter.py +103 -0
- roomkit_ui-0.3.0/src/roomkit_ui/widgets/wakeword_wizard.py +315 -0
- roomkit_ui-0.3.0/tests/conftest.py +52 -0
- roomkit_ui-0.3.0/tests/test_aec_dump.py +104 -0
- roomkit_ui-0.3.0/tests/test_aec_fallback.py +43 -0
- roomkit_ui-0.3.0/tests/test_app_graphics.py +57 -0
- roomkit_ui-0.3.0/tests/test_asyncgen_hooks.py +47 -0
- roomkit_ui-0.3.0/tests/test_audio_tags.py +132 -0
- roomkit_ui-0.3.0/tests/test_azure_speech.py +168 -0
- roomkit_ui-0.3.0/tests/test_build_flags.py +33 -0
- roomkit_ui-0.3.0/tests/test_builtin_tools.py +48 -0
- roomkit_ui-0.3.0/tests/test_buttons.py +27 -0
- roomkit_ui-0.3.0/tests/test_call_mode.py +294 -0
- roomkit_ui-0.3.0/tests/test_camera_dialog.py +137 -0
- roomkit_ui-0.3.0/tests/test_camera_process.py +175 -0
- roomkit_ui-0.3.0/tests/test_chat_bubble_streaming.py +283 -0
- roomkit_ui-0.3.0/tests/test_chat_fade_in.py +47 -0
- roomkit_ui-0.3.0/tests/test_cleanup_fds.py +105 -0
- roomkit_ui-0.3.0/tests/test_cleanup_timers.py +64 -0
- roomkit_ui-0.3.0/tests/test_cli_help_probe.py +103 -0
- roomkit_ui-0.3.0/tests/test_cli_tools.py +453 -0
- roomkit_ui-0.3.0/tests/test_cli_tools_config.py +81 -0
- roomkit_ui-0.3.0/tests/test_cli_tools_page.py +148 -0
- roomkit_ui-0.3.0/tests/test_component_installer.py +241 -0
- roomkit_ui-0.3.0/tests/test_components.py +123 -0
- roomkit_ui-0.3.0/tests/test_composer_dictation.py +355 -0
- roomkit_ui-0.3.0/tests/test_conversation_composer.py +158 -0
- roomkit_ui-0.3.0/tests/test_conversation_history_ui.py +467 -0
- roomkit_ui-0.3.0/tests/test_conversation_titles.py +137 -0
- roomkit_ui-0.3.0/tests/test_conversations.py +277 -0
- roomkit_ui-0.3.0/tests/test_diagnostics_page.py +266 -0
- roomkit_ui-0.3.0/tests/test_diarization_cache.py +59 -0
- roomkit_ui-0.3.0/tests/test_dictation_lifecycle.py +221 -0
- roomkit_ui-0.3.0/tests/test_dictation_stream.py +296 -0
- roomkit_ui-0.3.0/tests/test_doctor.py +34 -0
- roomkit_ui-0.3.0/tests/test_dsp_threads.py +104 -0
- roomkit_ui-0.3.0/tests/test_elevenlabs_stream_input.py +43 -0
- roomkit_ui-0.3.0/tests/test_engine_cleanup.py +272 -0
- roomkit_ui-0.3.0/tests/test_engine_cli_tools.py +90 -0
- roomkit_ui-0.3.0/tests/test_engine_lifecycle.py +135 -0
- roomkit_ui-0.3.0/tests/test_engine_realtime_session.py +104 -0
- roomkit_ui-0.3.0/tests/test_engine_text.py +356 -0
- roomkit_ui-0.3.0/tests/test_engine_tool_failures.py +123 -0
- roomkit_ui-0.3.0/tests/test_engine_tools.py +166 -0
- roomkit_ui-0.3.0/tests/test_enrollment.py +85 -0
- roomkit_ui-0.3.0/tests/test_features.py +194 -0
- roomkit_ui-0.3.0/tests/test_gemini_live_38.py +144 -0
- roomkit_ui-0.3.0/tests/test_gguf_models.py +371 -0
- roomkit_ui-0.3.0/tests/test_google_speech.py +145 -0
- roomkit_ui-0.3.0/tests/test_gpt_live.py +197 -0
- roomkit_ui-0.3.0/tests/test_hotkey.py +174 -0
- roomkit_ui-0.3.0/tests/test_idle_hangup.py +179 -0
- roomkit_ui-0.3.0/tests/test_image_conversation.py +190 -0
- roomkit_ui-0.3.0/tests/test_image_generation.py +425 -0
- roomkit_ui-0.3.0/tests/test_install_offer.py +131 -0
- roomkit_ui-0.3.0/tests/test_integrations_page.py +480 -0
- roomkit_ui-0.3.0/tests/test_live_conversation.py +78 -0
- roomkit_ui-0.3.0/tests/test_live_images.py +100 -0
- roomkit_ui-0.3.0/tests/test_llamacpp.py +288 -0
- roomkit_ui-0.3.0/tests/test_llm_library.py +269 -0
- roomkit_ui-0.3.0/tests/test_local_thinking.py +102 -0
- roomkit_ui-0.3.0/tests/test_local_tool_hint.py +83 -0
- roomkit_ui-0.3.0/tests/test_macos_app.py +162 -0
- roomkit_ui-0.3.0/tests/test_main_window_lifecycle.py +302 -0
- roomkit_ui-0.3.0/tests/test_mcp_app_bridge.py +53 -0
- roomkit_ui-0.3.0/tests/test_mcp_app_history.py +207 -0
- roomkit_ui-0.3.0/tests/test_mcp_app_widget_teardown.py +144 -0
- roomkit_ui-0.3.0/tests/test_mcp_auth.py +146 -0
- roomkit_ui-0.3.0/tests/test_mcp_config.py +61 -0
- roomkit_ui-0.3.0/tests/test_mcp_headers.py +102 -0
- roomkit_ui-0.3.0/tests/test_mcp_http_auth.py +168 -0
- roomkit_ui-0.3.0/tests/test_mcp_manager.py +455 -0
- roomkit_ui-0.3.0/tests/test_mcp_page_oauth.py +131 -0
- roomkit_ui-0.3.0/tests/test_mcp_server_instructions.py +446 -0
- roomkit_ui-0.3.0/tests/test_mcp_skills.py +400 -0
- roomkit_ui-0.3.0/tests/test_memory.py +353 -0
- roomkit_ui-0.3.0/tests/test_menus.py +47 -0
- roomkit_ui-0.3.0/tests/test_message_input.py +92 -0
- roomkit_ui-0.3.0/tests/test_meta_stt.py +122 -0
- roomkit_ui-0.3.0/tests/test_mic_mute.py +77 -0
- roomkit_ui-0.3.0/tests/test_missing_components.py +154 -0
- roomkit_ui-0.3.0/tests/test_model_download.py +262 -0
- roomkit_ui-0.3.0/tests/test_model_manager.py +87 -0
- roomkit_ui-0.3.0/tests/test_models_page.py +272 -0
- roomkit_ui-0.3.0/tests/test_muse_speakers.py +424 -0
- roomkit_ui-0.3.0/tests/test_name_speaker_tool.py +169 -0
- roomkit_ui-0.3.0/tests/test_one_mic_session.py +67 -0
- roomkit_ui-0.3.0/tests/test_paste.py +265 -0
- roomkit_ui-0.3.0/tests/test_paths.py +87 -0
- roomkit_ui-0.3.0/tests/test_pocket_tts.py +146 -0
- roomkit_ui-0.3.0/tests/test_realtime_diarization.py +77 -0
- roomkit_ui-0.3.0/tests/test_realtime_mcp_retry.py +151 -0
- roomkit_ui-0.3.0/tests/test_realtime_partial_hook.py +171 -0
- roomkit_ui-0.3.0/tests/test_realtime_providers.py +322 -0
- roomkit_ui-0.3.0/tests/test_realtime_section.py +177 -0
- roomkit_ui-0.3.0/tests/test_realtime_usage.py +79 -0
- roomkit_ui-0.3.0/tests/test_retired_models.py +111 -0
- roomkit_ui-0.3.0/tests/test_secret_store.py +147 -0
- roomkit_ui-0.3.0/tests/test_session_cancel_ui.py +34 -0
- roomkit_ui-0.3.0/tests/test_session_cost.py +159 -0
- roomkit_ui-0.3.0/tests/test_session_drawer.py +229 -0
- roomkit_ui-0.3.0/tests/test_session_loading.py +56 -0
- roomkit_ui-0.3.0/tests/test_session_models.py +236 -0
- roomkit_ui-0.3.0/tests/test_session_recording.py +41 -0
- roomkit_ui-0.3.0/tests/test_settings.py +360 -0
- roomkit_ui-0.3.0/tests/test_settings_controls_style.py +75 -0
- roomkit_ui-0.3.0/tests/test_settings_lifetime.py +127 -0
- roomkit_ui-0.3.0/tests/test_settings_panel.py +971 -0
- roomkit_ui-0.3.0/tests/test_skill_download.py +98 -0
- roomkit_ui-0.3.0/tests/test_skill_git.py +146 -0
- roomkit_ui-0.3.0/tests/test_skill_manager.py +227 -0
- roomkit_ui-0.3.0/tests/test_skills_marketplace.py +157 -0
- roomkit_ui-0.3.0/tests/test_skills_sh_client.py +96 -0
- roomkit_ui-0.3.0/tests/test_smart_turn.py +184 -0
- roomkit_ui-0.3.0/tests/test_sounds.py +52 -0
- roomkit_ui-0.3.0/tests/test_speaker_settings.py +59 -0
- roomkit_ui-0.3.0/tests/test_spoken_language.py +80 -0
- roomkit_ui-0.3.0/tests/test_text_chat.py +104 -0
- roomkit_ui-0.3.0/tests/test_text_conversation.py +157 -0
- roomkit_ui-0.3.0/tests/test_text_mcp_apps.py +210 -0
- roomkit_ui-0.3.0/tests/test_theme_chevron.py +35 -0
- roomkit_ui-0.3.0/tests/test_theme_fonts.py +52 -0
- roomkit_ui-0.3.0/tests/test_theme_live.py +49 -0
- roomkit_ui-0.3.0/tests/test_tool_activity.py +105 -0
- roomkit_ui-0.3.0/tests/test_tool_search.py +267 -0
- roomkit_ui-0.3.0/tests/test_toolset.py +172 -0
- roomkit_ui-0.3.0/tests/test_tts_cache.py +80 -0
- roomkit_ui-0.3.0/tests/test_url_policy.py +139 -0
- roomkit_ui-0.3.0/tests/test_vc_agent.py +803 -0
- roomkit_ui-0.3.0/tests/test_vc_capture_source.py +73 -0
- roomkit_ui-0.3.0/tests/test_vc_cloud_fields.py +146 -0
- roomkit_ui-0.3.0/tests/test_vc_interruption.py +119 -0
- roomkit_ui-0.3.0/tests/test_vc_pipeline_speakers.py +110 -0
- roomkit_ui-0.3.0/tests/test_vc_reasoning.py +297 -0
- roomkit_ui-0.3.0/tests/test_vc_session_memory.py +45 -0
- roomkit_ui-0.3.0/tests/test_vc_speaker_hook.py +68 -0
- roomkit_ui-0.3.0/tests/test_vc_tts_filter.py +86 -0
- roomkit_ui-0.3.0/tests/test_vc_tts_hooks.py +218 -0
- roomkit_ui-0.3.0/tests/test_voice_error_notices.py +51 -0
- roomkit_ui-0.3.0/tests/test_voice_naming_chat.py +119 -0
- roomkit_ui-0.3.0/tests/test_voice_settings_pages.py +294 -0
- roomkit_ui-0.3.0/tests/test_wakeword.py +264 -0
- roomkit_ui-0.3.0/tests/test_wakeword_capture.py +117 -0
- roomkit_ui-0.3.0/tests/test_wakeword_controller.py +298 -0
- roomkit_ui-0.3.0/tests/test_wakeword_encoder_download.py +112 -0
- roomkit_ui-0.3.0/tests/test_wakeword_enroller.py +171 -0
- roomkit_ui-0.3.0/tests/test_wakeword_listener.py +190 -0
- roomkit_ui-0.3.0/tests/test_wakeword_resample.py +193 -0
- roomkit_ui-0.3.0/tests/test_wakeword_threads.py +265 -0
- roomkit_ui-0.3.0/tests/test_watchdog.py +86 -0
- roomkit_ui-0.3.0/tests/test_windows_compat.py +73 -0
- roomkit_ui-0.3.0/tests/vc_harness.py +209 -0
- roomkit_ui-0.3.0/uv.lock +5574 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
name: Build
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
ci:
|
|
13
|
+
name: CI
|
|
14
|
+
uses: ./.github/workflows/ci.yml
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
# Info.plist takes its version from pyproject.toml, the release and the cask
|
|
19
|
+
# from the tag: a mismatch ships an app that reports another version than
|
|
20
|
+
# the one it is released as. Release to PyPI runs the same check.
|
|
21
|
+
version:
|
|
22
|
+
name: Check the tag matches the project version
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v4
|
|
29
|
+
|
|
30
|
+
- name: Compare
|
|
31
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
32
|
+
run: |
|
|
33
|
+
project_version=$(uv version --short)
|
|
34
|
+
tag_version="${GITHUB_REF_NAME#v}"
|
|
35
|
+
if [ "$project_version" != "$tag_version" ]; then
|
|
36
|
+
echo "::error::tag $GITHUB_REF_NAME does not match pyproject version $project_version"
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
build:
|
|
41
|
+
needs: [ci, version]
|
|
42
|
+
strategy:
|
|
43
|
+
matrix:
|
|
44
|
+
include:
|
|
45
|
+
- os: macos-latest
|
|
46
|
+
artifact: RoomKit-UI-macOS
|
|
47
|
+
- os: ubuntu-latest
|
|
48
|
+
artifact: RoomKit-UI-Linux
|
|
49
|
+
- os: windows-latest
|
|
50
|
+
artifact: RoomKit-UI-Windows
|
|
51
|
+
|
|
52
|
+
runs-on: ${{ matrix.os }}
|
|
53
|
+
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
|
|
57
|
+
- uses: astral-sh/setup-uv@v4
|
|
58
|
+
with:
|
|
59
|
+
version: "latest"
|
|
60
|
+
|
|
61
|
+
- uses: actions/setup-python@v5
|
|
62
|
+
with:
|
|
63
|
+
python-version: "3.12"
|
|
64
|
+
|
|
65
|
+
# Linux: install system deps
|
|
66
|
+
- name: Install system dependencies (Linux)
|
|
67
|
+
if: runner.os == 'Linux'
|
|
68
|
+
run: |
|
|
69
|
+
sudo apt-get update
|
|
70
|
+
sudo apt-get install -y libportaudio2 libasound2-dev libgl1 librsvg2-bin
|
|
71
|
+
|
|
72
|
+
# macOS: install rsvg-convert for icon generation
|
|
73
|
+
- name: Install system dependencies (macOS)
|
|
74
|
+
if: runner.os == 'macOS'
|
|
75
|
+
run: brew install librsvg
|
|
76
|
+
|
|
77
|
+
# macOS: import Developer ID certificate for code signing
|
|
78
|
+
# Required secrets:
|
|
79
|
+
# MACOS_CERTIFICATE_P12_BASE64 — base64-encoded .p12 certificate
|
|
80
|
+
# MACOS_CERTIFICATE_PASSWORD — password for the .p12 file
|
|
81
|
+
# APPLE_ID — Apple ID email (notarization)
|
|
82
|
+
# APPLE_APP_PASSWORD — app-specific password (notarization)
|
|
83
|
+
# APPLE_TEAM_ID — 10-char Developer Team ID
|
|
84
|
+
- name: Import code signing certificate (macOS)
|
|
85
|
+
if: runner.os == 'macOS' && env.MACOS_CERTIFICATE_P12_BASE64 != ''
|
|
86
|
+
env:
|
|
87
|
+
MACOS_CERTIFICATE_P12_BASE64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }}
|
|
88
|
+
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
|
89
|
+
run: |
|
|
90
|
+
CERT_FILE=$(mktemp /tmp/certificate.XXXXXX.p12)
|
|
91
|
+
echo "$MACOS_CERTIFICATE_P12_BASE64" | base64 --decode > "$CERT_FILE"
|
|
92
|
+
KEYCHAIN="build.keychain-db"
|
|
93
|
+
KEYCHAIN_PASSWORD="$(openssl rand -hex 16)"
|
|
94
|
+
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
|
|
95
|
+
security set-keychain-settings -lut 21600 "$KEYCHAIN"
|
|
96
|
+
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
|
|
97
|
+
security import "$CERT_FILE" -k "$KEYCHAIN" -P "$MACOS_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
|
|
98
|
+
security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
|
|
99
|
+
security list-keychains -d user -s "$KEYCHAIN" $(security list-keychains -d user | tr -d '"')
|
|
100
|
+
rm -f "$CERT_FILE"
|
|
101
|
+
# Extract identity name for codesign
|
|
102
|
+
IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN" | head -1 | sed 's/.*"\(.*\)".*/\1/')
|
|
103
|
+
echo "CODESIGN_IDENTITY=$IDENTITY" >> "$GITHUB_ENV"
|
|
104
|
+
echo "BUILD_KEYCHAIN=$KEYCHAIN" >> "$GITHUB_ENV"
|
|
105
|
+
|
|
106
|
+
# Windows: install cairo for icon generation (fallback)
|
|
107
|
+
- name: Install system dependencies (Windows)
|
|
108
|
+
if: runner.os == 'Windows'
|
|
109
|
+
run: choco install cairo -y --no-progress
|
|
110
|
+
continue-on-error: true
|
|
111
|
+
|
|
112
|
+
# `--extra all` is load-bearing: the base install is now core-only, and a
|
|
113
|
+
# bare `uv sync` would ship a bundle with no providers at all. smart-turn
|
|
114
|
+
# is added on top (no torch); it excludes qwen3-tts and neutts (conflicting
|
|
115
|
+
# transformers pins, see [tool.uv].conflicts), which stay out with
|
|
116
|
+
# pocket-tts — the three would add several GB of torch.
|
|
117
|
+
- name: Install Python dependencies
|
|
118
|
+
run: |
|
|
119
|
+
uv sync --extra all --extra smart-turn
|
|
120
|
+
uv pip install pyinstaller Pillow cairosvg
|
|
121
|
+
|
|
122
|
+
# Generate app icons from SVG
|
|
123
|
+
- name: Generate icons
|
|
124
|
+
run: uv run python scripts/generate_icons.py
|
|
125
|
+
|
|
126
|
+
# macOS / Linux. The PyInstaller flags here, in the Windows step and in
|
|
127
|
+
# scripts/build_app.sh must match: tests/test_build_flags.py fails when
|
|
128
|
+
# they drift. --collect-binaries=aec_audio_processing is the one with no
|
|
129
|
+
# import behind it: the package loads its WebRTC library by path.
|
|
130
|
+
- name: Build (Unix)
|
|
131
|
+
if: runner.os != 'Windows'
|
|
132
|
+
run: |
|
|
133
|
+
SEP=":"
|
|
134
|
+
EXTRA_ARGS=""
|
|
135
|
+
ICON_ARG=""
|
|
136
|
+
if [ "$RUNNER_OS" = "macOS" ]; then
|
|
137
|
+
EXTRA_ARGS="--windowed"
|
|
138
|
+
if [ -f assets/icon.icns ]; then
|
|
139
|
+
ICON_ARG="--icon=assets/icon.icns"
|
|
140
|
+
fi
|
|
141
|
+
else
|
|
142
|
+
if [ -f assets/icon.png ]; then
|
|
143
|
+
ICON_ARG="--icon=assets/icon.png"
|
|
144
|
+
fi
|
|
145
|
+
fi
|
|
146
|
+
uv run pyinstaller \
|
|
147
|
+
--name "RoomKit UI" \
|
|
148
|
+
--noconfirm \
|
|
149
|
+
--clean \
|
|
150
|
+
$EXTRA_ARGS \
|
|
151
|
+
$ICON_ARG \
|
|
152
|
+
--collect-submodules=roomkit \
|
|
153
|
+
--collect-submodules=roomkit_ui \
|
|
154
|
+
--copy-metadata=roomkit-ui \
|
|
155
|
+
--copy-metadata=roomkit \
|
|
156
|
+
--hidden-import=google.genai \
|
|
157
|
+
--hidden-import=google.genai.live \
|
|
158
|
+
--hidden-import=openai \
|
|
159
|
+
--hidden-import=anthropic \
|
|
160
|
+
--hidden-import=deepgram \
|
|
161
|
+
--hidden-import=elevenlabs \
|
|
162
|
+
--hidden-import=gradium \
|
|
163
|
+
--hidden-import=websockets \
|
|
164
|
+
--hidden-import=tiktoken_ext \
|
|
165
|
+
--hidden-import=tiktoken_ext.openai_public \
|
|
166
|
+
--hidden-import=sounddevice \
|
|
167
|
+
--hidden-import=_sounddevice_data \
|
|
168
|
+
--hidden-import=certifi \
|
|
169
|
+
--hidden-import=aec_audio_processing \
|
|
170
|
+
--collect-binaries=aec_audio_processing \
|
|
171
|
+
--collect-binaries=sherpa_onnx \
|
|
172
|
+
--hidden-import=sherpa_onnx \
|
|
173
|
+
--collect-binaries=onnxruntime \
|
|
174
|
+
--hidden-import=onnxruntime \
|
|
175
|
+
--hidden-import=onnxruntime.capi._pybind_state \
|
|
176
|
+
--hidden-import=transformers.models.whisper.feature_extraction_whisper \
|
|
177
|
+
--hidden-import=transformers.feature_extraction_sequence_utils \
|
|
178
|
+
--hidden-import=transformers.audio_utils \
|
|
179
|
+
--hidden-import=pynput \
|
|
180
|
+
--hidden-import=pynput.keyboard \
|
|
181
|
+
--hidden-import=pynput.keyboard._darwin \
|
|
182
|
+
--add-data "src/roomkit_ui${SEP}roomkit_ui" \
|
|
183
|
+
src/roomkit_ui/__main__.py
|
|
184
|
+
|
|
185
|
+
# macOS: patch Info.plist, sign (proper or ad-hoc), and notarize
|
|
186
|
+
- name: Sign and patch (macOS)
|
|
187
|
+
if: runner.os == 'macOS'
|
|
188
|
+
env:
|
|
189
|
+
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
190
|
+
APPLE_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
|
|
191
|
+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
192
|
+
run: |
|
|
193
|
+
APP="dist/RoomKit UI.app"
|
|
194
|
+
PLIST="$APP/Contents/Info.plist"
|
|
195
|
+
/usr/libexec/PlistBuddy -c \
|
|
196
|
+
"Add :NSMicrophoneUsageDescription string 'RoomKit UI needs microphone access for voice conversations.'" \
|
|
197
|
+
"$PLIST" 2>/dev/null || true
|
|
198
|
+
/usr/libexec/PlistBuddy -c \
|
|
199
|
+
"Add :NSCameraUsageDescription string 'RoomKit UI uses your camera to take a photo you can attach to a message.'" \
|
|
200
|
+
"$PLIST" 2>/dev/null || true
|
|
201
|
+
|
|
202
|
+
# PyInstaller leaves the identifier unset and the version at 0.0.0.
|
|
203
|
+
# `build_app.sh` patched the identifier for local builds, so the
|
|
204
|
+
# released app was the one without it — and the cask's `uninstall
|
|
205
|
+
# quit:` needs a stable identifier to close a running copy before an
|
|
206
|
+
# upgrade. Must run before codesign: editing Info.plist afterwards
|
|
207
|
+
# invalidates the signature.
|
|
208
|
+
VERSION=$(uv version --short)
|
|
209
|
+
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.roomkit.ui" "$PLIST" 2>/dev/null \
|
|
210
|
+
|| /usr/libexec/PlistBuddy -c "Add :CFBundleIdentifier string com.roomkit.ui" "$PLIST"
|
|
211
|
+
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $VERSION" "$PLIST" 2>/dev/null \
|
|
212
|
+
|| /usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $VERSION" "$PLIST"
|
|
213
|
+
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSION" "$PLIST" 2>/dev/null \
|
|
214
|
+
|| /usr/libexec/PlistBuddy -c "Add :CFBundleVersion string $VERSION" "$PLIST"
|
|
215
|
+
echo "==> Bundle: com.roomkit.ui $VERSION"
|
|
216
|
+
|
|
217
|
+
if [ -n "${CODESIGN_IDENTITY:-}" ]; then
|
|
218
|
+
echo "==> Signing with: $CODESIGN_IDENTITY"
|
|
219
|
+
# Sign bundled shared libraries
|
|
220
|
+
find "$APP/Contents/Frameworks" -type f \( -name '*.so' -o -name '*.dylib' \) | while read -r lib; do
|
|
221
|
+
codesign --force --options runtime --entitlements entitlements.plist \
|
|
222
|
+
--sign "$CODESIGN_IDENTITY" "$lib"
|
|
223
|
+
done
|
|
224
|
+
# Sign main executable and app bundle
|
|
225
|
+
codesign --force --options runtime --entitlements entitlements.plist \
|
|
226
|
+
--sign "$CODESIGN_IDENTITY" "$APP/Contents/MacOS/RoomKit UI"
|
|
227
|
+
codesign --force --options runtime --entitlements entitlements.plist \
|
|
228
|
+
--sign "$CODESIGN_IDENTITY" "$APP"
|
|
229
|
+
codesign --verify --deep --strict "$APP"
|
|
230
|
+
echo "==> Signature verified"
|
|
231
|
+
|
|
232
|
+
# Notarize if credentials are available
|
|
233
|
+
if [ -n "${APPLE_ID:-}" ] && [ -n "${APPLE_PASSWORD:-}" ] && [ -n "${APPLE_TEAM_ID:-}" ]; then
|
|
234
|
+
echo "==> Notarizing..."
|
|
235
|
+
ZIP_PATH="dist/RoomKit UI-notarize.zip"
|
|
236
|
+
ditto -c -k --keepParent "$APP" "$ZIP_PATH"
|
|
237
|
+
xcrun notarytool submit "$ZIP_PATH" \
|
|
238
|
+
--apple-id "$APPLE_ID" \
|
|
239
|
+
--password "$APPLE_PASSWORD" \
|
|
240
|
+
--team-id "$APPLE_TEAM_ID" \
|
|
241
|
+
--wait
|
|
242
|
+
rm -f "$ZIP_PATH"
|
|
243
|
+
xcrun stapler staple "$APP"
|
|
244
|
+
echo "==> Notarization complete"
|
|
245
|
+
fi
|
|
246
|
+
else
|
|
247
|
+
echo "==> Ad-hoc signing (no certificate configured)"
|
|
248
|
+
codesign --force --deep --sign - "$APP"
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
# Windows
|
|
252
|
+
- name: Build (Windows)
|
|
253
|
+
if: runner.os == 'Windows'
|
|
254
|
+
shell: pwsh
|
|
255
|
+
run: |
|
|
256
|
+
$iconArg = ""
|
|
257
|
+
if (Test-Path "assets/icon.ico") { $iconArg = "--icon=assets/icon.ico" }
|
|
258
|
+
$args = @(
|
|
259
|
+
"--name", "RoomKit UI",
|
|
260
|
+
"--noconfirm",
|
|
261
|
+
"--clean",
|
|
262
|
+
"--windowed"
|
|
263
|
+
)
|
|
264
|
+
if ($iconArg) { $args += $iconArg }
|
|
265
|
+
$args += @(
|
|
266
|
+
"--collect-submodules=roomkit",
|
|
267
|
+
"--collect-submodules=roomkit_ui",
|
|
268
|
+
"--copy-metadata=roomkit-ui",
|
|
269
|
+
"--copy-metadata=roomkit",
|
|
270
|
+
"--hidden-import=google.genai",
|
|
271
|
+
"--hidden-import=google.genai.live",
|
|
272
|
+
"--hidden-import=openai",
|
|
273
|
+
"--hidden-import=anthropic",
|
|
274
|
+
"--hidden-import=deepgram",
|
|
275
|
+
"--hidden-import=elevenlabs",
|
|
276
|
+
"--hidden-import=gradium",
|
|
277
|
+
"--hidden-import=websockets",
|
|
278
|
+
"--hidden-import=tiktoken_ext",
|
|
279
|
+
"--hidden-import=tiktoken_ext.openai_public",
|
|
280
|
+
"--hidden-import=sounddevice",
|
|
281
|
+
"--hidden-import=_sounddevice_data",
|
|
282
|
+
"--hidden-import=certifi",
|
|
283
|
+
"--hidden-import=aec_audio_processing",
|
|
284
|
+
"--collect-binaries=aec_audio_processing",
|
|
285
|
+
"--collect-binaries=sherpa_onnx",
|
|
286
|
+
"--hidden-import=sherpa_onnx",
|
|
287
|
+
"--collect-binaries=onnxruntime",
|
|
288
|
+
"--hidden-import=onnxruntime",
|
|
289
|
+
"--hidden-import=onnxruntime.capi._pybind_state",
|
|
290
|
+
"--hidden-import=transformers.models.whisper.feature_extraction_whisper",
|
|
291
|
+
"--hidden-import=transformers.feature_extraction_sequence_utils",
|
|
292
|
+
"--hidden-import=transformers.audio_utils",
|
|
293
|
+
"--hidden-import=pynput",
|
|
294
|
+
"--hidden-import=pynput.keyboard",
|
|
295
|
+
"--hidden-import=pynput.keyboard._darwin",
|
|
296
|
+
"--add-data", "src/roomkit_ui;roomkit_ui",
|
|
297
|
+
"src/roomkit_ui/__main__.py"
|
|
298
|
+
)
|
|
299
|
+
uv run pyinstaller @args
|
|
300
|
+
|
|
301
|
+
# Package artifacts
|
|
302
|
+
- name: Archive (macOS)
|
|
303
|
+
if: runner.os == 'macOS'
|
|
304
|
+
run: |
|
|
305
|
+
DMG_PATH="dist/${{ matrix.artifact }}.dmg"
|
|
306
|
+
# hdiutil intermittently fails with "Resource busy" on GitHub
|
|
307
|
+
# runners (Spotlight/XProtect scanning the fresh .app) — retry.
|
|
308
|
+
for i in 1 2 3 4 5; do
|
|
309
|
+
if hdiutil create -volname "RoomKit UI" -srcfolder "dist/RoomKit UI.app" \
|
|
310
|
+
-ov -format UDZO "$DMG_PATH"; then
|
|
311
|
+
break
|
|
312
|
+
fi
|
|
313
|
+
if [ "$i" = "5" ]; then
|
|
314
|
+
echo "hdiutil failed after 5 attempts" >&2
|
|
315
|
+
exit 1
|
|
316
|
+
fi
|
|
317
|
+
echo "hdiutil attempt $i failed — retrying in 15s"
|
|
318
|
+
sleep 15
|
|
319
|
+
done
|
|
320
|
+
# Staple notarization ticket to DMG if signed
|
|
321
|
+
if [ -n "${CODESIGN_IDENTITY:-}" ] && [ -n "${{ secrets.APPLE_ID }}" ]; then
|
|
322
|
+
xcrun stapler staple "$DMG_PATH" || true
|
|
323
|
+
fi
|
|
324
|
+
|
|
325
|
+
- name: Archive (Linux)
|
|
326
|
+
if: runner.os == 'Linux'
|
|
327
|
+
run: |
|
|
328
|
+
cd dist
|
|
329
|
+
tar czf "${{ matrix.artifact }}.tar.gz" "RoomKit UI"
|
|
330
|
+
|
|
331
|
+
- name: Archive (Windows)
|
|
332
|
+
if: runner.os == 'Windows'
|
|
333
|
+
shell: pwsh
|
|
334
|
+
run: |
|
|
335
|
+
Compress-Archive -Path "dist/RoomKit UI" -DestinationPath "dist/${{ matrix.artifact }}.zip"
|
|
336
|
+
|
|
337
|
+
- name: Upload artifact
|
|
338
|
+
uses: actions/upload-artifact@v4
|
|
339
|
+
with:
|
|
340
|
+
name: ${{ matrix.artifact }}
|
|
341
|
+
path: |
|
|
342
|
+
dist/${{ matrix.artifact }}.dmg
|
|
343
|
+
dist/${{ matrix.artifact }}.zip
|
|
344
|
+
dist/${{ matrix.artifact }}.tar.gz
|
|
345
|
+
|
|
346
|
+
# Attach to release when triggered by a tag
|
|
347
|
+
- name: Upload to release
|
|
348
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
349
|
+
uses: softprops/action-gh-release@v2
|
|
350
|
+
with:
|
|
351
|
+
files: |
|
|
352
|
+
dist/${{ matrix.artifact }}.dmg
|
|
353
|
+
dist/${{ matrix.artifact }}.zip
|
|
354
|
+
dist/${{ matrix.artifact }}.tar.gz
|
|
355
|
+
|
|
356
|
+
# Clean up temporary keychain
|
|
357
|
+
- name: Clean up keychain (macOS)
|
|
358
|
+
if: always() && runner.os == 'macOS' && env.BUILD_KEYCHAIN != ''
|
|
359
|
+
run: security delete-keychain "$BUILD_KEYCHAIN"
|
|
360
|
+
|
|
361
|
+
# Homebrew reads casks from a repository named `homebrew-<tap>`, so the cask
|
|
362
|
+
# cannot live here. This copies it into roomkit-live/homebrew-tap with the
|
|
363
|
+
# released DMG's version and checksum, which is what makes
|
|
364
|
+
# `brew install --cask roomkit-live/tap/roomkit-ui` resolve.
|
|
365
|
+
homebrew:
|
|
366
|
+
name: Update Homebrew cask
|
|
367
|
+
needs: build
|
|
368
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
369
|
+
# macOS, for stapler: see "Require a notarized app".
|
|
370
|
+
runs-on: macos-latest
|
|
371
|
+
steps:
|
|
372
|
+
- uses: actions/checkout@v4
|
|
373
|
+
|
|
374
|
+
# The same bytes the release serves: the artifact is uploaded after the
|
|
375
|
+
# notarization ticket is stapled, so its checksum matches the asset.
|
|
376
|
+
- uses: actions/download-artifact@v4
|
|
377
|
+
with:
|
|
378
|
+
name: RoomKit-UI-macOS
|
|
379
|
+
path: artifact
|
|
380
|
+
|
|
381
|
+
# Without the Apple secrets the build only signs ad hoc, and Gatekeeper
|
|
382
|
+
# refuses that app; a cask user never gets the right-click "Open" a
|
|
383
|
+
# download offers. Publish the cask only for an app carrying a stapled
|
|
384
|
+
# notarization ticket. The DMG still goes to the release page.
|
|
385
|
+
- name: Require a notarized app
|
|
386
|
+
id: notarized
|
|
387
|
+
run: |
|
|
388
|
+
MOUNT=$(mktemp -d)
|
|
389
|
+
hdiutil attach -nobrowse -readonly -mountpoint "$MOUNT" artifact/RoomKit-UI-macOS.dmg
|
|
390
|
+
if xcrun stapler validate "$MOUNT/RoomKit UI.app"; then
|
|
391
|
+
echo "ok=true" >> "$GITHUB_OUTPUT"
|
|
392
|
+
else
|
|
393
|
+
echo "::warning::The macOS app is not notarized — cask not published."
|
|
394
|
+
fi
|
|
395
|
+
hdiutil detach "$MOUNT"
|
|
396
|
+
|
|
397
|
+
- name: Stamp the cask with this release
|
|
398
|
+
if: steps.notarized.outputs.ok == 'true'
|
|
399
|
+
run: |
|
|
400
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
401
|
+
SHA=$(shasum -a 256 "artifact/RoomKit-UI-macOS.dmg" | cut -d' ' -f1)
|
|
402
|
+
CASK=packaging/homebrew/roomkit-ui.rb
|
|
403
|
+
sed -i '' -E "s|^ version \".*\"$| version \"${VERSION}\"|" "$CASK"
|
|
404
|
+
sed -i '' -E "s|^ sha256 \".*\"$| sha256 \"${SHA}\"|" "$CASK"
|
|
405
|
+
grep -E '^ (version|sha256) ' "$CASK"
|
|
406
|
+
|
|
407
|
+
- name: Push to the tap
|
|
408
|
+
if: steps.notarized.outputs.ok == 'true'
|
|
409
|
+
env:
|
|
410
|
+
TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
|
|
411
|
+
run: |
|
|
412
|
+
if [ -z "$TAP_TOKEN" ]; then
|
|
413
|
+
echo "::warning::HOMEBREW_TAP_TOKEN is not set — cask not published."
|
|
414
|
+
echo "Create roomkit-live/homebrew-tap and add the secret to enable this."
|
|
415
|
+
exit 0
|
|
416
|
+
fi
|
|
417
|
+
git clone --depth 1 \
|
|
418
|
+
"https://x-access-token:${TAP_TOKEN}@github.com/roomkit-live/homebrew-tap.git" tap
|
|
419
|
+
mkdir -p tap/Casks
|
|
420
|
+
cp packaging/homebrew/roomkit-ui.rb tap/Casks/roomkit-ui.rb
|
|
421
|
+
cd tap
|
|
422
|
+
git config user.name "github-actions[bot]"
|
|
423
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
424
|
+
git add Casks/roomkit-ui.rb
|
|
425
|
+
git diff --staged --quiet && echo "cask unchanged" && exit 0
|
|
426
|
+
git commit -m "roomkit-ui ${GITHUB_REF_NAME#v}"
|
|
427
|
+
git push
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
# Build and Release to PyPI call this first: a tag push runs neither of the
|
|
9
|
+
# triggers above, and nothing should ship from a commit these checks reject.
|
|
10
|
+
workflow_call:
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
# Lint, security scan and type check share one environment: each needs the
|
|
14
|
+
# full `uv sync --extra dev` (the locked ruff and bandit, and mypy run
|
|
15
|
+
# against roomkit's real types), so syncing once beats syncing three times.
|
|
16
|
+
checks:
|
|
17
|
+
name: Lint, security, types
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v4
|
|
24
|
+
with:
|
|
25
|
+
enable-cache: true
|
|
26
|
+
|
|
27
|
+
- name: Set up Python
|
|
28
|
+
run: uv python install 3.12
|
|
29
|
+
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: uv sync --extra dev
|
|
32
|
+
|
|
33
|
+
# The locked ruff, not whatever uvx resolves today: a new release adds
|
|
34
|
+
# rules and reformats code, and CI would disagree with "uv run ruff".
|
|
35
|
+
- name: Ruff check
|
|
36
|
+
run: uv run ruff check .
|
|
37
|
+
|
|
38
|
+
- name: Ruff format check
|
|
39
|
+
run: uv run ruff format --check .
|
|
40
|
+
|
|
41
|
+
- name: Bandit
|
|
42
|
+
run: uv run bandit -r src/ -c pyproject.toml
|
|
43
|
+
|
|
44
|
+
# mypy runs in the project environment. Outside it, roomkit and the
|
|
45
|
+
# backend SDKs resolve to Any (pyproject ignores their missing imports),
|
|
46
|
+
# so no call into them is checked, and numpy is not found at all.
|
|
47
|
+
- name: Mypy
|
|
48
|
+
run: uv run mypy src/
|
|
49
|
+
|
|
50
|
+
test:
|
|
51
|
+
name: Tests
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
env:
|
|
54
|
+
QT_QPA_PLATFORM: offscreen
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
|
|
58
|
+
- name: Install uv
|
|
59
|
+
uses: astral-sh/setup-uv@v4
|
|
60
|
+
with:
|
|
61
|
+
enable-cache: true
|
|
62
|
+
|
|
63
|
+
- name: Set up Python
|
|
64
|
+
run: uv python install 3.12
|
|
65
|
+
|
|
66
|
+
- name: Install Qt/audio system libraries
|
|
67
|
+
run: |
|
|
68
|
+
sudo apt-get update
|
|
69
|
+
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3 libportaudio2 libpulse0
|
|
70
|
+
|
|
71
|
+
- name: Install dependencies
|
|
72
|
+
run: uv sync --extra dev
|
|
73
|
+
|
|
74
|
+
- name: Pytest
|
|
75
|
+
run: uv run pytest -v
|
|
76
|
+
|
|
77
|
+
# Every other job runs on Linux, where a Unix-only module imports fine and a
|
|
78
|
+
# release ships to Windows unexecuted. Importing the entry point is the first
|
|
79
|
+
# thing the packaged .exe does, and the cheapest place to catch that.
|
|
80
|
+
windows-import:
|
|
81
|
+
name: Windows import
|
|
82
|
+
runs-on: windows-latest
|
|
83
|
+
env:
|
|
84
|
+
QT_QPA_PLATFORM: offscreen
|
|
85
|
+
steps:
|
|
86
|
+
- uses: actions/checkout@v4
|
|
87
|
+
|
|
88
|
+
- name: Install uv
|
|
89
|
+
uses: astral-sh/setup-uv@v4
|
|
90
|
+
with:
|
|
91
|
+
enable-cache: true
|
|
92
|
+
|
|
93
|
+
- name: Set up Python
|
|
94
|
+
run: uv python install 3.12
|
|
95
|
+
|
|
96
|
+
# Deliberately bare: this installs the core only, so the job doubles as
|
|
97
|
+
# the check that the app still starts with every backend extra absent.
|
|
98
|
+
- name: Install dependencies
|
|
99
|
+
run: uv sync
|
|
100
|
+
|
|
101
|
+
- name: Import the app
|
|
102
|
+
run: uv run python -c "import roomkit_ui.app"
|
|
103
|
+
|
|
104
|
+
# Exercises every feature probe. A typo in features.py that raises on a
|
|
105
|
+
# missing module would take the whole app down on a core install.
|
|
106
|
+
- name: Report available features
|
|
107
|
+
run: uv run roomkit-ui --doctor
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
# Shares the `v*` tag with the Build workflow: one tag ships both the desktop
|
|
4
|
+
# bundles and the wheel. Uses PyPI Trusted Publishing (OIDC) — no API token
|
|
5
|
+
# lives in this repository's secrets.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
inputs:
|
|
11
|
+
repository:
|
|
12
|
+
description: "Where to publish"
|
|
13
|
+
type: choice
|
|
14
|
+
options: [testpypi, pypi]
|
|
15
|
+
default: testpypi
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
ci:
|
|
19
|
+
name: CI
|
|
20
|
+
uses: ./.github/workflows/ci.yml
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
build:
|
|
25
|
+
name: Build distributions
|
|
26
|
+
needs: ci
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
|
|
31
|
+
- name: Install uv
|
|
32
|
+
uses: astral-sh/setup-uv@v4
|
|
33
|
+
|
|
34
|
+
# A tag that disagrees with pyproject.toml publishes a version nobody
|
|
35
|
+
# can reproduce from the repository, and PyPI accepts it silently.
|
|
36
|
+
- name: Check the tag matches the project version
|
|
37
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
38
|
+
run: |
|
|
39
|
+
project_version=$(uv version --short)
|
|
40
|
+
tag_version="${GITHUB_REF_NAME#v}"
|
|
41
|
+
if [ "$project_version" != "$tag_version" ]; then
|
|
42
|
+
echo "::error::tag $GITHUB_REF_NAME does not match pyproject version $project_version"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
echo "Publishing version $project_version"
|
|
46
|
+
|
|
47
|
+
# The wheel must resolve roomkit from PyPI. A local path source is a
|
|
48
|
+
# development convenience that would make the release unbuildable for
|
|
49
|
+
# anyone else, so refuse rather than ship it.
|
|
50
|
+
- name: Refuse a local dependency source
|
|
51
|
+
run: |
|
|
52
|
+
if grep -q '^\[tool\.uv\.sources\]' pyproject.toml; then
|
|
53
|
+
echo "::error::[tool.uv.sources] is present — remove it before releasing"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
- name: Build sdist and wheel
|
|
58
|
+
run: uv build
|
|
59
|
+
|
|
60
|
+
# The libraries Qt and PortAudio load, as CI installs them: without
|
|
61
|
+
# libEGL, importing PySide6.QtGui fails before --doctor can answer.
|
|
62
|
+
- name: Install the system libraries the app loads
|
|
63
|
+
run: |
|
|
64
|
+
sudo apt-get update
|
|
65
|
+
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3 libportaudio2 libpulse0
|
|
66
|
+
|
|
67
|
+
# Catches a wheel whose declared extras do not resolve — the failure mode
|
|
68
|
+
# this package is most exposed to, since every backend rides an extra.
|
|
69
|
+
- name: Install the built wheel with every extra
|
|
70
|
+
run: |
|
|
71
|
+
uv venv /tmp/verify
|
|
72
|
+
VIRTUAL_ENV=/tmp/verify uv pip install "$(ls dist/*.whl)[all]"
|
|
73
|
+
VIRTUAL_ENV=/tmp/verify QT_QPA_PLATFORM=offscreen /tmp/verify/bin/roomkit-ui --doctor
|
|
74
|
+
|
|
75
|
+
- uses: actions/upload-artifact@v4
|
|
76
|
+
with:
|
|
77
|
+
name: distributions
|
|
78
|
+
path: dist/
|
|
79
|
+
|
|
80
|
+
publish:
|
|
81
|
+
name: Publish
|
|
82
|
+
needs: build
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
# Trusted Publishing mints a short-lived token from this job's OIDC
|
|
85
|
+
# identity. The environment name must match the publisher configured on
|
|
86
|
+
# PyPI, or the upload is rejected.
|
|
87
|
+
environment: ${{ github.event.inputs.repository || 'pypi' }}
|
|
88
|
+
permissions:
|
|
89
|
+
id-token: write
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/download-artifact@v4
|
|
92
|
+
with:
|
|
93
|
+
name: distributions
|
|
94
|
+
path: dist/
|
|
95
|
+
|
|
96
|
+
- name: Publish
|
|
97
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
98
|
+
with:
|
|
99
|
+
repository-url: >-
|
|
100
|
+
${{ github.event.inputs.repository == 'testpypi'
|
|
101
|
+
&& 'https://test.pypi.org/legacy/'
|
|
102
|
+
|| 'https://upload.pypi.org/legacy/' }}
|