flawed-avatar 0.2.1

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 (152) hide show
  1. package/assets/animations/idle/Breathing Idle.fbx +0 -0
  2. package/assets/animations/idle/look away gesture.fbx +0 -0
  3. package/assets/animations/idle/weight shift.fbx +0 -0
  4. package/assets/animations/speaking/Agreeing.fbx +0 -0
  5. package/assets/animations/speaking/Talking (1).fbx +0 -0
  6. package/assets/animations/speaking/Talking (2).fbx +0 -0
  7. package/assets/animations/speaking/Talking (3).fbx +0 -0
  8. package/assets/animations/speaking/Talking.fbx +0 -0
  9. package/assets/animations/speaking/head nod yes.fbx +0 -0
  10. package/assets/animations/thinking/Thinking.fbx +0 -0
  11. package/assets/animations/thinking/thoughtful head shake.fbx +0 -0
  12. package/assets/animations/working/acknowledging.fbx +0 -0
  13. package/assets/animations/working/lengthy head nod.fbx +0 -0
  14. package/assets/icon.png +0 -0
  15. package/assets/models/CaptainLobster.vrm +0 -0
  16. package/assets/models/default-avatar.vrm +0 -0
  17. package/dist/chat-preload.cjs +87 -0
  18. package/dist/chat-renderer-bundle/chat-index.html +16 -0
  19. package/dist/chat-renderer-bundle/chat-renderer.js +355 -0
  20. package/dist/chat-renderer-bundle/styles/base.css +106 -0
  21. package/dist/chat-renderer-bundle/styles/chat.css +516 -0
  22. package/dist/chat-renderer-bundle/styles/components/button.css +221 -0
  23. package/dist/chat-renderer-bundle/styles/components/indicator.css +216 -0
  24. package/dist/chat-renderer-bundle/styles/components/input.css +139 -0
  25. package/dist/chat-renderer-bundle/styles/components/toast.css +204 -0
  26. package/dist/chat-renderer-bundle/styles/controls.css +279 -0
  27. package/dist/chat-renderer-bundle/styles/settings.css +310 -0
  28. package/dist/chat-renderer-bundle/styles/tokens.css +220 -0
  29. package/dist/chat-renderer-bundle/styles/utilities.css +349 -0
  30. package/dist/main/main/display-utils.d.ts +12 -0
  31. package/dist/main/main/display-utils.js +29 -0
  32. package/dist/main/main/gateway-client.d.ts +13 -0
  33. package/dist/main/main/gateway-client.js +265 -0
  34. package/dist/main/main/main.d.ts +1 -0
  35. package/dist/main/main/main.js +157 -0
  36. package/dist/main/main/persistence/chat-store.d.ts +8 -0
  37. package/dist/main/main/persistence/chat-store.js +110 -0
  38. package/dist/main/main/persistence/file-store.d.ts +17 -0
  39. package/dist/main/main/persistence/file-store.js +183 -0
  40. package/dist/main/main/persistence/index.d.ts +8 -0
  41. package/dist/main/main/persistence/index.js +8 -0
  42. package/dist/main/main/persistence/migrations.d.ts +23 -0
  43. package/dist/main/main/persistence/migrations.js +191 -0
  44. package/dist/main/main/persistence/settings-store.d.ts +32 -0
  45. package/dist/main/main/persistence/settings-store.js +174 -0
  46. package/dist/main/main/persistence/types.d.ts +72 -0
  47. package/dist/main/main/persistence/types.js +69 -0
  48. package/dist/main/main/settings-broadcast.d.ts +3 -0
  49. package/dist/main/main/settings-broadcast.js +9 -0
  50. package/dist/main/main/stdin-listener.d.ts +15 -0
  51. package/dist/main/main/stdin-listener.js +27 -0
  52. package/dist/main/main/tray.d.ts +3 -0
  53. package/dist/main/main/tray.js +59 -0
  54. package/dist/main/main/window-manager.d.ts +23 -0
  55. package/dist/main/main/window-manager.js +232 -0
  56. package/dist/main/main/window.d.ts +3 -0
  57. package/dist/main/main/window.js +528 -0
  58. package/dist/main/shared/config.d.ts +91 -0
  59. package/dist/main/shared/config.js +111 -0
  60. package/dist/main/shared/ipc-channels.d.ts +54 -0
  61. package/dist/main/shared/ipc-channels.js +68 -0
  62. package/dist/main/shared/types.d.ts +6 -0
  63. package/dist/main/shared/types.js +1 -0
  64. package/dist/preload.cjs +256 -0
  65. package/dist/renderer-bundle/index.html +63 -0
  66. package/dist/renderer-bundle/renderer.js +100734 -0
  67. package/dist/renderer-bundle/styles/base.css +106 -0
  68. package/dist/renderer-bundle/styles/chat.css +516 -0
  69. package/dist/renderer-bundle/styles/components/button.css +221 -0
  70. package/dist/renderer-bundle/styles/components/indicator.css +216 -0
  71. package/dist/renderer-bundle/styles/components/input.css +139 -0
  72. package/dist/renderer-bundle/styles/components/toast.css +204 -0
  73. package/dist/renderer-bundle/styles/controls.css +279 -0
  74. package/dist/renderer-bundle/styles/settings.css +310 -0
  75. package/dist/renderer-bundle/styles/tokens.css +220 -0
  76. package/dist/renderer-bundle/styles/utilities.css +349 -0
  77. package/index.ts +32 -0
  78. package/openclaw.plugin.json +22 -0
  79. package/package.json +45 -0
  80. package/src/electron-launcher.ts +63 -0
  81. package/src/main/chat-preload.cjs +87 -0
  82. package/src/main/display-utils.ts +39 -0
  83. package/src/main/gateway-client.ts +312 -0
  84. package/src/main/main.ts +169 -0
  85. package/src/main/persistence/chat-store.ts +143 -0
  86. package/src/main/persistence/file-store.ts +221 -0
  87. package/src/main/persistence/index.ts +69 -0
  88. package/src/main/persistence/migrations.ts +232 -0
  89. package/src/main/persistence/settings-store.ts +219 -0
  90. package/src/main/persistence/types.ts +107 -0
  91. package/src/main/preload.cjs +256 -0
  92. package/src/main/settings-broadcast.ts +13 -0
  93. package/src/main/settings-preload.cjs +153 -0
  94. package/src/main/stdin-listener.ts +34 -0
  95. package/src/main/tray.ts +65 -0
  96. package/src/main/window-manager.ts +298 -0
  97. package/src/main/window.ts +614 -0
  98. package/src/renderer/audio/audio-player.ts +161 -0
  99. package/src/renderer/audio/frequency-analyzer.ts +104 -0
  100. package/src/renderer/audio/index.ts +36 -0
  101. package/src/renderer/audio/kokoro-model-loader.ts +128 -0
  102. package/src/renderer/audio/kokoro-tts-service.ts +370 -0
  103. package/src/renderer/audio/lip-sync-profile.json +1 -0
  104. package/src/renderer/audio/phoneme-mapper.ts +120 -0
  105. package/src/renderer/audio/tts-controller.ts +344 -0
  106. package/src/renderer/audio/tts-service-factory.ts +75 -0
  107. package/src/renderer/audio/tts-service.ts +16 -0
  108. package/src/renderer/audio/types.ts +120 -0
  109. package/src/renderer/audio/web-speech-tts.ts +177 -0
  110. package/src/renderer/audio/wlipsync-analyzer.ts +145 -0
  111. package/src/renderer/avatar/animation-loader.ts +114 -0
  112. package/src/renderer/avatar/animator.ts +322 -0
  113. package/src/renderer/avatar/expressions.ts +165 -0
  114. package/src/renderer/avatar/eye-gaze.ts +255 -0
  115. package/src/renderer/avatar/eye-saccades.ts +133 -0
  116. package/src/renderer/avatar/hover-awareness.ts +125 -0
  117. package/src/renderer/avatar/ibl-enhancer.ts +163 -0
  118. package/src/renderer/avatar/lip-sync.ts +258 -0
  119. package/src/renderer/avatar/mixamo-retarget.ts +169 -0
  120. package/src/renderer/avatar/pixel-transparency.ts +65 -0
  121. package/src/renderer/avatar/scene.ts +70 -0
  122. package/src/renderer/avatar/spring-bones.ts +27 -0
  123. package/src/renderer/avatar/state-machine.ts +117 -0
  124. package/src/renderer/avatar/vrm-loader.ts +71 -0
  125. package/src/renderer/chat-window/chat-index.html +16 -0
  126. package/src/renderer/chat-window/chat-renderer.ts +28 -0
  127. package/src/renderer/index.html +63 -0
  128. package/src/renderer/renderer.ts +329 -0
  129. package/src/renderer/settings-window/settings-controls.ts +223 -0
  130. package/src/renderer/settings-window/settings-index.html +16 -0
  131. package/src/renderer/settings-window/settings-panel.ts +346 -0
  132. package/src/renderer/settings-window/settings-renderer.ts +5 -0
  133. package/src/renderer/styles/base.css +106 -0
  134. package/src/renderer/styles/chat.css +516 -0
  135. package/src/renderer/styles/components/button.css +221 -0
  136. package/src/renderer/styles/components/indicator.css +216 -0
  137. package/src/renderer/styles/components/input.css +139 -0
  138. package/src/renderer/styles/components/toast.css +204 -0
  139. package/src/renderer/styles/controls.css +279 -0
  140. package/src/renderer/styles/settings.css +310 -0
  141. package/src/renderer/styles/tokens.css +220 -0
  142. package/src/renderer/styles/utilities.css +349 -0
  143. package/src/renderer/types/avatar-bridge.d.ts +86 -0
  144. package/src/renderer/types/chat-bridge.d.ts +37 -0
  145. package/src/renderer/types/settings-bridge.d.ts +54 -0
  146. package/src/renderer/ui/chat-bubble.ts +435 -0
  147. package/src/renderer/ui/icons.ts +47 -0
  148. package/src/renderer/ui/typing-indicator.ts +41 -0
  149. package/src/service.ts +163 -0
  150. package/src/shared/config.ts +135 -0
  151. package/src/shared/ipc-channels.ts +81 -0
  152. package/src/shared/types.ts +7 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Toast Component
