agent-afk 5.207.2 → 5.208.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/tools/handlers/web-request.d.ts +2 -2
- package/dist/agent/tools/handlers/web-scrape.d.ts +2 -2
- package/dist/cli.mjs +581 -581
- package/dist/index.mjs +1 -1
- package/dist/telegram.mjs +1 -1
- package/dist/web-server/shared/ledger-adapter.d.ts +3 -0
- package/dist/web-ui-assets/assets/index-3YQ3Lxgf.css +1 -0
- package/dist/web-ui-assets/assets/index-Ye2O81KT.js +298 -0
- package/dist/web-ui-assets/index.html +14 -87
- package/package.json +2 -2
- package/dist/web-server/frontend/ansi-strip.d.ts +0 -1
- package/dist/web-server/frontend/app-approvals.d.ts +0 -7
- package/dist/web-server/frontend/app-chrome.d.ts +0 -3
- package/dist/web-server/frontend/app-views.d.ts +0 -3
- package/dist/web-server/frontend/app.d.ts +0 -1
- package/dist/web-server/frontend/at-file-panel.d.ts +0 -5
- package/dist/web-server/frontend/bg-jobs-panel.d.ts +0 -14
- package/dist/web-server/frontend/chrome.d.ts +0 -1
- package/dist/web-server/frontend/composer-value.d.ts +0 -1
- package/dist/web-server/frontend/composer-wiring.d.ts +0 -7
- package/dist/web-server/frontend/diff-viewer.d.ts +0 -17
- package/dist/web-server/frontend/dom-utils.d.ts +0 -2
- package/dist/web-server/frontend/ledger-adapter.d.ts +0 -2
- package/dist/web-server/frontend/markdown-dom.d.ts +0 -1
- package/dist/web-server/frontend/memory-panel.d.ts +0 -6
- package/dist/web-server/frontend/model-selector.d.ts +0 -10
- package/dist/web-server/frontend/queue-panel.d.ts +0 -21
- package/dist/web-server/frontend/queue-reorder.d.ts +0 -5
- package/dist/web-server/frontend/render-approvals.d.ts +0 -22
- package/dist/web-server/frontend/render-incremental.d.ts +0 -3
- package/dist/web-server/frontend/render.d.ts +0 -16
- package/dist/web-server/frontend/schedule-form.d.ts +0 -7
- package/dist/web-server/frontend/schedule-history.d.ts +0 -1
- package/dist/web-server/frontend/schedules-view.d.ts +0 -33
- package/dist/web-server/frontend/scroll-pin.d.ts +0 -7
- package/dist/web-server/frontend/session-status.d.ts +0 -11
- package/dist/web-server/frontend/slash-autocomplete-render.d.ts +0 -3
- package/dist/web-server/frontend/slash-autocomplete.d.ts +0 -39
- package/dist/web-server/frontend/slash-highlight.d.ts +0 -8
- package/dist/web-server/frontend/sse-client.d.ts +0 -20
- package/dist/web-server/frontend/subagent-tree.d.ts +0 -27
- package/dist/web-server/frontend/thinking-panel.d.ts +0 -3
- package/dist/web-server/frontend/tool-trace-panel.d.ts +0 -2
- package/dist/web-server/frontend/view-model.d.ts +0 -66
- package/dist/web-server/frontend/web-token.d.ts +0 -3
- package/dist/web-ui-assets/app.js +0 -65
- package/dist/web-ui-assets/approvals.css +0 -55
- package/dist/web-ui-assets/at-file.css +0 -110
- package/dist/web-ui-assets/bg-jobs.css +0 -130
- package/dist/web-ui-assets/chrome.js +0 -1
- package/dist/web-ui-assets/diff-viewer.css +0 -168
- package/dist/web-ui-assets/memory.css +0 -146
- package/dist/web-ui-assets/model-selector.css +0 -118
- package/dist/web-ui-assets/schedules.css +0 -201
- package/dist/web-ui-assets/styles.css +0 -680
- /package/dist/{web → http-client}/egress-guard.d.ts +0 -0
- /package/dist/{web → http-client}/extract.d.ts +0 -0
- /package/dist/{web → http-client}/extraction-advisory.d.ts +0 -0
- /package/dist/{web → http-client}/index.d.ts +0 -0
- /package/dist/{web → http-client}/retryFetch.d.ts +0 -0
- /package/dist/{web → http-client}/scrape.d.ts +0 -0
- /package/dist/{web → http-client}/search.d.ts +0 -0
- /package/dist/{web → http-client}/types.d.ts +0 -0
- /package/dist/{web → http-client}/web-request.d.ts +0 -0
|
@@ -1,680 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Brand tokens hand-ported from website/app/globals.css. The docs site is a
|
|
3
|
-
* separate Next.js package, so these are copied deliberately rather than
|
|
4
|
-
* imported — keep the hexes in sync when the brand moves.
|
|
5
|
-
*/
|
|
6
|
-
:root {
|
|
7
|
-
--bg: #07070b;
|
|
8
|
-
--bg-raised: #0e0e14;
|
|
9
|
-
--bg-sunken: #050508;
|
|
10
|
-
--border: #1e1e28;
|
|
11
|
-
--text: #e8e8ef;
|
|
12
|
-
--text-dim: #9a9aab;
|
|
13
|
-
--text-faint: #6a6a7b;
|
|
14
|
-
--accent: #f9854b;
|
|
15
|
-
--success: #4ade80;
|
|
16
|
-
--error: #f87171;
|
|
17
|
-
--warning: #fbbf24;
|
|
18
|
-
--purple: #a78bfa;
|
|
19
|
-
--cyan: #67e8f9;
|
|
20
|
-
--mint: #86efac;
|
|
21
|
-
--lavender: #c4b5fd;
|
|
22
|
-
--radius: 8px;
|
|
23
|
-
--mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
24
|
-
--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
* { box-sizing: border-box; }
|
|
28
|
-
/* Invariant: the hidden attribute must always win over CSS display rules.
|
|
29
|
-
Elements like .transcript and .composer have explicit display values that
|
|
30
|
-
override the UA [hidden] { display: none } in some browsers. */
|
|
31
|
-
[hidden] { display: none !important; }
|
|
32
|
-
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
33
|
-
#prompt:focus-visible, .approval-input:focus-visible { outline: none; }
|
|
34
|
-
|
|
35
|
-
html, body {
|
|
36
|
-
margin: 0;
|
|
37
|
-
height: 100%;
|
|
38
|
-
background: var(--bg);
|
|
39
|
-
color: var(--text);
|
|
40
|
-
font-family: var(--sans);
|
|
41
|
-
font-size: 14px;
|
|
42
|
-
-webkit-font-smoothing: antialiased;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/* ── top bar ─────────────────────────────────────────────────────────────── */
|
|
46
|
-
.topbar {
|
|
47
|
-
display: flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
gap: 16px;
|
|
50
|
-
height: 48px;
|
|
51
|
-
padding: 0 16px;
|
|
52
|
-
border-bottom: 1px solid var(--border);
|
|
53
|
-
background: var(--bg-raised);
|
|
54
|
-
position: sticky;
|
|
55
|
-
top: 0;
|
|
56
|
-
/* z-ladder: content=0, backdrop=8, sidebar=9, topbar=10, approvals=15, slash-menu=20, at-popover=25, modal=50 */
|
|
57
|
-
z-index: 10;
|
|
58
|
-
}
|
|
59
|
-
.brand { display: flex; align-items: center; gap: 8px; font-weight: 600; }
|
|
60
|
-
.brand-mark {
|
|
61
|
-
width: 10px; height: 10px; border-radius: 50%;
|
|
62
|
-
background: var(--accent);
|
|
63
|
-
box-shadow: 0 0 12px var(--accent);
|
|
64
|
-
}
|
|
65
|
-
.brand-name { letter-spacing: 0.04em; }
|
|
66
|
-
.meter { margin-left: auto; color: var(--text-dim); font-family: var(--mono); font-size: 12px; }
|
|
67
|
-
.status {
|
|
68
|
-
font-family: var(--mono); font-size: 11px; text-transform: uppercase;
|
|
69
|
-
letter-spacing: 0.06em; color: var(--text-faint);
|
|
70
|
-
padding: 3px 8px; border: 1px solid var(--border); border-radius: 999px;
|
|
71
|
-
}
|
|
72
|
-
.status-open { color: var(--success); border-color: color-mix(in srgb, var(--success) 40%, transparent); }
|
|
73
|
-
.status-reconnecting, .status-connecting { color: var(--warning); border-color: color-mix(in srgb, var(--warning) 40%, transparent); }
|
|
74
|
-
.status-closed { color: var(--text-faint); }
|
|
75
|
-
.menu-toggle {
|
|
76
|
-
display: none; background: none; border: 1px solid var(--border);
|
|
77
|
-
color: var(--text); border-radius: var(--radius); padding: 4px 10px; cursor: pointer;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/* ── layout ──────────────────────────────────────────────────────────────── */
|
|
81
|
-
.layout { display: flex; height: calc(100% - 48px); }
|
|
82
|
-
.sidebar {
|
|
83
|
-
width: 280px; flex: 0 0 280px; border-right: 1px solid var(--border);
|
|
84
|
-
background: var(--bg-sunken); overflow-y: auto;
|
|
85
|
-
}
|
|
86
|
-
.sidebar-head {
|
|
87
|
-
padding: 12px 16px 8px; font-size: 11px; text-transform: uppercase;
|
|
88
|
-
letter-spacing: 0.08em; color: var(--text-dim);
|
|
89
|
-
display: flex; align-items: center; justify-content: space-between; gap: 8px;
|
|
90
|
-
}
|
|
91
|
-
.new-session {
|
|
92
|
-
font: inherit; letter-spacing: inherit; text-transform: inherit;
|
|
93
|
-
color: var(--accent); background: transparent;
|
|
94
|
-
border: 1px solid var(--border); border-radius: 6px;
|
|
95
|
-
padding: 3px 9px; cursor: pointer; white-space: nowrap;
|
|
96
|
-
}
|
|
97
|
-
.new-session:hover:not(:disabled) { border-color: var(--accent); background: var(--bg-raised); }
|
|
98
|
-
.new-session:disabled { opacity: 0.5; cursor: default; }
|
|
99
|
-
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
|
|
100
|
-
|
|
101
|
-
/* ── sessions ────────────────────────────────────────────────────────────── */
|
|
102
|
-
.session-row {
|
|
103
|
-
display: flex; flex-direction: column; gap: 5px; width: 100%;
|
|
104
|
-
padding: 10px 16px; background: none; border: none; border-left: 2px solid transparent;
|
|
105
|
-
color: var(--text); text-align: left; cursor: pointer; font: inherit;
|
|
106
|
-
}
|
|
107
|
-
.session-row:hover { background: var(--bg-raised); }
|
|
108
|
-
.session-row.is-active { background: var(--bg-raised); border-left-color: var(--accent); }
|
|
109
|
-
.session-title {
|
|
110
|
-
font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
111
|
-
}
|
|
112
|
-
.session-meta { display: flex; align-items: center; gap: 6px; }
|
|
113
|
-
.badge {
|
|
114
|
-
font-size: 10px; padding: 1px 6px; border-radius: 999px;
|
|
115
|
-
font-family: var(--mono); letter-spacing: 0.03em;
|
|
116
|
-
}
|
|
117
|
-
.badge-live { color: var(--success); background: color-mix(in srgb, var(--success) 14%, transparent); }
|
|
118
|
-
.badge-readonly { color: var(--text-faint); background: color-mix(in srgb, var(--text-faint) 14%, transparent); }
|
|
119
|
-
.badge-alive { color: var(--accent); background: color-mix(in srgb, var(--accent) 14%, transparent); }
|
|
120
|
-
.session-time { font-size: 10px; color: var(--text-faint); margin-left: auto; }
|
|
121
|
-
.session-cwd {
|
|
122
|
-
font-family: var(--mono); font-size: 10px; color: var(--text-dim);
|
|
123
|
-
background: var(--bg-sunken); border: 1px solid var(--border);
|
|
124
|
-
border-radius: 4px; padding: 1px 5px;
|
|
125
|
-
max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
126
|
-
}
|
|
127
|
-
.empty { padding: 16px; color: var(--text-faint); }
|
|
128
|
-
|
|
129
|
-
/* ── transcript ──────────────────────────────────────────────────────────── */
|
|
130
|
-
.transcript { flex: 1; overflow-y: auto; padding: 20px; scroll-behavior: smooth; display: flex; flex-direction: column; align-items: center; }
|
|
131
|
-
.msg { margin-bottom: 18px; max-width: 900px; width: 100%; }
|
|
132
|
-
.msg-role {
|
|
133
|
-
font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em;
|
|
134
|
-
color: var(--text-dim); margin-bottom: 5px;
|
|
135
|
-
}
|
|
136
|
-
.msg-body { white-space: pre-wrap; word-break: break-word; line-height: 1.6; }
|
|
137
|
-
.msg-user .msg-body {
|
|
138
|
-
background: var(--bg-raised); border-left: 2px solid var(--accent);
|
|
139
|
-
padding: 10px 14px; border-radius: 0 var(--radius) var(--radius) 0;
|
|
140
|
-
}
|
|
141
|
-
.msg-thinking { opacity: 1; font-style: italic; }
|
|
142
|
-
.msg-thinking summary { opacity: 0.65; cursor: pointer; }
|
|
143
|
-
.msg-thinking[open] .msg-body { margin-top: 8px; padding: 8px 12px; border-left: 2px solid var(--border); font-size: 13px; }
|
|
144
|
-
.msg-error .msg-body { color: var(--error); }
|
|
145
|
-
|
|
146
|
-
/*
|
|
147
|
-
* Markdown blocks (markdown-dom.ts).
|
|
148
|
-
*
|
|
149
|
-
* Invariant: `.md-body` must cancel the `pre-wrap` inherited from `.msg-body`.
|
|
150
|
-
* That rule exists so UNPARSED text keeps its newlines; once the same text is
|
|
151
|
-
* parsed into real block elements, preserving source newlines double-spaces
|
|
152
|
-
* every paragraph and list. Whitespace is re-preserved only inside `pre`/`code`,
|
|
153
|
-
* where it is semantic.
|
|
154
|
-
*/
|
|
155
|
-
.md-body { white-space: normal; }
|
|
156
|
-
.md > :first-child { margin-top: 0; }
|
|
157
|
-
.md > :last-child { margin-bottom: 0; }
|
|
158
|
-
.md-p { margin: 0 0 10px; }
|
|
159
|
-
.md-heading {
|
|
160
|
-
margin: 18px 0 8px; line-height: 1.3; font-weight: 600;
|
|
161
|
-
color: var(--text); letter-spacing: -0.01em;
|
|
162
|
-
}
|
|
163
|
-
.md h1.md-heading { font-size: 19px; }
|
|
164
|
-
.md h2.md-heading {
|
|
165
|
-
font-size: 16px; padding-bottom: 5px; border-bottom: 1px solid var(--border);
|
|
166
|
-
}
|
|
167
|
-
.md h3.md-heading { font-size: 14px; }
|
|
168
|
-
.md h4.md-heading, .md h5.md-heading, .md h6.md-heading {
|
|
169
|
-
font-size: 13px; color: var(--text-dim);
|
|
170
|
-
}
|
|
171
|
-
.md-list { margin: 0 0 10px; padding-left: 22px; }
|
|
172
|
-
.md-list li { margin: 3px 0; }
|
|
173
|
-
.md-list .md-p { margin: 0; }
|
|
174
|
-
.md-task { margin-right: 7px; vertical-align: middle; accent-color: var(--accent); }
|
|
175
|
-
.md-code-inline {
|
|
176
|
-
font-family: var(--mono); font-size: 0.88em;
|
|
177
|
-
background: var(--bg-sunken); border: 1px solid var(--border);
|
|
178
|
-
border-radius: 4px; padding: 1px 5px; color: var(--accent);
|
|
179
|
-
white-space: pre-wrap; word-break: break-word;
|
|
180
|
-
}
|
|
181
|
-
.md-pre {
|
|
182
|
-
margin: 0 0 12px; padding: 11px 13px; overflow-x: auto;
|
|
183
|
-
background: var(--bg-sunken); border: 1px solid var(--border);
|
|
184
|
-
border-radius: var(--radius); white-space: pre;
|
|
185
|
-
}
|
|
186
|
-
.md-pre[data-lang]::before {
|
|
187
|
-
content: attr(data-lang); display: block; text-align: right;
|
|
188
|
-
font-family: var(--mono); font-size: 10px; color: var(--text-faint);
|
|
189
|
-
margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.06em;
|
|
190
|
-
}
|
|
191
|
-
.md-pre code {
|
|
192
|
-
font-family: var(--mono); font-size: 12px; line-height: 1.55;
|
|
193
|
-
color: var(--text); background: none; border: 0; padding: 0; white-space: pre;
|
|
194
|
-
}
|
|
195
|
-
.md-quote {
|
|
196
|
-
margin: 0 0 10px; padding: 4px 0 4px 14px;
|
|
197
|
-
border-left: 3px solid color-mix(in srgb, var(--accent) 45%, transparent);
|
|
198
|
-
color: var(--text-dim);
|
|
199
|
-
background: color-mix(in srgb, var(--accent) 4%, transparent);
|
|
200
|
-
border-radius: 0 4px 4px 0;
|
|
201
|
-
}
|
|
202
|
-
.md-hr { border: 0; border-top: 1px solid var(--border); margin: 16px 0; }
|
|
203
|
-
.md-link { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
|
|
204
|
-
.md-link:hover { text-decoration-thickness: 2px; }
|
|
205
|
-
.md-image { color: var(--text-faint); font-style: italic; }
|
|
206
|
-
.md-table {
|
|
207
|
-
border-collapse: collapse; margin: 0 0 12px; font-size: 12px; display: block;
|
|
208
|
-
overflow-x: auto; max-width: 100%;
|
|
209
|
-
}
|
|
210
|
-
.md-table th, .md-table td {
|
|
211
|
-
border: 1px solid var(--border); padding: 5px 9px; text-align: left;
|
|
212
|
-
}
|
|
213
|
-
.md-table th { background: var(--bg-raised); font-weight: 600; }
|
|
214
|
-
.notice {
|
|
215
|
-
font-family: var(--mono); font-size: 11px; color: var(--text-faint);
|
|
216
|
-
padding: 5px 0; border-top: 1px dashed var(--border); margin: 14px 0;
|
|
217
|
-
max-width: 900px; width: 100%;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/* ── tool calls ──────────────────────────────────────────────────────────── */
|
|
221
|
-
.tool {
|
|
222
|
-
border: 1px solid var(--border); border-radius: var(--radius);
|
|
223
|
-
margin-bottom: 10px; background: var(--bg-raised); overflow: hidden;
|
|
224
|
-
max-width: 900px; width: 100%;
|
|
225
|
-
}
|
|
226
|
-
.tool-summary {
|
|
227
|
-
display: flex; align-items: center; gap: 8px; padding: 8px 12px;
|
|
228
|
-
cursor: pointer; font-family: var(--mono); font-size: 12px; list-style: none;
|
|
229
|
-
}
|
|
230
|
-
.tool-summary::-webkit-details-marker { display: none; }
|
|
231
|
-
.tool-summary::before {
|
|
232
|
-
content: '›';
|
|
233
|
-
display: inline-block;
|
|
234
|
-
font-size: 14px;
|
|
235
|
-
color: var(--text-faint);
|
|
236
|
-
transition: transform 0.15s ease;
|
|
237
|
-
margin-right: 4px;
|
|
238
|
-
flex: 0 0 auto;
|
|
239
|
-
}
|
|
240
|
-
details[open] > .tool-summary::before { transform: rotate(90deg); }
|
|
241
|
-
.tool-dot { width: 6px; height: 6px; border-radius: 50%; flex: 0 0 6px; }
|
|
242
|
-
@keyframes afk-pulse {
|
|
243
|
-
0%, 100% { opacity: 1; }
|
|
244
|
-
50% { opacity: 0.35; }
|
|
245
|
-
}
|
|
246
|
-
.tool-dot-running { background: var(--warning); animation: afk-pulse 1.4s ease-in-out infinite; }
|
|
247
|
-
.tool-dot-ok { background: var(--success); }
|
|
248
|
-
.tool-dot-error { background: var(--error); }
|
|
249
|
-
.tool-name { color: var(--accent); }
|
|
250
|
-
.tool-target { color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
251
|
-
.tool-body { padding: 0 12px 12px; border-top: 1px solid var(--border); }
|
|
252
|
-
.tool-label {
|
|
253
|
-
font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em;
|
|
254
|
-
color: var(--text-dim); margin: 10px 0 4px;
|
|
255
|
-
}
|
|
256
|
-
.tool-pre {
|
|
257
|
-
margin: 0; padding: 10px; background: var(--bg-sunken); border-radius: 6px;
|
|
258
|
-
font-family: var(--mono); font-size: 12px; line-height: 1.5;
|
|
259
|
-
overflow-x: auto; white-space: pre-wrap; word-break: break-word;
|
|
260
|
-
max-height: 420px; overflow-y: auto;
|
|
261
|
-
}
|
|
262
|
-
/* The "we genuinely do not have this" state — visually distinct from empty
|
|
263
|
-
output, because they mean different things. */
|
|
264
|
-
.tool-unavailable {
|
|
265
|
-
margin-top: 10px; padding: 8px 10px; border-radius: 6px;
|
|
266
|
-
background: color-mix(in srgb, var(--warning) 8%, transparent);
|
|
267
|
-
border: 1px dashed color-mix(in srgb, var(--warning) 35%, transparent);
|
|
268
|
-
color: var(--warning); font-size: 12px; line-height: 1.5;
|
|
269
|
-
}
|
|
270
|
-
.tool-more {
|
|
271
|
-
margin-top: 8px; background: none; border: 1px solid var(--border);
|
|
272
|
-
color: var(--text-dim); border-radius: 6px; padding: 4px 10px;
|
|
273
|
-
cursor: pointer; font-family: var(--mono); font-size: 11px;
|
|
274
|
-
}
|
|
275
|
-
.tool-more:hover { color: var(--text); border-color: var(--accent); }
|
|
276
|
-
.diff-add { color: var(--success); background: color-mix(in srgb, var(--success) 8%, transparent); display: block; }
|
|
277
|
-
.diff-del { color: var(--error); background: color-mix(in srgb, var(--error) 8%, transparent); display: block; }
|
|
278
|
-
.diff-hunk { color: var(--accent); opacity: 0.75; display: block; }
|
|
279
|
-
.diff-ctx { color: var(--text-dim); display: block; }
|
|
280
|
-
|
|
281
|
-
/* ── composer ────────────────────────────────────────────────────────────── */
|
|
282
|
-
.composer { border-top: 1px solid var(--border); background: var(--bg-raised); padding: 12px 20px; position: relative; }
|
|
283
|
-
.composer.is-readonly { opacity: 0.6; }
|
|
284
|
-
|
|
285
|
-
/* Slash-command menu. Anchored to the composer and floated ABOVE it so opening
|
|
286
|
-
it never reflows the transcript or shifts the textarea under the cursor. */
|
|
287
|
-
.slash-menu {
|
|
288
|
-
position: absolute; bottom: 100%; left: 20px; right: 20px; z-index: 20;
|
|
289
|
-
max-height: 40vh; overflow-y: auto; margin-bottom: 6px;
|
|
290
|
-
background: var(--bg-raised); border: 1px solid var(--border);
|
|
291
|
-
border-radius: var(--radius); box-shadow: 0 8px 24px rgb(0 0 0 / 45%);
|
|
292
|
-
}
|
|
293
|
-
/* [hidden] handled by global rule — no per-element override needed. */
|
|
294
|
-
.slash-status {
|
|
295
|
-
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
|
|
296
|
-
overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
|
|
297
|
-
}
|
|
298
|
-
.slash-row {
|
|
299
|
-
display: flex; align-items: baseline; gap: 8px;
|
|
300
|
-
padding: 6px 12px; cursor: pointer; font-size: 13px;
|
|
301
|
-
border-left: 2px solid transparent;
|
|
302
|
-
}
|
|
303
|
-
.slash-row.is-selected { background: var(--bg-sunken); border-left-color: var(--accent); }
|
|
304
|
-
.slash-name { font-family: var(--mono); color: var(--accent); white-space: nowrap; }
|
|
305
|
-
.slash-row.is-selected .slash-name { font-weight: 600; }
|
|
306
|
-
.slash-summary {
|
|
307
|
-
color: var(--text-dim); overflow: hidden;
|
|
308
|
-
text-overflow: ellipsis; white-space: nowrap;
|
|
309
|
-
}
|
|
310
|
-
.slash-badge {
|
|
311
|
-
font-size: 11px; color: var(--text-faint); border: 1px solid var(--border);
|
|
312
|
-
border-radius: 4px; padding: 0 5px; white-space: nowrap; flex: none;
|
|
313
|
-
}
|
|
314
|
-
.composer-row { display: flex; gap: 10px; align-items: flex-end; }
|
|
315
|
-
.prompt-wrap { flex: 1; position: relative; display: flex; }
|
|
316
|
-
|
|
317
|
-
/* Invariant: #prompt and .prompt-mirror paint the SAME string on top of each
|
|
318
|
-
other, so every metric that affects text layout must be declared once, here,
|
|
319
|
-
for both. Changing font, size, line-height, padding, or border width on one
|
|
320
|
-
alone makes the highlight ghost behind the caret. */
|
|
321
|
-
#prompt, .prompt-mirror {
|
|
322
|
-
border: 1px solid var(--border); border-radius: var(--radius);
|
|
323
|
-
padding: 10px 12px; font-family: var(--sans); font-size: 14px; line-height: 1.5;
|
|
324
|
-
white-space: pre-wrap; overflow-wrap: break-word;
|
|
325
|
-
}
|
|
326
|
-
#prompt {
|
|
327
|
-
flex: 1; resize: vertical; background: transparent; position: relative; z-index: 1;
|
|
328
|
-
}
|
|
329
|
-
#prompt.slash-highlight-active {
|
|
330
|
-
/* Text is transparent so the mirror shows through; the caret is not. */
|
|
331
|
-
color: transparent; caret-color: var(--text);
|
|
332
|
-
}
|
|
333
|
-
#prompt::placeholder { color: var(--text-faint); }
|
|
334
|
-
.prompt-mirror {
|
|
335
|
-
position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
|
|
336
|
-
background: var(--bg-sunken); color: var(--text); border-color: transparent;
|
|
337
|
-
}
|
|
338
|
-
.prompt-mirror .tok-known { color: var(--accent); }
|
|
339
|
-
.prompt-mirror .tok-slash { color: var(--text-faint); }
|
|
340
|
-
#prompt:focus { outline: none; border-color: var(--accent); }
|
|
341
|
-
#prompt:disabled { cursor: not-allowed; }
|
|
342
|
-
.send {
|
|
343
|
-
background: var(--accent); color: #1a0d05; border: none; border-radius: var(--radius);
|
|
344
|
-
padding: 10px 18px; font-weight: 600; cursor: pointer;
|
|
345
|
-
transition: background 0.15s ease, color 0.15s ease, opacity 0.15s ease, filter 0.15s ease;
|
|
346
|
-
}
|
|
347
|
-
.send:hover:not(:disabled) { filter: brightness(1.06); }
|
|
348
|
-
.send:disabled { background: var(--border); color: var(--text-faint); cursor: not-allowed; }
|
|
349
|
-
.queue { display: flex; flex-direction: column; gap: 5px; margin-bottom: 8px; }
|
|
350
|
-
.queue-row {
|
|
351
|
-
display: flex; align-items: center; gap: 8px; padding: 5px 10px;
|
|
352
|
-
background: var(--bg-sunken); border: 1px dashed var(--border); border-radius: 6px;
|
|
353
|
-
font-size: 12px; color: var(--text-dim);
|
|
354
|
-
}
|
|
355
|
-
.queue-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
356
|
-
.queue-btn {
|
|
357
|
-
background: none; border: none; color: var(--text-faint);
|
|
358
|
-
cursor: pointer; padding: 0 4px; font-size: 12px;
|
|
359
|
-
}
|
|
360
|
-
.queue-btn:hover { color: var(--accent); }
|
|
361
|
-
.queue-edit-input {
|
|
362
|
-
flex: 1; background: var(--bg-sunken); border: 1px solid var(--accent);
|
|
363
|
-
border-radius: 4px; color: var(--text); font: inherit; font-size: 12px;
|
|
364
|
-
padding: 1px 5px; min-width: 0;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/* ── sidebar backdrop (mobile close-on-outside-click) ────────────────────── */
|
|
368
|
-
.sidebar-backdrop {
|
|
369
|
-
display: none;
|
|
370
|
-
position: fixed; inset: 0; z-index: 8;
|
|
371
|
-
background: rgba(0,0,0,0.5);
|
|
372
|
-
}
|
|
373
|
-
@media (max-width: 720px) {
|
|
374
|
-
.sidebar.is-open ~ .sidebar-backdrop { display: block; }
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/* ── mobile ──────────────────────────────────────────────────────────────── */
|
|
378
|
-
@media (max-width: 720px) {
|
|
379
|
-
.menu-toggle { display: block; }
|
|
380
|
-
.meter { display: none; }
|
|
381
|
-
.sidebar {
|
|
382
|
-
position: fixed; top: 48px; bottom: 0; left: 0; z-index: 9;
|
|
383
|
-
transform: translateX(-100%); transition: transform 0.18s ease;
|
|
384
|
-
}
|
|
385
|
-
.sidebar.is-open { transform: translateX(0); }
|
|
386
|
-
.transcript { padding: 14px; }
|
|
387
|
-
.composer { padding: 10px 14px; }
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
.stop {
|
|
391
|
-
font: inherit; font-size: 12px; cursor: pointer; white-space: nowrap;
|
|
392
|
-
color: var(--error); background: transparent;
|
|
393
|
-
border: 1px solid var(--error); border-radius: 6px; padding: 0 14px;
|
|
394
|
-
}
|
|
395
|
-
.stop:hover { background: rgba(248, 113, 113, 0.12); }
|
|
396
|
-
|
|
397
|
-
/* ── toast ───────────────────────────────────────────────────────────────── */
|
|
398
|
-
.toast {
|
|
399
|
-
position: fixed; top: 56px; right: 16px; z-index: 100;
|
|
400
|
-
max-width: 360px; padding: 10px 14px;
|
|
401
|
-
background: var(--bg-raised); border: 1px solid var(--error);
|
|
402
|
-
color: var(--error); border-radius: var(--radius);
|
|
403
|
-
font-size: 13px; line-height: 1.4;
|
|
404
|
-
opacity: 0; transition: opacity 0.2s ease;
|
|
405
|
-
pointer-events: none;
|
|
406
|
-
}
|
|
407
|
-
.toast.is-visible { opacity: 1; pointer-events: auto; }
|
|
408
|
-
|
|
409
|
-
/* ── new-session form ────────────────────────────────────────────────────── */
|
|
410
|
-
.new-session-form {
|
|
411
|
-
display: flex; flex-direction: column; gap: 6px;
|
|
412
|
-
padding: 10px 14px 12px; border-bottom: 1px solid var(--border);
|
|
413
|
-
background: var(--bg-raised);
|
|
414
|
-
}
|
|
415
|
-
.nsf-select, .nsf-input {
|
|
416
|
-
width: 100%; padding: 5px 8px;
|
|
417
|
-
background: var(--bg-sunken); border: 1px solid var(--border);
|
|
418
|
-
border-radius: 6px; color: var(--text); font: inherit; font-size: 12px;
|
|
419
|
-
}
|
|
420
|
-
.nsf-select:focus, .nsf-input:focus { outline: none; border-color: var(--accent); }
|
|
421
|
-
.nsf-btn {
|
|
422
|
-
align-self: flex-start; padding: 4px 14px;
|
|
423
|
-
background: var(--accent); color: #1a0d05;
|
|
424
|
-
border: none; border-radius: 6px; font: inherit; font-size: 12px;
|
|
425
|
-
font-weight: 600; cursor: pointer;
|
|
426
|
-
}
|
|
427
|
-
.nsf-btn:hover { opacity: 0.88; }
|
|
428
|
-
|
|
429
|
-
/* ── thinking panel (thinking-panel.ts) ──────────────────────────────────── */
|
|
430
|
-
/*
|
|
431
|
-
* Invariant: expand/collapse is driven by the `.thinking-block--open` modifier
|
|
432
|
-
* class toggled in JS — NOT by `<details>` open attribute. This keeps the panel
|
|
433
|
-
* compatible with the incremental renderer, which keys change-detection off
|
|
434
|
-
* `.className` and would fight with native `<details>` state.
|
|
435
|
-
*/
|
|
436
|
-
.thinking-host { max-width: 900px; width: 100%; margin-bottom: 14px; }
|
|
437
|
-
|
|
438
|
-
.thinking-block {
|
|
439
|
-
border: 1px solid var(--border);
|
|
440
|
-
border-radius: var(--radius);
|
|
441
|
-
background: var(--bg-raised);
|
|
442
|
-
overflow: hidden;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/* Summary row — always visible, acts as the click target. */
|
|
446
|
-
.thinking-summary {
|
|
447
|
-
display: flex;
|
|
448
|
-
align-items: center;
|
|
449
|
-
gap: 6px;
|
|
450
|
-
padding: 6px 12px;
|
|
451
|
-
cursor: pointer;
|
|
452
|
-
user-select: none;
|
|
453
|
-
font-family: var(--mono);
|
|
454
|
-
font-size: 11px;
|
|
455
|
-
color: var(--text-faint);
|
|
456
|
-
/* No border-bottom by default; appears only when open (see below). */
|
|
457
|
-
}
|
|
458
|
-
.thinking-summary:hover { color: var(--text-dim); }
|
|
459
|
-
|
|
460
|
-
/* Rotated chevron mirrors the tool-summary::before convention. */
|
|
461
|
-
.thinking-chevron {
|
|
462
|
-
font-size: 14px;
|
|
463
|
-
color: var(--text-faint);
|
|
464
|
-
transition: transform 0.15s ease;
|
|
465
|
-
flex: 0 0 auto;
|
|
466
|
-
line-height: 1;
|
|
467
|
-
}
|
|
468
|
-
.thinking-block--open .thinking-chevron { transform: rotate(90deg); }
|
|
469
|
-
|
|
470
|
-
.thinking-label { letter-spacing: 0.03em; }
|
|
471
|
-
|
|
472
|
-
/* Body — hidden until the block is open. */
|
|
473
|
-
.thinking-body {
|
|
474
|
-
display: none;
|
|
475
|
-
border-top: 1px solid var(--border);
|
|
476
|
-
padding: 10px 12px;
|
|
477
|
-
}
|
|
478
|
-
.thinking-block--open .thinking-body { display: block; }
|
|
479
|
-
|
|
480
|
-
/* Verbatim thinking text — monospace, slightly dimmed, scrollable. */
|
|
481
|
-
.thinking-pre {
|
|
482
|
-
margin: 0;
|
|
483
|
-
font-family: var(--mono);
|
|
484
|
-
font-size: 12px;
|
|
485
|
-
line-height: 1.55;
|
|
486
|
-
color: var(--text-dim);
|
|
487
|
-
white-space: pre-wrap;
|
|
488
|
-
word-break: break-word;
|
|
489
|
-
overflow-x: auto;
|
|
490
|
-
max-height: 480px;
|
|
491
|
-
overflow-y: auto;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/* Focus ring for keyboard navigation (role=button on .thinking-summary). */
|
|
495
|
-
.thinking-summary:focus-visible {
|
|
496
|
-
outline: 2px solid var(--accent);
|
|
497
|
-
outline-offset: -2px;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
/* ── subagent tree panel (Wave 2-E) ──────────────────────────────────────── */
|
|
501
|
-
.sat-tree {
|
|
502
|
-
font-family: var(--mono);
|
|
503
|
-
font-size: 12px;
|
|
504
|
-
color: var(--text-dim);
|
|
505
|
-
padding: 6px 0;
|
|
506
|
-
user-select: none;
|
|
507
|
-
}
|
|
508
|
-
.sat-node { display: flex; flex-direction: column; }
|
|
509
|
-
.sat-row {
|
|
510
|
-
display: flex;
|
|
511
|
-
align-items: baseline;
|
|
512
|
-
gap: 4px;
|
|
513
|
-
padding: 2px 8px;
|
|
514
|
-
border-radius: 4px;
|
|
515
|
-
white-space: nowrap;
|
|
516
|
-
overflow: hidden;
|
|
517
|
-
}
|
|
518
|
-
.sat-row-expandable { cursor: pointer; }
|
|
519
|
-
.sat-row-expandable:hover { background: var(--bg-raised); }
|
|
520
|
-
|
|
521
|
-
/* toggle arrow */
|
|
522
|
-
.sat-toggle {
|
|
523
|
-
flex-shrink: 0;
|
|
524
|
-
font-size: 9px;
|
|
525
|
-
color: var(--text-faint);
|
|
526
|
-
width: 12px;
|
|
527
|
-
display: inline-block;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/* tree connector (monospace spine) */
|
|
531
|
-
.sat-indent {
|
|
532
|
-
flex-shrink: 0;
|
|
533
|
-
color: var(--text-faint);
|
|
534
|
-
white-space: pre;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
/* status icons */
|
|
538
|
-
.sat-icon { flex-shrink: 0; font-size: 11px; width: 14px; text-align: center; }
|
|
539
|
-
.sat-icon-started { color: var(--accent); animation: sat-spin 1.2s linear infinite; }
|
|
540
|
-
.sat-icon-succeeded { color: var(--success); }
|
|
541
|
-
.sat-icon-failed { color: var(--error); }
|
|
542
|
-
.sat-icon-cancelled { color: var(--text-faint); }
|
|
543
|
-
|
|
544
|
-
@keyframes sat-spin {
|
|
545
|
-
0% { opacity: 1; }
|
|
546
|
-
50% { opacity: 0.35; }
|
|
547
|
-
100% { opacity: 1; }
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
/* label parts */
|
|
551
|
-
.sat-label { display: flex; align-items: baseline; gap: 0; min-width: 0; overflow: hidden; }
|
|
552
|
-
.sat-type { color: var(--text); font-weight: 500; flex-shrink: 0; }
|
|
553
|
-
.sat-model { color: var(--text-faint); flex-shrink: 0; }
|
|
554
|
-
.sat-head {
|
|
555
|
-
color: var(--text-dim);
|
|
556
|
-
overflow: hidden;
|
|
557
|
-
text-overflow: ellipsis;
|
|
558
|
-
white-space: nowrap;
|
|
559
|
-
min-width: 0;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/* right-aligned meta (duration + cost) */
|
|
563
|
-
.sat-meta {
|
|
564
|
-
margin-left: auto;
|
|
565
|
-
display: flex;
|
|
566
|
-
gap: 8px;
|
|
567
|
-
flex-shrink: 0;
|
|
568
|
-
color: var(--text-faint);
|
|
569
|
-
font-size: 11px;
|
|
570
|
-
}
|
|
571
|
-
.sat-duration { color: var(--text-faint); }
|
|
572
|
-
.sat-cost { color: var(--text-faint); }
|
|
573
|
-
|
|
574
|
-
/* children indent container */
|
|
575
|
-
.sat-children { padding-left: 0; }
|
|
576
|
-
|
|
577
|
-
/* ── tool-trace-panel (Wave 2-A) ──────────────────────────────────────────── */
|
|
578
|
-
/*
|
|
579
|
-
* tc-* classes belong to tool-trace-panel.ts. They reuse existing brand
|
|
580
|
-
* tokens and the diff-* / tool-* classes already defined above so the
|
|
581
|
-
* panel stays visually coherent with the existing tool rows in render.ts.
|
|
582
|
-
*/
|
|
583
|
-
|
|
584
|
-
.tc-card {
|
|
585
|
-
border: 1px solid var(--border); border-radius: var(--radius);
|
|
586
|
-
margin-bottom: 8px; background: var(--bg-raised); overflow: hidden;
|
|
587
|
-
max-width: 900px; width: 100%;
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
.tc-header {
|
|
591
|
-
display: flex; align-items: center; gap: 8px; padding: 8px 12px;
|
|
592
|
-
cursor: pointer; font-family: var(--mono); font-size: 12px;
|
|
593
|
-
list-style: none; user-select: none;
|
|
594
|
-
}
|
|
595
|
-
.tc-header::-webkit-details-marker { display: none; }
|
|
596
|
-
.tc-header::before {
|
|
597
|
-
content: '›';
|
|
598
|
-
display: inline-block; font-size: 14px; color: var(--text-faint);
|
|
599
|
-
transition: transform 0.15s ease; margin-right: 4px; flex: 0 0 auto;
|
|
600
|
-
}
|
|
601
|
-
details[open] > .tc-header::before { transform: rotate(90deg); }
|
|
602
|
-
|
|
603
|
-
/* Status badge: dot + short label */
|
|
604
|
-
.tc-status { display: flex; align-items: center; gap: 4px; flex: 0 0 auto; }
|
|
605
|
-
/* tc-dot reuses the .tool-dot sizing; the colour variant classes (tool-dot-ok
|
|
606
|
-
/ tool-dot-running / tool-dot-error) come from the existing tool-calls block. */
|
|
607
|
-
.tc-dot {
|
|
608
|
-
width: 6px; height: 6px; border-radius: 50%; flex: 0 0 6px;
|
|
609
|
-
}
|
|
610
|
-
.tc-status-label {
|
|
611
|
-
font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
|
|
612
|
-
}
|
|
613
|
-
.tc-status-running { color: var(--warning); }
|
|
614
|
-
.tc-status-ok { color: var(--success); }
|
|
615
|
-
.tc-status-error { color: var(--error); }
|
|
616
|
-
|
|
617
|
-
.tc-name { color: var(--accent); font-weight: 600; flex: 0 0 auto; }
|
|
618
|
-
.tc-input-preview {
|
|
619
|
-
color: var(--text-dim); overflow: hidden; text-overflow: ellipsis;
|
|
620
|
-
white-space: nowrap; flex: 1 1 0; min-width: 0;
|
|
621
|
-
}
|
|
622
|
-
.tc-header-duration {
|
|
623
|
-
color: var(--text-faint); font-size: 11px; flex: 0 0 auto; margin-left: auto;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
/* Body (visible when <details> is open) */
|
|
627
|
-
.tc-body {
|
|
628
|
-
padding: 0 12px 12px; border-top: 1px solid var(--border);
|
|
629
|
-
}
|
|
630
|
-
.tc-section { margin-top: 10px; }
|
|
631
|
-
.tc-pre-wrap { display: flex; flex-direction: column; gap: 6px; }
|
|
632
|
-
|
|
633
|
-
/* Duration metadata row */
|
|
634
|
-
.tc-meta-row {
|
|
635
|
-
display: flex; align-items: center; gap: 8px;
|
|
636
|
-
padding: 8px 0 0; font-family: var(--mono); font-size: 11px;
|
|
637
|
-
}
|
|
638
|
-
.tc-meta-label {
|
|
639
|
-
font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em;
|
|
640
|
-
color: var(--text-dim);
|
|
641
|
-
}
|
|
642
|
-
.tc-meta-value { color: var(--text-faint); }
|
|
643
|
-
|
|
644
|
-
/* "output not available" note — dim, not alarming */
|
|
645
|
-
.tc-unavailable {
|
|
646
|
-
margin-top: 10px; font-size: 12px; font-style: italic;
|
|
647
|
-
color: var(--text-faint);
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/* ---- subagent / bg-job lifecycle cards ---- */
|
|
651
|
-
.sa-card {
|
|
652
|
-
display: flex; flex-direction: column; gap: 4px;
|
|
653
|
-
padding: 8px 12px; margin: 8px 0; border-radius: var(--radius);
|
|
654
|
-
border-left: 3px solid var(--border); background: var(--bg-sunken);
|
|
655
|
-
font-family: var(--mono); font-size: 12px;
|
|
656
|
-
}
|
|
657
|
-
.sa-card--started { border-left-color: var(--accent); }
|
|
658
|
-
.sa-card--succeeded, .sa-card--completed { border-left-color: var(--success); }
|
|
659
|
-
.sa-card--failed { border-left-color: var(--error); }
|
|
660
|
-
.sa-card--cancelled { border-left-color: var(--text-dim); }
|
|
661
|
-
.sa-header {
|
|
662
|
-
display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
|
|
663
|
-
}
|
|
664
|
-
.sa-icon {
|
|
665
|
-
font-size: 13px; width: 18px; text-align: center; flex-shrink: 0;
|
|
666
|
-
}
|
|
667
|
-
.sa-card--started .sa-icon { color: var(--accent); }
|
|
668
|
-
.sa-card--succeeded .sa-icon, .sa-card--completed .sa-icon { color: var(--success); }
|
|
669
|
-
.sa-card--failed .sa-icon { color: var(--error); }
|
|
670
|
-
.sa-card--cancelled .sa-icon { color: var(--text-dim); }
|
|
671
|
-
.sa-label {
|
|
672
|
-
flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
|
|
673
|
-
white-space: nowrap; color: var(--text);
|
|
674
|
-
}
|
|
675
|
-
.sa-model { color: var(--text-dim); font-size: 11px; }
|
|
676
|
-
.sa-dur { color: var(--text-faint); font-size: 11px; }
|
|
677
|
-
.sa-prompt {
|
|
678
|
-
color: var(--text-faint); font-size: 11px; line-height: 1.4;
|
|
679
|
-
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
680
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|