Add hooks, @file mentions, session search/fork/export, follow-scroll

- Hooks ([[hooks]]): pre_tool, post_tool, user_prompt, stop; sandboxed, exit 2 blocks
- @file mentions with autocomplete; mentioned files/folders are attached to the prompt
- Session full-text search in the sidebar, fork into a copy, export as Markdown/JSON
- Chat follows the newest message until the user scrolls up; jump-to-latest button
- SVG activity spark and thinking icon instead of Unicode/emoji glyphs
- File search ranks name matches first and returns relative paths

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-08 20:17:12 +01:00
1 parent ec1b9b4925
commit 013695722a
17 files changed
+911 -41

No files matched your search

+11 -1
View File
@@ -123,6 +123,7 @@ export const de: Messages = {
"git.commit": "Commit",
"git.noCommits": "Noch keine Commits.",
"git.noDiff": "Keine Unterschiede.",
"composer.folder": "Ordner",
"composer.attachedFiles": "Angehängte Dateien (im Projekt, mit deinen Tools lesen):",
"composer.uploading": "Lade {n} hoch…",
"usage.title": "Modelle und Verbrauch dieser Session",
@@ -234,6 +235,15 @@ export const de: Messages = {
"settings.reasoningHidden": "Aus",
"settings.reasoningHint": "Die Überlegungen des Modells (sofern Modell und Provider sie liefern).",
"settings.reasoningLive": "Beim Denken offen, danach einklappen",
"chat.jumpLatest": "Zur neuesten Nachricht",
"sidebar.search": "Chats durchsuchen…",
"sidebar.searchResults": "Treffer ({n})",
"sidebar.noResults": "Nichts gefunden",
"chat.fork": "Forken: in einer Kopie dieses Chats weitermachen",
"chat.forked": "Geforkt – du bist jetzt in der Kopie",
"chat.export": "Exportieren",
"chat.exportMd": "Markdown (.md)",
"chat.exportJson": "JSON (.json)",
"chat.empty": "Schreib eine Nachricht, um zu starten.",
"chat.compacted": "Unterhaltung komprimiert – Zusammenfassung",
"chat.context": "Kontext",
@@ -244,7 +254,7 @@ export const de: Messages = {
"chat.delete": "Session löschen",
"chat.deleteConfirm": "Diese Session inklusive Subagenten löschen? Die Statistik bleibt erhalten.",
"composer.placeholder": "Nachricht… (/ für Befehle, Dateien anhängen oder einfügen)",
"composer.placeholder": "Nachricht… (/ für Befehle, @ für Dateien, Dateien anhängen oder einfügen)",
"composer.placeholderBusy": "Nachricht wird eingereiht und beim nächsten Schritt gesendet…",
"composer.send": "Senden",
"composer.queue": "Einreihen",
+11 -1
View File
@@ -122,6 +122,7 @@ export const en = {
"git.commit": "Commit",
"git.noCommits": "No commits yet.",
"git.noDiff": "No differences.",
"composer.folder": "folder",
"composer.attachedFiles": "Attached files (in the project, read them with your tools):",
"composer.uploading": "Uploading {n}…",
"usage.title": "Models and usage in this session",
@@ -233,6 +234,15 @@ export const en = {
"settings.reasoningHidden": "Off",
"settings.reasoningHint": "Thinking of the model (if the model and provider return it).",
"settings.reasoningLive": "Open while thinking, then collapse",
"chat.jumpLatest": "Jump to the latest message",
"sidebar.search": "Search chats…",
"sidebar.searchResults": "Results ({n})",
"sidebar.noResults": "Nothing found",
"chat.fork": "Fork: continue in a copy of this chat",
"chat.forked": "Forked – you are now in the copy",
"chat.export": "Export",
"chat.exportMd": "Markdown (.md)",
"chat.exportJson": "JSON (.json)",
"chat.empty": "Send a message to start.",
"chat.compacted": "Conversation compacted – summary",
"chat.context": "Context",
@@ -243,7 +253,7 @@ export const en = {
"chat.delete": "Delete session",
"chat.deleteConfirm": "Delete this session including its subagents? Statistics are kept.",
"composer.placeholder": "Message… (/ for commands, attach or paste files)",
"composer.placeholder": "Message… (/ for commands, @ for files, attach or paste files)",
"composer.placeholderBusy": "Message is queued and sent at the next step…",
"composer.send": "Send",
"composer.queue": "Queue",