synabun 1.3.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 (187) hide show
  1. package/CHANGELOG.md +665 -0
  2. package/LICENSE +191 -0
  3. package/README.md +853 -0
  4. package/hooks/claude-code/post-plan.mjs +391 -0
  5. package/hooks/claude-code/post-remember.mjs +239 -0
  6. package/hooks/claude-code/pre-compact.mjs +241 -0
  7. package/hooks/claude-code/pre-websearch.mjs +90 -0
  8. package/hooks/claude-code/prompt-submit.mjs +861 -0
  9. package/hooks/claude-code/session-start.mjs +494 -0
  10. package/hooks/claude-code/shared.mjs +368 -0
  11. package/hooks/claude-code/stop.mjs +646 -0
  12. package/hooks/claude-code/test-user-learning.mjs +531 -0
  13. package/mcp-server/package.json +38 -0
  14. package/mcp-server/run.mjs +10 -0
  15. package/mcp-server/src/config.ts +70 -0
  16. package/mcp-server/src/http.ts +93 -0
  17. package/mcp-server/src/index.ts +203 -0
  18. package/mcp-server/src/preload-http.ts +25 -0
  19. package/mcp-server/src/preload.ts +29 -0
  20. package/mcp-server/src/scripts/migrate-qdrant-to-sqlite.ts +506 -0
  21. package/mcp-server/src/services/categories.ts +429 -0
  22. package/mcp-server/src/services/discord.ts +702 -0
  23. package/mcp-server/src/services/file-checksums.ts +33 -0
  24. package/mcp-server/src/services/local-embeddings.ts +77 -0
  25. package/mcp-server/src/services/neural-interface.ts +344 -0
  26. package/mcp-server/src/services/sqlite.ts +823 -0
  27. package/mcp-server/src/tools/browser-advanced.ts +123 -0
  28. package/mcp-server/src/tools/browser-interact.ts +255 -0
  29. package/mcp-server/src/tools/browser-navigate.ts +77 -0
  30. package/mcp-server/src/tools/browser-observe.ts +1330 -0
  31. package/mcp-server/src/tools/browser.ts +107 -0
  32. package/mcp-server/src/tools/card-tools.ts +193 -0
  33. package/mcp-server/src/tools/card.ts +22 -0
  34. package/mcp-server/src/tools/category.ts +379 -0
  35. package/mcp-server/src/tools/discord-channel.ts +274 -0
  36. package/mcp-server/src/tools/discord-guild.ts +188 -0
  37. package/mcp-server/src/tools/discord-member.ts +158 -0
  38. package/mcp-server/src/tools/discord-message.ts +231 -0
  39. package/mcp-server/src/tools/discord-onboarding.ts +228 -0
  40. package/mcp-server/src/tools/discord-role.ts +209 -0
  41. package/mcp-server/src/tools/discord-thread.ts +110 -0
  42. package/mcp-server/src/tools/discord-webhook.ts +176 -0
  43. package/mcp-server/src/tools/discord.ts +40 -0
  44. package/mcp-server/src/tools/forget.ts +38 -0
  45. package/mcp-server/src/tools/git-tools.ts +141 -0
  46. package/mcp-server/src/tools/git.ts +13 -0
  47. package/mcp-server/src/tools/image-tools.ts +98 -0
  48. package/mcp-server/src/tools/image.ts +17 -0
  49. package/mcp-server/src/tools/leonardo-browser-tools.ts +281 -0
  50. package/mcp-server/src/tools/leonardo.ts +28 -0
  51. package/mcp-server/src/tools/loop.ts +348 -0
  52. package/mcp-server/src/tools/memories.ts +118 -0
  53. package/mcp-server/src/tools/recall.ts +323 -0
  54. package/mcp-server/src/tools/reflect.ts +145 -0
  55. package/mcp-server/src/tools/remember.ts +115 -0
  56. package/mcp-server/src/tools/response.ts +26 -0
  57. package/mcp-server/src/tools/restore.ts +34 -0
  58. package/mcp-server/src/tools/sync.ts +114 -0
  59. package/mcp-server/src/tools/tictactoe-tools.ts +98 -0
  60. package/mcp-server/src/tools/tictactoe.ts +13 -0
  61. package/mcp-server/src/tools/utils.ts +25 -0
  62. package/mcp-server/src/tools/whiteboard-tools.ts +260 -0
  63. package/mcp-server/src/tools/whiteboard.ts +22 -0
  64. package/mcp-server/src/tui.ts +940 -0
  65. package/mcp-server/src/types.ts +85 -0
  66. package/mcp-server/tsconfig.json +19 -0
  67. package/neural-interface/package.json +27 -0
  68. package/neural-interface/public/apple-touch-icon.png +0 -0
  69. package/neural-interface/public/category-logos/claude.svg +1 -0
  70. package/neural-interface/public/category-logos/gemini-color.svg +1 -0
  71. package/neural-interface/public/category-logos/openai.svg +1 -0
  72. package/neural-interface/public/category-logos/synabun.png +0 -0
  73. package/neural-interface/public/claude-chat.css +878 -0
  74. package/neural-interface/public/claude-chat.html +92 -0
  75. package/neural-interface/public/claude-chat.js +1168 -0
  76. package/neural-interface/public/favicon-16x16.png +0 -0
  77. package/neural-interface/public/favicon-32x32.png +0 -0
  78. package/neural-interface/public/gallery.svg +6 -0
  79. package/neural-interface/public/icon-192.png +0 -0
  80. package/neural-interface/public/icon-512.png +0 -0
  81. package/neural-interface/public/index-legacy.html +14677 -0
  82. package/neural-interface/public/index.html +212 -0
  83. package/neural-interface/public/index2d-legacy.html +8193 -0
  84. package/neural-interface/public/index2d.html +127 -0
  85. package/neural-interface/public/invite.html +351 -0
  86. package/neural-interface/public/leonardoai.svg +1 -0
  87. package/neural-interface/public/logo-synabun.png +0 -0
  88. package/neural-interface/public/logoHD.png +0 -0
  89. package/neural-interface/public/manifest.json +14 -0
  90. package/neural-interface/public/offline.html +299 -0
  91. package/neural-interface/public/onboarding.html +2335 -0
  92. package/neural-interface/public/openclaw-logo-text.png +0 -0
  93. package/neural-interface/public/pin-svgrepo-com.svg +25 -0
  94. package/neural-interface/public/sessionicon.svg +8 -0
  95. package/neural-interface/public/shared/ansi-parser.js +305 -0
  96. package/neural-interface/public/shared/api.js +1043 -0
  97. package/neural-interface/public/shared/colors.js +153 -0
  98. package/neural-interface/public/shared/constants.js +141 -0
  99. package/neural-interface/public/shared/html-shell.js +777 -0
  100. package/neural-interface/public/shared/html-term-renderer.js +1022 -0
  101. package/neural-interface/public/shared/i18n.js +147 -0
  102. package/neural-interface/public/shared/registry.js +82 -0
  103. package/neural-interface/public/shared/state.js +86 -0
  104. package/neural-interface/public/shared/storage.js +150 -0
  105. package/neural-interface/public/shared/styles.css +21212 -0
  106. package/neural-interface/public/shared/ui-automation-studio.js +3573 -0
  107. package/neural-interface/public/shared/ui-bookmarks.js +231 -0
  108. package/neural-interface/public/shared/ui-claude-panel.js +6333 -0
  109. package/neural-interface/public/shared/ui-command-runner.js +534 -0
  110. package/neural-interface/public/shared/ui-cost-widget.js +602 -0
  111. package/neural-interface/public/shared/ui-detail.js +1454 -0
  112. package/neural-interface/public/shared/ui-explorer.js +1356 -0
  113. package/neural-interface/public/shared/ui-file-explorer.js +2750 -0
  114. package/neural-interface/public/shared/ui-games.js +411 -0
  115. package/neural-interface/public/shared/ui-help.js +107 -0
  116. package/neural-interface/public/shared/ui-image-gallery.js +461 -0
  117. package/neural-interface/public/shared/ui-invite.js +519 -0
  118. package/neural-interface/public/shared/ui-keybinds.js +452 -0
  119. package/neural-interface/public/shared/ui-layouts.js +297 -0
  120. package/neural-interface/public/shared/ui-link.js +731 -0
  121. package/neural-interface/public/shared/ui-loading.js +255 -0
  122. package/neural-interface/public/shared/ui-menubar.js +499 -0
  123. package/neural-interface/public/shared/ui-multiselect.js +93 -0
  124. package/neural-interface/public/shared/ui-navbar.js +222 -0
  125. package/neural-interface/public/shared/ui-notifications.js +287 -0
  126. package/neural-interface/public/shared/ui-panels.js +309 -0
  127. package/neural-interface/public/shared/ui-resume.js +653 -0
  128. package/neural-interface/public/shared/ui-search.js +145 -0
  129. package/neural-interface/public/shared/ui-sessions.js +531 -0
  130. package/neural-interface/public/shared/ui-settings.js +5987 -0
  131. package/neural-interface/public/shared/ui-sidebar.js +1905 -0
  132. package/neural-interface/public/shared/ui-skills.js +2805 -0
  133. package/neural-interface/public/shared/ui-stats.js +38 -0
  134. package/neural-interface/public/shared/ui-sync.js +201 -0
  135. package/neural-interface/public/shared/ui-terminal.js +6385 -0
  136. package/neural-interface/public/shared/ui-tooltip.js +123 -0
  137. package/neural-interface/public/shared/ui-trash.js +439 -0
  138. package/neural-interface/public/shared/ui-tutorial-draw.js +875 -0
  139. package/neural-interface/public/shared/ui-tutorial-steps.js +2276 -0
  140. package/neural-interface/public/shared/ui-tutorial.js +1117 -0
  141. package/neural-interface/public/shared/ui-update.js +244 -0
  142. package/neural-interface/public/shared/ui-whiteboard.js +3262 -0
  143. package/neural-interface/public/shared/ui-workspaces.js +722 -0
  144. package/neural-interface/public/shared/utils.js +360 -0
  145. package/neural-interface/public/shared/vterm-buffer.js +1102 -0
  146. package/neural-interface/public/sw.js +52 -0
  147. package/neural-interface/public/synabun.png +0 -0
  148. package/neural-interface/public/toolbar-album.svg +8 -0
  149. package/neural-interface/public/toolbar-question.svg +6 -0
  150. package/neural-interface/public/toolbar-sessions.svg +6 -0
  151. package/neural-interface/public/variant/2d/background.js +113 -0
  152. package/neural-interface/public/variant/2d/context-menu.js +133 -0
  153. package/neural-interface/public/variant/2d/gfx.js +45 -0
  154. package/neural-interface/public/variant/2d/graph.js +1635 -0
  155. package/neural-interface/public/variant/2d/hulls.js +207 -0
  156. package/neural-interface/public/variant/2d/lasso.js +135 -0
  157. package/neural-interface/public/variant/2d/layout.js +594 -0
  158. package/neural-interface/public/variant/2d/main.js +521 -0
  159. package/neural-interface/public/variant/2d/minimap.js +312 -0
  160. package/neural-interface/public/variant/2d/settings-gfx.js +98 -0
  161. package/neural-interface/public/variant/3d/background.js +884 -0
  162. package/neural-interface/public/variant/3d/camera.js +661 -0
  163. package/neural-interface/public/variant/3d/gfx.js +116 -0
  164. package/neural-interface/public/variant/3d/graph.js +2399 -0
  165. package/neural-interface/public/variant/3d/main.js +500 -0
  166. package/neural-interface/public/variant/3d/settings-gfx.js +228 -0
  167. package/neural-interface/scripts/rebuild-pty.js +100 -0
  168. package/neural-interface/server.js +15000 -0
  169. package/neural-interface/templates/CLAUDE-template.md +211 -0
  170. package/package.json +53 -0
  171. package/postinstall.js +135 -0
  172. package/setup.js +260 -0
  173. package/skills/leonardo/SKILL.md +159 -0
  174. package/skills/leonardo/icon.svg +1 -0
  175. package/skills/leonardo/modules/browser-guide.md +378 -0
  176. package/skills/leonardo/modules/image-prompter.md +277 -0
  177. package/skills/leonardo/modules/model-advisor.md +100 -0
  178. package/skills/leonardo/modules/prompt-library.md +110 -0
  179. package/skills/leonardo/modules/style-guide.md +186 -0
  180. package/skills/leonardo/modules/video-prompter.md +311 -0
  181. package/skills/synabun/SKILL.md +185 -0
  182. package/skills/synabun/icon.png +0 -0
  183. package/skills/synabun/modules/audit.md +374 -0
  184. package/skills/synabun/modules/changelog.md +194 -0
  185. package/skills/synabun/modules/idea.md +144 -0
  186. package/skills/synabun/modules/memorize.md +188 -0
  187. package/skills/synabun/synabunicon.png +0 -0
