openclacky 1.2.17 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/lib/clacky/agent/skill_manager.rb +1 -1
- data/lib/clacky/agent/time_machine.rb +256 -74
- data/lib/clacky/agent/tool_executor.rb +12 -0
- data/lib/clacky/agent.rb +21 -31
- data/lib/clacky/agent_config.rb +18 -0
- data/lib/clacky/cli.rb +55 -3
- data/lib/clacky/default_skills/media-gen/SKILL.md +173 -5
- data/lib/clacky/default_skills/skill-creator/SKILL.md +1 -0
- data/lib/clacky/media/base.rb +125 -0
- data/lib/clacky/media/dashscope.rb +243 -0
- data/lib/clacky/media/gemini.rb +10 -0
- data/lib/clacky/media/generator.rb +75 -0
- data/lib/clacky/media/openai_compat.rb +160 -0
- data/lib/clacky/message_history.rb +12 -7
- data/lib/clacky/providers.rb +28 -0
- data/lib/clacky/rich_ui_controller.rb +3 -1
- data/lib/clacky/server/backup_manager.rb +200 -0
- data/lib/clacky/server/channel/adapters/feishu/adapter.rb +10 -2
- data/lib/clacky/server/channel/adapters/feishu/bot.rb +68 -15
- data/lib/clacky/server/channel/channel_manager.rb +180 -81
- data/lib/clacky/server/http_server.rb +348 -15
- data/lib/clacky/server/scheduler.rb +19 -0
- data/lib/clacky/server/session_registry.rb +8 -4
- data/lib/clacky/session_manager.rb +40 -2
- data/lib/clacky/skill.rb +3 -1
- data/lib/clacky/tools/trash_manager.rb +14 -0
- data/lib/clacky/ui2/components/command_suggestions.rb +1 -0
- data/lib/clacky/ui2/components/modal_component.rb +34 -7
- data/lib/clacky/ui2/ui_controller.rb +150 -19
- data/lib/clacky/utils/file_processor.rb +75 -4
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +2038 -1147
- data/lib/clacky/web/app.js +22 -1
- data/lib/clacky/web/backup.js +119 -0
- data/lib/clacky/web/billing.js +94 -7
- data/lib/clacky/web/channels.js +81 -11
- data/lib/clacky/web/design-sample.css +247 -0
- data/lib/clacky/web/design-sample.html +127 -0
- data/lib/clacky/web/favicon.svg +16 -0
- data/lib/clacky/web/i18n.js +159 -31
- data/lib/clacky/web/index.html +175 -55
- data/lib/clacky/web/logo_nav_dark.png +0 -0
- data/lib/clacky/web/onboard.js +114 -28
- data/lib/clacky/web/sessions.js +436 -192
- data/lib/clacky/web/settings.js +21 -1
- data/lib/clacky/web/skills.js +6 -6
- data/lib/clacky/web/tasks.js +129 -61
- data/lib/clacky/web/utils.js +72 -0
- data/lib/clacky/web/ws-dispatcher.js +6 -0
- data/lib/clacky.rb +1 -0
- metadata +8 -3
- data/lib/clacky/server/channel/group_message_buffer.rb +0 -53
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
DESIGN SAMPLE v2 — "The Cockpit" (skin only, original layout)
|
|
3
|
+
Standalone. Does NOT touch app.css. For approval only.
|
|
4
|
+
============================================================ */
|
|
5
|
+
|
|
6
|
+
:root[data-theme="light"] {
|
|
7
|
+
--surface-0: #FBFBFA;
|
|
8
|
+
--surface-1: #FFFFFF;
|
|
9
|
+
--surface-2: #F4F4F2;
|
|
10
|
+
--ink-1: #1A1B1E;
|
|
11
|
+
--ink-2: #56585E;
|
|
12
|
+
--ink-3: #8A8D94;
|
|
13
|
+
--line: #E8E8E4;
|
|
14
|
+
--line-soft: #F0F0EC;
|
|
15
|
+
--accent: #4F46E5;
|
|
16
|
+
--accent-ink: #FFFFFF;
|
|
17
|
+
--accent-soft: color-mix(in srgb, var(--accent) 9%, transparent);
|
|
18
|
+
--live: #16A34A;
|
|
19
|
+
--shadow-card: 0 1px 2px rgba(20,21,30,.04);
|
|
20
|
+
}
|
|
21
|
+
:root[data-theme="dark"] {
|
|
22
|
+
--surface-0: #101114;
|
|
23
|
+
--surface-1: #16181D;
|
|
24
|
+
--surface-2: #1D2026;
|
|
25
|
+
--ink-1: #E8EAEE;
|
|
26
|
+
--ink-2: #A4A9B4;
|
|
27
|
+
--ink-3: #6B707B;
|
|
28
|
+
--line: #262A31;
|
|
29
|
+
--line-soft: #1E2229;
|
|
30
|
+
--accent: #6366F1;
|
|
31
|
+
--accent-ink: #FFFFFF;
|
|
32
|
+
--accent-soft: color-mix(in srgb, var(--accent) 16%, transparent);
|
|
33
|
+
--live: #34D399;
|
|
34
|
+
--shadow-card: 0 1px 2px rgba(0,0,0,.3);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
38
|
+
|
|
39
|
+
:root {
|
|
40
|
+
--font-sans: "Inter", -apple-system, system-ui, "Segoe UI", sans-serif;
|
|
41
|
+
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Menlo", monospace;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
html, body { height: 100%; }
|
|
45
|
+
body {
|
|
46
|
+
font-family: var(--font-sans);
|
|
47
|
+
background: var(--surface-0);
|
|
48
|
+
color: var(--ink-2);
|
|
49
|
+
-webkit-font-smoothing: antialiased;
|
|
50
|
+
font-size: 14px; line-height: 1.5;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.eyebrow {
|
|
54
|
+
font-family: var(--font-mono);
|
|
55
|
+
font-size: 10.5px; font-weight: 500;
|
|
56
|
+
letter-spacing: .14em; text-transform: uppercase;
|
|
57
|
+
color: var(--ink-3);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#app { display: flex; flex-direction: column; height: 100vh; }
|
|
61
|
+
|
|
62
|
+
/* ---------- TOP HEADER (original 3-zone layout kept) ---------- */
|
|
63
|
+
#top-header {
|
|
64
|
+
height: 52px; display: flex; align-items: center;
|
|
65
|
+
padding: 0 14px; gap: 14px;
|
|
66
|
+
border-bottom: 1px solid var(--line);
|
|
67
|
+
background: var(--surface-0);
|
|
68
|
+
}
|
|
69
|
+
#header-left { display: flex; align-items: center; gap: 10px; min-width: 0; }
|
|
70
|
+
.sidebar-toggle-btn, .theme-toggle-btn {
|
|
71
|
+
width: 32px; height: 32px; border-radius: 7px; border: none;
|
|
72
|
+
background: transparent; color: var(--ink-3); cursor: pointer;
|
|
73
|
+
display: grid; place-items: center; transition: all .14s;
|
|
74
|
+
}
|
|
75
|
+
.sidebar-toggle-btn:hover, .theme-toggle-btn:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
76
|
+
#header-brand { display: flex; align-items: center; gap: 9px; cursor: pointer; }
|
|
77
|
+
.brand-mark {
|
|
78
|
+
width: 22px; height: 22px; border-radius: 6px; background: var(--accent);
|
|
79
|
+
display: grid; place-items: center; color: var(--accent-ink);
|
|
80
|
+
font-family: var(--font-mono); font-size: 13px; font-weight: 700;
|
|
81
|
+
}
|
|
82
|
+
.header-logo-divider { width: 1px; height: 16px; background: var(--line); }
|
|
83
|
+
#header-logo { font-weight: 650; color: var(--ink-1); font-size: 14.5px; }
|
|
84
|
+
.header-owner-badge {
|
|
85
|
+
font-family: var(--font-mono); font-size: 9.5px; font-weight: 600;
|
|
86
|
+
letter-spacing: .1em; padding: 3px 7px; border-radius: 5px;
|
|
87
|
+
background: var(--accent-soft); color: var(--accent); border: none; cursor: pointer;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* ---------- COMMAND BAR (new: fills the empty top center) ---------- */
|
|
91
|
+
#header-center { flex: 1; display: flex; justify-content: center; }
|
|
92
|
+
.cmdbar {
|
|
93
|
+
display: flex; align-items: center; gap: 9px;
|
|
94
|
+
width: 100%; max-width: 440px; height: 34px;
|
|
95
|
+
padding: 0 12px;
|
|
96
|
+
border: 1px solid var(--line); border-radius: 9px;
|
|
97
|
+
background: var(--surface-1); color: var(--ink-3);
|
|
98
|
+
cursor: text; transition: border-color .14s;
|
|
99
|
+
}
|
|
100
|
+
.cmdbar:hover { border-color: var(--accent); }
|
|
101
|
+
.cmdbar svg { width: 15px; height: 15px; flex-shrink: 0; }
|
|
102
|
+
.cmdbar .ph { flex: 1; font-size: 13px; }
|
|
103
|
+
.cmdbar .kbd {
|
|
104
|
+
font-family: var(--font-mono); font-size: 10.5px;
|
|
105
|
+
padding: 2px 6px; border-radius: 5px;
|
|
106
|
+
background: var(--surface-2); color: var(--ink-3);
|
|
107
|
+
border: 1px solid var(--line);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* ---------- right: icons ---------- */
|
|
111
|
+
#header-right { display: flex; align-items: center; gap: 12px; }
|
|
112
|
+
@keyframes pulse {
|
|
113
|
+
0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--live) 55%, transparent); }
|
|
114
|
+
60% { box-shadow: 0 0 0 4px transparent; }
|
|
115
|
+
100% { box-shadow: 0 0 0 0 transparent; }
|
|
116
|
+
}
|
|
117
|
+
.header-icons { display: flex; gap: 2px; }
|
|
118
|
+
.theme-toggle-btn svg { width: 16px; height: 16px; }
|
|
119
|
+
|
|
120
|
+
/* ---------- content row + sidebar (original positions) ---------- */
|
|
121
|
+
#content-row { flex: 1; display: flex; min-height: 0; }
|
|
122
|
+
#sidebar {
|
|
123
|
+
width: 256px; flex-shrink: 0;
|
|
124
|
+
border-right: 1px solid var(--line);
|
|
125
|
+
background: var(--surface-0);
|
|
126
|
+
display: flex; flex-direction: column;
|
|
127
|
+
}
|
|
128
|
+
#sidebar-list { flex: 1; overflow-y: auto; padding: 8px 10px; }
|
|
129
|
+
|
|
130
|
+
.sidebar-divider {
|
|
131
|
+
display: flex; align-items: center; gap: 8px;
|
|
132
|
+
padding: 14px 8px 7px;
|
|
133
|
+
}
|
|
134
|
+
.sidebar-divider > span:first-child {
|
|
135
|
+
font-family: var(--font-mono); font-size: 10.5px; font-weight: 500;
|
|
136
|
+
letter-spacing: .14em; text-transform: uppercase; color: var(--ink-3);
|
|
137
|
+
white-space: nowrap;
|
|
138
|
+
}
|
|
139
|
+
.sidebar-divider::after { content: ""; flex: 1; height: 1px; background: var(--line-soft); }
|
|
140
|
+
.sidebar-divider-actions { display: flex; align-items: center; gap: 4px; }
|
|
141
|
+
|
|
142
|
+
.btn-icon-sm {
|
|
143
|
+
width: 24px; height: 24px; border-radius: 6px; border: none;
|
|
144
|
+
background: transparent; color: var(--ink-3); cursor: pointer;
|
|
145
|
+
display: grid; place-items: center;
|
|
146
|
+
}
|
|
147
|
+
.btn-icon-sm:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
148
|
+
|
|
149
|
+
/* split new-session button (kept as original) */
|
|
150
|
+
.btn-split-wrap { display: flex; align-items: stretch; }
|
|
151
|
+
.btn-split-main {
|
|
152
|
+
height: 26px; padding: 0 10px; border: 1px solid var(--line);
|
|
153
|
+
border-right: none; border-radius: 7px 0 0 7px;
|
|
154
|
+
background: var(--surface-1); color: var(--ink-1); cursor: pointer;
|
|
155
|
+
font-family: var(--font-sans); font-size: 12px; font-weight: 550;
|
|
156
|
+
}
|
|
157
|
+
.btn-split-main:hover { background: var(--surface-2); }
|
|
158
|
+
.btn-split-arrow {
|
|
159
|
+
width: 24px; border: 1px solid var(--line); border-radius: 0 7px 7px 0;
|
|
160
|
+
background: var(--surface-1); color: var(--ink-3); cursor: pointer; font-size: 10px;
|
|
161
|
+
}
|
|
162
|
+
.btn-split-arrow:hover { background: var(--surface-2); }
|
|
163
|
+
|
|
164
|
+
.conv-empty { padding: 14px 10px; text-align: center; color: var(--ink-3); font-size: 12.5px; }
|
|
165
|
+
|
|
166
|
+
/* nav items (Config / My Data / Creator) */
|
|
167
|
+
.task-item {
|
|
168
|
+
display: flex; align-items: center;
|
|
169
|
+
padding: 8px 10px; border-radius: 8px; cursor: pointer;
|
|
170
|
+
color: var(--ink-2); transition: background .12s, color .12s;
|
|
171
|
+
position: relative;
|
|
172
|
+
}
|
|
173
|
+
.task-item:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
174
|
+
.task-item.active { background: var(--accent-soft); color: var(--ink-1); }
|
|
175
|
+
.task-item.active::before {
|
|
176
|
+
content: ""; position: absolute; left: -10px; top: 50%; transform: translateY(-50%);
|
|
177
|
+
width: 3px; height: 17px; border-radius: 0 3px 3px 0; background: var(--accent);
|
|
178
|
+
}
|
|
179
|
+
.task-row { display: flex; align-items: center; gap: 11px; }
|
|
180
|
+
.task-icon { color: var(--ink-3); flex-shrink: 0; }
|
|
181
|
+
.task-item.active .task-icon { color: var(--accent); }
|
|
182
|
+
.task-name { font-size: 13.5px; }
|
|
183
|
+
.task-item.active .task-name { font-weight: 550; }
|
|
184
|
+
|
|
185
|
+
/* sidebar footer */
|
|
186
|
+
#sidebar-footer { border-top: 1px solid var(--line-soft); padding: 8px 10px; }
|
|
187
|
+
.sidebar-nav-row { display: flex; align-items: center; justify-content: space-between; }
|
|
188
|
+
.sidebar-nav-btn {
|
|
189
|
+
display: flex; align-items: center; gap: 11px;
|
|
190
|
+
padding: 8px 10px; border-radius: 8px; border: none; cursor: pointer;
|
|
191
|
+
background: transparent; color: var(--ink-2); font-size: 13px; flex: 1;
|
|
192
|
+
}
|
|
193
|
+
.sidebar-nav-btn:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
194
|
+
.sidebar-nav-btn svg { color: var(--ink-3); }
|
|
195
|
+
.version-badge { font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); padding-right: 6px; letter-spacing: .03em; }
|
|
196
|
+
|
|
197
|
+
/* ---------- main / chat empty ---------- */
|
|
198
|
+
#main { flex: 1; display: flex; flex-direction: column; background: var(--surface-1); min-width: 0; }
|
|
199
|
+
.chat-empty { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; padding: 40px; }
|
|
200
|
+
.ce-mark { width: 52px; height: 52px; border-radius: 14px; background: var(--accent-soft); display: grid; place-items: center; }
|
|
201
|
+
.ce-mark svg { width: 26px; height: 26px; color: var(--accent); }
|
|
202
|
+
.ce-title { font-size: 21px; font-weight: 680; color: var(--ink-1); letter-spacing: -.01em; text-align: center; }
|
|
203
|
+
.ce-sub { color: var(--ink-3); font-size: 13.5px; text-align: center; }
|
|
204
|
+
.chips { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; max-width: 540px; }
|
|
205
|
+
.chip { display: flex; align-items: center; gap: 9px; padding: 11px 15px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-0); cursor: pointer; transition: border-color .14s, transform .14s; }
|
|
206
|
+
.chip:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); transform: translateY(-1px); }
|
|
207
|
+
.chip .ci { width: 30px; height: 30px; border-radius: 8px; background: var(--surface-2); display: grid; place-items: center; flex-shrink: 0; }
|
|
208
|
+
.chip .ci svg { width: 16px; height: 16px; color: var(--ink-2); }
|
|
209
|
+
.chip .ct { font-size: 13px; color: var(--ink-1); font-weight: 550; }
|
|
210
|
+
.chip .cd { font-size: 11.5px; color: var(--ink-3); }
|
|
211
|
+
|
|
212
|
+
.composer { margin: 0; padding: 10px 12px; border: 1px solid var(--line); border-radius: 13px; background: var(--surface-0); display: flex; align-items: flex-end; gap: 8px; box-shadow: var(--shadow-card); }
|
|
213
|
+
.composer-wrap { margin: 0 28px 24px; }
|
|
214
|
+
.ib-icon {
|
|
215
|
+
width: 32px; height: 32px; border-radius: 8px; border: none; flex-shrink: 0;
|
|
216
|
+
background: transparent; color: var(--ink-3); cursor: pointer;
|
|
217
|
+
display: grid; place-items: center;
|
|
218
|
+
}
|
|
219
|
+
.ib-icon:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
220
|
+
.ib-icon svg { width: 18px; height: 18px; }
|
|
221
|
+
|
|
222
|
+
/* session info bar — CLI status mirror, kept fully clickable */
|
|
223
|
+
#session-info-bar {
|
|
224
|
+
display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
|
|
225
|
+
font-family: var(--font-mono); font-size: 11px; color: var(--ink-3);
|
|
226
|
+
padding: 0 6px 8px;
|
|
227
|
+
}
|
|
228
|
+
#session-info-bar .sib-sep { opacity: .3; }
|
|
229
|
+
#sib-status { display: flex; align-items: center; gap: 6px; color: var(--live); letter-spacing: .06em; }
|
|
230
|
+
.sib-clickable { color: var(--ink-2); cursor: pointer; border-radius: 4px; padding: 1px 3px; transition: background .12s, color .12s; }
|
|
231
|
+
.sib-clickable:hover { background: var(--surface-2); color: var(--ink-1); }
|
|
232
|
+
#sib-cost { color: var(--ink-2); }
|
|
233
|
+
.sig-bars { display: inline-flex; align-items: flex-end; gap: 1.5px; height: 9px; vertical-align: -1px; }
|
|
234
|
+
.sig-bars i { width: 2.5px; background: var(--live); border-radius: 1px; }
|
|
235
|
+
.sig-bars i:nth-child(1){height:3px} .sig-bars i:nth-child(2){height:5px} .sig-bars i:nth-child(3){height:7px} .sig-bars i:nth-child(4){height:9px;background:var(--line);}
|
|
236
|
+
.heartbeat {
|
|
237
|
+
width: 6px; height: 6px; border-radius: 50%; background: var(--live);
|
|
238
|
+
animation: pulse 2.4s ease-in-out infinite;
|
|
239
|
+
}
|
|
240
|
+
.composer:focus-within { border-color: color-mix(in srgb, var(--accent) 50%, var(--line)); }
|
|
241
|
+
.composer textarea { flex: 1; border: none; background: transparent; resize: none; font-family: var(--font-sans); font-size: 14px; color: var(--ink-1); outline: none; line-height: 1.55; }
|
|
242
|
+
.composer .meta { font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-3); align-self: center; white-space: nowrap; }
|
|
243
|
+
.send { width: 34px; height: 34px; border-radius: 9px; border: none; background: var(--accent); color: var(--accent-ink); cursor: pointer; display: grid; place-items: center; }
|
|
244
|
+
.send svg { width: 16px; height: 16px; }
|
|
245
|
+
|
|
246
|
+
.sample-switch { position: fixed; bottom: 14px; right: 14px; z-index: 99; font-family: var(--font-mono); font-size: 11px; background: var(--surface-1); border: 1px solid var(--line); color: var(--ink-2); padding: 7px 13px; border-radius: 8px; cursor: pointer; }
|
|
247
|
+
@media (prefers-reduced-motion: reduce) { .heartbeat { animation: none; } .chip { transition: none; } }
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN" data-theme="light">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>OpenClacky · Design Sample v2</title>
|
|
7
|
+
<link rel="stylesheet" href="/design-sample.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="app">
|
|
11
|
+
<!-- TOP HEADER: original 3-zone, command bar fills the empty center -->
|
|
12
|
+
<header id="top-header">
|
|
13
|
+
<div id="header-left">
|
|
14
|
+
<button class="sidebar-toggle-btn" title="Toggle sidebar"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M9 3v18"/></svg></button>
|
|
15
|
+
<div id="header-brand">
|
|
16
|
+
<div class="brand-mark">C</div>
|
|
17
|
+
<span class="header-logo-divider"></span>
|
|
18
|
+
<span id="header-logo">OpenClacky</span>
|
|
19
|
+
<button class="header-owner-badge">OWNER</button>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<div id="header-center">
|
|
23
|
+
<div class="cmdbar">
|
|
24
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>
|
|
25
|
+
<span class="ph">Search or run a command…</span>
|
|
26
|
+
<span class="kbd">⌘K</span>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<div id="header-right">
|
|
30
|
+
<div class="header-icons">
|
|
31
|
+
<button class="theme-toggle-btn" title="Share"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg></button>
|
|
32
|
+
<button class="theme-toggle-btn" title="Notifications"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0"/></svg></button>
|
|
33
|
+
<button class="theme-toggle-btn" title="Theme"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg></button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</header>
|
|
37
|
+
|
|
38
|
+
<div id="content-row">
|
|
39
|
+
<!-- SIDEBAR: original groups & order, only skin changed -->
|
|
40
|
+
<aside id="sidebar">
|
|
41
|
+
<div id="sidebar-list">
|
|
42
|
+
<!-- Sessions -->
|
|
43
|
+
<div class="sidebar-divider">
|
|
44
|
+
<span>Sessions</span>
|
|
45
|
+
<div class="sidebar-divider-actions">
|
|
46
|
+
<button class="btn-icon-sm" title="Search sessions"><svg width="13" height="13" viewBox="0 0 16 16" fill="none"><circle cx="6.5" cy="6.5" r="4.5" stroke="currentColor" stroke-width="1.6"/><line x1="10.3" y1="10.3" x2="14" y2="14" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg></button>
|
|
47
|
+
<div class="btn-split-wrap">
|
|
48
|
+
<button class="btn-split-main">+ New Session</button>
|
|
49
|
+
<button class="btn-split-arrow">▾</button>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="conv-empty">No conversations yet</div>
|
|
54
|
+
|
|
55
|
+
<!-- Config -->
|
|
56
|
+
<div class="sidebar-divider"><span>Config</span></div>
|
|
57
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg><div class="task-info"><span class="task-name">Task Management</span></div></div></div>
|
|
58
|
+
<div class="task-item active"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19.4 7.85c0 .3.1.6.3.9l1.6 1.6c.5.5.7 1.1.7 1.7s-.2 1.2-.7 1.7l-1.6 1.6c-.2.2-.5.3-.8.3-.5-.1-.8-.5-1-.9a2.5 2.5 0 1 0-3.2 3.2c.4.2.9.5 1 1a1 1 0 0 1-.3.8l-1.6 1.6c-.5.5-1.1.7-1.7.7s-1.2-.2-1.7-.7l-1.6-1.6a1 1 0 0 0-.9-.3c-.5.1-.8.5-1 1a2.5 2.5 0 1 1-3.2-3.2c.5-.2.9-.5 1-1a1 1 0 0 0-.3-.9l-1.6-1.6A2.4 2.4 0 0 1 2 12c0-.6.2-1.2.7-1.7L4.2 8.8c.2-.2.6-.4.9-.3.5.1.9.5 1.1 1a2.5 2.5 0 1 0 3.3-3.3c-.5-.2-.9-.6-1-1.1 0-.3.1-.7.3-.9l1.5-1.5A2.4 2.4 0 0 1 12 2c.6 0 1.2.2 1.7.7l1.6 1.6c.2.2.6.3.9.3.5-.1.8-.5 1-1a2.5 2.5 0 1 1 3.2 3.2c-.5.2-.9.5-1 1Z"/></svg><div class="task-info"><span class="task-name">Skill Management</span></div></div></div>
|
|
59
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="5" y="2" width="14" height="20" rx="2"/><path d="M12 18h.01"/></svg><div class="task-info"><span class="task-name">Channel Management</span></div></div></div>
|
|
60
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="4" width="18" height="6" rx="1"/><rect x="3" y="14" width="18" height="6" rx="1"/><path d="M8 7h.01M8 17h.01"/></svg><div class="task-info"><span class="task-name">MCP Servers</span></div></div></div>
|
|
61
|
+
|
|
62
|
+
<!-- My Data -->
|
|
63
|
+
<div class="sidebar-divider"><span>My Data</span></div>
|
|
64
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg><div class="task-info"><span class="task-name">Profile & Soul</span></div></div></div>
|
|
65
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><path d="M10 11v6M14 11v6"/></svg><div class="task-info"><span class="task-name">File Recall</span></div></div></div>
|
|
66
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg><div class="task-info"><span class="task-name">Billing</span></div></div></div>
|
|
67
|
+
|
|
68
|
+
<!-- Creator (conditional) -->
|
|
69
|
+
<div class="sidebar-divider"><span>Creator</span></div>
|
|
70
|
+
<div class="task-item"><div class="task-row"><svg class="task-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg><div class="task-info"><span class="task-name">Creator Hub</span></div></div></div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div id="sidebar-footer">
|
|
74
|
+
<div class="sidebar-nav-row">
|
|
75
|
+
<button class="sidebar-nav-btn"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.6 1.6 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.6 1.6 0 0 0-2.7 1.1V21a2 2 0 0 1-4 0v-.1A1.6 1.6 0 0 0 7 19.4a1.6 1.6 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.6 1.6 0 0 0-1.1-2.7H1a2 2 0 0 1 0-4h.1A1.6 1.6 0 0 0 2.6 9a1.6 1.6 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1A1.6 1.6 0 0 0 7 4.6a1.6 1.6 0 0 0 1-1.5V3a2 2 0 0 1 4 0v.1a1.6 1.6 0 0 0 1 1.5 1.6 1.6 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.6 1.6 0 0 0-.3 1.8V9a1.6 1.6 0 0 0 1.5 1H21a2 2 0 0 1 0 4h-.1a1.6 1.6 0 0 0-1.5 1z"/></svg><span>Settings</span></button>
|
|
76
|
+
<span class="version-badge">v1.2.6</span>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</aside>
|
|
80
|
+
|
|
81
|
+
<!-- MAIN / chat empty state -->
|
|
82
|
+
<main id="main">
|
|
83
|
+
<div class="chat-empty">
|
|
84
|
+
<div class="ce-mark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9"><path d="M12 2l2.4 6.6L21 11l-6.6 2.4L12 20l-2.4-6.6L3 11l6.6-2.4z"/></svg></div>
|
|
85
|
+
<div style="display:flex;flex-direction:column;gap:6px;align-items:center;">
|
|
86
|
+
<div class="ce-title">What should we build?</div>
|
|
87
|
+
<div class="ce-sub">Your agent is standing by. Pick a starting point or just type.</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="chips">
|
|
90
|
+
<button class="chip"><span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M16 18l6-6-6-6M8 6l-6 6 6 6"/></svg></span><span><span class="ct">Write code</span><br><span class="cd">build, refactor, debug</span></span></button>
|
|
91
|
+
<button class="chip"><span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg></span><span><span class="ct">Automate a task</span><br><span class="cd">schedule, run, repeat</span></span></button>
|
|
92
|
+
<button class="chip"><span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M4 19.5V6a2 2 0 0 1 2-2h12v16H6a2 2 0 0 1-2-2z"/><path d="M8 7h7"/></svg></span><span><span class="ct">Research</span><br><span class="cd">search, read, summarize</span></span></button>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="composer-wrap">
|
|
96
|
+
<div id="session-info-bar">
|
|
97
|
+
<span id="sib-status"><span class="heartbeat"></span>RUNNING</span>
|
|
98
|
+
<span class="sib-sep">│</span>
|
|
99
|
+
<span id="sib-id" class="sib-clickable" title="Session actions">#a3f9 ▾</span>
|
|
100
|
+
<span class="sib-sep">│</span>
|
|
101
|
+
<span id="sib-dir" class="sib-clickable" title="Change directory">~/proj</span>
|
|
102
|
+
<span class="sib-sep">│</span>
|
|
103
|
+
<span id="sib-model" class="sib-clickable" title="Switch model">gemini-3-flash ▾</span>
|
|
104
|
+
<span class="sib-sep">│</span>
|
|
105
|
+
<span id="sib-reasoning" class="sib-clickable" title="Reasoning effort">medium</span>
|
|
106
|
+
<span class="sib-sep">│</span>
|
|
107
|
+
<span id="sib-signal" class="sib-clickable" title="Latency"><span class="sig-bars"><i></i><i></i><i></i><i></i></span> 0.4s</span>
|
|
108
|
+
<span class="sib-sep">│</span>
|
|
109
|
+
<span id="sib-mode">auto</span>
|
|
110
|
+
<span class="sib-sep">│</span>
|
|
111
|
+
<span id="sib-tasks">0 tasks</span>
|
|
112
|
+
<span class="sib-sep">│</span>
|
|
113
|
+
<span id="sib-cost">$0.03</span>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="composer">
|
|
116
|
+
<button class="ib-icon" title="Attach file"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66L9.41 17.41a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg></button>
|
|
117
|
+
<button class="ib-icon" title="Insert command (/)"><span style="font-family:var(--font-mono);font-weight:600;">/</span></button>
|
|
118
|
+
<textarea rows="1" placeholder="Message… (Enter to send, Shift+Enter for newline)"></textarea>
|
|
119
|
+
<button class="send"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M13 6l6 6-6 6"/></svg></button>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</main>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
<button class="sample-switch" onclick="document.documentElement.dataset.theme = document.documentElement.dataset.theme==='light'?'dark':'light'">TOGGLE THEME</button>
|
|
126
|
+
</body>
|
|
127
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M17.115 7.71172L13.9417 9.62505L12.355 8.68006L15.54 6.76672L13.9183 5.81006L9.15833 8.69172L13.9533 11.55L18.725 8.66839L17.115 7.71172Z" fill="#27272A"/>
|
|
3
|
+
<path fillRule="evenodd" clipRule="evenodd" d="M12.8333 13.0083L12.8217 12.9966L3.5 7.29163L0 18.0716L12.8217 26.075L12.8333 26.0866V13.0083Z" fill="url(#paint0_linear_6554_2241)"/>
|
|
4
|
+
<path fillRule="evenodd" clipRule="evenodd" d="M24.5 7.29167L14 0.875L3.5 7.29167L5.72833 8.65667L14 3.605L22.26 8.65667L15.1783 12.9967L15.1667 13.0083V26.0867L15.1783 26.075L28 18.0717L24.5 7.29167Z" fill="url(#paint1_linear_6554_2241)"/>
|
|
5
|
+
<defs>
|
|
6
|
+
<linearGradient id="paint0_linear_6554_2241" x1="1.02691e-07" y1="26.592" x2="18.3032" y2="16.6849" gradientUnits="userSpaceOnUse">
|
|
7
|
+
<stop stop-color="#5236FF"/>
|
|
8
|
+
<stop offset="0.0001" stop-color="#5236FF"/>
|
|
9
|
+
<stop offset="1" stop-color="#D9EDFF"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="paint1_linear_6554_2241" x1="15.75" y1="0.875" x2="15.75" y2="26.0867" gradientUnits="userSpaceOnUse">
|
|
12
|
+
<stop stop-color="#8587FF"/>
|
|
13
|
+
<stop offset="1" stop-color="#383BC3"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
</defs>
|
|
16
|
+
</svg>
|