Kacper Łukawski commited on
Commit
74f8d0f
Β·
1 Parent(s): 070f7e4

Format agent outputs

Browse files
Files changed (2) hide show
  1. app/static/index.html +60 -13
  2. app/static/styles.css +55 -0
app/static/index.html CHANGED
@@ -13,8 +13,10 @@
13
 
14
  <!-- ── Header ──────────────────────────────────────────────────────── -->
15
  <header class="app-header flex items-center gap-3 px-5 py-3">
 
16
  <div class="ds-mark">d</div>
17
  <span class="brand-name">deepset</span>
 
18
  <span class="brand-sep">|</span>
19
  <span class="brand-subtitle">Conference Intelligence</span>
20
 
@@ -334,11 +336,43 @@
334
  phaseTextAcc.set(phase, (phaseTextAcc.get(phase) || '') + content);
335
 
336
  if (!phaseTextEl.get(phase)) {
337
- const el = document.createElement('div');
338
  const isReport = phase === 'writer';
339
- el.className = isReport ? 'prose prose-report prose-lg' : 'prose prose-sm';
340
- panel.appendChild(el);
341
- phaseTextEl.set(phase, el);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  }
343
  phaseTextEl.get(phase).innerHTML = marked.parse(phaseTextAcc.get(phase));
344
  panel.scrollTop = panel.scrollHeight;
@@ -405,19 +439,28 @@
405
  if (!phase) return;
406
  ensurePhase(phase);
407
 
 
 
 
 
 
408
  const panel = document.getElementById(`panel-${phase}`);
409
  if (!panel) return;
410
 
411
- if (phase === 'planner') parsePlanForFiles(content);
 
 
 
 
 
 
412
 
413
- const isReport = phase === 'writer';
414
  const el = document.createElement('div');
415
- el.className = (isReport ? 'prose prose-report prose-lg' : 'prose prose-sm') + ' prose-block fade-in';
416
  el.innerHTML = marked.parse(content);
417
- panel.appendChild(el);
418
- // Allow subsequent text chunks to continue in this block
419
- phaseTextEl.set(phase, el);
420
- phaseTextAcc.set(phase, content);
421
 
422
  panel.scrollTop = panel.scrollHeight;
423
 
@@ -556,13 +599,17 @@
556
  generateBtn.addEventListener('click', generate);
557
  themeInput.addEventListener('keydown', e => { if (e.key === 'Enter') generate(); });
558
 
559
- newReportBtn.addEventListener('click', () => {
 
560
  runSection.style.display = 'none';
561
  inputSection.style.display = 'flex';
562
  headerStatus.classList.add('hidden');
563
  themeInput.value = '';
564
  themeInput.focus();
565
- });
 
 
 
566
  </script>
567
  </body>
568
  </html>
 
13
 
14
  <!-- ── Header ──────────────────────────────────────────────────────── -->
15
  <header class="app-header flex items-center gap-3 px-5 py-3">
16
+ <div id="logo-home" class="flex items-center gap-3 cursor-pointer select-none" style="gap:0.75rem">
17
  <div class="ds-mark">d</div>
18
  <span class="brand-name">deepset</span>
19
+ </div>
20
  <span class="brand-sep">|</span>
21
  <span class="brand-subtitle">Conference Intelligence</span>
22
 
 
336
  phaseTextAcc.set(phase, (phaseTextAcc.get(phase) || '') + content);
337
 
338
  if (!phaseTextEl.get(phase)) {
 
339
  const isReport = phase === 'writer';
340
+ if (!isReport) {
341
+ const wrapper = document.createElement('div');
342
+ wrapper.className = 'prose-block fade-in';
343
+
344
+ const badge = document.createElement('div');
345
+ badge.className = 'type-badge type-text';
346
+ badge.textContent = 'text';
347
+ wrapper.appendChild(badge);
348
+
349
+ const el = document.createElement('div');
350
+ el.className = 'prose prose-sm';
351
+ wrapper.appendChild(el);
352
+ panel.appendChild(wrapper);
353
+ phaseTextEl.set(phase, el);
354
+ } else {
355
+ const wrapper = document.createElement('div');
356
+ wrapper.className = 'final-report-wrapper fade-in';
357
+
358
+ const header = document.createElement('div');
359
+ header.className = 'final-report-header';
360
+ header.innerHTML = `
361
+ <div class="final-report-dot"></div>
362
+ <span class="final-report-label">Final Report</span>
363
+ `;
364
+ wrapper.appendChild(header);
365
+
366
+ const body = document.createElement('div');
367
+ body.className = 'final-report-body';
368
+
369
+ const el = document.createElement('div');
370
+ el.className = 'prose prose-report prose-lg';
371
+ body.appendChild(el);
372
+ wrapper.appendChild(body);
373
+ panel.appendChild(wrapper);
374
+ phaseTextEl.set(phase, el);
375
+ }
376
  }
