mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-09-24 15:49:09 +00:00
b92084c477d478f726b59c77d9f3176cb671e5a1
3 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
1f0ddd2bdb |
perf(notes): drive tree width resize from the DOM
Pointermove used to setTreeWidth every pixel and re-render NotesManager including MDXEditor. Apply live width via rAF + aside.style, commit React state and storage only on pointerup. |
||
|
|
f9803f3642 |
fix(notes): domain paste policy + Codex review follow-ups (#2869)
* fix(notes): domain paste policy + Codex review follow-ups Move clipboard paste resolution to domain/notes (pure, no React) and address post-#2868 review items: structured text/plain wins over wrapper HTML, caret-safe insert for long pastes (no EOF append), https/protocol-relative image src, entity decode, quote-aware img attrs, code-region protection, nested HTML islands, hard-break preservation, height-only image CSS, and complete small-icon widths. * fix: address Codex review on PR #2869 * perf(notes): cut hover re-renders and heavy image :has() CSS Reduce perceived lag in large notes by (1) coalescing link-hover setState with equality checks and rAF, (2) replacing the combinatorial :has(img[width]) matrix with data-note-img-size markers plus lazy images, and (3) merging DOM decoration into one observer that debounces in edit mode so Lexical keystrokes do not re-walk anchors every frame. * perf(notes): render preview with Streamdown instead of MDXEditor Vault note preview no longer mounts Lexical/MDXEditor/CodeMirror for read-only viewing. Preview uses static Streamdown (same stack as chat) with HTML islands for centered heroes and sized images; edit mode keeps MDXEditor. This cuts large-note scroll and mode-switch cost while preserving host-link click handling and compact badge image layout. * fix(notes): render markdown inside center HTML for Streamdown preview Streamdown/remark does not parse Markdown nested in HTML blocks, so README-style <div align="center"> heroes showed raw # ** and badge syntax. Preprocess preview markdown: expand centered islands via marked GFM to HTML, and rewrite relative images so Streamdown no longer shows "Image blocked" chips under app CSP. * fix(notes): GitHub-style preview with react-markdown Replace Streamdown note preview (chat-oriented Image blocked chrome and poor README layout) with react-markdown + remark-gfm + rehype-raw/sanitize and github-markdown-css. Center HTML islands still expand via marked so pasted heroes render; relative images and empty links are dropped quietly instead of alt-as-title or blocked chips. * fix(notes): keep relative images; map Vite public/ to site root Stop dropping non-https note images. Preserve absolute and relative src as-is, except rewrite repo public/ assets to site-root paths (public/icon.png → /icon.png) so Vite/Electron serve them without /public/* warnings. Unwrap oversized center blocks so Features-style body stays left-aligned in preview like edit mode. * fix(notes): left-align preview body; center only README hero Force markdown-body text-align left and direct block headings/lists left. After the first hero thematic break, strip align=center / text-align:center so Catty/Features sections no longer inherit full-width centering. Tighten oversized-center heuristics (Catty Agent, lists, blockquotes) without treating the Netcatty logo title as a body section. * fix(notes): force preview body left-align (nuclear CSS + unwrap) Catty/Features still rendered centered because small align=center shells and inheritance beat partial CSS. Force every node left via * selector, re-enable center only under [align=center], unwrap all center shells after the hero --- band, and set inline textAlign left on the preview root. * fix(notes): stop /public asset requests; fix preview center inheritance Root cause of body still centering: CSS re-applied text-align:center to all descendants of [align=center], so one large shell centered Catty/lists. Keep * left; only the shell itself may center (inline badges). Root cause of Vite /public/* warnings: stored notes still had /public/... paths and MDX loaded them raw. normalizeNotePublicAssetPaths rewrites /public/ and public/ to site-root paths for both edit and preview display. * revert(notes): restore MDXEditor for preview (drop GitHub markdown path) GitHub-style react-markdown preview caused layout and asset-path issues that diverged from edit mode. Preview again uses MDXEditor with readOnly + mode key remount, matching the pre-Streamdown/GitHub path. Keep display-time public/ → / rewrite so Vite does not request /public/*. * perf(notes): reuse MDX editor when switching notes Remove key={noteId} remount that tore down Lexical/CodeMirror on every note change. Pass noteId and call setMarkdown on switch instead, after the existing draft flush, so selection stays snappy and only document content is replaced. * perf(notes): defer setMarkdown on switch so selection paints first Yield a double rAF before Lexical import on note change, show a blocking overlay for large notes, and ignore external sync while a swap is in flight. Hardens flaky Suspense loading assertions in SSR tests. * fix(notes): align task-list checkboxes and make them clickable in preview Center GFM checkboxes on the first text line, give them a solid hit target, and toggle markdown from preview clicks since Lexical readOnly blocks CheckListPlugin. Pure toggle helper lives in domain/notes/taskList. * fix(notes): close multi-agent review findings on switch/paste/tasks Gate stale onChange during deferred note-switch import, keep draft refs in display-markdown space, baseline paste settle on live getMarkdown to avoid false success after muted setMarkdown, mask code regions in task toggles, and drop abandoned GitHub/Streamdown preview module and deps. * fix(notes): address remaining Codex review findings Clear Lexical undo history on note switch, always inert-block during deferred setMarkdown, re-annotate host links and image sizes on attribute mutations, harden entity/code-region paste paths, and angle-bracket image destinations that contain spaces. * fix(notes): tighten Codex follow-ups on src, code masks, tasks Prefer real img src over data-src, normalize public/ paths only outside code, mask indented/blockquote fences, and accept 1) ordered task markers. * fix(notes): keep swap payloads fresh; keep nested list tasks Refresh deferred setMarkdown when the same note's value changes mid-yield, and stop treating nested list lines as indented code so task toggles stay aligned with the preview DOM. * test(notes): update swap guard source assertions * fix(notes): collision-free code masks, real href, cancel hover rAF Use a document-unique mask sentinel, match anchor href with attribute boundaries (not data-href), and cancel the pending link-hover frame on mouse leave so chips cannot reappear after exit. * fix(notes): accept longer closing fences in code masks CommonMark allows closing fences with more backticks/tildes than the opener; line-scan masking now matches length >= open so public/ paths and task samples inside those blocks stay protected. * fix(notes): harden CommonMark fence, span, and indented-code masks Use homogeneous fence openers, multi-backtick inline spans, and list-context aware indented-code detection so samples stay masked without breaking nested task indexing. * fix(notes): task spacing, angled image dests, deep blockquote fences Require whitespace after task brackets, parse <angled> image destinations with spaces, and mask fenced code at any blockquote depth. * fix(notes): raw-text HTML elements and HTML comment task masks Locate script/style closers without nested-tag walks so raw bodies with '<' are removed, and mask HTML comments before task indexing so preview toggles hit visible checkboxes only. * perf(notes): drop fade animation on note switch and editor load Use an instant solid cover instead of opacity/transform fade-in so Lexical swaps do not pay extra composite cost that can feel more janky than a hard cut. --------- Co-authored-by: netcatty-bot <308658023+netcatty-bot@users.noreply.github.com> |
||
|
|
3490b0673d |
fix: StrictMode 双发清理 + 笔记页卡顿优化 (#2810)
* Cursor: Apply local changes for cloud agent * fix(terminal): stop first SSH fail under StrictMode remount Defer backend boot past the double-invoke, cancel superseded vault init, gate start on vault hydration, and harden hotkey/attach cleanup so the first connect no longer races a stale close or empty keychain. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * perf: finish StrictMode mega-subscriber plan (accent isolation + docs) Stabilize published terminal themes across custom-accent drag, apply accent at chrome/log leaves and CSS injection only, land Phase 0 design/plan docs, and lock Host-bag / Bugbot-clean contracts for the isolation checklist. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * docs: add StrictMode mega-subscriber design and plan artifacts Force-add Phase 0 spec/plan under docs/superpowers (gitignored locally) so the delivery branch carries the approved design and plan copy. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: clear remaining StrictMode doubles and notes editor jank Gate every AI send and reject concurrent runTurn, latch tray connect flush and settings persistMounted remounts, and stop notes content drafts from rebuilding MDXEditor/shell on each keystroke. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * perf: gate hidden notes panel subscribe and skip host-link annotate on keystrokes Hidden terminal notes mounts keep a live snapshot read but stop listening to publishes. Host-link DOM annotation follows hosts/mode (preview MutationObserver) instead of every markdown value change. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: latch SSH transport idle TTL notify under StrictMode Avoid duplicate main-process notifySettingsChanged on effect double-invoke when the idle TTL value has not changed. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * perf: freeze inactive vault notes against hosts churn and prefetch MDXEditor Gate the retained VaultNotesSection notesStore subscription while hidden, ignore hosts identity in its memo compare when inactive, and warm the lazy InlineMarkdownEditor chunk when notes become active. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: clear remaining AI StrictMode double-fire hazards Latch Ask-AI terminal selection on requestId before draft mutation, hoist Codex App Server IPC bridge to App (ref-counted), and make Catty requestApproval join an existing waiter for the same toolCallId. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: remount-safe AI send latch and skip stale MCP approval IPC Replace the component sendInFlightRef with a module key latch so StrictMode panel remount cannot reopen a mid-flight send, and no-op resolveApproval when the pending entry is already drained. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * test: allow gated useNotesStore in VaultNotesSection memo contract The retained notes section now passes enabled:isActive so hidden mounts do not subscribe; update the VaultView memo source assertion accordingly. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: keep note drafts across mode toggle and external note publishes Flush ref-only content before edit/preview remount, and skip prop→editor setMarkdown while a local draft diverges from the last synced value. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * chore: strip StrictMode sermon comments after Bugbot/Comment Sicko pass Keep effect-order and public-export contracts; drop remount/perf narration that the latches and tests already encode. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * fix: remount-safe Ask-AI terminal selection latch Move consumed requestIds to a module Set so StrictMode remount cannot append the same selection chip twice before parent state clears. Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> * chore: drop remount latch comment Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com> |