mirror of
https://github.com/Jeuners/agenttwo-tools.git
synced 2026-09-09 15:02:31 +02:00
qwen3.5 meldet die Fähigkeit "vision", die bisher ungenutzt blieb. Bilder lassen sich jetzt per Button, Zwischenablage (⌘V) oder Drag & Drop anhängen; eine Nachricht darf auch nur aus einem Bild bestehen. - images.ts: Validierung vor dem Speichern — maximal 4 Bilder je Nachricht, je 6 MB, Typ per Magic Bytes statt per Dateiendung (PNG/JPEG/GIF/WebP). Der WebSocket bekommt dazu ein maxPayload von 32 MB, vorher war er unbegrenzt und Bilder machen Nachrichten deutlich größer. - db.ts: Spalte images samt Migration für bestehende Datenbanken aus agenttwo - ollama.ts: images-Feld je Message; openrouter.ts: OpenAI-Format mit image_url, MIME aus den Magic Bytes statt fest image/png - Composer: Vorschau mit Entfernen-Button, Fehlermeldung bei zu großen oder nicht unterstützten Dateien; ChatMessage zeigt Bilder in der Historie - Bilder wandern in die Chat-Historie und werden bei Folgefragen erneut mitgeschickt, damit Rückfragen zum selben Bild funktionieren Getestet gegen das laufende Modell: ein rendertes PNG (roter Kreis auf weiß) wird korrekt als japanische Flagge beschrieben. Validierung geprüft gegen 5 Bilder, Textdatei mit Bildnamen, kaputtes base64 und 7-MB-Blob — alle abgelehnt. Nebenbei: Branding in UI, Titel und Serverlog auf agenttwo-tools umgestellt. Die localStorage-Keys bleiben unverändert, sonst gingen gespeicherte Einstellungen verloren. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1NXUpHbxTusqQmsjrFfbU
10 lines
9 KiB
CSS
10 lines
9 KiB
CSS
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
Theme: GitHub Dark
|
|
Description: Dark theme as seen on github.com
|
|
Author: github.com
|
|
Maintainer: @Hirse
|
|
Updated: 2021-05-15
|
|
|
|
Outdated base version: https://github.com/primer/github-syntax-dark
|
|
Current colors taken from GitHub's CSS
|
|
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}:root{--bg: #0a0f0c;--bg-panel: #0e1511;--bg-elevated: #121b15;--border: #1e2c23;--text: #d4e4d8;--text-dim: #7a9484;--accent: #3ddc84;--accent-dim: #2a9a5f;--accent-warm: #ffb454;--user-bg: #16241c;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font-family:var(--mono);font-size:14px;line-height:1.55}.app{display:flex;height:100%}.sidebar{width:250px;flex-shrink:0;background:var(--bg-panel);border-right:1px solid var(--border);display:flex;flex-direction:column}.sidebar-header{padding:16px 14px;border-bottom:1px solid var(--border)}.brand{font-weight:700;letter-spacing:.04em;color:var(--accent);margin-bottom:12px}.brand-prompt{animation:blink 1.2s steps(2) infinite}@keyframes blink{50%{opacity:.25}}.btn-new,.btn-settings,.btn-send{font-family:inherit;font-size:13px;background:transparent;color:var(--accent);border:1px solid var(--accent-dim);border-radius:6px;padding:7px 12px;cursor:pointer;transition:background .15s,border-color .15s}.btn-new{width:100%}.btn-new:hover,.btn-settings:hover{background:#3ddc8414;border-color:var(--accent)}.session-list{overflow-y:auto;flex:1;padding:8px}.empty-hint{color:var(--text-dim);padding:10px;font-size:13px}.session-item{display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:6px;cursor:pointer;color:var(--text-dim);margin-bottom:2px}.session-item:hover{background:var(--bg-elevated);color:var(--text)}.session-item.active{background:var(--user-bg);color:var(--accent)}.session-title{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}.session-delete{background:none;border:none;color:var(--text-dim);cursor:pointer;opacity:0;font-size:12px}.session-item:hover .session-delete{opacity:1}.session-delete:hover{color:#ff6b6b}.main{flex:1;display:flex;flex-direction:column;min-width:0}.topbar{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border);background:var(--bg-panel)}.model-badge{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-dim)}.status-dot{width:8px;height:8px;border-radius:50%;background:#555}.status-dot.on{background:var(--accent);box-shadow:0 0 6px var(--accent)}.status-dot.off{background:#ff6b6b}.settings-panel{padding:14px 20px;border-bottom:1px solid var(--border);background:var(--bg-elevated);display:flex;flex-direction:column;gap:12px}.setting-row{display:flex;align-items:center;gap:14px;font-size:13px;color:var(--text-dim)}.setting-row.column{flex-direction:column;align-items:stretch}.setting-row input[type=range]{flex:1;accent-color:var(--accent)}.setting-row textarea,.provider-select,.settings-panel input[list]{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:8px 10px}.setting-row textarea{resize:vertical}.provider-select{min-width:220px}.messages{flex:1;overflow-y:auto;padding:24px 20px;scroll-behavior:smooth}.welcome{max-width:640px;margin:80px auto;text-align:center;color:var(--text-dim)}.welcome-title{font-size:22px;color:var(--accent);margin-bottom:12px}.welcome .hint{margin-top:8px;font-size:13px}.msg{max-width:760px;margin:0 auto 20px}.msg-role{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--text-dim);margin-bottom:6px}.msg-user .msg-role{color:var(--accent)}.user-content{background:var(--user-bg);border:1px solid var(--border);border-radius:10px;padding:12px 14px;white-space:pre-wrap;word-break:break-word}.markdown{word-break:break-word}.markdown p{margin:0 0 10px}.markdown p:last-child{margin-bottom:0}.markdown ul,.markdown ol{margin:0 0 10px 22px}.markdown li{margin-bottom:4px}.markdown h1,.markdown h2,.markdown h3{margin:16px 0 8px;color:var(--accent)}.markdown blockquote{border-left:3px solid var(--accent-dim);padding-left:12px;color:var(--text-dim);margin:0 0 10px}.markdown a{color:var(--accent)}.markdown table{border-collapse:collapse;margin-bottom:10px}.markdown th,.markdown td{border:1px solid var(--border);padding:5px 10px;font-size:13px}.markdown :not(pre)>code{background:var(--bg-elevated);border:1px solid var(--border);border-radius:4px;padding:1px 5px;font-size:13px;color:var(--accent-warm)}.markdown pre{background:var(--bg-panel);border:1px solid var(--border);border-radius:8px;padding:12px 14px;overflow-x:auto;margin-bottom:10px;font-size:13px}.thinking{margin-bottom:8px;border:1px dashed var(--border);border-radius:8px}.thinking-toggle{width:100%;text-align:left;background:none;border:none;font-family:inherit;font-size:12px;color:var(--text-dim);padding:8px 10px;cursor:pointer}.thinking-toggle:hover{color:var(--accent-warm)}.caret{display:inline-block;transition:transform .15s}.caret.rotated{transform:rotate(90deg)}.thinking-body{padding:4px 12px 10px;font-size:12.5px;color:var(--text-dim);white-space:pre-wrap;max-height:260px;overflow-y:auto}.composer{display:flex;gap:10px;padding:14px 20px 18px;border-top:1px solid var(--border);background:var(--bg-panel);align-items:stretch}.btn-mic{width:46px;flex-shrink:0;font-size:18px;background:transparent;border:1px solid var(--border);border-radius:8px;cursor:pointer;color:var(--text-dim);transition:border-color .15s,color .15s,box-shadow .15s}.btn-mic:hover:not(:disabled){border-color:var(--accent-dim);color:var(--accent)}.btn-mic.recording{border-color:#ff6b6b;color:#ff6b6b;animation:pulse 1.2s ease-in-out infinite}.btn-mic.transcribing{border-color:var(--accent-warm);color:var(--accent-warm)}@keyframes pulse{50%{box-shadow:0 0 0 5px #ff6b6b26}}.voice-state{font-size:12px;color:var(--accent-warm);white-space:nowrap}.topbar-actions{display:flex;align-items:center;gap:12px}.btn-settings.toggled{color:var(--accent-warm);border-color:var(--accent-warm)}.voice-error{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:0 20px 8px;padding:8px 12px;font-size:13px;color:#ffb454;background:#ffb45414;border:1px solid rgba(255,180,84,.3);border-radius:8px}.voice-error button{background:none;border:none;color:inherit;cursor:pointer}.composer textarea{flex:1;resize:none;font-family:inherit;font-size:14px;background:var(--bg);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:11px 14px;min-height:44px;max-height:180px}.composer textarea:focus{outline:none;border-color:var(--accent-dim)}.composer textarea::placeholder{color:#4d6355}.btn-send{min-width:96px;align-self:stretch}.btn-send:disabled{opacity:.4;cursor:not-allowed}.btn-send:not(:disabled):hover{background:#3ddc841a}.btn-send.stop{color:var(--accent-warm);border-color:var(--accent-warm)}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-track{background:transparent}.composer.dragging{outline:2px dashed var(--accent, #3fb950);outline-offset:-4px}.composer-row{display:flex;align-items:flex-end;gap:10px;width:100%}.attachments{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:0 0 8px}.attachment{position:relative;width:64px;height:64px}.attachment img{width:100%;height:100%;object-fit:cover;border-radius:6px;border:1px solid var(--border, #30363d)}.attachment-remove{position:absolute;top:-6px;right:-6px;width:20px;height:20px;line-height:18px;padding:0;border-radius:50%;border:1px solid var(--border, #30363d);background:var(--bg, #0d1117);color:var(--fg, #c9d1d9);cursor:pointer}.attachment-error{font-size:.85em;color:#f85149}.btn-attach{flex:0 0 auto;background:transparent;border:1px solid var(--border, #30363d);border-radius:8px;padding:8px 10px;cursor:pointer;color:inherit}.btn-attach:disabled{opacity:.4;cursor:default}.msg-images{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0}.msg-images img{max-width:min(320px,100%);max-height:320px;border-radius:8px;border:1px solid var(--border, #30363d)}
|