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.
Files changed (602) hide show
  1. roomkit_ui-0.3.0/.github/workflows/build.yml +427 -0
  2. roomkit_ui-0.3.0/.github/workflows/ci.yml +107 -0
  3. roomkit_ui-0.3.0/.github/workflows/release.yml +102 -0
  4. roomkit_ui-0.3.0/.gitignore +15 -0
  5. roomkit_ui-0.3.0/CHANGELOG.md +868 -0
  6. roomkit_ui-0.3.0/CLAUDE.md +283 -0
  7. roomkit_ui-0.3.0/CODE_OF_CONDUCT.md +77 -0
  8. roomkit_ui-0.3.0/CONTRIBUTING.md +45 -0
  9. roomkit_ui-0.3.0/LICENSE +21 -0
  10. roomkit_ui-0.3.0/PKG-INFO +115 -0
  11. roomkit_ui-0.3.0/README.md +406 -0
  12. roomkit_ui-0.3.0/artifacts/conversation-history/conversation-dark.png +0 -0
  13. roomkit_ui-0.3.0/artifacts/conversation-history/conversation-light.png +0 -0
  14. roomkit_ui-0.3.0/artifacts/conversation-history/history-compact-dark.png +0 -0
  15. roomkit_ui-0.3.0/artifacts/conversation-history/history-compact-light.png +0 -0
  16. roomkit_ui-0.3.0/artifacts/conversation-history/history-dark.png +0 -0
  17. roomkit_ui-0.3.0/artifacts/conversation-history/history-light.png +0 -0
  18. roomkit_ui-0.3.0/artifacts/conversation-history/settings-sidebar-dark.png +0 -0
  19. roomkit_ui-0.3.0/artifacts/conversation-history/settings-sidebar-light.png +0 -0
  20. roomkit_ui-0.3.0/artifacts/conversation-redesign/app.js +200 -0
  21. roomkit_ui-0.3.0/artifacts/conversation-redesign/assets/conversation-sketch.svg +1 -0
  22. roomkit_ui-0.3.0/artifacts/conversation-redesign/index.html +72 -0
  23. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-approach.png +0 -0
  24. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-390.png +0 -0
  25. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-820.png +0 -0
  26. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-dark.png +0 -0
  27. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-error-light.png +0 -0
  28. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-390.png +0 -0
  29. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-820.png +0 -0
  30. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-dark.png +0 -0
  31. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-home-light.png +0 -0
  32. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-390.png +0 -0
  33. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-820.png +0 -0
  34. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-dark.png +0 -0
  35. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-image-light.png +0 -0
  36. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-390.png +0 -0
  37. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-820.png +0 -0
  38. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-dark.png +0 -0
  39. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-live-light.png +0 -0
  40. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-390.png +0 -0
  41. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-820.png +0 -0
  42. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-dark.png +0 -0
  43. roomkit_ui-0.3.0/artifacts/conversation-redesign/previews/preview-screen-light.png +0 -0
  44. roomkit_ui-0.3.0/artifacts/conversation-redesign/styles.css +17 -0
  45. roomkit_ui-0.3.0/artifacts/home-redesign/native-home-dark-compact.png +0 -0
  46. roomkit_ui-0.3.0/artifacts/home-redesign/native-home-dark.png +0 -0
  47. roomkit_ui-0.3.0/artifacts/home-redesign/native-home-error-dark.png +0 -0
  48. roomkit_ui-0.3.0/artifacts/home-redesign/native-home-light-compact.png +0 -0
  49. roomkit_ui-0.3.0/artifacts/home-redesign/native-home-light.png +0 -0
  50. roomkit_ui-0.3.0/artifacts/home-redesign/native-live-dark.png +0 -0
  51. roomkit_ui-0.3.0/artifacts/home-redesign/native-live-muted-dark.png +0 -0
  52. roomkit_ui-0.3.0/artifacts/live-redesign/live-compact-dark.png +0 -0
  53. roomkit_ui-0.3.0/artifacts/live-redesign/live-compact-light.png +0 -0
  54. roomkit_ui-0.3.0/artifacts/live-redesign/live-connecting-dark.png +0 -0
  55. roomkit_ui-0.3.0/artifacts/live-redesign/live-connecting-light.png +0 -0
  56. roomkit_ui-0.3.0/artifacts/live-redesign/live-conversation-dark.png +0 -0
  57. roomkit_ui-0.3.0/artifacts/live-redesign/live-conversation-light.png +0 -0
  58. roomkit_ui-0.3.0/artifacts/live-redesign/live-details-dark.png +0 -0
  59. roomkit_ui-0.3.0/artifacts/live-redesign/live-details-light.png +0 -0
  60. roomkit_ui-0.3.0/artifacts/live-redesign/live-muted-dark.png +0 -0
  61. roomkit_ui-0.3.0/artifacts/live-redesign/live-muted-light.png +0 -0
  62. roomkit_ui-0.3.0/artifacts/live-redesign/live-ready-dark.png +0 -0
  63. roomkit_ui-0.3.0/artifacts/live-redesign/live-ready-light.png +0 -0
  64. roomkit_ui-0.3.0/artifacts/session-details/live-header-dark.png +0 -0
  65. roomkit_ui-0.3.0/artifacts/session-details/live-header-light.png +0 -0
  66. roomkit_ui-0.3.0/artifacts/session-details/session-compact-dark.png +0 -0
  67. roomkit_ui-0.3.0/artifacts/session-details/session-compact-light.png +0 -0
  68. roomkit_ui-0.3.0/artifacts/session-details/session-dark.png +0 -0
  69. roomkit_ui-0.3.0/artifacts/session-details/session-light.png +0 -0
  70. roomkit_ui-0.3.0/artifacts/session-details/session-search-dark.png +0 -0
  71. roomkit_ui-0.3.0/artifacts/session-details/session-search-light.png +0 -0
  72. roomkit_ui-0.3.0/artifacts/settings-redesign/app.js +427 -0
  73. roomkit_ui-0.3.0/artifacts/settings-redesign/audit.css +65 -0
  74. roomkit_ui-0.3.0/artifacts/settings-redesign/audit.html +79 -0
  75. roomkit_ui-0.3.0/artifacts/settings-redesign/conformity-preview.png +0 -0
  76. roomkit_ui-0.3.0/artifacts/settings-redesign/conformity.html +25 -0
  77. roomkit_ui-0.3.0/artifacts/settings-redesign/evidence/current-ai.png +0 -0
  78. roomkit_ui-0.3.0/artifacts/settings-redesign/evidence/current-general.png +0 -0
  79. roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-dark.png +0 -0
  80. roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-license-dark.png +0 -0
  81. roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-license-light.png +0 -0
  82. roomkit_ui-0.3.0/artifacts/settings-redesign/native-about-light.png +0 -0
  83. roomkit_ui-0.3.0/artifacts/settings-redesign/native-audio-dark.png +0 -0
  84. roomkit_ui-0.3.0/artifacts/settings-redesign/native-audio-light.png +0 -0
  85. roomkit_ui-0.3.0/artifacts/settings-redesign/native-components-dark.png +0 -0
  86. roomkit_ui-0.3.0/artifacts/settings-redesign/native-components-light.png +0 -0
  87. roomkit_ui-0.3.0/artifacts/settings-redesign/native-conversation-dark.png +0 -0
  88. roomkit_ui-0.3.0/artifacts/settings-redesign/native-conversation-light.png +0 -0
  89. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dark.png +0 -0
  90. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-audio-dark.png +0 -0
  91. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-audio-light.png +0 -0
  92. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-capture-dark.png +0 -0
  93. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-capture-light.png +0 -0
  94. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-delete-dark.png +0 -0
  95. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-delete-light.png +0 -0
  96. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-0-dark.png +0 -0
  97. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-0-light.png +0 -0
  98. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-1-dark.png +0 -0
  99. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-1-light.png +0 -0
  100. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-2-dark.png +0 -0
  101. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-small-2-light.png +0 -0
  102. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-telemetry-dark.png +0 -0
  103. roomkit_ui-0.3.0/artifacts/settings-redesign/native-diagnostics-telemetry-light.png +0 -0
  104. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-cloud-dark.png +0 -0
  105. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-cloud-light.png +0 -0
  106. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-local-dark.png +0 -0
  107. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-local-light.png +0 -0
  108. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-missing-dark.png +0 -0
  109. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dictation-missing-light.png +0 -0
  110. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-model-dark.png +0 -0
  111. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-model-light.png +0 -0
  112. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-provider-dark.png +0 -0
  113. roomkit_ui-0.3.0/artifacts/settings-redesign/native-dropdown-provider-light.png +0 -0
  114. roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-dark.png +0 -0
  115. roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-light.png +0 -0
  116. roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-links-dark.png +0 -0
  117. roomkit_ui-0.3.0/artifacts/settings-redesign/native-general-links-light.png +0 -0
  118. roomkit_ui-0.3.0/artifacts/settings-redesign/native-gradium-advanced-dark.png +0 -0
  119. roomkit_ui-0.3.0/artifacts/settings-redesign/native-gradium-advanced-light.png +0 -0
  120. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-advanced-dark.png +0 -0
  121. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-advanced-light.png +0 -0
  122. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-dark.png +0 -0
  123. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-edit-dark.png +0 -0
  124. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-edit-light.png +0 -0
  125. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-empty-dark.png +0 -0
  126. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-empty-light.png +0 -0
  127. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-cli-light.png +0 -0
  128. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-marketplace-dark.png +0 -0
  129. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-marketplace-light.png +0 -0
  130. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-advanced-dark.png +0 -0
  131. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-advanced-light.png +0 -0
  132. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-dark.png +0 -0
  133. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-edit-dark.png +0 -0
  134. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-edit-light.png +0 -0
  135. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-empty-dark.png +0 -0
  136. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-empty-light.png +0 -0
  137. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-mcp-light.png +0 -0
  138. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-dark.png +0 -0
  139. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-empty-dark.png +0 -0
  140. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-empty-light.png +0 -0
  141. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-skills-light.png +0 -0
  142. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-small-dark.png +0 -0
  143. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-small-light.png +0 -0
  144. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-sources-dark.png +0 -0
  145. roomkit_ui-0.3.0/artifacts/settings-redesign/native-integrations-sources-light.png +0 -0
  146. roomkit_ui-0.3.0/artifacts/settings-redesign/native-light.png +0 -0
  147. roomkit_ui-0.3.0/artifacts/settings-redesign/native-live-theme-dark.png +0 -0
  148. roomkit_ui-0.3.0/artifacts/settings-redesign/native-live-theme-light.png +0 -0
  149. roomkit_ui-0.3.0/artifacts/settings-redesign/native-models-dark.png +0 -0
  150. roomkit_ui-0.3.0/artifacts/settings-redesign/native-models-light.png +0 -0
  151. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-dark.png +0 -0
  152. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-edit-dark.png +0 -0
  153. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-edit-light.png +0 -0
  154. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-light.png +0 -0
  155. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-list-dark.png +0 -0
  156. roomkit_ui-0.3.0/artifacts/settings-redesign/native-personality-list-light.png +0 -0
  157. roomkit_ui-0.3.0/artifacts/settings-redesign/native-pipeline-dark.png +0 -0
  158. roomkit_ui-0.3.0/artifacts/settings-redesign/native-pipeline-light.png +0 -0
  159. roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-dark.png +0 -0
  160. roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-light.png +0 -0
  161. roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-links-dark.png +0 -0
  162. roomkit_ui-0.3.0/artifacts/settings-redesign/native-privacy-links-light.png +0 -0
  163. roomkit_ui-0.3.0/artifacts/settings-redesign/native-provider-manage-dark.png +0 -0
  164. roomkit_ui-0.3.0/artifacts/settings-redesign/native-provider-manage-light.png +0 -0
  165. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-dark.png +0 -0
  166. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-light.png +0 -0
  167. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-local-dark.png +0 -0
  168. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-local-light.png +0 -0
  169. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-small-dark.png +0 -0
  170. roomkit_ui-0.3.0/artifacts/settings-redesign/native-providers-small-light.png +0 -0
  171. roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-dark.png +0 -0
  172. roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-icon-dark.png +0 -0
  173. roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-icon-light.png +0 -0
  174. roomkit_ui-0.3.0/artifacts/settings-redesign/native-search-light.png +0 -0
  175. roomkit_ui-0.3.0/artifacts/settings-redesign/native-skills-sh-small-dark.png +0 -0
  176. roomkit_ui-0.3.0/artifacts/settings-redesign/native-skills-sh-small-light.png +0 -0
  177. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speaker-enrollment-dark.png +0 -0
  178. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speaker-enrollment-light.png +0 -0
  179. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-dark.png +0 -0
  180. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-empty-dark.png +0 -0
  181. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-empty-light.png +0 -0
  182. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-enrolled-dark.png +0 -0
  183. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-enrolled-light.png +0 -0
  184. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-light.png +0 -0
  185. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-small-dark.png +0 -0
  186. roomkit_ui-0.3.0/artifacts/settings-redesign/native-speakers-small-light.png +0 -0
  187. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-download-dark.png +0 -0
  188. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-download-light.png +0 -0
  189. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-ready-dark.png +0 -0
  190. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-ready-light.png +0 -0
  191. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-setup-dark.png +0 -0
  192. roomkit_ui-0.3.0/artifacts/settings-redesign/native-wakeword-setup-light.png +0 -0
  193. roomkit_ui-0.3.0/artifacts/settings-redesign/preview-conversation.png +0 -0
  194. roomkit_ui-0.3.0/artifacts/settings-redesign/preview-dark.png +0 -0
  195. roomkit_ui-0.3.0/artifacts/settings-redesign/preview-light.png +0 -0
  196. roomkit_ui-0.3.0/artifacts/settings-redesign/preview-mobile.png +0 -0
  197. roomkit_ui-0.3.0/artifacts/settings-redesign/preview-pipeline.png +0 -0
  198. roomkit_ui-0.3.0/artifacts/settings-redesign/providers-integrations-preview.png +0 -0
  199. roomkit_ui-0.3.0/artifacts/settings-redesign/providers-integrations.html +7 -0
  200. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations-dark.png +0 -0
  201. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations-light.png +0 -0
  202. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-integrations.png +0 -0
  203. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers-dark.png +0 -0
  204. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers-light.png +0 -0
  205. roomkit_ui-0.3.0/artifacts/settings-redesign/reference-providers.png +0 -0
  206. roomkit_ui-0.3.0/artifacts/settings-redesign/styles.css +346 -0
  207. roomkit_ui-0.3.0/artifacts/tool-activity/tools-compact-dark.png +0 -0
  208. roomkit_ui-0.3.0/artifacts/tool-activity/tools-compact-light.png +0 -0
  209. roomkit_ui-0.3.0/artifacts/tool-activity/tools-dark.png +0 -0
  210. roomkit_ui-0.3.0/artifacts/tool-activity/tools-details-dark.png +0 -0
  211. roomkit_ui-0.3.0/artifacts/tool-activity/tools-details-light.png +0 -0
  212. roomkit_ui-0.3.0/artifacts/tool-activity/tools-failure-dark.png +0 -0
  213. roomkit_ui-0.3.0/artifacts/tool-activity/tools-failure-light.png +0 -0
  214. roomkit_ui-0.3.0/artifacts/tool-activity/tools-light.png +0 -0
  215. roomkit_ui-0.3.0/assets/icon-macos.png +0 -0
  216. roomkit_ui-0.3.0/assets/icon.icns +0 -0
  217. roomkit_ui-0.3.0/assets/icon.ico +0 -0
  218. roomkit_ui-0.3.0/assets/icon.png +0 -0
  219. roomkit_ui-0.3.0/assets/logo.svg +7 -0
  220. roomkit_ui-0.3.0/assets/screenshots/README.md +28 -0
  221. roomkit_ui-0.3.0/assets/screenshots/authentication-dark.png +0 -0
  222. roomkit_ui-0.3.0/assets/screenshots/authentication-light.png +0 -0
  223. roomkit_ui-0.3.0/assets/screenshots/conversation-dark.png +0 -0
  224. roomkit_ui-0.3.0/assets/screenshots/conversation-light.png +0 -0
  225. roomkit_ui-0.3.0/assets/screenshots/history-dark.png +0 -0
  226. roomkit_ui-0.3.0/assets/screenshots/history-light.png +0 -0
  227. roomkit_ui-0.3.0/assets/screenshots/home-dark.png +0 -0
  228. roomkit_ui-0.3.0/assets/screenshots/home-light.png +0 -0
  229. roomkit_ui-0.3.0/assets/screenshots/live-dark.png +0 -0
  230. roomkit_ui-0.3.0/assets/screenshots/live-light.png +0 -0
  231. roomkit_ui-0.3.0/assets/screenshots/settings-dark.png +0 -0
  232. roomkit_ui-0.3.0/assets/screenshots/settings-light.png +0 -0
  233. roomkit_ui-0.3.0/docs/architecture.md +311 -0
  234. roomkit_ui-0.3.0/docs/features.md +635 -0
  235. roomkit_ui-0.3.0/docs/onboarding.md +135 -0
  236. roomkit_ui-0.3.0/docs/technical.md +375 -0
  237. roomkit_ui-0.3.0/entitlements.plist +21 -0
  238. roomkit_ui-0.3.0/packaging/homebrew/roomkit-ui.rb +46 -0
  239. roomkit_ui-0.3.0/pyproject.toml +218 -0
  240. roomkit_ui-0.3.0/scripts/build_app.sh +165 -0
  241. roomkit_ui-0.3.0/scripts/capture_screenshots.py +190 -0
  242. roomkit_ui-0.3.0/scripts/generate_icons.py +153 -0
  243. roomkit_ui-0.3.0/src/roomkit_ui/__init__.py +1 -0
  244. roomkit_ui-0.3.0/src/roomkit_ui/__main__.py +3 -0
  245. roomkit_ui-0.3.0/src/roomkit_ui/aec_dump.py +197 -0
  246. roomkit_ui-0.3.0/src/roomkit_ui/agent_hooks.py +117 -0
  247. roomkit_ui-0.3.0/src/roomkit_ui/app.py +415 -0
  248. roomkit_ui-0.3.0/src/roomkit_ui/assets/icon-macos.png +0 -0
  249. roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.icns +0 -0
  250. roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.ico +0 -0
  251. roomkit_ui-0.3.0/src/roomkit_ui/assets/icon.png +0 -0
  252. roomkit_ui-0.3.0/src/roomkit_ui/assets/logo.svg +7 -0
  253. roomkit_ui-0.3.0/src/roomkit_ui/audio_tags.py +64 -0
  254. roomkit_ui-0.3.0/src/roomkit_ui/builtin_tools.py +156 -0
  255. roomkit_ui-0.3.0/src/roomkit_ui/call_mode.py +217 -0
  256. roomkit_ui-0.3.0/src/roomkit_ui/camera_capture.py +73 -0
  257. roomkit_ui-0.3.0/src/roomkit_ui/cleanup.py +281 -0
  258. roomkit_ui-0.3.0/src/roomkit_ui/cli_exec.py +239 -0
  259. roomkit_ui-0.3.0/src/roomkit_ui/cli_help.py +239 -0
  260. roomkit_ui-0.3.0/src/roomkit_ui/cli_tools.py +224 -0
  261. roomkit_ui-0.3.0/src/roomkit_ui/cli_tools_config.py +86 -0
  262. roomkit_ui-0.3.0/src/roomkit_ui/component_installer.py +152 -0
  263. roomkit_ui-0.3.0/src/roomkit_ui/components.py +196 -0
  264. roomkit_ui-0.3.0/src/roomkit_ui/constants.py +70 -0
  265. roomkit_ui-0.3.0/src/roomkit_ui/conversation_titles.py +84 -0
  266. roomkit_ui-0.3.0/src/roomkit_ui/conversations.py +337 -0
  267. roomkit_ui-0.3.0/src/roomkit_ui/dictation_stream.py +80 -0
  268. roomkit_ui-0.3.0/src/roomkit_ui/download_flight.py +88 -0
  269. roomkit_ui-0.3.0/src/roomkit_ui/engine.py +950 -0
  270. roomkit_ui-0.3.0/src/roomkit_ui/engine_audio.py +492 -0
  271. roomkit_ui-0.3.0/src/roomkit_ui/engine_callbacks.py +114 -0
  272. roomkit_ui-0.3.0/src/roomkit_ui/engine_realtime.py +526 -0
  273. roomkit_ui-0.3.0/src/roomkit_ui/engine_state.py +20 -0
  274. roomkit_ui-0.3.0/src/roomkit_ui/engine_text.py +237 -0
  275. roomkit_ui-0.3.0/src/roomkit_ui/engine_tools.py +422 -0
  276. roomkit_ui-0.3.0/src/roomkit_ui/engine_vc.py +777 -0
  277. roomkit_ui-0.3.0/src/roomkit_ui/engine_vc_helpers.py +310 -0
  278. roomkit_ui-0.3.0/src/roomkit_ui/enrollment.py +176 -0
  279. roomkit_ui-0.3.0/src/roomkit_ui/env_config.py +46 -0
  280. roomkit_ui-0.3.0/src/roomkit_ui/features.py +323 -0
  281. roomkit_ui-0.3.0/src/roomkit_ui/gguf_models.py +730 -0
  282. roomkit_ui-0.3.0/src/roomkit_ui/hooks.py +400 -0
  283. roomkit_ui-0.3.0/src/roomkit_ui/hotkey.py +445 -0
  284. roomkit_ui-0.3.0/src/roomkit_ui/icons.py +186 -0
  285. roomkit_ui-0.3.0/src/roomkit_ui/idle_hangup.py +162 -0
  286. roomkit_ui-0.3.0/src/roomkit_ui/image_generation.py +537 -0
  287. roomkit_ui-0.3.0/src/roomkit_ui/image_messages.py +62 -0
  288. roomkit_ui-0.3.0/src/roomkit_ui/images.py +112 -0
  289. roomkit_ui-0.3.0/src/roomkit_ui/macos_app.py +135 -0
  290. roomkit_ui-0.3.0/src/roomkit_ui/mcp_app_bridge.py +260 -0
  291. roomkit_ui-0.3.0/src/roomkit_ui/mcp_app_state.py +53 -0
  292. roomkit_ui-0.3.0/src/roomkit_ui/mcp_auth.py +384 -0
  293. roomkit_ui-0.3.0/src/roomkit_ui/mcp_config.py +135 -0
  294. roomkit_ui-0.3.0/src/roomkit_ui/mcp_http_auth.py +96 -0
  295. roomkit_ui-0.3.0/src/roomkit_ui/mcp_manager.py +631 -0
  296. roomkit_ui-0.3.0/src/roomkit_ui/mcp_skills.py +173 -0
  297. roomkit_ui-0.3.0/src/roomkit_ui/memory.py +321 -0
  298. roomkit_ui-0.3.0/src/roomkit_ui/model_catalog.py +417 -0
  299. roomkit_ui-0.3.0/src/roomkit_ui/model_download.py +430 -0
  300. roomkit_ui-0.3.0/src/roomkit_ui/model_manager.py +268 -0
  301. roomkit_ui-0.3.0/src/roomkit_ui/paste.py +273 -0
  302. roomkit_ui-0.3.0/src/roomkit_ui/paste_windows.py +167 -0
  303. roomkit_ui-0.3.0/src/roomkit_ui/paths.py +78 -0
  304. roomkit_ui-0.3.0/src/roomkit_ui/providers/__init__.py +91 -0
  305. roomkit_ui-0.3.0/src/roomkit_ui/providers/anthropic.py +21 -0
  306. roomkit_ui-0.3.0/src/roomkit_ui/providers/gemini.py +21 -0
  307. roomkit_ui-0.3.0/src/roomkit_ui/providers/llamacpp.py +192 -0
  308. roomkit_ui-0.3.0/src/roomkit_ui/providers/local.py +58 -0
  309. roomkit_ui-0.3.0/src/roomkit_ui/providers/openai.py +21 -0
  310. roomkit_ui-0.3.0/src/roomkit_ui/realtime_providers.py +458 -0
  311. roomkit_ui-0.3.0/src/roomkit_ui/secret_store.py +178 -0
  312. roomkit_ui-0.3.0/src/roomkit_ui/session_models.py +218 -0
  313. roomkit_ui-0.3.0/src/roomkit_ui/settings.py +469 -0
  314. roomkit_ui-0.3.0/src/roomkit_ui/settings_secrets.py +456 -0
  315. roomkit_ui-0.3.0/src/roomkit_ui/skill_approval.py +107 -0
  316. roomkit_ui-0.3.0/src/roomkit_ui/skill_git.py +136 -0
  317. roomkit_ui-0.3.0/src/roomkit_ui/skill_manager.py +225 -0
  318. roomkit_ui-0.3.0/src/roomkit_ui/skill_well_known.py +347 -0
  319. roomkit_ui-0.3.0/src/roomkit_ui/skills_sh_client.py +154 -0
  320. roomkit_ui-0.3.0/src/roomkit_ui/sounds.py +101 -0
  321. roomkit_ui-0.3.0/src/roomkit_ui/speaker_manager.py +100 -0
  322. roomkit_ui-0.3.0/src/roomkit_ui/speaker_naming.py +274 -0
  323. roomkit_ui-0.3.0/src/roomkit_ui/speaker_roster.py +188 -0
  324. roomkit_ui-0.3.0/src/roomkit_ui/stt_engine.py +519 -0
  325. roomkit_ui-0.3.0/src/roomkit_ui/stt_sessions.py +384 -0
  326. roomkit_ui-0.3.0/src/roomkit_ui/text_chat.py +75 -0
  327. roomkit_ui-0.3.0/src/roomkit_ui/theme.py +349 -0
  328. roomkit_ui-0.3.0/src/roomkit_ui/theme_live.py +71 -0
  329. roomkit_ui-0.3.0/src/roomkit_ui/tool_events.py +20 -0
  330. roomkit_ui-0.3.0/src/roomkit_ui/toolset.py +209 -0
  331. roomkit_ui-0.3.0/src/roomkit_ui/tray.py +168 -0
  332. roomkit_ui-0.3.0/src/roomkit_ui/tts/__init__.py +55 -0
  333. roomkit_ui-0.3.0/src/roomkit_ui/tts/_util.py +12 -0
  334. roomkit_ui-0.3.0/src/roomkit_ui/tts/azure.py +35 -0
  335. roomkit_ui-0.3.0/src/roomkit_ui/tts/elevenlabs.py +40 -0
  336. roomkit_ui-0.3.0/src/roomkit_ui/tts/gemini.py +31 -0
  337. roomkit_ui-0.3.0/src/roomkit_ui/tts/gradium.py +52 -0
  338. roomkit_ui-0.3.0/src/roomkit_ui/tts/neutts.py +25 -0
  339. roomkit_ui-0.3.0/src/roomkit_ui/tts/piper.py +22 -0
  340. roomkit_ui-0.3.0/src/roomkit_ui/tts/pocket.py +95 -0
  341. roomkit_ui-0.3.0/src/roomkit_ui/tts/qwen3.py +25 -0
  342. roomkit_ui-0.3.0/src/roomkit_ui/url_policy.py +221 -0
  343. roomkit_ui-0.3.0/src/roomkit_ui/vc_agent.py +381 -0
  344. roomkit_ui-0.3.0/src/roomkit_ui/vc_stt.py +275 -0
  345. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/__init__.py +31 -0
  346. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/capture.py +312 -0
  347. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/controller.py +268 -0
  348. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/detector.py +120 -0
  349. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/dtw.py +55 -0
  350. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/encoder_download.py +55 -0
  351. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/enroller.py +263 -0
  352. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/features.py +145 -0
  353. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/fingerprint.py +195 -0
  354. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/jobs.py +95 -0
  355. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/listener.py +138 -0
  356. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/page_sensitivity.py +34 -0
  357. roomkit_ui-0.3.0/src/roomkit_ui/wakeword/resample.py +88 -0
  358. roomkit_ui-0.3.0/src/roomkit_ui/watchdog.py +194 -0
  359. roomkit_ui-0.3.0/src/roomkit_ui/widgets/__init__.py +0 -0
  360. roomkit_ui-0.3.0/src/roomkit_ui/widgets/buttons.py +28 -0
  361. roomkit_ui-0.3.0/src/roomkit_ui/widgets/camera_dialog.py +232 -0
  362. roomkit_ui-0.3.0/src/roomkit_ui/widgets/camera_process.py +165 -0
  363. roomkit_ui-0.3.0/src/roomkit_ui/widgets/chat_bubble.py +482 -0
  364. roomkit_ui-0.3.0/src/roomkit_ui/widgets/chat_view.py +552 -0
  365. roomkit_ui-0.3.0/src/roomkit_ui/widgets/composer_dictation.py +94 -0
  366. roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_composer.py +551 -0
  367. roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_drawer.py +300 -0
  368. roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_history.py +359 -0
  369. roomkit_ui-0.3.0/src/roomkit_ui/widgets/conversation_home.py +176 -0
  370. roomkit_ui-0.3.0/src/roomkit_ui/widgets/dictation_log.py +78 -0
  371. roomkit_ui-0.3.0/src/roomkit_ui/widgets/hotkey_button.py +347 -0
  372. roomkit_ui-0.3.0/src/roomkit_ui/widgets/image_attachments.py +271 -0
  373. roomkit_ui-0.3.0/src/roomkit_ui/widgets/install_offer.py +124 -0
  374. roomkit_ui-0.3.0/src/roomkit_ui/widgets/main_window.py +652 -0
  375. roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_server.py +91 -0
  376. roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_web.py +128 -0
  377. roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_widget.py +341 -0
  378. roomkit_ui-0.3.0/src/roomkit_ui/widgets/mcp_app_wrapper.py +80 -0
  379. roomkit_ui-0.3.0/src/roomkit_ui/widgets/menus.py +79 -0
  380. roomkit_ui-0.3.0/src/roomkit_ui/widgets/message_input.py +77 -0
  381. roomkit_ui-0.3.0/src/roomkit_ui/widgets/navigation_brand.py +24 -0
  382. roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_drawer.py +357 -0
  383. roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_info.py +76 -0
  384. roomkit_ui-0.3.0/src/roomkit_ui/widgets/session_loading.py +78 -0
  385. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/__init__.py +5 -0
  386. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/about_page.py +95 -0
  387. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/appearance.py +95 -0
  388. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/attitudes_page.py +218 -0
  389. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_capture_page.py +143 -0
  390. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_page.py +40 -0
  391. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/audio_processing.py +338 -0
  392. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/catalog_controls.py +153 -0
  393. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/choice_cards.py +116 -0
  394. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/cli_tools_page.py +323 -0
  395. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/components_page.py +260 -0
  396. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/controls.py +247 -0
  397. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/conversation_page.py +133 -0
  398. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/diagnostics_page.py +57 -0
  399. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/dictation_page.py +192 -0
  400. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/feature_hints.py +89 -0
  401. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/general_page.py +125 -0
  402. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/images_setup.py +153 -0
  403. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/integration_controls.py +281 -0
  404. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/integrations_page.py +59 -0
  405. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/library_page.py +38 -0
  406. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/llm_fields.py +601 -0
  407. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/llm_library_page.py +526 -0
  408. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/mcp_page.py +657 -0
  409. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_combos.py +49 -0
  410. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_jobs.py +97 -0
  411. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/model_library.py +161 -0
  412. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/models_page.py +149 -0
  413. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/models_widgets.py +92 -0
  414. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/navigation.py +61 -0
  415. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/page_registry.py +548 -0
  416. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/panel.py +345 -0
  417. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/pipeline_summary.py +36 -0
  418. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/privacy_page.py +149 -0
  419. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/providers_page.py +281 -0
  420. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_catalogs.py +199 -0
  421. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_gemini_live.py +116 -0
  422. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_gpt_live.py +111 -0
  423. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/realtime_section.py +641 -0
  424. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/recordings_page.py +409 -0
  425. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/search.py +113 -0
  426. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/__init__.py +3 -0
  427. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/marketplace.py +209 -0
  428. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/my_skills.py +155 -0
  429. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/page.py +483 -0
  430. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/skills/widgets.py +99 -0
  431. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_dialogs.py +200 -0
  432. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_muse.py +55 -0
  433. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/speakers_page.py +367 -0
  434. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/style.py +327 -0
  435. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/telemetry_page.py +107 -0
  436. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/text_chat_setup.py +52 -0
  437. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/tool_search_section.py +96 -0
  438. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_agent_fields.py +210 -0
  439. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_azure_fields.py +67 -0
  440. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_cloud_fields.py +331 -0
  441. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_google_fields.py +106 -0
  442. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_local_fields.py +226 -0
  443. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/vc_meta_fields.py +32 -0
  444. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/voice_setup.py +330 -0
  445. roomkit_ui-0.3.0/src/roomkit_ui/widgets/settings/wakeword_page.py +252 -0
  446. roomkit_ui-0.3.0/src/roomkit_ui/widgets/skill_approval_dialog.py +40 -0
  447. roomkit_ui-0.3.0/src/roomkit_ui/widgets/sliding_panel.py +146 -0
  448. roomkit_ui-0.3.0/src/roomkit_ui/widgets/tool_activity.py +290 -0
  449. roomkit_ui-0.3.0/src/roomkit_ui/widgets/voice_name_dialog.py +28 -0
  450. roomkit_ui-0.3.0/src/roomkit_ui/widgets/vu_meter.py +103 -0
  451. roomkit_ui-0.3.0/src/roomkit_ui/widgets/wakeword_wizard.py +315 -0
  452. roomkit_ui-0.3.0/tests/conftest.py +52 -0
  453. roomkit_ui-0.3.0/tests/test_aec_dump.py +104 -0
  454. roomkit_ui-0.3.0/tests/test_aec_fallback.py +43 -0
  455. roomkit_ui-0.3.0/tests/test_app_graphics.py +57 -0
  456. roomkit_ui-0.3.0/tests/test_asyncgen_hooks.py +47 -0
  457. roomkit_ui-0.3.0/tests/test_audio_tags.py +132 -0
  458. roomkit_ui-0.3.0/tests/test_azure_speech.py +168 -0
  459. roomkit_ui-0.3.0/tests/test_build_flags.py +33 -0
  460. roomkit_ui-0.3.0/tests/test_builtin_tools.py +48 -0
  461. roomkit_ui-0.3.0/tests/test_buttons.py +27 -0
  462. roomkit_ui-0.3.0/tests/test_call_mode.py +294 -0
  463. roomkit_ui-0.3.0/tests/test_camera_dialog.py +137 -0
  464. roomkit_ui-0.3.0/tests/test_camera_process.py +175 -0
  465. roomkit_ui-0.3.0/tests/test_chat_bubble_streaming.py +283 -0
  466. roomkit_ui-0.3.0/tests/test_chat_fade_in.py +47 -0
  467. roomkit_ui-0.3.0/tests/test_cleanup_fds.py +105 -0
  468. roomkit_ui-0.3.0/tests/test_cleanup_timers.py +64 -0
  469. roomkit_ui-0.3.0/tests/test_cli_help_probe.py +103 -0
  470. roomkit_ui-0.3.0/tests/test_cli_tools.py +453 -0
  471. roomkit_ui-0.3.0/tests/test_cli_tools_config.py +81 -0
  472. roomkit_ui-0.3.0/tests/test_cli_tools_page.py +148 -0
  473. roomkit_ui-0.3.0/tests/test_component_installer.py +241 -0
  474. roomkit_ui-0.3.0/tests/test_components.py +123 -0
  475. roomkit_ui-0.3.0/tests/test_composer_dictation.py +355 -0
  476. roomkit_ui-0.3.0/tests/test_conversation_composer.py +158 -0
  477. roomkit_ui-0.3.0/tests/test_conversation_history_ui.py +467 -0
  478. roomkit_ui-0.3.0/tests/test_conversation_titles.py +137 -0
  479. roomkit_ui-0.3.0/tests/test_conversations.py +277 -0
  480. roomkit_ui-0.3.0/tests/test_diagnostics_page.py +266 -0
  481. roomkit_ui-0.3.0/tests/test_diarization_cache.py +59 -0
  482. roomkit_ui-0.3.0/tests/test_dictation_lifecycle.py +221 -0
  483. roomkit_ui-0.3.0/tests/test_dictation_stream.py +296 -0
  484. roomkit_ui-0.3.0/tests/test_doctor.py +34 -0
  485. roomkit_ui-0.3.0/tests/test_dsp_threads.py +104 -0
  486. roomkit_ui-0.3.0/tests/test_elevenlabs_stream_input.py +43 -0
  487. roomkit_ui-0.3.0/tests/test_engine_cleanup.py +272 -0
  488. roomkit_ui-0.3.0/tests/test_engine_cli_tools.py +90 -0
  489. roomkit_ui-0.3.0/tests/test_engine_lifecycle.py +135 -0
  490. roomkit_ui-0.3.0/tests/test_engine_realtime_session.py +104 -0
  491. roomkit_ui-0.3.0/tests/test_engine_text.py +356 -0
  492. roomkit_ui-0.3.0/tests/test_engine_tool_failures.py +123 -0
  493. roomkit_ui-0.3.0/tests/test_engine_tools.py +166 -0
  494. roomkit_ui-0.3.0/tests/test_enrollment.py +85 -0
  495. roomkit_ui-0.3.0/tests/test_features.py +194 -0
  496. roomkit_ui-0.3.0/tests/test_gemini_live_38.py +144 -0
  497. roomkit_ui-0.3.0/tests/test_gguf_models.py +371 -0
  498. roomkit_ui-0.3.0/tests/test_google_speech.py +145 -0
  499. roomkit_ui-0.3.0/tests/test_gpt_live.py +197 -0
  500. roomkit_ui-0.3.0/tests/test_hotkey.py +174 -0
  501. roomkit_ui-0.3.0/tests/test_idle_hangup.py +179 -0
  502. roomkit_ui-0.3.0/tests/test_image_conversation.py +190 -0
  503. roomkit_ui-0.3.0/tests/test_image_generation.py +425 -0
  504. roomkit_ui-0.3.0/tests/test_install_offer.py +131 -0
  505. roomkit_ui-0.3.0/tests/test_integrations_page.py +480 -0
  506. roomkit_ui-0.3.0/tests/test_live_conversation.py +78 -0
  507. roomkit_ui-0.3.0/tests/test_live_images.py +100 -0
  508. roomkit_ui-0.3.0/tests/test_llamacpp.py +288 -0
  509. roomkit_ui-0.3.0/tests/test_llm_library.py +269 -0
  510. roomkit_ui-0.3.0/tests/test_local_thinking.py +102 -0
  511. roomkit_ui-0.3.0/tests/test_local_tool_hint.py +83 -0
  512. roomkit_ui-0.3.0/tests/test_macos_app.py +162 -0
  513. roomkit_ui-0.3.0/tests/test_main_window_lifecycle.py +302 -0
  514. roomkit_ui-0.3.0/tests/test_mcp_app_bridge.py +53 -0
  515. roomkit_ui-0.3.0/tests/test_mcp_app_history.py +207 -0
  516. roomkit_ui-0.3.0/tests/test_mcp_app_widget_teardown.py +144 -0
  517. roomkit_ui-0.3.0/tests/test_mcp_auth.py +146 -0
  518. roomkit_ui-0.3.0/tests/test_mcp_config.py +61 -0
  519. roomkit_ui-0.3.0/tests/test_mcp_headers.py +102 -0
  520. roomkit_ui-0.3.0/tests/test_mcp_http_auth.py +168 -0
  521. roomkit_ui-0.3.0/tests/test_mcp_manager.py +455 -0
  522. roomkit_ui-0.3.0/tests/test_mcp_page_oauth.py +131 -0
  523. roomkit_ui-0.3.0/tests/test_mcp_server_instructions.py +446 -0
  524. roomkit_ui-0.3.0/tests/test_mcp_skills.py +400 -0
  525. roomkit_ui-0.3.0/tests/test_memory.py +353 -0
  526. roomkit_ui-0.3.0/tests/test_menus.py +47 -0
  527. roomkit_ui-0.3.0/tests/test_message_input.py +92 -0
  528. roomkit_ui-0.3.0/tests/test_meta_stt.py +122 -0
  529. roomkit_ui-0.3.0/tests/test_mic_mute.py +77 -0
  530. roomkit_ui-0.3.0/tests/test_missing_components.py +154 -0
  531. roomkit_ui-0.3.0/tests/test_model_download.py +262 -0
  532. roomkit_ui-0.3.0/tests/test_model_manager.py +87 -0
  533. roomkit_ui-0.3.0/tests/test_models_page.py +272 -0
  534. roomkit_ui-0.3.0/tests/test_muse_speakers.py +424 -0
  535. roomkit_ui-0.3.0/tests/test_name_speaker_tool.py +169 -0
  536. roomkit_ui-0.3.0/tests/test_one_mic_session.py +67 -0
  537. roomkit_ui-0.3.0/tests/test_paste.py +265 -0
  538. roomkit_ui-0.3.0/tests/test_paths.py +87 -0
  539. roomkit_ui-0.3.0/tests/test_pocket_tts.py +146 -0
  540. roomkit_ui-0.3.0/tests/test_realtime_diarization.py +77 -0
  541. roomkit_ui-0.3.0/tests/test_realtime_mcp_retry.py +151 -0
  542. roomkit_ui-0.3.0/tests/test_realtime_partial_hook.py +171 -0
  543. roomkit_ui-0.3.0/tests/test_realtime_providers.py +322 -0
  544. roomkit_ui-0.3.0/tests/test_realtime_section.py +177 -0
  545. roomkit_ui-0.3.0/tests/test_realtime_usage.py +79 -0
  546. roomkit_ui-0.3.0/tests/test_retired_models.py +111 -0
  547. roomkit_ui-0.3.0/tests/test_secret_store.py +147 -0
  548. roomkit_ui-0.3.0/tests/test_session_cancel_ui.py +34 -0
  549. roomkit_ui-0.3.0/tests/test_session_cost.py +159 -0
  550. roomkit_ui-0.3.0/tests/test_session_drawer.py +229 -0
  551. roomkit_ui-0.3.0/tests/test_session_loading.py +56 -0
  552. roomkit_ui-0.3.0/tests/test_session_models.py +236 -0
  553. roomkit_ui-0.3.0/tests/test_session_recording.py +41 -0
  554. roomkit_ui-0.3.0/tests/test_settings.py +360 -0
  555. roomkit_ui-0.3.0/tests/test_settings_controls_style.py +75 -0
  556. roomkit_ui-0.3.0/tests/test_settings_lifetime.py +127 -0
  557. roomkit_ui-0.3.0/tests/test_settings_panel.py +971 -0
  558. roomkit_ui-0.3.0/tests/test_skill_download.py +98 -0
  559. roomkit_ui-0.3.0/tests/test_skill_git.py +146 -0
  560. roomkit_ui-0.3.0/tests/test_skill_manager.py +227 -0
  561. roomkit_ui-0.3.0/tests/test_skills_marketplace.py +157 -0
  562. roomkit_ui-0.3.0/tests/test_skills_sh_client.py +96 -0
  563. roomkit_ui-0.3.0/tests/test_smart_turn.py +184 -0
  564. roomkit_ui-0.3.0/tests/test_sounds.py +52 -0
  565. roomkit_ui-0.3.0/tests/test_speaker_settings.py +59 -0
  566. roomkit_ui-0.3.0/tests/test_spoken_language.py +80 -0
  567. roomkit_ui-0.3.0/tests/test_text_chat.py +104 -0
  568. roomkit_ui-0.3.0/tests/test_text_conversation.py +157 -0
  569. roomkit_ui-0.3.0/tests/test_text_mcp_apps.py +210 -0
  570. roomkit_ui-0.3.0/tests/test_theme_chevron.py +35 -0
  571. roomkit_ui-0.3.0/tests/test_theme_fonts.py +52 -0
  572. roomkit_ui-0.3.0/tests/test_theme_live.py +49 -0
  573. roomkit_ui-0.3.0/tests/test_tool_activity.py +105 -0
  574. roomkit_ui-0.3.0/tests/test_tool_search.py +267 -0
  575. roomkit_ui-0.3.0/tests/test_toolset.py +172 -0
  576. roomkit_ui-0.3.0/tests/test_tts_cache.py +80 -0
  577. roomkit_ui-0.3.0/tests/test_url_policy.py +139 -0
  578. roomkit_ui-0.3.0/tests/test_vc_agent.py +803 -0
  579. roomkit_ui-0.3.0/tests/test_vc_capture_source.py +73 -0
  580. roomkit_ui-0.3.0/tests/test_vc_cloud_fields.py +146 -0
  581. roomkit_ui-0.3.0/tests/test_vc_interruption.py +119 -0
  582. roomkit_ui-0.3.0/tests/test_vc_pipeline_speakers.py +110 -0
  583. roomkit_ui-0.3.0/tests/test_vc_reasoning.py +297 -0
  584. roomkit_ui-0.3.0/tests/test_vc_session_memory.py +45 -0
  585. roomkit_ui-0.3.0/tests/test_vc_speaker_hook.py +68 -0
  586. roomkit_ui-0.3.0/tests/test_vc_tts_filter.py +86 -0
  587. roomkit_ui-0.3.0/tests/test_vc_tts_hooks.py +218 -0
  588. roomkit_ui-0.3.0/tests/test_voice_error_notices.py +51 -0
  589. roomkit_ui-0.3.0/tests/test_voice_naming_chat.py +119 -0
  590. roomkit_ui-0.3.0/tests/test_voice_settings_pages.py +294 -0
  591. roomkit_ui-0.3.0/tests/test_wakeword.py +264 -0
  592. roomkit_ui-0.3.0/tests/test_wakeword_capture.py +117 -0
  593. roomkit_ui-0.3.0/tests/test_wakeword_controller.py +298 -0
  594. roomkit_ui-0.3.0/tests/test_wakeword_encoder_download.py +112 -0
  595. roomkit_ui-0.3.0/tests/test_wakeword_enroller.py +171 -0
  596. roomkit_ui-0.3.0/tests/test_wakeword_listener.py +190 -0
  597. roomkit_ui-0.3.0/tests/test_wakeword_resample.py +193 -0
  598. roomkit_ui-0.3.0/tests/test_wakeword_threads.py +265 -0
  599. roomkit_ui-0.3.0/tests/test_watchdog.py +86 -0
  600. roomkit_ui-0.3.0/tests/test_windows_compat.py +73 -0
  601. roomkit_ui-0.3.0/tests/vc_harness.py +209 -0
  602. 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/' }}
@@ -0,0 +1,15 @@
1
+ __pycache__/
2
+ *.pyc
3
+ *.pyo
4
+ .venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .eggs/
9
+ *.app
10
+ *.dmg
11
+ *.spec
12
+ .DS_Store
13
+ *.log
14
+ .env
15
+ tasks/