summaryrefslogtreecommitdiff
path: root/src/main/index.ts
AgeCommit message (Collapse)Author
7 daysFix main-document switching end to end; stable project-independent MCP pathHEADmainhaoyuren
Main document: the app never called Overleaf's official settings endpoint, so "Set as main document" only changed renderer state and agents had no way to switch at all — compiles kept using the old root. Now: - Right-click Set as main and the new set_main_file MCP tool both POST /project/:id/settings {rootDocId} (web parity, persists project-wide) - Handle the rootDocUpdated broadcast: update the project snapshot, the renderer state, and rewrite CLAUDE.md/AGENTS.md — the guide's stale "Main file" line was teaching agents to compile the old root via main_file overrides - Compile root resolution uses the sync bridge's live maps, so docs created mid-session resolve correctly (agent guide too) MCP server location: Codex stores its MCP registration globally, and the per-project path went stale when the project temp dir was cleaned up ("connection closed" on handshake). The bundled server now installs to ~/.lattex/lattex-mcp.mjs (project-independent, refreshed on connect; the esbuild bundle since the raw source can't resolve node_modules from there) and resolves the project at runtime: $LATTEX_PROJECT_DIR, cwd + ancestors, legacy script location, then single live project in tmpdir. Register once, works for every project. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18Add in-app update check with one-click installer downloadv0.6.1haoyuren
On launch the home page checks the latest GitHub release; when a newer version exists a bottom-right card offers Download (streams the right installer for the platform into ~/Downloads and opens it), Later, or Skip this version (remembered). Unsigned app rules out silent auto-update on macOS, so installation stays a manual replace. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18Add browser-style project tabs: persistent home + one tab per projectv0.6.0haoyuren
The project list is now a persistent home tab; each opened project runs in its own WebContentsView tab below a 38px tab strip (hidden when only home is open). Background tabs stay fully live (sync, collab, terminals). Main process: per-project singletons (socket, sync bridge, compilation manager, MCP state, compile watcher) become per-tab ProjectSession objects keyed by webContents.id; PTYs are scoped per webContents. Hardened against races found in review: concurrent ot:connect dedupe, teardown/reopen serialization on the shared sync dir, destroyed-window guards on all bridge sends, real logout that closes project tabs. Renderer: tabs strip in the home renderer (wt-* classes, distinct from the editor's .tab-bar file tabs), project tabs boot from ?projectId= and connect straight into the editor; Back closes the tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30Cross-platform support: Windows build target and CI release workflowhaoyuren
- Normalize watcher paths to forward slashes (Windows events use backslashes; all sync maps are '/'-keyed), path.delimiter for PATH/TEXINPUTS, dirname() instead of '/'-substring splits, bridge log in os.tmpdir() - Platform-aware TeX search paths (TeX Live / MiKTeX on Windows), terminal shell default (COMSPEC/powershell), native window frame off macOS - electron-builder: NSIS target + win icon + GitHub publish provider - GitHub Actions workflow builds the Windows installer on tag push (node-pty needs MSVC — cannot cross-compile from macOS) and attaches it to the release Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30Add workspace file browser and OpenAlex citation searchhaoyuren
Workspace browser: - The left panel gains a Project/Workspace toggle; the Workspace view browses the agent scratch space (claude-workspace/, never synced) - Open/edit workspace text files in the editor with debounced auto-save (flushed on tab switch); binaries open with the system default app - Import to Project copies a workspace file/folder into the project root where the sync bridge picks it up and creates it on Overleaf (collision-safe: falls back to a -imported suffix) - New file/folder, rename, delete, reveal in Finder, drag-drop into the workspace, 5s auto-refresh while visible OpenAlex search (MCP): - New search_openalex tool: broad OpenAlex coverage with an explicit citation-authority policy — BibTeX is cross-checked against Semantic Scholar (by DOI, then by exact title, since OpenAlex DOIs can point at mirrors); entries not found on S2 are flagged "OpenAlex only" with instructions to verify via web search before citing - Tool description, agent guide, permission allowlist, and README updated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28Codex/agent-neutral setup, terminal IME fix, hide own overlay cursorhaoyuren
- Write AGENTS.md (the cross-tool agent-instructions standard) at the project root alongside .claude/CLAUDE.md, generated from one guide; includes an Agent Setup section with the project-specific Codex MCP registration command. AGENTS.md is excluded from Overleaf sync. - MCP server resolves the project directory from its own script location when cwd doesn't contain the state file, so clients that launch MCP servers from a global config (Codex) work without special setup - Terminal: swallow the duplicate compositionend commit when switching input sources mid-composition (xterm finalizes on the keydown and then again on compositionend, sending pinyin text twice) - Don't render our own colored overlay cursor — the native caret already marks our position; overlay cursors are collaborators-only (web parity) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28Overleaf web-client parity: dashboard, editor, and sync overhaulhaoyuren
Uses the Overleaf open-source code as golden reference throughout. Project dashboard (official /tag + /project endpoints): - Sidebar filters (all/yours/shared/archived/trashed) with the web client's exact filtering predicates - Tags: create/edit/delete with the official preset palette, per-row chips, bulk add/remove, uncategorized view - Archive/trash/restore/delete-forever/leave, rename, copy, zip download, multi-select bulk actions (parallelized) Editor: - Remote cursors rewritten as a layer() overlay ported from Overleaf's cursor-highlights — no more inline widgets disturbing line wrapping, cursor motion, or IME composition - Autocomplete ported from Overleaf's completion system: official top-hundred snippet data, environment templates, package/class/bib style data (verbatim, AGPL), project-wide \ref and \cite completion, package commands via the official /project/:id/metadata endpoint, brace-aware apply behavior, official keymap precedence - Fixed completion popup keybindings (Enter/arrows previously fell through to the default keymap) and dead Enter/Backspace handlers in latexClosing File sync reliability: - Two-tier compile-artifact detection: pure build noise is ignored, while pdf/docx/gz/bbl sync unless there is concrete local-compile evidence — agent-generated figure PDFs now sync (previously all PDFs were blanket-ignored) - Local compile outputs are registered with the bridge so nested-root projects don't upload the root PDF as junk - Upload retry with exponential backoff and permanent-failure parking, CSRF refresh with session validation and single-flight guard, periodic orphan rescan, sync status surfaced in the status bar - Official textExtensions list (plus legacy extras) for doc-vs-file classification Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-04-25Fix Claude MCP project registrationv0.3.9haoyuren
2026-04-25Fix packaged MCP server pathv0.3.8haoyuren
2026-04-25Fix Overleaf file tree sync updateshaoyuren
2026-03-18Fix OT sync corruption: match Overleaf ShareJS ack/echo handlinghaoyuren
The server broadcasts otUpdateApplied (with ops) to ALL clients including the sender. Our bridge was treating its own echoed ops as remote ops and re-applying them, causing text duplication (e.g. "simulatorimulator"). Rewrite OT handling to match Overleaf's ShareJS _onMessage pattern: - ACK = no ops OR meta.source matches our publicId (own echo) - REMOTE = ops from a different source - ACK path calls onAck() without re-applying ops - OtClient silently drops duplicate acks in synchronized state - OtClient drops stale remote ops (version < current) - Remove pendingEchos counter in favor of meta.source detection Also: refresh MCP comment contexts on new-comment/delete-thread events, add Overleaf reference repo to .gitignore. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Document S2 API key rate limit in CLAUDE.md templatehaoyuren
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Add API key management UI and wire S2 key to MCPhaoyuren
- Settings modal on project list page for OpenAI, Anthropic, OpenRouter, Gemini, Semantic Scholar keys - Keys stored in userData/api-keys.json, masked by default with show/hide toggle - S2 API key passed to MCP server via .lattex-mcp.json to avoid rate limits Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Add read_compiled_pdf and search_citation MCP toolshaoyuren
- read_compiled_pdf: returns PDF path for Claude Code to visually inspect compiled output - search_citation: search Semantic Scholar for papers, returns ready-to-use BibTeX entries - Updated CLAUDE.md template with new tool docs, workflows, and permissions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Strengthen CLAUDE.md: explicit step-by-step file reading instructionshaoyuren
Split "read main.tex and all inputs" into two discrete steps: 1. Read main file to discover \input/\include references 2. Read EVERY referenced file one by one (no skipping, no skimming) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Add online users popover, MCP get_online_users, claude-workspace, stronger ↵v0.3.4haoyuren
CLAUDE.md - Online users: click "N online" badge to see user names with cursor colors - MCP get_online_users tool: main process tracks users in .lattex-online-users.json - CLAUDE.md: show current user's Overleaf name (fetched from /user/settings) - CLAUDE.md: mandatory first steps with MUST/NEVER language at top of file - claude-workspace/ directory: untracked scratch space for Claude Code experiments - chokidar + bridge skip claude-workspace/ to prevent syncing to Overleaf Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Fix file sync for non-active tabs, MCP compile integration, OT resiliencehaoyuren
- Fix .bib (and other non-active tab) edits disappearing: call otLeaveDoc on tab switch so bridge takes back OT ownership; release .bib pre-loads immediately after reading content for citation autocomplete - Always update lastKnownContent in processDocChange for editor docs to prevent stale state accumulation - Flush pending OT ops in OverleafDocSync.destroy() before tab switch - Add three-way merge in replaceContent to preserve concurrent remote edits - Wire MCP compile to UI: file-based signal between MCP server and Electron main process, with compile animation and PDF refresh in renderer - Add CLSI flush before compile to prevent stale cached results - Add OT error recovery: re-join doc and re-apply disk changes on otUpdateError - Add bridge reconnect handling: reset OtClient on docRejoined for non-editor docs - Add compile concurrency lock to prevent duplicate compiles - removeEditorDoc compares disk vs server content to catch in-flight ops Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Enhance CLAUDE.md with project structure, guidelines, and conventionshaoyuren
Includes main file path, TeX file list, and rules for Claude Code: read full document before editing, match existing style, compile after changes, respond to comments properly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Fix MCP server in packaged app: bundle with esbuild, asarUnpackhaoyuren
MCP server was not included in DMG builds. Now esbuild bundles it into a single file (out/mcp/lattex.mjs) with all dependencies inlined, and electron-builder unpacks it from asar so external node can execute it. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15v0.3.2: Add search features and SyncTeX forward searchv0.3.2haoyuren
- In-file search: Cmd+F opens CodeMirror search panel with themed styling - Multi-file search: Cmd+Shift+F or toolbar button opens project-wide search - PDF text search: Cmd+F on PDF or search button to find text in PDF - SyncTeX forward search: Cmd+Enter jumps from editor cursor to PDF position Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Fix crash on quit: use ptyInstances map instead of undefined ptyInstancehaoyuren
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Fix SyncTeX: download synctex.gz via web proxy, normalize paths, smooth zoomhaoyuren
- synctex.gz CDN returns 503; use Overleaf web proxy URL with session cookie - Normalize synctex paths (collapse /./ segments) - Pass session cookie to all compile artifact downloads - Smooth editor zoom: continuous delta, debounced remeasure Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15v0.3.0: Fix sync exclusions, add editor zoom, cached PDF loadingv0.3.0haoyuren
- Exclude CLAUDE.md from sync (move to .claude/ dotfile dir, clean up root copy) - Add Ctrl+wheel font zoom for editor (capture phase, disable Electron built-in zoom) - Load cached PDF on project connect (avoid recompile to see last PDF) - Add synctex debug logging for PDF↔source navigation troubleshooting - Fix .claude/ dir creation order (mkdir before write) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Add MCP compile debugging tools: get_compile_errors, get_compile_warnings, ↵haoyuren
get_compile_log New MCP tools for agents to debug LaTeX compilation: - get_compile_errors: parsed errors with file paths and line numbers - get_compile_warnings: parsed warnings with locations - get_compile_log: full raw log with optional tail parameter - compile_latex: improved to fetch log via CDN URL, return error summary Log parsing uses the same Overleaf-style parser as the PdfViewer component. Updated CLAUDE.md template with compile-debug workflow documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Fix server compile: download PDF to .build dir, prevent artifact sync to ↵haoyuren
Overleaf The root cause of server compile failures was that output.pdf was being saved into the synced project directory, causing FileSyncBridge to upload it back to Overleaf as a project file. CLSI then failed because it found an existing output.pdf blocking its compilation output. Changes: - Save compile artifacts (PDF, synctex.gz) to .build/ subdirectory instead of the synced project root — .build is a dotfile dir ignored by chokidar - Add pdf/pdfxref/stderr/stdout/chktex to FileSyncBridge ignore patterns - Add rootResourcePath to compile request body (matches Overleaf web client) - Implement PDF download with fallback via direct build ID URL construction - Add server compile handler, compile dropdown menu, PDF save button - Fix resolved comment highlight flash on startup (null initial state) - Fix EPIPE crash on startup when stdout/stderr is closed - Fix synctex inverse search to use relative paths via OT doc join Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15Real-time comment sync, MCP server expansion, multi-tab terminal, UI fixeshaoyuren
- Fix Socket.IO v0.9 ack parser to handle acks without data (6:::N format), fixing comment creation stuck at "sending" - Rewrite comment sync to use local state updates from socket events (new-comment, resolve-thread, reopen-thread, delete-thread, edit-message, delete-message) instead of REST re-fetches — instant UI updates - Optimistic updates for all comment actions (resolve, reopen, delete, reply, edit) - Fetch threads + contexts on project connect so editor highlights are correct from startup, not only when review panel is opened - Add comment context to store immediately after creation for instant highlight - Rename MCP server from overleaf-comments to lattex, add 6 new tools: reopen_comment, delete_comment, get_chat_messages, send_chat_message, list_project_files, compile_latex — all auto-granted permissions - Refactor terminal from fixed Terminal/Claude tabs to dynamic multi-tab with bottom tab bar and unlimited new terminal creation - Fix chat panel layout overflow pushing other components Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Fix embedded terminal for Claude Code: PTY env, DEC 2026, xterm.js window ↵v0.2.4haoyuren
queries - Add missing PTY environment variables (TERM, COLORTERM, LANG, TERM_PROGRAM) - Strip DEC 2026 synchronized output sequences that cause xterm.js to buffer indefinitely when begin/end markers are split across PTY chunks - Enable xterm.js windowOptions for terminal pixel/char size queries that Claude Code sends to determine rendering capabilities - Launch Claude tab via login shell for full PATH inheritance Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Fix Claude Code → Overleaf sync: remove hash from applyOtUpdate, fix OT bugshaoyuren
Root cause: SHA-1 hash sent with applyOtUpdate didn't match Overleaf's server-side computation, causing "Invalid hash" error, disconnect, and rollback of all synced changes. - Remove hash field from applyOtUpdate to skip server-side hash check - Switch applyOtUpdate from fire-and-forget to emitWithAck for reliable ack - Fix getOldDoc bug: save base doc when changes start accumulating instead of incorrectly using current doc (caused wrong delete ops) - Fix ack handler: only ack when no 'op' field (was acking remote ops too) - Await fileSyncBridge.start() instead of fire-and-forget - Add joinDoc retry logic for transient joinLeaveEpoch mismatch errors - Clear pending ack callbacks on WebSocket close to prevent timeout errors - Add otUpdateError logging for server-side rejections - Add file-based bridge logging for debugging sync issues Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Separate Terminal and Claude into independent pty instanceshaoyuren
- Support multiple named pty instances via ID-based IPC channels - Terminal tab spawns a shell, Claude tab spawns `claude` CLI separately - Fix pty race condition: old instance's onExit callback could delete the replacement instance from the Map during React StrictMode re-mount - Guard against StrictMode double-initialization in TerminalInstance Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Add bidirectional sync for binary files (PDF, images, etc.)haoyuren
FileSyncBridge now handles binary fileRefs in addition to text docs: - Downloads all binary files to temp dir on project connect - Watches for binary file changes on disk and uploads via REST API - Listens for Overleaf socket events (reciveNewFile, reciveNewDoc, removeEntity, reciveEntityRename) to sync remote changes to disk - Tracks binary files by SHA1 hash to avoid redundant uploads Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Add drag-and-drop file upload, fix project creation modal and API endpointshaoyuren
- Add file upload to Overleaf projects via multipart POST with correct "name" text field (server reads filename from req.body.name, not from Content-Disposition filename) - Add drag-and-drop support in file tree panel with visual feedback - Replace window.prompt() with custom modal for new project creation (prompt() returns null in Electron) - Fix API endpoints: /api/project/new → /project/new Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Fix terminal cwd, selection highlight, comment range preservationhaoyuren
- Terminal now spawns in project sync directory so Claude Code can read/write .tex files - Selection highlight uses semi-transparent color to layer above active line highlight - External edits use diff-match-patch for minimal changes instead of full doc replace, preserving comment highlight positions - Set connection state on project open so status bar shows Connected - Remove cursor:pointer from comment highlights Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Update logo, app icon, fix shutdown crash, add READMEhaoyuren
- Simplified logo: cosmic latte cup on brown background with turquoise liquid and sparkle stars - Square app icon (.icns) for macOS dock - Fix crash on window close: guard all IPC sends against destroyed window - Include ws/chokidar/diff-match-patch in packaged app - Add README with features and install instructions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Add AGPL-3.0 license and copyright headers to all source fileshaoyuren
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13Rename to LatteX, add LaTeX autocomplete, fix comment highlight positionsv0.1.0haoyuren
- Rename project from ClaudeTeX to LatteX (Cosmic Latte theme pun) - Add new coffee cup logo and branded welcome/project screens - Add 5-source LaTeX autocomplete: commands, environments, \ref, \cite, file paths - Fix comment highlight drift by decoding WebSocket-encoded UTF-8 lines and range text via decodeURIComponent(escape()), matching Overleaf's client implementation - Remove hacky byte-offset position remapping from index.ts - Add pinch-to-zoom on PDF viewer Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12Add collaborator cursors and project chathaoyuren
Collaborator cursors: - Real-time cursor positions via clientTracking Socket.IO events - CM6 extension renders colored cursor widgets with name labels - Throttled cursor position broadcasting (300ms) - Connected users count in toolbar and status bar Project chat: - Chat panel in right sidebar (toggleable) - Load message history via REST API - Send messages with real-time delivery via Socket.IO new-chat-message - Auto-scroll, avatars, timestamps Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12Add bidirectional file sync, OT system, comments, and real-time collaborationhaoyuren
Implement full Overleaf integration with Socket.IO v0.9 real-time sync: - FileSyncBridge for bidirectional temp dir ↔ Overleaf sync via chokidar + diff-match-patch - OT state machine, transform functions, and CM6 adapter for collaborative editing - Comment system with highlights, tooltips, and review panel - Project list, file tree management, and socket-based compilation - 3-layer loop prevention (write guards, content equality, debounce) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11Initial commit: ClaudeTeX - LaTeX editor with Overleaf synchaoyuren
Features: - Electron + React + TypeScript app with Cosmic Latte theme - CodeMirror 6 editor with LaTeX syntax highlighting - PDF preview with pdf.js, zoom controls, SyncTeX double-click jump - File tree with context menu (new/rename/delete/reveal) - Overleaf Git clone with token auth + macOS Keychain storage - Git pull/push sync for Overleaf projects - Embedded terminal (xterm.js + node-pty) with Claude CLI integration - LaTeX compilation via latexmk with auto package install detection - Structured compile log (errors/warnings) with click-to-navigate - Main document setting (auto-detect or right-click to set) - Custom modal system (input/confirm/alert) - Resizable panel layout (file tree | editor | PDF + terminal) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>