@agent-link/server 0.1.163 → 0.1.165

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-link/server",
3
- "version": "0.1.163",
3
+ "version": "0.1.165",
4
4
  "description": "AgentLink relay server",
5
5
  "license": "MIT",
6
6
  "repository": {
package/web/app.js CHANGED
@@ -1226,6 +1226,9 @@ const App = {
1226
1226
  <span v-if="previewFile && !memoryEditing" class="file-preview-mobile-size">
1227
1227
  {{ filePreview.formatFileSize(previewFile.totalSize) }}
1228
1228
  </span>
1229
+ <button v-if="previewFile && !memoryEditing" class="preview-refresh-btn" @click="filePreview.refreshPreview()" :title="t('sidebar.refresh')">
1230
+ <svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M17.65 6.35A7.958 7.958 0 0 0 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg>
1231
+ </button>
1229
1232
  </div>
1230
1233
  </div>
1231
1234
  <div class="file-preview-mobile-filename" :title="previewFile?.filePath">
@@ -2513,6 +2516,9 @@ const App = {
2513
2516
  <span v-if="previewFile" class="preview-panel-size">
2514
2517
  {{ filePreview.formatFileSize(previewFile.totalSize) }}
2515
2518
  </span>
2519
+ <button v-if="previewFile && !memoryEditing" class="preview-refresh-btn" @click="filePreview.refreshPreview()" :title="t('sidebar.refresh')">
2520
+ <svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M17.65 6.35A7.958 7.958 0 0 0 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg>
2521
+ </button>
2516
2522
  <button v-if="isMemoryPreview && previewFile && !memoryEditing"
2517
2523
  class="preview-edit-btn" @click="startMemoryEdit()" :title="t('memory.edit')">
2518
2524
  <svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1.003 1.003 0 0 0 0-1.42l-2.34-2.34a1.003 1.003 0 0 0-1.42 0l-1.83 1.83 3.75 3.75 1.84-1.82z"/></svg>
@@ -0,0 +1,321 @@
1
+ /* ── AskUserQuestion interactive card ── */
2
+ .ask-question-wrapper {
3
+ max-width: 100%;
4
+ padding-left: 0.25rem;
5
+ margin: 0.5rem 0;
6
+ }
7
+
8
+ .ask-question-card {
9
+ background: var(--bg-secondary);
10
+ border: 1px solid var(--accent);
11
+ border-radius: 10px;
12
+ padding: 0.8rem 1rem;
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 0.75rem;
16
+ }
17
+
18
+ .ask-question-block {
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: 0.5rem;
22
+ }
23
+
24
+ .ask-question-header {
25
+ font-size: 0.7rem;
26
+ font-weight: 600;
27
+ text-transform: uppercase;
28
+ letter-spacing: 0.04em;
29
+ color: var(--accent);
30
+ }
31
+
32
+ .ask-question-text {
33
+ font-size: 0.9rem;
34
+ color: var(--text-primary);
35
+ line-height: 1.5;
36
+ }
37
+
38
+ .ask-question-options {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 6px;
42
+ }
43
+
44
+ .ask-question-option {
45
+ padding: 8px 12px;
46
+ border: 1px solid var(--border);
47
+ border-radius: 8px;
48
+ cursor: pointer;
49
+ transition: border-color 0.15s, background 0.15s;
50
+ }
51
+
52
+ .ask-question-option:hover {
53
+ border-color: var(--text-secondary);
54
+ background: var(--bg-tertiary);
55
+ }
56
+
57
+ .ask-question-option.selected {
58
+ border-color: var(--accent);
59
+ background: rgba(107, 159, 206, 0.12);
60
+ }
61
+
62
+ .ask-option-label {
63
+ font-size: 0.88rem;
64
+ font-weight: 500;
65
+ color: var(--text-primary);
66
+ }
67
+
68
+ .ask-option-desc {
69
+ font-size: 0.78rem;
70
+ color: var(--text-secondary);
71
+ margin-top: 2px;
72
+ line-height: 1.4;
73
+ }
74
+
75
+ .ask-question-custom {
76
+ margin-top: 2px;
77
+ }
78
+
79
+ .ask-question-custom input {
80
+ width: 100%;
81
+ padding: 6px 10px;
82
+ background: var(--bg-primary);
83
+ border: 1px solid var(--border);
84
+ border-radius: 6px;
85
+ color: var(--text-primary);
86
+ font-size: 0.85rem;
87
+ font-family: inherit;
88
+ outline: none;
89
+ transition: border-color 0.15s;
90
+ }
91
+
92
+ .ask-question-custom input::placeholder {
93
+ color: var(--text-secondary);
94
+ }
95
+
96
+ .ask-question-custom input:focus {
97
+ border-color: var(--accent);
98
+ }
99
+
100
+ .ask-question-actions {
101
+ display: flex;
102
+ justify-content: flex-end;
103
+ }
104
+
105
+ .ask-question-submit {
106
+ padding: 6px 20px;
107
+ background: var(--accent);
108
+ color: #fff;
109
+ border: none;
110
+ border-radius: 8px;
111
+ font-size: 0.85rem;
112
+ font-weight: 600;
113
+ cursor: pointer;
114
+ transition: background 0.15s, opacity 0.15s;
115
+ }
116
+
117
+ .ask-question-submit:hover:not(:disabled) {
118
+ background: var(--accent-hover);
119
+ }
120
+
121
+ .ask-question-submit:disabled {
122
+ opacity: 0.3;
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ .ask-question-answered {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 6px;
130
+ padding: 4px 8px;
131
+ font-size: 0.82rem;
132
+ color: var(--text-secondary);
133
+ }
134
+
135
+ .ask-answered-icon {
136
+ color: var(--success);
137
+ font-size: 0.8rem;
138
+ }
139
+
140
+ .ask-answered-text {
141
+ font-style: italic;
142
+ }
143
+
144
+ .context-summary-bar {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 6px;
148
+ padding: 6px 10px;
149
+ border-radius: 6px;
150
+ border: 1px dashed var(--border);
151
+ font-size: 0.78rem;
152
+ color: var(--text-secondary);
153
+ cursor: pointer;
154
+ transition: background 0.15s;
155
+ }
156
+
157
+ .context-summary-bar:hover {
158
+ background: var(--bg-tertiary);
159
+ }
160
+
161
+ .context-summary-icon {
162
+ flex-shrink: 0;
163
+ opacity: 0.5;
164
+ }
165
+
166
+ .context-summary-label {
167
+ flex: 1;
168
+ }
169
+
170
+ .context-summary-toggle {
171
+ font-size: 0.72rem;
172
+ opacity: 0.6;
173
+ flex-shrink: 0;
174
+ }
175
+
176
+ .context-summary-body {
177
+ margin-top: 6px;
178
+ padding: 0.6rem 0.8rem;
179
+ background: var(--bg-secondary);
180
+ border-radius: 6px;
181
+ border: 1px solid var(--border);
182
+ font-size: 0.82rem;
183
+ color: var(--text-secondary);
184
+ max-height: 400px;
185
+ overflow-y: auto;
186
+ }
187
+
188
+ .context-summary-body .markdown-body {
189
+ font-size: 0.82rem;
190
+ color: var(--text-secondary);
191
+ }
192
+
193
+ /* ── System message ── */
194
+ .system-msg {
195
+ text-align: center;
196
+ color: var(--text-secondary);
197
+ font-size: 0.8rem;
198
+ font-style: italic;
199
+ padding: 0.25rem 0;
200
+ }
201
+
202
+ .system-msg.command-output-msg {
203
+ text-align: left;
204
+ font-style: normal;
205
+ font-size: 0.85rem;
206
+ padding: 0.5rem 0;
207
+ }
208
+
209
+ .system-msg.error-msg {
210
+ text-align: left;
211
+ font-style: normal;
212
+ color: #d45454;
213
+ background: rgba(212, 84, 84, 0.08);
214
+ border: 1px solid rgba(212, 84, 84, 0.2);
215
+ border-radius: 8px;
216
+ padding: 0.75rem 1rem;
217
+ font-size: 0.85rem;
218
+ word-break: break-word;
219
+ overflow-wrap: break-word;
220
+ }
221
+
222
+ /* ── History loading indicator ── */
223
+ .history-loading {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ gap: 0.5rem;
228
+ padding: 2rem 0;
229
+ color: var(--text-secondary);
230
+ font-size: 0.85rem;
231
+ }
232
+
233
+ .history-loading-spinner {
234
+ width: 16px;
235
+ height: 16px;
236
+ border: 2px solid var(--border);
237
+ border-top-color: var(--accent);
238
+ border-radius: 50%;
239
+ animation: spin 0.8s linear infinite;
240
+ }
241
+
242
+ /* ── Load more button ── */
243
+ .load-more-wrapper {
244
+ display: flex;
245
+ justify-content: center;
246
+ padding: 0.75rem 0;
247
+ }
248
+
249
+ .load-more-btn {
250
+ background: var(--bg-tertiary);
251
+ color: var(--text-secondary);
252
+ border: 1px solid var(--border);
253
+ border-radius: 6px;
254
+ padding: 0.4rem 1.2rem;
255
+ font-size: 0.8rem;
256
+ cursor: pointer;
257
+ transition: background 0.15s, color 0.15s;
258
+ }
259
+
260
+ .load-more-btn:hover {
261
+ background: var(--accent);
262
+ color: #fff;
263
+ border-color: var(--accent);
264
+ }
265
+
266
+ /* ── Typing indicator ── */
267
+ .typing-indicator {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 4px;
271
+ padding: 0.5rem 0.9rem;
272
+ }
273
+
274
+ .typing-indicator span {
275
+ width: 6px;
276
+ height: 6px;
277
+ border-radius: 50%;
278
+ background: var(--text-secondary);
279
+ animation: typing 1.2s infinite ease-in-out;
280
+ }
281
+
282
+ .typing-indicator span:nth-child(2) {
283
+ animation-delay: 0.2s;
284
+ }
285
+
286
+ .typing-indicator span:nth-child(3) {
287
+ animation-delay: 0.4s;
288
+ }
289
+
290
+ @keyframes typing {
291
+ 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
292
+ 30% { opacity: 1; transform: scale(1); }
293
+ }
294
+
295
+ /* ── Context compaction inline message ── */
296
+ .compact-msg {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: 6px;
300
+ color: var(--warning) !important;
301
+ font-style: normal !important;
302
+ font-weight: 500;
303
+ }
304
+
305
+ .compact-inline-spinner {
306
+ display: inline-block;
307
+ width: 12px;
308
+ height: 12px;
309
+ border: 2px solid rgba(212, 162, 76, 0.3);
310
+ border-top-color: var(--warning);
311
+ border-radius: 50%;
312
+ animation: spin 0.8s linear infinite;
313
+ flex-shrink: 0;
314
+ }
315
+
316
+ .compact-done-icon {
317
+ color: var(--success, #4ead6a);
318
+ font-weight: 700;
319
+ font-style: normal;
320
+ }
321
+
@@ -0,0 +1,245 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ /* Keyboard focus outlines (visible only for keyboard navigation) */
10
+ :focus-visible {
11
+ outline: 2px solid var(--accent);
12
+ outline-offset: 2px;
13
+ }
14
+
15
+ :focus:not(:focus-visible) {
16
+ outline: none;
17
+ }
18
+
19
+ :root {
20
+ --bg-primary: #1e1e1e;
21
+ --bg-secondary: #252525;
22
+ --bg-tertiary: #2f2f2f;
23
+ --text-primary: #d4d4d4;
24
+ --text-secondary: #858585;
25
+ --accent: #6b9fce;
26
+ --accent-hover: #5a8bba;
27
+ --success: #4ead6a;
28
+ --warning: #d4a24c;
29
+ --error: #d45454;
30
+ --border: #353535;
31
+ --code-bg: #1a1a1a;
32
+ --code-header-bg: #222222;
33
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
34
+ }
35
+
36
+ /* ── Light theme ── */
37
+ [data-theme="light"] {
38
+ --bg-primary: #fefcf8;
39
+ --bg-secondary: #f5f3ef;
40
+ --bg-tertiary: #e8e6e1;
41
+ --text-primary: #1a1a1a;
42
+ --text-secondary: #4b5563;
43
+ --accent: #2563eb;
44
+ --accent-hover: #1d4ed8;
45
+ --success: #16a34a;
46
+ --warning: #d97706;
47
+ --error: #dc2626;
48
+ --border: #d1d5db;
49
+ --code-bg: #f1f3f5;
50
+ --code-header-bg: #e9ecef;
51
+ }
52
+
53
+ html {
54
+ height: 100%;
55
+ height: 100dvh;
56
+ }
57
+
58
+ body {
59
+ background-color: var(--bg-primary);
60
+ color: var(--text-primary);
61
+ height: 100%;
62
+ }
63
+
64
+ #app {
65
+ height: 100%;
66
+ }
67
+
68
+ /* ── Layout ── */
69
+ .layout {
70
+ display: flex;
71
+ flex-direction: column;
72
+ height: 100%;
73
+ }
74
+
75
+ .top-bar {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: space-between;
79
+ padding: 0.5rem 1rem;
80
+ background: var(--bg-secondary);
81
+ border-bottom: 1px solid var(--border);
82
+ flex-shrink: 0;
83
+ }
84
+
85
+ .top-bar-left {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 0.5rem;
89
+ }
90
+
91
+ .sidebar-toggle {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ width: 30px;
96
+ height: 30px;
97
+ background: none;
98
+ border: none;
99
+ border-radius: 4px;
100
+ color: var(--text-secondary);
101
+ cursor: pointer;
102
+ transition: color 0.15s, background 0.15s;
103
+ }
104
+
105
+ .sidebar-toggle:hover {
106
+ color: var(--text-primary);
107
+ background: var(--bg-tertiary);
108
+ }
109
+
110
+ .top-bar h1 {
111
+ font-size: 1.1rem;
112
+ font-weight: 700;
113
+ }
114
+
115
+ .top-bar-info {
116
+ display: flex;
117
+ align-items: center;
118
+ gap: 0.75rem;
119
+ }
120
+
121
+ .agent-label {
122
+ color: var(--text-secondary);
123
+ font-size: 0.85rem;
124
+ }
125
+
126
+ .latency {
127
+ font-size: 0.75rem;
128
+ font-variant-numeric: tabular-nums;
129
+ opacity: 0.7;
130
+ }
131
+ .latency.good { color: var(--success); }
132
+ .latency.ok { color: var(--warning); }
133
+ .latency.bad { color: var(--error); }
134
+
135
+ .theme-toggle {
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ width: 32px;
140
+ height: 32px;
141
+ flex-shrink: 0;
142
+ background: none;
143
+ border: 1px solid var(--border);
144
+ border-radius: 8px;
145
+ color: var(--text-secondary);
146
+ cursor: pointer;
147
+ transition: color 0.15s, background 0.15s, border-color 0.15s;
148
+ }
149
+
150
+ .theme-toggle:hover {
151
+ color: var(--text-primary);
152
+ background: var(--bg-tertiary);
153
+ border-color: var(--text-secondary);
154
+ }
155
+
156
+ /* ── Center card (no session / waiting) ── */
157
+ .center-card {
158
+ flex: 1;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ padding: 2rem;
163
+ min-height: 0;
164
+ }
165
+
166
+ .status-card {
167
+ background: var(--bg-secondary);
168
+ border: 1px solid var(--border);
169
+ border-radius: 12px;
170
+ padding: 1.5rem 2rem;
171
+ min-width: 320px;
172
+ text-align: center;
173
+ }
174
+
175
+ .status-card .status {
176
+ font-size: 1.1rem;
177
+ margin-bottom: 0.75rem;
178
+ }
179
+
180
+ .status-card .info {
181
+ margin-bottom: 0.5rem;
182
+ font-size: 0.95rem;
183
+ }
184
+
185
+ .status-card .label {
186
+ color: var(--text-secondary);
187
+ }
188
+
189
+ /* ── Badges ── */
190
+ .muted {
191
+ color: var(--text-secondary);
192
+ font-size: 0.85rem;
193
+ }
194
+
195
+ .badge {
196
+ padding: 2px 8px;
197
+ border-radius: 4px;
198
+ font-weight: 600;
199
+ font-size: 0.9rem;
200
+ }
201
+
202
+ .badge.connected {
203
+ color: var(--success);
204
+ background: rgba(78, 173, 106, 0.1);
205
+ }
206
+
207
+ .badge.disconnected {
208
+ color: var(--error);
209
+ background: rgba(212, 84, 84, 0.1);
210
+ }
211
+
212
+ .badge.connecting\.\.\. {
213
+ color: var(--warning);
214
+ background: rgba(212, 162, 76, 0.1);
215
+ }
216
+
217
+ .badge.reconnecting\.\.\. {
218
+ color: var(--warning);
219
+ background: rgba(212, 162, 76, 0.1);
220
+ }
221
+
222
+ .badge.waiting {
223
+ color: var(--warning);
224
+ background: rgba(212, 162, 76, 0.1);
225
+ }
226
+
227
+ .badge.error,
228
+ .badge.no\ session {
229
+ color: var(--error);
230
+ background: rgba(212, 84, 84, 0.1);
231
+ }
232
+
233
+ .error-msg {
234
+ color: var(--error);
235
+ font-size: 0.85rem;
236
+ margin-top: 0.75rem;
237
+ }
238
+
239
+ /* ── Main body (sidebar + chat) ── */
240
+ .main-body {
241
+ flex: 1;
242
+ display: flex;
243
+ min-height: 0;
244
+ }
245
+