aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/assistant/Md.js
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-16 14:16:24 +0200
committerDanilo M. <danix@danix.xyz>2026-10-16 14:16:24 +0200
commitf99a9329caccdd14d9c530777a5e5b622d34f602 (patch)
treefb8351c3485b534cfa2337801f1eea2d973b8f6a /desktop/assistant/Md.js
parent729e89b4dce7e6f89a8a20cb919ad1b05d825d09 (diff)
downloadquickshell-f99a9329caccdd14d9c530777a5e5b622d34f602.tar.gz
quickshell-f99a9329caccdd14d9c530777a5e5b622d34f602.zip
fix(assistant): keep focus in the card, scope errors, guard links
From review of the canvas. Escape stopped working in three ways, each leaving the keyboard grabbed with nothing to receive it: the history field hiding took focus with it, a disabled input could not hold focus while the daemon was down, and a click in a streaming reply focused text the next flush destroyed. The card now gives focus back to the input whenever it falls out, and the input is read-only rather than disabled. Only an error the daemon marks as ending the reply (turn) closes the live row; a command error, possibly another client's, used to freeze the reply mid-stream. The running tool comes from state events, hello included. Scrolling up during a stream no longer snaps back, since following stops when a movement starts. History snippets go through Notify.sanitize like any model output, links open only for http, https and mailto, and a line opening with inline triple-backtick code is no longer taken as a fence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/assistant/Md.js')
-rw-r--r--desktop/assistant/Md.js8
1 files changed, 5 insertions, 3 deletions
diff --git a/desktop/assistant/Md.js b/desktop/assistant/Md.js
index fe61522..dd58ede 100644
--- a/desktop/assistant/Md.js
+++ b/desktop/assistant/Md.js
@@ -39,10 +39,12 @@ function split(text) {
}
continue;
}
- const open = /^(\s*)(`{3,}|~{3,})\s*([^`\s]*)/.exec(line);
- if (open) {
+ // A backtick fence's info string has no backtick (CommonMark), so
+ // a line opening with inline ```code``` stays prose.
+ const open = /^(\s*)(`{3,}|~{3,})(.*)$/.exec(line);
+ if (open && !(open[2][0] === "`" && open[3].includes("`"))) {
flush();
- code = { indent: open[1], fence: open[2], lang: open[3], lines: [] };
+ code = { indent: open[1], fence: open[2], lang: open[3].trim().split(/\s+/)[0], lines: [] };
} else {
prose.push(line);
}