claudeck 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 (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/cli.js +2 -0
  4. package/config/agent-chains.json +16 -0
  5. package/config/agent-dags.json +16 -0
  6. package/config/agents.json +46 -0
  7. package/config/bot-prompt.json +3 -0
  8. package/config/folders.json +66 -0
  9. package/config/prompts.json +92 -0
  10. package/config/repos.json +86 -0
  11. package/config/telegram-config.json +17 -0
  12. package/config/workflows.json +90 -0
  13. package/db.js +1198 -0
  14. package/package.json +55 -0
  15. package/plugins/claude-editor/client.css +171 -0
  16. package/plugins/claude-editor/client.js +183 -0
  17. package/plugins/event-stream/client.css +207 -0
  18. package/plugins/event-stream/client.js +271 -0
  19. package/plugins/linear/client.css +345 -0
  20. package/plugins/linear/client.js +380 -0
  21. package/plugins/linear/config.json +5 -0
  22. package/plugins/linear/server.js +312 -0
  23. package/plugins/repos/client.css +549 -0
  24. package/plugins/repos/client.js +663 -0
  25. package/plugins/repos/server.js +232 -0
  26. package/plugins/sudoku/client.css +196 -0
  27. package/plugins/sudoku/client.js +329 -0
  28. package/plugins/tasks/client.css +414 -0
  29. package/plugins/tasks/client.js +394 -0
  30. package/plugins/tasks/server.js +116 -0
  31. package/plugins/tic-tac-toe/client.css +167 -0
  32. package/plugins/tic-tac-toe/client.js +241 -0
  33. package/public/css/core/components.css +232 -0
  34. package/public/css/core/layout.css +330 -0
  35. package/public/css/core/print.css +18 -0
  36. package/public/css/core/reset.css +36 -0
  37. package/public/css/core/responsive.css +378 -0
  38. package/public/css/core/theme.css +116 -0
  39. package/public/css/core/variables.css +93 -0
  40. package/public/css/features/agent-monitor.css +297 -0
  41. package/public/css/features/agent-sidebar.css +525 -0
  42. package/public/css/features/agents.css +996 -0
  43. package/public/css/features/analytics.css +181 -0
  44. package/public/css/features/background-sessions.css +321 -0
  45. package/public/css/features/cost-dashboard.css +168 -0
  46. package/public/css/features/home.css +313 -0
  47. package/public/css/features/retro-terminal.css +88 -0
  48. package/public/css/features/telegram.css +127 -0
  49. package/public/css/features/tour.css +148 -0
  50. package/public/css/features/voice-input.css +60 -0
  51. package/public/css/features/welcome.css +241 -0
  52. package/public/css/panels/assistant-bot.css +442 -0
  53. package/public/css/panels/dev-docs.css +292 -0
  54. package/public/css/panels/file-explorer.css +322 -0
  55. package/public/css/panels/git-panel.css +221 -0
  56. package/public/css/panels/mcp-manager.css +199 -0
  57. package/public/css/panels/tips-feed.css +353 -0
  58. package/public/css/ui/commands.css +273 -0
  59. package/public/css/ui/context-gauge.css +76 -0
  60. package/public/css/ui/file-picker.css +69 -0
  61. package/public/css/ui/image-attachments.css +106 -0
  62. package/public/css/ui/messages.css +884 -0
  63. package/public/css/ui/modals.css +122 -0
  64. package/public/css/ui/parallel.css +217 -0
  65. package/public/css/ui/permissions.css +110 -0
  66. package/public/css/ui/right-panel.css +481 -0
  67. package/public/css/ui/sessions.css +689 -0
  68. package/public/css/ui/status-bar.css +425 -0
  69. package/public/css/ui/toolbox.css +206 -0
  70. package/public/data/tips.json +218 -0
  71. package/public/icons/favicon.png +0 -0
  72. package/public/icons/icon-192.png +0 -0
  73. package/public/icons/icon-512.png +0 -0
  74. package/public/icons/whaly.png +0 -0
  75. package/public/index.html +1140 -0
  76. package/public/js/core/api.js +591 -0
  77. package/public/js/core/constants.js +3 -0
  78. package/public/js/core/dom.js +270 -0
  79. package/public/js/core/events.js +10 -0
  80. package/public/js/core/plugin-loader.js +153 -0
  81. package/public/js/core/store.js +39 -0
  82. package/public/js/core/utils.js +25 -0
  83. package/public/js/core/ws.js +64 -0
  84. package/public/js/features/agent-monitor.js +222 -0
  85. package/public/js/features/agents.js +1209 -0
  86. package/public/js/features/analytics.js +397 -0
  87. package/public/js/features/attachments.js +251 -0
  88. package/public/js/features/background-sessions.js +475 -0
  89. package/public/js/features/chat.js +589 -0
  90. package/public/js/features/cost-dashboard.js +152 -0
  91. package/public/js/features/dag-editor.js +399 -0
  92. package/public/js/features/easter-egg.js +46 -0
  93. package/public/js/features/home.js +270 -0
  94. package/public/js/features/projects.js +372 -0
  95. package/public/js/features/prompts.js +228 -0
  96. package/public/js/features/sessions.js +332 -0
  97. package/public/js/features/telegram.js +131 -0
  98. package/public/js/features/tour.js +210 -0
  99. package/public/js/features/voice-input.js +185 -0
  100. package/public/js/features/welcome.js +43 -0
  101. package/public/js/features/workflows.js +277 -0
  102. package/public/js/main.js +51 -0
  103. package/public/js/panels/assistant-bot.js +445 -0
  104. package/public/js/panels/dev-docs.js +380 -0
  105. package/public/js/panels/file-explorer.js +486 -0
  106. package/public/js/panels/git-panel.js +285 -0
  107. package/public/js/panels/mcp-manager.js +311 -0
  108. package/public/js/panels/tips-feed.js +303 -0
  109. package/public/js/ui/commands.js +114 -0
  110. package/public/js/ui/context-gauge.js +100 -0
  111. package/public/js/ui/diff.js +124 -0
  112. package/public/js/ui/disabled-tools.js +36 -0
  113. package/public/js/ui/export.js +74 -0
  114. package/public/js/ui/formatting.js +206 -0
  115. package/public/js/ui/header-dropdowns.js +72 -0
  116. package/public/js/ui/input-meta.js +71 -0
  117. package/public/js/ui/max-turns.js +21 -0
  118. package/public/js/ui/messages.js +387 -0
  119. package/public/js/ui/model-selector.js +20 -0
  120. package/public/js/ui/notifications.js +232 -0
  121. package/public/js/ui/parallel.js +176 -0
  122. package/public/js/ui/permissions.js +168 -0
  123. package/public/js/ui/right-panel.js +173 -0
  124. package/public/js/ui/shortcuts.js +143 -0
  125. package/public/js/ui/sidebar-toggle.js +29 -0
  126. package/public/js/ui/status-bar.js +172 -0
  127. package/public/js/ui/tab-sdk.js +623 -0
  128. package/public/js/ui/theme.js +38 -0
  129. package/public/manifest.json +13 -0
  130. package/public/offline.html +190 -0
  131. package/public/style.css +42 -0
  132. package/public/sw.js +91 -0
  133. package/server/agent-loop.js +385 -0
  134. package/server/dag-executor.js +265 -0
  135. package/server/orchestrator.js +514 -0
  136. package/server/paths.js +61 -0
  137. package/server/plugin-mount.js +56 -0
  138. package/server/push-sender.js +31 -0
  139. package/server/routes/agents.js +294 -0
  140. package/server/routes/bot.js +45 -0
  141. package/server/routes/exec.js +35 -0
  142. package/server/routes/files.js +218 -0
  143. package/server/routes/mcp.js +82 -0
  144. package/server/routes/messages.js +36 -0
  145. package/server/routes/notifications.js +37 -0
  146. package/server/routes/projects.js +207 -0
  147. package/server/routes/prompts.js +53 -0
  148. package/server/routes/sessions.js +103 -0
  149. package/server/routes/stats.js +143 -0
  150. package/server/routes/telegram.js +71 -0
  151. package/server/routes/tips.js +135 -0
  152. package/server/routes/workflows.js +81 -0
  153. package/server/summarizer.js +55 -0
  154. package/server/telegram-poller.js +205 -0
  155. package/server/telegram-sender.js +304 -0
  156. package/server/ws-handler.js +926 -0
  157. package/server.js +179 -0
@@ -0,0 +1,425 @@
1
+ /* ── Status Bar ───────────────────────────────────────── */
2
+ .status-bar {
3
+ height: 24px;
4
+ background: var(--bg-deep);
5
+ border-top: 1px solid var(--border);
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: space-between;
9
+ padding: 0 12px;
10
+ font-family: var(--font-mono);
11
+ font-size: 11px;
12
+ color: var(--text-dim);
13
+ flex-shrink: 0;
14
+ user-select: none;
15
+ z-index: 50;
16
+ position: relative;
17
+ }
18
+
19
+ /* Gradient line at top of status bar */
20
+ .status-bar::before {
21
+ content: "";
22
+ position: absolute;
23
+ top: -1px;
24
+ left: 0;
25
+ right: 0;
26
+ height: 1px;
27
+ background: linear-gradient(90deg, transparent, var(--accent-glow), transparent);
28
+ opacity: 0.3;
29
+ }
30
+
31
+ .status-bar-left,
32
+ .status-bar-center,
33
+ .status-bar-right {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: 0;
37
+ }
38
+
39
+ .status-bar-left { flex: 1; justify-content: flex-start; }
40
+ .status-bar-center { flex: 0 0 auto; gap: 0; }
41
+ .status-bar-right { flex: 1; justify-content: flex-end; }
42
+
43
+ /* Items */
44
+ .sb-item {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ gap: 4px;
48
+ padding: 0 8px;
49
+ height: 24px;
50
+ white-space: nowrap;
51
+ cursor: default;
52
+ transition: all 0.15s;
53
+ border-radius: 2px;
54
+ }
55
+
56
+ .sb-item:hover {
57
+ color: var(--text);
58
+ background: rgba(255, 255, 255, 0.04);
59
+ }
60
+
61
+ .sb-item[data-click]:hover {
62
+ cursor: pointer;
63
+ }
64
+
65
+ /* Separator */
66
+ .sb-sep {
67
+ width: 1px;
68
+ height: 12px;
69
+ background: var(--border);
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ /* Connection dot */
74
+ .sb-dot {
75
+ width: 6px;
76
+ height: 6px;
77
+ border-radius: 50%;
78
+ background: var(--error);
79
+ flex-shrink: 0;
80
+ transition: all 0.3s;
81
+ }
82
+
83
+ .sb-dot.connected {
84
+ background: var(--success);
85
+ box-shadow: 0 0 6px var(--success);
86
+ }
87
+
88
+ .sb-dot.reconnecting {
89
+ background: var(--warning);
90
+ animation: blink 1s infinite;
91
+ }
92
+
93
+ /* Branch */
94
+ .sb-branch svg { color: var(--text-dim); transition: color 0.15s; }
95
+ .sb-branch:hover svg { color: var(--accent); }
96
+ #sb-branch-name { max-width: 140px; overflow: hidden; text-overflow: ellipsis; }
97
+
98
+ /* Project */
99
+ .sb-project svg { color: var(--text-dim); transition: color 0.15s; }
100
+ .sb-project:hover svg { color: var(--accent); }
101
+ #sb-project-name { max-width: 180px; overflow: hidden; text-overflow: ellipsis; }
102
+
103
+ /* Activity (center) */
104
+ .sb-activity {
105
+ color: var(--accent);
106
+ font-size: 11px;
107
+ font-weight: 700;
108
+ letter-spacing: 0.2px;
109
+ font-family: var(--font-display);
110
+ }
111
+
112
+ .sb-activity:empty {
113
+ display: none;
114
+ }
115
+
116
+ /* Background sessions */
117
+ .sb-bg-dot {
118
+ width: 6px;
119
+ height: 6px;
120
+ border-radius: 50%;
121
+ background: var(--warning);
122
+ animation: blink 1.5s infinite;
123
+ flex-shrink: 0;
124
+ }
125
+
126
+ /* Streaming tokens */
127
+ .sb-tokens {
128
+ color: var(--accent);
129
+ font-weight: 600;
130
+ animation: tokenPulse 2s ease-in-out infinite;
131
+ }
132
+
133
+ /* Cost */
134
+ .sb-cost { color: var(--text-dim); }
135
+ #sb-session-cost { color: var(--success); font-weight: 600; }
136
+ #sb-total-cost { color: var(--text-dim); }
137
+ .sb-cost-pipe { color: var(--border); margin: 0 2px; }
138
+ .sb-cost:hover #sb-total-cost { color: var(--success); }
139
+
140
+ /* Blink animation */
141
+ @keyframes blink {
142
+ 0%, 100% { opacity: 1; }
143
+ 50% { opacity: 0.3; }
144
+ }
145
+
146
+ /* ── Credits ──────────────────────────────────────────── */
147
+ .sb-credits {
148
+ position: relative;
149
+ cursor: pointer !important;
150
+ color: var(--text-dim);
151
+ transition: color 0.2s;
152
+ }
153
+
154
+ .sb-credits:hover {
155
+ color: #ff6b9d;
156
+ }
157
+
158
+ .sb-credits > svg {
159
+ color: #ff6b9d;
160
+ animation: heartbeat 2s ease-in-out infinite;
161
+ filter: drop-shadow(0 0 2px rgba(255, 107, 157, 0.3));
162
+ transition: all 0.2s;
163
+ }
164
+
165
+ .sb-credits:hover > svg {
166
+ filter: drop-shadow(0 0 6px rgba(255, 107, 157, 0.6));
167
+ animation: heartbeat 0.8s ease-in-out infinite;
168
+ }
169
+
170
+ @keyframes heartbeat {
171
+ 0%, 100% { transform: scale(1); }
172
+ 15% { transform: scale(1.2); }
173
+ 30% { transform: scale(1); }
174
+ 45% { transform: scale(1.15); }
175
+ 60% { transform: scale(1); }
176
+ }
177
+
178
+ /* Popup card */
179
+ .sb-credits-popup {
180
+ display: none;
181
+ position: absolute;
182
+ bottom: calc(100% + 10px);
183
+ right: 0;
184
+ transform: none;
185
+ background: var(--bg-deep);
186
+ border: 1px solid rgba(255, 255, 255, 0.08);
187
+ border-radius: 10px;
188
+ padding: 0;
189
+ min-width: 220px;
190
+ box-shadow:
191
+ 0 12px 40px rgba(0, 0, 0, 0.5),
192
+ 0 0 0 1px rgba(255, 255, 255, 0.05),
193
+ 0 0 20px rgba(var(--accent-rgb, 99, 102, 241), 0.08);
194
+ z-index: 1000;
195
+ cursor: default;
196
+ overflow: hidden;
197
+ }
198
+
199
+ /* Gradient banner at top */
200
+ .sb-credits-popup::before {
201
+ content: "";
202
+ display: block;
203
+ height: 3px;
204
+ background: linear-gradient(90deg, #ff6b9d, var(--accent), #06b6d4, #a78bfa);
205
+ background-size: 200% 100%;
206
+ animation: gradientShift 3s linear infinite;
207
+ }
208
+
209
+ /* Arrow */
210
+ .sb-credits-popup::after {
211
+ content: "";
212
+ position: absolute;
213
+ bottom: -5px;
214
+ right: 12px;
215
+ transform: rotate(45deg);
216
+ width: 8px;
217
+ height: 8px;
218
+ background: var(--bg-deep);
219
+ border-right: 1px solid rgba(255, 255, 255, 0.08);
220
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
221
+ }
222
+
223
+ @keyframes gradientShift {
224
+ 0% { background-position: 0% 50%; }
225
+ 100% { background-position: 200% 50%; }
226
+ }
227
+
228
+ .sb-credits:hover .sb-credits-popup {
229
+ display: block;
230
+ animation: creditsFadeIn 0.25s cubic-bezier(0.16, 1, 0.3, 1);
231
+ }
232
+
233
+ @keyframes creditsFadeIn {
234
+ from { opacity: 0; transform: translateY(6px) scale(0.96); }
235
+ to { opacity: 1; transform: translateY(0) scale(1); }
236
+ }
237
+
238
+ .sb-credits-header {
239
+ font-size: 9px;
240
+ font-weight: 700;
241
+ text-transform: uppercase;
242
+ letter-spacing: 1.5px;
243
+ color: var(--text-dim);
244
+ padding: 10px 16px 8px;
245
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
246
+ background: rgba(255, 255, 255, 0.02);
247
+ }
248
+
249
+ .sb-credits-body {
250
+ padding: 8px 16px 12px;
251
+ }
252
+
253
+ .sb-credits-row {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 10px;
257
+ padding: 6px 0;
258
+ transition: background 0.15s;
259
+ }
260
+
261
+ .sb-credits-row svg {
262
+ flex-shrink: 0;
263
+ }
264
+
265
+ .sb-credits-info {
266
+ display: flex;
267
+ flex-direction: column;
268
+ gap: 1px;
269
+ }
270
+
271
+ .sb-credits-role {
272
+ font-size: 9px;
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.6px;
275
+ color: var(--text-dim);
276
+ font-weight: 600;
277
+ }
278
+
279
+ .sb-credits-name {
280
+ font-size: 12px;
281
+ color: var(--text);
282
+ font-weight: 600;
283
+ white-space: nowrap;
284
+ letter-spacing: 0.2px;
285
+ }
286
+
287
+ .sb-credits-divider {
288
+ height: 1px;
289
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.08), transparent);
290
+ margin: 4px 0;
291
+ }
292
+
293
+ .sb-credits-sponsor {
294
+ padding: 8px 16px 10px;
295
+ background: rgba(255, 255, 255, 0.02);
296
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
297
+ }
298
+
299
+ .sb-credits-sponsor .sb-credits-name {
300
+ background: linear-gradient(135deg, #f59e0b, #f97316);
301
+ -webkit-background-clip: text;
302
+ -webkit-text-fill-color: transparent;
303
+ background-clip: text;
304
+ font-weight: 700;
305
+ font-size: 13px;
306
+ }
307
+
308
+ /* ── Cost Hint Popup ──────────────────────────────────── */
309
+ .sb-cost-hint {
310
+ position: relative;
311
+ }
312
+
313
+ .sb-hint-popup {
314
+ display: none;
315
+ position: absolute;
316
+ bottom: calc(100% + 10px);
317
+ right: 0;
318
+ background: var(--bg-deep);
319
+ border: 1px solid rgba(255, 255, 255, 0.08);
320
+ border-radius: 10px;
321
+ min-width: 260px;
322
+ max-width: 300px;
323
+ box-shadow:
324
+ 0 12px 40px rgba(0, 0, 0, 0.5),
325
+ 0 0 0 1px rgba(255, 255, 255, 0.05);
326
+ z-index: 1000;
327
+ cursor: default;
328
+ overflow: hidden;
329
+ white-space: normal;
330
+ }
331
+
332
+ .sb-hint-popup::before {
333
+ content: "";
334
+ display: block;
335
+ height: 2px;
336
+ background: linear-gradient(90deg, var(--accent), #06b6d4);
337
+ }
338
+
339
+ .sb-hint-popup::after {
340
+ content: "";
341
+ position: absolute;
342
+ bottom: -5px;
343
+ right: 16px;
344
+ transform: rotate(45deg);
345
+ width: 8px;
346
+ height: 8px;
347
+ background: var(--bg-deep);
348
+ border-right: 1px solid rgba(255, 255, 255, 0.08);
349
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
350
+ }
351
+
352
+ .sb-cost-hint:hover .sb-hint-popup {
353
+ display: block;
354
+ animation: creditsFadeIn 0.25s cubic-bezier(0.16, 1, 0.3, 1);
355
+ }
356
+
357
+ .sb-hint-header {
358
+ font-size: 9px;
359
+ font-weight: 700;
360
+ text-transform: uppercase;
361
+ letter-spacing: 1.5px;
362
+ color: var(--text-dim);
363
+ padding: 10px 14px 8px;
364
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
365
+ background: rgba(255, 255, 255, 0.02);
366
+ }
367
+
368
+ .sb-hint-body {
369
+ padding: 10px 14px 12px;
370
+ font-size: 11px;
371
+ line-height: 1.5;
372
+ color: var(--text-secondary);
373
+ white-space: normal;
374
+ word-wrap: break-word;
375
+ }
376
+
377
+ .sb-hint-body p {
378
+ margin: 0 0 6px;
379
+ white-space: normal;
380
+ }
381
+
382
+ .sb-hint-body p:last-child {
383
+ margin-bottom: 0;
384
+ }
385
+
386
+ .sb-hint-body strong {
387
+ color: var(--accent);
388
+ font-weight: 600;
389
+ }
390
+
391
+ .sb-hint-dim {
392
+ color: var(--text-dim);
393
+ font-size: 10px;
394
+ }
395
+
396
+ html[data-theme="light"] .sb-hint-popup {
397
+ background: var(--bg-tertiary);
398
+ border-color: rgba(0, 0, 0, 0.1);
399
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05);
400
+ }
401
+
402
+ html[data-theme="light"] .sb-hint-popup::after {
403
+ background: var(--bg-tertiary);
404
+ border-color: rgba(0, 0, 0, 0.1);
405
+ }
406
+
407
+ /* Light theme */
408
+ html[data-theme="light"] .status-bar {
409
+ background: var(--bg-tertiary);
410
+ }
411
+
412
+ html[data-theme="light"] .sb-item:hover {
413
+ background: rgba(0, 0, 0, 0.04);
414
+ }
415
+
416
+ html[data-theme="light"] .sb-credits-popup {
417
+ background: var(--bg-tertiary);
418
+ border-color: rgba(0, 0, 0, 0.1);
419
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05);
420
+ }
421
+
422
+ html[data-theme="light"] .sb-credits-popup::after {
423
+ background: var(--bg-tertiary);
424
+ border-color: rgba(0, 0, 0, 0.1);
425
+ }
@@ -0,0 +1,206 @@
1
+ /* ── Toolbox ──────────────────────────────────────────── */
2
+ .toolbox-toggle {
3
+ background: transparent;
4
+ color: var(--text-dim);
5
+ border: 1px solid var(--border);
6
+ transition: all 0.2s var(--ease-smooth);
7
+ }
8
+
9
+ .toolbox-toggle:hover,
10
+ .toolbox-toggle.active {
11
+ color: var(--accent);
12
+ border-color: var(--accent);
13
+ background: var(--accent-dim);
14
+ box-shadow: var(--glow);
15
+ }
16
+
17
+ /* Tooltips */
18
+ .toolbox-toggle[data-tooltip] {
19
+ position: relative;
20
+ }
21
+
22
+ .toolbox-toggle[data-tooltip]::after {
23
+ content: attr(data-tooltip);
24
+ position: absolute;
25
+ bottom: calc(100% + 8px);
26
+ left: 50%;
27
+ transform: translateX(-50%) scale(0.9);
28
+ padding: 5px 12px;
29
+ font-family: var(--font-sans);
30
+ font-size: 11px;
31
+ font-weight: 500;
32
+ letter-spacing: 0.01em;
33
+ white-space: nowrap;
34
+ color: var(--text);
35
+ background: var(--bg-elevated);
36
+ border: 1px solid var(--border);
37
+ border-radius: var(--radius-md);
38
+ pointer-events: none;
39
+ opacity: 0;
40
+ transition: all 0.2s var(--ease-out-expo);
41
+ z-index: 100;
42
+ box-shadow: var(--shadow-sm);
43
+ }
44
+
45
+ .toolbox-toggle[data-tooltip]::before {
46
+ content: "";
47
+ position: absolute;
48
+ bottom: calc(100% + 3px);
49
+ left: 50%;
50
+ transform: translateX(-50%);
51
+ border: 4px solid transparent;
52
+ border-top-color: var(--border);
53
+ pointer-events: none;
54
+ opacity: 0;
55
+ transition: opacity 0.15s;
56
+ z-index: 100;
57
+ }
58
+
59
+ .toolbox-toggle[data-tooltip]:hover::after {
60
+ opacity: 1;
61
+ transform: translateX(-50%) scale(1);
62
+ }
63
+
64
+ .toolbox-toggle[data-tooltip]:hover::before {
65
+ opacity: 1;
66
+ }
67
+
68
+ .toolbox-panel {
69
+ max-width: calc(var(--chat-max-w) + 48px);
70
+ width: 100%;
71
+ margin: 0 auto;
72
+ padding: 0 24px 14px;
73
+ display: grid;
74
+ grid-template-columns: repeat(auto-fill, minmax(175px, 1fr));
75
+ gap: 10px;
76
+ max-height: 260px;
77
+ overflow-y: auto;
78
+ animation: fadeInUp 0.2s var(--ease-out-expo);
79
+ }
80
+
81
+ .toolbox-card {
82
+ position: relative;
83
+ background: var(--bg-secondary);
84
+ border: 1px solid var(--border);
85
+ border-radius: var(--radius-md);
86
+ padding: 12px 14px;
87
+ cursor: pointer;
88
+ transition: all 0.2s var(--ease-smooth);
89
+ }
90
+
91
+ .toolbox-card:hover {
92
+ border-color: var(--accent);
93
+ background: var(--accent-dim);
94
+ box-shadow: var(--glow);
95
+ transform: translateY(-1px);
96
+ }
97
+
98
+ .toolbox-card-title {
99
+ font-size: 12px;
100
+ font-weight: 600;
101
+ color: var(--text);
102
+ margin-bottom: 4px;
103
+ font-family: var(--font-sans);
104
+ }
105
+
106
+ .toolbox-card-desc {
107
+ font-size: 11px;
108
+ color: var(--text-dim);
109
+ line-height: 1.45;
110
+ display: -webkit-box;
111
+ -webkit-line-clamp: 2;
112
+ -webkit-box-orient: vertical;
113
+ overflow: hidden;
114
+ font-family: var(--font-sans);
115
+ }
116
+
117
+ .toolbox-card-delete {
118
+ position: absolute;
119
+ top: 8px;
120
+ right: 8px;
121
+ width: 20px;
122
+ height: 20px;
123
+ background: none;
124
+ border: none;
125
+ color: var(--text-dim);
126
+ font-size: 14px;
127
+ cursor: pointer;
128
+ border-radius: 4px;
129
+ display: none;
130
+ align-items: center;
131
+ justify-content: center;
132
+ line-height: 1;
133
+ transition: all 0.15s;
134
+ }
135
+
136
+ .toolbox-card:hover .toolbox-card-delete { display: flex; }
137
+ .toolbox-card-delete:hover { background: var(--error); color: #fff; }
138
+
139
+ .toolbox-card-add {
140
+ background: transparent;
141
+ border: 1px dashed var(--border);
142
+ border-radius: var(--radius-md);
143
+ padding: 12px 14px;
144
+ cursor: pointer;
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ color: var(--text-dim);
149
+ font-size: 12px;
150
+ font-family: var(--font-sans);
151
+ transition: all 0.2s var(--ease-smooth);
152
+ min-height: 54px;
153
+ }
154
+
155
+ .toolbox-card-add:hover {
156
+ border-color: var(--accent);
157
+ color: var(--accent);
158
+ background: var(--accent-dim);
159
+ border-style: solid;
160
+ }
161
+
162
+ /* ── Prompt Variables Form ───────────────────────────── */
163
+ .prompt-variables-form {
164
+ max-width: calc(var(--chat-max-w) + 48px);
165
+ width: 100%;
166
+ margin: 0 auto;
167
+ padding: 14px 24px 14px;
168
+ background: var(--bg-secondary);
169
+ border: 1px solid var(--border);
170
+ border-radius: var(--radius-md);
171
+ animation: fadeInUp 0.2s var(--ease-out-expo);
172
+ }
173
+
174
+ .prompt-variables-form h4 {
175
+ font-size: 13px;
176
+ font-weight: 600;
177
+ font-family: var(--font-display);
178
+ color: var(--accent);
179
+ margin-bottom: 10px;
180
+ letter-spacing: 0.02em;
181
+ }
182
+
183
+ .prompt-var-group {
184
+ margin-bottom: 10px;
185
+ }
186
+
187
+ .prompt-var-group label {
188
+ display: block;
189
+ font-size: 10px;
190
+ font-weight: 600;
191
+ text-transform: uppercase;
192
+ letter-spacing: 0.08em;
193
+ color: var(--text-dim);
194
+ margin-bottom: 4px;
195
+ font-family: var(--font-display);
196
+ }
197
+
198
+ .prompt-var-group input {
199
+ width: 100%;
200
+ }
201
+
202
+ .prompt-var-send {
203
+ padding: 9px 20px;
204
+ font-size: 13px;
205
+ margin-top: 4px;
206
+ }