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,220 @@
1
+ /**
2
+ * Design Tokens
3
+ * Single source of truth for all design values
4
+ */
5
+
6
+ :root {
7
+ /* ===========================
8
+ * COLORS
9
+ * =========================== */
10
+
11
+ /* Glass effect */
12
+ --glass-bg: rgba(15, 15, 25, 0.75);
13
+ --glass-bg-solid: rgb(15, 15, 25);
14
+ --glass-border: rgba(255, 255, 255, 0.1);
15
+ --glass-border-hover: rgba(255, 255, 255, 0.15);
16
+ --glass-blur: 12px;
17
+
18
+ /* Accent - Blue */
19
+ --accent-blue: rgba(100, 180, 255, 1);
20
+ --accent-blue-soft: rgba(100, 180, 255, 0.2);
21
+ --accent-blue-glow: rgba(100, 180, 255, 0.3);
22
+
23
+ /* Accent - Amber */
24
+ --accent-amber: rgba(255, 180, 100, 1);
25
+ --accent-amber-soft: rgba(255, 180, 100, 0.2);
26
+
27
+ /* Semantic Colors */
28
+ --color-error: #ff6b6b;
29
+ --color-error-soft: rgba(255, 107, 107, 0.2);
30
+ --color-success: #6bff8c;
31
+ --color-success-soft: rgba(107, 255, 140, 0.2);
32
+ --color-warning: var(--accent-amber);
33
+ --color-warning-soft: var(--accent-amber-soft);
34
+
35
+ /* Text */
36
+ --text-primary: #f0f0f0;
37
+ --text-secondary: #a0a0a0;
38
+ --text-assistant: #e8f0ff;
39
+ --text-user: #ffffff;
40
+
41
+ /* Surfaces */
42
+ --surface-message-assistant: rgba(255, 255, 255, 0.05);
43
+ --surface-message-user: rgba(100, 180, 255, 0.15);
44
+ --surface-input: rgba(255, 255, 255, 0.06);
45
+ --surface-button: rgba(255, 255, 255, 0.08);
46
+ --surface-button-hover: rgba(255, 255, 255, 0.15);
47
+
48
+ /* Interactive States */
49
+ --surface-hover: rgba(255, 255, 255, 0.08);
50
+ --surface-active: rgba(255, 255, 255, 0.12);
51
+ --surface-focus: rgba(100, 180, 255, 0.15);
52
+
53
+ /* Depth */
54
+ --surface-sunken: rgba(0, 0, 0, 0.2);
55
+ --surface-elevated: rgba(255, 255, 255, 0.03);
56
+
57
+ /* Scrollbar */
58
+ --scrollbar-thumb: rgba(255, 255, 255, 0.15);
59
+ --scrollbar-thumb-hover: rgba(255, 255, 255, 0.25);
60
+
61
+ /* ===========================
62
+ * TYPOGRAPHY
63
+ * =========================== */
64
+
65
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
66
+
67
+ /* Font sizes */
68
+ --font-size-xs: 10px;
69
+ --font-size-sm: 11px;
70
+ --font-size-md: 12px;
71
+ --font-size-lg: 14px;
72
+ --font-size-xl: 16px;
73
+
74
+ /* Font weights */
75
+ --font-weight-normal: 400;
76
+ --font-weight-medium: 500;
77
+ --font-weight-semibold: 600;
78
+
79
+ /* Line heights */
80
+ --line-height-tight: 1.25;
81
+ --line-height-normal: 1.4;
82
+ --line-height-relaxed: 1.625;
83
+
84
+ /* Legacy alias */
85
+ --line-height: var(--line-height-normal);
86
+
87
+ /* ===========================
88
+ * SPACING (8px base)
89
+ * =========================== */
90
+
91
+ --space-0: 0;
92
+ --space-1: 4px;
93
+ --space-2: 8px;
94
+ --space-3: 12px;
95
+ --space-4: 16px;
96
+ --space-5: 20px;
97
+ --space-6: 24px;
98
+ --space-8: 32px;
99
+
100
+ /* Legacy aliases */
101
+ --space-xs: var(--space-1);
102
+ --space-sm: 6px;
103
+ --space-md: var(--space-2);
104
+ --space-lg: var(--space-3);
105
+ --space-xl: 14px;
106
+
107
+ /* Component-specific spacing */
108
+ --chat-message-margin: var(--space-6);
109
+ --chat-tail-width: var(--space-4);
110
+ --chat-tail-height: var(--space-2);
111
+
112
+ /* ===========================
113
+ * BORDER RADIUS
114
+ * =========================== */
115
+
116
+ --radius-sm: 4px;
117
+ --radius-md: 8px;
118
+ --radius-lg: 12px;
119
+ --radius-xl: 14px;
120
+ --radius-full: 9999px;
121
+
122
+ /* ===========================
123
+ * ANIMATION
124
+ * =========================== */
125
+
126
+ /* Easing functions */
127
+ --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
128
+ --ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
129
+ --ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
130
+ --ease-default: ease;
131
+
132
+ /* Durations */
133
+ --duration-instant: 50ms;
134
+ --duration-fast: 100ms;
135
+ --duration-normal: 150ms;
136
+ --duration-slow: 200ms;
137
+ --duration-slower: 300ms;
138
+ --duration-slowest: 500ms;
139
+
140
+ /* Legacy transition aliases */
141
+ --transition-fast: var(--duration-fast) var(--ease-default);
142
+ --transition-normal: var(--duration-normal) var(--ease-default);
143
+ --transition-slow: var(--duration-slower) var(--ease-default);
144
+
145
+ /* ===========================
146
+ * SHADOWS & GLOWS
147
+ * =========================== */
148
+
149
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
150
+ --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.3);
151
+ --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.35);
152
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.4);
153
+ --shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.5);
154
+
155
+ /* Legacy alias */
156
+ --shadow-elevated: var(--shadow-lg);
157
+ --shadow-glow: 0 0 12px var(--accent-blue-glow);
158
+
159
+ /* Glow effects */
160
+ --glow-blue-sm: 0 0 8px var(--accent-blue-glow);
161
+ --glow-blue-md: 0 0 16px var(--accent-blue-glow);
162
+ --glow-amber-sm: 0 0 8px var(--accent-amber-soft);
163
+
164
+ /* ===========================
165
+ * Z-INDEX SCALE
166
+ * =========================== */
167
+
168
+ --z-base: 0;
169
+ --z-dropdown: 10;
170
+ --z-sticky: 20;
171
+ --z-overlay: 30;
172
+ --z-modal: 40;
173
+ --z-toast: 50;
174
+
175
+ /* ===========================
176
+ * BREAKPOINTS (for reference in JS)
177
+ * =========================== */
178
+
179
+ --breakpoint-sm: 480px;
180
+ --breakpoint-md: 768px;
181
+ }
182
+
183
+ /* ===========================
184
+ * ACCESSIBILITY
185
+ * =========================== */
186
+
187
+ /* Reduced motion */
188
+ @media (prefers-reduced-motion: reduce) {
189
+ *,
190
+ *::before,
191
+ *::after {
192
+ animation-duration: 0.01ms !important;
193
+ animation-iteration-count: 1 !important;
194
+ transition-duration: 0.01ms !important;
195
+ scroll-behavior: auto !important;
196
+ }
197
+ }
198
+
199
+ /* High contrast mode */
200
+ @media (prefers-contrast: more) {
201
+ :root {
202
+ --glass-bg: rgba(0, 0, 0, 0.95);
203
+ --glass-border: rgba(255, 255, 255, 0.5);
204
+ --text-primary: #ffffff;
205
+ --text-secondary: #e0e0e0;
206
+ --surface-message-assistant: rgba(255, 255, 255, 0.2);
207
+ --surface-message-user: rgba(100, 180, 255, 0.4);
208
+ }
209
+ }
210
+
211
+ /* Forced colors (Windows high contrast) */
212
+ @media (forced-colors: active) {
213
+ :root {
214
+ --glass-bg: Canvas;
215
+ --glass-border: CanvasText;
216
+ --text-primary: CanvasText;
217
+ --text-secondary: CanvasText;
218
+ --accent-blue: LinkText;
219
+ }
220
+ }
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Utility classes for composition
3
+ * Low-specificity classes for common patterns
4
+ */
5
+
6
+ /* === Display === */
7
+ .hidden {
8
+ display: none !important;
9
+ }
10
+
11
+ .visible {
12
+ visibility: visible;
13
+ }
14
+
15
+ .invisible {
16
+ visibility: hidden;
17
+ }
18
+
19
+ .block {
20
+ display: block;
21
+ }
22
+
23
+ .inline-block {
24
+ display: inline-block;
25
+ }
26
+
27
+ /* === Flex === */
28
+ .flex {
29
+ display: flex;
30
+ }
31
+
32
+ .inline-flex {
33
+ display: inline-flex;
34
+ }
35
+
36
+ .flex-col {
37
+ flex-direction: column;
38
+ }
39
+
40
+ .flex-row {
41
+ flex-direction: row;
42
+ }
43
+
44
+ .flex-wrap {
45
+ flex-wrap: wrap;
46
+ }
47
+
48
+ .flex-1 {
49
+ flex: 1;
50
+ }
51
+
52
+ .flex-shrink-0 {
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ .items-start {
57
+ align-items: flex-start;
58
+ }
59
+
60
+ .items-center {
61
+ align-items: center;
62
+ }
63
+
64
+ .items-end {
65
+ align-items: flex-end;
66
+ }
67
+
68
+ .justify-start {
69
+ justify-content: flex-start;
70
+ }
71
+
72
+ .justify-center {
73
+ justify-content: center;
74
+ }
75
+
76
+ .justify-end {
77
+ justify-content: flex-end;
78
+ }
79
+
80
+ .justify-between {
81
+ justify-content: space-between;
82
+ }
83
+
84
+ /* === Gap === */
85
+ .gap-0 {
86
+ gap: var(--space-0);
87
+ }
88
+
89
+ .gap-1 {
90
+ gap: var(--space-1);
91
+ }
92
+
93
+ .gap-2 {
94
+ gap: var(--space-2);
95
+ }
96
+
97
+ .gap-3 {
98
+ gap: var(--space-3);
99
+ }
100
+
101
+ .gap-4 {
102
+ gap: var(--space-4);
103
+ }
104
+
105
+ /* === Padding === */
106
+ .p-0 {
107
+ padding: var(--space-0);
108
+ }
109
+
110
+ .p-1 {
111
+ padding: var(--space-1);
112
+ }
113
+
114
+ .p-2 {
115
+ padding: var(--space-2);
116
+ }
117
+
118
+ .p-3 {
119
+ padding: var(--space-3);
120
+ }
121
+
122
+ .p-4 {
123
+ padding: var(--space-4);
124
+ }
125
+
126
+ .px-2 {
127
+ padding-inline: var(--space-2);
128
+ }
129
+
130
+ .px-3 {
131
+ padding-inline: var(--space-3);
132
+ }
133
+
134
+ .px-4 {
135
+ padding-inline: var(--space-4);
136
+ }
137
+
138
+ .py-2 {
139
+ padding-block: var(--space-2);
140
+ }
141
+
142
+ .py-3 {
143
+ padding-block: var(--space-3);
144
+ }
145
+
146
+ .py-4 {
147
+ padding-block: var(--space-4);
148
+ }
149
+
150
+ /* === Margin === */
151
+ .m-0 {
152
+ margin: var(--space-0);
153
+ }
154
+
155
+ .m-auto {
156
+ margin: auto;
157
+ }
158
+
159
+ .mx-auto {
160
+ margin-inline: auto;
161
+ }
162
+
163
+ .mb-2 {
164
+ margin-bottom: var(--space-2);
165
+ }
166
+
167
+ .mb-3 {
168
+ margin-bottom: var(--space-3);
169
+ }
170
+
171
+ /* === Text === */
172
+ .text-xs {
173
+ font-size: var(--font-size-xs);
174
+ }
175
+
176
+ .text-sm {
177
+ font-size: var(--font-size-sm);
178
+ }
179
+
180
+ .text-md {
181
+ font-size: var(--font-size-md);
182
+ }
183
+
184
+ .text-lg {
185
+ font-size: var(--font-size-lg);
186
+ }
187
+
188
+ .text-xl {
189
+ font-size: var(--font-size-xl);
190
+ }
191
+
192
+ .font-normal {
193
+ font-weight: var(--font-weight-normal);
194
+ }
195
+
196
+ .font-medium {
197
+ font-weight: var(--font-weight-medium);
198
+ }
199
+
200
+ .font-semibold {
201
+ font-weight: var(--font-weight-semibold);
202
+ }
203
+
204
+ .text-primary {
205
+ color: var(--text-primary);
206
+ }
207
+
208
+ .text-secondary {
209
+ color: var(--text-secondary);
210
+ }
211
+
212
+ .text-start {
213
+ text-align: start;
214
+ }
215
+
216
+ .text-center {
217
+ text-align: center;
218
+ }
219
+
220
+ .text-end {
221
+ text-align: end;
222
+ }
223
+
224
+ .leading-tight {
225
+ line-height: var(--line-height-tight);
226
+ }
227
+
228
+ .leading-normal {
229
+ line-height: var(--line-height-normal);
230
+ }
231
+
232
+ .leading-relaxed {
233
+ line-height: var(--line-height-relaxed);
234
+ }
235
+
236
+ /* === Width/Height === */
237
+ .w-full {
238
+ width: 100%;
239
+ }
240
+
241
+ .h-full {
242
+ height: 100%;
243
+ }
244
+
245
+ .min-h-0 {
246
+ min-height: 0;
247
+ }
248
+
249
+ /* === Overflow === */
250
+ .overflow-hidden {
251
+ overflow: hidden;
252
+ }
253
+
254
+ .overflow-auto {
255
+ overflow: auto;
256
+ }
257
+
258
+ .overflow-y-auto {
259
+ overflow-y: auto;
260
+ }
261
+
262
+ .overflow-x-hidden {
263
+ overflow-x: hidden;
264
+ }
265
+
266
+ /* === Position === */
267
+ .relative {
268
+ position: relative;
269
+ }
270
+
271
+ .absolute {
272
+ position: absolute;
273
+ }
274
+
275
+ .fixed {
276
+ position: fixed;
277
+ }
278
+
279
+ /* === Border radius === */
280
+ .rounded-sm {
281
+ border-radius: var(--radius-sm);
282
+ }
283
+
284
+ .rounded-md {
285
+ border-radius: var(--radius-md);
286
+ }
287
+
288
+ .rounded-lg {
289
+ border-radius: var(--radius-lg);
290
+ }
291
+
292
+ .rounded-xl {
293
+ border-radius: var(--radius-xl);
294
+ }
295
+
296
+ .rounded-full {
297
+ border-radius: var(--radius-full);
298
+ }
299
+
300
+ /* === State utilities === */
301
+ .is-loading {
302
+ pointer-events: none;
303
+ opacity: 0.6;
304
+ }
305
+
306
+ .is-disabled {
307
+ pointer-events: none;
308
+ opacity: 0.4;
309
+ cursor: not-allowed;
310
+ }
311
+
312
+ .is-active {
313
+ /* Component-specific active styles */
314
+ }
315
+
316
+ /* === Pointer events === */
317
+ .pointer-events-none {
318
+ pointer-events: none;
319
+ }
320
+
321
+ .pointer-events-auto {
322
+ pointer-events: auto;
323
+ }
324
+
325
+ /* === Transitions === */
326
+ .transition-fast {
327
+ transition: all var(--duration-fast) var(--ease-out-expo);
328
+ }
329
+
330
+ .transition-normal {
331
+ transition: all var(--duration-normal) var(--ease-out-expo);
332
+ }
333
+
334
+ .transition-slow {
335
+ transition: all var(--duration-slow) var(--ease-out-expo);
336
+ }
337
+
338
+ /* === Opacity === */
339
+ .opacity-0 {
340
+ opacity: 0;
341
+ }
342
+
343
+ .opacity-50 {
344
+ opacity: 0.5;
345
+ }
346
+
347
+ .opacity-100 {
348
+ opacity: 1;
349
+ }
@@ -0,0 +1,86 @@
1
+ interface ChatMessage {
2
+ id: string;
3
+ timestamp: number;
4
+ role: "user" | "assistant";
5
+ text: string;
6
+ agentId?: string;
7
+ }
8
+
9
+ interface ChatHistory {
10
+ schemaVersion: number;
11
+ messages: ChatMessage[];
12
+ lastUpdated: number;
13
+ }
14
+
15
+ interface AvatarSettings {
16
+ opacity: number;
17
+ idleTimeoutMs: number;
18
+ zoom: number;
19
+ position: { x: number; y: number } | null;
20
+ }
21
+
22
+ interface AvatarBridge {
23
+ setIgnoreMouseEvents(ignore: boolean): void;
24
+ startDrag(): void;
25
+ stopDrag(): void;
26
+ onVrmModelChanged(callback: (path: string) => void): void;
27
+ getVrmPath(): Promise<string>;
28
+ showContextMenu(): void;
29
+ openSettings(): void;
30
+ getCameraZoom(): Promise<number>;
31
+ saveCameraZoom(zoom: number): void;
32
+ onCameraZoomChanged(callback: (zoom: number) => void): void;
33
+ onAgentState(callback: (state: import("../../shared/types.js").AgentState) => void): void;
34
+ sendChat(text: string): void;
35
+ toggleChat(): void;
36
+ onChatVisibility(callback: (visible: boolean) => void): void;
37
+ getAnimationsConfig(): Promise<{
38
+ clips: Record<import("../../shared/types.js").AgentPhase, string[]>;
39
+ } | null>;
40
+
41
+ // Settings
42
+ getSettings(): Promise<AvatarSettings>;
43
+ setOpacity(opacity: number): void;
44
+ onOpacityChanged(callback: (opacity: number) => void): void;
45
+
46
+ // Chat history
47
+ getChatHistory(): Promise<ChatHistory>;
48
+ appendChatMessage(role: "user" | "assistant", text: string, agentId?: string): void;
49
+ clearChatHistory(): void;
50
+ onChatHistoryCleared(callback: () => void): void;
51
+
52
+ // Idle timeout
53
+ getIdleTimeout(): Promise<number>;
54
+ setIdleTimeout(ms: number): void;
55
+ onIdleTimeoutChanged(callback: (ms: number) => void): void;
56
+
57
+ // TTS
58
+ getTtsEnabled(): Promise<boolean>;
59
+ setTtsEnabled(enabled: boolean): void;
60
+ onTtsEnabledChanged(callback: (enabled: boolean) => void): void;
61
+
62
+ // TTS engine
63
+ getTtsEngine(): Promise<"web-speech" | "kokoro">;
64
+ setTtsEngine(engine: "web-speech" | "kokoro"): void;
65
+ onTtsEngineChanged(callback: (engine: "web-speech" | "kokoro") => void): void;
66
+
67
+ // TTS voice
68
+ getTtsVoice(): Promise<string>;
69
+ setTtsVoice(voice: string): void;
70
+ onTtsVoiceChanged(callback: (voice: string) => void): void;
71
+
72
+ // Scale
73
+ getScale(): Promise<number>;
74
+ onScaleChanged(callback: (scale: number) => void): void;
75
+
76
+ // Cursor tracking
77
+ startCursorTracking(): void;
78
+ stopCursorTracking(): void;
79
+ onCursorPosition(
80
+ callback: (x: number, y: number, screenWidth: number, screenHeight: number) => void,
81
+ ): void;
82
+ }
83
+
84
+ interface Window {
85
+ avatarBridge: AvatarBridge;
86
+ }
@@ -0,0 +1,37 @@
1
+ interface ChatMessage {
2
+ id: string;
3
+ timestamp: number;
4
+ role: "user" | "assistant";
5
+ text: string;
6
+ agentId?: string;
7
+ }
8
+
9
+ interface ChatHistory {
10
+ schemaVersion: number;
11
+ messages: ChatMessage[];
12
+ lastUpdated: number;
13
+ }
14
+
15
+ interface ChatBridge {
16
+ onAgentState(callback: (state: import("../../shared/types.js").AgentState) => void): void;
17
+ sendChat(text: string): void;
18
+ setIgnoreMouseEvents(ignore: boolean): void;
19
+ notifyContentHidden(): void;
20
+ notifyContentShown(): void;
21
+ onShowBubble(callback: () => void): void;
22
+
23
+ // Chat history
24
+ getChatHistory(): Promise<ChatHistory>;
25
+ appendChatMessage(role: "user" | "assistant", text: string, agentId?: string): void;
26
+ clearChatHistory(): void;
27
+ onChatHistoryCleared(callback: () => void): void;
28
+
29
+ // Idle timeout
30
+ getIdleTimeout(): Promise<number>;
31
+ setIdleTimeout(ms: number): void;
32
+ onIdleTimeoutChanged(callback: (ms: number) => void): void;
33
+ }
34
+
35
+ interface Window {
36
+ chatBridge: ChatBridge;
37
+ }