~bigbes/lethe

ref: dee1235c28148f69dfc491eac92752c784a634dc lethe/docs/design_handoff_assistant_log/proto-session.jsx -rw-r--r-- 3.5 KiB
dee1235c — Eugene Blikh docs: update collector verify notes 24 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Session view — turn list aside + linear transcript

const SessionScreen = () => {
  const { go, route } = useRouter();
  const session = SESSIONS.find(s => s.id === (route.id || 'a1')) || SESSIONS[0];

  const turnList = [
    [1, 'U', 'lockfile design for the …', 32],
    [2, 'A', 'Both, but for diff reasons …', 980],
    [3, '⚙', 'Read("build.zig")', 0],
    [4, '⚙', '→ 14.2 KB, 318 lines', 0],
    [5, 'A', 'Looking at your build.zig …', 1240, true],
    [6, 'U', 'ok so transitive deps from…', 18],
    [7, 'A', 'Transitive deps need a sep…', 760],
    [8, '⚙', 'Grep("vendor/")', 0],
    [9, '⚙', '→ 47 matches', 0],
    [10, 'A', 'Three of those are header-…', 540],
    [11, 'U', 'how would the cache key …', 22],
    [12, 'A', 'sha256 over the sorted…', 880],
  ];

  return (
    <>
      <div className="subbar">
        <span className="mono muted click" onClick={() => go({ name: 'project', cwd: session.cwd })}>{session.cwd}</span>
        <span style={{ fontWeight: 600 }}>{session.q.slice(0, 56)}{session.q.length > 56 ? '…' : ''}</span>
        <ToolTag tool={session.tool} />
        <HostTag host={session.host} />
        <span className="tag">{session.model.replace('claude-', '')}</span>
        <span style={{ flex: 1 }} />
        <span className="mono muted">{session.turns} turns · {session.tok} tok · started {session.when} · open</span>
      </div>

      <div style={{ flex: 1, display: 'grid', gridTemplateColumns: '240px 1fr', overflow: 'hidden', minHeight: 0 }}>
        <aside style={{ borderRight: '1px solid var(--rule-2)', overflow: 'auto', background: 'var(--paper-3)', minHeight: 0 }}>
          <div className="thead" style={{ gridTemplateColumns: '24px 14px 1fr 36px', padding: '4px 10px' }}>
            <span>#</span><span></span><span>preview</span><span className="right">tok</span>
          </div>
          {turnList.map(([n, r, t, tok, sel]) => (
            <div key={n} style={{
              display: 'grid', gridTemplateColumns: '24px 14px 1fr 36px',
              padding: '3px 10px', fontSize: 11, gap: 8,
              background: sel ? 'var(--paper-2)' : 'transparent',
              borderLeft: sel ? '2px solid var(--accent)' : '2px solid transparent',
              cursor: 'pointer',
              alignItems: 'center',
            }}>
              <span className="mono muted">{n}</span>
              <span style={{ color: r === 'A' ? 'var(--accent-ink)' : 'var(--ink-3)', fontWeight: 700, fontFamily: 'var(--mono)' }}>{r}</span>
              <span className="truncate">{t}</span>
              <span className="right mono muted" style={{ fontSize: 10 }}>{tok || '—'}</span>
            </div>
          ))}
        </aside>

        <main style={{ overflow: 'auto', minHeight: 0 }}>
          {TURNS.map((t, i) => (
            <div key={i} className={'turn ' + t.role + (t.kind ? ' tool' : '')}>
              <div className="meta">
                <span className={'role-' + t.role.toUpperCase()}>{t.role.toUpperCase()}</span>
                {t.kind && <span className="tag" style={{ fontSize: 9.5 }}>{t.kind}</span>}
                {t.model && <span className="mono">{t.model}</span>}
                {t.tIn != null && <span className="mono">in {t.tIn} · out {t.tOut}</span>}
                <span style={{ flex: 1 }} />
                <span className="mono" style={{ opacity: 0.5 }}>#{i + 1}</span>
              </div>
              <div className="body">{t.text}</div>
            </div>
          ))}
        </main>
      </div>
    </>
  );
};

Object.assign(window, { SessionScreen });