3
+ * Notification messages that appear temporarily
4
+ */
5
+
6
+ /* === Toast Container === */
7
+ .toast-container {
8
+ position: fixed;
9
+ bottom: var(--space-4);
10
+ left: 50%;
11
+ transform: translateX(-50%);
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--space-2);
15
+ z-index: var(--z-toast);
16
+ pointer-events: none;
17
+ }
18
+
19
+ /* === Base Toast === */
20
+ .toast {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--space-2);
24
+ padding: var(--space-3) var(--space-4);
25
+ background: var(--glass-bg);
26
+ backdrop-filter: blur(var(--glass-blur));
27
+ -webkit-backdrop-filter: blur(var(--glass-blur));
28
+ border: 1px solid var(--glass-border);
29
+ border-radius: var(--radius-lg);
30
+ box-shadow: var(--shadow-lg);
31
+ color: var(--text-primary);
32
+ font-size: var(--font-size-sm);
33
+ pointer-events: auto;
34
+ transform: translateY(100%);
35
+ opacity: 0;
36
+ transition:
37
+ transform var(--duration-slower) var(--ease-out-back),
38
+ opacity var(--duration-normal);
39
+ }
40
+
41
+ /* Visible state */
42
+ .toast.is-visible {
43
+ transform: translateY(0);
44
+ opacity: 1;
45
+ }
46
+
47
+ /* Exiting state */
48
+ .toast.is-exiting {
49
+ transform: translateY(100%);
50
+ opacity: 0;
51
+ transition:
52
+ transform var(--duration-normal) var(--ease-out-expo),
53
+ opacity var(--duration-fast);
54
+ }
55
+
56
+ /* === Toast Variants === */
57
+ .toast--error {
58
+ border-color: var(--color-error);
59
+ background: linear-gradient(
60
+ 135deg,
61
+ rgba(255, 107, 107, 0.1) 0%,
62
+ var(--glass-bg) 100%
63
+ );
64
+ }
65
+
66
+ .toast--error .toast__icon {
67
+ color: var(--color-error);
68
+ }
69
+
70
+ .toast--success {
71
+ border-color: var(--color-success);
72
+ background: linear-gradient(
73
+ 135deg,
74
+ rgba(107, 255, 140, 0.1) 0%,
75
+ var(--glass-bg) 100%
76
+ );
77
+ }
78
+
79
+ .toast--success .toast__icon {
80
+ color: var(--color-success);
81
+ }
82
+
83
+ .toast--warning {
84
+ border-color: var(--color-warning);
85
+ background: linear-gradient(
86
+ 135deg,
87
+ rgba(255, 180, 100, 0.1) 0%,
88
+ var(--glass-bg) 100%
89
+ );
90
+ }
91
+
92
+ .toast--warning .toast__icon {
93
+ color: var(--color-warning);
94
+ }
95
+
96
+ .toast--info {
97
+ border-color: var(--accent-blue);
98
+ background: linear-gradient(
99
+ 135deg,
100
+ rgba(100, 180, 255, 0.1) 0%,
101
+ var(--glass-bg) 100%
102
+ );
103
+ }
104
+
105
+ .toast--info .toast__icon {
106
+ color: var(--accent-blue);
107
+ }
108
+
109
+ /* === Toast Elements === */
110
+ .toast__icon {
111
+ width: 16px;
112
+ height: 16px;
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .toast__message {
117
+ flex: 1;
118
+ line-height: var(--line-height-tight);
119
+ }
120
+
121
+ .toast__close {
122
+ width: 20px;
123
+ height: 20px;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ flex-shrink: 0;
128
+ border-radius: var(--radius-sm);
129
+ color: var(--text-secondary);
130
+ cursor: pointer;
131
+ transition:
132
+ background var(--duration-fast),
133
+ color var(--duration-fast);
134
+ }
135
+
136
+ .toast__close:hover {
137
+ background: var(--surface-hover);
138
+ color: var(--text-primary);
139
+ }
140
+
141
+ .toast__close svg {
142
+ width: 12px;
143
+ height: 12px;
144
+ }
145
+
146
+ /* === Toast with action === */
147
+ .toast__action {
148
+ padding: var(--space-1) var(--space-2);
149
+ border-radius: var(--radius-sm);
150
+ background: var(--surface-button);
151
+ color: var(--accent-blue);
152
+ font-size: var(--font-size-xs);
153
+ font-weight: var(--font-weight-medium);
154
+ cursor: pointer;
155
+ transition:
156
+ background var(--duration-fast),
157
+ color var(--duration-fast);
158
+ }
159
+
160
+ .toast__action:hover {
161
+ background: var(--accent-blue-soft);
162
+ color: var(--text-primary);
163
+ }
164
+
165
+ /* === Progress bar for auto-dismiss === */
166
+ .toast__progress {
167
+ position: absolute;
168
+ bottom: 0;
169
+ left: 0;
170
+ right: 0;
171
+ height: 2px;
172
+ background: var(--surface-sunken);
173
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
174
+ overflow: hidden;
175
+ }
176
+
177
+ .toast__progress-bar {
178
+ height: 100%;
179
+ background: var(--accent-blue);
180
+ transform-origin: left;
181
+ animation: toast-progress linear forwards;
182
+ }
183
+
184
+ @keyframes toast-progress {
185
+ from {
186
+ transform: scaleX(1);
187
+ }
188
+ to {
189
+ transform: scaleX(0);
190
+ }
191
+ }
192
+
193
+ /* Variant progress colors */
194
+ .toast--error .toast__progress-bar {
195
+ background: var(--color-error);
196
+ }
197
+
198
+ .toast--success .toast__progress-bar {
199
+ background: var(--color-success);
200
+ }
201
+
202
+ .toast--warning .toast__progress-bar {
203
+ background: var(--color-warning);
204
+ }
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Avatar Controls Styles
3
+ * Uses BEM naming convention and button component
4
+ */
5
+
6
+ @import "./tokens.css";
7
+ @import "./components/button.css";
8
+
9
+ /* Backdrop-filter fallback for unsupported browsers */
10
+ @supports not (backdrop-filter: blur(1px)) {
11
+ .controls__btn {
12
+ background: var(--glass-bg-solid) !important;
13
+ }
14
+
15
+ /* Legacy support */
16
+ #controls button {
17
+ background: var(--glass-bg-solid) !important;
18
+ }
19
+ }
20
+
21
+ /* === Controls Container === */
22
+ .controls {
23
+ position: absolute;
24
+ top: var(--space-1);
25
+ inset-inline-end: var(--space-2);
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: var(--space-1);
29
+ opacity: 0;
30
+ transition: opacity var(--transition-slow);
31
+ pointer-events: none;
32
+ z-index: var(--z-dropdown);
33
+ }
34
+
35
+ /* Legacy ID support */
36
+ #controls {
37
+ position: absolute;
38
+ top: var(--space-1);
39
+ inset-inline-end: var(--space-2);
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: var(--space-1);
43
+ opacity: 0;
44
+ transition: opacity var(--transition-slow);
45
+ pointer-events: none;
46
+ z-index: var(--z-dropdown);
47
+ }
48
+
49
+ /* Show on hover (pixel-sampled opaque hit) */
50
+ body.avatar-hovered .controls,
51
+ body:hover .controls,
52
+ .controls:focus-within {
53
+ opacity: 1;
54
+ }
55
+
56
+ /* Legacy support */
57
+ body.avatar-hovered #controls,
58
+ body:hover #controls,
59
+ #controls:focus-within {
60
+ opacity: 1;
61
+ }
62
+
63
+ /* === Control Button === */
64
+ .controls__btn {
65
+ width: 28px;
66
+ height: 28px;
67
+ border: none;
68
+ border-radius: var(--radius-md);
69
+ background: var(--surface-button);
70
+ backdrop-filter: blur(8px);
71
+ -webkit-backdrop-filter: blur(8px);
72
+ color: rgba(255, 255, 255, 0.7);
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ cursor: pointer;
77
+ pointer-events: auto;
78
+ padding: 0;
79
+ transition:
80
+ background var(--transition-normal),
81
+ color var(--transition-normal),
82
+ transform var(--transition-fast),
83
+ box-shadow var(--transition-fast);
84
+ }
85
+
86
+ .controls__btn:hover {
87
+ background: var(--surface-button-hover);
88
+ color: var(--text-primary);
89
+ transform: scale(1.05);
90
+ }
91
+
92
+ .controls__btn:active {
93
+ transform: scale(0.95);
94
+ }
95
+
96
+ .controls__btn:focus-visible {
97
+ outline: 2px solid var(--accent-blue);
98
+ outline-offset: 2px;
99
+ }
100
+
101
+ .controls__btn svg {
102
+ width: 14px;
103
+ height: 14px;
104
+ }
105
+
106
+ /* Legacy support */
107
+ #controls button {
108
+ width: 28px;
109
+ height: 28px;
110
+ border: none;
111
+ border-radius: var(--radius-md);
112
+ background: var(--surface-button);
113
+ backdrop-filter: blur(8px);
114
+ -webkit-backdrop-filter: blur(8px);
115
+ color: rgba(255, 255, 255, 0.7);
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ cursor: pointer;
120
+ pointer-events: auto;
121
+ padding: 0;
122
+ transition:
123
+ background var(--transition-normal),
124
+ color var(--transition-normal),
125
+ transform var(--transition-fast),
126
+ box-shadow var(--transition-fast);
127
+ }
128
+
129
+ #controls button:hover {
130
+ background: var(--surface-button-hover);
131
+ color: var(--text-primary);
132
+ transform: scale(1.05);
133
+ }
134
+
135
+ #controls button:active {
136
+ transform: scale(0.95);
137
+ }
138
+
139
+ #controls button:focus-visible {
140
+ outline: 2px solid var(--accent-blue);
141
+ outline-offset: 2px;
142
+ }
143
+
144
+ #controls button svg {
145
+ width: 14px;
146
+ height: 14px;
147
+ }
148
+
149
+ /* === Drag Handle === */
150
+ .controls__drag-handle {
151
+ cursor: grab;
152
+ }
153
+
154
+ .controls__drag-handle:active {
155
+ cursor: grabbing;
156
+ }
157
+
158
+ /* Legacy support */
159
+ #drag-handle {
160
+ cursor: grab;
161
+ }
162
+
163
+ #drag-handle:active {
164
+ cursor: grabbing;
165
+ }
166
+
167
+ /* === Active State === */
168
+ .controls__btn.is-active {
169
+ background: var(--accent-blue-soft);
170
+ color: var(--accent-blue);
171
+ box-shadow: var(--shadow-glow);
172
+ }
173
+
174
+ /* Chat toggle */
175
+ .controls__chat-toggle.is-active {
176
+ background: var(--accent-blue-soft);
177
+ color: var(--accent-blue);
178
+ box-shadow: var(--shadow-glow);
179
+ }
180
+
181
+ /* Legacy support */
182
+ #chat-toggle-btn.active {
183
+ background: var(--accent-blue-soft);
184
+ color: var(--accent-blue);
185
+ box-shadow: var(--shadow-glow);
186
+ }
187
+
188
+ /* === TTS Toggle === */
189
+ .controls__tts-toggle .icon-on {
190
+ display: none;
191
+ }
192
+
193
+ .controls__tts-toggle .icon-off {
194
+ display: block;
195
+ }
196
+
197
+ .controls__tts-toggle.is-active .icon-on {
198
+ display: block;
199
+ }
200
+
201
+ .controls__tts-toggle.is-active .icon-off {
202
+ display: none;
203
+ }
204
+
205
+ .controls__tts-toggle.is-active {
206
+ background: var(--accent-blue-soft);
207
+ color: var(--accent-blue);
208
+ box-shadow: var(--shadow-glow);
209
+ }
210
+
211
+ .controls__tts-toggle.is-speaking {
212
+ animation: tts-pulse 1.5s ease-in-out infinite;
213
+ }
214
+
215
+ /* Legacy support */
216
+ #tts-toggle-btn .icon-on {
217
+ display: none;
218
+ }
219
+
220
+ #tts-toggle-btn .icon-off {
221
+ display: block;
222
+ }
223
+
224
+ #tts-toggle-btn.active .icon-on {
225
+ display: block;
226
+ }
227
+
228
+ #tts-toggle-btn.active .icon-off {
229
+ display: none;
230
+ }
231
+
232
+ #tts-toggle-btn.active {
233
+ background: var(--accent-blue-soft);
234
+ color: var(--accent-blue);
235
+ box-shadow: var(--shadow-glow);
236
+ }
237
+
238
+ #tts-toggle-btn.speaking {
239
+ animation: tts-pulse 1.5s ease-in-out infinite;
240
+ }
241
+
242
+ @keyframes tts-pulse {
243
+ 0%,
244
+ 100% {
245
+ box-shadow: var(--shadow-glow);
246
+ }
247
+ 50% {
248
+ box-shadow: var(--glow-blue-md);
249
+ }
250
+ }
251
+
252
+ /* === Responsive Design === */
253
+ @media (max-width: 480px) {
254
+ .controls,
255
+ #controls {
256
+ top: var(--space-2);
257
+ inset-inline-end: var(--space-2);
258
+ }
259
+
260
+ .controls__btn,
261
+ #controls button {
262
+ width: 32px;
263
+ height: 32px;
264
+ }
265
+
266
+ .controls__btn svg,
267
+ #controls button svg {
268
+ width: 16px;
269
+ height: 16px;
270
+ }
271
+ }
272
+
273
+ /* === Forced Colors Mode === */
274
+ @media (forced-colors: active) {
275
+ .controls__btn,
276
+ #controls button {
277
+ border: 2px solid currentColor;
278
+ }
279
+ }