@@ -0,0 +1,878 @@
1
+ /* ═══════════════════════════════════════════
2
+ SynaBun Chat — Claude Code Skin
3
+ GPT-style modern chat with SynaBun identity
4
+ ═══════════════════════════════════════════ */
5
+
6
+ .chat-body {
7
+ overflow: hidden;
8
+ height: 100vh;
9
+ display: flex;
10
+ flex-direction: column;
11
+ background: #0a0a0f;
12
+ }
13
+
14
+ #chat-app {
15
+ display: flex;
16
+ flex-direction: column;
17
+ height: 100vh;
18
+ max-width: 780px;
19
+ margin: 0 auto;
20
+ width: 100%;
21
+ }
22
+
23
+ /* ── Toolbar ── */
24
+ #chat-toolbar {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 8px;
28
+ padding: 0 16px;
29
+ height: 48px;
30
+ border-bottom: 1px solid rgba(255,255,255,0.06);
31
+ background: rgba(10,10,15,0.85);
32
+ backdrop-filter: blur(20px);
33
+ flex-shrink: 0;
34
+ position: sticky;
35
+ top: 0;
36
+ z-index: 10;
37
+ }
38
+
39
+ #chat-back {
40
+ display: flex;
41
+ align-items: center;
42
+ color: var(--t-faint);
43
+ text-decoration: none;
44
+ padding: 4px 2px;
45
+ transition: color 0.2s;
46
+ }
47
+ #chat-back:hover { color: var(--t-primary); }
48
+ #chat-back svg {
49
+ width: 14px; height: 14px;
50
+ fill: none; stroke: currentColor; stroke-width: 2;
51
+ }
52
+
53
+ .toolbar-brand {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: 6px;
57
+ }
58
+ .toolbar-brand-icon {
59
+ width: 22px; height: 22px;
60
+ border-radius: 6px;
61
+ background: linear-gradient(135deg, #c8a050, #a07830);
62
+ display: flex; align-items: center; justify-content: center;
63
+ font-size: 11px; font-weight: 700; color: #0a0a0f;
64
+ font-family: 'JetBrains Mono', monospace;
65
+ }
66
+ .toolbar-brand-label {
67
+ font-size: 13px;
68
+ font-weight: 600;
69
+ color: var(--t-primary);
70
+ letter-spacing: -0.01em;
71
+ }
72
+
73
+ .toolbar-select {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 4px;
77
+ position: relative;
78
+ }
79
+ .toolbar-icon {
80
+ width: 12px; height: 12px;
81
+ fill: none; stroke: var(--t-faint);
82
+ stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
83
+ flex-shrink: 0;
84
+ pointer-events: none;
85
+ }
86
+ .toolbar-select select {
87
+ appearance: none;
88
+ background: rgba(255,255,255,0.04);
89
+ border: 1px solid rgba(255,255,255,0.08);
90
+ border-radius: 6px;
91
+ color: var(--t-secondary);
92
+ font-size: 11px;
93
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
94
+ padding: 4px 22px 4px 7px;
95
+ cursor: pointer;
96
+ outline: none;
97
+ max-width: 150px;
98
+ text-overflow: ellipsis;
99
+ transition: border-color 0.2s, background 0.2s;
100
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.25)' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
101
+ background-repeat: no-repeat;
102
+ background-position: right 6px center;
103
+ }
104
+ .toolbar-select select:hover {
105
+ border-color: rgba(255,255,255,0.14);
106
+ background: rgba(255,255,255,0.06);
107
+ }
108
+ .toolbar-select select option {
109
+ background: #16161e;
110
+ color: #d0d0d0;
111
+ }
112
+
113
+ .toolbar-spacer { flex: 1; }
114
+
115
+ .toolbar-badge {
116
+ font-size: 10px;
117
+ font-family: 'JetBrains Mono', monospace;
118
+ color: var(--t-faint);
119
+ padding: 3px 8px;
120
+ border-radius: 10px;
121
+ background: rgba(255,255,255,0.03);
122
+ transition: color 0.3s, background 0.3s;
123
+ }
124
+ .toolbar-badge.flash {
125
+ color: #c8a050;
126
+ background: rgba(200,160,80,0.08);
127
+ }
128
+
129
+ .toolbar-btn {
130
+ background: none;
131
+ border: none;
132
+ color: var(--t-faint);
133
+ cursor: pointer;
134
+ padding: 5px;
135
+ display: flex;
136
+ align-items: center;
137
+ border-radius: 6px;
138
+ transition: color 0.2s, background 0.2s;
139
+ }
140
+ .toolbar-btn:hover { color: var(--t-primary); background: rgba(255,255,255,0.05); }
141
+ .toolbar-btn svg {
142
+ width: 14px; height: 14px;
143
+ fill: none; stroke: currentColor; stroke-width: 2;
144
+ }
145
+
146
+ /* ── Messages ── */
147
+ #messages {
148
+ flex: 1;
149
+ overflow-y: auto;
150
+ padding: 24px 0 12px;
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 0;
154
+ scrollbar-width: thin;
155
+ scrollbar-color: rgba(255,255,255,0.06) transparent;
156
+ }
157
+ #messages::-webkit-scrollbar { width: 5px; }
158
+ #messages::-webkit-scrollbar-track { background: transparent; }
159
+ #messages::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.06); border-radius: 3px; }
160
+
161
+ .msg { padding: 4px 16px; }
162
+
163
+ /* ── User message ── */
164
+ .msg-user {
165
+ display: flex;
166
+ justify-content: flex-end;
167
+ padding: 10px 16px 4px;
168
+ }
169
+ .msg-bubble {
170
+ background: linear-gradient(135deg, rgba(200,160,80,0.12), rgba(200,160,80,0.06));
171
+ border: 1px solid rgba(200,160,80,0.18);
172
+ border-radius: 18px 18px 4px 18px;
173
+ padding: 8px 14px;
174
+ max-width: 70%;
175
+ font-size: 13px;
176
+ color: var(--t-primary);
177
+ white-space: pre-wrap;
178
+ word-break: break-word;
179
+ line-height: 1.55;
180
+ }
181
+
182
+ /* ── Assistant message ── */
183
+ .msg-assistant {
184
+ padding: 8px 16px 4px;
185
+ display: flex;
186
+ gap: 10px;
187
+ align-items: flex-start;
188
+ }
189
+ .msg-avatar {
190
+ width: 26px; height: 26px;
191
+ border-radius: 8px;
192
+ background: linear-gradient(135deg, #c8a050, #a07830);
193
+ display: flex; align-items: center; justify-content: center;
194
+ font-size: 11px; font-weight: 700; color: #0a0a0f;
195
+ font-family: 'JetBrains Mono', monospace;
196
+ flex-shrink: 0;
197
+ margin-top: 1px;
198
+ }
199
+ .msg-content {
200
+ flex: 1;
201
+ min-width: 0;
202
+ }
203
+
204
+ /* Extended thinking blocks — matches tool-card design */
205
+ .msg-thinking {
206
+ border: 1px solid rgba(255,255,255,0.06); border-radius: 8px;
207
+ margin: 4px 0; overflow: hidden;
208
+ background: rgba(255,255,255,0.02); transition: border-color 0.2s;
209
+ }
210
+ .msg-thinking:hover { border-color: rgba(255,255,255,0.1); }
211
+ .msg-thinking summary {
212
+ display: flex; align-items: center; gap: 8px;
213
+ padding: 6px 10px; cursor: pointer; user-select: none;
214
+ transition: background 0.15s; list-style: none;
215
+ }
216
+ .msg-thinking summary::-webkit-details-marker { display: none; }
217
+ .msg-thinking summary:hover { background: rgba(255,255,255,0.03); }
218
+ .msg-thinking .msg-thinking-icon {
219
+ width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;
220
+ font-size: 11px; color: rgba(160,155,255,0.7); background: rgba(160,155,255,0.08);
221
+ border-radius: 5px; flex-shrink: 0;
222
+ }
223
+ .msg-thinking .msg-thinking-label {
224
+ font-family: 'JetBrains Mono', monospace; color: rgba(255,255,255,0.5);
225
+ font-weight: 600; font-size: 11.5px;
226
+ }
227
+ .msg-thinking .msg-thinking-chevron {
228
+ color: rgba(255,255,255,0.15); font-size: 14px; transition: transform 0.2s; margin-left: auto;
229
+ }
230
+ .msg-thinking[open] .msg-thinking-chevron { transform: rotate(90deg); color: rgba(255,255,255,0.35); }
231
+ .msg-thinking-content {
232
+ display: none; border-top: 1px solid rgba(255,255,255,0.04);
233
+ padding: 8px 12px 10px; font-family: 'JetBrains Mono', monospace;
234
+ font-size: 11px; color: rgba(255,255,255,0.35); white-space: pre-wrap;
235
+ word-break: break-word; max-height: 400px; overflow-y: auto;
236
+ line-height: 1.55; margin: 0;
237
+ }
238
+ .msg-thinking[open] .msg-thinking-content { display: block; }
239
+ .msg-thinking-content::-webkit-scrollbar { width: 3px; }
240
+ .msg-thinking-content::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 2px; }
241
+
242
+ .msg-body {
243
+ font-size: 13.5px;
244
+ color: rgba(235,235,240,0.92);
245
+ line-height: 1.65;
246
+ word-break: break-word;
247
+ }
248
+ .msg-body p { margin: 0 0 0.6em; }
249
+ .msg-body p:last-child { margin-bottom: 0; }
250
+ .msg-body h1, .msg-body h2, .msg-body h3, .msg-body h4 {
251
+ color: #f0f0f2;
252
+ margin: 0.9em 0 0.35em;
253
+ font-weight: 600;
254
+ line-height: 1.3;
255
+ }
256
+ .msg-body h1 { font-size: 16px; }
257
+ .msg-body h2 { font-size: 14.5px; }
258
+ .msg-body h3, .msg-body h4 { font-size: 13.5px; }
259
+ .msg-body ul, .msg-body ol { padding-left: 1.3em; margin: 0.4em 0; }
260
+ .msg-body li { margin: 0.2em 0; }
261
+ .msg-body blockquote {
262
+ border-left: 2px solid rgba(200,160,80,0.35);
263
+ padding-left: 12px;
264
+ margin: 0.5em 0;
265
+ color: var(--t-secondary);
266
+ }
267
+ .msg-body a { color: #6ea8d8; text-decoration: none; }
268
+ .msg-body a:hover { text-decoration: underline; }
269
+ .msg-body strong { color: #f0f0f2; font-weight: 600; }
270
+ .msg-body em { color: var(--t-secondary); }
271
+ .msg-body hr { border: none; border-top: 1px solid rgba(255,255,255,0.06); margin: 1em 0; }
272
+
273
+ /* Inline code */
274
+ .msg-body code:not(pre code) {
275
+ background: rgba(200,160,80,0.08);
276
+ border: 1px solid rgba(200,160,80,0.12);
277
+ border-radius: 4px;
278
+ padding: 1px 5px;
279
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
280
+ font-size: 0.88em;
281
+ color: #d4b060;
282
+ }
283
+
284
+ /* Code blocks */
285
+ .msg-body pre {
286
+ background: #0d0d14;
287
+ border: 1px solid rgba(255,255,255,0.06);
288
+ border-radius: 8px;
289
+ padding: 12px 14px;
290
+ overflow-x: auto;
291
+ margin: 0.6em 0;
292
+ position: relative;
293
+ }
294
+ .msg-body pre code {
295
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
296
+ font-size: 12px;
297
+ color: rgba(220,220,230,0.88);
298
+ background: none;
299
+ border: none;
300
+ padding: 0;
301
+ line-height: 1.6;
302
+ }
303
+ .code-label {
304
+ position: absolute;
305
+ top: 6px;
306
+ right: 10px;
307
+ font-size: 9px;
308
+ color: rgba(255,255,255,0.2);
309
+ font-family: 'JetBrains Mono', monospace;
310
+ pointer-events: none;
311
+ text-transform: uppercase;
312
+ letter-spacing: 0.04em;
313
+ }
314
+
315
+ /* ── Tool cards ── */
316
+ .tool-card {
317
+ border: 1px solid rgba(255,255,255,0.06);
318
+ border-radius: 8px;
319
+ margin: 4px 0;
320
+ overflow: hidden;
321
+ font-size: 12px;
322
+ background: rgba(255,255,255,0.02);
323
+ transition: border-color 0.2s;
324
+ }
325
+ .tool-card:hover { border-color: rgba(255,255,255,0.1); }
326
+ .tool-card.tool-ok { border-left: 3px solid rgba(80,180,100,0.5); }
327
+ .tool-card.tool-error { border-left: 3px solid rgba(255,82,82,0.5); }
328
+
329
+ .tool-hdr {
330
+ display: flex;
331
+ align-items: center;
332
+ gap: 8px;
333
+ padding: 6px 10px;
334
+ cursor: pointer;
335
+ user-select: none;
336
+ transition: background 0.15s;
337
+ }
338
+ .tool-hdr:hover { background: rgba(255,255,255,0.03); }
339
+
340
+ .tool-icon {
341
+ width: 20px; height: 20px;
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ font-family: 'JetBrains Mono', monospace;
346
+ font-size: 10px;
347
+ font-weight: 600;
348
+ color: #c8a050;
349
+ background: rgba(200,160,80,0.08);
350
+ border-radius: 5px;
351
+ flex-shrink: 0;
352
+ }
353
+
354
+ .tool-name {
355
+ font-family: 'JetBrains Mono', monospace;
356
+ color: var(--t-primary);
357
+ font-weight: 500;
358
+ font-size: 11.5px;
359
+ }
360
+ .tool-detail {
361
+ font-family: 'JetBrains Mono', monospace;
362
+ color: var(--t-faint);
363
+ font-size: 11px;
364
+ flex: 1;
365
+ overflow: hidden;
366
+ text-overflow: ellipsis;
367
+ white-space: nowrap;
368
+ }
369
+ .tool-chevron {
370
+ color: rgba(255,255,255,0.2);
371
+ font-size: 13px;
372
+ transition: transform 0.2s ease, color 0.2s;
373
+ flex-shrink: 0;
374
+ }
375
+ .tool-card.open .tool-chevron { transform: rotate(90deg); color: rgba(255,255,255,0.35); }
376
+
377
+ .tool-body {
378
+ display: none;
379
+ border-top: 1px solid rgba(255,255,255,0.04);
380
+ }
381
+ .tool-card.open .tool-body { display: block; }
382
+
383
+ .tool-section-label {
384
+ font-size: 9px;
385
+ color: rgba(200,160,80,0.5);
386
+ padding: 6px 10px 2px;
387
+ font-family: 'JetBrains Mono', monospace;
388
+ letter-spacing: 0.08em;
389
+ text-transform: uppercase;
390
+ font-weight: 600;
391
+ }
392
+ .tool-section {
393
+ padding: 4px 10px 8px;
394
+ font-family: 'JetBrains Mono', monospace;
395
+ font-size: 11px;
396
+ color: var(--t-muted);
397
+ white-space: pre-wrap;
398
+ word-break: break-all;
399
+ max-height: 240px;
400
+ overflow-y: auto;
401
+ line-height: 1.55;
402
+ margin: 0;
403
+ background: none;
404
+ border: none;
405
+ }
406
+
407
+ /* ── Status / Error / Thinking ── */
408
+ .msg-status {
409
+ padding: 2px 16px 2px 52px;
410
+ font-size: 11px;
411
+ color: var(--t-faint);
412
+ font-family: 'JetBrains Mono', monospace;
413
+ }
414
+ .msg-error {
415
+ padding: 6px 16px 6px 52px;
416
+ font-size: 11.5px;
417
+ color: #ff5252;
418
+ font-family: 'JetBrains Mono', monospace;
419
+ }
420
+
421
+ .thinking {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 10px;
425
+ padding: 10px 16px;
426
+ }
427
+ .thinking .think-avatar {
428
+ width: 26px; height: 26px;
429
+ border-radius: 8px;
430
+ background: linear-gradient(135deg, #c8a050, #a07830);
431
+ display: flex; align-items: center; justify-content: center;
432
+ font-size: 11px; font-weight: 700; color: #0a0a0f;
433
+ font-family: 'JetBrains Mono', monospace;
434
+ flex-shrink: 0;
435
+ }
436
+ .thinking .think-avatar svg { width: 14px; height: 14px; }
437
+ .thinking .think-dots {
438
+ display: flex;
439
+ gap: 4px;
440
+ align-items: center;
441
+ }
442
+ .thinking .think-dots span {
443
+ width: 4px; height: 4px;
444
+ border-radius: 50%;
445
+ background: #c8a050;
446
+ animation: think-pulse 1.4s ease-in-out infinite;
447
+ }
448
+ .thinking .think-dots span:nth-child(2) { animation-delay: 0.2s; }
449
+ .thinking .think-dots span:nth-child(3) { animation-delay: 0.4s; }
450
+ @keyframes think-pulse {
451
+ 0%, 80%, 100% { opacity: 0.15; transform: scale(0.7); }
452
+ 40% { opacity: 1; transform: scale(1); }
453
+ }
454
+ .thinking .think-timer {
455
+ font-size: 10px;
456
+ font-family: 'JetBrains Mono', monospace;
457
+ color: rgba(255,255,255,0.15);
458
+ margin-left: 4px;
459
+ }
460
+
461
+ /* ── Session divider ── */
462
+ .session-divider {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 10px;
466
+ padding: 14px 16px;
467
+ font-size: 10px;
468
+ color: var(--t-faint);
469
+ font-family: 'JetBrains Mono', monospace;
470
+ }
471
+ .session-divider::before, .session-divider::after {
472
+ content: '';
473
+ flex: 1;
474
+ height: 1px;
475
+ background: rgba(255,255,255,0.05);
476
+ }
477
+
478
+ /* ── Input area ── */
479
+ #chat-input-area {
480
+ background: transparent;
481
+ flex-shrink: 0;
482
+ padding: 8px 16px 10px;
483
+ display: flex;
484
+ gap: 0;
485
+ align-items: flex-end;
486
+ }
487
+
488
+ /* Animated conic-gradient border on focus */
489
+ #chat-input-wrap {
490
+ flex: 1;
491
+ position: relative;
492
+ border-radius: 14px;
493
+ padding: 1.5px;
494
+ background: rgba(255,255,255,0.05);
495
+ transition: background 0.4s ease;
496
+ }
497
+ #chat-input-wrap::before {
498
+ content: '';
499
+ position: absolute; inset: 0;
500
+ border-radius: 14px;
501
+ padding: 1.5px;
502
+ pointer-events: none;
503
+ background: conic-gradient(
504
+ from var(--chat-border-angle, 0deg),
505
+ rgba(255,255,255,0.0) 0%,
506
+ rgba(255,255,255,0.22) 25%,
507
+ rgba(255,255,255,0.06) 50%,
508
+ rgba(255,255,255,0.22) 75%,
509
+ rgba(255,255,255,0.0) 100%
510
+ );
511
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
512
+ -webkit-mask-composite: xor;
513
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
514
+ mask-composite: exclude;
515
+ opacity: 0;
516
+ transition: opacity 0.5s ease;
517
+ }
518
+ #chat-input-wrap:focus-within::before {
519
+ opacity: 1;
520
+ animation: chat-border-spin 3.5s linear infinite;
521
+ }
522
+ #chat-input-wrap:focus-within {
523
+ background: rgba(255,255,255,0.03);
524
+ box-shadow: 0 0 20px rgba(255,255,255,0.03), 0 0 60px rgba(255,255,255,0.01);
525
+ }
526
+ @keyframes chat-border-spin {
527
+ to { --chat-border-angle: 360deg; }
528
+ }
529
+ @property --chat-border-angle {
530
+ syntax: '<angle>';
531
+ initial-value: 0deg;
532
+ inherits: false;
533
+ }
534
+
535
+ #chat-input-inner {
536
+ display: flex;
537
+ align-items: flex-end;
538
+ background: rgba(12,12,16,0.92);
539
+ border-radius: 13px;
540
+ padding: 5px 5px 5px 14px;
541
+ gap: 4px;
542
+ min-width: 0;
543
+ }
544
+
545
+ #chat-input {
546
+ flex: 1;
547
+ min-width: 0;
548
+ background: transparent;
549
+ border: none;
550
+ color: var(--t-primary);
551
+ font-size: 13px;
552
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
553
+ padding: 6px 0;
554
+ resize: none;
555
+ outline: none;
556
+ line-height: 1.5;
557
+ max-height: 180px;
558
+ overflow-y: auto;
559
+ overflow-wrap: break-word;
560
+ word-break: break-word;
561
+ scrollbar-width: thin;
562
+ scrollbar-color: transparent transparent;
563
+ transition: scrollbar-color 0.3s;
564
+ }
565
+ #chat-input:hover, #chat-input:focus {
566
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
567
+ }
568
+ #chat-input::-webkit-scrollbar { width: 4px; }
569
+ #chat-input::-webkit-scrollbar-track { background: transparent; }
570
+ #chat-input::-webkit-scrollbar-thumb { background: transparent; border-radius: 4px; }
571
+ #chat-input:hover::-webkit-scrollbar-thumb, #chat-input:focus::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); }
572
+ #chat-input::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.18); }
573
+ #chat-input.scrollable {
574
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0px, black 6px, black calc(100% - 10px), transparent 100%);
575
+ mask-image: linear-gradient(to bottom, transparent 0px, black 6px, black calc(100% - 10px), transparent 100%);
576
+ }
577
+ #chat-input::placeholder { color: rgba(255,255,255,0.16); transition: color 0.3s; }
578
+ #chat-input:focus::placeholder { color: rgba(255,255,255,0.22); }
579
+
580
+ /* ── Send button — flat square, sweep fill ── */
581
+ #chat-send-btn {
582
+ background: transparent;
583
+ border: 1px solid rgba(255,255,255,0.06);
584
+ border-radius: 8px;
585
+ color: rgba(255,255,255,0.15);
586
+ width: 30px;
587
+ height: 30px;
588
+ display: flex;
589
+ align-items: center;
590
+ justify-content: center;
591
+ cursor: pointer;
592
+ flex-shrink: 0;
593
+ transition: all 0.25s cubic-bezier(0.22, 0.68, 0, 1.2);
594
+ overflow: hidden;
595
+ position: relative;
596
+ }
597
+ #chat-send-btn::before {
598
+ content: '';
599
+ position: absolute; inset: 0;
600
+ background: linear-gradient(135deg, rgba(255,255,255,0.12), rgba(255,255,255,0.04));
601
+ border-radius: 7px;
602
+ transform: scaleX(0);
603
+ transform-origin: left;
604
+ transition: transform 0.3s cubic-bezier(0.22, 0.68, 0, 1.2);
605
+ }
606
+ #chat-send-btn:not(:disabled)::before {
607
+ transform: scaleX(1);
608
+ }
609
+ #chat-send-btn:not(:disabled) {
610
+ color: rgba(255,255,255,0.7);
611
+ border-color: rgba(255,255,255,0.1);
612
+ }
613
+ #chat-send-btn:hover:not(:disabled) {
614
+ border-color: rgba(255,255,255,0.2);
615
+ color: rgba(255,255,255,0.95);
616
+ box-shadow: 0 0 12px rgba(255,255,255,0.06);
617
+ transform: translateY(-1px);
618
+ }
619
+ #chat-send-btn:hover:not(:disabled)::before {
620
+ background: linear-gradient(135deg, rgba(255,255,255,0.18), rgba(255,255,255,0.06));
621
+ }
622
+ #chat-send-btn:active:not(:disabled) {
623
+ transform: translateY(0px) scale(0.95);
624
+ transition-duration: 0.08s;
625
+ }
626
+ #chat-send-btn:disabled {
627
+ opacity: 0.4;
628
+ cursor: default;
629
+ }
630
+ #chat-send-btn svg {
631
+ width: 13px; height: 13px;
632
+ fill: none; stroke: currentColor; stroke-width: 2.5;
633
+ position: relative; z-index: 1;
634
+ }
635
+ #chat-send-btn.abort {
636
+ border-color: rgba(255,70,70,0.2);
637
+ color: rgba(255,100,100,0.85);
638
+ }
639
+ #chat-send-btn.abort::before {
640
+ transform: scaleX(1);
641
+ background: linear-gradient(135deg, rgba(255,70,70,0.15), rgba(255,50,50,0.05));
642
+ animation: chat-abort-sweep 2s ease-in-out infinite;
643
+ }
644
+ #chat-send-btn.abort:hover {
645
+ color: #ff6666;
646
+ border-color: rgba(255,70,70,0.35);
647
+ box-shadow: 0 0 12px rgba(255,70,70,0.12);
648
+ transform: translateY(-1px);
649
+ }
650
+ #chat-send-btn.abort:active {
651
+ transform: translateY(0px) scale(0.95);
652
+ }
653
+ @keyframes chat-abort-sweep {
654
+ 0%, 100% { opacity: 0.6; }
655
+ 50% { opacity: 1; }
656
+ }
657
+
658
+ /* ── AskUserQuestion interactive cards ── */
659
+ .ask-card {
660
+ background: rgba(255,255,255,0.02);
661
+ border: 1px solid rgba(255,255,255,0.07);
662
+ border-radius: 10px; padding: 14px 16px;
663
+ margin-top: 8px;
664
+ }
665
+ .ask-header {
666
+ font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.45);
667
+ letter-spacing: 0.3px; margin-bottom: 6px;
668
+ }
669
+ .ask-question {
670
+ font-size: 13px; color: rgba(255,255,255,0.75); margin-bottom: 10px; line-height: 1.45;
671
+ }
672
+ .ask-options { display: flex; flex-direction: column; gap: 4px; }
673
+ .ask-option {
674
+ display: flex; align-items: flex-start; gap: 10px;
675
+ padding: 9px 13px; border-radius: 8px; cursor: pointer;
676
+ background: transparent;
677
+ border: 1px solid rgba(255,255,255,0.05);
678
+ text-align: left; transition: background 0.12s, border-color 0.12s;
679
+ }
680
+ .ask-option::before {
681
+ content: '';
682
+ width: 14px; height: 14px; flex-shrink: 0; margin-top: 2px;
683
+ border: 1.5px solid rgba(255,255,255,0.13); border-radius: 50%;
684
+ transition: border-color 0.12s, background 0.12s;
685
+ }
686
+ .ask-option:hover:not(:disabled) {
687
+ background: rgba(255,255,255,0.04);
688
+ border-color: rgba(255,255,255,0.10);
689
+ }
690
+ .ask-option:hover:not(:disabled)::before {
691
+ border-color: rgba(255,255,255,0.3);
692
+ }
693
+ .ask-option.selected {
694
+ background: rgba(255,255,255,0.05);
695
+ border-color: rgba(255,255,255,0.12);
696
+ }
697
+ .ask-option.selected::before {
698
+ border-color: rgba(255,255,255,0.6);
699
+ background: rgba(255,255,255,0.6);
700
+ box-shadow: inset 0 0 0 2px rgba(14,14,18,0.9);
701
+ }
702
+ /* Multi-select: square checkbox instead of circle radio */
703
+ .ask-options.multi .ask-option::before { border-radius: 3px; }
704
+ .ask-options.multi .ask-option.selected::before { border-radius: 3px; }
705
+ .ask-multi-hint {
706
+ font-size: 10px; color: rgba(255,255,255,0.25);
707
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
708
+ font-style: italic; margin-bottom: 4px;
709
+ }
710
+ .ask-option:disabled:not(.selected) { opacity: 0.35; cursor: default; }
711
+ .ask-option-wrap { display: flex; flex-direction: column; gap: 1px; }
712
+ .ask-option-label { font-size: 13px; font-weight: 500; color: rgba(255,255,255,0.8); }
713
+ .ask-option-desc { font-size: 11px; color: rgba(255,255,255,0.3); line-height: 1.3; }
714
+ .ask-hint {
715
+ font-size: 11px; color: rgba(255,255,255,0.25);
716
+ font-family: 'JetBrains Mono', 'Fira Code', monospace; font-style: italic;
717
+ }
718
+ .ask-hint-img { color: rgba(255,255,255,0.2); }
719
+ /* ── Batched submit bar ── */
720
+ .ask-submit-bar {
721
+ display: flex; justify-content: flex-end; align-items: center;
722
+ margin-top: 12px; padding-top: 10px;
723
+ border-top: 1px solid rgba(255,255,255,0.04);
724
+ }
725
+ .ask-submit {
726
+ font-size: 11px; font-weight: 600; font-family: 'JetBrains Mono', 'Fira Code', monospace;
727
+ padding: 8px 18px; border-radius: 8px; cursor: pointer;
728
+ background: rgba(255,255,255,0.06);
729
+ border: 1px solid rgba(255,255,255,0.10);
730
+ color: rgba(255,255,255,0.35);
731
+ transition: all 0.12s; letter-spacing: 0.3px;
732
+ }
733
+ .ask-submit:disabled { opacity: 0.35; cursor: default; }
734
+ .ask-submit:not(:disabled) { color: rgba(255,255,255,0.8); }
735
+ .ask-submit:not(:disabled):hover {
736
+ background: rgba(255,255,255,0.10);
737
+ border-color: rgba(255,255,255,0.18);
738
+ }
739
+ .ask-text-input {
740
+ width: 100%; padding: 8px 10px; border-radius: 8px;
741
+ background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.07);
742
+ color: rgba(255,255,255,0.85); font-size: 13px;
743
+ font-family: 'JetBrains Mono', 'Fira Code', monospace; outline: none;
744
+ transition: border-color 0.12s;
745
+ }
746
+ .ask-text-input:focus { border-color: rgba(255,255,255,0.2); }
747
+ .ask-text-input::placeholder { color: rgba(255,255,255,0.15); }
748
+ .ask-text-input:disabled { opacity: 0.4; cursor: default; }
749
+
750
+ /* ── Permission prompt cards ── */
751
+ .perm-card {
752
+ background: rgba(255,255,255,0.03);
753
+ border: 1px solid rgba(255,180,60,0.15);
754
+ border-radius: 12px;
755
+ padding: 12px 14px;
756
+ margin-top: 8px;
757
+ }
758
+ .perm-tool-line {
759
+ display: flex; align-items: center; gap: 8px; margin-bottom: 6px;
760
+ }
761
+ .perm-tool-icon {
762
+ width: 22px; height: 22px; border-radius: 6px;
763
+ display: flex; align-items: center; justify-content: center;
764
+ font-size: 10px; font-weight: 700; font-family: 'JetBrains Mono', monospace;
765
+ background: rgba(255,180,60,0.10); color: rgba(255,180,60,0.7);
766
+ }
767
+ .perm-tool-name { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.85); }
768
+ .perm-detail {
769
+ font-size: 11px; font-family: 'JetBrains Mono', 'Fira Code', monospace;
770
+ color: var(--t-faint); word-break: break-all; margin-bottom: 10px;
771
+ padding: 5px 8px; background: rgba(0,0,0,0.15); border-radius: 5px;
772
+ }
773
+ .perm-actions { display: flex; gap: 8px; align-items: center; }
774
+ .perm-btn {
775
+ padding: 6px 16px; border-radius: 8px; font-size: 12px; font-weight: 600;
776
+ cursor: pointer; border: 1px solid transparent; transition: all 0.15s;
777
+ }
778
+ .perm-btn-allow { background: rgba(80,200,120,0.12); color: rgba(80,200,120,0.9); border-color: rgba(80,200,120,0.2); }
779
+ .perm-btn-allow:hover { background: rgba(80,200,120,0.2); }
780
+ .perm-btn-deny { background: rgba(255,80,80,0.08); color: rgba(255,80,80,0.8); border-color: rgba(255,80,80,0.15); }
781
+ .perm-btn-deny:hover { background: rgba(255,80,80,0.15); }
782
+ .perm-always {
783
+ font-size: 10px; color: var(--t-faint); margin-left: auto;
784
+ display: flex; align-items: center; gap: 4px; cursor: pointer;
785
+ }
786
+ .perm-always input { width: 12px; height: 12px; cursor: pointer; }
787
+ .perm-card.resolved { opacity: 0.5; }
788
+ .perm-card.resolved .perm-btn { pointer-events: none; }
789
+
790
+ /* ── File links ── */
791
+ .file-link {
792
+ color: #6ea8d8;
793
+ text-decoration: none;
794
+ border-bottom: 1px dotted rgba(110, 168, 216, 0.3);
795
+ cursor: pointer;
796
+ }
797
+ .file-link:hover { text-decoration: underline; }
798
+
799
+ /* ── Session history menu ── */
800
+ .toolbar-session-wrap { position: relative; }
801
+ .session-menu {
802
+ display: none; position: absolute; top: 100%; right: 0; z-index: 100;
803
+ width: 320px; max-height: 420px; overflow-y: auto;
804
+ background: rgba(18, 18, 28, 0.95); border: 1px solid rgba(255,255,255,0.08);
805
+ border-radius: 8px; backdrop-filter: blur(20px); padding: 4px 0;
806
+ box-shadow: var(--shadow-lg);
807
+ }
808
+ .session-menu.open { display: block; }
809
+ .sess-loading { padding: 12px 16px; color: rgba(235,235,240,0.5); font-size: 12px; }
810
+ .sess-new {
811
+ padding: 8px 16px; color: #c8a050; font-size: 12px; cursor: pointer;
812
+ border-bottom: 1px solid rgba(255,255,255,0.06);
813
+ }
814
+ .sess-new:hover { background: rgba(200,160,80,0.1); }
815
+ .sess-group { padding: 6px 16px 2px; font-size: 10px; color: rgba(235,235,240,0.35); text-transform: uppercase; letter-spacing: 0.5px; }
816
+ .sess-item {
817
+ padding: 6px 16px; cursor: pointer; border-left: 2px solid transparent;
818
+ }
819
+ .sess-item:hover { background: rgba(255,255,255,0.04); }
820
+ .sess-item.active { border-left-color: #c8a050; background: rgba(200,160,80,0.06); }
821
+ .sess-prompt { font-size: 12px; color: rgba(235,235,240,0.85); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
822
+ .sess-meta { font-size: 10px; color: rgba(235,235,240,0.35); margin-top: 2px; display: flex; gap: 8px; }
823
+
824
+ /* ── Attach button ── */
825
+ .attach-btn {
826
+ background: none; border: none; cursor: pointer; padding: 2px 4px;
827
+ color: rgba(255,255,255,0.2); position: relative;
828
+ display: flex; align-items: center;
829
+ transition: color 0.2s, transform 0.25s;
830
+ }
831
+ .attach-btn:hover { color: rgba(255,255,255,0.55); transform: translateY(-1px); }
832
+ .attach-btn:active { transform: translateY(0px) scale(0.92); }
833
+ .attach-btn svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; }
834
+ #chat-attach-badge {
835
+ position: absolute; top: -2px; right: -4px;
836
+ background: #c8a050; color: #000; border-radius: 50%;
837
+ font-size: 8px; width: 12px; height: 12px;
838
+ display: flex; align-items: center; justify-content: center;
839
+ font-weight: 700;
840
+ }
841
+ #chat-attach-badge[hidden] { display: none; }
842
+
843
+ /* ── Image preview thumbnails ── */
844
+ #chat-image-preview { display: flex; gap: 6px; flex-wrap: wrap; padding: 0 4px; }
845
+ #chat-image-preview:empty { display: none; }
846
+ .chat-thumb {
847
+ position: relative; width: 56px; height: 56px; border-radius: 8px; overflow: hidden;
848
+ border: 1px solid rgba(255,255,255,0.1); flex-shrink: 0;
849
+ }
850
+ .chat-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
851
+ .chat-thumb-x {
852
+ position: absolute; top: 1px; right: 1px; width: 16px; height: 16px;
853
+ background: rgba(0,0,0,0.7); color: rgba(255,255,255,0.8); border: none;
854
+ border-radius: 50%; font-size: 10px; cursor: pointer; display: flex;
855
+ align-items: center; justify-content: center; line-height: 1; opacity: 0;
856
+ transition: opacity 0.15s;
857
+ }
858
+ .chat-thumb:hover .chat-thumb-x { opacity: 1; }
859
+ .chat-thumb-x:hover { background: rgba(255,70,70,0.8); color: #fff; }
860
+
861
+ /* ── Session monitor toggle ── */
862
+ #chat-monitor-btn { position: relative; }
863
+ #chat-monitor-btn.active { color: #4ade80; }
864
+ .monitor-badge {
865
+ position: absolute; top: -2px; right: -4px;
866
+ background: #FF5252; border-radius: 50%;
867
+ width: 8px; height: 8px;
868
+ border: 1.5px solid #0a0a0f;
869
+ }
870
+ .monitor-badge[hidden] { display: none; }
871
+
872
+ .session-monitor-container {
873
+ max-height: 260px;
874
+ overflow-y: auto;
875
+ border-top: 1px solid rgba(255,255,255,0.06);
876
+ background: rgba(10,10,15,0.95);
877
+ }
878
+ .session-monitor-container[hidden] { display: none; }