@agent-link/server 0.1.43 → 0.1.45
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/context.d.ts +1 -0
- package/dist/context.js.map +1 -1
- package/dist/ws-agent.js +3 -1
- package/dist/ws-agent.js.map +1 -1
- package/dist/ws-client.js +5 -0
- package/dist/ws-client.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +18 -7
- package/web/modules/connection.js +18 -0
- package/web/style.css +28 -22
package/dist/context.d.ts
CHANGED
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAwBrC,yCAAyC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/ws-agent.js
CHANGED
|
@@ -8,6 +8,7 @@ export function handleAgentConnection(ws, req) {
|
|
|
8
8
|
const name = url.searchParams.get('name') || `Agent-${agentId.slice(0, 8)}`;
|
|
9
9
|
const workDir = url.searchParams.get('workDir') || 'unknown';
|
|
10
10
|
const hostname = url.searchParams.get('hostname') || '';
|
|
11
|
+
const version = url.searchParams.get('version') || '';
|
|
11
12
|
// Reuse requested sessionId (agent reconnecting) or generate a new one
|
|
12
13
|
const requestedSessionId = url.searchParams.get('sessionId');
|
|
13
14
|
const sessionId = requestedSessionId || generateSessionId();
|
|
@@ -18,6 +19,7 @@ export function handleAgentConnection(ws, req) {
|
|
|
18
19
|
name,
|
|
19
20
|
hostname,
|
|
20
21
|
workDir,
|
|
22
|
+
version,
|
|
21
23
|
sessionId,
|
|
22
24
|
sessionKey,
|
|
23
25
|
connectedAt: new Date(),
|
|
@@ -38,7 +40,7 @@ export function handleAgentConnection(ws, req) {
|
|
|
38
40
|
if (client.sessionId === sessionId && client.ws.readyState === WebSocket.OPEN) {
|
|
39
41
|
encryptAndSend(client.ws, {
|
|
40
42
|
type: 'agent_reconnected',
|
|
41
|
-
agent: { agentId, name, hostname, workDir },
|
|
43
|
+
agent: { agentId, name, hostname, workDir, version },
|
|
42
44
|
}, client.sessionKey);
|
|
43
45
|
}
|
|
44
46
|
}
|
package/dist/ws-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,EACV,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,qBAAqB,CAAC,EAAa,EAAE,GAAoB;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-agent.js","sourceRoot":"","sources":["../src/ws-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/ws-client.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
|
+
import { createRequire } from 'module';
|
|
3
4
|
import { agents, sessionToAgent, webClients, } from './context.js';
|
|
4
5
|
import { generateSessionKey, encodeKey, parseMessage, encryptAndSend } from './encryption.js';
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const serverPkg = require('../package.json');
|
|
5
8
|
export function handleWebConnection(ws, req) {
|
|
6
9
|
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
7
10
|
const sessionId = url.searchParams.get('sessionId');
|
|
@@ -29,11 +32,13 @@ export function handleWebConnection(ws, req) {
|
|
|
29
32
|
type: 'connected',
|
|
30
33
|
clientId,
|
|
31
34
|
sessionKey: encodeKey(sessionKey),
|
|
35
|
+
serverVersion: serverPkg.version,
|
|
32
36
|
agent: agent ? {
|
|
33
37
|
agentId: agent.agentId,
|
|
34
38
|
name: agent.name,
|
|
35
39
|
hostname: agent.hostname,
|
|
36
40
|
workDir: agent.workDir,
|
|
41
|
+
version: agent.version,
|
|
37
42
|
} : null,
|
|
38
43
|
}));
|
|
39
44
|
console.log(`[Web] Client ${clientId.slice(0, 8)} connected to session ${sessionId}, agent: ${agent ? agent.name : 'none'}`);
|
package/dist/ws-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EACL,MAAM,EACN,cAAc,EACd,UAAU,GAEX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,MAAM,UAAU,mBAAmB,CAAC,EAAa,EAAE,GAAoB;IACrE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAE9B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACzE,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,MAAM,MAAM,GAAc;QACxB,EAAE;QACF,QAAQ;QACR,SAAS;QACT,UAAU;QACV,WAAW,EAAE,IAAI,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEjC,qFAAqF;IACrF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ;QACR,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;QACjC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC,CAAC,IAAI;KACT,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,yBAAyB,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7H,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QACjE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,8CAA8C,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACrD,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAChG,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -27,6 +27,8 @@ const App = {
|
|
|
27
27
|
const workDir = ref('');
|
|
28
28
|
const sessionId = ref('');
|
|
29
29
|
const error = ref('');
|
|
30
|
+
const serverVersion = ref('');
|
|
31
|
+
const agentVersion = ref('');
|
|
30
32
|
const messages = ref([]);
|
|
31
33
|
const visibleLimit = ref(50);
|
|
32
34
|
const hasMoreMessages = computed(() => messages.value.length > visibleLimit.value);
|
|
@@ -138,6 +140,7 @@ const App = {
|
|
|
138
140
|
|
|
139
141
|
const { connect, wsSend, closeWs } = createConnection({
|
|
140
142
|
status, agentName, hostname, workDir, sessionId, error,
|
|
143
|
+
serverVersion, agentVersion,
|
|
141
144
|
messages, isProcessing, isCompacting, visibleLimit,
|
|
142
145
|
historySessions, currentClaudeSessionId, loadingSessions, loadingHistory,
|
|
143
146
|
folderPickerLoading, folderPickerEntries, folderPickerPath,
|
|
@@ -234,6 +237,7 @@ const App = {
|
|
|
234
237
|
|
|
235
238
|
return {
|
|
236
239
|
status, agentName, hostname, workDir, sessionId, error,
|
|
240
|
+
serverVersion, agentVersion,
|
|
237
241
|
messages, visibleMessages, hasMoreMessages, loadMoreMessages,
|
|
238
242
|
inputText, isProcessing, isCompacting, canSend, inputRef,
|
|
239
243
|
sendMessage, handleKeydown, cancelExecution, onMessageListScroll,
|
|
@@ -363,6 +367,12 @@ const App = {
|
|
|
363
367
|
</div>
|
|
364
368
|
</div>
|
|
365
369
|
</div>
|
|
370
|
+
|
|
371
|
+
<div v-if="serverVersion || agentVersion" class="sidebar-version-footer">
|
|
372
|
+
<span v-if="serverVersion">server {{ serverVersion }}</span>
|
|
373
|
+
<span v-if="serverVersion && agentVersion" class="sidebar-version-sep">/</span>
|
|
374
|
+
<span v-if="agentVersion">agent {{ agentVersion }}</span>
|
|
375
|
+
</div>
|
|
366
376
|
</aside>
|
|
367
377
|
|
|
368
378
|
<!-- Chat area -->
|
|
@@ -496,19 +506,20 @@ const App = {
|
|
|
496
506
|
</div>
|
|
497
507
|
|
|
498
508
|
<!-- System message -->
|
|
499
|
-
<div v-else-if="msg.role === 'system'" class="system-msg">
|
|
509
|
+
<div v-else-if="msg.role === 'system'" :class="['system-msg', { 'compact-msg': msg.isCompactStart }]">
|
|
510
|
+
<template v-if="msg.isCompactStart && !msg.compactDone">
|
|
511
|
+
<span class="compact-inline-spinner"></span>
|
|
512
|
+
</template>
|
|
513
|
+
<template v-if="msg.isCompactStart && msg.compactDone">
|
|
514
|
+
<span class="compact-done-icon">✓</span>
|
|
515
|
+
</template>
|
|
500
516
|
{{ msg.content }}
|
|
501
517
|
</div>
|
|
502
518
|
</div>
|
|
503
519
|
|
|
504
|
-
<div v-if="isProcessing && !
|
|
520
|
+
<div v-if="isProcessing && !messages.some(m => m.isStreaming)" class="typing-indicator">
|
|
505
521
|
<span></span><span></span><span></span>
|
|
506
522
|
</div>
|
|
507
|
-
|
|
508
|
-
<div v-if="isCompacting" class="compacting-banner">
|
|
509
|
-
<div class="compacting-spinner"></div>
|
|
510
|
-
<span class="compacting-text">Context compacting in progress...</span>
|
|
511
|
-
</div>
|
|
512
523
|
</div>
|
|
513
524
|
</div>
|
|
514
525
|
|
|
@@ -13,6 +13,7 @@ const RECONNECT_MAX_DELAY = 15000;
|
|
|
13
13
|
export function createConnection(deps) {
|
|
14
14
|
const {
|
|
15
15
|
status, agentName, hostname, workDir, sessionId, error,
|
|
16
|
+
serverVersion, agentVersion,
|
|
16
17
|
messages, isProcessing, isCompacting, visibleLimit,
|
|
17
18
|
historySessions, currentClaudeSessionId, loadingSessions, loadingHistory,
|
|
18
19
|
folderPickerLoading, folderPickerEntries, folderPickerPath,
|
|
@@ -137,11 +138,13 @@ export function createConnection(deps) {
|
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
if (msg.type === 'connected') {
|
|
141
|
+
if (msg.serverVersion) serverVersion.value = msg.serverVersion;
|
|
140
142
|
if (msg.agent) {
|
|
141
143
|
status.value = 'Connected';
|
|
142
144
|
agentName.value = msg.agent.name;
|
|
143
145
|
hostname.value = msg.agent.hostname || '';
|
|
144
146
|
workDir.value = msg.agent.workDir;
|
|
147
|
+
agentVersion.value = msg.agent.version || '';
|
|
145
148
|
const savedDir = localStorage.getItem('agentlink-workdir');
|
|
146
149
|
if (savedDir && savedDir !== msg.agent.workDir) {
|
|
147
150
|
wsSend({ type: 'change_workdir', workDir: savedDir });
|
|
@@ -165,6 +168,8 @@ export function createConnection(deps) {
|
|
|
165
168
|
agentName.value = msg.agent.name;
|
|
166
169
|
hostname.value = msg.agent.hostname || '';
|
|
167
170
|
workDir.value = msg.agent.workDir;
|
|
171
|
+
agentVersion.value = msg.agent.version || '';
|
|
172
|
+
workDir.value = msg.agent.workDir;
|
|
168
173
|
}
|
|
169
174
|
sidebar.requestSessionList();
|
|
170
175
|
} else if (msg.type === 'error') {
|
|
@@ -186,8 +191,21 @@ export function createConnection(deps) {
|
|
|
186
191
|
} else if (msg.type === 'context_compaction') {
|
|
187
192
|
if (msg.status === 'started') {
|
|
188
193
|
isCompacting.value = true;
|
|
194
|
+
messages.value.push({
|
|
195
|
+
id: streaming.nextId(), role: 'system',
|
|
196
|
+
content: 'Context compacting...', isCompactStart: true,
|
|
197
|
+
timestamp: new Date(),
|
|
198
|
+
});
|
|
199
|
+
scrollToBottom();
|
|
189
200
|
} else if (msg.status === 'completed') {
|
|
190
201
|
isCompacting.value = false;
|
|
202
|
+
// Update the start message to show completed
|
|
203
|
+
const startMsg = [...messages.value].reverse().find(m => m.isCompactStart && !m.compactDone);
|
|
204
|
+
if (startMsg) {
|
|
205
|
+
startMsg.content = 'Context compacted';
|
|
206
|
+
startMsg.compactDone = true;
|
|
207
|
+
}
|
|
208
|
+
scrollToBottom();
|
|
191
209
|
}
|
|
192
210
|
} else if (msg.type === 'turn_completed' || msg.type === 'execution_cancelled') {
|
|
193
211
|
isProcessing.value = false;
|
package/web/style.css
CHANGED
|
@@ -290,6 +290,20 @@ body {
|
|
|
290
290
|
overflow: hidden;
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
+
.sidebar-version-footer {
|
|
294
|
+
padding: 6px 12px;
|
|
295
|
+
font-size: 0.65rem;
|
|
296
|
+
color: var(--text-secondary);
|
|
297
|
+
opacity: 0.5;
|
|
298
|
+
text-align: center;
|
|
299
|
+
border-top: 1px solid var(--border);
|
|
300
|
+
flex-shrink: 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.sidebar-version-sep {
|
|
304
|
+
margin: 0 3px;
|
|
305
|
+
}
|
|
306
|
+
|
|
293
307
|
.sidebar-section-header {
|
|
294
308
|
display: flex;
|
|
295
309
|
align-items: center;
|
|
@@ -1249,25 +1263,20 @@ body {
|
|
|
1249
1263
|
30% { opacity: 1; transform: scale(1); }
|
|
1250
1264
|
}
|
|
1251
1265
|
|
|
1252
|
-
/* ── Context compaction
|
|
1253
|
-
.
|
|
1254
|
-
display: flex;
|
|
1266
|
+
/* ── Context compaction inline message ── */
|
|
1267
|
+
.compact-msg {
|
|
1268
|
+
display: inline-flex;
|
|
1255
1269
|
align-items: center;
|
|
1256
|
-
gap:
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
border-radius: 8px;
|
|
1260
|
-
background: rgba(245, 158, 11, 0.08);
|
|
1261
|
-
border: 1px solid rgba(245, 158, 11, 0.25);
|
|
1262
|
-
color: var(--warning);
|
|
1263
|
-
font-size: 0.85rem;
|
|
1270
|
+
gap: 6px;
|
|
1271
|
+
color: var(--warning) !important;
|
|
1272
|
+
font-style: normal !important;
|
|
1264
1273
|
font-weight: 500;
|
|
1265
|
-
animation: compacting-pulse 2s ease-in-out infinite;
|
|
1266
1274
|
}
|
|
1267
1275
|
|
|
1268
|
-
.
|
|
1269
|
-
|
|
1270
|
-
|
|
1276
|
+
.compact-inline-spinner {
|
|
1277
|
+
display: inline-block;
|
|
1278
|
+
width: 12px;
|
|
1279
|
+
height: 12px;
|
|
1271
1280
|
border: 2px solid rgba(245, 158, 11, 0.3);
|
|
1272
1281
|
border-top-color: var(--warning);
|
|
1273
1282
|
border-radius: 50%;
|
|
@@ -1275,13 +1284,10 @@ body {
|
|
|
1275
1284
|
flex-shrink: 0;
|
|
1276
1285
|
}
|
|
1277
1286
|
|
|
1278
|
-
.
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
@keyframes compacting-pulse {
|
|
1283
|
-
0%, 100% { opacity: 1; }
|
|
1284
|
-
50% { opacity: 0.7; }
|
|
1287
|
+
.compact-done-icon {
|
|
1288
|
+
color: var(--success, #22c55e);
|
|
1289
|
+
font-weight: 700;
|
|
1290
|
+
font-style: normal;
|
|
1285
1291
|
}
|
|
1286
1292
|
|
|
1287
1293
|
/* ── Input area ── */
|