| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
style: format mcp-search layout.json fixture with biome CI TypeScript (quality) failed on 'File content differs from formatting output' for this fixture; run biome format to match repo style. | 18 天前 | |
test(pdf): add opt-in arXiv PDF layout smoke test Runs real PDFs through render + PP-DocLayoutV3 + merge without a browser when AGENTERO_LAYOUT_PDF_DIR and AGENTERO_LAYOUT_MODEL are set; AGENTERO_LAYOUT_PDFS picks the papers. Writes per-page overlays and detection JSON for before/after regression comparison. | 1 个月前 | |
fix(import): default translator base to translation-server.agentero.app The previous hosted instance (translator.philfan.cn) returns 502 on all endpoints, breaking out-of-the-box magic-wand import. Switch the default in every layer (core const, host settings, frontend defaults, TranslatorApi fallback, probe script) and sync backend docs. Verified with test/scripts/probe-translator.mjs (dns/search/search-doi/ web/import/export all pass) and cargo test -p agentero local_sim (4 passed on the success path). | 1 个月前 | |
feat(telemetry): forward sanitized activity events to PostHog for DAU Project the 12 allowlisted local activity kinds into anonymized PostHog events via Telemetry::capture_activity, reusing the existing facet/status/ qty projection so paths, vault, search queries, and skill names never leave the device. This lets DAU be computed from real usage instead of only launch. Drop the usageTrackingEnabled switch: local usage.sqlite recording is now always on; telemetryEnabled alone gates the PostHog leg (next-launch). | 2 个月前 | |
fix(agent): stop Streamdown harden from blocking vault-relative citation hrefs rehype-harden only treats /, ./, ../ as relative URLs, so bare papers/… links were replaced with a Blocked indicator. Prefix ./ for rendering and strip it again in cleanCitationHref before openCitation jumps. | 1 个月前 | |
feat(agent): add silent install and uninstall for Qoder CLI Settings can install Qoder from the official script, with npm as the fallback, and update through qodercli update. Uninstall removes that script payload and the npm package, and keeps ~/.qoder sessions and shell rc PATH lines. Fix #726 | 17 天前 | |
fix(agent): keep opencode 2.0.22 custom model catalog Fix #638 opencode 2.0.22 returns a partial model catalog on session/new and pushes the complete one via config_option_update ~40ms later (2.0.3 returned it all at once). The warm result and the pooled slot snapshot recorded the initial partial list, then overwrote the richer push, so the picker lost providers. - Backend: the warm-idle connection now folds config_option_update into the catalog the warm result reads (store_richer_models), and setup writes back through the same richer-wins rule. - Frontend: applyModelsEvent keeps the richest catalog seen for an agent in this panel session (mergeModelChoices), so a stale warm result or pooled slot cannot shrink the picker. The record is in-memory only, so a catalog that legitimately removes models on a fresh start still wins. Verified against opencode 2.0.3 / 2.0.18 / 2.0.22 over ACP. | 21 天前 | |
fix(agent): open PDF citations whose paths contain spaces Decode percent-encoded vault hrefs before lookup, keep CommonMark angle-bracket destinations as relative links, and open bare PDF paths through the citation jump. Fix #665 | 26 天前 | |
feat(pdf): add saved text notes to the sidebar composer Saved highlight comments use the same add-to-chat control as visual marks. Adding one again refreshes its inline block instead of inserting another. Refs #765 | 12 天前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
feat(agent): insert annotation blocks at the caret and edit them on hover Selection and visual references sit inline after the caret. Hover opens the quote or crop, and Backspace or Delete removes the block as one unit. Refs #761 | 12 天前 | |
feat(agent): allow renaming conversation history titles Add a context-menu rename dialog on history rows, persist the title as a local override, and keep ACP list/session_info updates from overwriting it. Fix #710. | 18 天前 | |
feat(agent): offer one-click Node.js install when npm is missing Agent install/update runs npm-based chains. When npm is absent from the app PATH (Windows "'npm' is not recognized...", Unix "command not found", or the Host uninstall pre-check), the failure was a raw Toast with no way out. - Run the Node.js/npm installer through the shared Agent lifecycle progress + cancel channel (taskId, agent-lifecycle:progress, agent_lifecycle_cancel); kill_on_drop aborts the package manager. - Wrap it in a background task row (kind: nodeInstall) so a multi-minute winget/brew download no longer blocks the caller. - Attach an "Install Node.js" action to the npm-missing Toast. - Show the Doctor install button when node OR npm is unavailable, not just node. - Resolve npm/node from C:\\Program Files\\nodejs on Windows so a fresh install works without an app restart. | 25 天前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
fix(agent): open PDF citations whose paths contain spaces Decode percent-encoded vault hrefs before lookup, keep CommonMark angle-bracket destinations as relative links, and open bare PDF paths through the citation jump. Fix #665 | 26 天前 | |
fix(agent): stop remend from truncating math < in settled messages (Fix #584) Streamdown 默认 mode="streaming",每次渲染都对源文本跑 remend——它把公式 x_{<n} 里的 <n}, … 当作未闭合 HTML 标签整段截掉,KaTeX 收到 …x_{ 后报 Expected '}', got 'EOF',行内代码同理。该修复本只该服务流式生成。 MessageResponse 现按 isAnimating 派生 mode:流式中保持 streaming(remend 照跑,内容还会增长),消息落定后 static 跳过 remend,TeX 源完整进入 KaTeX;流式结束 isAnimating 翻 false 时自动恢复完整公式。 Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
fix(agent): guide Node.js install for npm-based Agent actions Bundled JS ACP adapters, npm ACP adapters, and npm-only host CLIs (Dsh, MiniMax Code, MiMo Code, and OpenCode on Windows) cannot install or update without Node.js/npm. Settings -> Agent now shows a compact notice when the host probe reports either missing, with one-click Node install and a jump to environment diagnostics; a successful install broadcasts an event so already-mounted panes re-probe and rescan the catalog instead of keeping a stale "no ACP" state. Lifecycle install/update actions that need Node are intercepted and guide the user to install it instead of starting a background task bound to fail. Uninstall, native-installer Agents, and unknown host states keep their previous behavior. Fix #786 | 4 天前 | |
| 10 天前 | ||
feat(agent): move reasoning effort picker into model selector header - Pin a "current selection" header in the selector dialog: model name and effort dropdown share one baseline-aligned row; clicking the model name clears the search and scrolls to the model in the full catalog with a brief highlight, skipping the favorites copy. - Show ACP effort tier names verbatim; persist explicit picks per agent and fall back to the highest recognized tier on send otherwise. - Drop the standalone effort dropdown from the session config bar; focus the search on open and keep the dialog open after picking a model. | 1 个月前 | |
refactor(agent): split send pipeline into phases and drop dead state mirrors - Remove the zero-reader submitting field from the agent session store and the write-only messageQueueRef mirror; route every submitting-flag write through one setSubmittingFlag so ref + render state stay in lockstep by construction. - Split the 379-line send() into named turn phases (agent/model resolution, resume target, prompt assembly, run, artifact binding, turn publication, deferred-event replay). - Shrink UseAgentSendOptions from 40 flat fields to grouped options (composer, turn config, session runtime) and read store-derived values via in-hook selectors; export isActiveTabRunning for shared use. - Move previousVaultPathRef from the shared ref bus into the panel (20 → 19 shared refs). | 1 个月前 | |
fix(agent): strip $ from ACP slash command names Agents may advertise available_commands as $name or /$name; Composer always prefixes /, which produced /$foo in the menu. Normalize by stripping leading / and $ before display and insertion. Fix #222. | 2 个月前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
feat(agent): pool warm ACP connections and surface turn loading phases Every chat turn cold-spawned the agent process (initialize + session/new measured 1-10s) while the Chat-open warm-up discarded its connection right after prefetching models/usage. Keep that connection resident: warm_agent publishes the live connection to AgentWarmPool, run_once takes a matching slot (same agent/cwd/remote host), skips setup, reuses it for the turn and releases it back for the next one. Idle slots are recycled after 10 minutes; never-used sessions are deleted on teardown; pooled resume without resume/load capability hands off to the cold path. Add an agent:status event (starting / waiting-model / reconnecting with the codex "n/5" attempt detail) so the UI can show what a turn is doing before the first token: dedicated orb states (shaping / breathing / searching) and labels on desktop, phase labels over the mobile bridge, and the transcript now renders the placeholder row for empty parts so sending is no longer a blank gap. Closes #536 Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
fix(pdf): Agent 翻译时按文献复用 ACP 会话 (#283) - 新增 per-paper Agent 翻译会话缓存,按 (paperKey, agentId, modelId) 索引。 - 划词翻译与全文布局翻译均读取缓存中的 providerSessionId 作为 runOnce 的 sessionId。 - 成功时回写 providerSessionId,失败时剔除缓存,取消时不保留。 - 更新 translate.md 文档并补充单元测试。 | 2 个月前 | |
feat(sidebar): group vault agent files into one Agent row AGENTS.md and installed skills were split across a dotfolder and a root file. The sidebar now shows them together, with each skill labeled by its frontmatter name. Co-authored-by: Cursor <cursoragent@cursor.com> | 1 天前 | |
feat(agent): turn vault wikilinks into citation pills without wrapping parens Parse [[papers/…/NOTES]] in agent replies into markdown links for AgentCitationLink, and update AGENTS/envelope/paper-reader so citations use [label](path) or [[path]] without outer ([…]) wrappers or ## Sources / [blocked] tags. | 1 个月前 | |
feat(agent): align annotation hover cards with note embeds Edit a text note in the card, show PDF quotes with their highlight color and translation, and open a visual crop larger. Keep the card inside the window. Refs #766 | 12 天前 | |
| 10 天前 | ||
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
fix(paper): report one merged progress for concurrent asset downloads PDF and TeX source download concurrently under a single task id, but the frontend still weighted them as sequential phases (PDF 0-50%, TeX 50-100%). Whichever stream finished first mapped to 100%, and the Math.max latch in updateBackgroundTask held the bar there while the other stream kept fetching -- so the row read "100%" above a detail line that was still counting up. Move the aggregation to the Host, the only side that knows how many streams actually run: AssetProgressAggregator merges their byte counters into one job:progress event, with the slot count fixed up front as the denominator. The frontend now only clamps. A stream still running with no Content-Length keeps the merged total unknown instead of letting the other one read 100%, and each PDF candidate URL restarts its own byte count. This also fixes the mirror case: a PDF-only import has no TeX stream, so it could never pass 50% until the job terminated. | 1 个月前 | |
fix(bibtex): search Scholar with unquoted title terms Quoted phrases drop results when the indexed title differs by punctuation or subtitle; unquoted terms are still ANDed, so the paper stays findable while matching more candidates. | 5 天前 | |
feat(ios): preview cached PDFs from paired desktop | 2 个月前 | |
feat(plaza): estimate unannounced CCF deadlines from past editions Merge initial.json with its content-hashed archive history and, for CCF A/B/C venues with no future official deadline, project the next cycle one year forward keeping the weekday. Bounded to recent cycles (18mo) and the coming year (12mo); estimated rows are flagged and marked in the panel. | 17 天前 | |
feat(shell): open an in-process command registry The palette needs a place to append later plugin commands without new i18n keys or edits to the built-in list. Co-authored-by: Cursor <cursoragent@cursor.com> | 4 天前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
fix(agent): keep context requests outside the annotation cycle The sidebar request receives selection numbers from the caller. Importing the annotation planner pulled a cycle through the agent API and failed dependency-cruiser. | 10 天前 | |
refactor(frontend): share debounce utils and agent-run attach helper | 2 个月前 | |
feat(decision): add generic decision layer with rule and jEV providers Introduce a Tauri-free decision engine in agentero-core that routes a decision (rules -> jEV -> fallback) and returns a typed outcome with provider provenance and confidence. - agentero-core::decision: DecisionProvider/DecisionRule/ProviderConfig, DecisionRegistry, DecisionEngine routing + fallback, RuleProvider and JevProvider (the single jEV HTTP transport, credentials read lazily). - Host: features/decision assembly, schemas pdf.selection.intent and paper.auto-tag, and the decide command. - Frontend: useDecision hook for semantic decisions and a synchronous local registry (decideSync) for pure-rule cases; file-tree.click now routes through it and PDF selections gain a smart-action button. - Migrate the jEV smart-highlight stream onto JevProvider, removing its private client/credential handling. - Docs: add docs/backend/decision.md and mark the draft implemented. | 24 天前 | |
fix(ipc): restore shared MCP and plugin event contract coverage | 3 天前 | |
fix(workspace): suppress selection during panel drag | 1 个月前 | |
fix(workspace): clear Dockview overlays through their lifecycle owners | 4 天前 | |
perf(editor): stop re-running the container query on every resize frame Measured on WebKit 27.2 with a 441-block document (median frame time): no resize 17.0ms resize, nothing pinned 42.0ms (127.0ms once math is present) resize, editor width pinned 39.0ms resize, query container pinned 17.0ms So ~24 of the 25ms was the @container/editor query container re-running style for its subtree on every frame, not the document re-wrapping (~3ms). content-visibility: auto is the Chromium answer and stays gated off on WebKit (WebKit #276735, still open); it also measured no better than the baseline here (42.0 vs 42.0ms). @container/editor moves one level down, onto a wrapper whose width the gesture can pin, so the query does not re-run and the editor inside keeps its width. The pane still follows the pointer and .agentero-dock-sash-active clips the overflow via contain: paint; everything re-lays out once on release. The gesture itself is now one shared signal (resize-gesture.ts): the sash hook reports divider drags, and a ResizeObserver on the workspace root plus a 140ms quiet window covers the gestures that never produce a sash event — shell rail drags (react-resizable-panels) and native window resizes. All previous gates armed only on isDockviewSashTarget(.dv-sash), so those two were never covered at all. | 9 天前 | |
refactor(settings): split doctor-pane into per-check sections Move each diagnostic check (vault/catalog, wikilinks, aliases, visual marks) into its own component owning its draft state, extract the shared presentational rows and the pure text-measurement helpers, and leave the pane as report fetching plus section ordering. Cover the extracted line-fit helpers with unit tests. | 2 个月前 | |
feat(editor): add the current note block to the agent composer The block handle menu serializes the hovered block, or the current multi-block selection, and pins it the same way as Add to chat. Fix #761 | 13 天前 | |
fix(test): 修正 editor 重构后失效的模块路径 之前把 editor/plugins 下的纯逻辑下沉到 src/lib、并把组件按 nodes/overlays/embeds 分层时,只改了 src/ 内的引用,漏了 test/。12 个测试文件因此静默失败(26 个用例)。 - 8 条 plugins/* 路径改指 @/lib/markdown/* 与 @/lib/wiki/* - heading-node、wiki-attachment-embed 改指新的分层路径 - wiki-completion 与 editor-callout 原先从 wikilink-plugin 的桶导出取模型函数, 该桶已移除,改为直接从 @/lib/wiki/wikilink-model 导入 - editor-toc 与 editor-code-block-scroll 用 readFileSync 硬编码了源文件路径,一并更新 681 个用例全部通过。 | 2 个月前 | |
fix(test): 修正 editor 重构后失效的模块路径 之前把 editor/plugins 下的纯逻辑下沉到 src/lib、并把组件按 nodes/overlays/embeds 分层时,只改了 src/ 内的引用,漏了 test/。12 个测试文件因此静默失败(26 个用例)。 - 8 条 plugins/* 路径改指 @/lib/markdown/* 与 @/lib/wiki/* - heading-node、wiki-attachment-embed 改指新的分层路径 - wiki-completion 与 editor-callout 原先从 wikilink-plugin 的桶导出取模型函数, 该桶已移除,改为直接从 @/lib/wiki/wikilink-model 导入 - editor-toc 与 editor-code-block-scroll 用 readFileSync 硬编码了源文件路径,一并更新 681 个用例全部通过。 | 2 个月前 | |
fix(editor): convert image group to columns and guard dnd against stale element | 1 个月前 | |
refactor(markdown): remove Format Markdown context-menu action The Prettier whole-document formatter was an explicit right-click action that also collapsed consecutive blank lines; drop the entry and dependency. | 1 个月前 | |
fix(editor): copy selections with formulas as Markdown The default Slate clipboard path builds text/plain from the rendered DOM. Equation nodes are void and keep their TeX in texExpression, so copying a text selection that includes math pasted KaTeX glyph soup and lost the LaTeX source — text and formulas could not be copied together. When the selection touches an equation, serialize it as Markdown instead ($…$ / $$…$$); a caret inside a formula copies that formula's source. Selections without math keep the plain-text copy. Also add a "Copy as Markdown" context-menu action for any selection or block selection, and cover the clipboard helpers with tests. | 4 天前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
fix(tests): use nullish fallbacks instead of non-null assertions Replace non-null assertions on values that may be undefined with optional chaining and nullish defaults to avoid runtime errors. | 2 个月前 | |
fix(editor): break out below horizontal rule on Enter Void blocks swallow Enter: the caret insertBreak was a no-op and the block-selection shadow input only re-focused the hr. Insert a paragraph below the hr for both caret and block-selected Enter, clearing the block selection, and shrink the hr strip from py-6 to py-2 so its selection tint no longer renders as a tall empty box. Fix #397 | 1 个月前 | |
feat(editor): wire in-group drag for image groups - ImageGroupItem dnd (horizontal): reorder within a group, move across groups, or drop a top-level image mid-group; non-image drags bubble to the group shell, and the drop return value stops double moves - normalize-created groups carry an explicit nanoid id: wrap_node skips NodeIdPlugin, and group drag/dropline/block-selection need element.id - imageish hover yields to nested item targets via shallow isOver - items degrade to plain layout on read-only surfaces (export/embed) Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
perf(editor): speed up Markdown open, render and reading Follow-up to the offscreen-block fix (#702). Batches the remaining Markdown loading/rendering/UX optimizations: - Trim remark plugins per document on deserialize: remarkMdx / remarkMath / remarkEmoji / wiki-link / callout / columns / mentions are only mounted when their trigger syntax appears, so plain notes skip JSX tokenizing and whole-text shortcode scans. Serialization keeps the full pipeline. - Add a session cache for Markdown/NOTES seed reads (open path only, so the save-conflict guard still reads raw), invalidated by the Vault watcher and primed after writes. - Read local images lazily via IntersectionObserver and share blob sources across instances (refcount + bounded LRU + revoke); export stays eager. - Lazy-render Mermaid previews and KaTeX equations until near the viewport, drop backdrop-blur from code-block chrome, and set decoding=async. - Raise the editor keep-alive LRU to 4 and remember per-file scroll position across eviction. - Query status-bar backlinks in requestIdleCallback. New units: use-in-view, image-source-cache, remark-plugins, deserialize-md, scroll-memory, seed-cache, with tests for plugin trimming and the image cache. | 21 天前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
fix(editor): preserve HTML attributes in fenced code (#423) * fix(editor): preserve HTML attributes in fenced code * style(test): format fenced HTML fixture | 1 个月前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
perf(editor): skip offscreen Markdown blocks while reading Long notes reflowed and repainted the whole document on every pane resize and scroll, making reading and side-rail drags janky (#702). While the live editor is unfocused, apply content-visibility: auto to top-level block wrappers so Chromium skips layout and paint for offscreen blocks; contain-intrinsic-size: auto caches each block's real height after first render. Focus disables it, so editing, caret and IME keep their uncontained semantics. Gated to non-WebKit engines (WebView2 etc.) since per-element content-visibility is slower on WebKit. Fix #702 | 21 天前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
perf(markdown,pdf): trim Markdown parse scans and defer open-time work Markdown loading/parsing: - Pass withoutMdx and skip Plate's htmlToJsx whole-source scan when the document has no < tag (the same case where remarkMdx is already dropped). - Run the extra-blank-line / unclosed-$$ / stray-< preprocessing passes only when their trigger syntax is present; plain notes return unchanged. - Seed image URL ref-counts (asset-GC baseline) on idle instead of a synchronous whole-tree walk at open; the GC diff skips until seeded. - Lazy-render ![[...]] embed bodies (they deserialize another document) only when near the viewport; export still renders every embed. PDF loading: - Reconcile PAPER.md/references (ParseBody/ParseRefs jobs) on idle instead of during the open critical path. Wiki completion search was already debounced at 200ms, so it is unchanged. Refs #702 | 21 天前 | |
refactor(editor): 内联 editorCompletionHasFocus lib/markdown/completion-focus.ts 只有 8 行、零 import,函数体是单个 container.contains(activeElement) 判空。它既不是 markdown 领域逻辑(纯 DOM 焦点 判断),放在 lib/markdown/ 属误分类,又只有一个生产调用方。 内联进 use-completion-drafts 的 probeCursor 并保留意图注释,删掉该文件。对应的 3 条测试断言实际测的是 Node.contains 语义而非本项目逻辑,一并删除。 | 2 个月前 | |
fix(deps): stop the TOC observer rebuild on every scroll event @platejs/toc bumped a status state from its scroll listener and had it in the heading observer's effect deps, so every scroll event disconnected and rebuilt the observer and re-ran NodeApi.get + toDOMNode + observe for every heading. On macOS a scrollbar thumb drag is driven on the main thread, so that cost landed directly on the thumb. Patched in-repo: the observer is long lived and a scroll only re-attaches headings whose DOM node was actually remounted, coalesced to one rAF. The per-scroll React state update is gone. Not excluded from Vite dep optimization: @platejs/toc imports the CommonJS-only react-compiler-runtime by name, and only the prebundle step performs the CJS interop that resolves it. | 9 天前 | |
perf(editor): scan only the edited block for TOC headings queryTocHeadings walked the whole document — every element and every text leaf — and its only cache key was editor.children identity, which changes on every edit. Long notes are exactly the ones that mount the sidebar (it gates on heading count), so they paid a full traversal per keystroke: measured 0.788ms on a 600-block / 3441-node document, down to 0.063ms once each subtree's headings are memoized on the node object. Slate reuses the nodes an edit did not touch, so a keystroke now re-scans just the block it landed in. Heading paths are also refreshed in place when the heading set is unchanged. The stability key covers id/depth/title only, so inserting a block above a heading used to leave a stale path in the cached list, and onContentClick resolves its target with NodeApi.get(editor, path). | 1 个月前 | |
refactor(editor): delegate link and clipboard handling to Plate | 4 天前 | |
perf(editor): skip full-document serialization for wikilink projection sync Every wikilink source/display swap (caret crossing a link with arrow keys) paid two whole-document Markdown serializations: one snapshot before the projection transform and one comparison in the editor's value-change handler to decide whether the batch was a user edit. Projection transforms are Markdown-invariant by construction — the serializer emits wikiLinkNodeSource(node) || wikiLinkToMarkdown(node), so expanding a source child, committing parsed attributes or reifying a draft never changes the serialized document. Track presentation-only batches with a boolean flag instead: projection sites set it, the explicit real edits that can share a batch (boundary insertText/insertBreak/delete) clear it, and the value-change handler consumes it. Serialize count per projection swap drops from 2 to 0. Behavior is unchanged: presentation-only batches still never mark the document dirty nor trigger autosave. New vitest coverage proves the Markdown-invariance the flag relies on. | 2 个月前 | |
fix(pdf-layout): use standard ONNX WASM runtime | 2 个月前 | |
fix(import): dedupe PDFs dropped with mixed path separators on Windows | 2 个月前 | |
fix(import): accept PDF drops across app surfaces (Fix #504) | 1 个月前 | |
fix(file-tree): guard naming actions during IME composition Share inline create and rename input behavior and guard the move picker against IME Enter and Escape. Cover composition timing, final blur values, and duplicate submissions with DOM regression tests. Fixes #746 | 10 天前 | |
feat(sidebar): show Zotero collection references | 23 天前 | |
feat(tree): move multi-select batch actions to the fixed sidebar header Reuse the vault sidebar PaneHeader for the transient multi-select toolbar instead of an in-tree floating bar, so the tree's height and scroll position stay stable. Clear/move/delete act on the whole group; right-click keeps an existing group or collapses to the single row. Multi-selection is normalized to top-level semantic targets so a folder plus its descendants never move/delete twice. Rows gain keyboard activation (Enter/Space) and aria-selected / aria-multiselectable. | 1 个月前 | |
fix(export): strip frontmatter from markdown export The .md export wrote the serialized document verbatim, leaking vault-internal frontmatter (aliases, tags, ...) into standalone files. The PDF/PNG render path already drops frontmatter via splitFrontmatter; reuse it so every export format outputs the body only. Fixes #551 Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
feat(agent): align annotation hover cards with note embeds Edit a text note in the card, show PDF quotes with their highlight color and translation, and open a visual crop larger. Keep the card inside the window. Refs #766 | 12 天前 | |
feat(agent): allow renaming conversation history titles Add a context-menu rename dialog on history rows, persist the title as a local override, and keep ACP list/session_info updates from overwriting it. Fix #710. | 18 天前 | |
feat(viewer): preview vault HTML files in a sandbox Serve local .html files through agentero-html so diagrams can render beside their assets without inheriting the app origin. Co-authored-by: Cursor <cursoragent@cursor.com> | 2 天前 | |
test: remove unnecessary agent-logo and IME constant tests - Delete test/agent-logo.test.ts: it only restated the identity mapping in agentLogoKeyForTemplate, adding no meaningful logic coverage. - Drop the IME_COMPOSITION_END_GRACE_MS range assertion: it tested a config constant rather than behavior. Keeps the isImeKeyboardEvent behavior tests intact. | 2 个月前 | |
test(import): share-page fixture, edge boundaries, lookupBatch dispatch Adds the distilled real-share-page sample (7 papers, 5 surface forms for the main one) as the automated accuracy case for #652, identifier edge boundaries (query tails, mixed case, spaced arXiv mention, dup DOI), and frontend dispatch coverage for the new lookupBatch mode. | 4 天前 | |
test: align metadata refresh job title with i18n copy Co-authored-by: Cursor <cursoragent@cursor.com> | 5 天前 | |
fix(pdf): surface headless layout progress Follow-up for #521 | 1 个月前 | |
perf(layout): skip layout-index write when content is unchanged writeLayoutIndex now reads the existing layout-index.json and compares content (ignoring the volatile generatedAt timestamp) before writing. A layout cache hit therefore produces zero disk writes and no watcher echo, per paper-pipeline-orchestration.md §8.2. | 2 个月前 | |
fix(shell): persist Agent rail width and main window state - Keep one global Agent rail width across layout presets and restarts; migrate legacy per-slot right widths when reading old prefs. - Fall back to the custom slot when the active preset has no left width. - Restore main-window size, position and maximized state through tauri-plugin-window-state (main window only). - Update layout tests, docs and the release checklist. Fix #782 | 7 天前 | |
feat(shell): narrow default agent rail ratio to one third The Agent layout preset opened the chat rail at half of the reading area, which reads as a co-primary pane rather than a side rail. Default to one third (PDF / Agent 2:1); users who resize keep their width via the per-layout persistence. | 1 个月前 | |
feat(library): persist resizable column widths Fixes #612 | 29 天前 | |
feat(library): support sorting by date added Fixes #620 | 29 天前 | |
feat(library): 支持把 PDF 拖到论文库入库 - 仅一个或多个 PDF 显示虚线 overlay,松手后走既有 metadata 确认框 - 文件夹作用域导入到当前 papers 夹,全库落到树选中目录 - 不抢文件树 papers/ 落点;非 PDF 不入库 Fix #309 | 2 个月前 | |
refactor(paper): schedule library batch actions and model downloads through JobCenter Phase 2b of the background-work merge: citing scans, bibliography import/export, batch metadata refresh, and layout model downloads now run as JobCenter jobs (renderer-host batch executors plus a Host runner for the global model download with fingerprint-based single flight). Single-paper downloads reuse the existing downloadAssets job and read results back via job_paper_assets_status. Removes the layout_model_ensure command and the layout-model:task event chain in favor of the unified job contract. | 1 个月前 | |
fix(lifecycle): align bridge types with wire and harden scope release - Remove the cast handoff in tauri-bridge: LifecycleEventMap now mirrors the generated specta payloads, so incompatible wire changes fail the build - Skip later handler setups in emitScoped once the scope is released mid-setup - Replace leaky listeners with toSafeDisposer and drop the dead compile:log drain (Tauri events are not replayed) - Sync lifecycle-events.md with actual consumers and registration sites | 9 天前 | |
feat(core): add public lifecycle subscription and plugins.json Plugin state stays out of AppSettings, and the five public lifecycle events can be subscribed without opening the internal bus. Co-authored-by: Cursor <cursoragent@cursor.com> | 4 天前 | |
fix(lifecycle): scope vault release per window and carry vaultId on job events - JobSnapshot.vault_id preserves the caller-supplied vault string for job terminal events so frontend vault filtering matches getVaultPath(); the canonical vault_path stays the fs/dedupe identity - VaultHolders refcounts per-window holds with canonicalized keys: the global release (cancel jobs / caps cache / evict catalog conn) only runs when the last holder lets go, and window destruction drains stale holds - Add vault_hold command; vault_release takes the injected window label (specta skips it, so bindings keep the same call shape) - Document the vaultId spelling limits across docs and contract comments | 9 天前 | |
Fix/translation links quickchat highlight (#751) * fix(translate): keep citation and ref links in layout translation Mask bracket citations, author-year cites, figure and section refs, URLs, and Markdown links before translation, then reattach the original targets to those tokens in the translated glyphs. Refs #732 * fix(translate): keep heading size aligned with source hierarchy Size section titles from the source box and grow the overlay downward when the translation is longer, instead of shrinking the glyphs to fit. Refs #732 * fix(pdf): keep quick-chat selection highlights visible Paint ask selections in the annotation yellow after the card closes, and use the translated boxes while a full-page translation is showing. Fix #732 * fix(translate): match spaced and translated author-year cites PDF text pads the parenthesis and the comma, and the translator then rewrites them to fullwidth brackets, a Chinese comma, and 等人. The old mask missed both forms, so the overlay had no clickable anchors. Refs #732 * fix(translate): size one-line headings from the raw box height A section-title strip is about one em tall. Subtracting paragraph padding collapsed those headings to the minimum size, below body text. Refs #732 * fix(translate): keep section titles slightly larger than page body Floor short heading strips to the same-page body size × 1.35 so translated section titles stay above paragraph text, while still sizing from the source layout box for hierarchy. Refs #732 * fix(pdf): keep quick-chat range highlight after card closes Empty ask drafts were discarded on dismiss and pins only tracked threads with a question, so the yellow selection vanished and only the gutter icon remained. Keep drafts and paint any ask with geometry. Fix #732 * fix(translate): match translated link ink and split adjacent cites Paint each preserved token with the original glyph fill and leave off the extra underline. A group such as [17,38] becomes one target per adjacent link, and repeated copies of the same rectangle count once. * fix(translate): keep grouped cites on their glyphs and open dual-pane links A bracket group such as [17,38] now splits only when each link center sits on that token. The dual-pane translation view scrolls to citation targets and opens URLs. * fix(translate): bind reordered citations to their source links A translated token keeps the link of the source token with the same label, so a clause written as [2] before [1] still opens each citation's own target. * fix(translate): keep the dual-pane link store out of viewer components The layout module imported a viewer text-link type, which breaks the lib-no-components dependency check. * fix(translate): keep unlinked spans and balanced URL parentheses An interval such as [0,1] was taking the next citation whenever glyph clustering could not split it. When the glyphs show no link center on that span, leave it plain. Bare and Markdown URLs keep a closing parenthesis that belongs to the address and still drop a prose one. * fix(pdf): sample mounted link glyphs and shift dual-pane jumps Full-document translation listed every page as pending, so both panes read every linked page before publishing any glyph. The source viewer now samples the scroller's mounted pages, publishes each page as it finishes, and the translation pane reuses that ink, those glyphs, and the visible-box origins. Citation jumps subtract the CropBox origin before converting into page coordinates. * fix(pdf): keep an unsent quick-chat draft when its card closes The hide button still deleted a draft with no question, so the pin and highlight vanished, while dismissing the card any other way kept them. Both paths now keep that draft until the next Ask starts. Update the #732 docs to match. * fix(translate): split bracket cites and prefetch visible link color Same-line citation rects differ by a fraction of a point, so a raw top-edge sort bound the whole bracket to one target. Queued links above or left of the token are skipped, and spaced PDF brackets stay citations. The visible page's glyph fill is read once while idle and cached, so translation can paint colored links without waiting on that read. A new link-map object does not cancel it. | 13 天前 | |
refactor(jobs)!: remove the legacy background-task execution machinery Phase 3 of the background-work merge: cancellation now flows solely through JobCenter tokens (task-id registry with RAII cleanup, plus a host-injected cancel probe so agentero-core stays Tauri-agnostic and the CLI behaves as before), byte-level progress moves from background-task:progress to the job:progress contract, and the frontend store shrinks to a pure view model keyed by JobKind with a small local-activity kind union. Deletes background_task_cancel, the core CANCELLED registry, enqueueBackgroundTask and the frontend semaphore; agent tool-install cancellation moves to the agent lifecycle domain. Docs synced. | 1 个月前 | |
perf(viewer): cache page text rects and crops for link previews Moving the pointer along a citation list re-read the same pages' text rects (link page and destination page) and re-rendered the same crops on every hover. Keep the last 8 pages' text rects (as shared promises, so concurrent hovers reuse one read and failed reads are dropped) and the last 24 rendered crops in small LRU caches, cleared when the document changes. | 20 天前 | |
fix(editor): stop silently truncating notes on MDX brace errors Notes with LaTeX braces in prose (\(...\{...\}\), \max\{a,b\}) made remarkMdx throw; @platejs/markdown then fell back to splitIncompleteMdx, which treats inline math such as $\rho<1$ as an unclosed JSX tag, cuts the source there and silently drops every following block. A 250 KB NOTES.md rendered only the first ~11%, with no error in the log. Escape braces outside code/math to entities before deserialize so MDX never sees a JS expression, and when an MDX parse still fails, re-parse the whole body without MDX instead of accepting Plate's lossy two-part recovery. Count equation texExpression in the status-bar stats too, so math-heavy notes no longer read ~40% short and a truncated one cannot hide behind a plausible number. | 7 天前 | |
feat(markdown): 导出笔记为 PDF / PNG (#267) * chore(deps): add html-to-image and jspdf for note export - Capture rendered Markdown for PNG and multi-page PDF export - Acknowledge ignored core-js build scripts in pnpm allowBuilds * feat(markdown): expand embeds in export mode - Drop max-height caps and open-source chrome while exporting - Show PDF attachment path placeholder instead of embedding the viewer * feat(markdown): export notes as PDF or PNG - Offscreen Plate render with paper header, watermark, and save dialog - Prefill watermark from settings; default expand embeds fully - Cover paper link resolution and context-menu export capability Refs: #258 * docs(frontend): document Markdown PDF/PNG export - Describe export options, embed expansion, and watermark setting * fix(markdown): restore wiki nav and ready-wait for note export Offscreen createRoot lost WikiNavContext so embeds failed to resolve. Re-provide vaultPath/mdFiles, wait on data-export-pending for async images, and ignore export setState after editor unmount. * fix(markdown): polish note export layout and watermark - Match editor content inset (px-16) while keeping edge-to-edge page fill - Remove PDF page letterbox; fill pages with note background color - Stamp per-page watermark with logo and theme muted-foreground color * chore(deps): switch note export PDF stack to pdf-lib - Add pdf-lib and fontkit for searchable text and link annotations - Remove jspdf after dropping the image-only PDF path * feat(export): load system CJK font for PDF text embedding - Add export_system_cjk_font Host command with platform font candidates - Return base64 bytes so large fonts stay JSON-safe * feat(markdown): export searchable PDF with selectable text and links - Build PDF with pdf-lib over the visual raster plus invisible text layer - Add clickable http(s)/mailto annotations from DOM geometry - Map CSS metrics through capture pixelRatio to keep page layout correct - Delete the dead jsPDF image-only assembly path from capture helpers * docs(markdown): document searchable PDF export layers - Note text layer, link annotations, and system CJK font embedding * fix(markdown): simplify note export dialog format picker - Use a compact Select (icon + PDF/PNG) next to the format label - Drop paper title from the header option hint --------- Co-authored-by: Phil-Fan <hw.phil.fan@gmail.com> | 2 个月前 | |
refactor(markdown): 删除生产未使用的 deleteRemovedManagedAssets 该函数没有任何生产调用方,只有它自己的测试在用。其 diff 循环与 createManagedAssetGc().observe 逐行同构(prevCount<=0 跳过 → next.get(url)??0 → isManagedMarkdownAssetUrl → 删除),而 observe 是实际生效的那条路径,且已有覆盖 「引用计数仍在时不删」的测试。 删函数与对应测试,行为无变化。 | 2 个月前 | |
fix(feeds): normalize MathJax macros and blockquote math for KaTeX Collect \newcommand definitions document-wide and expand them textually at use sites, sidestepping KaTeX's per-equation scope, builtin-name collisions (\argmin) and align cell boundaries. Strip \require, degrade \cancel, resolve \eqref/\ref to display numbers, and unescape older cached math that htmd markdown-escaped. Display math is re-fenced onto its own lines only when block-positioned; mid-sentence $$…$$ (e.g. inside blockquotes) stays single-line so remark-math inline math matches, and re-fenced lines keep the quote marker so math stays inside the blockquote. | 1 个月前 | |
fix(editor): stop silently truncating notes on MDX brace errors Notes with LaTeX braces in prose (\(...\{...\}\), \max\{a,b\}) made remarkMdx throw; @platejs/markdown then fell back to splitIncompleteMdx, which treats inline math such as $\rho<1$ as an unclosed JSX tag, cuts the source there and silently drops every following block. A 250 KB NOTES.md rendered only the first ~11%, with no error in the log. Escape braces outside code/math to entities before deserialize so MDX never sees a JS expression, and when an MDX parse still fails, re-parse the whole body without MDX instead of accepting Plate's lossy two-part recovery. Count equation texExpression in the status-bar stats too, so math-heavy notes no longer read ~40% short and a truncated one cannot hide behind a plausible number. | 7 天前 | |
perf(editor): stop re-running the container query on every resize frame Measured on WebKit 27.2 with a 441-block document (median frame time): no resize 17.0ms resize, nothing pinned 42.0ms (127.0ms once math is present) resize, editor width pinned 39.0ms resize, query container pinned 17.0ms So ~24 of the 25ms was the @container/editor query container re-running style for its subtree on every frame, not the document re-wrapping (~3ms). content-visibility: auto is the Chromium answer and stays gated off on WebKit (WebKit #276735, still open); it also measured no better than the baseline here (42.0 vs 42.0ms). @container/editor moves one level down, onto a wrapper whose width the gesture can pin, so the query does not re-run and the editor inside keeps its width. The pane still follows the pointer and .agentero-dock-sash-active clips the overflow via contain: paint; everything re-lays out once on release. The gesture itself is now one shared signal (resize-gesture.ts): the sash hook reports divider drags, and a ResizeObserver on the workspace root plus a 140ms quiet window covers the gestures that never produce a sash event — shell rail drags (react-resizable-panels) and native window resizes. All previous gates armed only on isDockviewSashTarget(.dv-sash), so those two were never covered at all. | 9 天前 | |
fix(editor): serialize Markdown saves per path and hold dirty state until disk confirms the write - Queue persist calls per absolute path so overlapping editor lifecycles cannot race their disk snapshot checks or writes - Advance the owning tab seed only after writeVaultFile resolves; failed or conflicted writes keep the last confirmed snapshot and dirty flag - Add settleMarkdownSaveAttempt to reconcile edits made while a successful write is in flight, queuing a follow-up save - Surface affected Vault-relative paths in unsavedEdits wiki rename/repair errors and the heading rename error Toast - Update API, wikilinks, and UI docs and cover the new save and rename-error behavior with Vitest and Rust tests | 2 个月前 | |
feat(markdown): restore note scroll position across restarts - Persist each note's scroll offset in localStorage and flush it on quit - Reopen at the saved pixel when the document is still tall enough, otherwise the same fraction of the current range Fix #802 | 4 天前 | |
fix(agent): show Markdown selection line numbers in composer UI Wire selectionChips into ComposerContextChips and render lineFrom/lineTo on SelectionSourceButton via shared agent i18n labels so Add-to-chat annotation hover proves #709 without an ACP agent. Normalize registry path keys and add unit coverage. | 18 天前 | |
fix(editor): stop silently truncating notes on MDX brace errors Notes with LaTeX braces in prose (\(...\{...\}\), \max\{a,b\}) made remarkMdx throw; @platejs/markdown then fell back to splitIncompleteMdx, which treats inline math such as $\rho<1$ as an unclosed JSX tag, cuts the source there and silently drops every following block. A 250 KB NOTES.md rendered only the first ~11%, with no error in the log. Escape braces outside code/math to entities before deserialize so MDX never sees a JS expression, and when an MDX parse still fails, re-parse the whole body without MDX instead of accepting Plate's lossy two-part recovery. Count equation texExpression in the status-bar stats too, so math-heavy notes no longer read ~40% short and a truncated one cannot hide behind a plausible number. | 7 天前 | |
fix(editor): ignore unsupported HTML tags when opening Markdown remarkMdx treated every <name> as JSX. An unclosed placeholder such as <Constraints> threw, and Plate then cut the note at the first tag-like angle bracket, including <input> inside inline code. Escape any < that is not a tag the editor actually renders, at the same deserialize choke point as #533. | 1 个月前 | |
fix(annotation): 修复批注编辑时 Ctrl+B 误触文件栏 | 26 天前 | |
fix(feeds): normalize MathJax macros and blockquote math for KaTeX Collect \newcommand definitions document-wide and expand them textually at use sites, sidestepping KaTeX's per-equation scope, builtin-name collisions (\argmin) and align cell boundaries. Strip \require, degrade \cancel, resolve \eqref/\ref to display numbers, and unescape older cached math that htmd markdown-escaped. Display math is re-fenced onto its own lines only when block-positioned; mid-sentence $$…$$ (e.g. inside blockquotes) stays single-line so remark-math inline math matches, and re-fenced lines keep the quote marker so math stays inside the blockquote. | 1 个月前 | |
feat(shell): add empty menu contribution slots File tree, library rows, and the PDF selection toolbar need a tail slot for later plugin commands without changing built-in items. Co-authored-by: Cursor <cursoragent@cursor.com> | 4 天前 | |
test(mobile): cover agent source merging, chat timeline, and offer URL parsing Add unit tests for the pure logic isolated during the mobile-app refactor: mergeAgentSources/pickAgentId, the streaming timeline updaters, and isPairOfferUrl deep-link validation. | 2 个月前 | |
test(mobile): cover agent source merging, chat timeline, and offer URL parsing Add unit tests for the pure logic isolated during the mobile-app refactor: mergeAgentSources/pickAgentId, the streaming timeline updaters, and isPairOfferUrl deep-link validation. | 2 个月前 | |
test(mobile): cover agent source merging, chat timeline, and offer URL parsing Add unit tests for the pure logic isolated during the mobile-app refactor: mergeAgentSources/pickAgentId, the streaming timeline updaters, and isPairOfferUrl deep-link validation. | 2 个月前 | |
fix(shell): stop Cmd+A from selecting UI chrome labels Swallow document-wide select-all outside inputs/editors/.select-text, and mark dock tabs, Agent empty state, and PDF chrome as select-none. | 1 个月前 | |
fix(workspace): preserve PDF and Notes split proportions | 1 个月前 | |
feat(wiki): scrollable annotation embeds with outline location Read-only annotation embeds keep the shared max-height shell so long visual agent transcripts can scroll without a composer. Prefer PDF outline breadcrumbs (page-based fallback) resolved from the in-memory bookmark cache filled when a paper opens. | 2 个月前 | |
fix: agent ask-user surface no longer blocks global shortcuts Docked ask-user forms (elicitation, Grok ask_user_question, and tool-promoted questions) were registered as modal overlays, which gated all shortcuts marked whenSettingsClosed:true—including Cmd+B/Opt+Cmd+S toggle sidebar. Keep them on the overlay stack so Esc can still dismiss them, but mark them as non-modal so global navigation shortcuts keep working while the form is open. Fix #425 | 1 个月前 | |
fix(tree): keep PAPER.md out of paper child rows PAPER.md is the paper's derived body and the paper row already opens that view; listing it only duplicates the entry. Exclude it from the root document whitelist before applying the multiple-documents rule, so a NOTES.md + PAPER.md paper stays a leaf. Refs #738 | 7 天前 | |
fix(workspace): never render a paper body as markdown editor The paper-root branch of loadTabResources fell back to mode "markdown" with an empty seed whenever every probe missed at once — the classic case being startup, where hydration races the Host catalog and fs scope (bundle IPC and metadata both null, so even arXiv papers lost their html fallback). Hydration runs exactly once, so the empty editor stuck and was persisted into the layout. The keepPdfMode guard from a461aa23 cannot fire on that path: a fresh Library open creates its placeholder with mode "markdown". - paperBodyMode: a paper body resolves to pdf or html only; a full probe miss lands on the PDF "no paper" empty state — that empty editor was editable-but-broken anyway (its edits had no file to persist to) - retry the open probe once (1.2s) when bundle and metadata both miss, healing the startup race instead of sticking on the miss - directories inside a paper folder open as scoped library rather than an empty editor; the remote arXiv preview branch is clamped the same way Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
fix(paper): unify LaTeX source preparation and reading | 1 天前 | |
fix(workspace): resolve paper-root PDF citations for editor jumps paperDirFromPath now recognizes papers/**/<id>/<file>.pdf so #page= links open the paper unit; citation href cleaning strips ZWSP; ExternalLinkElement also routes citation URLs to openCitation. | 1 个月前 | |
feat(paper): update paper-reader notes contract | 1 个月前 | |
feat(library): consolidate publication tags and venue display - Make the Host own #submitted/#easyscholar projections and retire #venue - Add one publication sync action that refreshes metadata, venue tags, and EasyScholar metrics - Show published/submitted/preprint status and metrics in the venue column; keep Tags user-only - Parse EasyScholar on the Host and invalidate metrics when publication changes - Make tag chip tints theme-aware | 5 天前 | |
fix(core): break job-center dependency on lib/paper Move task label helpers into lib/core with an injectable catalog title lookup so core-stays-leaf passes. Paper registers the libraryStore lookup at bootstrap; JobCenter no longer imports from lib/paper. | 1 个月前 | |
fix(import): contain title-search overflow and show shimmer early Radix ScrollArea's display:table wrapper let long titles burst past the picker cards. Swap it for a width-constrained overflow list, open the dialog with shimmer as soon as a title-like query is submitted, and settle the pending row when Host results arrive. Fix #438 | 1 个月前 | |
fix(tree): rename files into folders and start rename on Enter Enter on a focused tree row now starts inline rename; virtual rows keep Enter as activation. Renaming a file to an extensionless name converts it into a folder, moving the file inside with its original suffix. Fix #759 | 7 天前 | |
fix(agent): keep referenced visual marks out of the annotation Sending a composer crop treated that mark as the turn's pin and wrote the prompt and reply back into marks/<id>.json. Reference crops stay in the prompt. Only a session opened from the mark still updates it. Refs #765 | 12 天前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
feat(pdf): anchor full-text translation back to source sentences - Split layout text into sentences, bump the sidecar to schema 2, and paint each sentence pair as its own span - Expand a partial selection to the whole English sentence and store the English quote with text-layer glyph boxes - Tint the matching translated sentence, and show that translation under the source in annotation embeds | 25 天前 | |
feat(visual-mark): 解耦区域批注与 Agent 会话为 visual v2 - marks 使用 kind visual + 可选嵌套 agent;读兼容旧 agent-trace - 支持 createNoteTrace 纯批注落盘,comment 或 agent 至少其一 - 更新 annotation-ref / 单元测试 Refs: #196 | 2 个月前 | |
refactor(ask): unify selection and PDF ask thread state machines Extract the duplicated ask turn engine (optimistic user message, runOnce wiring, attachAgentRun callbacks, resend truncation, stop and cancel mechanics) into lib/pdf/ask/run-turn.ts. The selection hook and the PDF ask-threads hook become thin adapters over their own state containers, preserving each surface's bail-out and persist behavior. Add focused unit tests for the shared engine. | 1 个月前 | |
| 10 天前 | ||
refactor(frontend): remove dead code and unused i18n keys | 6 天前 | |
feat(viewer): support destination crop preview for citation links Add in-place hover previews for in-text citation links, allowing readers to inspect referenced bibliography entries without jumping away from their reading position. - Citation recognition: a link counts as a citation when its own dest name says so (hyperref cite.*, ACS mk:refN, Springer CR<N>, ACM Bib0001), or when it covers a number inside a […] group holding only numbers, commas, whitespace and dashes (possibly wrapped across lines) and the destination page really has a line opening that entry. Theorem, Listing, line, section and footnote links never qualify, with no per-publisher name blacklist. - Destination entry extraction: crops the targeted bibliography entry from the destination page's text lines, strictly within column bounds, and stops before the next entry. - Float labels from link text: reads the linked text plus the word before it ("Figure" + "3") instead of whole text runs, and links whose own dest name is neither a cite nor a float skip coordinate lookups that could collide with a float / bibliography anchor. - Typography-matched rendering: renders destination crops 1:1 with the page (zoom × devicePixelRatio, capped at 1600 px) on the page's paper tone. - Directional card anchoring: positions preview cards below the link with a pointer arrow, flipping above near the viewport edge and shrinking the content rather than covering the link. Crop cards close as soon as the pointer leaves the link; the citation metadata card keeps sticky hover. | 20 天前 | |
feat(viewer): support destination crop preview for citation links Add in-place hover previews for in-text citation links, allowing readers to inspect referenced bibliography entries without jumping away from their reading position. - Citation recognition: a link counts as a citation when its own dest name says so (hyperref cite.*, ACS mk:refN, Springer CR<N>, ACM Bib0001), or when it covers a number inside a […] group holding only numbers, commas, whitespace and dashes (possibly wrapped across lines) and the destination page really has a line opening that entry. Theorem, Listing, line, section and footnote links never qualify, with no per-publisher name blacklist. - Destination entry extraction: crops the targeted bibliography entry from the destination page's text lines, strictly within column bounds, and stops before the next entry. - Float labels from link text: reads the linked text plus the word before it ("Figure" + "3") instead of whole text runs, and links whose own dest name is neither a cite nor a float skip coordinate lookups that could collide with a float / bibliography anchor. - Typography-matched rendering: renders destination crops 1:1 with the page (zoom × devicePixelRatio, capped at 1600 px) on the page's paper tone. - Directional card anchoring: positions preview cards below the link with a pointer arrow, flipping above near the viewport edge and shrinking the content rather than covering the link. Crop cards close as soon as the pointer leaves the link; the citation metadata card keeps sticky hover. | 20 天前 | |
fix(pdf): show full URLs in a hover tip instead of a truncated title (#733) | 14 天前 | |
fix(pdf): anchor comment connector to nearest highlight segment Pick the rect closest to the rail card instead of the envelope midpoint so multi-line notes connect to the nearest paragraph. | 1 个月前 | |
fix(pdf): fall back to top-to-bottom order for equation crossrefs without caption titles | 1 个月前 | |
feat(viewer): resolve multi-entry citation ranges and crop full spans Support citation ranges (e.g. [8–12], [14, 28–30], [1–3]) including groups that wrap across lines: the bracket parser reports the a–b token the hovered number belongs to, and links recognized by dest name pick the range up from the surrounding bracket too. In floating destination crop previews, expand the crop vertically to include every referenced entry up to endEntryIndex — starting from the first in-range entry on the page when the range begins on an earlier page or column. | 20 天前 | |
feat(viewer): preview vault HTML files in a sandbox Serve local .html files through agentero-html so diagrams can render beside their assets without inheriting the app origin. Co-authored-by: Cursor <cursoragent@cursor.com> | 2 天前 | |
perf(workspace): coalesce Dockview sash drag and gate EmbedPDF resize per frame - Forward only the latest pointermove per animation frame to Dockview and flush the final coordinate before pointerup so high-refresh inputs do not queue layout passes - Pause EmbedPDF viewport resize metrics while a sash is active and commit the final panel size once after release; manual zoom values are preserved - Add temporary layout/paint containment on .dv-view and .dv-render-overlay and disable native text selection only during the drag - Document the sash drag pipeline in tab-split and UI docs and add manual checklist row 7.1.3a - Cover the sash frame scheduler and PDF resize gate with Vitest cases | 2 个月前 | |
style(test): format pdf-document-id imports | 1 个月前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
fix(pdf): restore reading position after internal link jumps (Fix #505) Clicking an in-text internal link (appendix, figure, citation) scrolled the reader far away with no way back. Push the pre-jump viewport origin onto a stack and offer a floating "back to p. N" chip under the left toolbar: - jump-back-stack: pure LIFO origin stack (depth cap 20, near-duplicate dedupe against the top) with unit tests - use-pdf-jump-back: capture → commit → pop state machine; the origin is committed only when navigateTarget reports "navigated", so URI external links never pollute the stack; restore is an instant pixel-exact scrollTo - use-pdf-citations: onBeforeInternalJump/onInternalJump callback pair (ref-mirrored like onPreviewShow, handler identity unchanged) - chip hidden in the translation pane, stack cleared on doc switch; scrolling deliberately keeps the chip — returning after reading the appendix for a while is the point Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
test(pdf): add opt-in arXiv PDF layout smoke test Runs real PDFs through render + PP-DocLayoutV3 + merge without a browser when AGENTERO_LAYOUT_PDF_DIR and AGENTERO_LAYOUT_MODEL are set; AGENTERO_LAYOUT_PDFS picks the papers. Writes per-page overlays and detection JSON for before/after regression comparison. | 1 个月前 | |
fix(pdf): anchor figure merge on connected panel groups near captions Full-width captions used to swallow the whole vertical band and narrow unreadable captions stole panels from known titles, so multi-panel and side-by-side figures aggregated badly. Cluster connected panel groups anchored within 0.12 of the caption, let body/table/algorithm blocks separate floats, defer text-less narrow captions, recover captions the model confidently mislabeled as body text, and gate candidates at the sidebar score floor. Refs #223 | 1 个月前 | |
fix(pdf): preserve figures with missing or cross-page captions Preserve MinerU caption text and geometry, recover numbered PDF captions, and keep reliable uncaptioned figures. Backfill existing MinerU caches locally and keep cross-page coordinates separate. Refs #704 | 21 天前 | |
fix(pdf): harden the click-to-annotate hit target Moving activation from hover dwell to click left the affordance missing the guarantees a click needs: - Browsers dispatch click whenever pointerdown and pointerup share an element, so a text-selection drag or pan starting inside a figure opened a crop card. Restore a 6px travel tolerance; keyboard activation (detail === 0) bypasses it since it has no travel. - Hover only tinted the region 5%, so the bbox that the click crops was not visible before committing. Frame it on hover, and on focus-visible too — a translucent UA ring over arbitrary page content is not a reliable keyboard landmark. - The hint chip is a fixed-size label inside a zoom-scaled box, so on small regions it spilled over neighbouring content. Gate it on a minimum region size and clamp it. - PDFium renders the crop asynchronously with nothing on screen in between, so a click read as a no-op. Frame the in-flight region and spin. - The label enumerated "figure, table, or algorithm" although region.kind is known, and said 标注 where the product says 批注. Formula-legend regions have no click action, so they get onFocus/onBlur to stay reachable without a pointer, and a help cursor; annotate regions use a crosshair, leaving the pointer cursor to citation links. | 2 个月前 | |
test(layout): cover normalize, merge, roles, formula, and NMS Unit tests for bbox normalize, caption roles, figure clustering, formula number aggregation, and sidebar dedupe gates. | 2 个月前 | |
fix(pdf): preserve figures with missing or cross-page captions Preserve MinerU caption text and geometry, recover numbered PDF captions, and keep reliable uncaptioned figures. Backfill existing MinerU caches locally and keep cross-page coordinates separate. Refs #704 | 21 天前 | |
fix(tests): use nullish fallbacks instead of non-null assertions Replace non-null assertions on values that may be undefined with optional chaining and nullish defaults to avoid runtime errors. | 2 个月前 | |
perf(pdf): precompute layout hit regions per page Each mounted page ran whole-document NMS (and, with the debug Eye on, spurious-detection suppression) during render, so one scroll re-render cost about ten redundant O(n^2) passes. Bucket regions by page once per region-set change and let renderPage do a map lookup. | 2 个月前 | |
fix(layout): reload the open viewer after a layout re-run A paper that already had a layout result never subscribed to layout.json changes, and the headless re-run stored its result under another document id. The figures rail now merges a newer sidecar into the open tab. Fix #723 | 17 天前 | |
fix(pdf): preserve figures with missing or cross-page captions Preserve MinerU caption text and geometry, recover numbered PDF captions, and keep reliable uncaptioned figures. Backfill existing MinerU caches locally and keep cross-page coordinates separate. Refs #704 | 21 天前 | |
fix(pdf): preserve figures with missing or cross-page captions Preserve MinerU caption text and geometry, recover numbered PDF captions, and keep reliable uncaptioned figures. Backfill existing MinerU caches locally and keep cross-page coordinates separate. Refs #704 | 21 天前 | |
fix(layout): relax full-width figures and tighten formula merge Keep tall multi-row panels under full-width Figure titles, require a formula_number host, and drop formulas that substantially overlap text. | 2 个月前 | |
fix(layout_remote): 改进PDF渲染尺寸解析与诊断日志 - 更新PADDLE_ASSUMED_RENDER_DPI为144以匹配AI Studio服务实际渲染 - LayoutRemoteAnalyzePdfResult新增rendered_pages字段储存每页渲染像素尺寸 - 拆分page_rendered_size函数,优先使用dataInfo.pages中的尺寸数据 - parse_cloud_page改为返回尺寸来源标识以便诊断未知渲染尺寸 - 增加对无渲染尺寸页的详细诊断日志,记录键名、dataInfo和inputImage字符数 - 保存云端返回的原始JSONL结果文件以助排查问题 - 日志输出增强,统计有无渲染尺寸的页面数量及诊断信息 - 新增parse_rendered_pages辅助函数解析dataInfo.pages数组 - 新增单元测试验证真实AI Studio响应下的渲染坐标转换准确性 | 2 个月前 | |
refactor(paper): drop MinerU self-hosted tier and legacy params Parse tier and 3.x backend parameters are configured on the MinerU server itself, so the settings card only keeps the self-hosted switch. Removes the tier / legacyBackend / legacyVllmUrl fields across settings, engines, UI, i18n and docs. | 9 天前 | |
fix(pdf): replace stored body text on a text-layer re-read - Prefer the freshly joined line when a body box does not split - Otherwise the old word order stayed and the extracted flag locked it in Fix #691 | 21 天前 | |
fix(pdf): order same-line layout text by baseline - Group glyphs that share a bottom edge so a taller word stays in place - Sort each line left to right, then continue on the next line down - Use that order for body extraction and sentence-to-glyph matching Fix #691 | 21 天前 | |
fix(pdf): tint an existing highlight only on the overlapping sentence - Locate each English sentence on the text layer and compare those boxes with the highlight - Color only the translated sentence whose boxes overlap, including when the same word appears elsewhere on the page - Until the text layer is read, tint a highlight only when its quote covers a whole sentence | 25 天前 | |
fix(pdf): keep dual-pane translation in sync with layout analysis Opening the translation pane before layout analysis finished was silent and left the pane empty forever: the source pane's dual-pane handler only opens the companion tab (never entering the waiting queue), and the pane only received a one-shot layout snapshot at open time. - Enter the shared layout queue from the translation pane when regions are not ready yet, surfacing the existing queued/waiting toast and cancel. - Mirror the source document's layout result onto the pane's key via a store subscription so a late source result still starts translation. | 18 天前 | |
fix(pdf): preserve figures with missing or cross-page captions Preserve MinerU caption text and geometry, recover numbered PDF captions, and keep reliable uncaptioned figures. Backfill existing MinerU caches locally and keep cross-page coordinates separate. Refs #704 | 21 天前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
test(pdf): stub settings window in translate lifecycle harness - The failure toast opens translate settings, which the vm harness rejected - Allow that import so the test shard can load the hook | 21 天前 | |
fix(pdf): base translation visibility on actually painted items - Define isLayoutTranslateItemPainted for done, running, or partial error items - Derive translationVisible from painted items instead of raw bucket length - Avoid hiding highlights and shifting comments on pending or failed pages | 24 天前 | |
feat(pdf): anchor full-text translation back to source sentences - Split layout text into sentences, bump the sidecar to schema 2, and paint each sentence pair as its own span - Expand a partial selection to the whole English sentence and store the English quote with text-layer glyph boxes - Tint the matching translated sentence, and show that translation under the source in annotation embeds | 25 天前 | |
Revert "fix(translate): preserve technical identifiers in layout translation" This reverts commit 715b537168c34428240f607501762af9dbbe6ce7. | 1 个月前 | |
feat(settings): split the translate prompt into system and user The translation prompt is now two fields. customSystem wins over the legacy customPrompt, and a one-line note stays an extra preference so it cannot replace the engine rules. customUser inserts the source only through the text placeholder. Unknown placeholders fail in the form and are stripped when settings are loaded. #724 | 11 天前 | |
fix(pdf): keep links out of annotation selection Lock only the Link annotation category and preserve its border with a passive renderer. Let annotation containers pass pointers through to the existing citation navigation layer so translated text stays selectable. Disable EmbedPDF's URI auto-opener to keep external navigation in the host opener. Validated with 57 focused tests, a real PDFium/EmbedPDF browser comparison, TypeScript/Biome checks, production build, and strict documentation build. Refs #690 | 22 天前 | |
Fix/translation links quickchat highlight (#751) * fix(translate): keep citation and ref links in layout translation Mask bracket citations, author-year cites, figure and section refs, URLs, and Markdown links before translation, then reattach the original targets to those tokens in the translated glyphs. Refs #732 * fix(translate): keep heading size aligned with source hierarchy Size section titles from the source box and grow the overlay downward when the translation is longer, instead of shrinking the glyphs to fit. Refs #732 * fix(pdf): keep quick-chat selection highlights visible Paint ask selections in the annotation yellow after the card closes, and use the translated boxes while a full-page translation is showing. Fix #732 * fix(translate): match spaced and translated author-year cites PDF text pads the parenthesis and the comma, and the translator then rewrites them to fullwidth brackets, a Chinese comma, and 等人. The old mask missed both forms, so the overlay had no clickable anchors. Refs #732 * fix(translate): size one-line headings from the raw box height A section-title strip is about one em tall. Subtracting paragraph padding collapsed those headings to the minimum size, below body text. Refs #732 * fix(translate): keep section titles slightly larger than page body Floor short heading strips to the same-page body size × 1.35 so translated section titles stay above paragraph text, while still sizing from the source layout box for hierarchy. Refs #732 * fix(pdf): keep quick-chat range highlight after card closes Empty ask drafts were discarded on dismiss and pins only tracked threads with a question, so the yellow selection vanished and only the gutter icon remained. Keep drafts and paint any ask with geometry. Fix #732 * fix(translate): match translated link ink and split adjacent cites Paint each preserved token with the original glyph fill and leave off the extra underline. A group such as [17,38] becomes one target per adjacent link, and repeated copies of the same rectangle count once. * fix(translate): keep grouped cites on their glyphs and open dual-pane links A bracket group such as [17,38] now splits only when each link center sits on that token. The dual-pane translation view scrolls to citation targets and opens URLs. * fix(translate): bind reordered citations to their source links A translated token keeps the link of the source token with the same label, so a clause written as [2] before [1] still opens each citation's own target. * fix(translate): keep the dual-pane link store out of viewer components The layout module imported a viewer text-link type, which breaks the lib-no-components dependency check. * fix(translate): keep unlinked spans and balanced URL parentheses An interval such as [0,1] was taking the next citation whenever glyph clustering could not split it. When the glyphs show no link center on that span, leave it plain. Bare and Markdown URLs keep a closing parenthesis that belongs to the address and still drop a prose one. * fix(pdf): sample mounted link glyphs and shift dual-pane jumps Full-document translation listed every page as pending, so both panes read every linked page before publishing any glyph. The source viewer now samples the scroller's mounted pages, publishes each page as it finishes, and the translation pane reuses that ink, those glyphs, and the visible-box origins. Citation jumps subtract the CropBox origin before converting into page coordinates. * fix(pdf): keep an unsent quick-chat draft when its card closes The hide button still deleted a draft with no question, so the pin and highlight vanished, while dismissing the card any other way kept them. Both paths now keep that draft until the next Ask starts. Update the #732 docs to match. * fix(translate): split bracket cites and prefetch visible link color Same-line citation rects differ by a fraction of a point, so a raw top-edge sort bound the whole bracket to one target. Queued links above or left of the token are skipped, and spaced PDF brackets stay citations. The visible page's glyph fill is read once while idle and cached, so translation can paint colored links without waiting on that read. A new link-map object does not cancel it. | 13 天前 | |
feat(viewer): resolve multi-entry citation ranges and crop full spans Support citation ranges (e.g. [8–12], [14, 28–30], [1–3]) including groups that wrap across lines: the bracket parser reports the a–b token the hovered number belongs to, and links recognized by dest name pick the range up from the surrounding bracket too. In floating destination crop previews, expand the crop vertically to include every referenced entry up to endEntryIndex — starting from the first in-range entry on the page when the range begins on an earlier page or column. | 20 天前 | |
Fix/translation links quickchat highlight (#751) * fix(translate): keep citation and ref links in layout translation Mask bracket citations, author-year cites, figure and section refs, URLs, and Markdown links before translation, then reattach the original targets to those tokens in the translated glyphs. Refs #732 * fix(translate): keep heading size aligned with source hierarchy Size section titles from the source box and grow the overlay downward when the translation is longer, instead of shrinking the glyphs to fit. Refs #732 * fix(pdf): keep quick-chat selection highlights visible Paint ask selections in the annotation yellow after the card closes, and use the translated boxes while a full-page translation is showing. Fix #732 * fix(translate): match spaced and translated author-year cites PDF text pads the parenthesis and the comma, and the translator then rewrites them to fullwidth brackets, a Chinese comma, and 等人. The old mask missed both forms, so the overlay had no clickable anchors. Refs #732 * fix(translate): size one-line headings from the raw box height A section-title strip is about one em tall. Subtracting paragraph padding collapsed those headings to the minimum size, below body text. Refs #732 * fix(translate): keep section titles slightly larger than page body Floor short heading strips to the same-page body size × 1.35 so translated section titles stay above paragraph text, while still sizing from the source layout box for hierarchy. Refs #732 * fix(pdf): keep quick-chat range highlight after card closes Empty ask drafts were discarded on dismiss and pins only tracked threads with a question, so the yellow selection vanished and only the gutter icon remained. Keep drafts and paint any ask with geometry. Fix #732 * fix(translate): match translated link ink and split adjacent cites Paint each preserved token with the original glyph fill and leave off the extra underline. A group such as [17,38] becomes one target per adjacent link, and repeated copies of the same rectangle count once. * fix(translate): keep grouped cites on their glyphs and open dual-pane links A bracket group such as [17,38] now splits only when each link center sits on that token. The dual-pane translation view scrolls to citation targets and opens URLs. * fix(translate): bind reordered citations to their source links A translated token keeps the link of the source token with the same label, so a clause written as [2] before [1] still opens each citation's own target. * fix(translate): keep the dual-pane link store out of viewer components The layout module imported a viewer text-link type, which breaks the lib-no-components dependency check. * fix(translate): keep unlinked spans and balanced URL parentheses An interval such as [0,1] was taking the next citation whenever glyph clustering could not split it. When the glyphs show no link center on that span, leave it plain. Bare and Markdown URLs keep a closing parenthesis that belongs to the address and still drop a prose one. * fix(pdf): sample mounted link glyphs and shift dual-pane jumps Full-document translation listed every page as pending, so both panes read every linked page before publishing any glyph. The source viewer now samples the scroller's mounted pages, publishes each page as it finishes, and the translation pane reuses that ink, those glyphs, and the visible-box origins. Citation jumps subtract the CropBox origin before converting into page coordinates. * fix(pdf): keep an unsent quick-chat draft when its card closes The hide button still deleted a draft with no question, so the pin and highlight vanished, while dismissing the card any other way kept them. Both paths now keep that draft until the next Ask starts. Update the #732 docs to match. * fix(translate): split bracket cites and prefetch visible link color Same-line citation rects differ by a fraction of a point, so a raw top-edge sort bound the whole bracket to one target. Queued links above or left of the token are skipped, and spaced PDF brackets stay citations. The visible page's glyph fill is read once while idle and cached, so translation can paint colored links without waiting on that read. A new link-map object does not cancel it. | 13 天前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
fix(viewer): handle action-based PDF outline bookmarks PDF outlines produced by tools like hyperref are often encoded as GoTo actions rather than direct destinations. The outline panel only handled destination bookmarks, so clicking those items did nothing. - Extract bookmark target resolution into src/lib/pdf/bookmark.ts - Resolve GoTo action destinations in addition to direct destinations - Add unit tests for destination, GoTo action, URI action, and no-target | 2 个月前 | |
perf(pdf): keep the last page bitmap until the next raster paints A fast scroll of the 220-page fixture left the plain viewer with no mounted images (wk-run4, visible and focused, 181 frames, p50 13ms). The base coat revoked its blob and rendered null until PDFium returned. The full viewer still swapped 270 image srcs across 187 frames while the main thread stayed at p50 13ms. Keep the previous bitmap on screen, including after a remount at the same scale, and revoke it only once the replacement has committed. | 10 天前 | |
fix(pdf): take the page origin from the visible page box in EmbedPDF PDFium sizes, renders and reports text relative to the visible page box (CropBox ∩ MediaBox), but EmbedPDF 2.14.4's getPageOrigin returns the CropBox origin alone. When the CropBox is the larger box, every annotation rect is converted against the wrong origin. Springer LNCS pages put a 430×660 MediaBox at (82.5, 90) under an A4 CropBox, so all links land 82.5 pt right of and 90 pt above their text (some off the page): nothing under the text shows a hand cursor or reacts to hover and click. Exported annotations are written back with the same offset. Use the intersection's lower-left corner as the origin, in both the direct and the worker engine bundles. Pages whose CropBox is the inner box, or whose boxes coincide, are unchanged. Submitted upstream as embedpdf/embed-pdf-viewer#845. | 20 天前 | |
fix(pdf): release page-count probe resources | 4 天前 | |
fix(pdf): release page-count probe resources | 4 天前 | |
fix(pdf): keep highlight geometry aligned on rotated pages Highlights and the selection tint paint unrotated PDF points. On /Rotate pages that layer uses the same transform as the tiles, so zoom no longer walks the mark off the glyphs. Upright pages render with no extra frame. Refs #735 | 13 天前 | |
test(pdf): pin normalizeRotation engine contract Documents with /Rotate report unrotated content-space sizes plus rotation metadata under normalizeRotation: true, and the display space only appears when the caller passes that rotation to the renderer. A generated /Rotate 90 fixture pins both modes so the viewer wiring is not "fixed" backwards again. Co-Authored-By: Claude Code <noreply@anthropic.com> | 30 天前 | |
fix(pdf): make Space+left drag equivalent to middle drag An armed left drag spared buttons and links so they kept their click, while the middle button panned from anywhere. That made the two entry points to the same hand tool behave differently: a Space drag starting on a toolbar button or an in-page citation hit did nothing. Holding Space already suspends clicks, so once armed the left button is now a hand tool exactly like the middle one and pans from anywhere but an editable overlay. With no per-button policy left, the gesture takes a target predicate again instead of the whole event. The interactive-role list still guards the bare Space keydown, so a focused button or tree row keeps activating on Space. Fix #456 | 1 个月前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
feat(viewer): support destination crop preview for citation links Add in-place hover previews for in-text citation links, allowing readers to inspect referenced bibliography entries without jumping away from their reading position. - Citation recognition: a link counts as a citation when its own dest name says so (hyperref cite.*, ACS mk:refN, Springer CR<N>, ACM Bib0001), or when it covers a number inside a […] group holding only numbers, commas, whitespace and dashes (possibly wrapped across lines) and the destination page really has a line opening that entry. Theorem, Listing, line, section and footnote links never qualify, with no per-publisher name blacklist. - Destination entry extraction: crops the targeted bibliography entry from the destination page's text lines, strictly within column bounds, and stops before the next entry. - Float labels from link text: reads the linked text plus the word before it ("Figure" + "3") instead of whole text runs, and links whose own dest name is neither a cite nor a float skip coordinate lookups that could collide with a float / bibliography anchor. - Typography-matched rendering: renders destination crops 1:1 with the page (zoom × devicePixelRatio, capped at 1600 px) on the page's paper tone. - Directional card anchoring: positions preview cards below the link with a pointer arrow, flipping above near the viewport edge and shrinking the content rather than covering the link. Crop cards close as soon as the pointer leaves the link; the citation metadata card keeps sticky hover. | 20 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
perf(workspace): hydrate restored PDF tabs on demand | 2 个月前 | |
fix(pdf): jump the dual-pane partner when scrolling settles The pane under the pointer keeps the browser scroll. The other pane stays where it is until the gesture ends, then jumps to the same content point. Following both panes on every tick repainted two tile and text trees with the finger. Fix #769 | 10 天前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
fix(pdf): tighten text selection highlights and annotation bounds | 1 个月前 | |
fix(pdf): anchor selection actions to the divider (fix #822) | 2 天前 | |
fix(test): stub initReactI18next in the selection menu test The menu slot import loads i18n, and the existing react-i18next mock did not export that plugin. Co-authored-by: Cursor <cursoragent@cursor.com> | 4 天前 | |
fix(pdf): keep deleted highlights gone and deletable - ignore EmbedPDF's deleted tracked annotations in rendering, hit testing, editors and the imperative handle - re-issue deletions dropped by the commit lock and persist deletes immediately so a closed tab cannot resurrect them - resolve translated sentence tints back to their highlight so the annotation menu stays reachable with full-text translation visible - only let DOM selections inside the viewer block page annotation clicks Refs #783 | 7 天前 | |
fix(pdf): coordinate engine and navigation lifecycle without timer retries | 4 天前 | |
fix(pdf): keep word-selection highlights readable over translation - Leave the pale highlight on the source after the result card closes, above the translation paper - Split the translation into paper and glyphs so glyphs sit above the highlight and selection ink follows the paper | 25 天前 | |
fix(pdf): protect translation retention across refreshes | 25 天前 | |
feat(translate): customizable translation prompt Settings → 翻译新增「翻译提示词」(translate.customPrompt,空 = 内置)。 非空时整体替换默认学术译者指令块,支持 {{targetLang}} / {{sourceLang}} 变量;原文与 [[n]] 批量规则始终由应用自动追加,批量切分不受影响。 - 仅 Agent 与 OpenAI 兼容两条 LLM 路径生效;免费引擎与内置 provider(Hunyuan-MT)无提示词概念,不受影响。 - OpenAI 兼容路径由 Host 在 translate_text 内从 settings 注入 custom_prompt,WebView 调用方与 CLI 零改动。 - 内置模板抽为 DEFAULT_TRANSLATE_PROMPT_TEMPLATE,空值渲染结果 与旧版字节一致。 - 全文翻译缓存 key 仅在提示词非空时追加 FNV-1a 指纹:改提示词即 重译,存量 layout-translate.json 升级后仍命中。 - 上限 8000 字符(Rust normalize 与前端 store 双侧钳制)。 Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
fix(pdf): preserve highlights outside translated layout blocks - Keep annotation id on HighlightQuoteTint for reverse lookup - Identify highlights with an active visual replacement on painted sentences - Suppress only replaced highlights, preserving ones on references or code - Allow point hit-testing to fall back to unsuppressed English annotations | 24 天前 | |
fix(pdf): render the full visible viewport (fix #827) | 2 天前 | |
fix: prevent Windows PDF scroll endpoint jumps Coalesce deferred viewport scroll requests and cancel stale requests when an explicit wheel input starts. Keep programmatic scroll events from virtual page reordering, zoom/layout changes, and dual-pane synchronization out of the cancellation path, and disable scroll anchoring for the virtual PDF viewport. | 1 个月前 | |
fix(pdf): show highlights on both the source and the translation - Anchor a translation selection to the English sentences actually hit, using that sentence's glyph boxes - End a drag on mouseup; a click outside the note commits typed text and dismisses an empty one - Store English glyph boxes and page-fraction boxes for the translated region, and paint whichever view is open - Keep sentence-span selection ink on the paper color - Paint a pre-translation English highlight across the matching translated sentence in its original color | 25 天前 | |
fix(pdf): locate visual annotation jumps without opening the card Wiki and annotation links scroll to the crop and flash it. The floating transcript card stays on the pin click. Fix #735 | 13 天前 | |
fix(pdf): enable Windows touchpad pinch zoom | 8 天前 | |
fix(pdf): match narrow-page zoom preview geometry | 30 天前 | |
refactor(core): share the pending session registry Fold the duplicated TTL+LRU pending session tables in lib/pdf/ask and lib/pdf/agent-trace into a generic createPendingSessionRegistry factory with an optional post-take grace window, keeping both modules' export surface and pruning semantics unchanged. Add unit tests for TTL boundaries, LRU eviction, and grace behavior. | 1 个月前 | |
fix(pdf): protect translation retention across refreshes | 25 天前 | |
feat(viewer): plain pdf viewer outside papers PDFs outside the vault papers/ folder (e.g. a compiled plans/a.pdf) no longer run the paper pipeline: layout analysis, visual annotation, full-text translation, the selection toolbar, and annotations are all gated off via a new plainViewer prop computed by isPlainPdfPath. Basic reading (pages, zoom, search, outline, text selection + copy) stays. PDFs under papers/ and remote arXiv papers keep their current behavior. Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
feat(plaza): add selection Ask and Add-to-chat on RSS feed detail Enable Copy / Ask / Add-to-chat on feed item bodies with an ephemeral Ask popover (no marks/), reusing the PDF ask chrome. Fix #421 (feeds half). | 1 个月前 | |
Fix/translation links quickchat highlight (#751) * fix(translate): keep citation and ref links in layout translation Mask bracket citations, author-year cites, figure and section refs, URLs, and Markdown links before translation, then reattach the original targets to those tokens in the translated glyphs. Refs #732 * fix(translate): keep heading size aligned with source hierarchy Size section titles from the source box and grow the overlay downward when the translation is longer, instead of shrinking the glyphs to fit. Refs #732 * fix(pdf): keep quick-chat selection highlights visible Paint ask selections in the annotation yellow after the card closes, and use the translated boxes while a full-page translation is showing. Fix #732 * fix(translate): match spaced and translated author-year cites PDF text pads the parenthesis and the comma, and the translator then rewrites them to fullwidth brackets, a Chinese comma, and 等人. The old mask missed both forms, so the overlay had no clickable anchors. Refs #732 * fix(translate): size one-line headings from the raw box height A section-title strip is about one em tall. Subtracting paragraph padding collapsed those headings to the minimum size, below body text. Refs #732 * fix(translate): keep section titles slightly larger than page body Floor short heading strips to the same-page body size × 1.35 so translated section titles stay above paragraph text, while still sizing from the source layout box for hierarchy. Refs #732 * fix(pdf): keep quick-chat range highlight after card closes Empty ask drafts were discarded on dismiss and pins only tracked threads with a question, so the yellow selection vanished and only the gutter icon remained. Keep drafts and paint any ask with geometry. Fix #732 * fix(translate): match translated link ink and split adjacent cites Paint each preserved token with the original glyph fill and leave off the extra underline. A group such as [17,38] becomes one target per adjacent link, and repeated copies of the same rectangle count once. * fix(translate): keep grouped cites on their glyphs and open dual-pane links A bracket group such as [17,38] now splits only when each link center sits on that token. The dual-pane translation view scrolls to citation targets and opens URLs. * fix(translate): bind reordered citations to their source links A translated token keeps the link of the source token with the same label, so a clause written as [2] before [1] still opens each citation's own target. * fix(translate): keep the dual-pane link store out of viewer components The layout module imported a viewer text-link type, which breaks the lib-no-components dependency check. * fix(translate): keep unlinked spans and balanced URL parentheses An interval such as [0,1] was taking the next citation whenever glyph clustering could not split it. When the glyphs show no link center on that span, leave it plain. Bare and Markdown URLs keep a closing parenthesis that belongs to the address and still drop a prose one. * fix(pdf): sample mounted link glyphs and shift dual-pane jumps Full-document translation listed every page as pending, so both panes read every linked page before publishing any glyph. The source viewer now samples the scroller's mounted pages, publishes each page as it finishes, and the translation pane reuses that ink, those glyphs, and the visible-box origins. Citation jumps subtract the CropBox origin before converting into page coordinates. * fix(pdf): keep an unsent quick-chat draft when its card closes The hide button still deleted a draft with no question, so the pin and highlight vanished, while dismissing the card any other way kept them. Both paths now keep that draft until the next Ask starts. Update the #732 docs to match. * fix(translate): split bracket cites and prefetch visible link color Same-line citation rects differ by a fraction of a point, so a raw top-edge sort bound the whole bracket to one target. Queued links above or left of the token are skipped, and spaced PDF brackets stay citations. The visible page's glyph fill is read once while idle and cached, so translation can paint colored links without waiting on that read. A new link-map object does not cancel it. | 13 天前 | |
feat(viewer): support destination crop preview for citation links Add in-place hover previews for in-text citation links, allowing readers to inspect referenced bibliography entries without jumping away from their reading position. - Citation recognition: a link counts as a citation when its own dest name says so (hyperref cite.*, ACS mk:refN, Springer CR<N>, ACM Bib0001), or when it covers a number inside a […] group holding only numbers, commas, whitespace and dashes (possibly wrapped across lines) and the destination page really has a line opening that entry. Theorem, Listing, line, section and footnote links never qualify, with no per-publisher name blacklist. - Destination entry extraction: crops the targeted bibliography entry from the destination page's text lines, strictly within column bounds, and stops before the next entry. - Float labels from link text: reads the linked text plus the word before it ("Figure" + "3") instead of whole text runs, and links whose own dest name is neither a cite nor a float skip coordinate lookups that could collide with a float / bibliography anchor. - Typography-matched rendering: renders destination crops 1:1 with the page (zoom × devicePixelRatio, capped at 1600 px) on the page's paper tone. - Directional card anchoring: positions preview cards below the link with a pointer arrow, flipping above near the viewport edge and shrinking the content rather than covering the link. Crop cards close as soon as the pointer leaves the link; the citation metadata card keeps sticky hover. | 20 天前 | |
fix(agent): strip harness reminder and context blocks from user prompt display and selection | 1 个月前 | |
refactor(lib): break import cycles and sink vault-file-drag into core dependency-cruiser reported 22 cycles plus a core-stays-leaf violation. Resolve them: extract agent catalog types into a pure api-types leaf (19 cycles shared this one type edge), split window actions out of shell/ui-store, move layout translate types into pdf/layout/types, extract inline link styles, and sink the zero-dependency vault-file-drag module into core. deps:check now reports zero violations. | 1 个月前 | |
feat(agent): queue follow-ups, prompt history, and open citation sources Allow composing while a run is active by parking messages in a Queue waitlist, map ↑/↓ to shell-style history fill in the input, keep composer chrome colors stable during streaming, wire slash menus in the composer, and open paper pages when chat Sources or inline citations are clicked. | 2 个月前 | |
fix(pdf): surface imported papers and rotated pages | 30 天前 | |
refactor(lib): reorganize src/lib into domain packages Split the flat lib surface into core, settings, vault, paper, workspace, pdf, agent, wiki, markdown, shell, and ui. Update consumers and unit tests to the new import paths. | 3 个月前 | |
feat(settings): optional wiki-embed font size and markdown max width (#733) | 14 天前 | |
fix(agent): keep formulas when copying rendered replies Copying a text selection from a rendered AI reply used the browser's default DOM clipboard path. KaTeX math is HTML (html + MathML + a hidden TeX annotation), so the pasted text was glyph soup and the LaTeX source was lost. Copy the selection as Markdown instead: restore every intersecting KaTeX node from its annotation ( $…$ inline, $$…$$ display), expanding selections that start or end inside a formula and carrying display mode across the partial clone. The listener is scoped to data-markdown-copy message surfaces; plain selections without math keep the default copy. | 2 天前 | |
perf(editor): stop re-running the container query on every resize frame Measured on WebKit 27.2 with a 441-block document (median frame time): no resize 17.0ms resize, nothing pinned 42.0ms (127.0ms once math is present) resize, editor width pinned 39.0ms resize, query container pinned 17.0ms So ~24 of the 25ms was the @container/editor query container re-running style for its subtree on every frame, not the document re-wrapping (~3ms). content-visibility: auto is the Chromium answer and stays gated off on WebKit (WebKit #276735, still open); it also measured no better than the baseline here (42.0 vs 42.0ms). @container/editor moves one level down, onto a wrapper whose width the gesture can pin, so the query does not re-run and the editor inside keeps its width. The pane still follows the pointer and .agentero-dock-sash-active clips the overflow via contain: paint; everything re-lays out once on release. The gesture itself is now one shared signal (resize-gesture.ts): the sash hook reports divider drags, and a ResizeObserver on the workspace root plus a 140ms quiet window covers the gestures that never produce a sash event — shell rail drags (react-resizable-panels) and native window resizes. All previous gates armed only on isDockviewSashTarget(.dv-sash), so those two were never covered at all. | 9 天前 | |
feat: complete selection annotation workflow (#579) | 1 个月前 | |
fix(viewer): key auto-translate on the selection anchor, not the menu The floating selection menu is re-placed on every scroll tick to stay glued to the selection, and re-placing replaces the menu object because its screen moved — the anchor it points at is untouched. The auto-translate guard therefore saw a new menu on each wheel tick, re-ran the translation and appended another translate record per tick; the gutter then stacked the identical 文A pins into one vertical column. A translation belongs to an anchor, so fingerprint the anchor instead. A new drag-select still counts as fresh intent: the guard resets while selecting, otherwise re-selecting the same text would silently skip the translation. | 1 个月前 | |
refactor(viewer): move selection cards into pdf/cards pdf-ask/ held translate, visual-mark, formula and note cards too, so the name misdescribed it and every card sat far from the hook owning its state. The page gutter moved to layers/ (a page layer, not a card) and the citation preview joined the other cards instead of sitting at the folder root. | 2 个月前 | |
feat: complete selection annotation workflow (#579) | 1 个月前 | |
feat: complete selection annotation workflow (#579) | 1 个月前 | |
feat(pdf): anchor full-text translation back to source sentences - Split layout text into sentences, bump the sidecar to schema 2, and paint each sentence pair as its own span - Expand a partial selection to the whole English sentence and store the English quote with text-layer glyph boxes - Tint the matching translated sentence, and show that translation under the source in annotation embeds | 25 天前 | |
fix(agent): show Markdown selection line numbers in composer UI Wire selectionChips into ComposerContextChips and render lineFrom/lineTo on SelectionSourceButton via shared agent i18n labels so Add-to-chat annotation hover proves #709 without an ACP agent. Normalize registry path keys and add unit coverage. | 18 天前 | |
fix(workspace): disable dockview dnd while selection overlays are open The floating text-selection overlays (the selection toolbar and the ask / quick-chat card) portal to body, so for a selection near the top of a panel they sit right against the dockview tab strip. A drag that started on the tab behind them would split the layout. Register open overlays in a small ref-counted store and pass the resulting flag to DockviewReact's disableDnd, freezing tab/group drag while any overlay is open. Tab clicks still work. Fix #608 | 29 天前 | |
feat(markdown): add Plate selection source line numbers Compute on-disk Markdown line spans for Plate selections via serialize prefix counts and frontmatter offset so agent chips and prompts carry (lines A-B), matching CodeMirror. Fix #709. | 18 天前 | |
feat: complete selection annotation workflow (#579) | 1 个月前 | |
feat: complete selection annotation workflow (#579) | 1 个月前 | |
test(translate): align built-in probe expectation with a33cf9be a33cf9be made the built-in provider take part in probeFreeMtProviders (it resolves false without a request when builtin_provider_status is unavailable), but this test still asserted it was excluded, leaving the suite red. Assert inclusion instead, and sync the stale translate.md probe row (builtin-provider.md already documented the new behavior). | 25 天前 | |
feat(library): persist resizable column widths Fixes #612 | 29 天前 | |
feat(settings): warn before GitHub downloads without a proxy CLI install and app updates both fetch from GitHub releases, where a missing proxy is a common cause of failures. Check the app/system proxy before either download and surface an actionable toast (jump to General > Network proxy) instead of letting the request fail silently. The warning is advisory: the download still proceeds. | 19 天前 | |
fix(settings): gate the layout reminder on the wizard, not onboardingDone onboardingDone can stay false on returning/dev profiles that already have a vault (the wizard only auto-opens when there is no recent vault), so the reminder never fired there. Gate on the wizard overlay instead: it runs on every launch and only pauses while the first-run wizard is visible. Add a focused test for the fire/throttle/dismiss behavior. | 25 天前 | |
feat(settings): add low-frequency config reminders The app never surfaced that some features need configuration until they failed. Add two once-per-session, top-right reminders with an actionable jump and a persisted "don't remind again": - layout-local-model: startup hint (main window, after onboarding + vault) that local ONNX layout analysis costs memory / CPU, with a jump to the layout settings. - network-proxy: fired from the global notifyError / notifyWarning funnel when a failure looks network-related and no proxy is configured. Dismissals persist in settings.dismissedReminders (Host whitelist layout-local-model / network-proxy, frontend mirrors it). Fix #658 | 25 天前 | |
feat(settings): split the translate prompt into system and user The translation prompt is now two fields. customSystem wins over the legacy customPrompt, and a one-line note stays an extra preference so it cannot replace the engine rules. customUser inserts the source only through the text placeholder. Unknown placeholders fail in the form and are stripped when settings are loaded. #724 | 11 天前 | |
fix(settings): preserve configuration when reopening quick setup | 16 天前 | |
fix(shell): maximize the active pane in reading layout Reading now collapses the rails and maximizes the active Dockview group, so multi-column and multi-tab workspaces still enter immersive reading. Toggling reading again restores the previous preset or custom rails. The layout menu uses onSelect so re-clicking the current preset always takes effect. Fix #764 | 7 天前 | |
fix(macos): restore fullscreen shortcut without opening search | 3 天前 | |
refactor(frontend): remove dead code and unused i18n keys | 6 天前 | |
fix(workspace): stop Library column drag from splitting the layout The Library column-reorder drag writes text/plain (the column key), and isSplitDragPayload treated any text/plain-without-Files drag as a file-tree path drag. Dropping a column header over a dockview edge therefore opened a phantom panel named after the column (e.g. "authors") and split the workspace (Fix #646). Key the split check on the dedicated VAULT_FILE_DRAG_TYPE MIME and the active vault-drag flag via dataTransferLooksLikeVaultMove, matching how the rest of the app tells in-app vault moves apart from other text drags. | 25 天前 | |
feat(paper): add a manually maintained OpenReview link (fix #828) | 2 天前 | |
fix(import): hide arXiv subject tags as internal provenance Translator arXiv imports store subject classes like "Computer Science - Machine Learning" as regular tags, which clutter Library and Paper Info. Prefix them with @arxiv: on import (same hidden tag convention as @zotero:), and omit both prefixed and legacy unprefixed labels from UI, search, filters, and CLI unless --all. Fix #380 | 1 个月前 | |
refactor(frontend): migrate IPC to typed specta bindings Replace all string-based invokeApi calls (152 sites) and app-command bare invokes with typed commands.* from the generated bindings, routed through callApi/callApiResult/callResult helpers that preserve the old throw semantics (ApiError with code/message/details, fallback and desktopOnly texts). Migrate 43 Host event subscriptions to events.*.listen via useTauriEvent/listenEventSafe. Delete the string-based invokeApi/listenSafe APIs, duplicated hand-written event-name constants and ~15 duplicate DTO types (now re-exports of generated types). String-based listen/invoke remains only for frontend window broadcasts and the mobile-gated iOS bridge client. Command wire names verified 1:1 against HEAD (181 distinct, zero lost); the sync config folding mirrors the Rust serde defaults exactly (null on the wire means backend default). Update three test files to the typed chain with assertions preserved or strengthened. tsc, biome, production build and vitest (998 passed) are green. | 1 个月前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(compile): add clear-intermediates action to the engine picker After a failed compile, latexmk's fingerprint database (.fdb_latexmk) records the error and, with an unchanged source, refuses to recompile — it reports "Nothing to do" plus "gave an error in previous invocation" on every retry. Add a "clean intermediates" entry under the file-tree compile button's engine picker: a new clean_latex_aux_files Rust command runs latexmk -c in the source's directory (same latexmk resolution and PATH handling as the compile runner), dropping the regenerable intermediates while keeping the PDF so the next compile is a full run. cleanTexAuxFiles on the lib layer surfaces backend failures and is a no-op while a compile is in flight; specta bindings regenerated. Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): add a sidebar panel for structure and compile Show the panel while the active file belongs to a resolved TeX project, with an outline from the editor syntax tree and a single compile icon on file rows. latexmk follows the root file's program comment, then the project's last choice, then XeLaTeX, hidden behind the header settings button. Live preview is a toggle and does not change the compile engine. Co-authored-by: Cursor <cursoragent@cursor.com> | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(tex): add LuaLaTeX realtime preview | 6 天前 | |
fix(latex): retain live preview status across split panes | 3 天前 | |
feat(latex): add a sidebar panel for structure and compile Show the panel while the active file belongs to a resolved TeX project, with an outline from the editor syntax tree and a single compile icon on file rows. latexmk follows the root file's program comment, then the project's last choice, then XeLaTeX, hidden behind the header settings button. Live preview is a toggle and does not change the compile engine. Co-authored-by: Cursor <cursoragent@cursor.com> | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): add a sidebar panel for structure and compile Show the panel while the active file belongs to a resolved TeX project, with an outline from the editor syntax tree and a single compile icon on file rows. latexmk follows the root file's program comment, then the project's last choice, then XeLaTeX, hidden behind the header settings button. Live preview is a toggle and does not change the compile engine. Co-authored-by: Cursor <cursoragent@cursor.com> | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(latex): integrate project builds and writing tools | 3 天前 | |
feat(text-editor): compile TeX only on manual save or compile button Autosave (debounced flush and unmount flush) now writes to disk without triggering latexmk. Compilation happens only on explicit triggers: - Cmd/Ctrl+S in the CodeMirror editor: flush immediately, then compile (a refused conflict-guard save does not compile; a clean buffer still does, matching Overleaf's explicit-rebuild semantics) - Compile button / Cmd+\ (openTexPdf): flush the mounted editor's pending autosave first via the new lib-layer flusher registry, so latexmk reads the just-typed bytes instead of the pre-autosave disk snapshot - A missing LaTeX engine notifies only on the manual path; programmatic callers stay silent The flusher registry lives in src/lib/workspace/text-editor-flush.ts so lib actions can reach the lazy-chunk editor without importing it, with ownership-based unregister for same-path split panes. Popout doc windows wire the same manual-save handler as the main dock. Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
feat(ui): render inline TeX math in paper titles Add MathText (KaTeX) for catalog titles with $...$ / \\(...\\) so the file tree, library table, and dock tabs show π instead of raw TeX. | 1 个月前 | |
feat(settings): split the translate prompt into system and user The translation prompt is now two fields. customSystem wins over the legacy customPrompt, and a one-line note stays an extra preference so it cannot replace the engine rules. customUser inserts the source only through the text placeholder. Unknown placeholders fail in the form and are stripped when settings are loaded. #724 | 11 天前 | |
fix(pdf): show hover cards on dual-pane translation links The translation pane could open citation and URL links, but hover did not show the reference card, cross-reference preview, or URL tip. Route translated tokens through the same previews as the source reader. Fix #755 | 10 天前 | |
perf(editor): keep only near-viewport math expanded A note with ~5600 inline formulas put ~200k nodes in the DOM: KaTeX expands each one into tens to hundreds of spans, and every style/layout pass over that tree (a pane resize, a theme switch) costs hundreds of milliseconds. Measured median frame time during a resize went from 42ms without math to 127ms with it. Block equations were already deferred; inline ones were rendered eagerly because the KaTeX span is empty until it renders and useInView treats a zero-area target as visible (so content can never get stuck), which made the gate a no-op. Evicted equations now keep the footprint of their last render, so neither the line wrapping nor the document height changes when they are dropped. Eviction needs a second, wider band: rendering changes the element's own box, which moves it back across the same threshold, so a single margin oscillates and the document visibly shakes. useInView gained keepAlive: false with an enter band and a wider evict band, and now shares one observer per margin instead of one per hook — two observers for the app rather than ~11k. | 9 天前 | |
feat(core): add mapLimit concurrency helper | 2 个月前 | |
fix(vault): cut idle watcher wakeups and background refresh work Block on FS events when idle instead of polling, buffer vault:file-changed while the shell is hidden/unfocused, and stretch tree/wiki/library debounce in the background so long-running sessions waste less energy. | 1 个月前 | |
fix(ci): clear lint and stale test failures | 2 个月前 | |
fix(vault): reset busy flag when restored vault path invalidated mid-load A restored vault path could be cleared by validation while its tree was still loading, leaving the vault stuck in a busy state. The refresh now only resets its busy flag when the generation still matches, and the cleared-path branch reports the failure to the user instead of silently treating it as empty. | 1 个月前 | |
feat(sidebar): label vault root folders like the library Show Notes, Thesis, and Data with icons on the vault root while keeping the directory names on disk. Co-authored-by: Cursor <cursoragent@cursor.com> | 2 天前 | |
docs(skills): refresh bundled skill index | 1 个月前 | |
fix(vault-tree): hide the app's own source/ sidecars from the tree The reference sidecar {paper}/source/agentero-cite.json (plus the PDF layout sidecars) are rebuildable app artifacts, yet they surfaced as a redundant folder in the file tree whenever the containing folder was not classified as a paper unit — a paper moved out of papers/, copied in, or left behind by a re-organization. The tree only hides a paper's internals for paper rows, so those buckets leaked. Blind the tree to those sidecars (Host builder + renderer mirror for remote vaults), and skip a source/ bucket that holds nothing but them outside paper units. A paper unit under papers/ keeps its source/ marker, so papers without NOTES.md still resolve as papers. Fix #747 | 10 天前 | |
fix(sync): hide mirrored sync-store artifacts from the vault file tree A WebDAV sync target pointing at a cloud folder that a desktop client (Nutstore, Nextcloud, ...) mirrors back into the vault lands blobs/, manifests/, HEAD and vault.json inside the vault. They are engine internals, never user content: - file tree (Host Rust walk + renderer TS build for remote vaults): hide them at the vault root only; nested same-named folders stay visible - sync scan: skip them at any depth so the engine never re-uploads its own output, which fed a loop that bloated the remote store every pass - watcher: mute mirrored writes so they stop firing vault events The names live in one shared list (SYNC_STORE_ARTIFACT_NAMES), pinned to the engine's remote layout keys by a unit test. Refs #625 | 1 个月前 | |
fix(paper): unify LaTeX source preparation and reading | 1 天前 | |
feat(library): consolidate publication tags and venue display - Make the Host own #submitted/#easyscholar projections and retire #venue - Add one publication sync action that refreshes metadata, venue tags, and EasyScholar metrics - Show published/submitted/preprint status and metrics in the venue column; keep Tags user-only - Parse EasyScholar on the Host and invalidate metrics when publication changes - Make tag chip tints theme-aware | 5 天前 | |
feat(workspace): add CodeMirror plain-text editor as fallback viewer Text files outside papers/ (txt/tex/bib/json/yaml/python and unknown extensions) now open in a lazy CodeMirror 6 editor instead of the Plate Markdown editor; files under papers/ keep the legacy Markdown routing. Includes syntax highlighting per extension, EditorView.lineWrapping, custom TeX/BibTeX completions via language data, oneDark/dynamic theme, in-place disk reload via reloadKey, debounced autosave with conflict guard, editor LRU keep-alive, doc popout and session restore support. Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
feat(ui): add viewport-aware floating placement for context menus Introduce a shared ViewportFloating component and placement algorithm that flips menus above the anchor when viewport space is insufficient and clamps to edges. Migrate slash-command menu, wiki-link suggestion, and file-tree context menu to the new system; dismiss editor popups on scroll to prevent detachment from the cursor. | 2 个月前 | |
fix(agent): store visual annotation drafts per composer session A shared crop made session switches drop unsent visual blocks, and adding the same mark in another session either did nothing or cleared the first block. Each session now keeps its own draft; sending consumes only the crops cited by that composer. Hover indexes follow the same document order as the numbered prompt. Refs #765 Refs #766 | 12 天前 | |
fix(web-view): anchor translate card below selection | 1 个月前 | |
feat(viewer): selection toolbar, translate card and quick chat for web papers Consume the agentero-web bridge in HtmlViewer: non-arXiv frames load through webViewProxyUrl (Windows http://agentero-web.localhost dual form) after webProxyAllowHost accepts the host, and useWebViewSelection turns bridge postMessages into the same floating chrome the PDF and plaza surfaces have — auto-copy + toolbar, ephemeral streaming TranslateCard (agent or free MT provider, nothing written to marks/), ⌘K quick chat and ⌘L add-to-chat forwarded from the frame. SelectionMenu's readOnly flag can't express "hide highlight, keep translate" for surfaces without marks/, so it splits into showHighlight / showTranslate. The plaza ask run lifecycle moves to a shared useSelectionAsk hook (plaza surface keeps its exact signature); buildPlazaAskPrompt grows a surface wording option. Co-Authored-By: Claude Code <noreply@anthropic.com> | 1 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
test: repair unit suite after wiki module relocation Restore missing export keywords on helpers the tests import (paperReaderLanguageInstruction, buildPaperReaderUserPrompt, bytesToBase64, restoreMarkdownSelectionBookmark) and point test imports at the relocated wiki modules (src/lib/wiki/* instead of the old top-level src/lib/wiki-*.ts paths). | 2 个月前 | |
fix(wiki): scope external rename handling to linkable targets - Share Wiki target classification across watcher rebuilds and tree candidates - Route Markdown, PDF, image, and directory-like renames through link repair - Keep sidecar and temporary-file events on the normal workspace refresh path - Cover target and path-shape classification with regression tests - Document the watcher and frontend behavior Fixes #122 | 2 个月前 | |
refactor(workspace): drive document types from a single viewer mode registry - Add VIEWER_MODE_TABLE as the single source for the mode union, path matching, renderer/LRU class, resource kind, restore flags and props equality; mode resolution, persistence whitelist, tab restore, resource loading and LRU filtering all read from it - Keep explicit per-mode flags so keep-alive and rendering semantics stay visible; viewer internals (PDF/Plate/Excalidraw/HTML) stay independent - Guard the popout window's URL mode param and pin the registry-to-dispatch correspondence in workspace-viewer-modes tests | 9 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 18 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 17 天前 | ||
| 21 天前 | ||
| 26 天前 | ||
| 12 天前 | ||
| 3 个月前 | ||
| 12 天前 | ||
| 18 天前 | ||
| 25 天前 | ||
| 3 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 10 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 天前 | ||
| 1 个月前 | ||
| 12 天前 | ||
| 10 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 5 天前 | ||
| 2 个月前 | ||
| 17 天前 | ||
| 4 天前 | ||
| 3 个月前 | ||
| 10 天前 | ||
| 2 个月前 | ||
| 24 天前 | ||
| 3 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 9 天前 | ||
| 2 个月前 | ||
| 13 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 21 天前 | ||
| 4 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 21 天前 | ||
| 4 天前 | ||
| 21 天前 | ||
| 2 个月前 | ||
| 9 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 23 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 12 天前 | ||
| 18 天前 | ||
| 2 天前 | ||
| 2 个月前 | ||
| 4 天前 | ||
| 5 天前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 7 天前 | ||
| 1 个月前 | ||
| 29 天前 | ||
| 29 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 9 天前 | ||
| 4 天前 | ||
| 9 天前 | ||
| 13 天前 | ||
| 1 个月前 | ||
| 20 天前 | ||
| 7 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 7 天前 | ||
| 9 天前 | ||
| 2 个月前 | ||
| 4 天前 | ||
| 18 天前 | ||
| 7 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 7 天前 | ||
| 1 个月前 | ||
| 1 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 5 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 7 天前 | ||
| 12 天前 | ||
| 4 天前 | ||
| 25 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 6 天前 | ||
| 20 天前 | ||
| 20 天前 | ||
| 14 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 20 天前 | ||
| 2 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 21 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 21 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 17 天前 | ||
| 21 天前 | ||
| 21 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 9 天前 | ||
| 21 天前 | ||
| 21 天前 | ||
| 25 天前 | ||
| 18 天前 | ||
| 21 天前 | ||
| 4 天前 | ||
| 21 天前 | ||
| 24 天前 | ||
| 25 天前 | ||
| 1 个月前 | ||
| 11 天前 | ||
| 22 天前 | ||
| 13 天前 | ||
| 20 天前 | ||
| 13 天前 | ||
| 4 天前 | ||
| 2 个月前 | ||
| 10 天前 | ||
| 20 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 13 天前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 20 天前 | ||
| 3 天前 | ||
| 2 个月前 | ||
| 10 天前 | ||
| 4 天前 | ||
| 1 个月前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 7 天前 | ||
| 4 天前 | ||
| 25 天前 | ||
| 25 天前 | ||
| 1 个月前 | ||
| 24 天前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 13 天前 | ||
| 8 天前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 13 天前 | ||
| 20 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 30 天前 | ||
| 3 个月前 | ||
| 14 天前 | ||
| 2 天前 | ||
| 9 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 18 天前 | ||
| 29 天前 | ||
| 18 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 29 天前 | ||
| 19 天前 | ||
| 25 天前 | ||
| 25 天前 | ||
| 11 天前 | ||
| 16 天前 | ||
| 7 天前 | ||
| 3 天前 | ||
| 6 天前 | ||
| 25 天前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 1 个月前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 6 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 3 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 11 天前 | ||
| 10 天前 | ||
| 9 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 1 个月前 | ||
| 1 天前 | ||
| 5 天前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 12 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 9 天前 |