377
  phaseTextEl.get(phase).innerHTML = marked.parse(phaseTextAcc.get(phase));
378
  panel.scrollTop = panel.scrollHeight;
 
439
  if (!phase) return;
440
  ensurePhase(phase);
441
 
442
+ if (phase === 'planner') parsePlanForFiles(content);
443
+
444
+ // Writer phase: tool_result duplicates the text event β€” skip it, let appendText handle final report
445
+ if (phase === 'writer') return;
446
+
447
  const panel = document.getElementById(`panel-${phase}`);
448
  if (!panel) return;
449
 
450
+ const wrapper = document.createElement('div');
451
+ wrapper.className = 'tool-result-block fade-in';
452
+
453
+ const badge = document.createElement('div');
454
+ badge.className = 'type-badge type-result';
455
+ badge.textContent = 'tool_result';
456
+ wrapper.appendChild(badge);
457
 
 
458
  const el = document.createElement('div');
459
+ el.className = 'prose prose-sm';
460
  el.innerHTML = marked.parse(content);
461
+ wrapper.appendChild(el);
462
+
463
+ panel.appendChild(wrapper);
 
464
 
465
  panel.scrollTop = panel.scrollHeight;
466
 
 
599
  generateBtn.addEventListener('click', generate);
600
  themeInput.addEventListener('keydown', e => { if (e.key === 'Enter') generate(); });
601
 
602
+ function goHome() {
603
+ resetState();
604
  runSection.style.display = 'none';
605
  inputSection.style.display = 'flex';
606
  headerStatus.classList.add('hidden');
607
  themeInput.value = '';
608
  themeInput.focus();
609
+ }
610
+
611
+ newReportBtn.addEventListener('click', goHome);
612
+ document.getElementById('logo-home').addEventListener('click', goHome);
613
  </script>
614
  </body>
615
  </html>
app/static/styles.css CHANGED
@@ -85,6 +85,41 @@ body {
85
  max-width: 700px;
86
  margin: 0 auto;
87
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  .prose-report h1 {
89
  font-size: 1.75rem;
90
  letter-spacing: -0.5px;
@@ -107,6 +142,26 @@ body {
107
  border: 1px solid var(--border);
108
  }
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  /* ── Animations ────────────────────────────────────────────────────── */
111
  @keyframes spin {
112
  to { transform: rotate(360deg); }
 
85
  max-width: 700px;
86
  margin: 0 auto;
87
  }
88
+
89
+ /* ── Final report container ────────────────────────────────────────── */
90
+ .final-report-wrapper {
91
+ margin: 12px 4px;
92
+ border-radius: 12px;
93
+ border: 1px solid var(--border2);
94
+ background: var(--surface);
95
+ overflow: hidden;
96
+ }
97
+ .final-report-header {
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 8px;
101
+ padding: 9px 20px;
102
+ background: linear-gradient(90deg, rgba(0,110,255,0.14) 0%, transparent 80%);
103
+ border-bottom: 1px solid var(--border);
104
+ }
105
+ .final-report-label {
106
+ font-size: 0.6rem;
107
+ font-family: "SF Mono", Consolas, monospace;
108
+ font-weight: 700;
109
+ text-transform: uppercase;
110
+ letter-spacing: 0.1em;
111
+ color: var(--blue);
112
+ }
113
+ .final-report-dot {
114
+ width: 6px; height: 6px;
115
+ border-radius: 50%;
116
+ background: var(--green);
117
+ flex-shrink: 0;
118
+ box-shadow: 0 0 6px var(--green);
119
+ }
120
+ .final-report-body {
121
+ padding: 24px 28px 28px;
122
+ }
123
  .prose-report h1 {
124
  font-size: 1.75rem;
125
  letter-spacing: -0.5px;
 
142
  border: 1px solid var(--border);
143
  }
144
 
145
+ /* ── Tool result block ─────────────────────────────────────────────── */
146
+ .tool-result-block {
147
+ margin: 8px 0;
148
+ padding: 10px 14px;
149
+ background: var(--surface2);
150
+ border-left: 2px solid var(--amber);
151
+ border-radius: 0 6px 6px 0;
152
+ }
153
+
154
+ .type-badge {
155
+ font-size: 0.6rem;
156
+ font-family: "SF Mono", Consolas, monospace;
157
+ font-weight: 600;
158
+ text-transform: uppercase;
159
+ letter-spacing: 0.08em;
160
+ margin-bottom: 6px;
161
+ }
162
+ .type-badge.type-result { color: var(--amber); }
163
+ .type-badge.type-text { color: var(--muted2); }
164
+
165
  /* ── Animations ────────────────────────────────────────────────────── */
166
  @keyframes spin {
167
  to { transform: rotate(360deg); }