openvoiceui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/.env.example +104 -0
  2. package/Dockerfile +30 -0
  3. package/LICENSE +21 -0
  4. package/README.md +638 -0
  5. package/SETUP.md +360 -0
  6. package/app.py +232 -0
  7. package/auto-approve-devices.js +111 -0
  8. package/cli/index.js +372 -0
  9. package/config/__init__.py +4 -0
  10. package/config/default.yaml +43 -0
  11. package/config/flags.yaml +67 -0
  12. package/config/loader.py +203 -0
  13. package/config/providers.yaml +71 -0
  14. package/config/speech_normalization.yaml +182 -0
  15. package/config/theme.json +4 -0
  16. package/data/greetings.json +25 -0
  17. package/default-pages/ai-image-creator.html +915 -0
  18. package/default-pages/bulk-image-uploader.html +492 -0
  19. package/default-pages/desktop.html +2865 -0
  20. package/default-pages/file-explorer.html +854 -0
  21. package/default-pages/interactive-map.html +655 -0
  22. package/default-pages/style-guide.html +1005 -0
  23. package/default-pages/website-setup.html +1623 -0
  24. package/deploy/openclaw/Dockerfile +46 -0
  25. package/deploy/openvoiceui.service +30 -0
  26. package/deploy/setup-nginx.sh +50 -0
  27. package/deploy/setup-sudo.sh +306 -0
  28. package/deploy/skill-runner/Dockerfile +19 -0
  29. package/deploy/skill-runner/requirements.txt +14 -0
  30. package/deploy/skill-runner/server.py +269 -0
  31. package/deploy/supertonic/Dockerfile +22 -0
  32. package/deploy/supertonic/server.py +79 -0
  33. package/docker-compose.pinokio.yml +11 -0
  34. package/docker-compose.yml +59 -0
  35. package/greetings.json +25 -0
  36. package/index.html +65 -0
  37. package/inject-device-identity.js +142 -0
  38. package/package.json +82 -0
  39. package/profiles/default.json +114 -0
  40. package/profiles/manager.py +354 -0
  41. package/profiles/schema.json +337 -0
  42. package/prompts/voice-system-prompt.md +149 -0
  43. package/providers/__init__.py +39 -0
  44. package/providers/base.py +63 -0
  45. package/providers/llm/__init__.py +12 -0
  46. package/providers/llm/base.py +71 -0
  47. package/providers/llm/clawdbot_provider.py +112 -0
  48. package/providers/llm/zai_provider.py +115 -0
  49. package/providers/registry.py +320 -0
  50. package/providers/stt/__init__.py +12 -0
  51. package/providers/stt/base.py +58 -0
  52. package/providers/stt/webspeech_provider.py +49 -0
  53. package/providers/stt/whisper_provider.py +100 -0
  54. package/providers/tts/__init__.py +20 -0
  55. package/providers/tts/base.py +91 -0
  56. package/providers/tts/groq_provider.py +74 -0
  57. package/providers/tts/supertonic_provider.py +72 -0
  58. package/requirements.txt +38 -0
  59. package/routes/__init__.py +10 -0
  60. package/routes/admin.py +515 -0
  61. package/routes/canvas.py +1315 -0
  62. package/routes/chat.py +51 -0
  63. package/routes/conversation.py +2158 -0
  64. package/routes/elevenlabs_hybrid.py +306 -0
  65. package/routes/greetings.py +98 -0
  66. package/routes/icons.py +279 -0
  67. package/routes/image_gen.py +364 -0
  68. package/routes/instructions.py +190 -0
  69. package/routes/music.py +838 -0
  70. package/routes/onboarding.py +43 -0
  71. package/routes/pi.py +62 -0
  72. package/routes/profiles.py +215 -0
  73. package/routes/report_issue.py +68 -0
  74. package/routes/static_files.py +533 -0
  75. package/routes/suno.py +664 -0
  76. package/routes/theme.py +81 -0
  77. package/routes/transcripts.py +199 -0
  78. package/routes/vision.py +348 -0
  79. package/routes/workspace.py +288 -0
  80. package/server.py +1510 -0
  81. package/services/__init__.py +1 -0
  82. package/services/auth.py +143 -0
  83. package/services/canvas_versioning.py +239 -0
  84. package/services/db_pool.py +107 -0
  85. package/services/gateway.py +16 -0
  86. package/services/gateway_manager.py +333 -0
  87. package/services/gateways/__init__.py +12 -0
  88. package/services/gateways/base.py +110 -0
  89. package/services/gateways/compat.py +264 -0
  90. package/services/gateways/openclaw.py +1134 -0
  91. package/services/health.py +100 -0
  92. package/services/memory_client.py +455 -0
  93. package/services/paths.py +26 -0
  94. package/services/speech_normalizer.py +285 -0
  95. package/services/tts.py +270 -0
  96. package/setup-config.js +262 -0
  97. package/sounds/air_horn.mp3 +0 -0
  98. package/sounds/bruh.mp3 +0 -0
  99. package/sounds/crowd_cheer.mp3 +0 -0
  100. package/sounds/gunshot.mp3 +0 -0
  101. package/sounds/impact.mp3 +0 -0
  102. package/sounds/lets_go.mp3 +0 -0
  103. package/sounds/record_stop.mp3 +0 -0
  104. package/sounds/rewind.mp3 +0 -0
  105. package/sounds/sad_trombone.mp3 +0 -0
  106. package/sounds/scratch_long.mp3 +0 -0
  107. package/sounds/yeah.mp3 +0 -0
  108. package/src/adapters/ClawdBotAdapter.js +264 -0
  109. package/src/adapters/_template.js +133 -0
  110. package/src/adapters/elevenlabs-classic.js +841 -0
  111. package/src/adapters/elevenlabs-hybrid.js +812 -0
  112. package/src/adapters/hume-evi.js +676 -0
  113. package/src/admin.html +1339 -0
  114. package/src/app.js +8802 -0
  115. package/src/core/Config.js +173 -0
  116. package/src/core/EmotionEngine.js +307 -0
  117. package/src/core/EventBridge.js +180 -0
  118. package/src/core/EventBus.js +117 -0
  119. package/src/core/VoiceSession.js +607 -0
  120. package/src/face/BaseFace.js +259 -0
  121. package/src/face/EyeFace.js +208 -0
  122. package/src/face/HaloSmokeFace.js +509 -0
  123. package/src/face/manifest.json +27 -0
  124. package/src/face/previews/eyes.svg +16 -0
  125. package/src/face/previews/orb.svg +29 -0
  126. package/src/features/MusicPlayer.js +620 -0
  127. package/src/features/Soundboard.js +128 -0
  128. package/src/providers/DeepgramSTT.js +472 -0
  129. package/src/providers/DeepgramStreamingSTT.js +766 -0
  130. package/src/providers/GroqSTT.js +559 -0
  131. package/src/providers/TTSPlayer.js +323 -0
  132. package/src/providers/WebSpeechSTT.js +479 -0
  133. package/src/providers/tts/BaseTTSProvider.js +81 -0
  134. package/src/providers/tts/HumeProvider.js +77 -0
  135. package/src/providers/tts/SupertonicProvider.js +174 -0
  136. package/src/providers/tts/index.js +140 -0
  137. package/src/shell/adapter-registry.js +154 -0
  138. package/src/shell/caller-bridge.js +35 -0
  139. package/src/shell/camera-bridge.js +28 -0
  140. package/src/shell/canvas-bridge.js +32 -0
  141. package/src/shell/commercial-bridge.js +44 -0
  142. package/src/shell/face-bridge.js +44 -0
  143. package/src/shell/music-bridge.js +60 -0
  144. package/src/shell/orchestrator.js +233 -0
  145. package/src/shell/profile-discovery.js +303 -0
  146. package/src/shell/sounds-bridge.js +28 -0
  147. package/src/shell/transcript-bridge.js +61 -0
  148. package/src/shell/waveform-bridge.js +33 -0
  149. package/src/styles/base.css +2862 -0
  150. package/src/styles/face.css +417 -0
  151. package/src/styles/pi-overrides.css +89 -0
  152. package/src/styles/theme-dark.css +67 -0
  153. package/src/test-tts.html +175 -0
  154. package/src/ui/AppShell.js +544 -0
  155. package/src/ui/ProfileSwitcher.js +228 -0
  156. package/src/ui/SessionControl.js +240 -0
  157. package/src/ui/face/FacePicker.js +195 -0
  158. package/src/ui/face/FaceRenderer.js +309 -0
  159. package/src/ui/settings/PlaylistEditor.js +366 -0
  160. package/src/ui/settings/SettingsPanel.css +684 -0
  161. package/src/ui/settings/SettingsPanel.js +419 -0
  162. package/src/ui/settings/TTSVoicePreview.js +210 -0
  163. package/src/ui/themes/ThemeManager.js +213 -0
  164. package/src/ui/visualizers/BaseVisualizer.js +29 -0
  165. package/src/ui/visualizers/PartyFXVisualizer.css +291 -0
  166. package/src/ui/visualizers/PartyFXVisualizer.js +637 -0
  167. package/static/emulators/jsdos/js-dos.css +1 -0
  168. package/static/emulators/jsdos/js-dos.js +22 -0
  169. package/static/favicon.svg +55 -0
  170. package/static/icons/apple-touch-icon.png +0 -0
  171. package/static/icons/favicon-32.png +0 -0
  172. package/static/icons/icon-192.png +0 -0
  173. package/static/icons/icon-512.png +0 -0
  174. package/static/install.html +449 -0
  175. package/static/manifest.json +26 -0
  176. package/static/sw.js +21 -0
  177. package/tts_providers/__init__.py +136 -0
  178. package/tts_providers/base_provider.py +319 -0
  179. package/tts_providers/groq_provider.py +155 -0
  180. package/tts_providers/hume_provider.py +226 -0
  181. package/tts_providers/providers_config.json +119 -0
  182. package/tts_providers/qwen3_provider.py +371 -0
  183. package/tts_providers/resemble_provider.py +315 -0
  184. package/tts_providers/supertonic_provider.py +557 -0
  185. package/tts_providers/supertonic_tts.py +399 -0
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Agent Adapter Template
3
+ *
4
+ * Copy this file to create a new agent adapter.
5
+ * Replace all TODO placeholders with your implementation.
6
+ *
7
+ * Rules:
8
+ * 1. Communicate with the outside world ONLY through the bridge
9
+ * 2. Manage your own audio, WebSocket, and SDK internally
10
+ * 3. Release ALL resources in destroy()
11
+ * 4. Never import from other adapters
12
+ *
13
+ * Ref: future-dev-plans/17-MULTI-AGENT-FRAMEWORK.md
14
+ */
15
+
16
+ import { AgentEvents, AgentActions } from '../core/EventBridge.js';
17
+
18
+ export const TemplateAdapter = {
19
+ /** Human-readable name shown in UI */
20
+ name: 'My Agent System',
21
+
22
+ /**
23
+ * What this adapter can do.
24
+ * UI shows/hides features based on this list.
25
+ *
26
+ * Available capabilities:
27
+ * 'canvas' - Agent can show HTML pages on the canvas display
28
+ * 'dj_soundboard' - Agent can play DJ sound effects
29
+ * 'caller_effects' - Agent can toggle phone filter audio effect
30
+ * 'music_sync' - Agent can control music playback
31
+ * 'multi_voice' - Agent uses multiple voices/personas
32
+ * 'emotion_detection' - Agent sends emotion scores per utterance
33
+ * 'commercials' - Agent can trigger commercial breaks
34
+ * 'vps_control' - Agent can run commands on VPS
35
+ * 'wake_word' - Agent supports wake word activation
36
+ */
37
+ capabilities: [
38
+ // TODO: add capabilities your adapter supports
39
+ ],
40
+
41
+ // ── Private state (prefix _ to mark as internal) ──────────────
42
+ _bridge: null,
43
+ _config: null,
44
+ _unsubscribers: [], // Store bridge.on() return values for cleanup
45
+
46
+ // ─────────────────────────────────────────────────────────────
47
+ // INIT — called when user selects this adapter mode
48
+ //
49
+ // Load SDKs, set up connections, subscribe to UI actions.
50
+ // DO NOT start mic or begin conversation here — that's start().
51
+ // ─────────────────────────────────────────────────────────────
52
+ async init(bridge, config) {
53
+ this._bridge = bridge;
54
+ this._config = config || {};
55
+
56
+ // TODO: load your SDK, set up audio chain, preload assets
57
+
58
+ // Subscribe to UI → Agent actions
59
+ this._unsubscribers.push(
60
+ bridge.on(AgentActions.END_SESSION, () => this.stop()),
61
+ // bridge.on(AgentActions.SEND_MESSAGE, (d) => this._handleSendMessage(d.text)),
62
+ // bridge.on(AgentActions.CONTEXT_UPDATE, (d) => this._sendContext(d.text)),
63
+ // bridge.on(AgentActions.FORCE_MESSAGE, (d) => this._forceMessage(d.text)),
64
+ );
65
+ },
66
+
67
+ // ─────────────────────────────────────────────────────────────
68
+ // START — begin conversation (called from user click)
69
+ //
70
+ // Start mic, connect to agent backend, etc.
71
+ // ─────────────────────────────────────────────────────────────
72
+ async start() {
73
+ // TODO: unlock iOS AudioContext if needed
74
+ // const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
75
+ // stream.getTracks().forEach(t => t.stop());
76
+
77
+ // TODO: connect to your agent
78
+
79
+ // Emit connected event when ready
80
+ this._bridge.emit(AgentEvents.CONNECTED);
81
+ this._bridge.emit(AgentEvents.STATE_CHANGED, { state: 'listening' });
82
+ this._bridge.emit(AgentEvents.MOOD, { mood: 'happy' });
83
+ },
84
+
85
+ // ─────────────────────────────────────────────────────────────
86
+ // STOP — end conversation gracefully (user clicks stop)
87
+ // ─────────────────────────────────────────────────────────────
88
+ async stop() {
89
+ // TODO: end session, release mic
90
+
91
+ this._bridge.emit(AgentEvents.STATE_CHANGED, { state: 'idle' });
92
+ this._bridge.emit(AgentEvents.DISCONNECTED);
93
+ this._bridge.emit(AgentEvents.MOOD, { mood: 'neutral' });
94
+ },
95
+
96
+ // ─────────────────────────────────────────────────────────────
97
+ // DESTROY — full teardown on adapter switch
98
+ //
99
+ // MUST release: mic, AudioContext, WebSocket, SDK instances.
100
+ // MUST unsubscribe all bridge.on() subscriptions.
101
+ // ─────────────────────────────────────────────────────────────
102
+ async destroy() {
103
+ await this.stop();
104
+
105
+ // Unsubscribe all bridge listeners
106
+ this._unsubscribers.forEach(unsub => unsub());
107
+ this._unsubscribers = [];
108
+
109
+ // TODO: disconnect SDK, close AudioContext, etc.
110
+ },
111
+
112
+ // ─────────────────────────────────────────────────────────────
113
+ // PRIVATE methods (prefix _ to mark as internal)
114
+ // ─────────────────────────────────────────────────────────────
115
+
116
+ // Example: emit bridge events when things happen
117
+ _onAgentSpeaking(text) {
118
+ this._bridge.emit(AgentEvents.STATE_CHANGED, { state: 'speaking' });
119
+ this._bridge.emit(AgentEvents.TTS_PLAYING);
120
+ this._bridge.emit(AgentEvents.MESSAGE, { role: 'assistant', text, final: true });
121
+ },
122
+
123
+ _onAgentListening() {
124
+ this._bridge.emit(AgentEvents.TTS_STOPPED);
125
+ this._bridge.emit(AgentEvents.STATE_CHANGED, { state: 'listening' });
126
+ },
127
+
128
+ _onToolCall(name, params, result) {
129
+ this._bridge.emit(AgentEvents.TOOL_CALLED, { name, params, result });
130
+ },
131
+ };
132
+
133
+ export default TemplateAdapter;